pmx-canvas 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/.github/extensions/pmx-canvas/THIRD_PARTY_LICENSES.txt +331 -0
  2. package/.github/extensions/pmx-canvas/extension.mjs +25 -172
  3. package/.github/extensions/pmx-canvas/mcp-bootstrap.ts +198 -0
  4. package/.github/extensions/pmx-canvas/runtime.d.mts +41 -0
  5. package/.github/extensions/pmx-canvas/runtime.json +3 -0
  6. package/.github/extensions/pmx-canvas/runtime.mjs +194 -0
  7. package/.github/extensions/pmx-canvas/start-mcp.mjs +51 -0
  8. package/.github/extensions/pmx-canvas/tools.json +2560 -0
  9. package/CHANGELOG.md +60 -0
  10. package/Readme.md +44 -16
  11. package/dist/canvas/fonts/OFL.txt +93 -0
  12. package/dist/canvas/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
  13. package/dist/canvas/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
  14. package/dist/canvas/fonts/ibm-plex-mono-latin-ext-400-normal.woff2 +0 -0
  15. package/dist/canvas/fonts/ibm-plex-mono-latin-ext-500-normal.woff2 +0 -0
  16. package/dist/canvas/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
  17. package/dist/canvas/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
  18. package/dist/canvas/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
  19. package/dist/canvas/fonts/ibm-plex-sans-latin-ext-400-normal.woff2 +0 -0
  20. package/dist/canvas/fonts/ibm-plex-sans-latin-ext-500-normal.woff2 +0 -0
  21. package/dist/canvas/fonts/ibm-plex-sans-latin-ext-600-normal.woff2 +0 -0
  22. package/dist/canvas/global.css +844 -710
  23. package/dist/canvas/index.js +92 -90
  24. package/dist/canvas/mcp-app.html +7878 -0
  25. package/dist/canvas/mermaid-entry.js +1 -1
  26. package/dist/canvas/surface-theme.css +151 -46
  27. package/dist/json-render/index.css +1 -1
  28. package/dist/json-render/index.js +55 -55
  29. package/dist/types/cli/commands/record.d.ts +1 -1
  30. package/dist/types/client/canvas/ChoiceMenu.d.ts +13 -0
  31. package/dist/types/client/canvas/NodeContextMark.d.ts +24 -0
  32. package/dist/types/client/canvas/SessionReceipt.d.ts +3 -1
  33. package/dist/types/client/icons.d.ts +1 -2
  34. package/dist/types/client/mcp-app/index.d.ts +1 -0
  35. package/dist/types/client/nodes/McpAppNode.d.ts +2 -1
  36. package/dist/types/client/nodes/ax-node-actions.d.ts +2 -2
  37. package/dist/types/client/nodes/markdown-sanitize.d.ts +2 -0
  38. package/dist/types/client/nodes/use-workbench-asset.d.ts +2 -0
  39. package/dist/types/client/nodes/viewer-runtime-state.d.ts +1 -0
  40. package/dist/types/client/state/attention-store.d.ts +0 -5
  41. package/dist/types/client/state/canvas-store.d.ts +2 -0
  42. package/dist/types/client/state/context-status-store.d.ts +53 -0
  43. package/dist/types/client/state/intent-bridge.d.ts +4 -1
  44. package/dist/types/client/state/near-pin-store.d.ts +16 -0
  45. package/dist/types/client/state/presence-store.d.ts +5 -0
  46. package/dist/types/client/state/session-store.d.ts +33 -3
  47. package/dist/types/client/state/workbench-transport.d.ts +16 -0
  48. package/dist/types/client/theme/tokens.d.ts +1 -3
  49. package/dist/types/client/types.d.ts +9 -0
  50. package/dist/types/json-render/renderer/index.d.ts +2 -1
  51. package/dist/types/json-render/server.d.ts +3 -1
  52. package/dist/types/mcp/app-server.d.ts +3 -0
  53. package/dist/types/mcp/canvas-access.d.ts +1 -1
  54. package/dist/types/mcp/canvas-app.d.ts +4 -0
  55. package/dist/types/mcp/workbench-app.d.ts +4 -0
  56. package/dist/types/server/agent-presence.d.ts +1 -1
  57. package/dist/types/server/ax-state.d.ts +1 -1
  58. package/dist/types/server/canvas-db.d.ts +8 -0
  59. package/dist/types/server/canvas-geometry.d.ts +25 -0
  60. package/dist/types/server/canvas-operations.d.ts +1 -11
  61. package/dist/types/server/canvas-state.d.ts +25 -3
  62. package/dist/types/server/context-brief.d.ts +8 -1
  63. package/dist/types/server/context-reads.d.ts +30 -7
  64. package/dist/types/server/index.d.ts +6 -1
  65. package/dist/types/server/mcp-app-runtime.d.ts +1 -0
  66. package/dist/types/server/operations/http.d.ts +2 -0
  67. package/dist/types/server/operations/invoker.d.ts +4 -2
  68. package/dist/types/server/operations/ops/nodes.d.ts +0 -6
  69. package/dist/types/server/server.d.ts +1 -0
  70. package/dist/types/server/spatial-analysis.d.ts +2 -0
  71. package/dist/types/shared/agent-context.d.ts +22 -0
  72. package/dist/types/shared/agent-presence.d.ts +3 -10
  73. package/dist/types/shared/ax-surface-protocol.d.ts +2 -0
  74. package/dist/types/shared/canvas-app.d.ts +54 -0
  75. package/dist/types/shared/themes.d.ts +1 -1
  76. package/docs/RELEASE.md +7 -3
  77. package/docs/agent-plugin.md +123 -0
  78. package/docs/ax-host-adapter-contract.md +13 -2
  79. package/docs/ax-state-contract.md +40 -0
  80. package/docs/cli.md +7 -2
  81. package/docs/design/AgentContext.dc.html +186 -0
  82. package/docs/design/Before.dc.html +208 -0
  83. package/docs/design/BoardPins.dc.html +151 -0
  84. package/docs/design/Chrome.dc.html +208 -0
  85. package/docs/design/Context.dc.html +239 -0
  86. package/docs/design/Flows.dc.html +181 -0
  87. package/docs/design/Home.dc.html +209 -0
  88. package/docs/design/HomeGraph.dc.html +211 -0
  89. package/docs/design/HomeMap.dc.html +117 -0
  90. package/docs/design/HomeTeam.dc.html +176 -0
  91. package/docs/design/Light.dc.html +28 -0
  92. package/docs/design/Main.dc.html +280 -0
  93. package/docs/design/NearPin.dc.html +260 -0
  94. package/docs/design/Pane600.dc.html +120 -0
  95. package/docs/design/Relations.dc.html +297 -0
  96. package/docs/design/Themes.dc.html +121 -0
  97. package/docs/design/TokenSystem.dc.html +136 -0
  98. package/docs/design/Tokens.dc.html +163 -0
  99. package/docs/design/Types1.dc.html +177 -0
  100. package/docs/design/Types2.dc.html +226 -0
  101. package/docs/design/Types3.dc.html +195 -0
  102. package/docs/design/Uses.dc.html +152 -0
  103. package/docs/design/Vision.dc.html +116 -0
  104. package/docs/design/Zoom.dc.html +82 -0
  105. package/docs/design/canvas.json +274 -0
  106. package/docs/design.md +214 -0
  107. package/docs/environment.md +1 -1
  108. package/docs/http-api.md +80 -15
  109. package/docs/mcp.md +198 -3
  110. package/docs/node-types.md +34 -10
  111. package/docs/plans/plan-009-tech-debt-backlog.md +1 -1
  112. package/docs/plans/plan-015-design-foundation-wave-0.md +177 -0
  113. package/docs/plans/plan-016-context-made-visible-wave-1.md +148 -0
  114. package/docs/product-vision-2026-09.md +47 -7
  115. package/docs/screenshot.png +0 -0
  116. package/docs/sdk.md +1 -0
  117. package/package.json +10 -4
  118. package/plugins/pmx-canvas/LICENSE +21 -0
  119. package/plugins/pmx-canvas/THIRD_PARTY_LICENSES.txt +331 -0
  120. package/plugins/pmx-canvas/assets/preview.png +0 -0
  121. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/extension.mjs +930 -0
  122. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +3 -0
  123. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.mjs +194 -0
  124. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/steering-delivery.mjs +79 -0
  125. package/plugins/pmx-canvas/mcp.json +12 -0
  126. package/plugins/pmx-canvas/plugin.json +24 -0
  127. package/plugins/pmx-canvas/runtime.json +3 -0
  128. package/plugins/pmx-canvas/runtime.mjs +194 -0
  129. package/plugins/pmx-canvas/start-mcp.mjs +51 -0
  130. package/plugins/pmx-canvas/tools.json +2560 -0
  131. package/skills/pmx-canvas/SKILL.md +31 -16
  132. package/skills/pmx-canvas/evals/evals.json +69 -0
  133. package/skills/pmx-canvas/references/full-reference.md +14 -10
  134. package/skills/pmx-canvas/references/github-copilot-app-adapter.md +20 -8
  135. package/skills/pmx-canvas/references/installing-pmx-canvas.md +76 -4
  136. package/skills/pmx-canvas-testing/SKILL.md +54 -4
  137. package/src/cli/commands/copilot.ts +5 -0
  138. package/src/cli/commands/view.ts +1 -1
  139. package/src/cli/index.ts +8 -3
  140. package/src/client/App.tsx +6 -1
  141. package/src/client/canvas/AgentPresenceLayer.tsx +3 -3
  142. package/src/client/canvas/AnnotationLayer.tsx +1 -1
  143. package/src/client/canvas/CanvasNode.tsx +208 -220
  144. package/src/client/canvas/CanvasViewport.tsx +6 -2
  145. package/src/client/canvas/ChoiceMenu.tsx +122 -0
  146. package/src/client/canvas/CommandBar.tsx +25 -23
  147. package/src/client/canvas/CommandPalette.tsx +3 -2
  148. package/src/client/canvas/ContextMenu.tsx +11 -0
  149. package/src/client/canvas/EdgeLayer.tsx +1 -1
  150. package/src/client/canvas/ExportDialog.tsx +33 -6
  151. package/src/client/canvas/FeedbackDialog.tsx +10 -8
  152. package/src/client/canvas/IntentLayer.tsx +2 -2
  153. package/src/client/canvas/Minimap.tsx +12 -7
  154. package/src/client/canvas/NodeContextMark.tsx +156 -0
  155. package/src/client/canvas/SessionPanel.tsx +4 -7
  156. package/src/client/canvas/SessionReceipt.tsx +114 -17
  157. package/src/client/canvas/ShortcutOverlay.tsx +6 -1
  158. package/src/client/canvas/SnapshotPanel.tsx +11 -2
  159. package/src/client/canvas/ToolRail.tsx +58 -108
  160. package/src/client/canvas/TopBar.tsx +16 -11
  161. package/src/client/icons.tsx +2 -12
  162. package/src/client/mcp-app/index.tsx +137 -0
  163. package/src/client/mcp-app/style.css +10 -0
  164. package/src/client/nodes/AttachmentNode.tsx +8 -1
  165. package/src/client/nodes/AxStepControls.tsx +1 -1
  166. package/src/client/nodes/ContextNode.tsx +9 -9
  167. package/src/client/nodes/ExtAppFrame.tsx +13 -8
  168. package/src/client/nodes/FileNode.tsx +8 -5
  169. package/src/client/nodes/ImageNode.tsx +4 -2
  170. package/src/client/nodes/InlineMarkdownEditor.tsx +2 -1
  171. package/src/client/nodes/LedgerNode.tsx +2 -2
  172. package/src/client/nodes/MarkdownNode.tsx +44 -9
  173. package/src/client/nodes/McpAppNode.tsx +22 -4
  174. package/src/client/nodes/PromptNode.tsx +5 -17
  175. package/src/client/nodes/ResponseNode.tsx +3 -15
  176. package/src/client/nodes/StatusNode.tsx +2 -2
  177. package/src/client/nodes/StatusSummary.tsx +3 -1
  178. package/src/client/nodes/TraceNode.tsx +6 -4
  179. package/src/client/nodes/WebpageNode.tsx +1 -1
  180. package/src/client/nodes/ax-node-actions.ts +2 -2
  181. package/src/client/nodes/iframe-document-url.ts +3 -2
  182. package/src/client/nodes/markdown-sanitize.ts +10 -0
  183. package/src/client/nodes/surface-url.ts +10 -0
  184. package/src/client/nodes/use-ax-surface-bridge.ts +4 -2
  185. package/src/client/nodes/use-surface-frame.ts +3 -1
  186. package/src/client/nodes/use-workbench-asset.ts +26 -0
  187. package/src/client/nodes/viewer-runtime-state.ts +78 -0
  188. package/src/client/state/attention-bridge.ts +0 -8
  189. package/src/client/state/attention-store.ts +0 -17
  190. package/src/client/state/canvas-store.ts +7 -2
  191. package/src/client/state/context-status-store.ts +66 -0
  192. package/src/client/state/human-store.ts +2 -0
  193. package/src/client/state/iframe-mode.ts +5 -0
  194. package/src/client/state/intent-bridge.ts +24 -6
  195. package/src/client/state/near-pin-store.ts +53 -0
  196. package/src/client/state/presence-store.ts +5 -10
  197. package/src/client/state/session-store.ts +106 -9
  198. package/src/client/state/sse-bridge.ts +26 -7
  199. package/src/client/state/theme-override.ts +1 -1
  200. package/src/client/state/workbench-transport.ts +36 -0
  201. package/src/client/theme/global.css +844 -710
  202. package/src/client/theme/surface-theme.css +151 -46
  203. package/src/client/theme/tokens.ts +7 -11
  204. package/src/client/types.ts +10 -0
  205. package/src/json-render/renderer/index.tsx +58 -38
  206. package/src/json-render/server.ts +79 -15
  207. package/src/mcp/app-server.ts +64 -0
  208. package/src/mcp/canvas-access.ts +14 -11
  209. package/src/mcp/canvas-app.ts +318 -0
  210. package/src/mcp/server.ts +1 -1
  211. package/src/mcp/workbench-app.ts +211 -0
  212. package/src/server/agent-presence.ts +45 -6
  213. package/src/server/ax-context.ts +1 -1
  214. package/src/server/ax-state.ts +1 -1
  215. package/src/server/board-export.ts +5 -2
  216. package/src/server/canvas-db.ts +46 -12
  217. package/src/server/canvas-geometry.ts +64 -0
  218. package/src/server/canvas-operations.ts +6 -24
  219. package/src/server/canvas-state.ts +105 -15
  220. package/src/server/canvas-validation.ts +19 -4
  221. package/src/server/context-brief.ts +39 -2
  222. package/src/server/context-reads.ts +86 -15
  223. package/src/server/demo-state.json +31 -31
  224. package/src/server/html-surface.ts +4 -5
  225. package/src/server/index.ts +19 -3
  226. package/src/server/mcp-app-runtime.ts +11 -0
  227. package/src/server/operations/composites.ts +4 -3
  228. package/src/server/operations/http.ts +4 -4
  229. package/src/server/operations/invoker.ts +13 -4
  230. package/src/server/operations/ops/ax-read.ts +1 -1
  231. package/src/server/operations/ops/ax-timeline.ts +37 -0
  232. package/src/server/operations/ops/boards.ts +1 -1
  233. package/src/server/operations/ops/canvas-wire.ts +3 -6
  234. package/src/server/operations/ops/intent.ts +31 -2
  235. package/src/server/operations/ops/json-render.ts +1 -1
  236. package/src/server/operations/ops/nodes.ts +8 -76
  237. package/src/server/operations/ops/query.ts +8 -2
  238. package/src/server/operations/ops/snapshots.ts +4 -1
  239. package/src/server/operations/ops/viewport.ts +29 -5
  240. package/src/server/operations/registry.ts +38 -4
  241. package/src/server/scope-fence.ts +55 -10
  242. package/src/server/server.ts +86 -6
  243. package/src/server/spatial-analysis.ts +2 -2
  244. package/src/server/workboard.ts +6 -1
  245. package/src/{server → shared}/agent-context.ts +2 -2
  246. package/src/shared/agent-presence.ts +3 -15
  247. package/src/shared/ax-surface-protocol.ts +3 -0
  248. package/src/shared/canvas-app.ts +62 -0
  249. package/src/shared/themes.ts +5 -5
  250. package/src/client/canvas/FocusFieldLayer.tsx +0 -116
  251. package/src/client/canvas/kind-colors.ts +0 -23
