.app-area-graph { overflow: hidden; } .obsidian-graph { box-sizing: border-box; position: relative; width: 100%; height: 100%; min-width: 0; min-height: 0; padding: var(--panel-inset); color: var(--text-primary); background: transparent; overflow: auto; } .obsidian-graph-surface { display: block; width: 100%; height: 100%; min-height: 0; touch-action: none; cursor: grab; user-select: none; } .obsidian-graph-surface:active { cursor: grabbing; } .obsidian-graph-edges line { stroke: var(--graph-edge); stroke-width: 1; vector-effect: non-scaling-stroke; transition: stroke .12s ease, stroke-width .12s ease; } .obsidian-node { color: var(--graph-technique); cursor: pointer; outline: none; } .obsidian-node-selection-ring { fill: none; stroke: var(--graph-selected); stroke-width: 3; opacity: 1; vector-effect: non-scaling-stroke; pointer-events: none; filter: none; } .obsidian-node-branch-ring { fill: none; stroke: var(--graph-selected); stroke-width: 2; opacity: .82; vector-effect: non-scaling-stroke; pointer-events: none; } .obsidian-node.is-branch-muted { opacity: .42; } .obsidian-graph-edges line.is-branch-path { stroke: var(--graph-selected); stroke-width: 2; opacity: 1; } .obsidian-graph-edges line.is-branch-muted { opacity: .2; } .obsidian-node.is-selection-muted { opacity: .48; transition: opacity .14s ease; } .obsidian-node.is-selection-muted:hover, .obsidian-node.is-selection-muted:focus-visible { opacity: 1; } .obsidian-graph-edges line.is-selection-muted { opacity: .24; } .obsidian-node-role-ring { fill: none; stroke: currentColor; stroke-width: 1.5; opacity: .72; vector-effect: non-scaling-stroke; pointer-events: none; } .obsidian-node-core { fill: currentColor; stroke: var(--surface-app); stroke-width: 1.5; vector-effect: non-scaling-stroke; transition: filter .12s ease, stroke .12s ease; } .obsidian-node-finding { color: var(--graph-finding); } .obsidian-node-finding.severity-critical { color: var(--critical); } .obsidian-node-finding.severity-high { color: var(--high); } .obsidian-node-finding.severity-medium { color: var(--medium); } .obsidian-node-finding.severity-low { color: var(--low); } .obsidian-node-finding.severity-info { color: var(--info); } .obsidian-node-finding.severity-unknown { color: var(--graph-unknown); } .obsidian-node-category, .obsidian-node-defense, .obsidian-node-target, .obsidian-node-technique, .obsidian-node-tactic, .obsidian-node-context { color: var(--graph-relation); } .obsidian-node:hover .obsidian-node-core, .obsidian-node:focus-visible .obsidian-node-core { filter: brightness(1.25); stroke: var(--graph-selected); } .obsidian-node:hover .obsidian-node-role-ring, .obsidian-node:focus-visible .obsidian-node-role-ring { opacity: 1; stroke-width: 2; } .obsidian-node.is-selected .obsidian-node-core { stroke: var(--graph-selected); stroke-width: 2.5; } .obsidian-node.is-selected .obsidian-node-role-ring { opacity: 1; stroke: var(--graph-selected); stroke-width: 2; } .obsidian-graph-card-connectors { pointer-events: none; } .obsidian-graph-card-connectors line { vector-effect: non-scaling-stroke; } .obsidian-card-connector-backdrop { stroke: color-mix(in srgb, var(--surface-app) 88%, var(--pathfinder-micro-connector-backdrop-mix)); stroke-width: 5; opacity: .9; } .obsidian-card-connector { stroke: var(--graph-selected); stroke-width: 2; } .obsidian-card-connector-anchor { fill: var(--graph-selected); stroke: color-mix(in srgb, var(--surface-app) 88%, var(--pathfinder-micro-connector-backdrop-mix)); stroke-width: 1.5; vector-effect: non-scaling-stroke; } .obsidian-node-inline-label { fill: var(--text-secondary); stroke: var(--surface-app); stroke-width: 3px; paint-order: stroke fill; font-size: var(--fs-lg); font-weight: var(--fw-medium); letter-spacing: .01em; pointer-events: none; } .obsidian-node-category .obsidian-node-inline-label, .obsidian-node-defense .obsidian-node-inline-label, .obsidian-node-target .obsidian-node-inline-label, .obsidian-node-tactic .obsidian-node-inline-label, .obsidian-node-context .obsidian-node-inline-label { fill: var(--text-primary); font-weight: var(--fw-semibold); } .obsidian-node-card-wrap { overflow: visible; pointer-events: auto; cursor: grab; touch-action: none; } .obsidian-node-card-wrap:active { cursor: grabbing; } .obsidian-node-matrix-card-wrap { overflow: visible; } .obsidian-node-matrix-card { width: 100%; height: 100%; } .obsidian-node-matrix-card .data-tile-content { display: grid; grid-template-rows: auto minmax(0, 1fr); min-height: 0; overflow: hidden; } .obsidian-node-matrix-card .data-tile { box-sizing: border-box; width: 100%; height: 100%; min-height: 0; grid-template-columns: 18px minmax(0, 1fr) 18px; gap: var(--space-2); padding: var(--space-3); overflow: hidden; } .obsidian-node-matrix-card .data-tile-hex { width: 18px; height: 20px; } .obsidian-node-matrix-card .data-tile-content h3 { display: -webkit-box; overflow: hidden; font-size: var(--pathfinder-micro-title-size); line-height: 1.2; -webkit-box-orient: vertical; -webkit-line-clamp: 5; } .obsidian-node-matrix-card .data-tile-badges { flex-wrap: wrap; gap: var(--space-1); margin-top: var(--space-1); min-height: 0; max-height: none; align-content: start; overflow: hidden; } .obsidian-node-matrix-card .data-tile-badges > * { flex: 0 1 auto; min-width: 0; max-width: 100%; height: auto; min-height: 20px; padding: 0 3px; overflow: visible; font-size: var(--pathfinder-micro-badge-size); line-height: 1.1; overflow-wrap: anywhere; white-space: normal; } .obsidian-node-matrix-card .tile-badge-overflow { justify-content: center; } .obsidian-node-matrix-card .data-tile-actions { align-self: start; gap: 2px; } .obsidian-node-matrix-card .tile-bookmark-btn, .obsidian-node-matrix-card .tile-results-btn { width: 18px; height: 18px; } .obsidian-node-card.data-tile { box-sizing: border-box; width: 100%; height: 100%; min-height: 0; grid-template-columns: 26px minmax(0, 1fr); gap: var(--legacy-space-3); padding: var(--legacy-space-3); overflow: hidden; cursor: pointer; } .obsidian-node-card-technique .data-tile-hex, .obsidian-node-card-category .data-tile-hex, .obsidian-node-card-defense .data-tile-hex, .obsidian-node-card-target .data-tile-hex, .obsidian-node-card-tactic .data-tile-hex { background: var(--graph-relation); } .obsidian-node-card .data-tile-content h3 { display: -webkit-box; overflow: hidden; font-size: var(--pathfinder-micro-title-size); line-height: 1.3; overflow-wrap: normal; word-break: normal; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .obsidian-node-card-technique .data-tile-content h3, .obsidian-node-card-tactic .data-tile-content h3 { -webkit-line-clamp: 3; } .obsidian-node-card .data-tile-badges { gap: var(--legacy-space-1) var(--legacy-space-2); margin-top: var(--legacy-space-2); } .obsidian-node-card .reader-severity { min-height: 20px; padding: 2px var(--legacy-space-1); font-size: var(--pathfinder-micro-relation-badge-size); } .obsidian-node-card .outcome-mark { flex-basis: 100%; } .obsidian-node.is-selected .obsidian-node-card { border-color: var(--graph-selected); outline: var(--bw-emphasis) solid var(--graph-selected); outline-offset: -2px; } .obsidian-graph-card.is-selected .obsidian-node-card, .obsidian-graph-card.is-selected .obsidian-node-matrix-card .data-tile { border-color: var(--graph-selected); outline: 3px solid var(--graph-selected); outline-offset: -3px; } .obsidian-graph-toolbar, .obsidian-graph-filters, .obsidian-graph-inspector, .obsidian-graph-zoom { position: absolute; z-index: 5; border: var(--bw-hairline) solid var(--border-default); border-radius: var(--radius-md); color: var(--text-primary); background: color-mix(in srgb, var(--surface-panel-raised) 94%, transparent); backdrop-filter: blur(var(--space-2)); } .obsidian-graph-toolbar { top: var(--space-4); left: 50%; display: flex; align-items: end; gap: var(--space-2); max-width: calc(100% - var(--space-8) * 2); padding: var(--space-2); transform: translateX(-50%); } .obsidian-graph-search { display: grid; gap: var(--space-1); min-width: calc(var(--space-8) * 8); color: var(--text-secondary); font-size: var(--fs-sm); } .obsidian-graph-search input { min-height: var(--control-h); padding: 0 var(--space-2); border: var(--bw-hairline) solid var(--border-strong); border-radius: var(--radius-sm); color: var(--text-primary); background: var(--surface-input); font-size: var(--fs-base); } .obsidian-graph-count { align-self: center; min-width: max-content; padding-inline: var(--space-2); color: var(--text-secondary); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; } .obsidian-graph-branch-actions { display: flex; align-items: center; gap: var(--space-2); min-width: min(360px, 32vw); padding-left: var(--space-3); border-left: var(--bw-hairline) solid var(--border-default); } .obsidian-graph-branch-actions > span { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; } .obsidian-graph-branch-actions .btn { min-width: 84px; } .obsidian-graph-reset-view { position: relative; display: inline-flex; align-items: center; gap: 6px; border-color: var(--border-strong); border-radius: var(--btn-radius); color: var(--text-primary); background: var(--surface-input); overflow: hidden; } .obsidian-graph-reset-view:hover, .obsidian-graph-reset-view:focus-visible { border-color: var(--text-secondary); color: var(--text-primary); background: var(--surface-hover); } .obsidian-graph-reset-view span { font-size: 11px; line-height: 1; } .obsidian-graph-filters { top: calc(var(--space-8) * 2.7); left: 50%; display: grid; grid-template-columns: repeat(3, minmax(calc(var(--space-8) * 5), 1fr)); gap: var(--space-3); width: min(calc(var(--space-8) * 20), calc(100% - var(--space-8) * 2)); padding: var(--space-3); transform: translateX(-50%); } .obsidian-graph-filters label { display: grid; gap: var(--space-1); color: var(--text-secondary); font-size: var(--fs-sm); } .obsidian-graph-filters select { min-height: var(--control-h); padding-inline: var(--space-2); border: var(--bw-hairline) solid var(--border-strong); border-radius: var(--radius-sm); color: var(--text-primary); background: var(--surface-input); font-size: var(--fs-base); } .obsidian-graph-zoom { top: var(--space-4); right: var(--space-4); display: grid; overflow: hidden; } .obsidian-graph-zoom button { display: grid; place-items: center; width: var(--space-8); height: var(--space-8); padding: 0; border: 0; border-bottom: var(--bw-hairline) solid var(--border-default); border-radius: var(--btn-radius); color: var(--text-primary); background: transparent; font-size: var(--fs-lg); cursor: pointer; } .obsidian-graph-zoom button:last-child { border-bottom: 0; } .obsidian-graph-zoom button:hover { background: var(--surface-hover); } .obsidian-graph-inspector { right: var(--space-4); bottom: var(--space-4); display: grid; gap: var(--space-2); width: min(calc(var(--space-8) * 12), calc(100% - var(--space-8))); padding: var(--space-4); } .obsidian-graph-inspector > small { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; } .obsidian-graph-inspector > strong { padding-right: var(--space-6); color: var(--text-primary); font-size: var(--fs-lg); line-height: var(--lh-prose); overflow-wrap: anywhere; } .obsidian-graph-inspector > span { color: var(--text-secondary); font-size: var(--fs-lg); } .obsidian-graph-inspector dl { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-2); margin: var(--space-2) 0 0; } .obsidian-graph-inspector dl div { display: grid; gap: var(--space-1); padding: var(--space-2); border: var(--bw-hairline) solid var(--border-subtle); background: var(--surface-panel); } .obsidian-graph-inspector dt { color: var(--text-secondary); font-size: var(--fs-sm); } .obsidian-graph-inspector dd { margin: 0; color: var(--text-primary); font-size: var(--fs-lg); font-weight: var(--fw-semibold); } .obsidian-graph-inspector-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); } .obsidian-inspector-close { position: absolute; top: var(--space-2); right: var(--space-2); display: grid; place-items: center; width: var(--control-h); height: var(--control-h); padding: 0; border: 0; color: var(--text-secondary); background: transparent; font-size: var(--fs-lg); cursor: pointer; } .obsidian-graph-empty { position: absolute; inset: 0; display: grid; place-content: center; gap: var(--space-2); color: var(--text-secondary); text-align: center; pointer-events: none; } .obsidian-graph-empty .filter-empty-actions { pointer-events: auto; } .obsidian-graph-card-zoom-hint { position: absolute; left: 50%; bottom: var(--space-4); z-index: 7; min-height: var(--control-h); padding: 0 var(--space-4); border: var(--bw-hairline) solid var(--border-strong); border-radius: var(--radius-sm); color: var(--text-primary); background: color-mix(in srgb, var(--surface-panel-raised) 94%, transparent); font-size: var(--fs-sm); cursor: pointer; transform: translateX(-50%); } .obsidian-graph-card-zoom-hint:hover, .obsidian-graph-card-zoom-hint:focus-visible { background: var(--surface-hover); outline: none; } @media (max-width: 900px) { .obsidian-graph-toolbar { left: var(--space-3); right: calc(var(--space-8) + var(--space-5)); flex-wrap: wrap; max-width: none; transform: none; } .obsidian-graph-branch-actions { flex: 1 1 100%; min-width: 0; padding-top: var(--space-2); padding-left: 0; border-top: var(--bw-hairline) solid var(--border-default); border-left: 0; } .obsidian-graph-search { flex: 1 1 100%; min-width: 0; } .obsidian-graph-filters { top: calc(var(--space-8) * 3.5); grid-template-columns: 1fr; } } @media (prefers-reduced-motion: reduce) { .obsidian-node circle { transition: none; } } /* Shared horizontal Work filters above; Details on the left of the graph. */ .obsidian-graph { background: var(--surface-app); } .obsidian-graph:has(> .pathfinder-controls) { display: grid; grid-template-rows: auto minmax(0, 1fr); } .obsidian-graph-layout { display: grid; grid-template-columns: var(--pathfinder-details-width) minmax(var(--pathfinder-stage-min-width), 1fr); width: 100%; height: 100%; min-width: 0; min-height: 0; } .obsidian-graph-inspector { position: static; display: flex; flex-direction: column; width: auto; min-width: 0; min-height: 0; padding: 0; border-radius: 0; background: color-mix(in srgb, var(--surface-panel) 96%, var(--surface-app)); backdrop-filter: none; } .obsidian-graph-inspector { border: 0; border-right: var(--bw-hairline) solid var(--border-default); } .obsidian-graph-inspector > header { display: flex; flex: 0 0 auto; align-items: center; justify-content: space-between; gap: var(--space-3); min-height: calc(var(--row-h) + var(--space-3)); padding: 0 var(--space-4); border-bottom: var(--bw-hairline) solid var(--border-default); } .obsidian-graph-inspector > header strong { color: var(--text-primary); font-size: var(--fs-md); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; } .obsidian-graph-stage { position: relative; min-width: 0; min-height: 0; overflow: hidden; background: color-mix(in srgb, var(--surface-app) 95%, var(--surface-panel)); } .obsidian-graph-stage .obsidian-graph-surface { width: 100%; height: 100%; } .obsidian-graph-edges line { stroke: var(--graph-edge); stroke-width: 1; } .obsidian-graph-edges .obsidian-edge-category { stroke: color-mix(in srgb, var(--graph-edge) 58%, var(--text-muted)); stroke-width: .8; } .obsidian-graph-edges .obsidian-edge-defense { stroke: color-mix(in srgb, var(--graph-edge) 68%, var(--graph-defense)); stroke-width: .9; } .obsidian-graph-edges .obsidian-edge-technique { stroke-width: 1.15; } /* Context layer (Phase 13E): a derived second reading, drawn dashed so it never reads as a source relation. */ .obsidian-graph-edges .obsidian-edge-context { stroke: color-mix(in srgb, var(--graph-edge) 60%, var(--graph-relation)); stroke-dasharray: 4 3; } .obsidian-graph-edges line.is-direct-path { stroke: var(--graph-alert); stroke-width: 2; } .obsidian-node-core { fill: color-mix(in srgb, currentColor 88%, var(--surface-app)); } .obsidian-node-card.data-tile { grid-template-columns: 18px minmax(0, 1fr); gap: var(--space-1); padding: var(--space-1); } .obsidian-node-card .data-tile-hex { width: 18px; height: 20px; } .obsidian-node-card .data-tile-content h3 { font-size: 16px; line-height: 1.25; } .obsidian-node-card .data-tile-badges { flex-wrap: nowrap; gap: var(--space-1); max-height: 18px; margin-top: var(--space-1); overflow: hidden; } .obsidian-node-card .reader-severity, .obsidian-node-card .outcome-mark { min-height: 18px; padding: 1px var(--space-1); font-size: var(--fs-sm); white-space: nowrap; } .obsidian-node.is-selected .obsidian-node-card { outline-width: var(--bw-hairline); outline-offset: -1px; } .obsidian-graph-stage .obsidian-graph-toolbar { top: var(--space-3); left: var(--space-3); align-items: center; max-width: none; padding: var(--space-1); transform: none; } .obsidian-graph-stage .obsidian-graph-zoom { top: var(--space-3); right: var(--space-3); } .obsidian-graph-inspector-content, .obsidian-graph-inspector-empty { display: grid; align-content: start; gap: var(--space-3); min-height: 0; padding: var(--space-4); overflow-y: auto; } .obsidian-graph-inspector-title { display: flex; align-items: flex-start; gap: var(--space-3); min-width: 0; } .obsidian-graph-inspector-title > .data-tile-hex { flex: none; margin-top: 0; } .obsidian-graph-inspector-title > div { display: grid; gap: var(--space-2); min-width: 0; } .obsidian-graph-inspector-title small { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; } .obsidian-graph-inspector-title strong { color: var(--text-primary); font-size: var(--fs-lg); line-height: var(--lh-prose); overflow-wrap: anywhere; } .obsidian-graph-inspector-title.severity-critical .data-tile-hex { background: var(--critical); } .obsidian-graph-inspector-title.severity-high .data-tile-hex { background: var(--high); } .obsidian-graph-inspector-title.severity-medium .data-tile-hex { background: var(--medium); } .obsidian-graph-inspector-title.severity-low .data-tile-hex { background: var(--low); } .obsidian-graph-inspector-title.severity-info .data-tile-hex { background: var(--info); } .obsidian-graph-inspector-content > small { color: var(--text-secondary); font-size: var(--fs-sm); font-weight: var(--fw-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; } .obsidian-graph-inspector-content > strong { padding-right: var(--space-6); color: var(--text-primary); font-size: var(--fs-lg); line-height: var(--lh-prose); overflow-wrap: anywhere; } .obsidian-graph-inspector-content > span, .obsidian-graph-inspector-empty span { color: var(--text-secondary); font-size: var(--fs-lg); line-height: var(--lh-prose); } .obsidian-graph-inspector-empty strong { color: var(--text-primary); font-size: var(--fs-lg); } .obsidian-graph-inspector dl { display: grid; grid-template-columns: 1fr; gap: 0; margin: var(--space-2) 0 0; } .obsidian-graph-inspector dl div { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); gap: var(--space-3); padding: var(--space-3) 0; border: 0; border-bottom: var(--bw-hairline) solid var(--border-subtle); background: transparent; } .obsidian-graph-inspector dt { font-size: var(--fs-md); } .obsidian-graph-inspector dd { min-width: 0; text-align: right; overflow-wrap: normal; word-break: normal; overflow-x: auto; font-variant-numeric: tabular-nums; } .obsidian-graph-inspector-actions { display: grid; gap: var(--space-2); margin-top: var(--space-3); } .obsidian-graph-inspector-actions .btn { width: 100%; } .obsidian-inspector-close { position: static; flex: 0 0 auto; } /* Keep graph actions reachable beside the left inspector at narrow widths. */ .obsidian-graph-stage .obsidian-graph-toolbar { left: var(--space-4); right: calc(var(--space-8) + var(--space-4) * 2); max-width: none; width: fit-content; flex-wrap: wrap; transform: none; } .obsidian-graph-stage .obsidian-graph-branch-actions { min-width: 0; flex-wrap: wrap; }