pmx-canvas 0.9.3 → 0.11.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 (237) hide show
  1. package/.github/extensions/pmx-canvas/runtime.json +1 -1
  2. package/.github/extensions/pmx-canvas/tools.json +9418 -2016
  3. package/CHANGELOG.md +54 -1
  4. package/dist/canvas/chunks/abnfDiagram-N423BO3Z-p8dtp6va.js +1 -0
  5. package/dist/canvas/chunks/architecture-TIHT7OUA-9tffvpsv.js +1 -0
  6. package/dist/canvas/chunks/architectureDiagram-T3A2C74G-5jhmxrzf.js +36 -0
  7. package/dist/canvas/chunks/blockDiagram-VBNYF7ZC-pw1fa9yb.js +132 -0
  8. package/dist/canvas/chunks/c4Diagram-5PPSVZJV-x07nq0tt.js +10 -0
  9. package/dist/canvas/chunks/classDiagram-JCYQIIEL-nc6g5x1r.js +1 -0
  10. package/dist/canvas/chunks/classDiagram-v2-OCEON4UE-0qnbpwvh.js +1 -0
  11. package/dist/canvas/chunks/cose-bilkent-JH36ORCC-nm39npq0.js +1 -0
  12. package/dist/canvas/chunks/cynefin-VYW2F7L2-ys8p46ts.js +1 -0
  13. package/dist/canvas/chunks/cynefinDiagram-MW4NZA55-vdxrwahz.js +62 -0
  14. package/dist/canvas/chunks/dagre-VZM6K2ZE-bqdm7wpd.js +4 -0
  15. package/dist/canvas/chunks/diagram-7IWD3JNH-gs5gpr93.js +30 -0
  16. package/dist/canvas/chunks/diagram-B4RE2ZJO-cgwjg47s.js +3 -0
  17. package/dist/canvas/chunks/diagram-LBJQPF4R-w3vahpav.js +24 -0
  18. package/dist/canvas/chunks/diagram-Q27KOJAE-42837z6h.js +24 -0
  19. package/dist/canvas/chunks/diagram-UB23O5K3-4fz83q59.js +41 -0
  20. package/dist/canvas/chunks/ebnfDiagram-BXEA7PRR-zphtgegj.js +1 -0
  21. package/dist/canvas/chunks/erDiagram-JOGREHBK-zvbbdxp4.js +85 -0
  22. package/dist/canvas/chunks/eventmodeling-45OFAUF4-v9q6dn4c.js +1 -0
  23. package/dist/canvas/chunks/flowDiagram-UKHOOZJN-yrr5z8tc.js +1 -0
  24. package/dist/canvas/chunks/ganttDiagram-PKOTCBZU-282jzycm.js +292 -0
  25. package/dist/canvas/chunks/gitGraph-TEB2WS4Q-kdwb8m0a.js +1 -0
  26. package/dist/canvas/chunks/gitGraphDiagram-DS77QQ5N-vqqy6p1b.js +106 -0
  27. package/dist/canvas/chunks/index-0rk4gp1g.js +2 -0
  28. package/dist/canvas/chunks/index-194m3hc3.js +2 -0
  29. package/dist/canvas/chunks/index-1r72hdzb.js +301 -0
  30. package/dist/canvas/chunks/index-353m7b0p.js +2 -0
  31. package/dist/canvas/chunks/index-3cy1bzwh.js +2 -0
  32. package/dist/canvas/chunks/index-5tv8v1hk.js +1 -0
  33. package/dist/canvas/chunks/index-6ceya556.js +332 -0
  34. package/dist/canvas/chunks/index-6qmsnxwy.js +4 -0
  35. package/dist/canvas/chunks/index-d3b3gqe9.js +2 -0
  36. package/dist/canvas/chunks/index-fjtdggjn.js +2 -0
  37. package/dist/canvas/chunks/index-g3pwnqeb.js +2 -0
  38. package/dist/canvas/chunks/index-gf4e0et4.js +2 -0
  39. package/dist/canvas/chunks/index-hj99nz1f.js +1 -0
  40. package/dist/canvas/chunks/index-nprm96xp.js +16 -0
  41. package/dist/canvas/chunks/index-qj8fxwsf.js +2 -0
  42. package/dist/canvas/chunks/index-r2fyc9w1.js +89 -0
  43. package/dist/canvas/chunks/index-rft2hcz5.js +2 -0
  44. package/dist/canvas/chunks/index-rh7nv68n.js +2 -0
  45. package/dist/canvas/chunks/index-s4j678gj.js +2 -0
  46. package/dist/canvas/chunks/index-tb1wf525.js +179 -0
  47. package/dist/canvas/chunks/index-vv56h019.js +2 -0
  48. package/dist/canvas/chunks/index-w2mra17t.js +207 -0
  49. package/dist/canvas/chunks/index-wgv7en21.js +232 -0
  50. package/dist/canvas/chunks/index-yw8h9vha.js +157 -0
  51. package/dist/canvas/chunks/info-DKCQHKI2-wpzs6sz3.js +1 -0
  52. package/dist/canvas/chunks/infoDiagram-6WML65LV-v1yvggqj.js +2 -0
  53. package/dist/canvas/chunks/ishikawaDiagram-WSZJBQD7-5hnq1a9p.js +70 -0
  54. package/dist/canvas/chunks/journeyDiagram-NVQOT4AX-zjcffveh.js +139 -0
  55. package/dist/canvas/chunks/kanban-definition-27J2QSJJ-dakqtfp1.js +89 -0
  56. package/dist/canvas/chunks/katex-dmg8k4zm.js +257 -0
  57. package/dist/canvas/chunks/mermaid.core-j2geswrd.js +12 -0
  58. package/dist/canvas/chunks/mindmap-definition-FAOFIHXS-142xhr3k.js +96 -0
  59. package/dist/canvas/chunks/packet-7NZHBO7P-xn439f0s.js +1 -0
  60. package/dist/canvas/chunks/pegDiagram-VL7TDLO6-5wvk7vsd.js +1 -0
  61. package/dist/canvas/chunks/pie-RZYD4A2V-0kf16rwh.js +1 -0
  62. package/dist/canvas/chunks/pieDiagram-7S7Q4E2Y-ztdhwycc.js +39 -0
  63. package/dist/canvas/chunks/quadrantDiagram-CIZ2JOQS-c5p9gmg6.js +7 -0
  64. package/dist/canvas/chunks/radar-I7S5WNFK-0g2pz36t.js +1 -0
  65. package/dist/canvas/chunks/railroad-3IZDKUUU-fcaran6j.js +1 -0
  66. package/dist/canvas/chunks/railroad-abnf-AHOZXSZD-wgdya41q.js +1 -0
  67. package/dist/canvas/chunks/railroad-ebnf-EBAXGLYW-gy07a4ka.js +1 -0
  68. package/dist/canvas/chunks/railroad-peg-LSFZ7HO6-ewk6wtkh.js +1 -0
  69. package/dist/canvas/chunks/railroadDiagram-AXF67PYL-xkmqkjwf.js +1 -0
  70. package/dist/canvas/chunks/requirementDiagram-LRYGKXZP-9wm2dyaw.js +84 -0
  71. package/dist/canvas/chunks/sankeyDiagram-W5VNT64P-2w19etgb.js +40 -0
  72. package/dist/canvas/chunks/sequenceDiagram-SI44F4Z6-0jn0vwmz.js +162 -0
  73. package/dist/canvas/chunks/sizeCapture-X5ZJPWSS-x75epwdq.js +1 -0
  74. package/dist/canvas/chunks/stateDiagram-OKZ733FA-schjpy6d.js +1 -0
  75. package/dist/canvas/chunks/stateDiagram-v2-UEYNNEHI-k8sfp2e7.js +1 -0
  76. package/dist/canvas/chunks/swimlanes-SLNWSIFB-gkw4xce3.js +1 -0
  77. package/dist/canvas/chunks/swimlanesDiagram-ULZ7WXOC-nqysw67j.js +8 -0
  78. package/dist/canvas/chunks/timeline-definition-Z64GVDOM-x7nkcy01.js +120 -0
  79. package/dist/canvas/chunks/treeView-QDETBFTQ-cesw6gp0.js +1 -0
  80. package/dist/canvas/chunks/treemap-6X3UGDF4-zdv4knp9.js +1 -0
  81. package/dist/canvas/chunks/vennDiagram-T6HMQDX7-x8dqn9yf.js +34 -0
  82. package/dist/canvas/chunks/wardley-OPB4EBWU-44pdddez.js +1 -0
  83. package/dist/canvas/chunks/wardleyDiagram-T6FBY63Y-t1j52t9r.js +78 -0
  84. package/dist/canvas/chunks/xychartDiagram-ELKLHX3M-38t16pme.js +7 -0
  85. package/dist/canvas/global.css +389 -229
  86. package/dist/canvas/index.js +141 -211
  87. package/dist/canvas/mcp-app.html +4205 -554
  88. package/dist/canvas/mermaid-entry.js +338 -338
  89. package/dist/canvas/surface-theme.css +6 -6
  90. package/dist/json-render/index.css +1 -1
  91. package/dist/json-render/index.js +49 -49
  92. package/dist/types/client/canvas/BarHint.d.ts +5 -3
  93. package/dist/types/client/canvas/CanvasNode.d.ts +0 -11
  94. package/dist/types/client/canvas/EdgeLayer.d.ts +1 -2
  95. package/dist/types/client/canvas/auto-fit.d.ts +4 -5
  96. package/dist/types/client/mermaid-entry.d.ts +1 -2
  97. package/dist/types/client/mermaid-render.d.ts +1 -0
  98. package/dist/types/client/nodes/BoardNode.d.ts +1 -1
  99. package/dist/types/client/nodes/ExtAppFrame.d.ts +7 -90
  100. package/dist/types/client/nodes/McpAppNode.d.ts +1 -25
  101. package/dist/types/client/nodes/MermaidNode.d.ts +1 -8
  102. package/dist/types/client/nodes/ViewerFrame.d.ts +29 -0
  103. package/dist/types/client/nodes/ViewerHost.d.ts +6 -0
  104. package/dist/types/client/nodes/iframe-document-url.d.ts +3 -9
  105. package/dist/types/client/nodes/primitive-copy.d.ts +5 -0
  106. package/dist/types/client/nodes/use-iframe-content-height.d.ts +1 -1
  107. package/dist/types/client/nodes/use-surface-frame.d.ts +4 -6
  108. package/dist/types/client/nodes/viewer-runtime-state.d.ts +2 -1
  109. package/dist/types/client/state/canvas-store.d.ts +3 -1
  110. package/dist/types/client/state/intent-bridge.d.ts +1 -0
  111. package/dist/types/client/state/presentation.d.ts +17 -6
  112. package/dist/types/json-render/server.d.ts +2 -1
  113. package/dist/types/mcp/canvas-access.d.ts +1 -12
  114. package/dist/types/mcp/resource-subscriptions.d.ts +7 -0
  115. package/dist/types/mcp/server.d.ts +2 -0
  116. package/dist/types/server/ax-wait.d.ts +1 -0
  117. package/dist/types/server/canvas-operations.d.ts +1 -0
  118. package/dist/types/server/canvas-state.d.ts +2 -0
  119. package/dist/types/server/index.d.ts +11 -6
  120. package/dist/types/server/operations/http.d.ts +10 -0
  121. package/dist/types/server/operations/index.d.ts +2 -2
  122. package/dist/types/server/operations/invoker.d.ts +4 -3
  123. package/dist/types/server/operations/mcp-contracts.d.ts +20 -0
  124. package/dist/types/server/operations/mcp.d.ts +2 -0
  125. package/dist/types/server/operations/ops/batch.d.ts +1 -0
  126. package/dist/types/server/operations/ops/boards.d.ts +0 -1
  127. package/dist/types/server/operations/registry.d.ts +2 -2
  128. package/dist/types/server/operations/types.d.ts +12 -2
  129. package/dist/types/server/server.d.ts +2 -0
  130. package/dist/types/server/tour-control.d.ts +13 -3
  131. package/dist/types/server/webpage-node.d.ts +1 -0
  132. package/dist/types/shared/ax-surface-protocol.d.ts +0 -9
  133. package/dist/types/shared/tour.d.ts +8 -0
  134. package/docs/api-reference.md +2 -2
  135. package/docs/cli.md +1 -1
  136. package/docs/design/Chrome.dc.html +32 -6
  137. package/docs/design/Types1.dc.html +3 -2
  138. package/docs/design/Types2.dc.html +1 -1
  139. package/docs/design/Types3.dc.html +1 -1
  140. package/docs/design/Zoom.dc.html +37 -60
  141. package/docs/design/canvas.json +1 -1
  142. package/docs/design.md +169 -4
  143. package/docs/http-api.md +82 -1
  144. package/docs/mcp.md +101 -21
  145. package/docs/node-types.md +38 -3
  146. package/docs/plans/plan-009-tech-debt-backlog.md +2 -2
  147. package/docs/plans/plan-019-post-0.9-roadmap.md +402 -13
  148. package/docs/product-vision-2026-09.md +9 -0
  149. package/docs/sdk.md +5 -2
  150. package/package.json +2 -2
  151. package/plugins/pmx-canvas/com.github.copilot/extensions/pmx-canvas/runtime.json +1 -1
  152. package/plugins/pmx-canvas/plugin.json +1 -1
  153. package/plugins/pmx-canvas/runtime.json +1 -1
  154. package/plugins/pmx-canvas/tools.json +9418 -2016
  155. package/skills/pmx-canvas/SKILL.md +19 -21
  156. package/skills/pmx-canvas/references/full-reference.md +44 -6
  157. package/skills/pmx-canvas/references/installing-pmx-canvas.md +7 -7
  158. package/skills/published-consumer-e2e/scripts/run-published-consumer-e2e.sh +3 -5
  159. package/src/client/canvas/BarHint.tsx +6 -3
  160. package/src/client/canvas/CanvasNode.tsx +34 -47
  161. package/src/client/canvas/CanvasViewport.tsx +6 -7
  162. package/src/client/canvas/ContextMenu.tsx +63 -3
  163. package/src/client/canvas/EdgeLayer.tsx +365 -169
  164. package/src/client/canvas/ExpandedNodeOverlay.tsx +1 -2
  165. package/src/client/canvas/Presentation.tsx +53 -3
  166. package/src/client/canvas/ToolRail.tsx +2 -0
  167. package/src/client/canvas/TopBar.tsx +24 -9
  168. package/src/client/canvas/auto-fit.ts +9 -11
  169. package/src/client/canvas/canvas-area.ts +1 -1
  170. package/src/client/canvas/use-focus-trap.ts +6 -1
  171. package/src/client/mermaid-entry.ts +6 -20
  172. package/src/client/mermaid-render.ts +39 -0
  173. package/src/client/nodes/AxStepControls.tsx +45 -69
  174. package/src/client/nodes/BoardNode.tsx +65 -9
  175. package/src/client/nodes/ContextNode.tsx +88 -396
  176. package/src/client/nodes/ExtAppFrame.tsx +283 -1462
  177. package/src/client/nodes/FileNode.tsx +92 -81
  178. package/src/client/nodes/HtmlNode.tsx +8 -36
  179. package/src/client/nodes/LedgerNode.tsx +31 -17
  180. package/src/client/nodes/MarkdownNode.tsx +8 -17
  181. package/src/client/nodes/McpAppNode.tsx +48 -154
  182. package/src/client/nodes/MermaidNode.tsx +80 -69
  183. package/src/client/nodes/PromptNode.tsx +12 -14
  184. package/src/client/nodes/ResponseNode.tsx +8 -6
  185. package/src/client/nodes/StatusNode.tsx +22 -7
  186. package/src/client/nodes/StatusSummary.tsx +5 -3
  187. package/src/client/nodes/TraceNode.tsx +8 -8
  188. package/src/client/nodes/ViewerFrame.tsx +262 -0
  189. package/src/client/nodes/ViewerHost.tsx +41 -0
  190. package/src/client/nodes/WebpageNode.tsx +22 -24
  191. package/src/client/nodes/iframe-document-url.ts +20 -27
  192. package/src/client/nodes/primitive-copy.ts +97 -0
  193. package/src/client/nodes/use-iframe-content-height.ts +34 -10
  194. package/src/client/nodes/use-surface-frame.ts +22 -11
  195. package/src/client/nodes/viewer-runtime-state.ts +41 -35
  196. package/src/client/state/canvas-store.ts +18 -12
  197. package/src/client/state/intent-bridge.ts +1 -0
  198. package/src/client/state/presentation.ts +135 -15
  199. package/src/client/state/sse-bridge.ts +18 -19
  200. package/src/client/theme/global.css +389 -229
  201. package/src/client/theme/surface-theme.css +6 -6
  202. package/src/json-render/charts/tufte-components.tsx +44 -2
  203. package/src/json-render/renderer/index.css +62 -2
  204. package/src/json-render/renderer/index.tsx +31 -7
  205. package/src/json-render/server.ts +3 -2
  206. package/src/mcp/canvas-access.ts +6 -47
  207. package/src/mcp/resource-subscriptions.ts +181 -0
  208. package/src/mcp/server.ts +185 -219
  209. package/src/server/ax-wait.ts +21 -6
  210. package/src/server/board-export.ts +35 -24
  211. package/src/server/canvas-geometry.ts +1 -0
  212. package/src/server/canvas-operations.ts +6 -2
  213. package/src/server/canvas-state.ts +5 -0
  214. package/src/server/demo-state.json +106 -100
  215. package/src/server/html-primitives.ts +3 -9
  216. package/src/server/html-surface.ts +8 -0
  217. package/src/server/index.ts +30 -12
  218. package/src/server/operations/http.ts +69 -21
  219. package/src/server/operations/index.ts +8 -1
  220. package/src/server/operations/invoker.ts +53 -5
  221. package/src/server/operations/mcp-contracts.ts +354 -0
  222. package/src/server/operations/mcp.ts +153 -18
  223. package/src/server/operations/ops/ax-await.ts +18 -10
  224. package/src/server/operations/ops/ax-read.ts +2 -0
  225. package/src/server/operations/ops/ax-timeline.ts +2 -2
  226. package/src/server/operations/ops/batch.ts +27 -8
  227. package/src/server/operations/ops/boards.ts +1 -3
  228. package/src/server/operations/ops/nodes.ts +18 -3
  229. package/src/server/operations/ops/viewport.ts +11 -9
  230. package/src/server/operations/registry.ts +24 -4
  231. package/src/server/operations/types.ts +16 -2
  232. package/src/server/server.ts +17 -59
  233. package/src/server/tour-control.ts +66 -6
  234. package/src/server/webpage-node.ts +9 -4
  235. package/src/shared/ax-surface-protocol.ts +0 -11
  236. package/src/shared/content-height-reporter.ts +4 -3
  237. package/src/shared/tour.ts +8 -0