@@ -1,3 +1,85 @@
1
+ /* ── Bundled fonts (IBM Plex, OFL-1.1; copied to dist/canvas/fonts by scripts/copy-fonts.ts) ── */
2
+ @font-face {
3
+ font-family: "IBM Plex Sans";
4
+ font-style: normal;
5
+ font-weight: 400;
6
+ font-display: swap;
7
+ src: url("fonts/ibm-plex-sans-latin-400-normal.woff2") format("woff2");
8
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
9
+ }
10
+ @font-face {
11
+ font-family: "IBM Plex Sans";
12
+ font-style: normal;
13
+ font-weight: 400;
14
+ font-display: swap;
15
+ src: url("fonts/ibm-plex-sans-latin-ext-400-normal.woff2") format("woff2");
16
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
17
+ }
18
+ @font-face {
19
+ font-family: "IBM Plex Sans";
20
+ font-style: normal;
21
+ font-weight: 500;
22
+ font-display: swap;
23
+ src: url("fonts/ibm-plex-sans-latin-500-normal.woff2") format("woff2");
24
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
25
+ }
26
+ @font-face {
27
+ font-family: "IBM Plex Sans";
28
+ font-style: normal;
29
+ font-weight: 500;
30
+ font-display: swap;
31
+ src: url("fonts/ibm-plex-sans-latin-ext-500-normal.woff2") format("woff2");
32
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
33
+ }
34
+ @font-face {
35
+ font-family: "IBM Plex Sans";
36
+ font-style: normal;
37
+ font-weight: 600;
38
+ font-display: swap;
39
+ src: url("fonts/ibm-plex-sans-latin-600-normal.woff2") format("woff2");
40
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
41
+ }
42
+ @font-face {
43
+ font-family: "IBM Plex Sans";
44
+ font-style: normal;
45
+ font-weight: 600;
46
+ font-display: swap;
47
+ src: url("fonts/ibm-plex-sans-latin-ext-600-normal.woff2") format("woff2");
48
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
49
+ }
50
+ @font-face {
51
+ font-family: "IBM Plex Mono";
52
+ font-style: normal;
53
+ font-weight: 400;
54
+ font-display: swap;
55
+ src: url("fonts/ibm-plex-mono-latin-400-normal.woff2") format("woff2");
56
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
57
+ }
58
+ @font-face {
59
+ font-family: "IBM Plex Mono";
60
+ font-style: normal;
61
+ font-weight: 400;
62
+ font-display: swap;
63
+ src: url("fonts/ibm-plex-mono-latin-ext-400-normal.woff2") format("woff2");
64
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
65
+ }
66
+ @font-face {
67
+ font-family: "IBM Plex Mono";
68
+ font-style: normal;
69
+ font-weight: 500;
70
+ font-display: swap;
71
+ src: url("fonts/ibm-plex-mono-latin-500-normal.woff2") format("woff2");
72
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
73
+ }
74
+ @font-face {
75
+ font-family: "IBM Plex Mono";
76
+ font-style: normal;
77
+ font-weight: 500;
78
+ font-display: swap;
79
+ src: url("fonts/ibm-plex-mono-latin-ext-500-normal.woff2") format("woff2");
80
+ unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
81
+ }
82
+
1
83
  :root {
2
84
  /* ── Core palette (dark · ink + cyan) ────────────────────── */
3
85
  --c-bg: #081524;
@@ -11,40 +93,27 @@
11
93
  --c-accent: #4BBCFF;
12
94
  --c-ok: #2fd07f;
13
95
  --c-warn: #f4c542;
14
- --c-warn-alt: #FFB300;
15
96
  --c-danger: #ff6a7f;
16
- --c-purple: #b07aff;
17
- --c-thinking: #B388FF;
18
- --c-subagent: #00E5FF;
97
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
98
+ --c-pin: #4BBCFF;
99
+ --c-on-pin: #081524;
100
+ --c-agent: #B388FF;
101
+ --c-subagent: #E879F9;
102
+ --c-rel-supports: #5FCFC0;
103
+ --c-rel-contradicts: #E59B6B;
104
+ --c-rel-cites: #7C9CFF;
105
+ --c-rel-derived: #D5DEEA;
106
+ --c-rel-informs: #E58FB0;
107
+ --c-rel-related: #8ea3bd;
19
108
  --c-input-bg: #0a1729;
20
109
  --c-dot-grid: rgba(75, 188, 255, 0.08);
21
110
  --c-panel-overlay: rgba(8, 21, 36, 0.6);
22
111
  --c-panel-glass: rgba(15, 29, 49, 0.92);
23
112
  --c-shadow: rgba(0, 0, 0, 0.3);
24
113
  --c-shadow-heavy: rgba(0, 0, 0, 0.5);
25
- --c-glow-accent: rgba(75, 188, 255, 0.15);
26
114
  --c-surface-hover: rgba(255, 255, 255, 0.06);
27
115
  --c-surface-subtle: rgba(255, 255, 255, 0.03);
28
116
  --c-surface-th: rgba(255, 255, 255, 0.04);
29
- --c-accent-8: rgba(75, 188, 255, 0.08);
30
- --c-accent-10: rgba(75, 188, 255, 0.1);
31
- --c-accent-12: rgba(75, 188, 255, 0.12);
32
- --c-accent-15: rgba(75, 188, 255, 0.15);
33
- --c-accent-25: rgba(75, 188, 255, 0.25);
34
- --c-accent-30: rgba(75, 188, 255, 0.3);
35
- --c-accent-40: rgba(75, 188, 255, 0.4);
36
- --c-ok-10: rgba(47, 208, 127, 0.1);
37
- --c-ok-12: rgba(47, 208, 127, 0.12);
38
- --c-ok-20: rgba(47, 208, 127, 0.2);
39
- --c-ok-25: rgba(47, 208, 127, 0.25);
40
- --c-warn-10: rgba(244, 197, 66, 0.1);
41
- --c-warn-12: rgba(244, 197, 66, 0.12);
42
- --c-warn-15: rgba(244, 197, 66, 0.15);
43
- --c-warn-20: rgba(244, 197, 66, 0.2);
44
- --c-warn-22: rgba(244, 197, 66, 0.22);
45
- --c-warn-30: rgba(244, 197, 66, 0.3);
46
- --c-warn-60: rgba(244, 197, 66, 0.6);
47
- --c-danger-12: rgba(255, 106, 127, 0.12);
48
117
  --c-line-30: rgba(27, 44, 68, 0.3);
49
118
  --c-contrast-fg: #081524;
50
119
  --c-accent-hover: #6ECAFF;
@@ -52,12 +121,30 @@
52
121
  --c-canvas-wash: linear-gradient(180deg, rgba(255, 255, 255, 0.02), rgba(0, 0, 0, 0));
53
122
  --c-annotation: #F4EFE6;
54
123
  /* ── Non-color tokens ────────────────────────────────────── */
55
- --font: "IBM Plex Sans", "SF Pro Text", "Avenir Next", system-ui, sans-serif;
56
- --mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;
124
+ --font-ui: "IBM Plex Sans", "SF Pro Text", "Avenir Next", system-ui, sans-serif;
125
+ --font-code: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;
57
126
  --radius: 10px;
58
127
  --radius-sm: 6px;
59
128
  /* Shared height of the top bar and the session panel header. */
60
129
  --hud-bar-height: 44px;
130
+ /* ── Scale (same in every theme; see docs/design.md) ───────── */
131
+ --fs-meta: 11px;
132
+ --fs-ui: 12px;
133
+ --fs-body: 13px;
134
+ --fs-title: 15px;
135
+ --fs-heading: 20px;
136
+ --space-1: 4px;
137
+ --space-2: 8px;
138
+ --space-3: 12px;
139
+ --space-4: 16px;
140
+ --space-6: 24px;
141
+ --space-8: 32px;
142
+ --r-control: 6px;
143
+ --r-node: 10px;
144
+ --r-overlay: 14px;
145
+ --r-pill: 999px;
146
+ --e-1: 0 1px 2px rgba(0, 0, 0, 0.4), 0 6px 20px rgba(0, 0, 0, 0.24);
147
+ --e-2: 0 10px 30px rgba(0, 0, 0, 0.6);
61
148
  }
62
149
 
63
150
  .board-node, .md-card-preview { display: flex; flex-direction: column; height: 100%; min-height: 0; }
@@ -66,73 +153,63 @@
66
153
  .board-node-title { display: block; font-size: 17px; line-height: 1.35; margin-bottom: 6px; }
67
154
  .board-node-meta { color: var(--c-dim); font-size: 11px; line-height: 1.5; }
68
155
  .board-node-summary { color: var(--c-text-soft); font-size: 13px; line-height: 1.6; margin: 14px 0; }
