.graph-page { height: 100vh; display: grid; grid-template-rows: 68px minmax(0, 1fr); overflow: hidden; background: #fbfaf7; } .graph-commandbar { position: relative; z-index: 12; min-width: 0; display: grid; grid-template-columns: 190px minmax(260px, 510px) minmax(0, 1fr); align-items: center; gap: 20px; padding: 0 22px 0 26px; background: rgba(253, 252, 249, .96); border-bottom: 1px solid #e2e3de; backdrop-filter: blur(18px); } .graph-command-title { min-width: 0; height: 40px; display: flex; align-items: center; gap: 8px; margin: 0; padding: 0; color: #22312b; background: transparent; } .graph-command-title > svg { width: 13px; color: #87918c; } .graph-command-title strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 15px; letter-spacing: -.01em; } .graph-search { min-width: 0; height: 40px; display: flex; align-items: center; gap: 9px; padding: 0 10px 0 13px; background: rgba(255,255,255,.72); border: 1px solid #dadcd6; border-radius: 7px; } .graph-search svg { width: 15px; color: #81908a; } .graph-search input { min-width: 0; flex: 1; border: 0; outline: 0; background: transparent; font-size: 14px; } .graph-search input::placeholder { color: #8b9490; } .graph-search kbd { padding: 2px 6px; color: #89918d; background: #f2f2ef; border: 1px solid #e3e4df; border-radius: 5px; font: 500 11px/1.5 "DM Sans", sans-serif; } .graph-command-actions { min-width: 0; display: flex; align-items: center; justify-content: flex-end; gap: 9px; } .graph-scope { height: 40px; display: flex; align-items: center; gap: 7px; padding: 0 10px; background: rgba(255,255,255,.68); border: 1px solid #dadcd6; border-radius: 7px; } .graph-scope > svg { width: 14px; color: #587064; } .graph-scope > svg:last-child { width: 12px; color: #89928d; } .graph-scope select { max-width: 150px; appearance: none; border: 0; outline: 0; background: transparent; font-size: 13px; font-weight: 600; } .graph-open-board { min-height: 40px; white-space: nowrap; } .graph-open-board:disabled { opacity: .44; cursor: default; } .graph-workspace { position: relative; min-height: 0; overflow: hidden; } .graph-stage { position: relative; width: 100%; height: 100%; overflow: hidden; background: #fbfaf7; } .graph-stage::before { position: absolute; z-index: 0; inset: 0; background: radial-gradient(circle at 48% 36%, rgba(118, 155, 137, .035), transparent 36%), linear-gradient(rgba(45, 66, 55, .014) 1px, transparent 1px), linear-gradient(90deg, rgba(45, 66, 55, .014) 1px, transparent 1px); background-size: auto, 32px 32px, 32px 32px; content: ""; pointer-events: none; } .graph-stage > div:first-child { display: block !important; } .graph-bottom-dock { position: absolute; z-index: 5; right: 22px; bottom: 18px; left: 308px; display: flex; align-items: center; justify-content: center; gap: 10px; pointer-events: none; } .graph-legend, .graph-bottom-dock > label, .graph-bottom-dock > button { min-height: 38px; color: #717c76; background: rgba(253,252,249,.9); border: 1px solid #dedfd9; border-radius: 7px; box-shadow: 0 8px 28px rgba(42, 57, 49, .055); backdrop-filter: blur(16px); pointer-events: auto; } .graph-legend { display: flex; align-items: center; gap: 15px; padding: 0 13px; font-size: 11px; } .graph-legend { flex: none; white-space: nowrap; } .graph-legend span { display: flex; align-items: center; gap: 5px; } .graph-legend i { width: 25px; height: 1px; background: #9aa7a0; } .graph-legend .explicit-edge { background: repeating-linear-gradient(90deg, #8b99a9 0 4px, transparent 4px 7px); } .graph-bottom-dock > label, .graph-bottom-dock > button { height: 38px; display: inline-flex; align-items: center; gap: 6px; padding: 0 10px; font-size: 12px; white-space: nowrap; } .graph-bottom-dock select { appearance: none; border: 0; outline: 0; background: transparent; font-weight: 650; } .graph-bottom-dock svg { width: 13px; } .graph-bottom-dock > button.active { color: #345f4b; background: rgba(241,246,242,.94); } .graph-zoom-controls { position: absolute; z-index: 5; left: 20px; bottom: 18px; height: 40px; display: flex; align-items: center; color: #68746e; background: rgba(253,252,249,.92); border: 1px solid #dedfd9; border-radius: 7px; box-shadow: 0 8px 28px rgba(42, 57, 49, .055); backdrop-filter: blur(16px); } .graph-zoom-controls button { width: 38px; height: 38px; display: grid; place-items: center; color: #58665f; background: transparent; border-right: 1px solid #e3e4df; } .graph-zoom-controls button:last-child { border-right: 0; border-left: 1px solid #e3e4df; } .graph-zoom-controls button:hover { color: #2f6f55; background: #f1f5f2; } .graph-zoom-controls svg { width: 14px; } .graph-zoom-controls span { min-width: 58px; text-align: center; font-size: 12px; font-weight: 600; } .graph-zoom-controls .graph-zoom-readout { width: 62px; min-width: 62px; color: #68746e; border: 0; border-right: 1px solid #e3e4df; font-size: 12px; font-weight: 600; } .graph-zoom-controls .graph-zoom-readout:hover, .graph-zoom-controls .graph-zoom-readout:focus-visible { color: #2f6f55; background: #f1f5f2; } .graph-node-index { position: absolute; z-index: 6; top: 16px; right: 18px; width: min(304px, calc(100% - 36px)); color: #53635b; } .graph-node-index > summary { min-height: 38px; display: flex; align-items: center; gap: 7px; padding: 0 10px; color: #53635b; background: rgba(253,252,249,.94); border: 1px solid #dedfd9; border-radius: 7px; box-shadow: 0 8px 28px rgba(42, 57, 49, .055); cursor: pointer; list-style: none; backdrop-filter: blur(16px); } .graph-node-index > summary::-webkit-details-marker { display: none; } .graph-node-index > summary svg { width: 14px; flex: none; } .graph-node-index > summary svg:last-child { width: 12px; margin-left: auto; color: #89928d; } .graph-node-index > summary small { color: #89928d; font-size: 11px; } .graph-node-index[open] > summary svg:last-child { transform: rotate(180deg); } .graph-node-index-panel { max-height: min(46vh, 380px); overflow-y: auto; margin-top: 6px; padding: 5px; background: rgba(253,252,249,.98); border: 1px solid #dedfd9; border-radius: 8px; box-shadow: 0 16px 38px rgba(42, 57, 49, .1); backdrop-filter: blur(16px); } .graph-node-index-panel > button { width: 100%; min-height: 40px; display: grid; grid-template-columns: 8px minmax(0, 1fr); align-items: center; gap: 8px; padding: 7px 8px; color: #334139; background: transparent; border-radius: 5px; text-align: left; } .graph-node-index-panel > button:hover, .graph-node-index-panel > button.active, .graph-node-index-panel > button:focus-visible { background: #f0f5f1; } .graph-node-index-panel > button > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; font-weight: 600; } .graph-node-index-panel > button > small { grid-column: 2; overflow: hidden; color: #7b8780; text-overflow: ellipsis; white-space: nowrap; font-size: 10px; } .graph-node-index-dot { width: 7px; height: 7px; grid-row: span 2; border-radius: 50%; background: #6f9a82; } .graph-node-index-dot.post { background: #c18a50; } .graph-node-index-panel > p { margin: 6px 8px 4px; color: #7b8780; font-size: 11px; line-height: 1.35; } .graph-inspector { position: absolute; z-index: 8; top: 28px; right: 22px; width: min(264px, calc(100% - 44px)); max-height: calc(100% - 82px); overflow-y: auto; color: var(--ink); background: rgba(253, 252, 249, .965); border: 1px solid #dfe1dc; border-radius: 10px; box-shadow: 0 22px 58px rgba(31, 42, 36, .11); backdrop-filter: blur(22px); } .graph-inspector > header { min-height: 0; padding: 20px 18px 17px; border-bottom: 1px solid #e5e5df; } .graph-inspector h2 { margin-top: 7px; font-size: 20px; line-height: 1.12; } .graph-selected-note, .graph-selection-list { padding: 18px 18px 21px; } .tag-row { display: flex; flex-wrap: wrap; gap: 5px; } .tag-row span { padding: 4px 7px; color: #557060; background: #eef2ed; border-radius: 4px; font-size: 12px; } .graph-note-meta { margin: 18px 0 20px; border-top: 1px solid #e5e5df; border-bottom: 1px solid #e5e5df; } .graph-note-meta > div { display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 11px 0; } .graph-note-meta > div + div { border-top: 1px solid #ecece7; } .graph-note-meta dt { color: #7b8580; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; } .graph-note-meta dd { color: #354039; font-size: 13px; font-weight: 600; } .graph-note-summary, .graph-backlinks { padding: 0 0 17px; } .graph-note-summary > span, .graph-backlinks > span { display: block; margin-bottom: 9px; color: #748079; font-size: 10px; font-weight: 700; letter-spacing: .11em; text-transform: uppercase; } .graph-note-summary p { color: #4d5852; font-size: 13px; line-height: 1.55; } .graph-backlinks { margin-bottom: 2px; border-bottom: 1px solid #e5e5df; } .graph-backlinks button { width: 100%; min-height: 30px; display: flex; align-items: center; gap: 8px; padding: 4px 0; overflow: hidden; color: #4a5650; background: transparent; text-align: left; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; } .graph-backlinks button i { width: 6px; height: 6px; flex: none; border-radius: 50%; background: #9eaaa3; } .graph-inspector-actions { position: sticky; z-index: 2; bottom: -21px; margin: 4px -20px -21px; padding: 12px 20px 21px; background: linear-gradient(to bottom, rgba(253,252,249,.76), #fdfcf9 18px); border-top: 1px solid #e5e5df; backdrop-filter: blur(12px); } .graph-inspector-actions .primary-button, .graph-inspector-actions .secondary-button { width: 100%; margin-top: 10px; } .graph-inspector-actions .primary-button:first-child { margin-top: 0; } .graph-selection-list > button:not(.primary-button) { width: 100%; display: flex; align-items: center; gap: 7px; padding: 9px 0; text-align: left; background: transparent; border-bottom: 1px solid var(--line); font-size: 13px; } .graph-selection-list > button > span { width: 7px; height: 7px; background: var(--green); border-radius: 50%; } .graph-selection-list > button > span.post { background: var(--ochre); } .graph-selection-list .primary-button { width: 100%; margin-top: 14px; } .graph-focus .app-sidebar { color: #52655b; background: rgba(253, 252, 249, .98); border-right-color: #e1e2dd; } .graph-focus .sidebar-header { min-height: 78px; border-bottom-color: #e7e7e2; } .graph-focus .forge-glyph { border-color: #6f9581; background: #497762; } .graph-focus .command-search { color: #66776e; background: transparent; border-color: transparent; } .graph-focus .nav-group + .nav-group { border-top-color: #e7e7e2; } .graph-focus .nav-group button, .graph-focus .sidebar-footer > button { color: #64756c; } .graph-focus .nav-group button:hover, .graph-focus .sidebar-footer > button:hover { color: #2f5c48; background: #f0f4f1; } .graph-focus .nav-group button.active, .graph-focus .sidebar-footer > button.active { color: #2f6c52; background: #edf4ef; box-shadow: none; } .graph-focus .sidebar-footer { border-top-color: #e7e7e2; } .graph-focus .sidebar-collapse { display: none; } .graph-v2 .graph-commandbar { grid-template-columns: 174px minmax(320px, 514px) minmax(0, 1fr); gap: 18px; padding-right: 20px; padding-left: 27px; } .graph-v2 .graph-workspace { background: #fdfcf9; } .graph-v2 .graph-stage { background: #fdfcf9; } .graph-v2 .graph-stage::before { background: radial-gradient(circle at 48% 37%, rgba(116, 151, 133, .026), transparent 36%), linear-gradient(rgba(45, 66, 55, .009) 1px, transparent 1px), linear-gradient(90deg, rgba(45, 66, 55, .009) 1px, transparent 1px); background-size: auto, 32px 32px, 32px 32px; } .knowledge-map { position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; overflow: visible; cursor: grab; touch-action: none; user-select: none; } .graph-stage.has-inspector .knowledge-map { right: 286px; width: calc(100% - 286px); } .knowledge-map:active { cursor: grabbing; } .knowledge-cluster-title { font: 650 10.5px/1.1 "DM Sans", ui-sans-serif, sans-serif; text-anchor: middle; letter-spacing: -.01em; } .cluster-count rect { fill: rgba(253, 252, 249, .95); stroke: rgba(112, 124, 117, .17); } .cluster-count text { fill: #737e78; font: 600 8px/1 "DM Sans", ui-sans-serif, sans-serif; text-anchor: middle; } .knowledge-shared-edge { fill: none; stroke: #b9c2bd; stroke-width: .75; opacity: .72; pointer-events: none; } .knowledge-explicit-edge { fill: none; stroke: #9eaaa4; stroke-width: .85; stroke-dasharray: 5 5; opacity: .62; pointer-events: none; animation: graph-reference-flow 2.8s linear infinite; } .knowledge-explicit-edge.focused { stroke: #778d82; stroke-width: 1.05; opacity: .82; } @keyframes graph-reference-flow { to { stroke-dashoffset: -20; } } .knowledge-node { cursor: pointer; } .knowledge-node circle { stroke: rgba(255,255,255,.96); stroke-width: 1.35; transition: r 120ms ease, filter 120ms ease; } .knowledge-node:hover circle, .knowledge-node.selected circle { r: 6px; filter: drop-shadow(0 2px 4px rgba(45, 76, 61, .25)); } .knowledge-node text { fill: #2e3934; paint-order: stroke; stroke: rgba(253, 252, 249, .94); stroke-width: 3px; stroke-linejoin: round; font: 500 8.8px/1.2 "DM Sans", ui-sans-serif, sans-serif; pointer-events: none; } .knowledge-node text.hovered { fill: #183c2d; font-weight: 650; } .knowledge-focused-node { cursor: pointer; filter: drop-shadow(0 5px 12px rgba(33, 74, 57, .12)); } .knowledge-focused-node > rect { fill: rgba(253,252,249,.985); stroke: #2d8a80; stroke-width: 1.4; } .knowledge-focused-node > text { fill: #23322c; font: 650 10px/1 "DM Sans", ui-sans-serif, sans-serif; } .knowledge-focused-node > g rect { fill: #eef3ef; stroke: #dce5de; } .knowledge-focused-node > g text { fill: #476758; font: 600 8px/1 "DM Sans", ui-sans-serif, sans-serif; text-anchor: middle; } .knowledge-compact-cluster rect { fill: rgba(253,252,249,.72); stroke-dasharray: 4 3; } .knowledge-compact-cluster text { fill: #334039; font: 600 9px/1 "DM Sans", ui-sans-serif, sans-serif; text-anchor: middle; } .knowledge-compact-cluster .compact-count { fill: #79827d; font-size: 8px; } .graph-v2 .graph-zoom-controls { left: 20px; bottom: 18px; } .graph-v2 .graph-zoom-controls button:first-child { border-right: 1px solid #e3e4df; } .graph-v2 .graph-bottom-dock { right: 286px; left: 286px; } .graph-v2 .graph-inspector { top: 30px; right: 22px; width: 264px; max-height: calc(100% - 60px); border-radius: 8px; box-shadow: 0 17px 46px rgba(31, 42, 36, .085); } .graph-v2-inspector > header { padding: 19px 20px 17px; border-bottom: 0; } .graph-v2-inspector > header span { position: relative; padding-right: 15px; color: #5a7568; font-size: 10px; letter-spacing: .08em; } .graph-v2-inspector > header span::after { position: absolute; top: 4px; right: 0; width: 7px; height: 7px; background: #7daa94; border: 2px solid #eaf1ec; border-radius: 50%; content: ""; } .graph-v2-inspector h2 { margin-top: 18px; font-size: 22px; line-height: 1.18; letter-spacing: -.025em; } .graph-v2-inspector .graph-selected-note { padding: 0 20px 22px; } .graph-v2-inspector .tag-row { margin-bottom: 26px; } .graph-v2-inspector .tag-row span { padding: 5px 8px; color: #50695d; background: #edf2ee; border-radius: 4px; font-size: 12px; } .graph-note-fact, .graph-v2-inspector .graph-note-summary, .graph-v2-inspector .graph-backlinks, .graph-inspector-tags, .graph-inspector-dates { padding: 0 0 19px; border-bottom: 1px solid #e6e6e1; } .graph-note-fact > span, .graph-v2-inspector .graph-note-summary > span, .graph-v2-inspector .graph-backlinks > span, .graph-inspector-tags > span, .graph-inspector-dates dt { display: block; margin-bottom: 10px; color: #587266; font-size: 10px; font-weight: 700; letter-spacing: .1em; text-transform: uppercase; } .graph-note-fact strong { color: #354039; font-size: 13px; font-weight: 500; } .graph-v2-inspector .graph-note-summary { padding-top: 20px; } .graph-v2-inspector .graph-note-summary p { color: #48534d; font-size: 12.5px; line-height: 1.55; } .graph-v2-inspector .graph-backlinks { padding-top: 19px; padding-bottom: 16px; } .graph-v2-inspector .graph-backlinks button { min-height: 26px; padding-block: 2px; font-size: 12px; } .graph-no-backlinks { color: #929994; font-size: 12px; } .graph-v2-inspector .graph-inspector-actions { position: static; margin: 0; padding: 19px 0 20px; background: transparent; border-top: 0; } .graph-v2-inspector .graph-inspector-actions .primary-button, .graph-v2-inspector .graph-inspector-actions .secondary-button { min-height: 41px; margin-top: 9px; font-size: 13px; } .graph-v2-inspector .graph-inspector-actions .secondary-button { margin-top: 0; } .graph-inspector-tags { padding-top: 0; padding-bottom: 20px; } .graph-inspector-tags .tag-row { align-items: center; margin: 0; } .graph-inspector-tags button { width: 29px; height: 29px; display: grid; place-items: center; color: #64756c; background: transparent; border: 1px solid #e0e2dd; border-radius: 5px; } .graph-inspector-tags button svg { width: 13px; } .graph-inspector-dates { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; padding-top: 18px; border-bottom: 0; } .graph-inspector-dates dt { margin-bottom: 7px; } .graph-inspector-dates dd { color: #46514b; font-size: 11px; white-space: nowrap; } /* The production knowledge graph uses the responsive force-graph engine. These rules deliberately override the retired fixed-size atlas shell. */ .graph-page { min-width: 0; height: 100dvh; } .graph-stage canvas { touch-action: none; } .graph-stage .float-tooltip-kap { z-index: 8; width: min(280px, calc(100% - 24px)); max-width: min(280px, calc(100% - 24px)); padding: 8px 10px; color: #26312c; background: rgba(253, 252, 249, .97); border: 1px solid #d9ddd7; border-radius: 8px; box-shadow: 0 10px 28px rgba(42, 57, 49, .12); font: 600 12px/1.35 "DM Sans", sans-serif; white-space: normal; overflow-wrap: anywhere; pointer-events: none; } .graph-open-board span { display: inline; } @media (max-width: 980px) { .graph-commandbar { grid-template-columns: minmax(210px, 1fr) auto; gap: 10px; padding-inline: 16px; } .graph-command-title, .graph-scope { display: none; } .graph-open-board { width: 40px; min-width: 40px; padding-inline: 0; } .graph-open-board span { display: none; } .graph-bottom-dock { right: 18px; left: 214px; } .graph-legend span:last-child { display: none; } } @media (max-width: 820px) { .graph-page { height: 100dvh; min-height: 0; padding-top: 0; grid-template-rows: 60px minmax(0, 1fr); } .graph-commandbar { padding-right: 10px; padding-left: 58px; } .graph-search { height: 40px; } .graph-command-actions { gap: 5px; } .graph-inspector { top: auto; right: 8px; bottom: 110px; left: 8px; width: auto; max-height: min(52%, 460px); border-radius: 9px; } .graph-inspector .graph-inspector-actions { position: static; bottom: auto; margin: 12px 0 0; padding: 12px 0 0; background: transparent; border-top: 1px solid #e5e5df; backdrop-filter: none; } } @media (max-width: 660px) { .graph-commandbar { grid-template-columns: minmax(0, 1fr) auto; gap: 6px; } .graph-search kbd { display: none; } .graph-search { padding-right: 9px; } .graph-bottom-dock { right: 8px; bottom: 58px; left: 8px; justify-content: flex-end; } .graph-legend { display: none; } .graph-bottom-dock > label, .graph-bottom-dock > button { min-height: 36px; height: 36px; padding-inline: 9px; font-size: 11px; } .graph-zoom-controls { bottom: 8px; left: 8px; height: 40px; } .graph-zoom-controls button { width: 36px; } .graph-zoom-controls span { min-width: 51px; } .graph-node-index { top: 14px; right: 8px; width: min(286px, calc(100% - 16px)); } } @media (max-width: 420px) { html, body, #root { min-width: 0; } .graph-commandbar { padding-left: 54px; } .graph-search { min-width: 0; } .graph-search input { font-size: 13px; } .graph-bottom-dock > label { display: none; } .graph-inspector { bottom: 104px; max-height: 54%; } } @media (max-width: 1300px) { .graph-commandbar { grid-template-columns: 185px minmax(220px, 1fr) auto; gap: 12px; padding-right: 16px; } .graph-scope { display: none; } .graph-bottom-dock { left: 290px; } .graph-legend span:last-child { display: none; } } @media (max-width: 1100px) { .graph-v2 .graph-commandbar { grid-template-columns: minmax(220px, 1fr) auto; } .graph-v2 .graph-command-title, .graph-v2 .graph-scope { display: none; } .graph-v2 .graph-bottom-dock { right: 18px; left: 214px; } } /* Keep the graph's identity visible on tablet. The desktop rail is already compact at these widths, so the command bar can afford a short title next to the search field without changing the clustered canvas composition. */ @media (min-width: 821px) and (max-width: 980px) { .graph-commandbar { grid-template-columns: minmax(150px, .42fr) minmax(240px, 1fr); gap: 10px; padding-inline: 16px; } .graph-command-title { display: flex; } } @media (min-width: 661px) and (max-width: 820px) { .graph-commandbar { grid-template-columns: minmax(140px, .46fr) minmax(220px, 1fr); } .graph-command-title { display: flex; } }