@@ -84,12 +84,12 @@
84
84
  /* ── Core palette (dark · ink + cyan) ────────────────────── */
85
85
  --c-bg: #081524;
86
86
  --c-panel: #0f1d31;
87
- --c-panel-soft: #0a1729;
87
+ --c-panel-soft: #13243b;
88
88
  --c-line: #1b2c44;
89
89
  --c-text: #e6eef7;
90
- --c-text-soft: #c7d3ea;
90
+ --c-text-soft: #b9c6d6;
91
91
  --c-muted: #8ea3bd;
92
- --c-dim: #5c6b80;
92
+ --c-dim: #6b7d94;
93
93
  --c-accent: #4BBCFF;
94
94
  --c-ok: #2fd07f;
95
95
  --c-warn: #f4c542;
@@ -106,7 +106,7 @@
106
106
  --c-rel-informs: #E58FB0;
107
107
  --c-rel-related: #8ea3bd;
108
108
  --c-input-bg: #0a1729;
109
- --c-dot-grid: rgba(75, 188, 255, 0.08);
109
+ --c-dot-grid: rgba(142, 163, 189, 0.14);
110
110
  --c-panel-overlay: rgba(8, 21, 36, 0.6);
111
111
  --c-panel-glass: rgba(15, 29, 49, 0.92);
112
112
  --c-shadow: rgba(0, 0, 0, 0.3);
@@ -148,19 +148,19 @@
148
148
  }
149
149
 
150
150
  .board-node, .md-card-preview { display: flex; flex-direction: column; height: 100%; min-height: 0; }
151
+ .board-node > .home-thumb { height: 96px; flex-shrink: 0; }
152
+ .board-node-missing { display: grid; place-items: center; min-height: 72px; margin: 10px 10px 0; border: 1px dashed var(--c-line); border-radius: var(--r-control); color: var(--c-muted); font-size: var(--fs-meta); }
153
+ .board-node-relink { max-width: 100%; margin-top: 8px; padding: 4px 8px; color: var(--c-text); background: var(--c-panel); border: 1px solid var(--c-line); border-radius: var(--r-control); font: var(--fs-ui) var(--font-ui); }
151
154
  .board-node-content { flex: 1; min-height: 0; overflow: auto; padding: 16px; overflow-wrap: anywhere; }
152
- .board-node-label { color: var(--c-dim); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .1em; margin-bottom: 8px; }
153
155
  .board-node-title { display: block; font-size: 17px; line-height: 1.35; margin-bottom: 6px; }
154
156
  .board-node-meta { color: var(--c-dim); font-size: 11px; line-height: 1.5; }
155
157
  .board-node-summary { color: var(--c-text-soft); font-size: 13px; line-height: 1.6; margin: 14px 0; }
156
158
  .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); }
158
- .board-node-open:disabled { color: var(--c-dim); cursor: default; }
159
+ .board-node-open:hover { background: color-mix(in srgb, var(--c-accent) 8%, transparent); }
159
160
  .md-card-content { flex: 1; min-height: 0; overflow: auto; }
160
161
  .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); }
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 { border: 1px solid transparent; border-radius: var(--r-control); background: transparent; color: var(--c-dim); padding: 4px 8px; font: 500 var(--fs-meta) var(--font-ui); cursor: pointer; }
162
163
  .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); }
164
164
  .md-card-edit { margin-left: auto; }
165
165
  .board-node-open:focus-visible, .md-card-actions button:focus-visible { outline: 2px solid var(--c-accent); outline-offset: -2px; }
166
166
  .canvas-node[data-node-type="markdown"] .node-body,
@@ -599,30 +599,62 @@ body,
599
599
  display: contents;
600
600
  }
601
601
 