69
- .board-node-open { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; width: 100%; padding: 10px 16px; border: 0; border-top: 1px solid var(--c-line); background: var(--c-panel); color: var(--c-accent); font: 500 12px var(--font); text-align: left; cursor: pointer; }
70
- .board-node-open:hover:not(:disabled) { background: var(--c-accent-8); }
156
+ .board-node-open { display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; width: 100%; padding: 10px 16px; border: 0; border-top: 1px solid var(--c-line); background: var(--c-panel); color: var(--c-accent); font: 500 12px var(--font-ui); text-align: left; cursor: pointer; }
157
+ .board-node-open:hover:not(:disabled) { background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
71
158
  .board-node-open:disabled { color: var(--c-dim); cursor: default; }
72
159
  .md-card-content { flex: 1; min-height: 0; overflow: auto; }
73
160
  .md-card-actions { display: flex; align-items: center; gap: 8px; flex-shrink: 0; border-top: 1px solid var(--c-line); padding: 6px 36px 6px 8px; background: var(--c-panel); }
74
- .md-card-actions button { border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--c-dim); padding: 4px 8px; font: 500 11px var(--font); cursor: pointer; }
75
- .md-card-actions button:hover { color: var(--c-text); background: var(--c-accent-8); }
76
- .md-card-actions .md-readme-btn[aria-pressed="true"] { color: var(--c-accent); background: var(--c-accent-8); border-color: var(--c-accent-25); }
161
+ .md-card-actions button { border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--c-dim); padding: 4px 8px; font: 500 11px var(--font-ui); cursor: pointer; }
162
+ .md-card-actions button:hover { color: var(--c-text); background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
163
+ .md-card-actions .md-readme-btn[aria-pressed="true"] { color: var(--c-accent); background: color-mix(in srgb, var(--c-accent) 8%, transparent); border-color: color-mix(in srgb, var(--c-accent) 25%, transparent); }
77
164
  .md-card-edit { margin-left: auto; }
78
165
  .board-node-open:focus-visible, .md-card-actions button:focus-visible { outline: 2px solid var(--c-accent); outline-offset: -2px; }
79
166
  .canvas-node[data-node-type="markdown"] .node-body,
80
167
  .canvas-node[data-node-type="board"] .node-body { padding: 0; }
81
168
  .md-card-content { padding: 10px 14px; }
82
169
 
83
- :root[data-theme="light"] {
84
- /* ── Core palette (light · paper + ink) ──────────────────── */
85
- --c-bg: #F4EFE6;
86
- --c-panel: #EFE7D4;
87
- --c-panel-soft: #ECE4D0;
88
- --c-line: #D6CBB4;
89
- --c-text: #081524;
170
+ :root[data-theme="daylight"] {
171
+ /* ── Core palette (Daylight · neutral paper + ink) ───────── */
172
+ --c-bg: #F6F7F9;
173
+ --c-panel: #FFFFFF;
174
+ --c-panel-soft: #F2F4F7;
175
+ --c-line: #DDE2E9;
176
+ --c-text: #0B1726;
90
177
  --c-text-soft: #3d4d63;
91
- --c-muted: #5c6b80;
92
- --c-dim: #8794a6;
178
+ --c-muted: #55657a;
179
+ --c-dim: #6f7d90;
93
180
  --c-accent: #1A7ABF;
94
- --c-ok: #1a9f55;
95
- --c-warn: #c89b2a;
96
- --c-warn-alt: #b8860b;
97
- --c-danger: #d32f2f;
98
- --c-purple: #7c4dff;
99
- --c-thinking: #7C4DFF;
100
- --c-subagent: #00838F;
101
- --c-input-bg: #FAF6EE;
102
- --c-dot-grid: rgba(8, 21, 36, 0.08);
103
- --c-panel-overlay: rgba(244, 239, 230, 0.88);
104
- --c-panel-glass: rgba(239, 231, 212, 0.88);
181
+ --c-ok: #1E7F51;
182
+ --c-warn: #94600A;
183
+ --c-danger: #B8344A;
184
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
185
+ --c-pin: #1A7ABF;
186
+ --c-on-pin: #FFFFFF;
187
+ --c-agent: #7C4DDB;
188
+ --c-subagent: #A83BB0;
189
+ --c-rel-supports: #1E8C80;
190
+ --c-rel-contradicts: #B8572A;
191
+ --c-rel-cites: #4257C9;
192
+ --c-rel-derived: #4A5566;
193
+ --c-rel-informs: #B03F72;
194
+ --c-rel-related: #5c6b80;
195
+ /* Light themes: ink-tinted shadows (the drawn black ones are for dark surfaces). */
196
+ --e-1: 0 1px 2px rgba(8, 21, 36, 0.1), 0 6px 20px rgba(8, 21, 36, 0.08);
197
+ --e-2: 0 10px 30px rgba(8, 21, 36, 0.18);
198
+ --c-input-bg: #FFFFFF;
199
+ --c-dot-grid: rgba(11, 23, 38, 0.12);
200
+ --c-panel-overlay: rgba(246, 247, 249, 0.88);
201
+ --c-panel-glass: rgba(255, 255, 255, 0.88);
105
202
  --c-shadow: rgba(8, 21, 36, 0.08);
106
203
  --c-shadow-heavy: rgba(8, 21, 36, 0.16);
107
- --c-glow-accent: rgba(26, 122, 191, 0.12);
108
204
  --c-surface-hover: rgba(8, 21, 36, 0.06);
109
205
  --c-surface-subtle: rgba(8, 21, 36, 0.03);
110
206
  --c-surface-th: rgba(8, 21, 36, 0.04);
111
- --c-accent-8: rgba(26, 122, 191, 0.08);
112
- --c-accent-10: rgba(26, 122, 191, 0.1);
113
- --c-accent-12: rgba(26, 122, 191, 0.12);
114
- --c-accent-15: rgba(26, 122, 191, 0.15);
115
- --c-accent-25: rgba(26, 122, 191, 0.25);
116
- --c-accent-30: rgba(26, 122, 191, 0.3);
117
- --c-accent-40: rgba(26, 122, 191, 0.4);
118
- --c-ok-10: rgba(26, 159, 85, 0.1);
119
- --c-ok-12: rgba(26, 159, 85, 0.12);
120
- --c-ok-20: rgba(26, 159, 85, 0.2);
121
- --c-ok-25: rgba(26, 159, 85, 0.25);
122
- --c-warn-10: rgba(200, 155, 42, 0.1);
123
- --c-warn-12: rgba(200, 155, 42, 0.12);
124
- --c-warn-15: rgba(200, 155, 42, 0.15);
125
- --c-warn-20: rgba(200, 155, 42, 0.2);
126
- --c-warn-22: rgba(200, 155, 42, 0.22);
127
- --c-warn-30: rgba(200, 155, 42, 0.3);
128
- --c-warn-60: rgba(200, 155, 42, 0.6);
129
- --c-danger-12: rgba(211, 47, 47, 0.12);
130
- --c-line-30: rgba(214, 203, 180, 0.5);
131
- --c-contrast-fg: #F4EFE6;
207
+ --c-line-30: rgba(221, 226, 233, 0.5);
208
+ --c-contrast-fg: #FFFFFF;
132
209
  --c-accent-hover: #1588CE;
133
210
  --c-warn-hover: #dab040;
134
211
  --c-canvas-wash: linear-gradient(180deg, rgba(255, 255, 255, 0.12), rgba(8, 21, 36, 0.02));
135
- --c-annotation: #081524;
212
+ --c-annotation: #0B1726;
136
213
  }
137
214
 
138
215
  :root[data-theme="high-contrast"] {
@@ -147,40 +224,27 @@
147
224
  --c-accent: #00ffff;
148
225
  --c-ok: #00ff00;
149
226
  --c-warn: #ffff00;
150
- --c-warn-alt: #ffcc00;
151
227
  --c-danger: #ff0000;
152
- --c-purple: #e040fb;
153
- --c-thinking: #E040FB;
154
- --c-subagent: #18FFFF;
228
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
229
+ --c-pin: #00ffff;
230
+ --c-on-pin: #000000;
231
+ --c-agent: #e040fb;
232
+ --c-subagent: #ff99ff;
233
+ --c-rel-supports: #00e5c0;
234
+ --c-rel-contradicts: #ff8a00;
235
+ --c-rel-cites: #8c9eff;
236
+ --c-rel-derived: #ffffff;
237
+ --c-rel-informs: #ff80ab;
238
+ --c-rel-related: #aaaaaa;
155
239
  --c-input-bg: #111111;
156
240
  --c-dot-grid: rgba(255, 255, 255, 0.12);
157
241
  --c-panel-overlay: rgba(0, 0, 0, 0.85);
158
242
  --c-panel-glass: rgba(0, 0, 0, 0.95);
159
243
  --c-shadow: rgba(0, 0, 0, 0.5);
160
244
  --c-shadow-heavy: rgba(0, 0, 0, 0.7);
161
- --c-glow-accent: rgba(0, 255, 255, 0.2);
162
245
  --c-surface-hover: rgba(255, 255, 255, 0.1);
163
246
  --c-surface-subtle: rgba(255, 255, 255, 0.05);
164
247
  --c-surface-th: rgba(255, 255, 255, 0.08);
165
- --c-accent-8: rgba(0, 255, 255, 0.08);
166
- --c-accent-10: rgba(0, 255, 255, 0.1);
167
- --c-accent-12: rgba(0, 255, 255, 0.12);
168
- --c-accent-15: rgba(0, 255, 255, 0.15);
169
- --c-accent-25: rgba(0, 255, 255, 0.25);
170
- --c-accent-30: rgba(0, 255, 255, 0.3);
171
- --c-accent-40: rgba(0, 255, 255, 0.4);
172
- --c-ok-10: rgba(0, 255, 0, 0.1);
173
- --c-ok-12: rgba(0, 255, 0, 0.12);
174
- --c-ok-20: rgba(0, 255, 0, 0.2);
175
- --c-ok-25: rgba(0, 255, 0, 0.25);
176
- --c-warn-10: rgba(255, 255, 0, 0.1);
177
- --c-warn-12: rgba(255, 255, 0, 0.12);
178
- --c-warn-15: rgba(255, 255, 0, 0.15);
179
- --c-warn-20: rgba(255, 255, 0, 0.2);
180
- --c-warn-22: rgba(255, 255, 0, 0.22);
181
- --c-warn-30: rgba(255, 255, 0, 0.3);
182
- --c-warn-60: rgba(255, 255, 0, 0.6);
183
- --c-danger-12: rgba(255, 0, 0, 0.12);
184
248
  --c-line-30: rgba(255, 255, 255, 0.3);
185
249
  --c-contrast-fg: #000000;
186
250
  --c-accent-hover: #33ffff;
@@ -202,40 +266,27 @@
202
266
  --c-accent: #8B96FF;
203
267
  --c-ok: #34D399;
204
268
  --c-warn: #F5C452;
205
- --c-warn-alt: #FFB300;
206
269
  --c-danger: #FF6B8A;
207
- --c-purple: #B388FF;
208
- --c-thinking: #B388FF;
209
- --c-subagent: #22D3EE;
270
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
271
+ --c-pin: #4BBCFF;
272
+ --c-on-pin: #081524;
273
+ --c-agent: #B388FF;
274
+ --c-subagent: #E879F9;
275
+ --c-rel-supports: #5FCFC0;
276
+ --c-rel-contradicts: #E59B6B;
277
+ --c-rel-cites: #7C9CFF;
278
+ --c-rel-derived: #D5DEEA;
279
+ --c-rel-informs: #E58FB0;
280
+ --c-rel-related: #8D96BC;
210
281
  --c-input-bg: #0D1224;
211
282
  --c-dot-grid: rgba(139, 150, 255, 0.08);
212
283
  --c-panel-overlay: rgba(10, 13, 28, 0.6);
213
284
  --c-panel-glass: rgba(18, 23, 46, 0.92);
214
285
  --c-shadow: rgba(0, 0, 0, 0.3);
215
286
  --c-shadow-heavy: rgba(0, 0, 0, 0.5);
216
- --c-glow-accent: rgba(139, 150, 255, 0.15);
217
287
  --c-surface-hover: rgba(255, 255, 255, 0.06);
218
288
  --c-surface-subtle: rgba(255, 255, 255, 0.03);
219
289
  --c-surface-th: rgba(255, 255, 255, 0.04);
220
- --c-accent-8: rgba(139, 150, 255, 0.08);
221
- --c-accent-10: rgba(139, 150, 255, 0.1);
222
- --c-accent-12: rgba(139, 150, 255, 0.12);
223
- --c-accent-15: rgba(139, 150, 255, 0.15);
224
- --c-accent-25: rgba(139, 150, 255, 0.25);
225
- --c-accent-30: rgba(139, 150, 255, 0.3);
226
- --c-accent-40: rgba(139, 150, 255, 0.4);
227
- --c-ok-10: rgba(52, 211, 153, 0.1);
228
- --c-ok-12: rgba(52, 211, 153, 0.12);
229
- --c-ok-20: rgba(52, 211, 153, 0.2);
230
- --c-ok-25: rgba(52, 211, 153, 0.25);
231
- --c-warn-10: rgba(245, 196, 82, 0.1);
232
- --c-warn-12: rgba(245, 196, 82, 0.12);
233
- --c-warn-15: rgba(245, 196, 82, 0.15);
234
- --c-warn-20: rgba(245, 196, 82, 0.2);
235
- --c-warn-22: rgba(245, 196, 82, 0.22);
236
- --c-warn-30: rgba(245, 196, 82, 0.3);
237
- --c-warn-60: rgba(245, 196, 82, 0.6);
238
- --c-danger-12: rgba(255, 107, 138, 0.12);
239
290
  --c-line-30: rgba(35, 43, 74, 0.3);
240
291
  --c-contrast-fg: #0A0D1C;
241
292
  --c-accent-hover: #A3ACFF;
@@ -256,41 +307,31 @@
256
307
  --c-dim: #978870;
257
308
  --c-accent: #B4632C;
258
309
  --c-ok: #3E7D4F;
259
- --c-warn: #A97B1E;
260
- --c-warn-alt: #8F6A0D;
310
+ --c-warn: #8A5A00;
261
311
  --c-danger: #B3402E;
262
- --c-purple: #8456B0;
263
- --c-thinking: #8456B0;
264
- --c-subagent: #0E7C7B;
312
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
313
+ --c-pin: #1F6FA8;
314
+ --c-on-pin: #FFFFFF;
315
+ --c-agent: #7046A6;
316
+ --c-subagent: #A83BB0;
317
+ --c-rel-supports: #1E8C80;
318
+ --c-rel-contradicts: #A3461C;
319
+ --c-rel-cites: #3D50B0;
320
+ --c-rel-derived: #4E4433;
321
+ --c-rel-informs: #9C3A66;
322
+ --c-rel-related: #6B6A66;
323
+ /* Light themes: ink-tinted shadows (the drawn black ones are for dark surfaces). */
324
+ --e-1: 0 1px 2px rgba(8, 21, 36, 0.1), 0 6px 20px rgba(8, 21, 36, 0.08);
325
+ --e-2: 0 10px 30px rgba(8, 21, 36, 0.18);
265
326
  --c-input-bg: #F7EEDD;
266
327
  --c-dot-grid: rgba(46, 36, 22, 0.08);
267
328
  --c-panel-overlay: rgba(242, 231, 213, 0.88);
268
329
  --c-panel-glass: rgba(235, 220, 194, 0.88);
269
330
  --c-shadow: rgba(46, 36, 22, 0.08);
270
331
  --c-shadow-heavy: rgba(46, 36, 22, 0.16);
271
- --c-glow-accent: rgba(180, 99, 44, 0.12);
272
332
  --c-surface-hover: rgba(46, 36, 22, 0.06);
273
333
  --c-surface-subtle: rgba(46, 36, 22, 0.03);
274
334
  --c-surface-th: rgba(46, 36, 22, 0.04);
275
- --c-accent-8: rgba(180, 99, 44, 0.08);
276
- --c-accent-10: rgba(180, 99, 44, 0.1);
277
- --c-accent-12: rgba(180, 99, 44, 0.12);
278
- --c-accent-15: rgba(180, 99, 44, 0.15);
279
- --c-accent-25: rgba(180, 99, 44, 0.25);
280
- --c-accent-30: rgba(180, 99, 44, 0.3);
281
- --c-accent-40: rgba(180, 99, 44, 0.4);
282
- --c-ok-10: rgba(62, 125, 79, 0.1);
283
- --c-ok-12: rgba(62, 125, 79, 0.12);
284
- --c-ok-20: rgba(62, 125, 79, 0.2);
285
- --c-ok-25: rgba(62, 125, 79, 0.25);
286
- --c-warn-10: rgba(169, 123, 30, 0.1);
287
- --c-warn-12: rgba(169, 123, 30, 0.12);
288
- --c-warn-15: rgba(169, 123, 30, 0.15);
289
- --c-warn-20: rgba(169, 123, 30, 0.2);
290
- --c-warn-22: rgba(169, 123, 30, 0.22);
291
- --c-warn-30: rgba(169, 123, 30, 0.3);
292
- --c-warn-60: rgba(169, 123, 30, 0.6);
293
- --c-danger-12: rgba(179, 64, 46, 0.12);
294
335
  --c-line-30: rgba(211, 193, 160, 0.5);
295
336
  --c-contrast-fg: #F2E7D5;
296
337
  --c-accent-hover: #C4763F;
@@ -312,40 +353,27 @@
312
353
  --c-accent: #7FC8DE;
313
354
  --c-ok: #74C596;
314
355
  --c-warn: #E8C476;
315
- --c-warn-alt: #E0A93F;
316
356
  --c-danger: #D9707C;
317
- --c-purple: #B48EAD;
318
- --c-thinking: #B48EAD;
319
- --c-subagent: #6FD6C4;
357
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
358
+ --c-pin: #6EC1F5;
359
+ --c-on-pin: #081524;
360
+ --c-agent: #B388FF;
361
+ --c-subagent: #E879F9;
362
+ --c-rel-supports: #5FCFC0;
363
+ --c-rel-contradicts: #E59B6B;
364
+ --c-rel-cites: #7C9CFF;
365
+ --c-rel-derived: #D5DEEA;
366
+ --c-rel-informs: #E58FB0;
367
+ --c-rel-related: #939DB1;
320
368
  --c-input-bg: #242936;
321
369
  --c-dot-grid: rgba(127, 200, 222, 0.08);
322
370
  --c-panel-overlay: rgba(32, 36, 46, 0.6);
323
371
  --c-panel-glass: rgba(42, 47, 60, 0.92);
324
372
  --c-shadow: rgba(0, 0, 0, 0.3);
325
373
  --c-shadow-heavy: rgba(0, 0, 0, 0.5);
326
- --c-glow-accent: rgba(127, 200, 222, 0.15);
327
374
  --c-surface-hover: rgba(255, 255, 255, 0.06);
328
375
  --c-surface-subtle: rgba(255, 255, 255, 0.03);
329
376
  --c-surface-th: rgba(255, 255, 255, 0.04);
330
- --c-accent-8: rgba(127, 200, 222, 0.08);
331
- --c-accent-10: rgba(127, 200, 222, 0.1);
332
- --c-accent-12: rgba(127, 200, 222, 0.12);
333
- --c-accent-15: rgba(127, 200, 222, 0.15);
334
- --c-accent-25: rgba(127, 200, 222, 0.25);
335
- --c-accent-30: rgba(127, 200, 222, 0.3);
336
- --c-accent-40: rgba(127, 200, 222, 0.4);
337
- --c-ok-10: rgba(116, 197, 150, 0.1);
338
- --c-ok-12: rgba(116, 197, 150, 0.12);
339
- --c-ok-20: rgba(116, 197, 150, 0.2);
340
- --c-ok-25: rgba(116, 197, 150, 0.25);
341
- --c-warn-10: rgba(232, 196, 118, 0.1);
342
- --c-warn-12: rgba(232, 196, 118, 0.12);
343
- --c-warn-15: rgba(232, 196, 118, 0.15);
344
- --c-warn-20: rgba(232, 196, 118, 0.2);
345
- --c-warn-22: rgba(232, 196, 118, 0.22);
346
- --c-warn-30: rgba(232, 196, 118, 0.3);
347
- --c-warn-60: rgba(232, 196, 118, 0.6);
348
- --c-danger-12: rgba(217, 112, 124, 0.12);
349
377
  --c-line-30: rgba(58, 65, 82, 0.3);
350
378
  --c-contrast-fg: #20242E;
351
379
  --c-accent-hover: #9AD5E7;
@@ -367,40 +395,27 @@
367
395
  --c-accent: #F34E1C;
368
396
  --c-ok: #4CC38A;
369
397
  --c-warn: #F5B944;
370
- --c-warn-alt: #FFB300;
371
398
  --c-danger: #F0566A;
372
- --c-purple: #A78BFA;
373
- --c-thinking: #A78BFA;
374
- --c-subagent: #38BDF8;
399
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
400
+ --c-pin: #4BBCFF;
401
+ --c-on-pin: #081524;
402
+ --c-agent: #B388FF;
403
+ --c-subagent: #E879F9;
404
+ --c-rel-supports: #5FCFC0;
405
+ --c-rel-contradicts: #E59B6B;
406
+ --c-rel-cites: #7C9CFF;
407
+ --c-rel-derived: #D5DEEA;
408
+ --c-rel-informs: #E58FB0;
409
+ --c-rel-related: #96948D;
375
410
  --c-input-bg: #101012;
376
411
  --c-dot-grid: rgba(243, 78, 28, 0.08);
377
412
  --c-panel-overlay: rgba(11, 11, 12, 0.6);
378
413
  --c-panel-glass: rgba(22, 22, 24, 0.92);
379
414
  --c-shadow: rgba(0, 0, 0, 0.3);
380
415
  --c-shadow-heavy: rgba(0, 0, 0, 0.5);
381
- --c-glow-accent: rgba(243, 78, 28, 0.15);
382
416
  --c-surface-hover: rgba(255, 255, 255, 0.06);
383
417
  --c-surface-subtle: rgba(255, 255, 255, 0.03);
384
418
  --c-surface-th: rgba(255, 255, 255, 0.04);
385
- --c-accent-8: rgba(243, 78, 28, 0.08);
386
- --c-accent-10: rgba(243, 78, 28, 0.1);
387
- --c-accent-12: rgba(243, 78, 28, 0.12);
388
- --c-accent-15: rgba(243, 78, 28, 0.15);
389
- --c-accent-25: rgba(243, 78, 28, 0.25);
390
- --c-accent-30: rgba(243, 78, 28, 0.3);
391
- --c-accent-40: rgba(243, 78, 28, 0.4);
392
- --c-ok-10: rgba(76, 195, 138, 0.1);
393
- --c-ok-12: rgba(76, 195, 138, 0.12);
394
- --c-ok-20: rgba(76, 195, 138, 0.2);
395
- --c-ok-25: rgba(76, 195, 138, 0.25);
396
- --c-warn-10: rgba(245, 185, 68, 0.1);
397
- --c-warn-12: rgba(245, 185, 68, 0.12);
398
- --c-warn-15: rgba(245, 185, 68, 0.15);
399
- --c-warn-20: rgba(245, 185, 68, 0.2);
400
- --c-warn-22: rgba(245, 185, 68, 0.22);
401
- --c-warn-30: rgba(245, 185, 68, 0.3);
402
- --c-warn-60: rgba(245, 185, 68, 0.6);
403
- --c-danger-12: rgba(240, 86, 106, 0.12);
404
419
  --c-line-30: rgba(41, 41, 44, 0.3);
405
420
  --c-contrast-fg: #0B0B0C;
406
421
  --c-accent-hover: #FF6B3A;
@@ -422,40 +437,27 @@
422
437
  --c-accent: #5CCF8F;
423
438
  --c-ok: #74D99F;
424
439
  --c-warn: #E0B84F;
425
- --c-warn-alt: #D9A421;
426
440
  --c-danger: #E57373;
427
- --c-purple: #A88FE0;
428
- --c-thinking: #A88FE0;
429
- --c-subagent: #4FD8CE;
441
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
442
+ --c-pin: #4BBCFF;
443
+ --c-on-pin: #081524;
444
+ --c-agent: #B388FF;
445
+ --c-subagent: #E879F9;
446
+ --c-rel-supports: #4FC9D9;
447
+ --c-rel-contradicts: #E59B6B;
448
+ --c-rel-cites: #7C9CFF;
449
+ --c-rel-derived: #D5DEEA;
450
+ --c-rel-informs: #E58FB0;
451
+ --c-rel-related: #8BA695;
430
452
  --c-input-bg: #101D16;
431
453
  --c-dot-grid: rgba(92, 207, 143, 0.08);
432
454
  --c-panel-overlay: rgba(12, 23, 18, 0.6);
433
455
  --c-panel-glass: rgba(20, 35, 27, 0.92);
434
456
  --c-shadow: rgba(0, 0, 0, 0.3);
435
457
  --c-shadow-heavy: rgba(0, 0, 0, 0.5);
436
- --c-glow-accent: rgba(92, 207, 143, 0.15);
437
458
  --c-surface-hover: rgba(255, 255, 255, 0.06);
438
459
  --c-surface-subtle: rgba(255, 255, 255, 0.03);
439
460
  --c-surface-th: rgba(255, 255, 255, 0.04);
440
- --c-accent-8: rgba(92, 207, 143, 0.08);
441
- --c-accent-10: rgba(92, 207, 143, 0.1);
442
- --c-accent-12: rgba(92, 207, 143, 0.12);
443
- --c-accent-15: rgba(92, 207, 143, 0.15);
444
- --c-accent-25: rgba(92, 207, 143, 0.25);
445
- --c-accent-30: rgba(92, 207, 143, 0.3);
446
- --c-accent-40: rgba(92, 207, 143, 0.4);
447
- --c-ok-10: rgba(116, 217, 159, 0.1);
448
- --c-ok-12: rgba(116, 217, 159, 0.12);
449
- --c-ok-20: rgba(116, 217, 159, 0.2);
450
- --c-ok-25: rgba(116, 217, 159, 0.25);
451
- --c-warn-10: rgba(224, 184, 79, 0.1);
452
- --c-warn-12: rgba(224, 184, 79, 0.12);
453
- --c-warn-15: rgba(224, 184, 79, 0.15);
454
- --c-warn-20: rgba(224, 184, 79, 0.2);
455
- --c-warn-22: rgba(224, 184, 79, 0.22);
456
- --c-warn-30: rgba(224, 184, 79, 0.3);
457
- --c-warn-60: rgba(224, 184, 79, 0.6);
458
- --c-danger-12: rgba(229, 115, 115, 0.12);
459
461
  --c-line-30: rgba(38, 64, 47, 0.3);
460
462
  --c-contrast-fg: #0C1712;
461
463
  --c-accent-hover: #7BDAA4;
@@ -477,40 +479,27 @@
477
479
  --c-accent: #DFDFC1;
478
480
  --c-ok: #52C880;
479
481
  --c-warn: #E4C465;
480
- --c-warn-alt: #FFB300;
481
482
  --c-danger: #D67670;
482
- --c-purple: #BC8FB4;
483
- --c-thinking: #BC8FB4;
484
- --c-subagent: #6CA0E0;
483
+ /* ── Meaning (one hue per meaning in every theme; see docs/design.md) ── */
484
+ --c-pin: #4BBCFF;
485
+ --c-on-pin: #081524;
486
+ --c-agent: #B388FF;
487
+ --c-subagent: #E879F9;
488
+ --c-rel-supports: #5FCFC0;
489
+ --c-rel-contradicts: #E59B6B;
490
+ --c-rel-cites: #7C9CFF;
491
+ --c-rel-derived: #D5DEEA;
492
+ --c-rel-informs: #E58FB0;
493
+ --c-rel-related: #9CA49C;
485
494
  --c-input-bg: #111311;
486
495
  --c-dot-grid: rgba(223, 223, 193, 0.08);
487
496
  --c-panel-overlay: rgba(11, 13, 11, 0.6);
488
497
  --c-panel-glass: rgba(23, 26, 23, 0.92);
489
498
  --c-shadow: rgba(0, 0, 0, 0.3);
490
499
  --c-shadow-heavy: rgba(0, 0, 0, 0.5);
491
- --c-glow-accent: rgba(223, 223, 193, 0.15);
492
500
  --c-surface-hover: rgba(255, 255, 255, 0.06);
493
501
  --c-surface-subtle: rgba(255, 255, 255, 0.03);
494
502
  --c-surface-th: rgba(255, 255, 255, 0.04);
495
- --c-accent-8: rgba(223, 223, 193, 0.08);
496
- --c-accent-10: rgba(223, 223, 193, 0.1);
497
- --c-accent-12: rgba(223, 223, 193, 0.12);
498
- --c-accent-15: rgba(223, 223, 193, 0.15);
499
- --c-accent-25: rgba(223, 223, 193, 0.25);
500
- --c-accent-30: rgba(223, 223, 193, 0.3);
501
- --c-accent-40: rgba(223, 223, 193, 0.4);
502
- --c-ok-10: rgba(82, 200, 128, 0.1);
503
- --c-ok-12: rgba(82, 200, 128, 0.12);
504
- --c-ok-20: rgba(82, 200, 128, 0.2);
505
- --c-ok-25: rgba(82, 200, 128, 0.25);
506
- --c-warn-10: rgba(228, 196, 101, 0.1);
507
- --c-warn-12: rgba(228, 196, 101, 0.12);
508
- --c-warn-15: rgba(228, 196, 101, 0.15);
509
- --c-warn-20: rgba(228, 196, 101, 0.2);
510
- --c-warn-22: rgba(228, 196, 101, 0.22);
511
- --c-warn-30: rgba(228, 196, 101, 0.3);
512
- --c-warn-60: rgba(228, 196, 101, 0.6);
513
- --c-danger-12: rgba(214, 118, 112, 0.12);
514
503
  --c-line-30: rgba(39, 42, 39, 0.3);
515
504
  --c-contrast-fg: #0B0D0B;
516
505
  --c-accent-hover: #EDEDDB;
@@ -525,6 +514,14 @@
525
514
  padding: 0;
526
515
  }
527
516
 
517
+ /* Controls take the page font instead of the browser's (Arial). */
518
+ button,
519
+ input,
520
+ select,
521
+ textarea {
522
+ font: inherit;
523
+ }
524
+
528
525
  html,
529
526
  body,
530
527
  #app {
@@ -533,7 +530,7 @@ body,
533
530
  overflow: hidden;
534
531
  background: var(--c-bg);
535
532
  color: var(--c-text);
536
- font: 14px / 1.55 var(--font);
533
+ font: 14px / 1.55 var(--font-ui);
537
534
  -webkit-font-smoothing: antialiased;
538
535
  }
539
536
 
@@ -564,17 +561,32 @@ body,
564
561
  /* Node card shared styles */
565
562
  .canvas-node {
566
563
  position: absolute;
567
- /* Standard card shell (rail-chrome-v2): node surface, 12px radius, soft
568
- shadow. Every node kind shares it; the kind shows in the icon color. */
564
+ /* Standard card shell (docs/design/Context.dc.html): node surface, node
565
+ radius, first elevation. Every node kind shares it; the kind shows in
566
+ the icon color. */
569
567
  background: var(--c-panel);
570
568
  border: 1px solid var(--c-line);
571
- border-radius: 12px;
572
- box-shadow: 0 4px 24px var(--c-shadow);
569
+ border-radius: var(--r-node);
570
+ box-shadow: var(--e-1);
573
571
  display: flex;
574
572
  flex-direction: column;
575
- overflow: hidden;
573
+ overflow: visible;
576
574
  transition: box-shadow 0.15s ease;
577
- contain: layout style paint;
575
+ contain: layout style;
576
+ }
577
+
578
+ /* Clip card content, not the connection handles centered on its border. */
579
+ .node-content {
580
+ display: flex;
581
+ flex-direction: column;
582
+ flex: 1;
583
+ min-height: 0;
584
+ border-radius: inherit;
585
+ overflow: hidden;
586
+ contain: paint;
587
+ }
588
+ .group-node > .node-content {
589
+ display: contents;
578
590
  }
579
591
 
580
592
  .canvas-node:hover {
@@ -583,24 +595,24 @@ body,
583
595
 
584
596
  .canvas-node.active {
585
597
  border-color: var(--c-accent);
586
- box-shadow: 0 0 0 1px var(--c-accent), 0 6px 32px var(--c-glow-accent);
598
+ box-shadow: 0 0 0 1px var(--c-accent), 0 6px 32px color-mix(in srgb, var(--c-accent) 15%, transparent);
587
599
  }
588
600
 
589
601
  .canvas-node.neighbor {
590
- border-color: var(--c-accent-40);
591
- box-shadow: 0 0 0 1px var(--c-accent-30), 0 4px 20px var(--c-accent-15);
602
+ border-color: color-mix(in srgb, var(--c-accent) 40%, transparent);
603
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-accent) 30%, transparent), 0 4px 20px color-mix(in srgb, var(--c-accent) 15%, transparent);
592
604
  transition: border-color 0.2s, box-shadow 0.2s;
593
605
  }
594
606
 
595
607
  /* Spatial search highlighting — canvas lights up as you type in Cmd+K */
596
608
  .canvas-node.search-match {
597
609
  border-color: var(--c-accent);
598
- box-shadow: 0 0 0 2px var(--c-accent), 0 0 20px var(--c-accent-30), 0 0 40px var(--c-accent-15);
610
+ box-shadow: 0 0 0 2px var(--c-accent), 0 0 20px color-mix(in srgb, var(--c-accent) 30%, transparent), 0 0 40px color-mix(in srgb, var(--c-accent) 15%, transparent);
599
611
  animation: search-pulse 1.5s ease-in-out infinite;
600
612
  }
601
613
  @keyframes search-pulse {
602
- 0%, 100% { box-shadow: 0 0 0 2px var(--c-accent), 0 0 20px var(--c-accent-30), 0 0 40px var(--c-accent-15); }
603
- 50% { box-shadow: 0 0 0 2px var(--c-accent), 0 0 30px var(--c-accent-40), 0 0 60px var(--c-accent-25); }
614
+ 0%, 100% { box-shadow: 0 0 0 2px var(--c-accent), 0 0 20px color-mix(in srgb, var(--c-accent) 30%, transparent), 0 0 40px color-mix(in srgb, var(--c-accent) 15%, transparent); }
615
+ 50% { box-shadow: 0 0 0 2px var(--c-accent), 0 0 30px color-mix(in srgb, var(--c-accent) 40%, transparent), 0 0 60px color-mix(in srgb, var(--c-accent) 25%, transparent); }
604
616
  }
605
617
  .canvas-node.search-dimmed {
606
618
  opacity: 0.25;
@@ -610,34 +622,42 @@ body,
610
622
  /* ── Connection port handles (drag-to-connect) ───────────── */
611
623
  .node-port {
612
624
  position: absolute;
613
- width: 10px;
614
- height: 10px;
615
- border-radius: 50%;
616
- background: var(--c-accent);
617
- border: 2px solid var(--c-panel);
625
+ /* The visible dot stays compact; its grab area stays usable at every zoom. */
626
+ width: calc(32px * var(--node-port-scale, 1));
627
+ height: calc(32px * var(--node-port-scale, 1));
628
+ display: grid;
629
+ place-items: center;
618
630
  opacity: 0;
619
631
  cursor: crosshair;
620
632
  z-index: 10;
621
- transition: opacity 0.15s, transform 0.15s;
622
- transform: translate(-50%, -50%) scale(0.6);
633
+ touch-action: none;
634
+ transition: opacity 0.15s;
623
635
  pointer-events: auto;
624
636
  }
625
- .canvas-node:hover .node-port {
637
+ .node-port::after {
638
+ content: '';
639
+ width: calc(6px * var(--node-port-scale, 1));
640
+ height: calc(6px * var(--node-port-scale, 1));
641
+ border-radius: 50%;
642
+ background: var(--c-accent);
643
+ border: calc(2px * var(--node-port-scale, 1)) solid var(--c-panel);
644
+ box-shadow: 0 0 0 calc(1px * var(--node-port-scale, 1)) var(--c-accent);
645
+ }
646
+ .canvas-node:hover .node-port,
647
+ .canvas-node.selected .node-port,
648
+ .canvas-node:focus-within .node-port {
626
649
  opacity: 1;
627
- transform: translate(-50%, -50%) scale(1);
628
650
  }
629
- .node-port:hover {
651
+ .node-port:hover::after {
630
652
  background: var(--c-accent-hover);
631
- transform: translate(-50%, -50%) scale(1.3);
632
653
  }
633
- .node-port-top { top: 0; left: 50%; }
634
- .node-port-bottom { bottom: 0; left: 50%; transform: translate(-50%, 50%) scale(0.6); }
635
- .node-port-left { left: 0; top: 50%; }
636
- .node-port-right { right: 0; top: 50%; transform: translate(50%, -50%) scale(0.6); }
637
- .canvas-node:hover .node-port-bottom { transform: translate(-50%, 50%) scale(1); }
638
- .canvas-node:hover .node-port-right { transform: translate(50%, -50%) scale(1); }
639
- .node-port-bottom:hover { transform: translate(-50%, 50%) scale(1.3); }
640
- .node-port-right:hover { transform: translate(50%, -50%) scale(1.3); }
654
+ /* Bias vertical grab areas outward so they do not steal title/footer clicks. */
655
+ .node-port-top { top: 0; left: 50%; transform: translate(-50%, -75%); }
656
+ .node-port-bottom { bottom: 0; left: 50%; transform: translate(-50%, 75%); }
657
+ .node-port-top::after { transform: translateY(calc(8px * var(--node-port-scale, 1))); }
658
+ .node-port-bottom::after { transform: translateY(calc(-8px * var(--node-port-scale, 1))); }
659
+ .node-port-left { left: 0; top: 50%; transform: translate(-50%, -50%); }
660
+ .node-port-right { right: 0; top: 50%; transform: translate(50%, -50%); }
641
661
 
642
662
  .canvas-node .node-titlebar {
643
663
  display: flex;
@@ -676,31 +696,15 @@ body,
676
696
  justify-content: center;
677
697
  width: calc(14px * var(--node-chrome-scale, 1));
678
698
  height: calc(14px * var(--node-chrome-scale, 1));
679
- color: var(--kind-accent, var(--c-accent));
699
+ color: var(--c-muted);
680
700
  flex-shrink: 0;
681
701
  }
682
702
 
683
- /* Node kind accents (rail-chrome-v2): the icon carries the kind. */
684
- .canvas-node[data-node-type='image'],
685
- .canvas-node[data-node-type='mermaid'] {
686
- --kind-accent: var(--c-warn);
687
- }
688
- .canvas-node[data-node-type='webpage'],
689
- .canvas-node[data-node-type='status'],
690
- .canvas-node[data-node-type='trace'] {
691
- --kind-accent: var(--c-ok);
692
- }
693
- .canvas-node[data-node-type='context'],
694
- .canvas-node[data-node-type='prompt'],
695
- .canvas-node[data-node-type='response'] {
696
- --kind-accent: var(--c-purple);
697
- }
698
-
699
703
  .canvas-node .node-type-badge {
700
704
  font-size: calc(10px * var(--node-chrome-scale, 1));
701
705
  padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
702
706
  border-radius: calc(4px * var(--node-chrome-scale, 1));
703
- background: var(--c-accent-12);
707
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
704
708
  color: var(--c-accent);
705
709
  text-transform: uppercase;
706
710
  letter-spacing: 0.04em;
@@ -770,6 +774,17 @@ body,
770
774
  color: var(--c-text);
771
775
  }
772
776
 
777
+ /* ⋯ and × appear on hover or keyboard focus; expand and the context pin
778
+ always show (docs/design/Chrome.dc.html). */
779
+ .canvas-node .node-controls .node-hover-control {
780
+ display: none;
781
+ }
782
+
783
+ .canvas-node:hover .node-controls .node-hover-control,
784
+ .canvas-node:focus-within .node-controls .node-hover-control {
785
+ display: inline-flex;
786
+ }
787
+
773
788
  .canvas-node .node-body {
774
789
  flex: 1;
775
790
  overflow: auto;
@@ -870,7 +885,7 @@ body,
870
885
  }
871
886
 
872
887
  .canvas-node .node-body code {
873
- font-family: var(--mono);
888
+ font-family: var(--font-code);
874
889
  font-size: 0.9em;
875
890
  background: var(--c-surface-hover);
876
891
  padding: 2px 5px;
@@ -970,12 +985,12 @@ body,
970
985
  color: var(--c-text);
971
986
  }
972
987
  .rail-btn.active {
973
- background: var(--c-accent-10);
974
- border-color: var(--c-accent-25);
988
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
989
+ border-color: color-mix(in srgb, var(--c-accent) 25%, transparent);
975
990
  color: var(--c-accent);
976
991
  }
977
992
  .rail-btn.active:hover {
978
- background: var(--c-accent-15, var(--c-accent-10));
993
+ background: color-mix(in srgb, var(--c-accent) 15%, transparent);
979
994
  }
980
995
 
981
996
  .rail-divider {
@@ -1039,7 +1054,7 @@ body,
1039
1054
  }
1040
1055
 
1041
1056
  .top-bar-meta {
1042
- font: 11px var(--mono);
1057
+ font: 11px var(--font-code);
1043
1058
  color: var(--c-dim);
1044
1059
  white-space: nowrap;
1045
1060
  flex-shrink: 0;
@@ -1081,7 +1096,7 @@ body,
1081
1096
  .top-bar-zoom-label {
1082
1097
  min-width: 38px;
1083
1098
  text-align: center;
1084
- font: 11px var(--mono);
1099
+ font: 11px var(--font-code);
1085
1100
  color: var(--c-muted);
1086
1101
  background: none;
1087
1102
  border: 1px solid transparent;
@@ -1114,7 +1129,7 @@ body,
1114
1129
  .agent-chip.phase-thinking,
1115
1130
  .agent-cursor.phase-thinking,
1116
1131
  .minimap-presence.phase-thinking {
1117
- --presence-color: var(--c-purple);
1132
+ --presence-color: var(--c-agent);
1118
1133
  }
1119
1134
  .agent-chip.phase-tooling,
1120
1135
  .agent-cursor.phase-tooling,
@@ -1198,7 +1213,7 @@ body,
1198
1213
  min-width: 0;
1199
1214
  }
1200
1215
  .agent-chip-who {
1201
- font: 10px var(--mono);
1216
+ font: 10px var(--font-code);
1202
1217
  font-weight: 400;
1203
1218
  color: var(--c-muted);
1204
1219
  white-space: nowrap;
@@ -1336,22 +1351,15 @@ body,
1336
1351
  animation: presence-pulse 1.4s ease-in-out infinite;
1337
1352
  }
1338
1353
  .agent-cursor-who {
1339
- font: 9.5px var(--mono);
1354
+ font: 9.5px var(--font-code);
1340
1355
  font-weight: 400;
1341
1356
  color: var(--c-muted);
1342
1357
  }
1343
1358
 
1344
- /* Node shimmer: the node an attached agent is mutating right now */
1345
- .canvas-node.agent-mutating {
1346
- border-color: color-mix(in srgb, var(--c-accent) 45%, transparent) !important;
1347
- background-image: linear-gradient(
1348
- 100deg,
1349
- transparent 20%,
1350
- color-mix(in srgb, var(--c-accent) 13%, transparent) 50%,
1351
- transparent 80%
1352
- );
1353
- background-size: 200% 100%;
1354
- animation: presence-shimmer 1.6s linear infinite;
1359
+ /* The node an attached agent is editing right now: the violet agent bar
1360
+ across the top of the header (docs/design/Context.dc.html). */
1361
+ .canvas-node.agent-mutating .node-titlebar {
1362
+ box-shadow: inset 0 2.5px 0 var(--c-agent);
1355
1363
  }
1356
1364
 
1357
1365
  @keyframes presence-pulse {
@@ -1363,14 +1371,6 @@ body,
1363
1371
  opacity: 0.45;
1364
1372
  }
1365
1373
  }
1366
- @keyframes presence-shimmer {
1367
- from {
1368
- background-position: 200% 0;
1369
- }
1370
- to {
1371
- background-position: -200% 0;
1372
- }
1373
- }
1374
1374
 
1375
1375
  /* Reduced motion: keep every static color state, drop the motion. */
1376
1376
  @media (prefers-reduced-motion: reduce) {
@@ -1378,13 +1378,9 @@ body,
1378
1378
  transition: none;
1379
1379
  }
1380
1380
  .agent-chip-dot,
1381
- .agent-cursor-dot,
1382
- .canvas-node.agent-mutating {
1381
+ .agent-cursor-dot {
1383
1382
  animation: none;
1384
1383
  }
1385
- .canvas-node.agent-mutating {
1386
- background-image: none;
1387
- }
1388
1384
  }
1389
1385
 
1390
1386
  /* ── Session panel (rail-chrome-v2 phase 4) ─────────────────────
@@ -1420,7 +1416,7 @@ body,
1420
1416
  flex-direction: column;
1421
1417
  align-items: center;
1422
1418
  gap: 4px;
1423
- font: 9px var(--mono);
1419
+ font: 9px var(--font-code);
1424
1420
  color: var(--c-dim);
1425
1421
  }
1426
1422
  .session-collapsed-live .session-live-dot {
@@ -1448,11 +1444,11 @@ body,
1448
1444
  display: inline-flex;
1449
1445
  align-items: center;
1450
1446
  gap: 5px;
1451
- font: 10px var(--mono);
1447
+ font: 10px var(--font-code);
1452
1448
  color: var(--c-muted);
1453
1449
  }
1454
1450
  .session-live.phase-thinking {
1455
- --presence-color: var(--c-purple);
1451
+ --presence-color: var(--c-agent);
1456
1452
  }
1457
1453
  .session-live.phase-tooling {
1458
1454
  --presence-color: var(--c-accent);
@@ -1596,7 +1592,7 @@ body,
1596
1592
  margin-top: 3px;
1597
1593
  }
1598
1594
  .session-item-time {
1599
- font: 9px var(--mono);
1595
+ font: 9px var(--font-code);
1600
1596
  color: var(--c-dim);
1601
1597
  flex-shrink: 0;
1602
1598
  margin-top: 4px;
@@ -1607,7 +1603,7 @@ body,
1607
1603
  }
1608
1604
  .session-gate-ttl {
1609
1605
  margin-top: 4px;
1610
- font: 10px var(--mono);
1606
+ font: 10px var(--font-code);
1611
1607
  color: var(--c-warn);
1612
1608
  }
1613
1609
  .session-gate-held {
@@ -1669,7 +1665,7 @@ body,
1669
1665
  display: inline-flex;
1670
1666
  align-items: center;
1671
1667
  gap: 6px;
1672
- font: 10px/1 var(--mono);
1668
+ font: 10px/1 var(--font-code);
1673
1669
  color: var(--c-muted);
1674
1670
  }
1675
1671
  .session-work-dot {
@@ -1706,7 +1702,7 @@ body,
1706
1702
  gap: 8px;
1707
1703
  padding: 7px 12px;
1708
1704
  border-bottom: 1px solid var(--c-line);
1709
- background: var(--c-accent-8);
1705
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
1710
1706
  }
1711
1707
  .session-undo-text {
1712
1708
  flex: 1;
@@ -1720,7 +1716,7 @@ body,
1720
1716
  .session-undo-btn {
1721
1717
  flex-shrink: 0;
1722
1718
  padding: 3px 10px;
1723
- border: 1px solid var(--c-accent-25);
1719
+ border: 1px solid color-mix(in srgb, var(--c-accent) 25%, transparent);
1724
1720
  border-radius: 999px;
1725
1721
  background: none;
1726
1722
  color: var(--c-accent);
@@ -1729,7 +1725,7 @@ body,
1729
1725
  cursor: pointer;
1730
1726
  }
1731
1727
  .session-undo-btn:hover {
1732
- background: var(--c-accent-10);
1728
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
1733
1729
  }
1734
1730
 
1735
1731
  .session-timeline-filters {
@@ -1780,7 +1776,7 @@ body,
1780
1776
  --tone: var(--c-danger);
1781
1777
  }
1782
1778
  .session-timeline-row.tone-purple {
1783
- --tone: var(--c-purple);
1779
+ --tone: var(--c-agent);
1784
1780
  }
1785
1781
  .session-timeline-dot {
1786
1782
  width: 6px;
@@ -1823,7 +1819,7 @@ body,
1823
1819
  padding: 4px 12px;
1824
1820
  border: 1px solid var(--c-accent);
1825
1821
  border-radius: 999px;
1826
- background: var(--c-accent-10);
1822
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
1827
1823
  color: var(--c-accent);
1828
1824
  font-size: 11.5px;
1829
1825
  font-weight: 700;
@@ -1836,7 +1832,7 @@ body,
1836
1832
  }
1837
1833
  .session-timeline-undone {
1838
1834
  margin-top: 2px;
1839
- font: 9px var(--mono);
1835
+ font: 9px var(--font-code);
1840
1836
  color: var(--c-dim);
1841
1837
  }
1842
1838
  .session-timeline-body {
@@ -1857,7 +1853,7 @@ body,
1857
1853
  color: var(--c-muted);
1858
1854
  }
1859
1855
  .session-scope.is-fenced {
1860
- background: color-mix(in srgb, var(--c-purple) 8%, transparent);
1856
+ background: color-mix(in srgb, var(--c-agent) 8%, transparent);
1861
1857
  color: var(--c-text-soft);
1862
1858
  }
1863
1859
  .session-scope-dot {
@@ -1868,14 +1864,14 @@ body,
1868
1864
  flex-shrink: 0;
1869
1865
  }
1870
1866
  .session-scope.is-fenced .session-scope-dot {
1871
- background: var(--c-purple);
1867
+ background: var(--c-agent);
1872
1868
  }
1873
1869
  .session-scope-text {
1874
1870
  flex: 1;
1875
1871
  min-width: 0;
1876
1872
  }
1877
1873
  .session-scope-text strong {
1878
- color: var(--c-purple);
1874
+ color: var(--c-agent);
1879
1875
  }
1880
1876
  .session-scope-action {
1881
1877
  padding: 3px 9px;
@@ -1889,8 +1885,8 @@ body,
1889
1885
  white-space: nowrap;
1890
1886
  }
1891
1887
  .session-scope-action:hover:not(:disabled) {
1892
- border-color: color-mix(in srgb, var(--c-purple) 45%, transparent);
1893
- color: var(--c-purple);
1888
+ border-color: color-mix(in srgb, var(--c-agent) 45%, transparent);
1889
+ color: var(--c-agent);
1894
1890
  }
1895
1891
  .session-scope-action:disabled {
1896
1892
  opacity: 0.5;
@@ -1904,9 +1900,9 @@ body,
1904
1900
  top: 0;
1905
1901
  z-index: 1;
1906
1902
  pointer-events: none;
1907
- border: 1.5px dashed color-mix(in srgb, var(--c-purple) 40%, transparent);
1903
+ border: 1.5px dashed color-mix(in srgb, var(--c-agent) 40%, transparent);
1908
1904
  border-radius: 16px;
1909
- background: color-mix(in srgb, var(--c-purple) 3%, transparent);
1905
+ background: color-mix(in srgb, var(--c-agent) 3%, transparent);
1910
1906
  }
1911
1907
  .scope-fence-pill {
1912
1908
  position: absolute;
@@ -1914,9 +1910,9 @@ body,
1914
1910
  transform-origin: 0 50%;
1915
1911
  padding: 3px 10px;
1916
1912
  border-radius: 999px;
1917
- border: 1px solid color-mix(in srgb, var(--c-purple) 35%, transparent);
1918
- background: color-mix(in srgb, var(--c-panel) 92%, var(--c-purple) 8%);
1919
- color: var(--c-purple);
1913
+ border: 1px solid color-mix(in srgb, var(--c-agent) 35%, transparent);
1914
+ background: color-mix(in srgb, var(--c-panel) 92%, var(--c-agent) 8%);
1915
+ color: var(--c-agent);
1920
1916
  font-size: 10px;
1921
1917
  font-weight: 600;
1922
1918
  letter-spacing: 0.04em;
@@ -1960,9 +1956,9 @@ body,
1960
1956
  max-width: 240px;
1961
1957
  padding: 2px 5px 2px 9px;
1962
1958
  border-radius: 999px;
1963
- border: 1px solid color-mix(in srgb, var(--c-warn) 35%, transparent);
1964
- background: color-mix(in srgb, var(--c-warn) 12%, transparent);
1965
- color: var(--c-warn);
1959
+ border: 1px solid color-mix(in srgb, var(--c-pin) 35%, transparent);
1960
+ background: color-mix(in srgb, var(--c-pin) 12%, transparent);
1961
+ color: var(--c-pin);
1966
1962
  font-size: 10px;
1967
1963
  font-weight: 600;
1968
1964
  }
@@ -1986,7 +1982,7 @@ body,
1986
1982
  border: none;
1987
1983
  border-radius: 50%;
1988
1984
  background: none;
1989
- color: var(--c-warn);
1985
+ color: var(--c-pin);
1990
1986
  font-size: 12px;
1991
1987
  line-height: 1;
1992
1988
  cursor: pointer;
@@ -1994,13 +1990,14 @@ body,
1994
1990
  }
1995
1991
  .command-bar-chip-unpin:hover {
1996
1992
  opacity: 1;
1997
- background: color-mix(in srgb, var(--c-warn) 25%, transparent);
1993
+ background: color-mix(in srgb, var(--c-pin) 25%, transparent);
1998
1994
  }
1999
1995
  .command-bar-chips-note {
2000
1996
  font-size: 10px;
2001
1997
  color: var(--c-dim);
2002
1998
  }
2003
1999
  .command-bar-composer {
2000
+ position: relative;
2004
2001
  display: flex;
2005
2002
  align-items: center;
2006
2003
  gap: 10px;
@@ -2012,29 +2009,77 @@ body,
2012
2009
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2013
2010
  }
2014
2011
  .command-bar-target {
2015
- appearance: none;
2016
- -webkit-appearance: none;
2017
2012
  max-width: 148px;
2018
- padding: 4px 18px 4px 8px;
2019
- border: 1px solid var(--c-line);
2020
- border-radius: 7px;
2021
- background: color-mix(in srgb, var(--c-panel) 80%, transparent)
2022
- url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='5'%3E%3Cpath d='M1 1l3 3 3-3' fill='none' stroke='%237a8699' stroke-width='1.4'/%3E%3C/svg%3E")
2023
- no-repeat right 6px center;
2024
- color: var(--c-text-soft);
2025
- font: 12px/1.3 var(--mono);
2026
- cursor: pointer;
2027
2013
  flex-shrink: 0;
2028
2014
  }
2029
- .command-bar-target:hover,
2030
- .command-bar-target:focus-visible {
2031
- border-color: var(--c-accent-25);
2015
+ .choice-menu {
2016
+ position: relative;
2017
+ min-width: 0;
2018
+ }
2019
+ .choice-menu-trigger {
2020
+ display: flex;
2021
+ align-items: center;
2022
+ justify-content: space-between;
2023
+ gap: 10px;
2024
+ width: 100%;
2025
+ min-height: 36px;
2026
+ padding: 8px 10px;
2027
+ border: 1px solid color-mix(in srgb, var(--c-line) 65%, var(--c-muted));
2028
+ border-radius: 8px;
2029
+ background: var(--c-panel-overlay);
2032
2030
  color: var(--c-text);
2031
+ font: 12px/1.35 var(--font-ui);
2032
+ cursor: pointer;
2033
+ }
2034
+ .choice-menu-trigger > span {
2035
+ overflow: hidden;
2036
+ text-overflow: ellipsis;
2037
+ white-space: nowrap;
2038
+ }
2039
+ .choice-menu-trigger svg { flex-shrink: 0; }
2040
+ .choice-menu-trigger:hover,
2041
+ .choice-menu-trigger[aria-expanded='true'] { border-color: var(--c-accent); }
2042
+ .choice-menu-trigger:focus-visible,
2043
+ .choice-menu-options button:focus-visible {
2044
+ outline: 2px solid var(--c-accent);
2045
+ outline-offset: 2px;
2046
+ }
2047
+ .toolbar-menu.choice-menu-options {
2048
+ top: calc(100% + 6px);
2049
+ left: 0;
2050
+ right: auto;
2051
+ min-width: 100%;
2052
+ width: max-content;
2053
+ max-width: min(320px, calc(100vw - 64px));
2054
+ max-height: min(280px, 40vh);
2055
+ overflow-y: auto;
2056
+ z-index: 20;
2057
+ }
2058
+ .toolbar-menu.choice-menu-options.opens-above {
2059
+ top: auto;
2060
+ bottom: calc(100% + 6px);
2061
+ }
2062
+ .command-bar-target.choice-menu {
2063
+ position: static;
2064
+ }
2065
+ .command-bar-target .choice-menu-options {
2066
+ /* Anchor to the composer, not its inset trigger, to clear the session rail. */
2067
+ min-width: min(200px, 100%);
2068
+ max-width: 100%;
2069
+ }
2070
+ .choice-menu-options .toolbar-menu-item {
2071
+ min-height: 36px;
2072
+ white-space: normal;
2073
+ overflow-wrap: anywhere;
2074
+ }
2075
+ .choice-menu-options button:disabled {
2076
+ opacity: 0.5;
2077
+ cursor: not-allowed;
2033
2078
  }
2034
2079
 
2035
2080
  .command-bar-icon {
2036
2081
  flex-shrink: 0;
2037
- color: var(--c-purple);
2082
+ color: var(--c-agent);
2038
2083
  }
2039
2084
  .command-bar-input {
2040
2085
  flex: 1;
@@ -2044,7 +2089,7 @@ body,
2044
2089
  outline: none;
2045
2090
  background: none;
2046
2091
  color: var(--c-text);
2047
- font: 13px var(--font);
2092
+ font: 13px var(--font-ui);
2048
2093
  }
2049
2094
  .command-bar-input::placeholder {
2050
2095
  color: var(--c-dim);
@@ -2104,7 +2149,7 @@ body,
2104
2149
  display: block;
2105
2150
  height: 100%;
2106
2151
  border-radius: 3px;
2107
- background: linear-gradient(90deg, var(--c-accent), var(--c-warn));
2152
+ background: var(--c-accent);
2108
2153
  transition: width 180ms ease;
2109
2154
  }
2110
2155
  .context-budget.tone-warn .context-budget-fill,
@@ -2112,7 +2157,7 @@ body,
2112
2157
  background: var(--tone);
2113
2158
  }
2114
2159
  .context-budget-label {
2115
- font: 11px var(--mono);
2160
+ font: 11px var(--font-code);
2116
2161
  color: var(--c-text-soft);
2117
2162
  min-width: 30px;
2118
2163
  text-align: right;
@@ -2138,9 +2183,9 @@ body,
2138
2183
  gap: 8px;
2139
2184
  padding: 4px 12px 4px 6px;
2140
2185
  border-radius: 999px;
2141
- border: 1px solid color-mix(in srgb, var(--c-purple) 35%, transparent);
2142
- background: color-mix(in srgb, var(--c-purple) 8%, transparent);
2143
- color: var(--c-purple);
2186
+ border: 1px solid color-mix(in srgb, var(--c-agent) 35%, transparent);
2187
+ background: color-mix(in srgb, var(--c-agent) 8%, transparent);
2188
+ color: var(--c-agent);
2144
2189
  cursor: pointer;
2145
2190
  white-space: nowrap;
2146
2191
  flex-shrink: 0;
@@ -2148,7 +2193,7 @@ body,
2148
2193
  }
2149
2194
  .external-indicator:hover,
2150
2195
  .external-indicator[aria-expanded='true'] {
2151
- background: color-mix(in srgb, var(--c-purple) 15%, transparent);
2196
+ background: color-mix(in srgb, var(--c-agent) 15%, transparent);
2152
2197
  }
2153
2198
  .external-indicator-avatars {
2154
2199
  display: inline-flex;
@@ -2162,14 +2207,14 @@ body,
2162
2207
  font-weight: 600;
2163
2208
  }
2164
2209
  .external-indicator-ops {
2165
- font: 10px var(--mono);
2210
+ font: 10px var(--font-code);
2166
2211
  color: var(--c-muted);
2167
2212
  }
2168
2213
  .external-indicator-dot {
2169
2214
  width: 7px;
2170
2215
  height: 7px;
2171
2216
  border-radius: 50%;
2172
- background: var(--c-purple);
2217
+ background: var(--c-agent);
2173
2218
  flex-shrink: 0;
2174
2219
  animation: presence-pulse 1.4s ease-in-out infinite;
2175
2220
  }
@@ -2183,7 +2228,7 @@ body,
2183
2228
  display: flex;
2184
2229
  flex-direction: column;
2185
2230
  background: var(--c-panel);
2186
- border: 1px solid color-mix(in srgb, var(--c-purple) 30%, transparent);
2231
+ border: 1px solid color-mix(in srgb, var(--c-agent) 30%, transparent);
2187
2232
  border-radius: 10px;
2188
2233
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2189
2234
  /* Popover-level like the rail menus: above the minimap, below the rail. */
@@ -2208,7 +2253,7 @@ body,
2208
2253
  color: var(--c-text);
2209
2254
  }
2210
2255
  .activity-feed-sub {
2211
- font: 9px var(--mono);
2256
+ font: 9px var(--font-code);
2212
2257
  color: var(--c-dim);
2213
2258
  }
2214
2259
  .activity-feed-close {
@@ -2230,7 +2275,7 @@ body,
2230
2275
  border-bottom: 1px solid var(--c-line);
2231
2276
  }
2232
2277
  .activity-filter {
2233
- --writer: var(--c-purple);
2278
+ --writer: var(--c-agent);
2234
2279
  padding: 2px 9px;
2235
2280
  border-radius: 999px;
2236
2281
  border: 1px solid var(--c-line);
@@ -2261,7 +2306,7 @@ body,
2261
2306
  border-bottom: none;
2262
2307
  }
2263
2308
  .activity-row.is-pending {
2264
- background: color-mix(in srgb, var(--c-purple) 5%, transparent);
2309
+ background: color-mix(in srgb, var(--c-agent) 5%, transparent);
2265
2310
  }
2266
2311
  .activity-glyph {
2267
2312
  flex-shrink: 0;
@@ -2282,7 +2327,7 @@ body,
2282
2327
  color: var(--c-accent);
2283
2328
  }
2284
2329
  .activity-glyph.tone-purple {
2285
- color: var(--c-purple);
2330
+ color: var(--c-agent);
2286
2331
  }
2287
2332
  .activity-main {
2288
2333
  flex: 1;
@@ -2299,7 +2344,7 @@ body,
2299
2344
  color: var(--c-muted);
2300
2345
  }
2301
2346
  .activity-writer {
2302
- font: 8.5px var(--mono);
2347
+ font: 8.5px var(--font-code);
2303
2348
  }
2304
2349
  .activity-actions {
2305
2350
  display: flex;
@@ -2322,7 +2367,7 @@ body,
2322
2367
  }
2323
2368
  .activity-hint,
2324
2369
  .activity-age {
2325
- font: 9px var(--mono);
2370
+ font: 9px var(--font-code);
2326
2371
  color: var(--c-dim);
2327
2372
  flex-shrink: 0;
2328
2373
  }
@@ -2357,7 +2402,7 @@ body,
2357
2402
  color: var(--c-text);
2358
2403
  }