602
+ .node-header-meta {
603
+ color: var(--c-dim);
604
+ font-size: var(--fs-meta);
605
+ white-space: nowrap;
606
+ overflow: hidden;
607
+ text-overflow: ellipsis;
608
+ max-width: 20%;
609
+ }
610
+
611
+ .node-readme-mark {
612
+ flex-shrink: 0;
613
+ color: var(--c-muted);
614
+ font-size: var(--fs-meta);
615
+ white-space: nowrap;
616
+ }
617
+
618
+ /* Chrome §9: the markdown title becomes the section heading. */
619
+ .canvas-node.heading-node {
620
+ background: transparent;
621
+ border-color: transparent;
622
+ box-shadow: none;
623
+ }
624
+ .canvas-node.heading-node .node-titlebar {
625
+ border: 0;
626
+ padding: 8px 16px 0;
627
+ background: transparent;
628
+ }
629
+ .canvas-node.heading-node .node-title {
630
+ font-size: var(--fs-heading);
631
+ line-height: 28px;
632
+ letter-spacing: -0.01em;
633
+ }
634
+ .canvas-node.heading-node .node-type-icon { display: none; }
635
+ .heading-node:not(:hover):not(:focus-within) .node-controls { visibility: hidden; }
636
+ .heading-node:not(:hover):not(:focus-within) .node-resize-handle { visibility: hidden; }
637
+ .canvas-node.heading-node .node-body { padding: 0 16px 8px; color: var(--c-muted); }
638
+
602
639
  .canvas-node:hover {
603
- box-shadow: 0 6px 32px var(--c-shadow);
640
+ box-shadow: var(--e-2);
604
641
  }
605
642
 
606
643
  .canvas-node.active {
607
644
  border-color: var(--c-accent);
608
- box-shadow: 0 0 0 1px var(--c-accent), 0 6px 32px color-mix(in srgb, var(--c-accent) 15%, transparent);
645
+ box-shadow: 0 0 0 1px var(--c-accent), var(--e-1);
609
646
  }
610
647
 
611
648
  .canvas-node.neighbor {
612
649
  border-color: color-mix(in srgb, var(--c-accent) 40%, transparent);
613
- 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);
650
+ box-shadow: var(--e-1);
614
651
  transition: border-color 0.2s, box-shadow 0.2s, opacity 0.15s ease;
615
652
  }
616
653
 
617
654
  /* Spatial search highlighting — canvas lights up as you type in Cmd+K */
618
655
  .canvas-node.search-match {
619
656
  border-color: var(--c-accent);
620
- 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);
621
- animation: search-pulse 1.5s ease-in-out infinite;
622
- }
623
- @keyframes search-pulse {
624
- 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); }
625
- 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); }
657
+ box-shadow: 0 0 0 2px var(--c-accent), var(--e-1);
626
658
  }
627
659
  .canvas-node.search-dimmed {
628
660
  opacity: 0.25;
@@ -687,9 +719,9 @@ body,
687
719
  .canvas-node .node-titlebar {
688
720
  display: flex;
689
721
  align-items: center;
690
- gap: calc(8px * var(--node-chrome-scale, 1));
691
- padding: calc(7px * var(--node-chrome-scale, 1)) calc(12px * var(--node-chrome-scale, 1));
692
- background: var(--c-panel-overlay);
722
+ gap: 8px;
723
+ padding: 7px 12px;
724
+ background: transparent;
693
725
  border-bottom: 1px solid var(--c-line);
694
726
  cursor: grab;
695
727
  user-select: none;
@@ -701,9 +733,10 @@ body,
701
733
  }
702
734
 
703
735
  .canvas-node .node-title {
704
- font-size: calc(12px * var(--node-chrome-scale, 1));
736
+ font-size: calc(12px * var(--node-title-scale, 1));
737
+ line-height: 22px;
705
738
  font-weight: 600;
706
- color: var(--c-text-soft);
739
+ color: var(--c-text);
707
740
  white-space: nowrap;
708
741
  overflow: hidden;
709
742
  text-overflow: ellipsis;
@@ -718,16 +751,16 @@ body,
718
751
  display: inline-flex;
719
752
  align-items: center;
720
753
  justify-content: center;
721
- width: calc(14px * var(--node-chrome-scale, 1));
722
- height: calc(14px * var(--node-chrome-scale, 1));
754
+ width: 14px;
755
+ height: 14px;
723
756
  color: var(--c-muted);
724
757
  flex-shrink: 0;
725
758
  }
726
759
 
727
760
  .canvas-node .node-type-badge {
728
- font-size: calc(10px * var(--node-chrome-scale, 1));
729
- padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
730
- border-radius: calc(4px * var(--node-chrome-scale, 1));
761
+ font-size: 10px;
762
+ padding: 1px 6px;
763
+ border-radius: 4px;
731
764
  background: color-mix(in srgb, var(--c-accent) 12%, transparent);
732
765
  color: var(--c-accent);
733
766
  text-transform: uppercase;
@@ -736,16 +769,12 @@ body,
736
769
  }
737
770
 
738
771
  .canvas-node .node-ax-status {
739
- /* A long status ("in-progress") must not push the node's NAME out of the bar;
740
- the pill is a glance-level cue, the name is the identity. */
741
- max-width: 11ch;
742
- overflow: hidden;
743
- text-overflow: ellipsis;
772
+ /* The status is a complete word, never an ellipsis: the title is the part of
773
+ the bar that gives way (HeaderMarks keeps it its minimum width). */
744
774
  white-space: nowrap;
745
- flex-shrink: 1;
746
- font-size: calc(9px * var(--node-chrome-scale, 1));
747
- padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
748
- border-radius: calc(4px * var(--node-chrome-scale, 1));
775
+ font-size: 9px;
776
+ padding: 1px 6px;
777
+ border-radius: 4px;
749
778
  background: var(--c-panel-overlay);
750
779
  color: var(--c-muted);
751
780
  text-transform: uppercase;
@@ -768,7 +797,7 @@ body,
768
797
  .canvas-node .node-controls {
769
798
  display: flex;
770
799
  align-items: center;
771
- gap: calc(4px * var(--node-chrome-scale, 1));
800
+ gap: 4px;
772
801
  flex-shrink: 0;
773
802
  }
774
803
 
@@ -780,12 +809,12 @@ body,
780
809
  display: inline-flex;
781
810
  align-items: center;
782
811
  justify-content: center;
783
- min-width: calc(22px * var(--node-chrome-scale, 1));
784
- min-height: calc(22px * var(--node-chrome-scale, 1));
785
- padding: calc(2px * var(--node-chrome-scale, 1)) calc(4px * var(--node-chrome-scale, 1));
786
- font-size: calc(14px * var(--node-chrome-scale, 1));
812
+ min-width: 22px;
813
+ min-height: 22px;
814
+ padding: 2px 4px;
815
+ font-size: 14px;
787
816
  line-height: 1;
788
- border-radius: calc(3px * var(--node-chrome-scale, 1));
817
+ border-radius: 3px;
789
818
  }
790
819
 
791
820
  .canvas-node .node-controls button svg {
@@ -815,7 +844,7 @@ body,
815
844
  overflow: auto;
816
845
  padding: 10px 14px;
817
846
  min-height: 0;
818
- font-size: 11px;
847
+ font-size: var(--fs-ui);
819
848
  line-height: 1.6;
820
849
  color: var(--c-text-soft);
821
850
  }
@@ -1420,7 +1449,7 @@ body,
1420
1449
  outline-offset: 2px;
1421
1450
  }
1422
1451
  .agent-chip-who {
1423
- font: 10px var(--font-code);
1452
+ font: var(--fs-meta) var(--font-code);
1424
1453
  font-weight: 400;
1425
1454
  color: var(--c-muted);
1426
1455
  white-space: nowrap;
@@ -1454,7 +1483,7 @@ body,
1454
1483
  transform-origin: top left;
1455
1484
  }
1456
1485
  .agent-cursor.is-worker .agent-cursor-chip {
1457
- font-size: 9px;
1486
+ font-size: var(--fs-meta);
1458
1487
  padding: 1px 6px;
1459
1488
  }
1460
1489
  /* Parked idle cursors leave the board (user feedback, 0.5.1 cycle): with many agents
@@ -1477,7 +1506,7 @@ body,
1477
1506
  border-radius: 8px;
1478
1507
  background: color-mix(in srgb, var(--c-accent) 16%, transparent);
1479
1508
  color: var(--c-accent);
1480
- font-size: 9px;
1509
+ font-size: var(--fs-meta);
1481
1510
  font-weight: 700;
1482
1511
  letter-spacing: 0.04em;
1483
1512
  white-space: nowrap;
@@ -1601,10 +1630,10 @@ body,
1601
1630
  border: 1px solid color-mix(in srgb, var(--presence-color) 35%, transparent);
1602
1631
  background: color-mix(in srgb, var(--c-panel) 92%, var(--presence-color) 8%);
1603
1632
  color: var(--presence-color);
1604
- font-size: 10.5px;
1633
+ font-size: var(--fs-meta);
1605
1634
  font-weight: 600;
1606
1635
  white-space: nowrap;
1607
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1636
+ box-shadow: var(--e-2);
1608
1637
  }
1609
1638
  .agent-cursor-dot {
1610
1639
  width: 6px;
@@ -1617,7 +1646,7 @@ body,
1617
1646
  animation: presence-pulse 1.4s ease-in-out infinite;
1618
1647
  }
1619
1648
  .agent-cursor-who {
1620
- font: 9.5px var(--font-code);
1649
+ font: var(--fs-meta) var(--font-code);
1621
1650
  font-weight: 400;
1622
1651
  color: var(--c-muted);
1623
1652
  }
@@ -1673,7 +1702,7 @@ body,
1673
1702
  }
1674
1703
  .session-collapsed-label {
1675
1704
  writing-mode: vertical-rl;
1676
- font-size: 10px;
1705
+ font-size: var(--fs-meta);
1677
1706
  font-weight: 600;
1678
1707
  letter-spacing: 0.08em;
1679
1708
  text-transform: uppercase;
@@ -1684,7 +1713,7 @@ body,
1684
1713
  flex-direction: column;
1685
1714
  align-items: center;
1686
1715
  gap: 4px;
1687
- font: 9px var(--font-code);
1716
+ font: var(--fs-meta) var(--font-code);
1688
1717
  color: var(--c-dim);
1689
1718
  }
1690
1719
  .session-collapsed-live .session-live-dot {
@@ -1712,7 +1741,7 @@ body,
1712
1741
  display: inline-flex;
1713
1742
  align-items: center;
1714
1743
  gap: 5px;
1715
- font: 10px var(--font-code);
1744
+ font: var(--fs-meta) var(--font-code);
1716
1745
  color: var(--c-muted);
1717
1746
  }
1718
1747
  .session-live.phase-thinking {
@@ -1765,14 +1794,14 @@ body,
1765
1794
  }
1766
1795
  .session-section-title {
1767
1796
  margin: 0 0 8px;
1768
- font-size: 10px;
1797
+ font-size: var(--fs-meta);
1769
1798
  font-weight: 700;
1770
1799
  letter-spacing: 0.08em;
1771
1800
  text-transform: uppercase;
1772
1801
  color: var(--c-dim);
1773
1802
  }
1774
1803
  .session-empty {
1775
- font-size: 10.5px;
1804
+ font-size: var(--fs-meta);
1776
1805
  line-height: 1.5;
1777
1806
  color: var(--c-dim);
1778
1807
  }
@@ -1846,12 +1875,12 @@ body,
1846
1875
  }
1847
1876
  .session-item-detail {
1848
1877
  margin-top: 2px;
1849
- font-size: 10.5px;
1878
+ font-size: var(--fs-meta);
1850
1879
  line-height: 1.45;
1851
1880
  color: var(--c-muted);
1852
1881
  }
1853
1882
  .session-item-status {
1854
- font-size: 9px;
1883
+ font-size: var(--fs-meta);
1855
1884
  font-weight: 700;
1856
1885
  letter-spacing: 0.06em;
1857
1886
  text-transform: uppercase;
@@ -1860,7 +1889,7 @@ body,
1860
1889
  margin-top: 3px;
1861
1890
  }
1862
1891
  .session-item-time {
1863
- font: 9px var(--font-code);
1892
+ font: var(--fs-meta) var(--font-code);
1864
1893
  color: var(--c-dim);
1865
1894
  flex-shrink: 0;
1866
1895
  margin-top: 4px;
@@ -1871,7 +1900,7 @@ body,
1871
1900
  }
1872
1901
  .session-gate-ttl {
1873
1902
  margin-top: 4px;
1874
- font: 10px var(--font-code);
1903
+ font: var(--fs-meta) var(--font-code);
1875
1904
  color: var(--c-warn);
1876
1905
  }
1877
1906
  .session-gate-held {
@@ -1933,7 +1962,7 @@ body,
1933
1962
  display: inline-flex;
1934
1963
  align-items: center;
1935
1964
  gap: 6px;
1936
- font: 10px/1 var(--font-code);
1965
+ font: var(--fs-meta)/1 var(--font-code);
1937
1966
  color: var(--c-muted);
1938
1967
  }
1939
1968
  .session-work-dot {
@@ -2015,7 +2044,7 @@ body,
2015
2044
  anchored tooltip would clip against the filter row's own scroll container. */