2359
2404
  .activity-feed-link.is-accent {
2360
- color: var(--c-purple);
2405
+ color: var(--c-agent);
2361
2406
  }
2362
2407
  .activity-feed-link.is-accent:hover {
2363
2408
  text-decoration: underline;
@@ -2398,7 +2443,7 @@ body,
2398
2443
  color: var(--c-text);
2399
2444
  }
2400
2445
  .writers-board {
2401
- font: 9px var(--mono);
2446
+ font: 9px var(--font-code);
2402
2447
  color: var(--c-dim);
2403
2448
  }
2404
2449
  .writers-body {
@@ -2431,18 +2476,18 @@ body,
2431
2476
  white-space: nowrap;
2432
2477
  }
2433
2478
  .writers-name.is-mono {
2434
- font: 11px var(--mono);
2479
+ font: 11px var(--font-code);
2435
2480
  }
2436
2481
  .writers-config {
2437
2482
  font-size: 9.5px;
2438
2483
  font-weight: 600;
2439
2484
  padding: 2px 8px;
2440
2485
  border-radius: 999px;
2441
- background: color-mix(in srgb, var(--c-purple) 12%, transparent);
2442
- color: var(--c-purple);
2486
+ background: color-mix(in srgb, var(--c-agent) 12%, transparent);
2487
+ color: var(--c-agent);
2443
2488
  }
2444
2489
  .writers-meta {
2445
- font: 9.5px var(--mono);
2490
+ font: 9.5px var(--font-code);
2446
2491
  color: var(--c-dim);
2447
2492
  }
2448
2493
  .writers-empty {
@@ -2505,24 +2550,32 @@ body,
2505
2550
  .minimap-node {
2506
2551
  position: absolute;
2507
2552
  border-radius: 1.5px;
2508
- background: var(--kind);
2553
+ background: var(--c-muted);
2509
2554
  opacity: 0.55;
2510
2555
  }
2511
2556
  .minimap-node.is-group {
2512
- background: color-mix(in srgb, var(--kind) 4%, transparent);
2513
- border: 1px dashed color-mix(in srgb, var(--kind) 55%, transparent);
2557
+ background: color-mix(in srgb, var(--c-muted) 4%, transparent);
2558
+ border: 1px dashed color-mix(in srgb, var(--c-muted) 55%, transparent);
2514
2559
  opacity: 1;
2515
2560
  border-radius: 2px;
2516
2561
  }
2562
+ .minimap-node.is-pinned {
2563
+ background: var(--c-pin);
2564
+ opacity: 0.9;
2565
+ }
2566
+ .minimap-node.is-agent {
2567
+ background: var(--c-agent);
2568
+ opacity: 0.9;
2569
+ }
2517
2570
  .minimap-node.is-selected {
2518
2571
  outline: 1px solid var(--c-accent);
2519
2572
  opacity: 0.8;
2520
2573
  }
2521
2574
  .minimap-fence {
2522
2575
  position: absolute;
2523
- border: 1px dashed color-mix(in srgb, var(--c-purple) 45%, transparent);
2576
+ border: 1px dashed color-mix(in srgb, var(--c-agent) 45%, transparent);
2524
2577
  border-radius: 2px;
2525
- background: color-mix(in srgb, var(--c-purple) 3%, transparent);
2578
+ background: color-mix(in srgb, var(--c-agent) 3%, transparent);
2526
2579
  }
2527
2580
  .minimap-presence {
2528
2581
  position: absolute;
@@ -2557,7 +2610,7 @@ body,
2557
2610
  position: absolute;
2558
2611
  right: 5px;
2559
2612
  bottom: 3px;
2560
- font: 8px var(--mono);
2613
+ font: 8px var(--font-code);
2561
2614
  color: var(--c-dim);
2562
2615
  }
2563
2616
 
@@ -2659,7 +2712,7 @@ body,
2659
2712
  color: var(--c-accent);
2660
2713
  }
2661
2714
  .edge-hint-keys {
2662
- font: 9px var(--mono);
2715
+ font: 9px var(--font-code);
2663
2716
  color: var(--c-dim);
2664
2717
  }
2665
2718
 
@@ -2712,8 +2765,8 @@ body,
2712
2765
  padding: 2px 9px;
2713
2766
  border-radius: 999px;
2714
2767
  background: var(--c-panel-soft);
2715
- border: 1px solid color-mix(in srgb, var(--c-warn) 40%, transparent);
2716
- color: var(--c-warn);
2768
+ border: 1px solid color-mix(in srgb, var(--c-agent) 40%, transparent);
2769
+ color: var(--c-agent);
2717
2770
  font-size: 9.5px;
2718
2771
  font-weight: 600;
2719
2772
  white-space: nowrap;
@@ -2722,7 +2775,7 @@ body,
2722
2775
  width: 6px;
2723
2776
  height: 6px;
2724
2777
  border-radius: 50%;
2725
- background: var(--c-warn);
2778
+ background: var(--c-agent);
2726
2779
  }
2727
2780
 
2728
2781
  /* Quiet-board affordance in the top bar */
@@ -2742,8 +2795,8 @@ body,
2742
2795
  flex-shrink: 0;
2743
2796
  }
2744
2797
  .start-session-btn:hover {
2745
- border-color: color-mix(in srgb, var(--c-purple) 40%, transparent);
2746
- color: var(--c-purple);
2798
+ border-color: color-mix(in srgb, var(--c-agent) 40%, transparent);
2799
+ color: var(--c-agent);
2747
2800
  }
2748
2801
  .start-session-dot {
2749
2802
  width: 7px;
@@ -2752,7 +2805,7 @@ body,
2752
2805
  background: var(--c-dim);
2753
2806
  }
2754
2807
  .start-session-btn:hover .start-session-dot {
2755
- background: var(--c-purple);
2808
+ background: var(--c-agent);
2756
2809
  }
2757
2810
  .session-end {
2758
2811
  padding: 3px 10px;
@@ -2814,6 +2867,11 @@ body,
2814
2867
  background: var(--c-surface-hover);
2815
2868
  color: var(--c-text);
2816
2869
  }
2870
+ .session-receipt-who {
2871
+ margin: 2px 0 0 15px;
2872
+ font-size: 11px;
2873
+ color: var(--c-muted);
2874
+ }
2817
2875
  .session-receipt-tiles {
2818
2876
  display: grid;
2819
2877
  grid-template-columns: repeat(3, 1fr);
@@ -2844,6 +2902,111 @@ body,
2844
2902
  .session-receipt-tile-value.tone-danger {
2845
2903
  color: var(--c-danger);
2846
2904
  }
2905
+ /* What the session did with context (docs/design/AgentContext.dc.html receipt). */
2906
+ .session-receipt-context {
2907
+ display: flex;
2908
+ flex-direction: column;
2909
+ gap: var(--space-2);
2910
+ margin-top: var(--space-3);
2911
+ }
2912
+ .session-receipt-warn {
2913
+ display: flex;
2914
+ align-items: center;
2915
+ gap: var(--space-2);
2916
+ padding: var(--space-2) 10px;
2917
+ border-radius: 8px;
2918
+ background: color-mix(in srgb, var(--c-warn) 10%, transparent);
2919
+ color: var(--c-warn);
2920
+ font-size: var(--fs-meta);
2921
+ }
2922
+ .session-receipt-warn svg,
2923
+ .session-receipt-context-head svg {
2924
+ width: 13px;
2925
+ height: 13px;
2926
+ flex-shrink: 0;
2927
+ fill: none;
2928
+ stroke: currentColor;
2929
+ stroke-width: 2;
2930
+ stroke-linecap: round;
2931
+ stroke-linejoin: round;
2932
+ }
2933
+ .session-receipt-context-row {
2934
+ display: flex;
2935
+ flex-direction: column;
2936
+ gap: 3px;
2937
+ padding-bottom: var(--space-2);
2938
+ border-bottom: 1px solid var(--c-line);
2939
+ }
2940
+ .session-receipt-context-head {
2941
+ display: flex;
2942
+ align-items: center;
2943
+ gap: 6px;
2944
+ color: var(--c-agent);
2945
+ }
2946
+ .session-receipt-context-name {
2947
+ flex: 1;
2948
+ font-size: var(--fs-ui);
2949
+ font-weight: 600;
2950
+ color: var(--c-text);
2951
+ }
2952
+ .session-receipt-context-count {
2953
+ font-size: var(--fs-meta);
2954
+ color: var(--c-dim);
2955
+ }
2956
+ .session-receipt-context-items {
2957
+ padding-left: 19px;
2958
+ font-size: var(--fs-meta);
2959
+ color: var(--c-muted);
2960
+ }
2961
+ .session-receipt-mini {
2962
+ padding: 2px var(--space-2);
2963
+ border: 1px solid var(--c-line);
2964
+ border-radius: var(--r-control);
2965
+ background: none;
2966
+ color: var(--c-text);
2967
+ font-size: var(--fs-meta);
2968
+ cursor: pointer;
2969
+ }
2970
+ .session-receipt-lens {
2971
+ display: flex;
2972
+ align-items: center;
2973
+ gap: var(--space-2);
2974
+ padding: 0;
2975
+ border: none;
2976
+ background: none;
2977
+ color: var(--c-muted);
2978
+ font-size: var(--fs-meta);
2979
+ cursor: pointer;
2980
+ }
2981
+ .session-receipt-lens-track {
2982
+ position: relative;
2983
+ width: 32px;
2984
+ height: 18px;
2985
+ border-radius: var(--r-pill);
2986
+ background: var(--c-line);
2987
+ }
2988
+ .session-receipt-lens-knob {
2989
+ position: absolute;
2990
+ left: 2px;
2991
+ top: 2px;
2992
+ width: 14px;
2993
+ height: 14px;
2994
+ border-radius: var(--r-pill);
2995
+ background: var(--c-muted);
2996
+ }
2997
+ .session-receipt-lens.is-on .session-receipt-lens-track {
2998
+ background: var(--c-agent);
2999
+ }
3000
+ .session-receipt-lens.is-on .session-receipt-lens-knob {
3001
+ left: auto;
3002
+ right: 2px;
3003
+ background: var(--c-bg);
3004
+ }
3005
+ /* The lens: nodes the session did not touch step back. */
3006
+ .canvas-node.lens-dimmed {
3007
+ opacity: 0.35;
3008
+ }
3009
+
2847
3010
  .session-receipt-note,
2848
3011
  .session-receipt-diff {
2849
3012
  margin-top: 10px;
@@ -2869,8 +3032,8 @@ body,
2869
3032
  cursor: pointer;
2870
3033
  }
2871
3034
  .session-receipt-primary {
2872
- border: 1px solid var(--c-accent-25);
2873
- background: var(--c-accent-12);
3035
+ border: 1px solid color-mix(in srgb, var(--c-accent) 25%, transparent);
3036
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
2874
3037
  color: var(--c-accent);
2875
3038
  }
2876
3039
  .session-receipt-primary:disabled {
@@ -2895,7 +3058,7 @@ body,
2895
3058
  border: 1px solid color-mix(in srgb, var(--c-warn) 35%, transparent);
2896
3059
  background: color-mix(in srgb, var(--c-warn) 12%, transparent);
2897
3060
  color: var(--c-warn);
2898
- font: 11px var(--mono);
3061
+ font: 11px var(--font-code);
2899
3062
  font-weight: 600;
2900
3063
  white-space: nowrap;
2901
3064
  flex-shrink: 0;
@@ -2990,7 +3153,7 @@ body,
2990
3153
  background: color-mix(in srgb, var(--c-panel) 92%, black 8%);
2991
3154
  border: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2992
3155
  border-radius: 10px;
2993
- box-shadow: 0 14px 36px var(--c-shadow-heavy), 0 0 0 1px var(--c-accent-8);
3156
+ box-shadow: 0 14px 36px var(--c-shadow-heavy), 0 0 0 1px color-mix(in srgb, var(--c-accent) 8%, transparent);
2994
3157
  backdrop-filter: blur(14px);
2995
3158
  color: var(--c-text);
2996
3159
  font-size: 12px;
@@ -3126,10 +3289,10 @@ body,
3126
3289
  min-height: 20px;
3127
3290
  padding: 2px 7px;
3128
3291
  border-radius: 999px;
3129
- border: 1px solid var(--c-accent-25);
3130
- background: var(--c-accent-10);
3292
+ border: 1px solid color-mix(in srgb, var(--c-accent) 25%, transparent);
3293
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
3131
3294
  color: var(--c-accent);
3132
- font: 11px/1 var(--mono);
3295
+ font: 11px/1 var(--font-code);
3133
3296
  white-space: nowrap;
3134
3297
  }
3135
3298
 
@@ -3188,7 +3351,7 @@ body,
3188
3351
  min-width: 0;
3189
3352
  }
3190
3353
  .connection-banner-meta {
3191
- font: 9.5px var(--mono);
3354
+ font: 9.5px var(--font-code);
3192
3355
  color: var(--c-muted);
3193
3356
  }
3194
3357
  .connection-banner-progress {
@@ -3365,7 +3528,7 @@ body,
3365
3528
  border: none;
3366
3529
  background: var(--c-panel-soft);
3367
3530
  color: var(--c-text);
3368
- font: 13px / 1.6 var(--mono);
3531
+ font: 13px / 1.6 var(--font-code);
3369
3532
  padding: 12px;
3370
3533
  outline: none;
3371
3534
  }