2016
2045
  .session-timeline-hint {
2017
2046
  margin: -4px 0 8px;
2018
- font-size: 10px;
2047
+ font-size: var(--fs-meta);
2019
2048
  line-height: 1.35;
2020
2049
  color: var(--c-muted);
2021
2050
  min-height: 14px;
@@ -2071,7 +2100,7 @@ body,
2071
2100
  /* Row writer in its identity hue — multi-assistant boards need every row to
2072
2101
  answer "who wrote this" without opening anything. */
2073
2102
  .session-timeline-who {
2074
- font-size: 10px;
2103
+ font-size: var(--fs-meta);
2075
2104
  font-weight: 600;
2076
2105
  color: var(--identity-color, var(--c-muted));
2077
2106
  white-space: nowrap;
@@ -2100,11 +2129,11 @@ body,
2100
2129
  }
2101
2130
  .session-timeline-undone {
2102
2131
  margin-top: 2px;
2103
- font: 9px var(--font-code);
2132
+ font: var(--fs-meta) var(--font-code);
2104
2133
  color: var(--c-dim);
2105
2134
  }
2106
2135
  .session-timeline-body {
2107
- font-size: 10.5px;
2136
+ font-size: var(--fs-meta);
2108
2137
  line-height: 1.5;
2109
2138
  color: var(--c-text-soft);
2110
2139
  overflow-wrap: anywhere;
@@ -2117,7 +2146,7 @@ body,
2117
2146
  gap: 8px;
2118
2147
  padding: 8px 12px 8px 16px;
2119
2148
  border-bottom: 1px solid var(--c-line);
2120
- font-size: 10.5px;
2149
+ font-size: var(--fs-meta);
2121
2150
  color: var(--c-muted);
2122
2151
  }
2123
2152
  .session-scope.is-fenced {
@@ -2147,7 +2176,7 @@ body,
2147
2176
  border: 1px solid var(--c-line);
2148
2177
  background: none;
2149
2178
  color: var(--c-muted);
2150
- font-size: 10.5px;
2179
+ font-size: var(--fs-meta);
2151
2180
  font-weight: 600;
2152
2181
  cursor: pointer;
2153
2182
  white-space: nowrap;
@@ -2181,7 +2210,7 @@ body,
2181
2210
  border: 1px solid color-mix(in srgb, var(--c-agent) 35%, transparent);
2182
2211
  background: color-mix(in srgb, var(--c-panel) 92%, var(--c-agent) 8%);
2183
2212
  color: var(--c-agent);
2184
- font-size: 10px;
2213
+ font-size: var(--fs-meta);
2185
2214
  font-weight: 600;
2186
2215
  letter-spacing: 0.04em;
2187
2216
  white-space: nowrap;
@@ -2315,7 +2344,7 @@ body,
2315
2344
  background: color-mix(in srgb, var(--c-pin) 25%, transparent);
2316
2345
  }
2317
2346
  .command-bar-chips-note {
2318
- font-size: 10px;
2347
+ font-size: var(--fs-meta);
2319
2348
  color: var(--c-dim);
2320
2349
  }
2321
2350
  .command-bar-composer {
@@ -2328,7 +2357,7 @@ body,
2328
2357
  border: 1px solid var(--c-line);
2329
2358
  background: color-mix(in srgb, var(--c-panel) 95%, transparent);
2330
2359
  backdrop-filter: blur(16px);
2331
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2360
+ box-shadow: var(--e-2);
2332
2361
  }
2333
2362
  .command-bar-target {
2334
2363
  max-width: 148px;
@@ -2448,7 +2477,7 @@ body,
2448
2477
  border-radius: 50%;
2449
2478
  border: 1.5px solid var(--c-panel-soft);
2450
2479
  color: var(--c-bg);
2451
- font-size: 8.5px;
2480
+ font-size: var(--fs-meta);
2452
2481
  font-weight: 700;
2453
2482
  flex-shrink: 0;
2454
2483
  }
@@ -2482,7 +2511,7 @@ body,
2482
2511
  font-weight: 600;
2483
2512
  }
2484
2513
  .external-indicator-ops {
2485
- font: 10px var(--font-code);
2514
+ font: var(--fs-meta) var(--font-code);
2486
2515
  color: var(--c-muted);
2487
2516
  }
2488
2517
  .external-indicator-dot {
@@ -2504,8 +2533,8 @@ body,
2504
2533
  flex-direction: column;
2505
2534
  background: var(--c-panel);
2506
2535
  border: 1px solid color-mix(in srgb, var(--c-agent) 30%, transparent);
2507
- border-radius: 10px;
2508
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2536
+ border-radius: var(--r-overlay);
2537
+ box-shadow: var(--e-2);
2509
2538
  /* Popover-level like the rail menus: above the minimap, below the rail. */
2510
2539
  z-index: 9999;
2511
2540
  overflow: hidden;
@@ -2528,7 +2557,7 @@ body,
2528
2557
  color: var(--c-text);
2529
2558
  }
2530
2559
  .activity-feed-sub {
2531
- font: 9px var(--font-code);
2560
+ font: var(--fs-meta) var(--font-code);
2532
2561
  color: var(--c-dim);
2533
2562
  }
2534
2563
  .activity-feed-close {
@@ -2556,7 +2585,7 @@ body,
2556
2585
  border: 1px solid var(--c-line);
2557
2586
  background: none;
2558
2587
  color: var(--c-muted);
2559
- font-size: 10px;
2588
+ font-size: var(--fs-meta);
2560
2589
  font-weight: 600;
2561
2590
  cursor: pointer;
2562
2591
  }
@@ -2614,7 +2643,7 @@ body,
2614
2643
  overflow-wrap: anywhere;
2615
2644
  }
2616
2645
  .activity-meta {
2617
- font-size: 10px;
2646
+ font-size: var(--fs-meta);
2618
2647
  line-height: 1.45;
2619
2648
  color: var(--c-muted);
2620
2649
  }
@@ -2633,7 +2662,7 @@ body,
2633
2662
  background: none;
2634
2663
  border: 1px solid color-mix(in srgb, var(--c-danger) 40%, transparent);
2635
2664
  color: var(--c-danger);
2636
- font-size: 10.5px;
2665
+ font-size: var(--fs-meta);
2637
2666
  font-weight: 600;
2638
2667
  cursor: pointer;
2639
2668
  }
@@ -2642,7 +2671,7 @@ body,
2642
2671
  }
2643
2672
  .activity-hint,
2644
2673
  .activity-age {
2645
- font: 9px var(--font-code);
2674
+ font: var(--fs-meta) var(--font-code);
2646
2675
  color: var(--c-dim);
2647
2676
  flex-shrink: 0;
2648
2677
  }
@@ -2661,7 +2690,7 @@ body,
2661
2690
  }
2662
2691
  .activity-feed-note {
2663
2692
  flex: 1;
2664
- font-size: 10px;
2693
+ font-size: var(--fs-meta);
2665
2694
  color: var(--c-dim);
2666
2695
  }
2667
2696
  .activity-feed-link {
@@ -2669,7 +2698,7 @@ body,
2669
2698
  border: none;
2670
2699
  padding: 0;
2671
2700
  color: var(--c-muted);
2672
- font-size: 10.5px;
2701
+ font-size: var(--fs-meta);
2673
2702
  font-weight: 600;
2674
2703
  cursor: pointer;
2675
2704
  }
@@ -2698,8 +2727,8 @@ body,
2698
2727
  max-width: calc(100% - 48px);
2699
2728
  background: var(--c-panel);
2700
2729
  border: 1px solid var(--c-line);
2701
- border-radius: 12px;
2702
- box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
2730
+ border-radius: var(--r-overlay);
2731
+ box-shadow: var(--e-2);
2703
2732
  z-index: 10000;
2704
2733
  overflow: hidden;
2705
2734
  }
@@ -2718,7 +2747,7 @@ body,
2718
2747
  color: var(--c-text);
2719
2748
  }
2720
2749
  .writers-board {
2721
- font: 9px var(--font-code);
2750
+ font: var(--fs-meta) var(--font-code);
2722
2751
  color: var(--c-dim);
2723
2752
  }
2724
2753
  .writers-body {
@@ -2729,7 +2758,7 @@ body,
2729
2758
  }
2730
2759
  .writers-section {
2731
2760
  padding: 8px 0 2px;
2732
- font-size: 9px;
2761
+ font-size: var(--fs-meta);
2733
2762
  font-weight: 700;
2734
2763
  letter-spacing: 0.08em;
2735
2764
  text-transform: uppercase;
@@ -2754,7 +2783,7 @@ body,
2754
2783
  font: 11px var(--font-code);
2755
2784
  }
2756
2785
  .writers-config {
2757
- font-size: 9.5px;
2786
+ font-size: var(--fs-meta);
2758
2787
  font-weight: 600;
2759
2788
  padding: 2px 8px;
2760
2789
  border-radius: 999px;
@@ -2762,11 +2791,11 @@ body,
2762
2791
  color: var(--c-agent);
2763
2792
  }
2764
2793
  .writers-meta {
2765
- font: 9.5px var(--font-code);
2794
+ font: var(--fs-meta) var(--font-code);
2766
2795
  color: var(--c-dim);
2767
2796
  }
2768
2797
  .writers-empty {
2769
- font-size: 10.5px;
2798
+ font-size: var(--fs-meta);
2770
2799
  color: var(--c-dim);
2771
2800
  padding: 4px 0;
2772
2801
  }
@@ -2780,7 +2809,7 @@ body,
2780
2809
  }
2781
2810
  .writers-note {
2782
2811
  flex: 1;
2783
- font-size: 10px;
2812
+ font-size: var(--fs-meta);
2784
2813
  color: var(--c-dim);
2785
2814
  }
2786
2815
  .writers-done {
@@ -2803,9 +2832,9 @@ body,
2803
2832
  width: 168px;
2804
2833
  height: 112px;
2805
2834
  border: 1px solid var(--c-line);
2806
- border-radius: 8px;
2835
+ border-radius: var(--r-node);
2807
2836
  overflow: hidden;
2808
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
2837
+ box-shadow: var(--e-2);
2809
2838
  background: color-mix(in srgb, var(--c-panel-soft) 94%, transparent);
2810
2839
  backdrop-filter: blur(8px);
2811
2840
  z-index: 60;
@@ -2820,7 +2849,7 @@ body,
2820
2849
  .minimap:hover {
2821
2850
  opacity: 1;
2822
2851
  transform: scale(1.7);
2823
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
2852
+ box-shadow: var(--e-2);
2824
2853
  }
2825
2854
  .minimap-node {
2826
2855
  position: absolute;
@@ -2939,7 +2968,7 @@ body,
2939
2968
  border-radius: 8px;
2940
2969
  border: 1px solid color-mix(in srgb, var(--c-accent) 45%, transparent);
2941
2970
  color: var(--c-accent);
2942
- font-size: 9px;
2971
+ font-size: var(--fs-meta);
2943
2972
  font-weight: 700;
2944
2973
  letter-spacing: 0.06em;
2945
2974
  text-transform: uppercase;
@@ -2973,12 +3002,12 @@ body,
2973
3002
  white-space: nowrap;
2974
3003
  }
2975
3004
  .edge-hint-main {
2976
- font-size: 10px;
3005
+ font-size: var(--fs-meta);
2977
3006
  font-weight: 600;
2978
3007
  color: var(--c-accent);
2979
3008
  }
2980
3009
  .edge-hint-keys {
2981
- font: 9px var(--font-code);
3010
+ font: var(--fs-meta) var(--font-code);
2982
3011
  color: var(--c-dim);
2983
3012
  }
2984
3013
 
@@ -3010,7 +3039,7 @@ body,
3010
3039
  border-radius: 999px;
3011
3040
  background: color-mix(in srgb, var(--c-ok) 92%, transparent);
3012
3041
  color: var(--c-bg);
3013
- font-size: 10px;
3042
+ font-size: var(--fs-meta);
3014
3043
  font-weight: 600;
3015
3044
  white-space: nowrap;
3016
3045
  }
@@ -3033,7 +3062,7 @@ body,
3033
3062
  background: var(--c-panel-soft);
3034
3063
  border: 1px solid color-mix(in srgb, var(--c-agent) 40%, transparent);
3035
3064
  color: var(--c-agent);
3036
- font-size: 9.5px;
3065
+ font-size: var(--fs-meta);
3037
3066
  font-weight: 600;
3038
3067
  white-space: nowrap;
3039
3068
  }
@@ -3079,7 +3108,7 @@ body,
3079
3108
  border: 1px solid var(--c-line);
3080
3109
  background: none;
3081
3110
  color: var(--c-muted);
3082
- font-size: 10.5px;
3111
+ font-size: var(--fs-meta);
3083
3112
  font-weight: 600;
3084
3113
  cursor: pointer;
3085
3114
  }
@@ -3156,7 +3185,7 @@ body,
3156
3185
  gap: 2px;
3157
3186
  }
3158
3187
  .session-receipt-tile-label {
3159
- font-size: 9.5px;
3188
+ font-size: var(--fs-meta);
3160
3189
  color: var(--c-dim);
3161
3190
  }
3162
3191
  .session-receipt-tile-value {
@@ -3364,7 +3393,7 @@ body,
3364
3393
  .session-receipt-note,
3365
3394
  .session-receipt-diff {
3366
3395
  margin-top: 10px;
3367
- font-size: 10.5px;
3396
+ font-size: var(--fs-meta);
3368
3397
  line-height: 1.5;
3369
3398
  color: var(--c-muted);
3370
3399
  }
@@ -3437,7 +3466,7 @@ body,
3437
3466
  right: 0;
3438
3467
  bottom: 0;
3439
3468
  width: 312px;
3440
- box-shadow: -16px 0 40px rgba(0, 0, 0, 0.5);
3469
+ box-shadow: var(--e-2);
3441
3470
  }
3442
3471
  }
3443
3472
 
@@ -3711,7 +3740,7 @@ body,
3711
3740
  min-width: 0;
3712
3741
  }
3713
3742
  .connection-banner-meta {
3714
- font: 9.5px var(--font-code);
3743
+ font: var(--fs-meta) var(--font-code);
3715
3744
  color: var(--c-muted);
3716
3745
  }
3717
3746
  .connection-banner-progress {
@@ -3784,6 +3813,29 @@ body,
3784
3813
  background: var(--c-panel);
3785
3814
  }
3786
3815
 