@@ -3403,7 +3566,7 @@ body,
3403
3566
  border-radius: var(--radius-sm);
3404
3567
  color: var(--c-muted);
3405
3568
  cursor: pointer;
3406
- font-family: var(--font);
3569
+ font-family: var(--font-ui);
3407
3570
  transition: all 0.12s ease;
3408
3571
  }
3409
3572
 
@@ -3414,13 +3577,13 @@ body,
3414
3577
  }
3415
3578
 
3416
3579
  .md-toolbar-btn-primary {
3417
- background: var(--c-accent-15);
3418
- border-color: var(--c-accent-40);
3580
+ background: color-mix(in srgb, var(--c-accent) 15%, transparent);
3581
+ border-color: color-mix(in srgb, var(--c-accent) 40%, transparent);
3419
3582
  color: var(--c-accent);
3420
3583
  }
3421
3584
 
3422
3585
  .md-toolbar-btn-primary:hover {
3423
- background: var(--c-accent-25);
3586
+ background: color-mix(in srgb, var(--c-accent) 25%, transparent);
3424
3587
  border-color: var(--c-accent);
3425
3588
  }
3426
3589
 
@@ -3503,7 +3666,7 @@ body,
3503
3666
  border-left: 3px solid var(--c-accent);
3504
3667
  padding: 0.5em 1em;
3505
3668
  margin: 0.8em 0;
3506
- background: var(--c-accent-8);
3669
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
3507
3670
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
3508
3671
  }
3509
3672
 
@@ -3526,7 +3689,7 @@ body,
3526
3689
  }
3527
3690
 
3528
3691
  .md-reader-content code {
3529
- font-family: var(--mono);
3692
+ font-family: var(--font-code);
3530
3693
  font-size: 0.88em;
3531
3694
  background: var(--c-surface-hover);
3532
3695
  padding: 2px 6px;
@@ -3565,7 +3728,7 @@ body,
3565
3728
  }
3566
3729
 
3567
3730
  .md-reader-content th {
3568
- background: var(--c-accent-8);
3731
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
3569
3732
  font-weight: 600;
3570
3733
  color: var(--c-text);
3571
3734
  padding: 10px 14px;
@@ -3609,17 +3772,17 @@ body,
3609
3772
  border-radius: var(--radius);
3610
3773
  color: var(--c-muted);
3611
3774
  cursor: pointer;
3612
- font-family: var(--font);
3775
+ font-family: var(--font-ui);
3613
3776
  transition: all 0.15s ease;
3614
3777
  z-index: 1;
3615
3778
  box-shadow: 0 4px 16px var(--c-shadow);
3616
3779
  }
3617
3780
 
3618
3781
  .md-edit-fab:hover {
3619
- background: var(--c-accent-12);
3782
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
3620
3783
  border-color: var(--c-accent);
3621
3784
  color: var(--c-accent);
3622
- box-shadow: 0 4px 20px var(--c-glow-accent);
3785
+ box-shadow: 0 4px 20px color-mix(in srgb, var(--c-accent) 15%, transparent);
3623
3786
  }
3624
3787
 
3625
3788
  /* ── Inline WYSIWYG editor (contentEditable on the rendered HTML) ─
@@ -3638,7 +3801,7 @@ body,
3638
3801
 
3639
3802
  .md-reader-editable::selection,
3640
3803
  .md-reader-editable *::selection {
3641
- background: var(--c-accent-25);
3804
+ background: color-mix(in srgb, var(--c-accent) 25%, transparent);
3642
3805
  }
3643
3806
 
3644
3807
  /* ── Inline selection toolbar (contentEditable WYSIWYG) ────────── */
@@ -3654,7 +3817,7 @@ body,
3654
3817
  border: 1px solid var(--c-line);
3655
3818
  border-radius: 8px;
3656
3819
  box-shadow: 0 4px 16px var(--c-shadow), 0 0 0 1px var(--c-line-30);
3657
- font-family: var(--font);
3820
+ font-family: var(--font-ui);
3658
3821
  animation: md-inline-format-bar-in 0.1s ease-out;
3659
3822
  }
3660
3823
 
@@ -3673,7 +3836,7 @@ body,
3673
3836
  background: none;
3674
3837
  border: 1px solid transparent;
3675
3838
  border-radius: var(--radius-sm);
3676
- font: 600 12px var(--font);
3839
+ font: 600 12px var(--font-ui);
3677
3840
  color: var(--c-text-soft);
3678
3841
  cursor: pointer;
3679
3842
  white-space: nowrap;
@@ -3687,7 +3850,7 @@ body,
3687
3850
  }
3688
3851
 
3689
3852
  .md-inline-format-btn:active {
3690
- background: var(--c-accent-12);
3853
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
3691
3854
  color: var(--c-accent);
3692
3855
  }
3693
3856
 
@@ -3730,7 +3893,7 @@ body,
3730
3893
  background: none;
3731
3894
  border: 1px solid transparent;
3732
3895
  border-radius: var(--radius-sm);
3733
- font-family: var(--mono);
3896
+ font-family: var(--font-code);
3734
3897
  font-size: 12px;
3735
3898
  font-weight: 600;
3736
3899
  color: var(--c-muted);
@@ -3746,7 +3909,7 @@ body,
3746
3909
  }
3747
3910
 
3748
3911
  .md-format-btn:active {
3749
- background: var(--c-accent-12);
3912
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
3750
3913
  color: var(--c-accent);
3751
3914
  }
3752
3915
 
@@ -3813,10 +3976,6 @@ html.is-node-resizing .canvas-node {
3813
3976
  transition: box-shadow 0.15s ease !important;
3814
3977
  }
3815
3978
 
3816
- html.is-node-dragging .attention-field-layer {
3817
- visibility: hidden;
3818
- }
3819
-
3820
3979
  html.is-node-dragging,
3821
3980
  html.is-node-dragging *,
3822
3981
  html.is-canvas-panning,
@@ -3889,12 +4048,12 @@ html.is-node-resizing .ext-app-preview-catcher {
3889
4048
  }
3890
4049
 
3891
4050
  .context-menu-item:hover {
3892
- background: var(--c-accent-10);
4051
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
3893
4052
  color: var(--c-accent);
3894
4053
  }
3895
4054
 