3816
+ /* A floating hint would clip inside the scrolling menu. Keep its explanation in flow. */
3817
+ .top-bar-more-menu .toolbar-tooltip-anchor {
3818
+ display: flex;
3819
+ flex-direction: column;
3820
+ align-items: stretch;
3821
+ }
3822
+ .toolbar-menu.top-bar-more-menu .toolbar-tooltip {
3823
+ position: static;
3824
+ display: none;
3825
+ opacity: 1;
3826
+ transform: none;
3827
+ min-width: 0;
3828
+ max-width: 240px;
3829
+ white-space: normal;
3830
+ box-shadow: none;
3831
+ margin: 0 4px 8px;
3832
+ }
3833
+ .top-bar-more-menu .toolbar-tooltip-anchor:hover .toolbar-tooltip,
3834
+ .top-bar-more-menu .toolbar-tooltip-anchor:has(> :focus-visible) .toolbar-tooltip {
3835
+ display: flex;
3836
+ }
3837
+ .top-bar-more-menu .toolbar-tooltip::after { display: none; }
3838
+
3787
3839
  .toolbar-menu-item {
3788
3840
  display: flex;
3789
3841
  align-items: center;
@@ -3844,7 +3896,7 @@ kbd.toolbar-menu-hint {
3844
3896
 
3845
3897
  .toolbar-menu-heading {
3846
3898
  padding: 6px 12px 2px;
3847
- font-size: 10px;
3899
+ font-size: var(--fs-meta);
3848
3900
  letter-spacing: 0.08em;
3849
3901
  text-transform: uppercase;
3850
3902
  color: var(--c-dim);
@@ -3882,7 +3934,7 @@ kbd.toolbar-menu-hint {
3882
3934
  margin: 0;
3883
3935
  padding: 5px 10px;
3884
3936
  color: var(--c-muted);
3885
- font-size: 10px;
3937
+ font-size: var(--fs-meta);
3886
3938
  line-height: 1.5;
3887
3939
  }
3888
3940
 
@@ -4473,7 +4525,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4473
4525
 
4474
4526
  .canvas-node .pin-indicator {
4475
4527
  color: var(--c-accent);
4476
- font-size: calc(11px * var(--node-chrome-scale, 1));
4528
+ font-size: 11px;
4477
4529
  opacity: 0.6;
4478
4530
  }
4479
4531
 
@@ -4481,13 +4533,13 @@ html.is-node-resizing .ext-app-preview-catcher {
4481
4533
  .canvas-node .node-title-input {
4482
4534
  flex: 1;
4483
4535
  min-width: 0;
4484
- font-size: calc(12px * var(--node-chrome-scale, 1));
4536
+ font-size: calc(12px * var(--node-title-scale, 1));
4485
4537
  font-weight: 600;
4486
4538
  color: var(--c-text);
4487
4539
  background: var(--c-surface-hover);
4488
4540
  border: 1px solid var(--c-accent);
4489
- border-radius: calc(3px * var(--node-chrome-scale, 1));
4490
- padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
4541
+ border-radius: 3px;
4542
+ padding: 1px 6px;
4491
4543
  outline: none;
4492
4544
  font-family: inherit;
4493
4545
  }
@@ -4518,18 +4570,28 @@ html.is-node-resizing .ext-app-preview-catcher {
4518
4570
  text-align: left;
4519
4571
  }
4520
4572
 
4521
- .context-menu-item:hover {
4573
+ .context-menu-item:hover:not(:disabled), .context-menu-item:focus-visible {
4522
4574
  background: color-mix(in srgb, var(--c-accent) 10%, transparent);
4523
4575
  color: var(--c-accent);
4524
4576
  }
4525
4577
 
4578
+ .context-menu-item:focus-visible {
4579
+ outline: 2px solid var(--c-accent);
4580
+ outline-offset: -2px;
4581
+ }
4582
+
4583
+ .context-menu-item:disabled {
4584
+ color: var(--c-muted);
4585
+ cursor: default;
4586
+ }
4587
+
4526
4588
  .context-menu-item.is-danger .context-menu-label {
4527
4589
  color: var(--c-danger);
4528
4590
  }
4529
4591
 
4530
4592
  .context-menu-shortcut {
4531
4593
  color: var(--c-muted);
4532
- font-size: 10px;
4594
+ font-size: var(--fs-meta);
4533
4595
  margin-left: 16px;
4534
4596
  }
4535
4597
 
@@ -4559,7 +4621,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4559
4621
 
4560
4622
  .context-menu-section-label {
4561
4623
  color: var(--c-muted);
4562
- font-size: 10px;
4624
+ font-size: var(--fs-meta);
4563
4625
  font-weight: 600;
4564
4626
  letter-spacing: 0.08em;
4565
4627
  text-transform: uppercase;
@@ -4743,9 +4805,9 @@ html.is-node-resizing .ext-app-preview-catcher {
4743
4805
  .relations-panel { width: auto; flex: none; border-left: 0; border-top: 1px solid var(--c-line); overflow: visible; }
4744
4806
  }
4745
4807
 
4746
- /* Trace nodes — compact pills for agent tool/subagent visualization */
4808
+ /* Types1: trace cards share the node shell, with a violet running mark. */
4747
4809
  .canvas-node.trace-node {
4748
- border-radius: 28px;
4810
+ border-radius: var(--r-node);
4749
4811
  min-height: 0;
4750
4812
  }
4751
4813
 
@@ -4764,19 +4826,27 @@ html.is-node-resizing .ext-app-preview-catcher {
4764
4826
  }
4765
4827
 
4766
4828
  .canvas-node.trace-node.trace-running {
4767
- border-color: var(--c-accent);
4768
- animation: trace-pulse 2s ease-in-out infinite;
4769
- }
4770
-
4771
- @keyframes trace-pulse {
4772
- 0%,
4773
- 100% {
4774
- box-shadow: 0 0 0 0 color-mix(in srgb, var(--c-accent) 30%, transparent);
4775
- }
4776
- 50% {
4777
- box-shadow: 0 0 0 4px color-mix(in srgb, var(--c-accent) 15%, transparent);
4778
- }
4779
- }
4829
+ border-top: 3px solid var(--c-agent);
4830
+ }
4831
+
4832
+ .context-node { display: flex; flex-direction: column; gap: 8px; font-size: var(--fs-ui); }
4833
+ .context-node-expanded { max-width: 760px; margin: 0 auto; }
4834
+ .context-node-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
4835
+ .context-usage { display: flex; align-items: center; gap: 8px; font-size: var(--fs-meta); color: var(--c-muted); flex-wrap: wrap; }
4836
+ .context-usage-track { display: inline-block; width: 64px; height: 4px; overflow: hidden; border-radius: var(--r-pill); background: var(--c-line); }
4837
+ .context-usage-track > span, .status-progress > div { display: block; height: 100%; }
4838
+ .context-node-label { color: var(--c-muted); font-size: var(--fs-meta); font-weight: 600; }
4839
+ .context-row { display: block; padding: 8px 0; border-top: 1px solid var(--c-line); overflow-wrap: anywhere; }
4840
+ .context-row-title { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; }
4841
+ .context-row-title > span { flex-shrink: 0; font-size: var(--fs-meta); color: var(--c-muted); }
4842
+ .context-row-title > .context-row-warning { color: var(--c-warn); }
4843
+ .context-row-meta, .context-row-summary { color: var(--c-muted); font-size: var(--fs-meta); line-height: 1.5; }
4844
+ .context-row-summary { white-space: pre-wrap; }
4845
+ .context-row-open { margin-top: 6px; padding: 4px 8px; background: var(--c-panel-soft); border: 1px solid var(--c-line); border-radius: var(--r-control); color: var(--c-text); font-size: var(--fs-meta); cursor: pointer; }
4846
+ .status-progress { height: 4px; background: var(--c-line); border-radius: var(--r-pill); overflow: hidden; }
4847
+ .node-file-toolbar { min-width: 0; max-width: 50%; }
4848
+ .file-toolbar-metadata { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; }
4849
+ .prompt-key-hint { padding: 2px 6px; border: 1px solid var(--c-line); border-radius: var(--r-control); color: var(--c-muted); font: var(--fs-meta) var(--font-ui); }
4780
4850
 
4781
4851
  /* Diff nodes — unified diff viewer with per-file sections */
4782
4852
  .diff-node {
@@ -4858,7 +4928,7 @@ html.is-node-resizing .ext-app-preview-catcher {
4858
4928
  flex-shrink: 0;
4859
4929
  padding: 4px 10px;
4860
4930
  color: var(--c-muted);
4861
- font-size: 10px;
4931
+ font-size: var(--fs-meta);
4862
4932
  }
4863
4933
 
4864
4934
  /* Own scroll port so a wide CSV scrolls inside the node instead of blowing out
@@ -4933,23 +5003,59 @@ html.is-node-resizing .ext-app-preview-catcher {
4933
5003
  }
4934
5004
 
4935
5005
  /* MCP app iframe */
5006
+ .viewer-host, .mermaid-viewer, .mermaid-diagram, .ext-app-viewer {
5007
+ position: relative;
5008
+ display: flex;
5009
+ flex-direction: column;
5010
+ flex: 1;
5011
+ width: 100%;
5012
+ height: 100%;
5013
+ min-width: 0;
5014
+ min-height: 0;
5015
+ }
5016
+ .mermaid-viewer { overflow: auto; }
5017
+ .mermaid-diagram > svg { display: block; flex-shrink: 0; }
5018
+ .ext-app-frame { width: 100%; height: 100%; border: 0; background: transparent; }
5019
+ .ext-app-preview-catcher { position: absolute; inset: 0; z-index: 3; border: 0; padding: 0; background: transparent; cursor: zoom-in; }
5020
+ .ext-app-session-notice { padding: 8px 12px; font-size: var(--fs-meta); color: var(--c-warn); }
5021
+ .viewer-placeholder, .viewer-fallback {
5022
+ display: flex;
5023
+ flex-direction: column;
5024
+ align-items: center;
5025
+ justify-content: center;
5026
+ gap: 8px;
5027
+ padding: 16px;
5028
+ height: 100%;
5029
+ color: var(--c-muted);
5030
+ font-size: var(--fs-ui);
5031
+ }
5032
+ .viewer-fallback { position: absolute; inset: 0; z-index: 2; background: var(--c-panel); }
5033
+ .viewer-fallback-retained { top: auto; height: auto; flex-direction: row; }
5034
+ .viewer-placeholder button, .viewer-fallback button {
5035
+ padding: 4px 12px;
5036
+ border: 1px solid var(--c-line);
5037
+ border-radius: var(--r-control);
5038
+ color: var(--c-text);
5039
+ background: var(--c-panel-soft);
5040
+ }
5041
+ .canvas-node:is([data-node-type="html"], [data-node-type="json-render"], [data-node-type="graph"], [data-node-type="mcp-app"], [data-node-type="mermaid"]) .node-body { padding: 0; display: flex; flex-direction: column; }
4936
5042
  .mcp-app-frame-stack {
4937
5043
  position: relative;
4938
5044
  isolation: isolate;
4939
5045
  flex: 1;
4940
5046
  min-width: 0;
4941
5047
  min-height: 0;
4942
- background: var(--c-panel-soft);
5048
+ background: var(--c-panel);
4943
5049
  overflow: hidden;
4944
- border-radius: 0 0 calc(var(--radius) - 1px) calc(var(--radius) - 1px);
5050
+ border-radius: 0;
4945
5051
  }
4946
5052
 
4947
5053
  .mcp-app-frame-stack:has(.html-node-frame) {
4948
5054
  width: 100%;
4949
5055
  height: 100%;
4950
- min-height: 300px;
4951
- background: var(--c-bg);
4952
- border-radius: 6px;
5056
+ min-height: 0;
5057
+ background: var(--c-panel);
5058
+ border-radius: 0;
4953
5059
  }
4954
5060
 
4955
5061
  .mcp-app-frame-stack:has(.html-node-frame-presentation) {
@@ -5292,7 +5398,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5292
5398
  backdrop-filter: blur(12px);
5293
5399
  border: 1px solid var(--c-line);
5294
5400
  border-radius: 10px;
5295
- box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
5401
+ box-shadow: var(--e-2);
5296
5402
  z-index: 66;
5297
5403
  white-space: nowrap;
5298
5404
  }
@@ -5481,25 +5587,22 @@ html.is-node-resizing .ext-app-preview-catcher {
5481
5587
 
5482
5588
  .attention-history-tab {
5483
5589
  position: absolute;
5484
- top: 60px;
5485
- right: 0;
5590
+ top: 7px;
5591
+ right: 8px;
5486
5592
  display: flex;
5487
5593
  align-items: center;
5488
- gap: 8px;
5489
- padding: 8px 12px 8px 14px;
5490
- background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
5491
- backdrop-filter: blur(16px);
5492
- border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-accent) 18%);
5493
- border-right: 0;
5494
- border-radius: 14px 0 0 14px;
5495
- box-shadow: 0 12px 36px var(--c-shadow);
5496
- color: var(--c-text);
5594
+ gap: 6px;
5595
+ height: 30px;
5596
+ padding: 0 10px;
5597
+ background: var(--c-panel);
5598
+ border: 1px solid var(--c-line);
5599
+ border-radius: var(--r-pill);
5600
+ box-shadow: var(--e-2);
5601
+ color: var(--c-text-soft);
5497
5602
  cursor: pointer;
5498
5603
  font: inherit;
5499
- font-size: 11px;
5500
- font-weight: 600;
5501
- letter-spacing: 0.08em;
5502
- text-transform: uppercase;
5604
+ font-size: var(--fs-ui);
5605
+ font-weight: 500;
5503
5606
  z-index: 60;
5504
5607
  }
5505
5608
 
@@ -5519,17 +5622,12 @@ html.is-node-resizing .ext-app-preview-catcher {
5519
5622
  }
5520
5623
 
5521
5624
  .attention-history-tab-badge {
5522
- min-width: 18px;
5523
- height: 18px;
5524
- padding: 0 5px;
5525
5625
  display: inline-flex;
5526
5626
  align-items: center;
5527
5627
  justify-content: center;
5528
- border-radius: 9px;
5529
- background: var(--c-accent);
5530
- color: var(--c-contrast-fg);
5531
- font-size: 10px;
5532
- font-weight: 700;
5628
+ color: var(--c-accent);
5629
+ font-size: var(--fs-ui);
5630
+ font-weight: 500;
5533
5631
  letter-spacing: 0;
5534
5632
  text-transform: none;
5535
5633
  }
@@ -5613,7 +5711,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5613
5711
  }
5614
5712
 
5615
5713
  .attention-history-time {
5616
- font-size: 10px;
5714
+ font-size: var(--fs-meta);
5617
5715
  color: var(--c-dim);
5618
5716
  white-space: nowrap;
5619
5717
  }
@@ -5788,17 +5886,15 @@ html.is-node-resizing .ext-app-preview-catcher {
5788
5886
  max-width: 70%;
5789
5887
  }
5790
5888
  .group-name {
5791
- font-size: 10px;
5792
- font-weight: 700;
5793
- letter-spacing: 0.08em;
5794
- text-transform: uppercase;
5795
- color: var(--group-color, var(--c-accent));
5889
+ font-size: var(--fs-ui);
5890
+ font-weight: 600;
5891
+ color: var(--c-text);
5796
5892
  white-space: nowrap;
5797
5893
  overflow: hidden;
5798
5894
  text-overflow: ellipsis;
5799
5895
  }
5800
5896
  .group-count {
5801
- font: 9px var(--font-code);
5897
+ font: var(--fs-meta) var(--font-ui);
5802
5898
  color: var(--c-dim);
5803
5899
  }
5804
5900
  .group-title-input {
@@ -5858,7 +5954,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5858
5954
  background: var(--c-panel);
5859
5955
  border: 1px solid var(--c-line);
5860
5956
  border-radius: 8px;
5861
- box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
5957
+ box-shadow: var(--e-2);
5862
5958
  z-index: 20;
5863
5959
  }
5864
5960
  .group-menu button {
@@ -5917,10 +6013,8 @@ html.is-node-resizing .ext-app-preview-catcher {
5917
6013
  cursor: pointer;
5918
6014
  }
5919
6015
  .group-chip-name {
5920
- font-size: 10px;
5921
- font-weight: 700;
5922
- letter-spacing: 0.08em;
5923
- text-transform: uppercase;
6016
+ font-size: var(--fs-ui);
6017
+ font-weight: 600;
5924
6018
  color: var(--group-color, var(--c-accent));
5925
6019
  white-space: nowrap;
5926
6020
  }
@@ -5938,7 +6032,7 @@ html.is-node-resizing .ext-app-preview-catcher {
5938
6032
  opacity: 0.8;
5939
6033
  }
5940
6034
  .group-chip-count {
5941
- font: 9px var(--font-code);
6035
+ font: var(--fs-meta) var(--font-code);
5942
6036
  color: var(--c-dim);
5943
6037
  }
5944
6038
 
@@ -5957,12 +6051,12 @@ html.is-node-resizing .ext-app-preview-catcher {
5957
6051
  white-space: nowrap;
5958
6052
  }
5959
6053
  .drop-pill-text {
5960
- font-size: 10px;
6054
+ font-size: var(--fs-meta);
5961
6055
  font-weight: 600;
5962
6056
  color: var(--c-accent);
5963
6057
  }
5964
6058
  .drop-pill-hint {
5965
- font: 9px var(--font-code);
6059
+ font: var(--fs-meta) var(--font-code);
5966
6060
  color: var(--c-dim);
5967
6061
  }
5968
6062
 
@@ -5986,13 +6080,60 @@ html.is-node-resizing .ext-app-preview-catcher {
5986
6080
  flex-direction: column;
5987
6081
  background: var(--c-panel);
5988
6082
  border: 1px solid var(--c-line);
5989
- border-radius: 14px;
5990
- box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
6083
+ border-radius: var(--r-overlay);
6084
+ box-shadow: var(--e-2);
5991
6085
  overflow: hidden;
5992
6086
  }
5993
6087
  .expanded-overlay-panel.is-pinned {
5994
6088
  border-color: color-mix(in srgb, var(--c-pin) 45%, var(--c-line));
5995
6089
  }
6090
+ /* AX step footer (AxStepControls). The expanded overlay places it as a sibling of
6091
+ its padded content area (--ax-dock-bleed: 0) and keeps it stuck to the bottom. */
6092
+ .ax-step-dock {
6093
+ position: sticky;
6094
+ bottom: calc(-1 * var(--ax-dock-bleed, 12px));
6095
+ margin: 12px calc(-1 * var(--ax-dock-bleed, 12px)) calc(-1 * var(--ax-dock-bleed, 12px));
6096
+ padding: 9px var(--ax-dock-pad, 12px) 10px;
6097
+ background: var(--c-panel-overlay);
6098
+ border-top: 1px solid var(--c-line);
6099
+ backdrop-filter: blur(6px);
6100
+ }
6101
+ /* On a card the step is one body and one footer row: the step controls beside the
6102
+ card's own actions. Rows: content (scrolls by itself, never taller than it needs),
6103
+ extras, free space, footer. Nothing bleeds past the body, so it never scrolls. */
6104
+ .canvas-node .node-body:has(> .ax-step-dock) {
6105
+ display: grid;
6106
+ grid-template: minmax(0, max-content) auto 1fr auto / minmax(0, 1fr) auto;
6107
+ padding: 0;
6108
+ overflow: hidden;
6109
+ }
6110
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview { display: contents; }
6111
+ .canvas-node .node-body:has(> .ax-step-dock) > :first-child:not(.md-card-preview),
6112
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > .md-card-content {
6113
+ grid-area: 1 / 1 / 2 / -1;
6114
+ min-height: 0;
6115
+ overflow: auto;
6116
+ padding: 10px 14px;
6117
+ }
6118
+ .canvas-node .node-body:has(> .ax-step-dock) > :not(.ax-step-dock),
6119
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > * {
6120
+ grid-column: 1 / -1;
6121
+ }
6122
+ .canvas-node .node-body > .ax-step-dock,
6123
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > .md-card-actions {
6124
+ grid-row: 4;
6125
+ position: static;
6126
+ margin: 0;
6127
+ background: var(--c-panel);
6128
+ border-top: 1px solid var(--c-line);
6129
+ backdrop-filter: none;
6130
+ }
6131
+ .canvas-node .node-body > .ax-step-dock { grid-column: 1; padding: 6px 4px 6px 12px; }
6132
+ .canvas-node .node-body:has(> .ax-step-dock) > .md-card-preview > .md-card-actions {
6133
+ grid-column: 2;
6134
+ align-items: flex-start;
6135
+ padding: 6px 36px 6px 4px;
6136
+ }
5996
6137
  .expanded-overlay-panel .ax-step-dock {
5997
6138
  /* Its sticky/backdrop-filter context must paint hints above the Source FAB. */
5998
6139
  z-index: 2;
@@ -6030,7 +6171,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6030
6171
  min-width: 0;
6031
6172
  }
6032
6173
  .expanded-kind-pill {
6033
- font-size: 9px;
6174
+ font-size: var(--fs-meta);
6034
6175
  font-weight: 600;
6035
6176
  padding: 2px 8px;
6036
6177
  border-radius: 999px;
@@ -6081,7 +6222,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6081
6222
  padding: 8px 16px;
6082
6223
  border-top: 1px solid var(--c-line);
6083
6224
  background: color-mix(in srgb, var(--c-bg) 50%, transparent);
6084
- font: 9.5px var(--font-code);
6225
+ font: var(--fs-meta) var(--font-code);
6085
6226
  color: var(--c-dim);
6086
6227
  flex-shrink: 0;
6087
6228
  }
@@ -6095,6 +6236,10 @@ html.is-node-resizing .ext-app-preview-catcher {
6095
6236
  }
6096
6237
 
6097
6238
  .expanded-action-btn {
6239
+ display: inline-flex;
6240
+ align-items: center;
6241
+ gap: 6px;
6242
+ white-space: nowrap;
6098
6243
  padding: 3px 10px;
6099
6244
  font-size: 11px;
6100
6245
  font-weight: 600;
@@ -6106,6 +6251,12 @@ html.is-node-resizing .ext-app-preview-catcher {
6106
6251
  font-family: var(--font-ui);
6107
6252
  }
6108
6253
 
6254
+ @media (max-width: 760px) {
6255
+ .expanded-header { height: auto; min-height: 46px; flex-wrap: wrap; row-gap: 8px; padding: 10px 16px; }
6256
+ .expanded-title { flex: 1; }
6257
+ .expanded-actions { order: 1; flex-basis: 100%; flex-wrap: wrap; }
6258
+ }
6259
+
6109
6260
  .expanded-action-btn:hover {
6110
6261
  background: var(--c-surface-hover);
6111
6262
  color: var(--c-text);
@@ -6136,7 +6287,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6136
6287
  }
6137
6288
 
6138
6289
  .expanded-meta {
6139
- font-size: 10px;
6290
+ font-size: var(--fs-meta);
6140
6291
  color: var(--c-muted);
6141
6292
  padding: 0 4px;
6142
6293
  }
@@ -6213,18 +6364,18 @@ html.is-node-resizing .ext-app-preview-catcher {
6213
6364
  .node-context-mark {
6214
6365
  display: inline-flex;
6215
6366
  align-items: center;
6216
- gap: calc(4px * var(--node-chrome-scale, 1));
6217
- height: calc(20px * var(--node-chrome-scale, 1));
6218
- padding: 0 calc(7px * var(--node-chrome-scale, 1));
6367
+ gap: 4px;
6368
+ height: 20px;
6369
+ padding: 0 7px;
6219
6370
  border-radius: var(--r-pill);
6220
- font-size: calc(var(--fs-meta) * var(--node-chrome-scale, 1));
6371
+ font-size: var(--fs-meta);
6221
6372
  font-weight: 500;
6222
6373
  white-space: nowrap;
6223
6374
  flex-shrink: 0;
6224
6375
  }
6225
6376
  .node-context-mark svg {
6226
- width: calc(12px * var(--node-chrome-scale, 1));
6227
- height: calc(12px * var(--node-chrome-scale, 1));
6377
+ width: 12px;
6378
+ height: 12px;
6228
6379
  fill: none;
6229
6380
  stroke: currentColor;
6230
6381
  stroke-width: 2;
@@ -6249,8 +6400,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6249
6400
  .node-context-mark.is-glyph,
6250
6401
  .node-near-mark.is-glyph {
6251
6402
  justify-content: center;
6252
- width: calc(22px * var(--node-chrome-scale, 1));
6253
- height: calc(22px * var(--node-chrome-scale, 1));
6403
+ width: 22px;
6404
+ height: 22px;
6254
6405
  padding: 0;
6255
6406
  box-sizing: border-box;
6256
6407
  }
@@ -6262,20 +6413,20 @@ html.is-node-resizing .ext-app-preview-catcher {
6262
6413
  cursor: pointer;
6263
6414
  display: inline-flex;
6264
6415
  align-items: center;
6265
- gap: calc(4px * var(--node-chrome-scale, 1));
6266
- height: calc(18px * var(--node-chrome-scale, 1));
6267
- padding: 0 calc(7px * var(--node-chrome-scale, 1));
6416
+ gap: 4px;
6417
+ height: 18px;
6418
+ padding: 0 7px;
6268
6419
  border: 1px dotted var(--c-pin);
6269
6420
  border-radius: var(--r-pill);
6270
6421
  color: color-mix(in srgb, var(--c-pin) 75%, var(--c-text));
6271
- font-size: calc(var(--fs-meta) * var(--node-chrome-scale, 1));
6422
+ font-size: var(--fs-meta);
6272
6423
  font-weight: 500;
6273
6424
  white-space: nowrap;
6274
6425
  flex-shrink: 0;
6275
6426
  }
6276
6427
  .node-near-mark svg {
6277
- width: calc(12px * var(--node-chrome-scale, 1));
6278
- height: calc(12px * var(--node-chrome-scale, 1));
6428
+ width: 12px;
6429
+ height: 12px;
6279
6430
  }
6280
6431
  .node-near-ring {
6281
6432
  fill: none;
@@ -6438,15 +6589,15 @@ html.is-node-resizing .ext-app-preview-catcher {
6438
6589
 
6439
6590
  /* The drawn 18 px circle sits inside the standard control hit target. */
6440
6591
  .ctx-pin-mark {
6441
- width: calc(18px * var(--node-chrome-scale, 1));
6442
- height: calc(18px * var(--node-chrome-scale, 1));
6592
+ width: 18px;
6593
+ height: 18px;
6443
6594
  box-sizing: border-box;
6444
6595
  border: 1.5px solid var(--c-muted);
6445
6596
  border-radius: var(--r-pill);
6446
6597
  display: flex;
6447
6598
  align-items: center;
6448
6599
  justify-content: center;
6449
- font-size: calc(13px * var(--node-chrome-scale, 1));
6600
+ font-size: 13px;
6450
6601
  color: var(--c-text-soft);
6451
6602
  }
6452
6603
 
@@ -6484,7 +6635,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6484
6635
  .board-pin-btn .ctx-pin-mark {
6485
6636
  width: 18px;
6486
6637
  height: 18px;
6487
- font-size: 10px;
6638
+ font-size: var(--fs-meta);
6488
6639
  }
6489
6640
 
6490
6641
  /* ── Context pin HUD — top-right pill ────────────────────────── */
@@ -6527,7 +6678,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6527
6678
 
6528
6679
  .thread-turn-assistant {
6529
6680
  padding: 6px 0;
6530
- border-left: 2px solid color-mix(in srgb, var(--c-ok) 20%, transparent);
6681
+ border-left: 2px solid color-mix(in srgb, var(--c-agent) 35%, transparent);
6531
6682
  padding-left: 10px;
6532
6683
  margin-left: 2px;
6533
6684
  overflow: hidden;
@@ -6545,10 +6696,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6545
6696
  }
6546
6697
 
6547
6698
  .thread-turn-role {
6548
- font-size: 10px;
6549
- font-weight: 700;
6550
- text-transform: uppercase;
6551
- letter-spacing: 0.04em;
6699
+ font-size: var(--fs-meta);
6700
+ font-weight: 600;
6552
6701
  margin-bottom: 3px;
6553
6702
  display: flex;
6554
6703
  align-items: center;
@@ -6571,11 +6720,11 @@ html.is-node-resizing .ext-app-preview-catcher {
6571
6720
  }
6572
6721
 
6573
6722
  .thread-turn-assistant .thread-turn-role {
6574
- color: var(--c-ok);
6723
+ color: var(--c-agent);
6575
6724
  }
6576
6725
 
6577
6726
  .thread-turn-assistant .status-dot {
6578
- background: var(--c-ok);
6727
+ background: var(--c-agent);
6579
6728
  }
6580
6729
 
6581
6730
  .thread-turn-assistant .status-dot.pulsing {
@@ -6629,7 +6778,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6629
6778
  flex-direction: column;
6630
6779
  background: var(--c-panel-soft);
6631
6780
  border-left: 1px solid var(--c-line);
6632
- box-shadow: -16px 0 40px rgba(0, 0, 0, 0.45);
6781
+ box-shadow: var(--e-2);
6633
6782
  /* Above the receipt it is opened from, below the rail popovers. */
6634
6783
  z-index: 9999;
6635
6784
  overflow: hidden;
@@ -6658,7 +6807,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6658
6807
  color: var(--c-text);
6659
6808
  }
6660
6809
  .snapshot-panel-sub {
6661
- font-size: 10px;
6810
+ font-size: var(--fs-meta);
6662
6811
  color: var(--c-dim);
6663
6812
  }
6664
6813
  .snapshot-panel-spacer {
@@ -6714,7 +6863,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6714
6863
  }
6715
6864
  .snapshot-restore-note {
6716
6865
  padding: 0 12px 8px;
6717
- font-size: 9.5px;
6866
+ font-size: var(--fs-meta);
6718
6867
  color: var(--c-dim);
6719
6868
  }
6720
6869
 
@@ -6734,7 +6883,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6734
6883
  }
6735
6884
  .snapshot-section-header {
6736
6885
  margin: 10px 2px 4px;
6737
- font-size: 10px;
6886
+ font-size: var(--fs-meta);
6738
6887
  font-weight: 700;
6739
6888
  letter-spacing: 0.08em;
6740
6889
  text-transform: uppercase;
@@ -6781,12 +6930,12 @@ html.is-node-resizing .ext-app-preview-catcher {
6781
6930
  color: var(--c-text);
6782
6931
  }
6783
6932
  .snapshot-item-time {
6784
- font: 9px var(--font-code);
6933
+ font: var(--fs-meta) var(--font-code);
6785
6934
  color: var(--c-dim);
6786
6935
  }
6787
6936
  .snapshot-item-meta {
6788
6937
  margin-top: 3px;
6789
- font-size: 10.5px;
6938
+ font-size: var(--fs-meta);
6790
6939
  color: var(--c-muted);
6791
6940
  }
6792
6941
  .snapshot-item-diff {
@@ -6804,7 +6953,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6804
6953
  border-radius: 6px;
6805
6954
  background: none;
6806
6955
  color: var(--c-muted);
6807
- font-size: 10.5px;
6956
+ font-size: var(--fs-meta);
6808
6957
  font-weight: 600;
6809
6958
  cursor: pointer;
6810
6959
  }
@@ -6842,7 +6991,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6842
6991
  .snapshot-panel-foot {
6843
6992
  padding: 9px 14px;
6844
6993
  border-top: 1px solid var(--c-line);
6845
- font-size: 9.5px;
6994
+ font-size: var(--fs-meta);
6846
6995
  color: var(--c-dim);
6847
6996
  flex-shrink: 0;
6848
6997
  }
@@ -6868,8 +7017,8 @@ html.is-node-resizing .ext-app-preview-catcher {
6868
7017
  flex-direction: column;
6869
7018
  background: var(--c-panel);
6870
7019
  border: 1px solid var(--c-line);
6871
- border-radius: 12px;
6872
- box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
7020
+ border-radius: var(--r-overlay);
7021
+ box-shadow: var(--e-2);
6873
7022
  overflow: hidden;
6874
7023
  animation: command-palette-in 0.12s ease-out;
6875
7024
  align-self: flex-start;
@@ -6906,7 +7055,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6906
7055
  padding: 1px 6px;
6907
7056
  border: 1px solid var(--c-line);
6908
7057
  border-radius: 4px;
6909
- font: 9.5px var(--font-code);
7058
+ font: var(--fs-meta) var(--font-code);
6910
7059
  color: var(--c-muted);
6911
7060
  }
6912
7061
  .command-palette-esc {
@@ -6928,7 +7077,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6928
7077
  }
6929
7078
  .command-palette-group {
6930
7079
  padding: 6px 10px 4px;
6931
- font-size: 9px;
7080
+ font-size: var(--fs-meta);
6932
7081
  font-weight: 700;
6933
7082
  letter-spacing: 0.08em;
6934
7083
  text-transform: uppercase;
@@ -6992,7 +7141,7 @@ html.is-node-resizing .ext-app-preview-catcher {
6992
7141
  padding: 8px 14px;
6993
7142
  border-top: 1px solid var(--c-line);
6994
7143
  background: color-mix(in srgb, var(--c-bg) 50%, transparent);
6995
- font: 9.5px var(--font-code);
7144
+ font: var(--fs-meta) var(--font-code);
6996
7145
  color: var(--c-dim);
6997
7146
  }
6998
7147
  .command-palette-hint-spacer {
@@ -7020,7 +7169,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7020
7169
  backdrop-filter: blur(16px);
7021
7170
  border: 1px solid var(--c-line);
7022
7171
  border-radius: var(--radius);
7023
- box-shadow: 0 12px 40px var(--c-shadow-heavy), 0 0 0 1px rgba(255,255,255,0.04);
7172
+ box-shadow: var(--e-2);
7024
7173
  overflow: hidden;
7025
7174
  animation: command-palette-in 0.12s ease-out;
7026
7175
  }
@@ -7040,7 +7189,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7040
7189
  }
7041
7190
 
7042
7191
  .shortcut-overlay-hint {
7043
- font-size: 10px;
7192
+ font-size: var(--fs-meta);
7044
7193
  color: var(--c-dim);
7045
7194
  }
7046
7195
  .shortcut-overlay-hint kbd {
@@ -7050,7 +7199,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7050
7199
  border-radius: 3px;
7051
7200
  padding: 0 4px;
7052
7201
  font-family: var(--font-ui);
7053
- font-size: 9px;
7202
+ font-size: var(--fs-meta);
7054
7203
  line-height: 1.6;
7055
7204
  margin: 0 2px;
7056
7205
  }
@@ -7070,7 +7219,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7070
7219
  }
7071
7220
 
7072
7221
  .shortcut-group-title {
7073
- font-size: 10px;
7222
+ font-size: var(--fs-meta);
7074
7223
  font-weight: 600;
7075
7224
  text-transform: uppercase;
7076
7225
  letter-spacing: 0.06em;
@@ -7228,18 +7377,18 @@ html.is-node-resizing .ext-app-preview-catcher {
7228
7377
  padding: 1px 6px;
7229
7378
  border: 1px solid var(--c-line);
7230
7379
  border-radius: 4px;
7231
- font: 9.5px var(--font-code);
7380
+ font: var(--fs-meta) var(--font-code);
7232
7381
  color: var(--c-dim);
7233
7382
  }
7234
7383
  .empty-state-action-hint {
7235
- font-size: 10px;
7384
+ font-size: var(--fs-meta);
7236
7385
  color: var(--c-dim);
7237
7386
  }
7238
7387
  .empty-state-hint {
7239
7388
  background: none;
7240
7389
  border: none;
7241
7390
  padding: 0;
7242
- font: 10.5px var(--font-code);
7391
+ font: var(--fs-meta) var(--font-code);
7243
7392
  color: var(--c-dim);
7244
7393
  cursor: pointer;
7245
7394
  }
@@ -7306,7 +7455,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7306
7455
  }
7307
7456
 
7308
7457
  .image-node-warning-title {
7309
- font-size: 10px;
7458
+ font-size: var(--fs-meta);
7310
7459
  font-weight: 700;
7311
7460
  letter-spacing: 0.06em;
7312
7461
  text-transform: uppercase;
@@ -7372,7 +7521,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7372
7521
 
7373
7522
  .image-node-error-path {
7374
7523
  font-family: var(--font-code);
7375
- font-size: 10px;
7524
+ font-size: var(--fs-meta);
7376
7525
  color: var(--c-muted);
7377
7526
  word-break: break-all;
7378
7527
  max-width: 250px;
@@ -7405,7 +7554,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7405
7554
  padding: 4px 10px;
7406
7555
  border-top: 1px solid var(--c-line);
7407
7556
  background: var(--c-panel-soft);
7408
- font-size: 10px;
7557
+ font-size: var(--fs-meta);
7409
7558
  color: var(--c-dim);
7410
7559
  gap: 8px;
7411
7560
  min-height: 24px;
@@ -7433,7 +7582,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7433
7582
  border-radius: 3px;
7434
7583
  padding: 1px 6px;
7435
7584
  font: inherit;
7436
- font-size: 10px;
7585
+ font-size: var(--fs-meta);
7437
7586
  color: var(--c-accent);
7438
7587
  cursor: pointer;
7439
7588
  }
@@ -7597,7 +7746,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7597
7746
  border-radius: 999px;
7598
7747
  background: var(--c-accent);
7599
7748
  color: var(--c-bg);
7600
- font-size: 10px;
7749
+ font-size: var(--fs-meta);
7601
7750
  font-weight: 700;
7602
7751
  }
7603
7752
 
@@ -7616,7 +7765,7 @@ html.is-node-resizing .ext-app-preview-catcher {
7616
7765
  }
7617
7766
 
7618
7767
  .intent-confidence {
7619
- font-size: 10px;
7768
+ font-size: var(--fs-meta);
7620
7769
  font-variant-numeric: tabular-nums;
7621
7770
  color: var(--c-muted);
7622
7771
  }
@@ -7735,10 +7884,17 @@ html.is-node-dragging .intent-line-layer {
7735
7884
  inset: 0;
7736
7885
  z-index: 99;
7737
7886
  }
7738
- .presentation-exit {
7887
+ .presentation-controls {
7739
7888
  position: absolute;
7740
7889
  top: 16px;
7741
7890
  right: 16px;
7891
+ max-width: calc(100% - 32px);
7892
+ display: flex;
7893
+ flex-wrap: wrap;
7894
+ justify-content: flex-end;
7895
+ gap: 8px;
7896
+ }
7897
+ .presentation-controls button {
7742
7898
  box-shadow: 0 2px 12px var(--c-shadow);
7743
7899
  }
7744
7900
  .presentation-error {
@@ -7827,7 +7983,7 @@ html.is-node-dragging .intent-line-layer {
7827
7983
  }
7828
7984
  .board-switcher-item-folder { font-size: 11px; line-height: 1.4; color: var(--c-dim); overflow-wrap: anywhere; }
7829
7985
  .board-switcher-item-meta {
7830
- font-size: 10px;
7986
+ font-size: var(--fs-meta);
7831
7987
  color: var(--c-dim);
7832
7988
  white-space: nowrap;
7833
7989
  align-self: flex-start;
@@ -8761,6 +8917,7 @@ html.is-node-dragging .intent-line-layer {
8761
8917
  .attachment-node a, .md-import-source a { color: var(--c-accent); }
8762
8918
  .attachment-status { font-weight: 600; }
8763
8919
  .attachment-button,
8920
+ .presentation-step,
8764
8921
  .presentation-exit,
8765
8922
  .export-dialog-links a {
8766
8923
  min-height: 38px;
@@ -8776,12 +8933,15 @@ html.is-node-dragging .intent-line-layer {
8776
8933
  .attachment-button.is-primary,
8777
8934
  .export-dialog-links a.is-primary { background: var(--c-accent); border-color: var(--c-accent); color: var(--c-bg); }
8778
8935
  .attachment-button:hover:not(:disabled),
8936
+ .presentation-step:hover:not([aria-disabled="true"]),
8779
8937
  .presentation-exit:hover,
8780
8938
  .export-dialog-links a:hover { filter: brightness(1.12); }
8781
8939
  .attachment-button:focus-visible,
8940
+ .presentation-step:focus-visible,
8782
8941
  .presentation-exit:focus-visible,
8783
8942
  .export-dialog-links a:focus-visible { outline: 2px solid var(--c-accent); outline-offset: 3px; }
8784
- .attachment-button:disabled { opacity: 0.5; cursor: default; }
8943
+ .attachment-button:disabled,
8944
+ .presentation-step[aria-disabled="true"] { opacity: 0.5; cursor: default; }
8785
8945
  .attachment-review { width: 100%; border-top: 1px solid var(--c-line); padding-top: 12px; }
8786
8946
  .attachment-review-actions {
8787
8947
  position: sticky;