3896
4055
  .context-menu-item.is-danger .context-menu-label {
3897
- color: var(--c-danger, #e5484d);
4056
+ color: var(--c-danger);
3898
4057
  }
3899
4058
 
3900
4059
  .context-menu-shortcut {
@@ -3972,8 +4131,8 @@ html.is-node-resizing .ext-app-preview-catcher {
3972
4131
  }
3973
4132
 
3974
4133
  .context-menu-color-swatch:hover {
3975
- background: var(--c-accent-8);
3976
- border-color: var(--c-accent-30);
4134
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
4135
+ border-color: color-mix(in srgb, var(--c-accent) 30%, transparent);
3977
4136
  }
3978
4137
 
3979
4138
  .context-menu-color-swatch.active {
@@ -3984,7 +4143,7 @@ html.is-node-resizing .ext-app-preview-catcher {
3984
4143
  .context-menu-color-dot {
3985
4144
  background: var(--swatch-color);
3986
4145
  border-radius: 999px;
3987
- box-shadow: 0 0 0 1px color-mix(in srgb, var(--swatch-color) 60%, #000 40%);
4146
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--swatch-color) 60%, var(--c-bg) 40%);
3988
4147
  flex: 0 0 auto;
3989
4148
  height: 10px;
3990
4149
  width: 10px;
@@ -4021,7 +4180,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4021
4180
  /* Edge labels — --edge-chrome-scale is set on the edge <svg> so labels keep a
4022
4181
  constant screen size while zoomed out (see edgeChromeScale in EdgeLayer). */
4023
4182
  .edge-label {
4024
- font-family: var(--font);
4183
+ font-family: var(--font-ui);
4025
4184
  font-size: calc(11px * var(--edge-label-scale, 1));
4026
4185
  pointer-events: none;
4027
4186
  user-select: none;
@@ -4061,10 +4220,10 @@ html.is-node-resizing .ext-app-preview-catcher {
4061
4220
  @keyframes trace-pulse {
4062
4221
  0%,
4063
4222
  100% {
4064
- box-shadow: 0 0 0 0 var(--c-accent-30);
4223
+ box-shadow: 0 0 0 0 color-mix(in srgb, var(--c-accent) 30%, transparent);
4065
4224
  }
4066
4225
  50% {
4067
- box-shadow: 0 0 0 4px var(--c-accent-15);
4226
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--c-accent) 15%, transparent);
4068
4227
  }
4069
4228
  }
4070
4229
 
@@ -4075,7 +4234,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4075
4234
  gap: 10px;
4076
4235
  height: 100%;
4077
4236
  overflow: auto;
4078
- font-family: var(--mono);
4237
+ font-family: var(--font-code);
4079
4238
  font-size: 12px;
4080
4239
  color: var(--c-text);
4081
4240
  }
@@ -4124,12 +4283,12 @@ html.is-node-resizing .ext-app-preview-catcher {
4124
4283
 
4125
4284
  .diff-node .diff-line-add {
4126
4285
  color: var(--c-ok);
4127
- background: var(--c-ok-10);
4286
+ background: color-mix(in srgb, var(--c-ok) 10%, transparent);
4128
4287
  }
4129
4288
 
4130
4289
  .diff-node .diff-line-remove {
4131
4290
  color: var(--c-danger);
4132
- background: var(--c-danger-12);
4291
+ background: color-mix(in srgb, var(--c-danger) 12%, transparent);
4133
4292
  }
4134
4293
 
4135
4294
  .diff-node .diff-line-context {
@@ -4170,7 +4329,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4170
4329
  border-spacing: 0;
4171
4330
  width: max-content;
4172
4331
  min-width: 100%;
4173
- font-family: var(--mono);
4332
+ font-family: var(--font-code);
4174
4333
  color: var(--c-text);
4175
4334
  }
4176
4335
 
@@ -4273,21 +4432,21 @@ html.is-node-resizing .ext-app-preview-catcher {
4273
4432
 
4274
4433
  /* ── Prompt nodes ──────────────────────────────────────────── */
4275
4434
  .canvas-node:has(.prompt-node-inner) {
4276
- border-color: var(--c-accent-30);
4435
+ border-color: color-mix(in srgb, var(--c-accent) 30%, transparent);
4277
4436
  }
4278
4437
 
4279
4438
  .canvas-node:has(.prompt-node-inner) .node-type-badge {
4280
- background: var(--c-accent-15);
4439
+ background: color-mix(in srgb, var(--c-accent) 15%, transparent);
4281
4440
  color: var(--c-accent);
4282
4441
  }
4283
4442
 
4284
4443
  /* ── Response nodes ────────────────────────────────────────── */
4285
4444
  .canvas-node:has(.response-node-inner) {
4286
- border-color: var(--c-ok-25);
4445
+ border-color: color-mix(in srgb, var(--c-ok) 25%, transparent);
4287
4446
  }
4288
4447
 
4289
4448
  .canvas-node:has(.response-node-inner) .node-type-badge {
4290
- background: var(--c-ok-12);
4449
+ background: color-mix(in srgb, var(--c-ok) 12%, transparent);
4291
4450
  color: var(--c-ok);
4292
4451
  }
4293
4452
 
@@ -4306,39 +4465,38 @@ html.is-node-resizing .ext-app-preview-catcher {
4306
4465
 
4307
4466
  /* ── Multi-node selection (item 13: outline, corner handles, soft glow) ── */
4308
4467
  .canvas-node.selected {
4309
- border-color: var(--c-accent);
4310
- box-shadow: 0 0 0 1px var(--c-accent), 0 0 0 4px color-mix(in srgb, var(--c-accent) 10%, transparent);
4468
+ box-shadow: 0 0 0 3px var(--c-bg), 0 0 0 5px var(--c-accent), var(--e-1);
4311
4469
  }
4312
4470
  .node-selection-handle {
4313
4471
  position: absolute;
4314
- width: 7px;
4315
- height: 7px;
4316
- background: var(--c-bg);
4472
+ width: 8px;
4473
+ height: 8px;
4474
+ background: var(--c-panel);
4317
4475
  border: 1.5px solid var(--c-accent);
4318
4476
  border-radius: 2px;
4319
4477
  pointer-events: none;
4320
4478
  z-index: 3;
4321
4479
  }
4322
4480
  .node-selection-handle.is-tl {
4323
- left: -4px;
4324
- top: -4px;
4481
+ left: -9px;
4482
+ top: -9px;
4325
4483
  }
4326
4484
  .node-selection-handle.is-tr {
4327
- right: -4px;
4328
- top: -4px;
4485
+ right: -9px;
4486
+ top: -9px;
4329
4487
  }
4330
4488
  .node-selection-handle.is-bl {
4331
- left: -4px;
4332
- bottom: -4px;
4489
+ left: -9px;
4490
+ bottom: -9px;
4333
4491
  }
4334
4492
  .node-selection-handle.is-br {
4335
- right: -4px;
4336
- bottom: -4px;
4493
+ right: -9px;
4494
+ bottom: -9px;
4337
4495
  }
4338
4496
 
4339
4497
  /* Lasso rectangle overlay */
4340
4498
  .lasso-rect {
4341
- background: var(--c-accent-8);
4499
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
4342
4500
  border: 1px solid var(--c-accent);
4343
4501
  border-radius: 2px;
4344
4502
  z-index: 9998;
@@ -4380,7 +4538,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4380
4538
  border-radius: 4px;
4381
4539
  background: color-mix(in srgb, var(--c-bg) 72%, transparent);
4382
4540
  color: var(--c-annotation);
4383
- font-family: var(--font);
4541
+ font-family: var(--font-ui);
4384
4542
  font-weight: 700;
4385
4543
  line-height: 1.15;
4386
4544
  outline: none;
@@ -4394,13 +4552,13 @@ html.is-node-resizing .ext-app-preview-catcher {
4394
4552
  pointer-events: none;
4395
4553
  border: 2px dashed var(--c-accent);
4396
4554
  border-radius: 8px;
4397
- background: var(--c-accent-8);
4555
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
4398
4556
  animation: drop-zone-pulse 1.5s ease-in-out infinite;
4399
4557
  }
4400
4558
 
4401
4559
  @keyframes drop-zone-pulse {
4402
- 0%, 100% { background: var(--c-accent-8); }
4403
- 50% { background: var(--c-accent-12); }
4560
+ 0%, 100% { background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
4561
+ 50% { background: color-mix(in srgb, var(--c-accent) 12%, transparent); }
4404
4562
  }
4405
4563
 
4406
4564
  .drop-zone-indicator {
@@ -4415,9 +4573,9 @@ html.is-node-resizing .ext-app-preview-catcher {
4415
4573
  padding: 20px 32px;
4416
4574
  background: var(--c-panel-glass);
4417
4575
  backdrop-filter: blur(16px);
4418
- border: 1px solid var(--c-accent-30);
4576
+ border: 1px solid color-mix(in srgb, var(--c-accent) 30%, transparent);
4419
4577
  border-radius: 12px;
4420
- box-shadow: 0 4px 24px var(--c-shadow), 0 0 24px var(--c-glow-accent);
4578
+ box-shadow: 0 4px 24px var(--c-shadow), 0 0 24px color-mix(in srgb, var(--c-accent) 15%, transparent);
4421
4579
  }
4422
4580
 
4423
4581
  .drop-zone-icon {
@@ -4429,7 +4587,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4429
4587
  display: flex;
4430
4588
  align-items: center;
4431
4589
  justify-content: center;
4432
- border: 2px dashed var(--c-accent-40);
4590
+ border: 2px dashed color-mix(in srgb, var(--c-accent) 40%, transparent);
4433
4591
  border-radius: 50%;
4434
4592
  }
4435
4593
 
@@ -4485,7 +4643,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4485
4643
  border-radius: 8px;
4486
4644
  background: var(--c-bg);
4487
4645
  color: var(--c-text);
4488
- font: 13px/1.4 var(--mono);
4646
+ font: 13px/1.4 var(--font-code);
4489
4647
  }
4490
4648
  .text-prompt-input:focus {
4491
4649
  outline: none;
@@ -4498,13 +4656,24 @@ html.is-node-resizing .ext-app-preview-catcher {
4498
4656
  }
4499
4657
  .text-prompt-cancel,
4500
4658
  .text-prompt-confirm {
4501
- padding: 5px 12px;
4659
+ min-height: 36px;
4660
+ padding: 8px 14px;
4502
4661
  border-radius: 7px;
4503
- border: 1px solid var(--c-line);
4504
- background: none;
4505
- color: var(--c-text-soft);
4662
+ border: 1px solid color-mix(in srgb, var(--c-line) 65%, var(--c-muted));
4663
+ background: var(--c-panel-overlay);
4664
+ color: var(--c-text);
4506
4665
  cursor: pointer;
4507
4666
  font-size: 12px;
4667
+ font-weight: 600;
4668
+ }
4669
+ .text-prompt-cancel:hover {
4670
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
4671
+ border-color: var(--c-muted);
4672
+ }
4673
+ .text-prompt-cancel:focus-visible,
4674
+ .text-prompt-confirm:focus-visible {
4675
+ outline: 2px solid var(--c-accent);
4676
+ outline-offset: 2px;
4508
4677
  }
4509
4678
  .text-prompt-confirm {
4510
4679
  background: var(--c-accent);
@@ -4524,7 +4693,8 @@ html.is-node-resizing .ext-app-preview-catcher {
4524
4693
  overflow-y: auto;
4525
4694
  color: var(--c-text);
4526
4695
  }
4527
- .feedback-dialog label {
4696
+ .feedback-dialog label,
4697
+ .feedback-field {
4528
4698
  display: flex;
4529
4699
  flex-direction: column;
4530
4700
  gap: 6px;
@@ -4618,181 +4788,51 @@ html.is-node-resizing .ext-app-preview-catcher {
4618
4788
  cursor: default;
4619
4789
  }
4620
4790
  .selection-bar-action.is-pin:hover {
4621
- background: color-mix(in srgb, var(--c-warn) 10%, transparent);
4622
- color: var(--c-warn);
4791
+ background: color-mix(in srgb, var(--c-pin) 10%, transparent);
4792
+ color: var(--c-pin);
4623
4793
  }
4624
4794
  .selection-bar-icon.is-danger:hover {
4625
4795
  background: color-mix(in srgb, var(--c-danger) 12%, transparent);
4626
4796
  color: var(--c-danger);
4627
4797
  }
4628
4798
 
4629
- /* ── Context-pinned nodes — amber glow ───────────────────────── */
4799
+ /* ── Node states (docs/design/Context.dc.html) ─────────────────
4800
+ In context: pin-blue border, tinted header, blue kind icon and the filled
4801
+ pin badge. Selection is a ring with a gap outside the border, so the pin
4802
+ styling survives it. */
4630
4803
  .canvas-node.context-pinned {
4631
- border-color: var(--c-warn-60);
4632
- box-shadow: 0 0 0 2px var(--c-warn), 0 0 8px var(--c-warn-30);
4633
- }
4634
-
4635
- .canvas-node.context-pinned .node-type-badge {
4636
- background: var(--c-warn-15);
4637
- color: var(--c-warn);
4638
- }
4639
-
4640
- :root[data-theme="light"] .canvas-node.context-pinned {
4641
- border-color: #4BBCFF;
4642
- box-shadow: 0 0 0 2px #4BBCFF, 0 0 12px rgba(75, 188, 255, 0.28);
4643
- }
4644
-
4645
- :root[data-theme="light"] .canvas-node.context-pinned .node-type-badge {
4646
- background: rgba(75, 188, 255, 0.14);
4647
- color: #1588CE;
4648
- }
4649
-
4650
- /* ── Attention layer — human-facing semantic feedback ───────── */
4651
- .canvas-node.attention-focus-primary {
4652
- box-shadow:
4653
- 0 0 0 1px color-mix(in srgb, var(--c-warn) 72%, transparent),
4654
- 0 12px 34px color-mix(in srgb, var(--c-warn) 18%, transparent),
4655
- inset 0 0 0 1px color-mix(in srgb, var(--c-warn) 28%, transparent);
4804
+ border: 1.5px solid var(--c-pin);
4656
4805
  }
4657
4806
 
4658
- .canvas-node.attention-focus-primary .node-titlebar {
4659
- background:
4660
- linear-gradient(90deg, color-mix(in srgb, var(--c-warn) 12%, transparent), transparent 68%),
4661
- var(--c-panel-soft);
4662
- }
4663
-
4664
- :root[data-theme="light"] .canvas-node.attention-focus-primary {
4665
- box-shadow:
4666
- 0 0 0 1px rgba(75, 188, 255, 0.72),
4667
- 0 12px 34px rgba(75, 188, 255, 0.2),
4668
- inset 0 0 0 1px rgba(75, 188, 255, 0.18);
4669
- }
4670
-
4671
- :root[data-theme="light"] .canvas-node.attention-focus-primary .node-titlebar {
4672
- background:
4673
- linear-gradient(90deg, rgba(75, 188, 255, 0.14), transparent 68%),
4674
- var(--c-panel-soft);
4675
- }
4676
-
4677
- .canvas-node.attention-focus-secondary {
4678
- box-shadow:
4679
- 0 0 0 1px color-mix(in srgb, var(--c-warn) 30%, transparent),
4680
- 0 8px 24px color-mix(in srgb, var(--c-warn) 10%, transparent);
4681
- }
4682
-
4683
- .canvas-node.attention-focus-secondary .node-type-badge {
4684
- background: color-mix(in srgb, var(--c-warn) 10%, transparent);
4685
- color: color-mix(in srgb, var(--c-warn) 88%, var(--c-text) 12%);
4807
+ .canvas-node.context-pinned .node-titlebar {
4808
+ background: color-mix(in srgb, var(--c-pin) 12%, var(--c-panel));
4686
4809
  }
4687
4810
 
4688
- :root[data-theme="light"] .canvas-node.attention-focus-secondary {
4689
- box-shadow:
4690
- 0 0 0 1px rgba(75, 188, 255, 0.32),
4691
- 0 8px 24px rgba(75, 188, 255, 0.12);
4692
- }
4693
-
4694
- :root[data-theme="light"] .canvas-node.attention-focus-secondary .node-type-badge {
4695
- background: rgba(75, 188, 255, 0.12);
4696
- color: #1588CE;
4811
+ .canvas-node.context-pinned .node-type-icon {
4812
+ color: var(--c-pin);
4697
4813
  }
4698
4814
 
4815
+ /* A short pulse on the nodes a canvas change touched (pin, connect, group).
4816
+ Accent, not a meaning colour: it says "this changed", nothing more. */
4699
4817
  .canvas-node.attention-pulse {
4700
4818
  animation: attention-node-pulse 0.9s ease;
4701
4819
  }
4702
4820
 
4703
- :root[data-theme="light"] .canvas-node.attention-pulse {
4704
- animation-name: attention-node-pulse-light;
4705
- }
4706
-
4707
4821
  @keyframes attention-node-pulse {
4708
4822
  0% {
4709
4823
  transform: translateZ(0) scale(1);
4710
- box-shadow:
4711
- 0 0 0 0 color-mix(in srgb, var(--c-warn) 0%, transparent),
4712
- 0 4px 24px var(--c-shadow);
4713
4824
  }
4714
4825
  38% {
4715
4826
  transform: translateZ(0) scale(1.012);
4716
4827
  box-shadow:
4717
- 0 0 0 3px color-mix(in srgb, var(--c-warn) 35%, transparent),
4718
- 0 16px 34px color-mix(in srgb, var(--c-warn) 16%, transparent);
4828
+ 0 0 0 3px color-mix(in srgb, var(--c-accent) 35%, transparent),
4829
+ var(--e-1);
4719
4830
  }
4720
4831
  100% {
4721
4832
  transform: translateZ(0) scale(1);
4722
4833
  }
4723
4834
  }
4724
4835
 
4725
- @keyframes attention-node-pulse-light {
4726
- 0% {
4727
- transform: translateZ(0) scale(1);
4728
- box-shadow:
4729
- 0 0 0 0 rgba(75, 188, 255, 0),
4730
- 0 4px 24px var(--c-shadow);
4731
- }
4732
- 38% {
4733
- transform: translateZ(0) scale(1.012);
4734
- box-shadow:
4735
- 0 0 0 3px rgba(75, 188, 255, 0.32),
4736
- 0 16px 34px rgba(75, 188, 255, 0.18);
4737
- }
4738
- 100% {
4739
- transform: translateZ(0) scale(1);
4740
- }
4741
- }
4742
-
4743
- .attention-field-layer {
4744
- position: absolute;
4745
- inset: 0;
4746
- pointer-events: none;
4747
- z-index: 0;
4748
- }
4749
-
4750
- .attention-field-region,
4751
- .attention-field-node {
4752
- position: absolute;
4753
- pointer-events: none;
4754
- }
4755
-
4756
- .attention-field-region {
4757
- background:
4758
- radial-gradient(circle at 25% 30%, color-mix(in srgb, var(--c-warn) 16%, transparent), transparent 62%),
4759
- linear-gradient(135deg, color-mix(in srgb, var(--c-warn) 10%, transparent), color-mix(in srgb, var(--c-accent) 5%, transparent));
4760
- border: 1px solid color-mix(in srgb, var(--c-warn) 22%, transparent);
4761
- opacity: 0.8;
4762
- filter: blur(18px);
4763
- }
4764
-
4765
- .attention-field-node.attention-field-primary {
4766
- border: 1px solid color-mix(in srgb, var(--c-warn) 38%, transparent);
4767
- background: radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--c-warn) 16%, transparent), transparent 72%);
4768
- box-shadow: 0 0 38px color-mix(in srgb, var(--c-warn) 18%, transparent);
4769
- }
4770
-
4771
- .attention-field-node.attention-field-secondary {
4772
- border: 1px solid color-mix(in srgb, var(--c-warn) 18%, transparent);
4773
- background: radial-gradient(circle at 50% 50%, color-mix(in srgb, var(--c-warn) 9%, transparent), transparent 74%);
4774
- box-shadow: 0 0 24px color-mix(in srgb, var(--c-warn) 10%, transparent);
4775
- }
4776
-
4777
- :root[data-theme="light"] .attention-field-region {
4778
- background:
4779
- radial-gradient(circle at 25% 30%, rgba(75, 188, 255, 0.16), transparent 62%),
4780
- linear-gradient(135deg, rgba(75, 188, 255, 0.1), rgba(75, 188, 255, 0.05));
4781
- border: 1px solid rgba(75, 188, 255, 0.22);
4782
- }
4783
-
4784
- :root[data-theme="light"] .attention-field-node.attention-field-primary {
4785
- border: 1px solid rgba(75, 188, 255, 0.4);
4786
- background: radial-gradient(circle at 50% 50%, rgba(75, 188, 255, 0.18), transparent 72%);
4787
- box-shadow: 0 0 38px rgba(75, 188, 255, 0.2);
4788
- }
4789
-
4790
- :root[data-theme="light"] .attention-field-node.attention-field-secondary {
4791
- border: 1px solid rgba(75, 188, 255, 0.18);
4792
- background: radial-gradient(circle at 50% 50%, rgba(75, 188, 255, 0.1), transparent 74%);
4793
- box-shadow: 0 0 24px rgba(75, 188, 255, 0.12);
4794
- }
4795
-
4796
4836
  /* Anchored to the canvas region (not the window): since the rail-chrome
4797
4837
  restructure the session panel owns the window's right edge. */
4798
4838
  .attention-toast {
@@ -4806,7 +4846,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4806
4846
  padding: 6px 12px 6px 10px;
4807
4847
  background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
4808
4848
  backdrop-filter: blur(14px);
4809
- border: 1px solid color-mix(in srgb, var(--c-line) 76%, var(--c-warn) 24%);
4849
+ border: 1px solid color-mix(in srgb, var(--c-line) 76%, var(--c-accent) 24%);
4810
4850
  border-radius: 12px;
4811
4851
  box-shadow: 0 8px 22px var(--c-shadow);
4812
4852
  color: var(--c-text);
@@ -4880,9 +4920,9 @@ html.is-node-resizing .ext-app-preview-catcher {
4880
4920
  padding: 14px;
4881
4921
  background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
4882
4922
  backdrop-filter: blur(16px);
4883
- border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-warn) 18%);
4923
+ border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-accent) 18%);
4884
4924
  border-radius: 18px;
4885
- box-shadow: 0 14px 36px var(--c-shadow), 0 0 0 1px color-mix(in srgb, var(--c-warn) 8%, transparent);
4925
+ box-shadow: 0 14px 36px var(--c-shadow), 0 0 0 1px color-mix(in srgb, var(--c-accent) 8%, transparent);
4886
4926
  z-index: 9990;
4887
4927
  }
4888
4928
 
@@ -4896,7 +4936,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4896
4936
  padding: 8px 12px 8px 14px;
4897
4937
  background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
4898
4938
  backdrop-filter: blur(16px);
4899
- border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-warn) 18%);
4939
+ border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-accent) 18%);
4900
4940
  border-right: 0;
4901
4941
  border-radius: 14px 0 0 14px;
4902
4942
  box-shadow: 0 12px 36px var(--c-shadow);
@@ -4933,7 +4973,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4933
4973
  align-items: center;
4934
4974
  justify-content: center;
4935
4975
  border-radius: 9px;
4936
- background: var(--c-warn);
4976
+ background: var(--c-accent);
4937
4977
  color: var(--c-contrast-fg);
4938
4978
  font-size: 10px;
4939
4979
  font-weight: 700;
@@ -5032,16 +5072,16 @@ html.is-node-resizing .ext-app-preview-catcher {
5032
5072
  }
5033
5073
 
5034
5074
  .attention-tone-context {
5035
- border-color: color-mix(in srgb, var(--c-warn) 26%, transparent);
5075
+ border-color: color-mix(in srgb, var(--c-pin) 26%, transparent);
5036
5076
  }
5037
5077
 
5038
5078
  .attention-toast.attention-tone-context {
5039
- color: color-mix(in srgb, var(--c-warn) 82%, var(--c-text) 18%);
5079
+ color: color-mix(in srgb, var(--c-pin) 82%, var(--c-text) 18%);
5040
5080
  }
5041
5081
 
5042
5082
  .attention-tone-context .attention-history-kind,
5043
5083
  .attention-tone-context .attention-toast-title {
5044
- color: color-mix(in srgb, var(--c-warn) 82%, var(--c-text) 18%);
5084
+ color: color-mix(in srgb, var(--c-pin) 82%, var(--c-text) 18%);
5045
5085
  }
5046
5086
 
5047
5087
  .attention-tone-relationship {
@@ -5058,33 +5098,33 @@ html.is-node-resizing .ext-app-preview-catcher {
5058
5098
  }
5059
5099
 
5060
5100
  .attention-tone-group {
5061
- border-color: color-mix(in srgb, var(--c-purple) 24%, transparent);
5101
+ border-color: color-mix(in srgb, var(--c-accent) 24%, transparent);
5062
5102
  }
5063
5103
 
5064
5104
  .attention-toast.attention-tone-group {
5065
- color: color-mix(in srgb, var(--c-purple) 78%, var(--c-text) 22%);
5105
+ color: color-mix(in srgb, var(--c-accent) 78%, var(--c-text) 22%);
5066
5106
  }
5067
5107
 
5068
5108
  .attention-tone-group .attention-history-kind,
5069
5109
  .attention-tone-group .attention-toast-title {
5070
- color: color-mix(in srgb, var(--c-purple) 78%, var(--c-text) 22%);
5110
+ color: color-mix(in srgb, var(--c-accent) 78%, var(--c-text) 22%);
5071
5111
  }
5072
5112
 
5073
5113
  .attention-tone-cluster,
5074
5114
  .attention-tone-neighborhood {
5075
- border-color: color-mix(in srgb, var(--c-warn-alt) 22%, transparent);
5115
+ border-color: color-mix(in srgb, var(--c-accent) 22%, transparent);
5076
5116
  }
5077
5117
 
5078
5118
  .attention-toast.attention-tone-cluster,
5079
5119
  .attention-toast.attention-tone-neighborhood {
5080
- color: color-mix(in srgb, var(--c-warn-alt) 78%, var(--c-text) 22%);
5120
+ color: color-mix(in srgb, var(--c-accent) 78%, var(--c-text) 22%);
5081
5121
  }
5082
5122
 
5083
5123
  .attention-tone-cluster .attention-history-kind,
5084
5124
  .attention-tone-cluster .attention-toast-title,
5085
5125
  .attention-tone-neighborhood .attention-history-kind,
5086
5126
  .attention-tone-neighborhood .attention-toast-title {
5087
- color: color-mix(in srgb, var(--c-warn-alt) 78%, var(--c-text) 22%);
5127
+ color: color-mix(in srgb, var(--c-accent) 78%, var(--c-text) 22%);
5088
5128
  }
5089
5129
 
5090
5130
  .attention-tone-remove {
@@ -5131,7 +5171,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5131
5171
  background: color-mix(in srgb, var(--group-color, var(--c-accent)) 9%, transparent);
5132
5172
  }
5133
5173
  .canvas-node.group-node.is-drop-source {
5134
- border-color: color-mix(in srgb, var(--c-warn) 60%, transparent);
5174
+ border-color: color-mix(in srgb, var(--c-accent) 60%, transparent);
5135
5175
  }
5136
5176
  .canvas-node.group-node .node-body {
5137
5177
  background: none;
@@ -5188,7 +5228,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5188
5228
  text-overflow: ellipsis;
5189
5229
  }
5190
5230
  .group-count {
5191
- font: 9px var(--mono);
5231
+ font: 9px var(--font-code);
5192
5232
  color: var(--c-dim);
5193
5233
  }
5194
5234
  .group-title-input {
@@ -5324,10 +5364,11 @@ html.is-node-resizing .ext-app-preview-catcher {
5324
5364
  width: 6px;
5325
5365
  height: 6px;
5326
5366
  border-radius: 2px;
5367
+ background: var(--c-muted);
5327
5368
  opacity: 0.8;
5328
5369
  }
5329
5370
  .group-chip-count {
5330
- font: 9px var(--mono);
5371
+ font: 9px var(--font-code);
5331
5372
  color: var(--c-dim);
5332
5373
  }
5333
5374
 
@@ -5351,7 +5392,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5351
5392
  color: var(--c-accent);
5352
5393
  }
5353
5394
  .drop-pill-hint {
5354
- font: 9px var(--mono);
5395
+ font: 9px var(--font-code);
5355
5396
  color: var(--c-dim);
5356
5397
  }
5357
5398
 
@@ -5367,9 +5408,9 @@ html.is-node-resizing .ext-app-preview-catcher {
5367
5408
  padding: 8px 14px;
5368
5409
  background: var(--c-panel-glass);
5369
5410
  backdrop-filter: blur(12px);
5370
- border: 1px solid var(--c-warn);
5411
+ border: 1px solid var(--c-pin);
5371
5412
  border-radius: var(--radius);
5372
- box-shadow: 0 8px 32px var(--c-shadow), 0 0 0 1px var(--c-warn-15);
5413
+ box-shadow: 0 8px 32px var(--c-shadow), 0 0 0 1px color-mix(in srgb, var(--c-pin) 15%, transparent);
5373
5414
  z-index: 64;
5374
5415
  white-space: nowrap;
5375
5416
  }
@@ -5377,35 +5418,35 @@ html.is-node-resizing .ext-app-preview-catcher {
5377
5418
  .context-pin-bar-count {
5378
5419
  font-size: 12px;
5379
5420
  font-weight: 600;
5380
- color: var(--c-warn);
5421
+ color: var(--c-pin);
5381
5422
  }
5382
5423
 
5383
5424
  .context-pin-bar-btn {
5384
5425
  padding: 5px 12px;
5385
5426
  font-size: 12px;
5386
5427
  font-weight: 600;
5387
- background: var(--c-warn-10);
5388
- border: 1px solid var(--c-warn-30);
5428
+ background: color-mix(in srgb, var(--c-pin) 10%, transparent);
5429
+ border: 1px solid color-mix(in srgb, var(--c-pin) 30%, transparent);
5389
5430
  border-radius: var(--radius-sm);
5390
- color: var(--c-warn);
5431
+ color: var(--c-pin);
5391
5432
  cursor: pointer;
5392
- font-family: var(--font);
5433
+ font-family: var(--font-ui);
5393
5434
  }
5394
5435
 
5395
5436
  .context-pin-bar-btn:hover {
5396
- background: var(--c-warn-20);
5397
- border-color: var(--c-warn);
5437
+ background: color-mix(in srgb, var(--c-pin) 20%, transparent);
5438
+ border-color: var(--c-pin);
5398
5439
  }
5399
5440
 
5400
5441
  .context-pin-bar-ask {
5401
- background: var(--c-warn);
5402
- color: var(--c-contrast-fg);
5403
- border-color: var(--c-warn);
5442
+ background: var(--c-pin);
5443
+ color: var(--c-on-pin);
5444
+ border-color: var(--c-pin);
5404
5445
  }
5405
5446
 
5406
5447
  .context-pin-bar-ask:hover {
5407
- background: var(--c-warn-hover);
5408
- border-color: var(--c-warn-hover);
5448
+ background: color-mix(in srgb, var(--c-pin) 85%, var(--c-text));
5449
+ border-color: color-mix(in srgb, var(--c-pin) 85%, var(--c-text));
5409
5450
  }
5410
5451
 
5411
5452
  .context-pin-bar-clear {
@@ -5447,7 +5488,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5447
5488
  overflow: hidden;
5448
5489
  }
5449
5490
  .expanded-overlay-panel.is-pinned {
5450
- border-color: color-mix(in srgb, var(--c-warn) 45%, var(--c-line));
5491
+ border-color: color-mix(in srgb, var(--c-pin) 45%, var(--c-line));
5451
5492
  }
5452
5493
  .expanded-header {
5453
5494
  display: flex;
@@ -5490,7 +5531,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5490
5531
  cursor: pointer;
5491
5532
  }
5492
5533
  .expanded-pin.is-on {
5493
- color: var(--c-warn);
5534
+ color: var(--c-pin);
5494
5535
  }
5495
5536
  .expanded-spacer {
5496
5537
  flex: 1;
@@ -5524,12 +5565,12 @@ html.is-node-resizing .ext-app-preview-catcher {
5524
5565
  padding: 8px 16px;
5525
5566
  border-top: 1px solid var(--c-line);
5526
5567
  background: color-mix(in srgb, var(--c-bg) 50%, transparent);
5527
- font: 9.5px var(--mono);
5568
+ font: 9.5px var(--font-code);
5528
5569
  color: var(--c-dim);
5529
5570
  flex-shrink: 0;
5530
5571
  }
5531
5572
  .expanded-footer-hint.is-saving {
5532
- color: var(--c-warn);
5573
+ color: var(--c-muted);
5533
5574
  }
5534
5575
  .expanded-actions {
5535
5576
  display: flex;
@@ -5546,7 +5587,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5546
5587
  border-radius: var(--radius-sm);
5547
5588
  color: var(--c-text-soft);
5548
5589
  cursor: pointer;
5549
- font-family: var(--font);
5590
+ font-family: var(--font-ui);
5550
5591
  }
5551
5592
 
5552
5593
  .expanded-action-btn:hover {
@@ -5556,25 +5597,25 @@ html.is-node-resizing .ext-app-preview-catcher {
5556
5597
  }
5557
5598
 
5558
5599
  .expanded-action-btn.expanded-action-primary {
5559
- background: var(--c-accent-12);
5560
- border-color: var(--c-accent-30);
5600
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
5601
+ border-color: color-mix(in srgb, var(--c-accent) 30%, transparent);
5561
5602
  color: var(--c-accent);
5562
5603
  }
5563
5604
 
5564
5605
  .expanded-action-btn.expanded-action-primary:hover {
5565
- background: var(--c-accent-25);
5606
+ background: color-mix(in srgb, var(--c-accent) 25%, transparent);
5566
5607
  border-color: var(--c-accent);
5567
5608
  color: var(--c-text);
5568
5609
  }
5569
5610
 
5570
5611
  .expanded-action-btn.expanded-action-active {
5571
- background: var(--c-warn-12);
5572
- border-color: var(--c-warn-30);
5612
+ background: color-mix(in srgb, var(--c-warn) 12%, transparent);
5613
+ border-color: color-mix(in srgb, var(--c-warn) 30%, transparent);
5573
5614
  color: var(--c-warn);
5574
5615
  }
5575
5616
 
5576
5617
  .expanded-action-btn.expanded-action-active:hover {
5577
- background: var(--c-warn-20);
5618
+ background: color-mix(in srgb, var(--c-warn) 20%, transparent);
5578
5619
  border-color: var(--c-warn);
5579
5620
  }
5580
5621
 
@@ -5591,7 +5632,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5591
5632
  display: flex;
5592
5633
  padding: 0;
5593
5634
  background:
5594
- radial-gradient(circle at top left, var(--c-accent-25), transparent 36rem),
5635
+ radial-gradient(circle at top left, color-mix(in srgb, var(--c-accent) 25%, transparent), transparent 36rem),
5595
5636
  rgba(3, 7, 18, 0.96);
5596
5637
  color: var(--c-text);
5597
5638
  }
@@ -5608,7 +5649,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5608
5649
  box-shadow: 0 18px 50px var(--c-shadow-heavy);
5609
5650
  color: var(--c-text-soft);
5610
5651
  cursor: pointer;
5611
- font: 600 12px/1 var(--font);
5652
+ font: 600 12px/1 var(--font-ui);
5612
5653
  opacity: 0;
5613
5654
  pointer-events: none;
5614
5655
  transform: translateY(-6px);
@@ -5643,24 +5684,119 @@ html.is-node-resizing .ext-app-preview-catcher {
5643
5684
  border-radius: 0 !important;
5644
5685
  }
5645
5686
 
5646
- /* ── Context pin button on node title bar ────────────────────── */
5647
- .node-controls .ctx-pin-btn {
5687
+ /* ── Context pin on the node header (docs/design/Chrome.dc.html) ──
5688
+ Always visible: an outline pin in a circle when the node is not in
5689
+ context, the filled pin-blue badge when it is. */
5690
+ .canvas-node .node-controls .ctx-pin-btn:hover {
5691
+ background: none;
5692
+ }
5693
+
5694
+ /* ── What agents did with this node (docs/design/AgentContext.dc.html) ──
5695
+ One chip after the title: glyph + word, hover explains. Violet = the agent
5696
+ did it, muted = not yet, amber = needs a look. */
5697
+ .node-context-mark {
5698
+ display: inline-flex;
5699
+ align-items: center;
5700
+ gap: calc(4px * var(--node-chrome-scale, 1));
5701
+ height: calc(20px * var(--node-chrome-scale, 1));
5702
+ padding: 0 calc(7px * var(--node-chrome-scale, 1));
5703
+ border-radius: var(--r-pill);
5704
+ font-size: calc(var(--fs-meta) * var(--node-chrome-scale, 1));
5705
+ font-weight: 500;
5706
+ white-space: nowrap;
5707
+ flex-shrink: 0;
5708
+ }
5709
+ .node-context-mark svg {
5710
+ width: calc(12px * var(--node-chrome-scale, 1));
5711
+ height: calc(12px * var(--node-chrome-scale, 1));
5712
+ fill: none;
5713
+ stroke: currentColor;
5714
+ stroke-width: 2;
5715
+ stroke-linecap: round;
5716
+ stroke-linejoin: round;
5717
+ }
5718
+ .node-context-mark.is-agent {
5719
+ color: var(--c-agent);
5720
+ background: color-mix(in srgb, var(--c-agent) 16%, transparent);
5721
+ }
5722
+ .node-context-mark.is-muted {
5648
5723
  color: var(--c-muted);
5649
- opacity: 0;
5650
- transition: opacity 0.15s;
5724
+ background: var(--c-panel-soft);
5725
+ }
5726
+ .node-context-mark.is-warn {
5727
+ color: var(--c-warn);
5728
+ background: color-mix(in srgb, var(--c-warn) 14%, transparent);
5651
5729
  }
5652
5730
 
5653
- .canvas-node:hover .ctx-pin-btn {
5654
- opacity: 0.7;
5731
+ /* Near a pin (docs/design/NearPin.dc.html): dotted, weaker than in context. */
5732
+ .node-near-mark {
5733
+ display: inline-flex;
5734
+ align-items: center;
5735
+ gap: calc(4px * var(--node-chrome-scale, 1));
5736
+ height: calc(18px * var(--node-chrome-scale, 1));
5737
+ padding: 0 calc(7px * var(--node-chrome-scale, 1));
5738
+ border: 1px dotted var(--c-pin);
5739
+ border-radius: var(--r-pill);
5740
+ color: color-mix(in srgb, var(--c-pin) 75%, var(--c-text));
5741
+ font-size: calc(var(--fs-meta) * var(--node-chrome-scale, 1));
5742
+ font-weight: 500;
5743
+ white-space: nowrap;
5744
+ flex-shrink: 0;
5745
+ }
5746
+ .node-near-mark svg {
5747
+ width: calc(12px * var(--node-chrome-scale, 1));
5748
+ height: calc(12px * var(--node-chrome-scale, 1));
5749
+ }
5750
+ .node-near-ring {
5751
+ fill: none;
5752
+ stroke: currentColor;
5753
+ stroke-width: 2;
5754
+ stroke-dasharray: 2.2 2.6;
5755
+ }
5756
+ .node-near-dot {
5757
+ fill: currentColor;
5655
5758
  }
5656
5759
 
5657
- .ctx-pin-btn.ctx-pin-active {
5658
- color: var(--c-warn);
5659
- opacity: 1 !important;
5760
+ /* Pinned by an agent: a violet dot on the pin badge. */
5761
+ .ctx-pin-mark {
5762
+ position: relative;
5763
+ }
5764
+ .ctx-pin-agent-dot {
5765
+ position: absolute;
5766
+ right: -3px;
5767
+ bottom: -3px;
5768
+ width: 9px;
5769
+ height: 9px;
5770
+ box-sizing: border-box;
5771
+ border-radius: var(--r-pill);
5772
+ background: var(--c-agent);
5773
+ border: 2px solid var(--c-panel);
5660
5774
  }
5661
5775
 
5662
- :root[data-theme="light"] .ctx-pin-btn.ctx-pin-active {
5663
- color: #4BBCFF;
5776
+ /* The drawn 18 px circle sits inside the standard control hit target. */
5777
+ .ctx-pin-mark {
5778
+ width: calc(18px * var(--node-chrome-scale, 1));
5779
+ height: calc(18px * var(--node-chrome-scale, 1));
5780
+ box-sizing: border-box;
5781
+ border: 1.5px solid var(--c-muted);
5782
+ border-radius: var(--r-pill);
5783
+ display: flex;
5784
+ align-items: center;
5785
+ justify-content: center;
5786
+ font-size: calc(13px * var(--node-chrome-scale, 1));
5787
+ color: var(--c-text-soft);
5788
+ }
5789
+
5790
+ .ctx-pin-btn:hover .ctx-pin-mark {
5791
+ border-color: var(--c-pin);
5792
+ background: color-mix(in srgb, var(--c-pin) 12%, transparent);
5793
+ color: var(--c-pin);
5794
+ }
5795
+
5796
+ .ctx-pin-btn.ctx-pin-active .ctx-pin-mark {
5797
+ border-color: var(--c-pin);
5798
+ background: var(--c-pin);
5799
+ color: var(--c-on-pin);
5664
5800
  }
5665
5801
 
5666
5802
  /* ── Context pin HUD — top-right pill ────────────────────────── */
@@ -5671,7 +5807,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5671
5807
  padding: 5px 10px;
5672
5808
  background: var(--c-panel-glass);
5673
5809
  backdrop-filter: blur(12px);
5674
- border: 1px solid var(--c-warn-30);
5810
+ border: 1px solid color-mix(in srgb, var(--c-pin) 30%, transparent);
5675
5811
  border-radius: var(--radius);
5676
5812
  white-space: nowrap;
5677
5813
  }
@@ -5679,7 +5815,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5679
5815
  .context-pin-hud-label {
5680
5816
  font-size: 11px;
5681
5817
  font-weight: 600;
5682
- color: var(--c-warn);
5818
+ color: var(--c-pin);
5683
5819
  }
5684
5820
 
5685
5821
  .context-pin-hud-clear {
@@ -5703,7 +5839,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5703
5839
 
5704
5840
  .thread-turn-assistant {
5705
5841
  padding: 6px 0;
5706
- border-left: 2px solid var(--c-ok-20);
5842
+ border-left: 2px solid color-mix(in srgb, var(--c-ok) 20%, transparent);
5707
5843
  padding-left: 10px;
5708
5844
  margin-left: 2px;
5709
5845
  overflow: hidden;
@@ -5865,7 +6001,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5865
6001
  border-radius: 7px;
5866
6002
  background: var(--c-panel);
5867
6003
  color: var(--c-text);
5868
- font: 11.5px var(--font);
6004
+ font: 11.5px var(--font-ui);
5869
6005
  }
5870
6006
  .snapshot-name-input:focus {
5871
6007
  outline: 2px solid var(--c-accent);
@@ -5923,8 +6059,8 @@ html.is-node-resizing .ext-app-preview-catcher {
5923
6059
  border-radius: 10px;
5924
6060
  }
5925
6061
  .snapshot-item.is-session {
5926
- border-color: color-mix(in srgb, var(--c-purple) 30%, transparent);
5927
- background: color-mix(in srgb, var(--c-purple) 5%, transparent);
6062
+ border-color: color-mix(in srgb, var(--c-agent) 30%, transparent);
6063
+ background: color-mix(in srgb, var(--c-agent) 5%, transparent);
5928
6064
  }
5929
6065
  .snapshot-item-head {
5930
6066
  display: flex;
@@ -5935,7 +6071,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5935
6071
  width: 7px;
5936
6072
  height: 7px;
5937
6073
  border-radius: 50%;
5938
- background: var(--c-purple);
6074
+ background: var(--c-agent);
5939
6075
  flex-shrink: 0;
5940
6076
  }
5941
6077
  .snapshot-item-glyph {
@@ -5957,7 +6093,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5957
6093
  color: var(--c-text);
5958
6094
  }
5959
6095
  .snapshot-item-time {
5960
- font: 9px var(--mono);
6096
+ font: 9px var(--font-code);
5961
6097
  color: var(--c-dim);
5962
6098
  }
5963
6099
  .snapshot-item-meta {
@@ -6072,7 +6208,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6072
6208
  outline: none;
6073
6209
  background: none;
6074
6210
  color: var(--c-text);
6075
- font: 13px var(--font);
6211
+ font: 13px var(--font-ui);
6076
6212
  }
6077
6213
  .command-palette-input::placeholder {
6078
6214
  color: var(--c-dim);
@@ -6082,7 +6218,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6082
6218
  padding: 1px 6px;
6083
6219
  border: 1px solid var(--c-line);
6084
6220
  border-radius: 4px;
6085
- font: 9.5px var(--mono);
6221
+ font: 9.5px var(--font-code);
6086
6222
  color: var(--c-muted);
6087
6223
  }
6088
6224
  .command-palette-esc {
@@ -6140,7 +6276,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6140
6276
  color: var(--c-accent);
6141
6277
  }
6142
6278
  .command-palette-icon.tone-purple {
6143
- color: var(--c-purple);
6279
+ color: var(--c-agent);
6144
6280
  }
6145
6281
  .command-palette-icon.tone-muted {
6146
6282
  color: var(--c-muted);
@@ -6168,7 +6304,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6168
6304
  padding: 8px 14px;
6169
6305
  border-top: 1px solid var(--c-line);
6170
6306
  background: color-mix(in srgb, var(--c-bg) 50%, transparent);
6171
- font: 9.5px var(--mono);
6307
+ font: 9.5px var(--font-code);
6172
6308
  color: var(--c-dim);
6173
6309
  }
6174
6310
  .command-palette-hint-spacer {
@@ -6225,7 +6361,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6225
6361
  border: 1px solid var(--c-line);
6226
6362
  border-radius: 3px;
6227
6363
  padding: 0 4px;
6228
- font-family: var(--font);
6364
+ font-family: var(--font-ui);
6229
6365
  font-size: 9px;
6230
6366
  line-height: 1.6;
6231
6367
  margin: 0 2px;
@@ -6266,7 +6402,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6266
6402
  border: 1px solid var(--c-line);
6267
6403
  border-radius: 4px;
6268
6404
  padding: 2px 7px;
6269
- font-family: var(--mono);
6405
+ font-family: var(--font-code);
6270
6406
  font-size: 11px;
6271
6407
  color: var(--c-text);
6272
6408
  white-space: nowrap;
@@ -6348,7 +6484,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6348
6484
  border-color: color-mix(in srgb, var(--c-accent) 40%, transparent);
6349
6485
  }
6350
6486
  .empty-state-action.is-agent:hover {
6351
- border-color: color-mix(in srgb, var(--c-purple) 45%, transparent);
6487
+ border-color: color-mix(in srgb, var(--c-agent) 45%, transparent);
6352
6488
  }
6353
6489
  .empty-state-action .tone-accent {
6354
6490
  color: var(--c-accent);
@@ -6360,7 +6496,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6360
6496
  color: var(--c-ok);
6361
6497
  }
6362
6498
  .empty-state-action .tone-purple {
6363
- color: var(--c-purple);
6499
+ color: var(--c-agent);
6364
6500
  }
6365
6501
  .empty-state-action-label {
6366
6502
  flex: 1;
@@ -6371,7 +6507,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6371
6507
  padding: 1px 6px;
6372
6508
  border: 1px solid var(--c-line);
6373
6509
  border-radius: 4px;
6374
- font: 9.5px var(--mono);
6510
+ font: 9.5px var(--font-code);
6375
6511
  color: var(--c-dim);
6376
6512
  }
6377
6513
  .empty-state-action-hint {
@@ -6382,7 +6518,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6382
6518
  background: none;
6383
6519
  border: none;
6384
6520
  padding: 0;
6385
- font: 10.5px var(--mono);
6521
+ font: 10.5px var(--font-code);
6386
6522
  color: var(--c-dim);
6387
6523
  cursor: pointer;
6388
6524
  }
@@ -6414,8 +6550,6 @@ html.is-node-resizing .ext-app-preview-catcher {
6414
6550
  animation: none !important;
6415
6551
  }
6416
6552
 
6417
- .attention-field-region,
6418
- .attention-field-node,
6419
6553
  .canvas-node {
6420
6554
  transition: none !important;
6421
6555
  }
@@ -6516,7 +6650,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6516
6650
  }
6517
6651
 
6518
6652
  .image-node-error-path {
6519
- font-family: var(--mono);
6653
+ font-family: var(--font-code);
6520
6654
  font-size: 10px;
6521
6655
  color: var(--c-muted);
6522
6656
  word-break: break-all;
@@ -6625,8 +6759,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6625
6759
  .intent-ghost-box {
6626
6760
  border: 1.5px dashed var(--c-accent);
6627
6761
  border-radius: 10px;
6628
- background: var(--c-accent-10);
6629
- box-shadow: 0 0 0 1px var(--c-accent-10), 0 6px 22px var(--c-accent-10);
6762
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
6763
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-accent) 10%, transparent), 0 6px 22px color-mix(in srgb, var(--c-accent) 10%, transparent);
6630
6764
  animation: intent-breathe 2.1s ease-in-out infinite;
6631
6765
  overflow: visible;
6632
6766
  }
@@ -6655,8 +6789,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6655
6789
  }
6656
6790
 
6657
6791
  @keyframes intent-breathe {
6658
- 0%, 100% { box-shadow: 0 0 0 1px var(--c-accent-10), 0 6px 22px var(--c-accent-10); }
6659
- 50% { box-shadow: 0 0 0 1px var(--c-accent-25), 0 8px 30px var(--c-accent-25); }
6792
+ 0%, 100% { box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-accent) 10%, transparent), 0 6px 22px color-mix(in srgb, var(--c-accent) 10%, transparent); }
6793
+ 50% { box-shadow: 0 0 0 1px color-mix(in srgb, var(--c-accent) 25%, transparent), 0 8px 30px color-mix(in srgb, var(--c-accent) 25%, transparent); }
6660
6794
  }
6661
6795
 
6662
6796
  /* remove — a red crosshatch tombstone over the target */
@@ -6677,7 +6811,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6677
6811
  .intent-ghost-edit {
6678
6812
  border: 1.5px dashed var(--c-accent);
6679
6813
  border-radius: 10px;
6680
- background: var(--c-accent-10);
6814
+ background: color-mix(in srgb, var(--c-accent) 10%, transparent);
6681
6815
  overflow: visible;
6682
6816
  }
6683
6817
 
@@ -6725,7 +6859,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6725
6859
  border-radius: 999px;
6726
6860
  background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
6727
6861
  backdrop-filter: blur(10px);
6728
- border: 1px solid var(--c-accent-25);
6862
+ border: 1px solid color-mix(in srgb, var(--c-accent) 25%, transparent);
6729
6863
  box-shadow: 0 4px 14px var(--c-shadow);
6730
6864
  color: var(--c-text);
6731
6865
  font-size: 12px;
@@ -6815,7 +6949,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6815
6949
  }
6816
6950
 
6817
6951
  .intent-edge.type-flow { stroke: var(--c-accent); }
6818
- .intent-edge.type-depends-on { stroke: var(--c-warn); }
6952
+ .intent-edge.type-depends-on { stroke: var(--c-rel-informs); }
6819
6953
  .intent-edge.type-relation { stroke: var(--c-muted); }
6820
6954
  .intent-edge.type-references { stroke: var(--c-dim); }
6821
6955
 
@@ -6954,8 +7088,8 @@ html.is-node-dragging .intent-line-layer {
6954
7088
  .board-switcher-menu .toolbar-menu-item { padding: 10px; gap: 12px; }
6955
7089
  .board-switcher-menu .toolbar-menu-item:hover,
6956
7090
  .board-switcher-menu .toolbar-menu-item:focus-visible {
6957
- background: var(--c-accent-8);
6958
- border-color: var(--c-accent-25);
7091
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
7092
+ border-color: color-mix(in srgb, var(--c-accent) 25%, transparent);
6959
7093
  outline: none;
6960
7094
  }
6961
7095
  .board-switcher-icon { display: flex; align-items: center; justify-content: center; width: 20px; flex-shrink: 0; color: var(--c-accent); font-size: 22px; }
@@ -7067,7 +7201,7 @@ html.is-node-dragging .intent-line-layer {
7067
7201
  white-space: nowrap;
7068
7202
  }
7069
7203
  .home-board-meta {
7070
- font: 11px var(--mono);
7204
+ font: 11px var(--font-code);
7071
7205
  color: var(--c-text-soft);
7072
7206
  }
7073
7207
  .home-board-confirm-text {
@@ -7200,7 +7334,7 @@ html.is-node-dragging .intent-line-layer {
7200
7334
  }
7201
7335
  .home-section-folder { color: var(--c-dim); }
7202
7336
  .home-section-count {
7203
- font: 11px var(--mono);
7337
+ font: 11px var(--font-code);
7204
7338
  text-transform: none;
7205
7339
  color: var(--c-dim);
7206
7340
  margin-left: auto;
@@ -7265,7 +7399,7 @@ html.is-node-dragging .intent-line-layer {
7265
7399
  .board-copy-card span { display: flex; flex-direction: column; min-width: 0; }
7266
7400
  .board-copy-card strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; }
7267
7401
  .board-copy-card small,
7268
- .board-link-results small { color: var(--c-text-soft); font: 11px var(--mono); }
7402
+ .board-link-results small { color: var(--c-text-soft); font: 11px var(--font-code); }
7269
7403
  .board-copy-options { font-size: 13px; }
7270
7404
  .board-copy-options label { display: flex; gap: 8px; align-items: center; }
7271
7405
  .board-copy-note,
@@ -7349,7 +7483,7 @@ html.is-node-dragging .intent-line-layer {
7349
7483
  background: var(--c-panel);
7350
7484
  z-index: 1;
7351
7485
  }
7352
- .attachment-review pre { white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.6 var(--mono); padding: 12px; background: var(--c-bg); border-radius: 8px; }
7486
+ .attachment-review pre { white-space: pre-wrap; overflow-wrap: anywhere; font: 12px/1.6 var(--font-code); padding: 12px; background: var(--c-bg); border-radius: 8px; }
7353
7487
  .attachment-review h4 { margin-bottom: 6px; }
7354
7488
  .md-import-source { padding: 6px 12px; font-size: 11px; overflow-wrap: anywhere; color: var(--c-text-soft); border-top: 1px solid var(--c-line); }
7355
7489
  @media (max-width: 640px) {