pmx-canvas 0.4.8 → 0.5.1

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 (212) hide show
  1. package/.github/extensions/pmx-canvas/extension.mjs +154 -5
  2. package/.github/extensions/pmx-canvas/steering-delivery.mjs +79 -0
  3. package/CHANGELOG.md +156 -0
  4. package/Readme.md +72 -23
  5. package/dist/canvas/global.css +3071 -796
  6. package/dist/canvas/index.js +122 -104
  7. package/dist/json-render/index.css +1 -1
  8. package/dist/types/cli/agent.d.ts +1 -0
  9. package/dist/types/cli/commands/pump.d.ts +9 -0
  10. package/dist/types/client/App.d.ts +1 -1
  11. package/dist/types/client/canvas/AgentPresenceLayer.d.ts +11 -0
  12. package/dist/types/client/canvas/BarHint.d.ts +22 -0
  13. package/dist/types/client/canvas/CanvasNode.d.ts +5 -0
  14. package/dist/types/client/canvas/CanvasViewport.d.ts +4 -4
  15. package/dist/types/client/canvas/CommandBar.d.ts +10 -0
  16. package/dist/types/client/canvas/ConnectionBanner.d.ts +13 -0
  17. package/dist/types/client/canvas/ContextMenu.d.ts +6 -0
  18. package/dist/types/client/canvas/EdgeLayer.d.ts +2 -1
  19. package/dist/types/client/canvas/EmptyState.d.ts +11 -0
  20. package/dist/types/client/canvas/ExternalWriters.d.ts +5 -0
  21. package/dist/types/client/canvas/HumanPresenceLayer.d.ts +8 -0
  22. package/dist/types/client/canvas/Minimap.d.ts +12 -1
  23. package/dist/types/client/canvas/ScopeFenceLayer.d.ts +8 -0
  24. package/dist/types/client/canvas/SelectionBar.d.ts +6 -0
  25. package/dist/types/client/canvas/SessionPanel.d.ts +1 -0
  26. package/dist/types/client/canvas/SessionReceipt.d.ts +17 -0
  27. package/dist/types/client/canvas/TextPrompt.d.ts +25 -0
  28. package/dist/types/client/canvas/ToolRail.d.ts +21 -0
  29. package/dist/types/client/canvas/TopBar.d.ts +7 -0
  30. package/dist/types/client/canvas/canvas-area.d.ts +39 -0
  31. package/dist/types/client/canvas/create-in-view.d.ts +18 -0
  32. package/dist/types/client/canvas/import-files.d.ts +8 -0
  33. package/dist/types/client/canvas/kind-colors.d.ts +3 -0
  34. package/dist/types/client/canvas/use-focus-trap.d.ts +14 -0
  35. package/dist/types/client/canvas/use-now.d.ts +6 -0
  36. package/dist/types/client/icons.d.ts +11 -4
  37. package/dist/types/client/nodes/ExtAppFrame.d.ts +2 -0
  38. package/dist/types/client/nodes/GroupNode.d.ts +6 -1
  39. package/dist/types/client/nodes/MarkdownNode.d.ts +2 -0
  40. package/dist/types/client/nodes/inline-editor-commands.d.ts +3 -4
  41. package/dist/types/client/state/canvas-store.d.ts +49 -5
  42. package/dist/types/client/state/human-store.d.ts +26 -0
  43. package/dist/types/client/state/iframe-mode.d.ts +1 -0
  44. package/dist/types/client/state/intent-bridge.d.ts +37 -5
  45. package/dist/types/client/state/node-factory.d.ts +0 -1
  46. package/dist/types/client/state/presence-store.d.ts +78 -0
  47. package/dist/types/client/state/session-store.d.ts +176 -0
  48. package/dist/types/client/types.d.ts +2 -1
  49. package/dist/types/client/utils/platform.d.ts +2 -0
  50. package/dist/types/server/agent-presence.d.ts +192 -0
  51. package/dist/types/server/ax-gate-ttl.d.ts +6 -0
  52. package/dist/types/server/ax-interaction.d.ts +4 -10
  53. package/dist/types/server/ax-state-manager.d.ts +21 -2
  54. package/dist/types/server/ax-state.d.ts +49 -3
  55. package/dist/types/server/ax-wait.d.ts +13 -0
  56. package/dist/types/server/canvas-db.d.ts +9 -1
  57. package/dist/types/server/canvas-operations.d.ts +11 -0
  58. package/dist/types/server/canvas-state.d.ts +27 -13
  59. package/dist/types/server/canvas-validation.d.ts +0 -14
  60. package/dist/types/server/html-surface.d.ts +1 -1
  61. package/dist/types/server/human-presence.d.ts +40 -0
  62. package/dist/types/server/index.d.ts +29 -3
  63. package/dist/types/server/intent-registry.d.ts +7 -0
  64. package/dist/types/server/mutation-history.d.ts +15 -2
  65. package/dist/types/server/operations/invoker.d.ts +13 -2
  66. package/dist/types/server/operations/ops/ax-presence.d.ts +2 -0
  67. package/dist/types/server/operations/ops/human-presence.d.ts +3 -0
  68. package/dist/types/server/operations/registry.d.ts +11 -0
  69. package/dist/types/server/operations/types.d.ts +1 -1
  70. package/dist/types/server/scope-fence.d.ts +62 -0
  71. package/dist/types/server/server.d.ts +0 -12
  72. package/dist/types/shared/agent-presence.d.ts +130 -0
  73. package/dist/types/shared/approval-gates.d.ts +19 -0
  74. package/dist/types/shared/auto-arrange.d.ts +0 -1
  75. package/dist/types/shared/ax-kinds.d.ts +11 -0
  76. package/dist/types/shared/human-presence.d.ts +31 -0
  77. package/dist/types/shared/iframe-probe.d.ts +8 -0
  78. package/dist/types/shared/scope-fence.d.ts +21 -0
  79. package/docs/RELEASE.md +20 -0
  80. package/docs/ax-host-adapter-contract.md +30 -14
  81. package/docs/cli.md +37 -1
  82. package/docs/environment.md +3 -0
  83. package/docs/http-api.md +222 -5
  84. package/docs/mcp.md +6 -5
  85. package/docs/node-types.md +3 -1
  86. package/docs/plans/plan-009-tech-debt-backlog.md +13 -0
  87. package/docs/screenshot.png +0 -0
  88. package/docs/screenshots/multi-agent-live.png +0 -0
  89. package/docs/screenshots/workbench-live-dark.png +0 -0
  90. package/docs/screenshots/workbench-live-light.png +0 -0
  91. package/docs/sdk.md +1 -1
  92. package/package.json +4 -4
  93. package/skills/pmx-canvas/SKILL.md +112 -17
  94. package/skills/pmx-canvas/references/codex-app-adapter.md +28 -0
  95. package/skills/pmx-canvas/references/full-reference.md +55 -16
  96. package/skills/pmx-canvas/references/github-copilot-app-adapter.md +41 -24
  97. package/skills/pmx-canvas-orchestration/SKILL.md +56 -2
  98. package/skills/pmx-canvas-testing/SKILL.md +17 -0
  99. package/src/cli/agent.ts +1 -0
  100. package/src/cli/commands/copilot.ts +15 -8
  101. package/src/cli/commands/nodes.ts +1 -19
  102. package/src/cli/commands/pump.ts +263 -0
  103. package/src/cli/index.ts +2 -5
  104. package/src/cli/shared.ts +1 -1
  105. package/src/client/App.tsx +209 -585
  106. package/src/client/canvas/AgentPresenceLayer.tsx +74 -0
  107. package/src/client/canvas/AttentionHistory.tsx +0 -10
  108. package/src/client/canvas/BarHint.tsx +49 -0
  109. package/src/client/canvas/CanvasNode.tsx +488 -136
  110. package/src/client/canvas/CanvasViewport.tsx +190 -94
  111. package/src/client/canvas/CommandBar.tsx +140 -0
  112. package/src/client/canvas/CommandPalette.tsx +133 -58
  113. package/src/client/canvas/ConnectionBanner.tsx +65 -0
  114. package/src/client/canvas/ContextMenu.tsx +88 -27
  115. package/src/client/canvas/ContextPinBar.tsx +2 -2
  116. package/src/client/canvas/EdgeLayer.tsx +121 -38
  117. package/src/client/canvas/EmptyState.tsx +93 -0
  118. package/src/client/canvas/ExpandedNodeOverlay.tsx +64 -118
  119. package/src/client/canvas/ExternalWriters.tsx +308 -0
  120. package/src/client/canvas/FocusFieldLayer.tsx +12 -1
  121. package/src/client/canvas/HumanPresenceLayer.tsx +45 -0
  122. package/src/client/canvas/IntentLayer.tsx +1 -1
  123. package/src/client/canvas/Minimap.tsx +117 -190
  124. package/src/client/canvas/ScopeFenceLayer.tsx +38 -0
  125. package/src/client/canvas/SelectionBar.tsx +175 -23
  126. package/src/client/canvas/SessionPanel.tsx +481 -0
  127. package/src/client/canvas/SessionReceipt.tsx +141 -0
  128. package/src/client/canvas/ShortcutOverlay.tsx +21 -6
  129. package/src/client/canvas/SnapshotPanel.tsx +166 -80
  130. package/src/client/canvas/TextPrompt.tsx +128 -0
  131. package/src/client/canvas/ToolRail.tsx +447 -0
  132. package/src/client/canvas/TopBar.tsx +308 -0
  133. package/src/client/canvas/auto-fit.ts +1 -5
  134. package/src/client/canvas/canvas-area.ts +74 -0
  135. package/src/client/canvas/create-in-view.ts +48 -0
  136. package/src/client/canvas/import-files.ts +64 -0
  137. package/src/client/canvas/kind-colors.ts +22 -0
  138. package/src/client/canvas/snap-guides.ts +1 -1
  139. package/src/client/canvas/use-focus-trap.ts +54 -0
  140. package/src/client/canvas/use-now.ts +17 -0
  141. package/src/client/canvas/use-pan-zoom.ts +13 -2
  142. package/src/client/icons.tsx +57 -18
  143. package/src/client/nodes/ExtAppFrame.tsx +86 -20
  144. package/src/client/nodes/GroupNode.tsx +9 -28
  145. package/src/client/nodes/InlineFormatBar.tsx +4 -3
  146. package/src/client/nodes/InlineMarkdownEditor.tsx +27 -0
  147. package/src/client/nodes/MarkdownNode.tsx +59 -24
  148. package/src/client/nodes/MdFormatBar.tsx +2 -4
  149. package/src/client/nodes/inline-editor-commands.ts +17 -6
  150. package/src/client/nodes/use-surface-frame.ts +3 -1
  151. package/src/client/state/attention-bridge.ts +3 -0
  152. package/src/client/state/canvas-store.ts +285 -90
  153. package/src/client/state/human-store.ts +175 -0
  154. package/src/client/state/iframe-mode.ts +33 -9
  155. package/src/client/state/intent-bridge.ts +75 -13
  156. package/src/client/state/node-factory.ts +2 -8
  157. package/src/client/state/presence-store.ts +168 -0
  158. package/src/client/state/session-store.ts +419 -0
  159. package/src/client/state/sse-bridge.ts +93 -30
  160. package/src/client/theme/global.css +3071 -796
  161. package/src/client/types.ts +3 -1
  162. package/src/client/utils/platform.ts +6 -1
  163. package/src/mcp/canvas-access.ts +2 -2
  164. package/src/server/agent-presence.ts +755 -0
  165. package/src/server/ax-context.ts +45 -0
  166. package/src/server/ax-gate-ttl.ts +61 -0
  167. package/src/server/ax-interaction.ts +29 -1
  168. package/src/server/ax-state-manager.ts +78 -6
  169. package/src/server/ax-state.ts +82 -15
  170. package/src/server/ax-wait.ts +33 -0
  171. package/src/server/canvas-db.ts +103 -33
  172. package/src/server/canvas-operations.ts +58 -14
  173. package/src/server/canvas-state.ts +131 -58
  174. package/src/server/canvas-validation.ts +3 -53
  175. package/src/server/demo-state.json +2 -70
  176. package/src/server/html-surface.ts +11 -2
  177. package/src/server/human-presence.ts +160 -0
  178. package/src/server/index.ts +111 -6
  179. package/src/server/intent-registry.ts +13 -0
  180. package/src/server/mutation-history.ts +47 -2
  181. package/src/server/operations/composites.ts +6 -3
  182. package/src/server/operations/http.ts +10 -1
  183. package/src/server/operations/index.ts +4 -0
  184. package/src/server/operations/invoker.ts +33 -6
  185. package/src/server/operations/ops/ax-presence.ts +62 -0
  186. package/src/server/operations/ops/ax-read.ts +8 -0
  187. package/src/server/operations/ops/ax-state.ts +106 -1
  188. package/src/server/operations/ops/ax-timeline.ts +54 -5
  189. package/src/server/operations/ops/ax-work.ts +46 -0
  190. package/src/server/operations/ops/batch.ts +3 -1
  191. package/src/server/operations/ops/edges.ts +88 -2
  192. package/src/server/operations/ops/groups.ts +4 -3
  193. package/src/server/operations/ops/human-presence.ts +35 -0
  194. package/src/server/operations/ops/json-render.ts +11 -1
  195. package/src/server/operations/ops/nodes.ts +77 -16
  196. package/src/server/operations/ops/query.ts +1 -0
  197. package/src/server/operations/ops/snapshots.ts +7 -4
  198. package/src/server/operations/registry.ts +196 -1
  199. package/src/server/operations/types.ts +1 -1
  200. package/src/server/scope-fence.ts +207 -0
  201. package/src/server/server.ts +177 -79
  202. package/src/server/trace-manager.ts +0 -2
  203. package/src/server/web-artifacts.ts +0 -1
  204. package/src/shared/agent-presence.ts +162 -0
  205. package/src/shared/approval-gates.ts +35 -0
  206. package/src/shared/auto-arrange.ts +121 -13
  207. package/src/shared/ax-kinds.ts +23 -0
  208. package/src/shared/human-presence.ts +30 -0
  209. package/src/shared/iframe-probe.ts +8 -0
  210. package/src/shared/scope-fence.ts +31 -0
  211. package/dist/types/client/canvas/DockedNode.d.ts +0 -4
  212. package/src/client/canvas/DockedNode.tsx +0 -165
@@ -56,9 +56,7 @@
56
56
  --mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;
57
57
  --radius: 10px;
58
58
  --radius-sm: 6px;
59
- /* Shared height for the top HUD row so the toolbar and the collapsed docked
60
- status/context widgets that flank it line up to the same height. Matches the
61
- toolbar's natural content height (icon buttons at 6px padding). */
59
+ /* Shared height of the top bar and the session panel header. */
62
60
  --hud-bar-height: 44px;
63
61
  }
64
62
 
@@ -546,9 +544,11 @@ body,
546
544
  /* Node card shared styles */
547
545
  .canvas-node {
548
546
  position: absolute;
547
+ /* Standard card shell (rail-chrome-v2): node surface, 12px radius, soft
548
+ shadow. Every node kind shares it; the kind shows in the icon color. */
549
549
  background: var(--c-panel);
550
550
  border: 1px solid var(--c-line);
551
- border-radius: var(--radius);
551
+ border-radius: 12px;
552
552
  box-shadow: 0 4px 24px var(--c-shadow);
553
553
  display: flex;
554
554
  flex-direction: column;
@@ -623,7 +623,7 @@ body,
623
623
  display: flex;
624
624
  align-items: center;
625
625
  gap: calc(8px * var(--node-chrome-scale, 1));
626
- padding: calc(8px * var(--node-chrome-scale, 1)) calc(12px * var(--node-chrome-scale, 1));
626
+ padding: calc(7px * var(--node-chrome-scale, 1)) calc(12px * var(--node-chrome-scale, 1));
627
627
  background: var(--c-panel-overlay);
628
628
  border-bottom: 1px solid var(--c-line);
629
629
  cursor: grab;
@@ -638,7 +638,7 @@ body,
638
638
  .canvas-node .node-title {
639
639
  font-size: calc(12px * var(--node-chrome-scale, 1));
640
640
  font-weight: 600;
641
- color: var(--c-muted);
641
+ color: var(--c-text-soft);
642
642
  white-space: nowrap;
643
643
  overflow: hidden;
644
644
  text-overflow: ellipsis;
@@ -654,14 +654,28 @@ body,
654
654
  display: inline-flex;
655
655
  align-items: center;
656
656
  justify-content: center;
657
- width: calc(18px * var(--node-chrome-scale, 1));
658
- height: calc(18px * var(--node-chrome-scale, 1));
659
- border-radius: calc(4px * var(--node-chrome-scale, 1));
660
- color: var(--c-accent);
661
- background: var(--c-accent-10);
657
+ width: calc(14px * var(--node-chrome-scale, 1));
658
+ height: calc(14px * var(--node-chrome-scale, 1));
659
+ color: var(--kind-accent, var(--c-accent));
662
660
  flex-shrink: 0;
663
661
  }
664
662
 
663
+ /* Node kind accents (rail-chrome-v2): the icon carries the kind. */
664
+ .canvas-node[data-node-type='image'],
665
+ .canvas-node[data-node-type='mermaid'] {
666
+ --kind-accent: var(--c-warn);
667
+ }
668
+ .canvas-node[data-node-type='webpage'],
669
+ .canvas-node[data-node-type='status'],
670
+ .canvas-node[data-node-type='trace'] {
671
+ --kind-accent: var(--c-ok);
672
+ }
673
+ .canvas-node[data-node-type='context'],
674
+ .canvas-node[data-node-type='prompt'],
675
+ .canvas-node[data-node-type='response'] {
676
+ --kind-accent: var(--c-purple);
677
+ }
678
+
665
679
  .canvas-node .node-type-badge {
666
680
  font-size: calc(10px * var(--node-chrome-scale, 1));
667
681
  padding: calc(1px * var(--node-chrome-scale, 1)) calc(6px * var(--node-chrome-scale, 1));
@@ -713,7 +727,7 @@ body,
713
727
  .canvas-node .node-controls button {
714
728
  background: none;
715
729
  border: none;
716
- color: var(--c-muted);
730
+ color: var(--c-dim);
717
731
  cursor: pointer;
718
732
  display: inline-flex;
719
733
  align-items: center;
@@ -734,8 +748,11 @@ body,
734
748
  .canvas-node .node-body {
735
749
  flex: 1;
736
750
  overflow: auto;
737
- padding: 12px;
751
+ padding: 10px 14px;
738
752
  min-height: 0;
753
+ font-size: 11px;
754
+ line-height: 1.6;
755
+ color: var(--c-text-soft);
739
756
  }
740
757
 
741
758
  /* Markdown rendered content inside nodes */
@@ -761,16 +778,62 @@ body,
761
778
  color: var(--c-muted);
762
779
  }
763
780
 
781
+ /* GFM task lists: custom-drawn checkboxes — native inputs are an 11px target
782
+ at typical zoom and render inconsistently (or not at all) in embedding
783
+ apps — and no double marker (• plus box) on task rows. */
784
+ .canvas-node .node-body li:has(> input[type='checkbox']),
785
+ .md-reader-content li:has(> input[type='checkbox']) {
786
+ list-style: none;
787
+ /* Reclaim the bullet gutter, then indent the whole item past the box — the
788
+ box sits OUT of the text flow so wrapped lines align under the first. */
789
+ margin-left: -1.3em;
790
+ padding-left: 1.65em;
791
+ position: relative;
792
+ }
793
+ .canvas-node .node-body li > input[type='checkbox'],
794
+ .md-reader-content li > input[type='checkbox'] {
795
+ appearance: none;
796
+ -webkit-appearance: none;
797
+ position: absolute;
798
+ left: 0;
799
+ top: 0.22em;
800
+ width: 15px;
801
+ height: 15px;
802
+ margin: 0;
803
+ border: 1.5px solid var(--c-muted);
804
+ border-radius: 4px;
805
+ background: var(--c-panel);
806
+ cursor: pointer;
807
+ /* Embedding webviews (Copilot app) force color schemes on form controls —
808
+ this box is fully custom-drawn, keep its colors ours. */
809
+ forced-color-adjust: none;
810
+ color-scheme: light;
811
+ }
812
+ .canvas-node .node-body li > input[type='checkbox']:hover,
813
+ .md-reader-content li > input[type='checkbox']:hover {
814
+ border-color: var(--c-accent);
815
+ }
816
+ .canvas-node .node-body li > input[type='checkbox']:checked,
817
+ .md-reader-content li > input[type='checkbox']:checked {
818
+ border-color: var(--c-accent);
819
+ background-color: var(--c-accent);
820
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='8'%3E%3Cpath d='M1 4l2.6 2.6L9 1' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
821
+ background-repeat: no-repeat;
822
+ background-position: center;
823
+ }
824
+
825
+ /* Hanging indent: with `inside`, a wrapped line falls back to the card edge
826
+ under the marker instead of aligning with its own first line. */
764
827
  .canvas-node .node-body ul,
765
828
  .canvas-node .node-body ol {
766
829
  margin: 0.4em 0;
767
- padding-left: 0.25em;
768
- list-style-position: inside;
830
+ padding-left: 1.3em;
831
+ list-style-position: outside;
769
832
  }
770
833
 
771
834
  .canvas-node .node-body li {
772
835
  margin: 0.2em 0;
773
- padding-left: 0.15em;
836
+ padding-left: 0.1em;
774
837
  }
775
838
 
776
839
  .canvas-node .node-body a {
@@ -821,226 +884,2226 @@ body,
821
884
  font-weight: 600;
822
885
  }
823
886
 
824
- /* HUD layer — [left-dock] [toolbar] [right-dock]. Wraps onto multiple rows in a
825
- narrow embedding panel (e.g. the Copilot side panel) instead of clipping. */
826
- .hud-layer {
827
- position: fixed;
828
- top: 12px;
829
- left: 12px;
830
- right: 12px;
831
- display: flex;
832
- flex-wrap: wrap;
833
- align-items: flex-start;
834
- justify-content: center;
835
- gap: 8px;
836
- z-index: 9999;
837
- pointer-events: none;
838
- }
839
- .hud-layer > * {
840
- pointer-events: auto;
841
- }
842
- .hud-left,
843
- .hud-right {
887
+ /* ── App shell: rail + top bar + canvas region (rail-chrome-v2) ── */
888
+ .app-shell {
844
889
  display: flex;
845
- flex-wrap: wrap;
846
- gap: 8px;
890
+ width: 100%;
891
+ height: 100%;
892
+ overflow: hidden;
893
+ background: var(--c-bg);
847
894
  }
848
895
 
849
- /* Toolbar */
850
- .canvas-toolbar {
896
+ .tool-rail {
897
+ width: 52px;
898
+ flex-shrink: 0;
851
899
  display: flex;
852
- flex-wrap: wrap;
900
+ flex-direction: column;
853
901
  align-items: center;
854
- gap: 6px;
855
- padding: 6px 10px;
856
- min-height: var(--hud-bar-height);
857
- max-width: 100%;
858
- box-sizing: border-box;
859
- background: var(--c-panel-glass);
860
- backdrop-filter: blur(12px);
861
- border: 1px solid var(--c-line);
862
- border-radius: var(--radius);
902
+ gap: 4px;
903
+ padding: 10px 0;
904
+ background: var(--c-panel-soft);
905
+ border-right: 1px solid var(--c-line);
906
+ overflow-y: auto;
907
+ scrollbar-width: none;
908
+ /* The rail is a stacking context: its popovers can only win against the
909
+ canvas region's overlays (annotation capture layer at 9996) if the rail
910
+ ITSELF stacks above them — a child's z-index never escapes this context. */
911
+ z-index: 9999;
912
+ }
913
+ .tool-rail::-webkit-scrollbar {
914
+ display: none;
863
915
  }
864
916
 
865
- .toolbar-tooltip-anchor {
866
- position: relative;
917
+ .rail-brand {
867
918
  display: inline-flex;
868
919
  align-items: center;
920
+ justify-content: center;
921
+ width: 36px;
922
+ height: 36px;
923
+ color: var(--c-accent);
924
+ flex-shrink: 0;
869
925
  }
870
926
 
871
- .toolbar-tooltip-anchor-start .toolbar-tooltip {
872
- left: 0;
873
- transform: translateX(0) translateY(6px);
927
+ .rail-btn {
928
+ display: inline-flex;
929
+ align-items: center;
930
+ justify-content: center;
931
+ width: 36px;
932
+ height: 36px;
933
+ border-radius: 8px;
934
+ border: 1px solid transparent;
935
+ background: none;
936
+ color: var(--c-muted);
937
+ cursor: pointer;
938
+ flex-shrink: 0;
874
939
  }
875
-
876
- .toolbar-tooltip-anchor-end .toolbar-tooltip {
877
- left: auto;
878
- right: 0;
879
- transform: translateX(0) translateY(6px);
940
+ .rail-btn svg {
941
+ display: block;
880
942
  }
881
-
882
- .toolbar-tooltip {
883
- position: absolute;
884
- left: 50%;
885
- top: calc(100% + 10px);
886
- transform: translateX(-50%) translateY(6px);
887
- display: flex;
888
- flex-direction: column;
889
- gap: 4px;
890
- min-width: 168px;
891
- max-width: 240px;
892
- padding: 10px 12px;
893
- background: color-mix(in srgb, var(--c-panel) 92%, black 8%);
894
- border: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
895
- border-radius: 10px;
896
- box-shadow: 0 14px 36px var(--c-shadow-heavy), 0 0 0 1px var(--c-accent-8);
897
- backdrop-filter: blur(14px);
943
+ .rail-btn:hover {
944
+ background: var(--c-surface-hover);
898
945
  color: var(--c-text);
899
- font-size: 12px;
900
- line-height: 1.35;
901
- white-space: normal;
902
- opacity: 0;
903
- pointer-events: none;
904
- z-index: 10010;
905
- transition: opacity 0.14s ease, transform 0.14s ease;
906
946
  }
907
-
908
- .toolbar-tooltip::after {
909
- content: '';
910
- position: absolute;
911
- left: 50%;
912
- top: -5px;
913
- width: 10px;
914
- height: 10px;
915
- background: inherit;
916
- border-top: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
917
- border-left: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
918
- transform: translateX(-50%) rotate(45deg);
947
+ .rail-btn.active {
948
+ background: var(--c-accent-10);
949
+ border-color: var(--c-accent-25);
950
+ color: var(--c-accent);
951
+ }
952
+ .rail-btn.active:hover {
953
+ background: var(--c-accent-15, var(--c-accent-10));
919
954
  }
920
955
 
921
- .toolbar-tooltip-anchor-start .toolbar-tooltip::after {
922
- left: 18px;
923
- transform: rotate(45deg);
956
+ .rail-divider {
957
+ width: 24px;
958
+ height: 1px;
959
+ background: var(--c-line);
960
+ flex-shrink: 0;
961
+ margin: 3px 0;
924
962
  }
925
963
 
926
- .toolbar-tooltip-anchor-end .toolbar-tooltip::after {
927
- left: auto;
928
- right: 18px;
929
- transform: rotate(45deg);
964
+ .rail-spacer {
965
+ flex: 1;
966
+ min-height: 8px;
930
967
  }
931
968
 
932
- .toolbar-tooltip-anchor:hover .toolbar-tooltip,
933
- .toolbar-tooltip-anchor > :focus-visible + .toolbar-tooltip {
934
- opacity: 1;
935
- transform: translateX(-50%) translateY(0);
969
+ .app-main {
970
+ flex: 1;
971
+ min-width: 0;
972
+ display: flex;
973
+ flex-direction: column;
936
974
  }
937
975
 
938
- .toolbar-tooltip-anchor-start:hover .toolbar-tooltip,
939
- .toolbar-tooltip-anchor-start > :focus-visible + .toolbar-tooltip,
940
- .toolbar-tooltip-anchor-end:hover .toolbar-tooltip,
941
- .toolbar-tooltip-anchor-end > :focus-visible + .toolbar-tooltip {
942
- transform: translateX(0) translateY(0);
976
+ .top-bar {
977
+ height: var(--hud-bar-height);
978
+ flex-shrink: 0;
979
+ display: flex;
980
+ align-items: center;
981
+ gap: 12px;
982
+ padding: 0 14px;
983
+ background: color-mix(in srgb, var(--c-panel-soft) 92%, transparent);
984
+ backdrop-filter: blur(12px);
985
+ border-bottom: 1px solid var(--c-line);
986
+ /* NOT overflow:hidden — the BarHint tooltips hang below the bar and were
987
+ clipped invisible for everyone (the e2e asserted opacity, which cannot
988
+ see ancestor clipping). Children ellipsize themselves; the narrow-screen
989
+ collapse is media-query display, not clipping. */
990
+ min-width: 0;
991
+ z-index: 9998;
943
992
  }
944
993
 
945
- .toolbar-tooltip-label {
994
+ .top-bar-title {
946
995
  font-size: 13px;
947
996
  font-weight: 600;
948
- letter-spacing: 0.01em;
949
997
  color: var(--c-text);
998
+ white-space: nowrap;
999
+ overflow: hidden;
1000
+ text-overflow: ellipsis;
1001
+ min-width: 60px;
1002
+ flex-shrink: 1;
950
1003
  }
951
1004
 
952
- .toolbar-tooltip-meta {
953
- display: flex;
954
- align-items: center;
955
- justify-content: space-between;
956
- gap: 10px;
957
- color: var(--c-text-soft);
1005
+ .top-bar-meta {
1006
+ font: 11px var(--mono);
1007
+ color: var(--c-dim);
1008
+ white-space: nowrap;
1009
+ flex-shrink: 0;
958
1010
  }
959
1011
 
960
- .toolbar-tooltip-shortcut {
1012
+ .top-bar-spacer {
1013
+ flex: 1;
1014
+ min-width: 0;
1015
+ }
1016
+
1017
+ .top-bar-sep {
1018
+ width: 1px;
1019
+ height: 20px;
1020
+ background: var(--c-line);
1021
+ flex-shrink: 0;
1022
+ }
1023
+
1024
+ .top-bar-btn {
961
1025
  display: inline-flex;
962
1026
  align-items: center;
963
1027
  justify-content: center;
964
- min-height: 20px;
965
- padding: 2px 7px;
966
- border-radius: 999px;
967
- border: 1px solid var(--c-accent-25);
968
- background: var(--c-accent-10);
969
- color: var(--c-accent);
970
- font: 11px/1 var(--mono);
971
- white-space: nowrap;
972
- }
973
-
974
- .canvas-toolbar button {
1028
+ padding: 6px 8px;
975
1029
  background: none;
976
1030
  border: 1px solid transparent;
977
- color: var(--c-muted);
978
- padding: 6px 10px;
979
1031
  border-radius: var(--radius-sm);
980
- font: inherit;
981
- font-size: 14px;
1032
+ color: var(--c-muted);
982
1033
  cursor: pointer;
1034
+ flex-shrink: 0;
983
1035
  }
984
-
985
- .canvas-toolbar button:hover {
1036
+ .top-bar-btn svg {
1037
+ display: block;
1038
+ }
1039
+ .top-bar-btn:hover {
986
1040
  background: var(--c-surface-hover);
987
1041
  color: var(--c-text);
988
1042
  border-color: var(--c-line);
989
1043
  }
990
1044
 
991
- .canvas-toolbar .separator {
992
- width: 1px;
993
- height: 20px;
994
- background: var(--c-line);
995
- }
996
-
997
- .canvas-toolbar .canvas-brand {
998
- display: inline-flex;
999
- align-items: center;
1000
- justify-content: center;
1001
- width: 28px;
1002
- height: 28px;
1003
- color: var(--c-accent);
1045
+ .top-bar-zoom-label {
1046
+ min-width: 38px;
1047
+ text-align: center;
1048
+ font: 11px var(--mono);
1049
+ color: var(--c-muted);
1050
+ background: none;
1051
+ border: 1px solid transparent;
1052
+ border-radius: var(--radius-sm);
1053
+ padding: 6px 4px;
1054
+ cursor: pointer;
1004
1055
  flex-shrink: 0;
1005
1056
  }
1057
+ .top-bar-zoom-label:hover {
1058
+ background: var(--c-surface-hover);
1059
+ color: var(--c-text);
1060
+ }
1006
1061
 
1007
- .canvas-toolbar .connection-dot {
1008
- width: 8px;
1009
- height: 8px;
1010
- border-radius: 50%;
1011
- flex-shrink: 0;
1062
+ .canvas-region {
1063
+ flex: 1;
1064
+ min-height: 0;
1065
+ position: relative;
1066
+ overflow: hidden;
1012
1067
  }
1013
1068
 
1014
- .canvas-toolbar .connection-dot.connected {
1015
- background: var(--c-ok);
1069
+ /* ── Agent presence (rail-chrome-v2 phase 3) ────────────────────
1070
+ Every surface below mounts only while a session is attached. Phase colors
1071
+ are tokens so all nine themes agree: thinking=purple, tooling=accent,
1072
+ waiting=warn, idle=dim. */
1073
+ .agent-chip,
1074
+ .agent-cursor,
1075
+ .minimap-presence {
1076
+ --presence-color: var(--c-dim);
1016
1077
  }
1017
- .canvas-toolbar .connection-dot.connecting {
1018
- background: var(--c-warn);
1019
- animation: pulse 1.5s infinite;
1078
+ .agent-chip.phase-thinking,
1079
+ .agent-cursor.phase-thinking,
1080
+ .minimap-presence.phase-thinking {
1081
+ --presence-color: var(--c-purple);
1020
1082
  }
1021
- .canvas-toolbar .connection-dot.disconnected {
1022
- background: var(--c-danger);
1083
+ .agent-chip.phase-tooling,
1084
+ .agent-cursor.phase-tooling,
1085
+ .minimap-presence.phase-tooling {
1086
+ --presence-color: var(--c-accent);
1087
+ }
1088
+ .agent-chip.phase-waiting-approval,
1089
+ .agent-cursor.phase-waiting-approval,
1090
+ .minimap-presence.phase-waiting-approval {
1091
+ --presence-color: var(--c-warn);
1023
1092
  }
1024
1093
 
1025
- @keyframes pulse {
1026
- 0%,
1027
- 100% {
1028
- opacity: 1;
1029
- }
1030
- 50% {
1031
- opacity: 0.4;
1094
+ /* Top-bar chip */
1095
+ .agent-chip {
1096
+ display: inline-flex;
1097
+ align-items: center;
1098
+ gap: 7px;
1099
+ padding: 5px 12px;
1100
+ border-radius: 999px;
1101
+ border: 1px solid color-mix(in srgb, var(--presence-color) 35%, transparent);
1102
+ background: color-mix(in srgb, var(--presence-color) 12%, transparent);
1103
+ color: var(--presence-color);
1104
+ font-size: 11px;
1105
+ font-weight: 600;
1106
+ white-space: nowrap;
1107
+ flex-shrink: 0;
1108
+ min-width: 0;
1109
+ max-width: 280px;
1110
+ }
1111
+ .agent-chip.phase-idle {
1112
+ background: none;
1113
+ border-color: var(--c-line);
1114
+ }
1115
+ .agent-chip-dot {
1116
+ width: 7px;
1117
+ height: 7px;
1118
+ border-radius: 50%;
1119
+ background: var(--presence-color);
1120
+ flex-shrink: 0;
1121
+ }
1122
+ .agent-chip.phase-thinking .agent-chip-dot,
1123
+ .agent-chip.phase-tooling .agent-chip-dot {
1124
+ animation: presence-pulse 1.4s ease-in-out infinite;
1125
+ }
1126
+ .agent-chip-label {
1127
+ overflow: hidden;
1128
+ text-overflow: ellipsis;
1129
+ white-space: nowrap;
1130
+ min-width: 0;
1131
+ }
1132
+ .agent-chip-who {
1133
+ font: 10px var(--mono);
1134
+ font-weight: 400;
1135
+ color: var(--c-muted);
1136
+ white-space: nowrap;
1137
+ }
1138
+
1139
+ /* On-canvas cursor + phase chip (world layer; counter-scaled inner) */
1140
+ .agent-presence-layer {
1141
+ display: contents;
1142
+ }
1143
+ .agent-cursor {
1144
+ position: absolute;
1145
+ left: 0;
1146
+ top: 0;
1147
+ z-index: 9000;
1148
+ pointer-events: none;
1149
+ transition: transform 220ms cubic-bezier(0.22, 1, 0.36, 1);
1150
+ color: var(--presence-color);
1151
+ }
1152
+ .agent-cursor.is-worker {
1153
+ opacity: 0.85;
1154
+ }
1155
+ .agent-cursor.is-worker .agent-cursor-glyph {
1156
+ transform: scale(0.75);
1157
+ transform-origin: top left;
1158
+ }
1159
+ .agent-cursor.is-worker .agent-cursor-chip {
1160
+ font-size: 9px;
1161
+ padding: 1px 6px;
1162
+ }
1163
+ .agent-chip-workers {
1164
+ margin-left: 4px;
1165
+ padding: 0 5px;
1166
+ border-radius: 8px;
1167
+ background: color-mix(in srgb, var(--c-accent) 16%, transparent);
1168
+ color: var(--c-accent);
1169
+ font-size: 9px;
1170
+ font-weight: 700;
1171
+ letter-spacing: 0.04em;
1172
+ white-space: nowrap;
1173
+ }
1174
+
1175
+ /* End THIS session — each chip carries its own ×, so a two-agent board can
1176
+ end one writer without hunting for it in the session panel. */
1177
+ .agent-chip-end {
1178
+ margin-left: 2px;
1179
+ padding: 0 3px;
1180
+ border: none;
1181
+ background: none;
1182
+ color: var(--c-muted);
1183
+ font-size: 12px;
1184
+ line-height: 1;
1185
+ cursor: pointer;
1186
+ border-radius: 6px;
1187
+ }
1188
+
1189
+ .agent-chip-end:hover {
1190
+ color: var(--c-danger, #ef4444);
1191
+ background: color-mix(in srgb, currentColor 12%, transparent);
1192
+ }
1193
+
1194
+ .agent-cursor-glyph path {
1195
+ fill: var(--identity-color, currentColor);
1196
+ }
1197
+ .agent-cursor-chip {
1198
+ border-left: 3px solid var(--identity-color, transparent);
1199
+ }
1200
+ .agent-chip {
1201
+ border-left: 3px solid var(--identity-color, transparent);
1202
+ }
1203
+ .minimap-presence {
1204
+ background: var(--identity-color, var(--presence-color));
1205
+ }
1206
+
1207
+ .agent-cursor.is-external {
1208
+ opacity: 0.8;
1209
+ }
1210
+ .agent-cursor.is-external .agent-cursor-chip {
1211
+ border-style: dashed;
1212
+ }
1213
+
1214
+ .agent-cursor-inner {
1215
+ position: relative;
1216
+ transform-origin: 0 0;
1217
+ }
1218
+ .agent-cursor-glyph {
1219
+ display: block;
1220
+ filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.35));
1221
+ }
1222
+ .agent-cursor-chip {
1223
+ position: absolute;
1224
+ left: 14px;
1225
+ top: 18px;
1226
+ display: inline-flex;
1227
+ align-items: center;
1228
+ gap: 6px;
1229
+ padding: 3px 9px;
1230
+ border-radius: 999px;
1231
+ border: 1px solid color-mix(in srgb, var(--presence-color) 35%, transparent);
1232
+ background: color-mix(in srgb, var(--c-panel) 92%, var(--presence-color) 8%);
1233
+ color: var(--presence-color);
1234
+ font-size: 10.5px;
1235
+ font-weight: 600;
1236
+ white-space: nowrap;
1237
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
1238
+ }
1239
+ .agent-cursor-dot {
1240
+ width: 6px;
1241
+ height: 6px;
1242
+ border-radius: 50%;
1243
+ background: var(--presence-color);
1244
+ }
1245
+ .agent-cursor.phase-thinking .agent-cursor-dot,
1246
+ .agent-cursor.phase-tooling .agent-cursor-dot {
1247
+ animation: presence-pulse 1.4s ease-in-out infinite;
1248
+ }
1249
+ .agent-cursor-who {
1250
+ font: 9.5px var(--mono);
1251
+ font-weight: 400;
1252
+ color: var(--c-muted);
1253
+ }
1254
+
1255
+ /* Node shimmer: the node an attached agent is mutating right now */
1256
+ .canvas-node.agent-mutating {
1257
+ border-color: color-mix(in srgb, var(--c-accent) 45%, transparent) !important;
1258
+ background-image: linear-gradient(
1259
+ 100deg,
1260
+ transparent 20%,
1261
+ color-mix(in srgb, var(--c-accent) 13%, transparent) 50%,
1262
+ transparent 80%
1263
+ );
1264
+ background-size: 200% 100%;
1265
+ animation: presence-shimmer 1.6s linear infinite;
1266
+ }
1267
+
1268
+ @keyframes presence-pulse {
1269
+ 0%,
1270
+ 100% {
1271
+ opacity: 1;
1272
+ }
1273
+ 50% {
1274
+ opacity: 0.45;
1275
+ }
1276
+ }
1277
+ @keyframes presence-shimmer {
1278
+ from {
1279
+ background-position: 200% 0;
1280
+ }
1281
+ to {
1282
+ background-position: -200% 0;
1283
+ }
1284
+ }
1285
+
1286
+ /* Reduced motion: keep every static color state, drop the motion. */
1287
+ @media (prefers-reduced-motion: reduce) {
1288
+ .agent-cursor {
1289
+ transition: none;
1290
+ }
1291
+ .agent-chip-dot,
1292
+ .agent-cursor-dot,
1293
+ .canvas-node.agent-mutating {
1294
+ animation: none;
1295
+ }
1296
+ .canvas-node.agent-mutating {
1297
+ background-image: none;
1298
+ }
1299
+ }
1300
+
1301
+ /* ── Session panel (rail-chrome-v2 phase 4) ─────────────────────
1302
+ Right sibling of the centre column while a session is attached. Below
1303
+ 1180px it becomes a fixed overlay drawer and the canvas reclaims its width. */
1304
+ .session-panel {
1305
+ width: 320px;
1306
+ flex-shrink: 0;
1307
+ display: flex;
1308
+ flex-direction: column;
1309
+ background: var(--c-panel-soft);
1310
+ border-left: 1px solid var(--c-line);
1311
+ min-height: 0;
1312
+ z-index: 9997;
1313
+ animation: session-panel-in 180ms ease;
1314
+ }
1315
+ .session-panel.is-collapsed {
1316
+ width: 28px;
1317
+ align-items: center;
1318
+ padding-top: 10px;
1319
+ gap: 10px;
1320
+ }
1321
+ .session-collapsed-label {
1322
+ writing-mode: vertical-rl;
1323
+ font-size: 10px;
1324
+ font-weight: 600;
1325
+ letter-spacing: 0.08em;
1326
+ text-transform: uppercase;
1327
+ color: var(--c-dim);
1328
+ }
1329
+
1330
+ .session-panel-header {
1331
+ height: var(--hud-bar-height);
1332
+ flex-shrink: 0;
1333
+ display: flex;
1334
+ align-items: center;
1335
+ gap: 10px;
1336
+ padding: 0 12px 0 16px;
1337
+ border-bottom: 1px solid var(--c-line);
1338
+ }
1339
+ .session-panel-title {
1340
+ font-size: 11px;
1341
+ font-weight: 700;
1342
+ letter-spacing: 0.08em;
1343
+ text-transform: uppercase;
1344
+ color: var(--c-text);
1345
+ }
1346
+ .session-live {
1347
+ --presence-color: var(--c-dim);
1348
+ display: inline-flex;
1349
+ align-items: center;
1350
+ gap: 5px;
1351
+ font: 10px var(--mono);
1352
+ color: var(--c-muted);
1353
+ }
1354
+ .session-live.phase-thinking {
1355
+ --presence-color: var(--c-purple);
1356
+ }
1357
+ .session-live.phase-tooling {
1358
+ --presence-color: var(--c-accent);
1359
+ }
1360
+ .session-live.phase-waiting-approval {
1361
+ --presence-color: var(--c-warn);
1362
+ }
1363
+ .session-live-dot {
1364
+ width: 6px;
1365
+ height: 6px;
1366
+ border-radius: 50%;
1367
+ background: var(--presence-color);
1368
+ }
1369
+ .session-live.phase-thinking .session-live-dot,
1370
+ .session-live.phase-tooling .session-live-dot {
1371
+ animation: presence-pulse 1.4s ease-in-out infinite;
1372
+ }
1373
+ .session-collapse {
1374
+ width: 26px;
1375
+ height: 26px;
1376
+ border: 1px solid transparent;
1377
+ border-radius: 6px;
1378
+ background: none;
1379
+ color: var(--c-muted);
1380
+ font-size: 16px;
1381
+ line-height: 1;
1382
+ cursor: pointer;
1383
+ }
1384
+ .session-collapse:hover {
1385
+ background: var(--c-surface-hover);
1386
+ color: var(--c-text);
1387
+ }
1388
+
1389
+ .session-panel-body {
1390
+ flex: 1;
1391
+ min-height: 0;
1392
+ overflow-y: auto;
1393
+ padding: 12px 12px 16px;
1394
+ display: flex;
1395
+ flex-direction: column;
1396
+ gap: 16px;
1397
+ }
1398
+ .session-section-title {
1399
+ margin: 0 0 8px;
1400
+ font-size: 10px;
1401
+ font-weight: 700;
1402
+ letter-spacing: 0.08em;
1403
+ text-transform: uppercase;
1404
+ color: var(--c-dim);
1405
+ }
1406
+ .session-empty {
1407
+ font-size: 10.5px;
1408
+ line-height: 1.5;
1409
+ color: var(--c-dim);
1410
+ }
1411
+ .session-list {
1412
+ list-style: none;
1413
+ margin: 0;
1414
+ padding: 0;
1415
+ display: flex;
1416
+ flex-direction: column;
1417
+ gap: 6px;
1418
+ }
1419
+
1420
+ /* Work items + gates */
1421
+ .session-item {
1422
+ --glyph: var(--c-dim);
1423
+ display: flex;
1424
+ align-items: flex-start;
1425
+ gap: 8px;
1426
+ padding: 8px 10px;
1427
+ border: 1px solid var(--c-line);
1428
+ border-radius: 8px;
1429
+ background: color-mix(in srgb, var(--c-panel) 70%, transparent);
1430
+ }
1431
+ .session-item.status-running {
1432
+ --glyph: var(--c-accent);
1433
+ }
1434
+ .session-item.status-awaiting {
1435
+ --glyph: var(--c-warn);
1436
+ }
1437
+ .session-item.status-done {
1438
+ --glyph: var(--c-ok);
1439
+ }
1440
+ .session-item.status-vetoed {
1441
+ --glyph: var(--c-danger);
1442
+ }
1443
+ .session-glyph {
1444
+ width: 7px;
1445
+ height: 7px;
1446
+ margin-top: 5px;
1447
+ border-radius: 50%;
1448
+ background: var(--glyph);
1449
+ flex-shrink: 0;
1450
+ }
1451
+ .session-item.status-running .session-glyph {
1452
+ animation: presence-pulse 1.4s ease-in-out infinite;
1453
+ }
1454
+ .session-item-main {
1455
+ flex: 1;
1456
+ min-width: 0;
1457
+ }
1458
+ .session-item-title {
1459
+ display: block;
1460
+ width: 100%;
1461
+ padding: 0;
1462
+ border: none;
1463
+ background: none;
1464
+ text-align: left;
1465
+ font-size: 12px;
1466
+ font-weight: 600;
1467
+ color: var(--c-text-soft);
1468
+ cursor: pointer;
1469
+ white-space: nowrap;
1470
+ overflow: hidden;
1471
+ text-overflow: ellipsis;
1472
+ }
1473
+ .session-item-title:disabled {
1474
+ cursor: default;
1475
+ }
1476
+ .session-item-title:not(:disabled):hover {
1477
+ color: var(--c-text);
1478
+ }
1479
+ .session-item-detail {
1480
+ margin-top: 2px;
1481
+ font-size: 10.5px;
1482
+ line-height: 1.45;
1483
+ color: var(--c-muted);
1484
+ }
1485
+ .session-item-status {
1486
+ font-size: 9px;
1487
+ font-weight: 700;
1488
+ letter-spacing: 0.06em;
1489
+ text-transform: uppercase;
1490
+ color: var(--glyph);
1491
+ flex-shrink: 0;
1492
+ margin-top: 3px;
1493
+ }
1494
+ .session-item-time {
1495
+ font: 9px var(--mono);
1496
+ color: var(--c-dim);
1497
+ flex-shrink: 0;
1498
+ margin-top: 4px;
1499
+ }
1500
+ .session-gate {
1501
+ border-color: color-mix(in srgb, var(--c-warn) 35%, transparent);
1502
+ background: color-mix(in srgb, var(--c-warn) 6%, transparent);
1503
+ }
1504
+ .session-gate-ttl {
1505
+ margin-top: 4px;
1506
+ font: 10px var(--mono);
1507
+ color: var(--c-warn);
1508
+ }
1509
+ .session-gate-held {
1510
+ opacity: 0.85;
1511
+ }
1512
+ .session-gate-actions {
1513
+ display: flex;
1514
+ gap: 6px;
1515
+ margin-top: 8px;
1516
+ }
1517
+ .session-gate-approve,
1518
+ .session-gate-reject {
1519
+ padding: 4px 12px;
1520
+ border-radius: 7px;
1521
+ font-size: 11px;
1522
+ font-weight: 600;
1523
+ cursor: pointer;
1524
+ }
1525
+ .session-gate-approve {
1526
+ border: 1px solid transparent;
1527
+ background: color-mix(in srgb, var(--c-ok) 15%, transparent);
1528
+ color: var(--c-ok);
1529
+ }
1530
+ .session-gate-approve:hover {
1531
+ background: color-mix(in srgb, var(--c-ok) 25%, transparent);
1532
+ }
1533
+ .session-gate-reject {
1534
+ border: 1px solid var(--c-line);
1535
+ background: none;
1536
+ color: var(--c-muted);
1537
+ }
1538
+ .session-gate-reject:hover {
1539
+ border-color: color-mix(in srgb, var(--c-danger) 45%, transparent);
1540
+ color: var(--c-danger);
1541
+ }
1542
+ .session-gate-approve:disabled,
1543
+ .session-gate-reject:disabled {
1544
+ opacity: 0.6;
1545
+ cursor: progress;
1546
+ }
1547
+
1548
+ /* Timeline */
1549
+ /* One row, always: compact chips, no wrapping, and the row runs full-bleed
1550
+ across the panel's inner padding so all six fit. If a theme/locale ever
1551
+ makes them wider still, the row pans horizontally instead of stacking. */
1552
+ .session-section-toggle {
1553
+ display: flex;
1554
+ align-items: center;
1555
+ gap: 8px;
1556
+ width: 100%;
1557
+ padding: 0;
1558
+ background: none;
1559
+ border: none;
1560
+ cursor: pointer;
1561
+ text-align: left;
1562
+ }
1563
+ .session-work-summary {
1564
+ margin-left: auto;
1565
+ display: inline-flex;
1566
+ align-items: center;
1567
+ gap: 6px;
1568
+ font: 10px/1 var(--mono);
1569
+ color: var(--c-muted);
1570
+ }
1571
+ .session-work-dot {
1572
+ width: 8px;
1573
+ height: 8px;
1574
+ border-radius: 50%;
1575
+ background: var(--c-ok);
1576
+ animation: session-work-pulse 1.6s ease-in-out infinite;
1577
+ }
1578
+ @keyframes session-work-pulse {
1579
+ 0%,
1580
+ 100% {
1581
+ opacity: 0.45;
1582
+ transform: scale(0.85);
1583
+ }
1584
+ 50% {
1585
+ opacity: 1;
1586
+ transform: scale(1);
1587
+ }
1588
+ }
1589
+ .session-section-chevron {
1590
+ color: var(--c-muted);
1591
+ font-size: 13px;
1592
+ transition: transform 0.15s ease;
1593
+ }
1594
+ .session-section-chevron.is-open {
1595
+ transform: rotate(90deg);
1596
+ }
1597
+
1598
+ .session-undo-row {
1599
+ display: flex;
1600
+ align-items: center;
1601
+ gap: 8px;
1602
+ padding: 7px 12px;
1603
+ border-bottom: 1px solid var(--c-line);
1604
+ background: var(--c-accent-8);
1605
+ }
1606
+ .session-undo-text {
1607
+ flex: 1;
1608
+ min-width: 0;
1609
+ overflow: hidden;
1610
+ text-overflow: ellipsis;
1611
+ white-space: nowrap;
1612
+ font-size: 11px;
1613
+ color: var(--c-text-soft);
1614
+ }
1615
+ .session-undo-btn {
1616
+ flex-shrink: 0;
1617
+ padding: 3px 10px;
1618
+ border: 1px solid var(--c-accent-25);
1619
+ border-radius: 999px;
1620
+ background: none;
1621
+ color: var(--c-accent);
1622
+ font-size: 11px;
1623
+ font-weight: 600;
1624
+ cursor: pointer;
1625
+ }
1626
+ .session-undo-btn:hover {
1627
+ background: var(--c-accent-10);
1628
+ }
1629
+
1630
+ .session-timeline-filters {
1631
+ display: flex;
1632
+ flex-wrap: nowrap;
1633
+ gap: 1px;
1634
+ margin: 2px -12px 8px;
1635
+ /* Compact panels (Amp portal, 0.5.0 report B): six chips overflowed the
1636
+ row by 11px — tighter inset + chip padding buys ~16px back. */
1637
+ padding: 0 8px;
1638
+ overflow-x: auto;
1639
+ scrollbar-width: none;
1640
+ }
1641
+ .session-timeline-filters::-webkit-scrollbar {
1642
+ display: none;
1643
+ }
1644
+
1645
+ /* The hovered/active chip's one-line meaning — rendered in flow because an
1646
+ anchored tooltip would clip against the filter row's own scroll container. */
1647
+ .session-timeline-hint {
1648
+ margin: -4px 0 8px;
1649
+ font-size: 10px;
1650
+ line-height: 1.35;
1651
+ color: var(--c-muted);
1652
+ min-height: 14px;
1653
+ }
1654
+ .session-timeline-filters .activity-filter {
1655
+ flex-shrink: 0;
1656
+ padding: 2px 4px;
1657
+ }
1658
+
1659
+ .session-timeline-row {
1660
+ --tone: var(--c-muted);
1661
+ display: flex;
1662
+ gap: 8px;
1663
+ padding: 4px 2px;
1664
+ }
1665
+ .session-timeline-row.tone-accent {
1666
+ --tone: var(--c-accent);
1667
+ }
1668
+ .session-timeline-row.tone-ok {
1669
+ --tone: var(--c-ok);
1670
+ }
1671
+ .session-timeline-row.tone-warn {
1672
+ --tone: var(--c-warn);
1673
+ }
1674
+ .session-timeline-row.tone-danger {
1675
+ --tone: var(--c-danger);
1676
+ }
1677
+ .session-timeline-row.tone-purple {
1678
+ --tone: var(--c-purple);
1679
+ }
1680
+ .session-timeline-dot {
1681
+ width: 6px;
1682
+ height: 6px;
1683
+ margin-top: 5px;
1684
+ border-radius: 50%;
1685
+ background: var(--tone);
1686
+ flex-shrink: 0;
1687
+ }
1688
+ .session-timeline-main {
1689
+ flex: 1;
1690
+ min-width: 0;
1691
+ }
1692
+ .session-timeline-head {
1693
+ display: flex;
1694
+ align-items: baseline;
1695
+ gap: 8px;
1696
+ }
1697
+ .session-timeline-label {
1698
+ font-size: 11px;
1699
+ font-weight: 600;
1700
+ color: var(--tone);
1701
+ }
1702
+ /* Row writer in its identity hue — multi-assistant boards need every row to
1703
+ answer "who wrote this" without opening anything. */
1704
+ .session-timeline-who {
1705
+ font-size: 10px;
1706
+ font-weight: 600;
1707
+ color: var(--identity-color, var(--c-muted));
1708
+ white-space: nowrap;
1709
+ overflow: hidden;
1710
+ text-overflow: ellipsis;
1711
+ max-width: 40%;
1712
+ }
1713
+ .session-timeline-undo {
1714
+ display: inline-flex;
1715
+ align-items: center;
1716
+ gap: 5px;
1717
+ margin-top: 5px;
1718
+ padding: 4px 12px;
1719
+ border: 1px solid var(--c-accent);
1720
+ border-radius: 999px;
1721
+ background: var(--c-accent-10);
1722
+ color: var(--c-accent);
1723
+ font-size: 11.5px;
1724
+ font-weight: 700;
1725
+ cursor: pointer;
1726
+ animation: session-work-pulse 1.6s ease-in-out 2;
1727
+ }
1728
+ .session-timeline-undo:hover {
1729
+ background: var(--c-accent);
1730
+ color: var(--c-bg);
1731
+ }
1732
+ .session-timeline-undone {
1733
+ margin-top: 2px;
1734
+ font: 9px var(--mono);
1735
+ color: var(--c-dim);
1736
+ }
1737
+ .session-timeline-body {
1738
+ font-size: 10.5px;
1739
+ line-height: 1.5;
1740
+ color: var(--c-text-soft);
1741
+ overflow-wrap: anywhere;
1742
+ }
1743
+
1744
+ /* Scope row (session panel) */
1745
+ .session-scope {
1746
+ display: flex;
1747
+ align-items: center;
1748
+ gap: 8px;
1749
+ padding: 8px 12px 8px 16px;
1750
+ border-bottom: 1px solid var(--c-line);
1751
+ font-size: 10.5px;
1752
+ color: var(--c-muted);
1753
+ }
1754
+ .session-scope.is-fenced {
1755
+ background: color-mix(in srgb, var(--c-purple) 8%, transparent);
1756
+ color: var(--c-text-soft);
1757
+ }
1758
+ .session-scope-dot {
1759
+ width: 6px;
1760
+ height: 6px;
1761
+ border-radius: 50%;
1762
+ background: var(--c-dim);
1763
+ flex-shrink: 0;
1764
+ }
1765
+ .session-scope.is-fenced .session-scope-dot {
1766
+ background: var(--c-purple);
1767
+ }
1768
+ .session-scope-text {
1769
+ flex: 1;
1770
+ min-width: 0;
1771
+ }
1772
+ .session-scope-text strong {
1773
+ color: var(--c-purple);
1774
+ }
1775
+ .session-scope-action {
1776
+ padding: 3px 9px;
1777
+ border-radius: 6px;
1778
+ border: 1px solid var(--c-line);
1779
+ background: none;
1780
+ color: var(--c-muted);
1781
+ font-size: 10.5px;
1782
+ font-weight: 600;
1783
+ cursor: pointer;
1784
+ white-space: nowrap;
1785
+ }
1786
+ .session-scope-action:hover:not(:disabled) {
1787
+ border-color: color-mix(in srgb, var(--c-purple) 45%, transparent);
1788
+ color: var(--c-purple);
1789
+ }
1790
+ .session-scope-action:disabled {
1791
+ opacity: 0.5;
1792
+ cursor: default;
1793
+ }
1794
+
1795
+ /* Scope fence on the canvas (world layer) */
1796
+ .scope-fence {
1797
+ position: absolute;
1798
+ left: 0;
1799
+ top: 0;
1800
+ z-index: 1;
1801
+ pointer-events: none;
1802
+ border: 1.5px dashed color-mix(in srgb, var(--c-purple) 40%, transparent);
1803
+ border-radius: 16px;
1804
+ background: color-mix(in srgb, var(--c-purple) 3%, transparent);
1805
+ }
1806
+ .scope-fence-pill {
1807
+ position: absolute;
1808
+ left: 14px;
1809
+ transform-origin: 0 50%;
1810
+ padding: 3px 10px;
1811
+ border-radius: 999px;
1812
+ border: 1px solid color-mix(in srgb, var(--c-purple) 35%, transparent);
1813
+ background: color-mix(in srgb, var(--c-panel) 92%, var(--c-purple) 8%);
1814
+ color: var(--c-purple);
1815
+ font-size: 10px;
1816
+ font-weight: 600;
1817
+ letter-spacing: 0.04em;
1818
+ white-space: nowrap;
1819
+ }
1820
+ .scope-fence-pill-top {
1821
+ top: -11px;
1822
+ }
1823
+ .scope-fence-pill-bottom {
1824
+ bottom: -11px;
1825
+ color: var(--c-muted);
1826
+ font-weight: 500;
1827
+ letter-spacing: 0;
1828
+ }
1829
+
1830
+ /* ── Command bar (rail-chrome-v2 phase 5) ─────────────────────
1831
+ The human's steering surface while a session is attached: the design's
1832
+ floating composer, centered at the bottom of the canvas region, with the
1833
+ pinned-context chips floating above it. */
1834
+ .command-bar {
1835
+ position: absolute;
1836
+ left: 50%;
1837
+ bottom: 18px;
1838
+ transform: translateX(-50%);
1839
+ width: min(560px, calc(100% - 48px));
1840
+ z-index: 65;
1841
+ display: flex;
1842
+ flex-direction: column;
1843
+ gap: 6px;
1844
+ }
1845
+ .command-bar-chips {
1846
+ display: flex;
1847
+ flex-wrap: wrap;
1848
+ align-items: center;
1849
+ gap: 6px;
1850
+ }
1851
+ .command-bar-chip {
1852
+ display: inline-flex;
1853
+ align-items: center;
1854
+ gap: 5px;
1855
+ max-width: 240px;
1856
+ padding: 2px 5px 2px 9px;
1857
+ border-radius: 999px;
1858
+ border: 1px solid color-mix(in srgb, var(--c-warn) 35%, transparent);
1859
+ background: color-mix(in srgb, var(--c-warn) 12%, transparent);
1860
+ color: var(--c-warn);
1861
+ font-size: 10px;
1862
+ font-weight: 600;
1863
+ }
1864
+ .command-bar-chip-glyph {
1865
+ font-size: 10px;
1866
+ line-height: 1;
1867
+ }
1868
+ .command-bar-chip-label {
1869
+ overflow: hidden;
1870
+ text-overflow: ellipsis;
1871
+ white-space: nowrap;
1872
+ }
1873
+ .command-bar-chip-unpin {
1874
+ width: 14px;
1875
+ height: 14px;
1876
+ border: none;
1877
+ border-radius: 50%;
1878
+ background: none;
1879
+ color: var(--c-warn);
1880
+ font-size: 12px;
1881
+ line-height: 1;
1882
+ cursor: pointer;
1883
+ opacity: 0.7;
1884
+ }
1885
+ .command-bar-chip-unpin:hover {
1886
+ opacity: 1;
1887
+ background: color-mix(in srgb, var(--c-warn) 25%, transparent);
1888
+ }
1889
+ .command-bar-chips-note {
1890
+ font-size: 10px;
1891
+ color: var(--c-dim);
1892
+ }
1893
+ .command-bar-composer {
1894
+ display: flex;
1895
+ align-items: center;
1896
+ gap: 10px;
1897
+ padding: 10px 14px;
1898
+ border-radius: 12px;
1899
+ border: 1px solid var(--c-line);
1900
+ background: color-mix(in srgb, var(--c-panel) 95%, transparent);
1901
+ backdrop-filter: blur(16px);
1902
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
1903
+ }
1904
+ .command-bar-target {
1905
+ appearance: none;
1906
+ -webkit-appearance: none;
1907
+ max-width: 148px;
1908
+ padding: 4px 18px 4px 8px;
1909
+ border: 1px solid var(--c-line);
1910
+ border-radius: 7px;
1911
+ background: color-mix(in srgb, var(--c-panel) 80%, transparent)
1912
+ 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")
1913
+ no-repeat right 6px center;
1914
+ color: var(--c-text-soft);
1915
+ font: 12px/1.3 var(--mono);
1916
+ cursor: pointer;
1917
+ flex-shrink: 0;
1918
+ }
1919
+ .command-bar-target:hover,
1920
+ .command-bar-target:focus-visible {
1921
+ border-color: var(--c-accent-25);
1922
+ color: var(--c-text);
1923
+ }
1924
+
1925
+ .command-bar-icon {
1926
+ flex-shrink: 0;
1927
+ color: var(--c-purple);
1928
+ }
1929
+ .command-bar-input {
1930
+ flex: 1;
1931
+ min-width: 0;
1932
+ padding: 0;
1933
+ border: none;
1934
+ outline: none;
1935
+ background: none;
1936
+ color: var(--c-text);
1937
+ font: 13px var(--font);
1938
+ }
1939
+ .command-bar-input::placeholder {
1940
+ color: var(--c-dim);
1941
+ }
1942
+ .command-bar-composer:focus-within {
1943
+ border-color: color-mix(in srgb, var(--c-accent) 45%, var(--c-line));
1944
+ }
1945
+ .command-bar-send {
1946
+ flex-shrink: 0;
1947
+ padding: 5px 14px;
1948
+ border-radius: 7px;
1949
+ border: none;
1950
+ background: var(--c-accent);
1951
+ color: var(--c-bg);
1952
+ font-size: 11px;
1953
+ font-weight: 600;
1954
+ cursor: pointer;
1955
+ }
1956
+ .command-bar-send:hover:not(:disabled) {
1957
+ background: color-mix(in srgb, var(--c-accent) 80%, white);
1958
+ }
1959
+ .command-bar-send:disabled {
1960
+ opacity: 0.45;
1961
+ cursor: default;
1962
+ }
1963
+
1964
+ /* Context-budget meter in the top bar (session-only) */
1965
+ .context-budget {
1966
+ --tone: var(--c-ok);
1967
+ display: inline-flex;
1968
+ align-items: center;
1969
+ gap: 8px;
1970
+ flex-shrink: 0;
1971
+ }
1972
+ .context-budget.tone-warn {
1973
+ --tone: var(--c-warn);
1974
+ }
1975
+ .context-budget.tone-danger {
1976
+ --tone: var(--c-danger);
1977
+ }
1978
+ .context-budget-caption {
1979
+ font-size: 10px;
1980
+ font-weight: 600;
1981
+ letter-spacing: 0.06em;
1982
+ text-transform: uppercase;
1983
+ color: var(--c-muted);
1984
+ }
1985
+ .context-budget-track {
1986
+ display: block;
1987
+ width: 72px;
1988
+ height: 5px;
1989
+ border-radius: 3px;
1990
+ background: var(--c-line);
1991
+ overflow: hidden;
1992
+ }
1993
+ .context-budget-fill {
1994
+ display: block;
1995
+ height: 100%;
1996
+ border-radius: 3px;
1997
+ background: linear-gradient(90deg, var(--c-accent), var(--c-warn));
1998
+ transition: width 180ms ease;
1999
+ }
2000
+ .context-budget.tone-warn .context-budget-fill,
2001
+ .context-budget.tone-danger .context-budget-fill {
2002
+ background: var(--tone);
2003
+ }
2004
+ .context-budget-label {
2005
+ font: 11px var(--mono);
2006
+ color: var(--c-text-soft);
2007
+ min-width: 30px;
2008
+ text-align: right;
2009
+ }
2010
+
2011
+ /* ── External Steering (rail-chrome-v2 phase 6) ───────────────
2012
+ External writers, no session: a passive top-bar indicator, the activity
2013
+ feed popover under it, and the connected-writers sheet. Quiet otherwise. */
2014
+ .writer-avatar {
2015
+ display: inline-flex;
2016
+ align-items: center;
2017
+ justify-content: center;
2018
+ border-radius: 50%;
2019
+ border: 1.5px solid var(--c-panel-soft);
2020
+ color: var(--c-bg);
2021
+ font-size: 8.5px;
2022
+ font-weight: 700;
2023
+ flex-shrink: 0;
2024
+ }
2025
+ .external-indicator {
2026
+ display: inline-flex;
2027
+ align-items: center;
2028
+ gap: 8px;
2029
+ padding: 4px 12px 4px 6px;
2030
+ border-radius: 999px;
2031
+ border: 1px solid color-mix(in srgb, var(--c-purple) 35%, transparent);
2032
+ background: color-mix(in srgb, var(--c-purple) 8%, transparent);
2033
+ color: var(--c-purple);
2034
+ cursor: pointer;
2035
+ white-space: nowrap;
2036
+ flex-shrink: 0;
2037
+ font: inherit;
2038
+ }
2039
+ .external-indicator:hover,
2040
+ .external-indicator[aria-expanded='true'] {
2041
+ background: color-mix(in srgb, var(--c-purple) 15%, transparent);
2042
+ }
2043
+ .external-indicator-avatars {
2044
+ display: inline-flex;
2045
+ align-items: center;
2046
+ }
2047
+ .external-indicator-avatars .writer-avatar + .writer-avatar {
2048
+ margin-left: -6px;
2049
+ }
2050
+ .external-indicator-label {
2051
+ font-size: 11px;
2052
+ font-weight: 600;
2053
+ }
2054
+ .external-indicator-ops {
2055
+ font: 10px var(--mono);
2056
+ color: var(--c-muted);
2057
+ }
2058
+ .external-indicator-dot {
2059
+ width: 7px;
2060
+ height: 7px;
2061
+ border-radius: 50%;
2062
+ background: var(--c-purple);
2063
+ flex-shrink: 0;
2064
+ animation: presence-pulse 1.4s ease-in-out infinite;
2065
+ }
2066
+
2067
+ .activity-feed {
2068
+ position: absolute;
2069
+ top: 10px;
2070
+ right: 14px;
2071
+ width: min(304px, calc(100% - 28px));
2072
+ max-height: calc(100% - 20px);
2073
+ display: flex;
2074
+ flex-direction: column;
2075
+ background: var(--c-panel);
2076
+ border: 1px solid color-mix(in srgb, var(--c-purple) 30%, transparent);
2077
+ border-radius: 10px;
2078
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2079
+ /* Popover-level like the rail menus: above the minimap, below the rail. */
2080
+ z-index: 9999;
2081
+ overflow: hidden;
2082
+ }
2083
+ .activity-feed-head {
2084
+ display: flex;
2085
+ align-items: center;
2086
+ gap: 8px;
2087
+ padding: 9px 13px;
2088
+ border-bottom: 1px solid var(--c-line);
2089
+ background: color-mix(in srgb, var(--c-bg) 60%, transparent);
2090
+ }
2091
+ .activity-feed-titles {
2092
+ flex: 1;
2093
+ min-width: 0;
2094
+ }
2095
+ .activity-feed-title {
2096
+ font-size: 11.5px;
2097
+ font-weight: 600;
2098
+ color: var(--c-text);
2099
+ }
2100
+ .activity-feed-sub {
2101
+ font: 9px var(--mono);
2102
+ color: var(--c-dim);
2103
+ }
2104
+ .activity-feed-close {
2105
+ background: none;
2106
+ border: none;
2107
+ color: var(--c-muted);
2108
+ font-size: 14px;
2109
+ cursor: pointer;
2110
+ padding: 0 2px;
2111
+ }
2112
+ .activity-feed-close:hover {
2113
+ color: var(--c-text);
2114
+ }
2115
+ .activity-filters {
2116
+ display: flex;
2117
+ flex-wrap: wrap;
2118
+ gap: 4px;
2119
+ padding: 7px 10px;
2120
+ border-bottom: 1px solid var(--c-line);
2121
+ }
2122
+ .activity-filter {
2123
+ --writer: var(--c-purple);
2124
+ padding: 2px 9px;
2125
+ border-radius: 999px;
2126
+ border: 1px solid var(--c-line);
2127
+ background: none;
2128
+ color: var(--c-muted);
2129
+ font-size: 10px;
2130
+ font-weight: 600;
2131
+ cursor: pointer;
2132
+ }
2133
+ .activity-filter.is-active {
2134
+ border-color: color-mix(in srgb, var(--writer) 45%, transparent);
2135
+ background: color-mix(in srgb, var(--writer) 14%, transparent);
2136
+ color: var(--writer);
2137
+ }
2138
+ .activity-rows {
2139
+ display: flex;
2140
+ flex-direction: column;
2141
+ overflow-y: auto;
2142
+ min-height: 0;
2143
+ }
2144
+ .activity-row {
2145
+ display: flex;
2146
+ gap: 9px;
2147
+ padding: 9px 13px;
2148
+ border-bottom: 1px solid var(--c-line);
2149
+ }
2150
+ .activity-row:last-child {
2151
+ border-bottom: none;
2152
+ }
2153
+ .activity-row.is-pending {
2154
+ background: color-mix(in srgb, var(--c-purple) 5%, transparent);
2155
+ }
2156
+ .activity-glyph {
2157
+ flex-shrink: 0;
2158
+ width: 13px;
2159
+ margin-top: 1px;
2160
+ text-align: center;
2161
+ font-size: 11px;
2162
+ font-weight: 700;
2163
+ line-height: 1.3;
2164
+ }
2165
+ .activity-glyph.tone-ok {
2166
+ color: var(--c-ok);
2167
+ }
2168
+ .activity-glyph.tone-danger {
2169
+ color: var(--c-danger);
2170
+ }
2171
+ .activity-glyph.tone-accent {
2172
+ color: var(--c-accent);
2173
+ }
2174
+ .activity-glyph.tone-purple {
2175
+ color: var(--c-purple);
2176
+ }
2177
+ .activity-main {
2178
+ flex: 1;
2179
+ min-width: 0;
2180
+ }
2181
+ .activity-text {
2182
+ font-size: 11px;
2183
+ color: var(--c-text-soft);
2184
+ overflow-wrap: anywhere;
2185
+ }
2186
+ .activity-meta {
2187
+ font-size: 10px;
2188
+ line-height: 1.45;
2189
+ color: var(--c-muted);
2190
+ }
2191
+ .activity-writer {
2192
+ font: 8.5px var(--mono);
2193
+ }
2194
+ .activity-actions {
2195
+ display: flex;
2196
+ align-items: center;
2197
+ gap: 6px;
2198
+ margin-top: 6px;
2199
+ }
2200
+ .activity-veto {
2201
+ padding: 3px 10px;
2202
+ border-radius: 7px;
2203
+ background: none;
2204
+ border: 1px solid color-mix(in srgb, var(--c-danger) 40%, transparent);
2205
+ color: var(--c-danger);
2206
+ font-size: 10.5px;
2207
+ font-weight: 600;
2208
+ cursor: pointer;
2209
+ }
2210
+ .activity-veto:hover {
2211
+ background: color-mix(in srgb, var(--c-danger) 10%, transparent);
2212
+ }
2213
+ .activity-hint,
2214
+ .activity-age {
2215
+ font: 9px var(--mono);
2216
+ color: var(--c-dim);
2217
+ flex-shrink: 0;
2218
+ }
2219
+ .activity-empty {
2220
+ padding: 14px 13px;
2221
+ font-size: 11px;
2222
+ color: var(--c-dim);
2223
+ }
2224
+ .activity-feed-foot {
2225
+ display: flex;
2226
+ align-items: center;
2227
+ gap: 10px;
2228
+ padding: 8px 13px;
2229
+ border-top: 1px solid var(--c-line);
2230
+ background: color-mix(in srgb, var(--c-bg) 50%, transparent);
2231
+ }
2232
+ .activity-feed-note {
2233
+ flex: 1;
2234
+ font-size: 10px;
2235
+ color: var(--c-dim);
2236
+ }
2237
+ .activity-feed-link {
2238
+ background: none;
2239
+ border: none;
2240
+ padding: 0;
2241
+ color: var(--c-muted);
2242
+ font-size: 10.5px;
2243
+ font-weight: 600;
2244
+ cursor: pointer;
2245
+ }
2246
+ .activity-feed-link:hover {
2247
+ color: var(--c-text);
2248
+ }
2249
+ .activity-feed-link.is-accent {
2250
+ color: var(--c-purple);
2251
+ }
2252
+ .activity-feed-link.is-accent:hover {
2253
+ text-decoration: underline;
2254
+ }
2255
+
2256
+ .writers-scrim {
2257
+ position: absolute;
2258
+ inset: 0;
2259
+ background: rgba(4, 10, 18, 0.55);
2260
+ z-index: 9999;
2261
+ }
2262
+ .writers-sheet {
2263
+ position: absolute;
2264
+ top: 50%;
2265
+ left: 50%;
2266
+ transform: translate(-50%, -50%);
2267
+ width: 400px;
2268
+ max-width: calc(100% - 48px);
2269
+ background: var(--c-panel);
2270
+ border: 1px solid var(--c-line);
2271
+ border-radius: 12px;
2272
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
2273
+ z-index: 10000;
2274
+ overflow: hidden;
2275
+ }
2276
+ .writers-head {
2277
+ display: flex;
2278
+ align-items: center;
2279
+ gap: 8px;
2280
+ padding: 11px 14px;
2281
+ border-bottom: 1px solid var(--c-line);
2282
+ background: color-mix(in srgb, var(--c-bg) 60%, transparent);
2283
+ }
2284
+ .writers-title {
2285
+ flex: 1;
2286
+ font-size: 12px;
2287
+ font-weight: 600;
2288
+ color: var(--c-text);
2289
+ }
2290
+ .writers-board {
2291
+ font: 9px var(--mono);
2292
+ color: var(--c-dim);
2293
+ }
2294
+ .writers-body {
2295
+ display: flex;
2296
+ flex-direction: column;
2297
+ gap: 4px;
2298
+ padding: 10px 14px;
2299
+ }
2300
+ .writers-section {
2301
+ padding: 8px 0 2px;
2302
+ font-size: 9px;
2303
+ font-weight: 700;
2304
+ letter-spacing: 0.08em;
2305
+ text-transform: uppercase;
2306
+ color: var(--c-dim);
2307
+ }
2308
+ .writers-row {
2309
+ display: flex;
2310
+ align-items: center;
2311
+ gap: 9px;
2312
+ padding: 6px 0;
2313
+ }
2314
+ .writers-name {
2315
+ flex: 1;
2316
+ font-size: 11.5px;
2317
+ color: var(--c-text-soft);
2318
+ min-width: 0;
2319
+ overflow: hidden;
2320
+ text-overflow: ellipsis;
2321
+ white-space: nowrap;
2322
+ }
2323
+ .writers-name.is-mono {
2324
+ font: 11px var(--mono);
2325
+ }
2326
+ .writers-config {
2327
+ font-size: 9.5px;
2328
+ font-weight: 600;
2329
+ padding: 2px 8px;
2330
+ border-radius: 999px;
2331
+ background: color-mix(in srgb, var(--c-purple) 12%, transparent);
2332
+ color: var(--c-purple);
2333
+ }
2334
+ .writers-meta {
2335
+ font: 9.5px var(--mono);
2336
+ color: var(--c-dim);
2337
+ }
2338
+ .writers-empty {
2339
+ font-size: 10.5px;
2340
+ color: var(--c-dim);
2341
+ padding: 4px 0;
2342
+ }
2343
+ .writers-foot {
2344
+ display: flex;
2345
+ align-items: center;
2346
+ gap: 10px;
2347
+ padding: 10px 14px;
2348
+ border-top: 1px solid var(--c-line);
2349
+ background: color-mix(in srgb, var(--c-bg) 50%, transparent);
2350
+ }
2351
+ .writers-note {
2352
+ flex: 1;
2353
+ font-size: 10px;
2354
+ color: var(--c-dim);
2355
+ }
2356
+ .writers-done {
2357
+ padding: 5px 14px;
2358
+ border: none;
2359
+ border-radius: 7px;
2360
+ background: var(--c-accent);
2361
+ color: var(--c-bg);
2362
+ font-size: 11px;
2363
+ font-weight: 600;
2364
+ cursor: pointer;
2365
+ }
2366
+
2367
+ /* ── Minimap v2 (rail-chrome-v2 phase 7, item 19) ─────────────
2368
+ True-scale map from the store; magnifies ×1.7 from the bottom-right on hover. */
2369
+ .minimap {
2370
+ position: absolute;
2371
+ bottom: 18px;
2372
+ right: 16px;
2373
+ width: 168px;
2374
+ height: 112px;
2375
+ border: 1px solid var(--c-line);
2376
+ border-radius: 8px;
2377
+ overflow: hidden;
2378
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.35);
2379
+ background: color-mix(in srgb, var(--c-panel-soft) 94%, transparent);
2380
+ backdrop-filter: blur(8px);
2381
+ z-index: 60;
2382
+ opacity: 0.85;
2383
+ transform-origin: bottom right;
2384
+ transition:
2385
+ transform 160ms ease,
2386
+ opacity 120ms ease;
2387
+ cursor: crosshair;
2388
+ user-select: none;
2389
+ }
2390
+ .minimap:hover {
2391
+ opacity: 1;
2392
+ transform: scale(1.7);
2393
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.55);
2394
+ }
2395
+ .minimap-node {
2396
+ position: absolute;
2397
+ border-radius: 1.5px;
2398
+ background: var(--kind);
2399
+ opacity: 0.55;
2400
+ }
2401
+ .minimap-node.is-group {
2402
+ background: color-mix(in srgb, var(--kind) 4%, transparent);
2403
+ border: 1px dashed color-mix(in srgb, var(--kind) 55%, transparent);
2404
+ opacity: 1;
2405
+ border-radius: 2px;
2406
+ }
2407
+ .minimap-node.is-selected {
2408
+ outline: 1px solid var(--c-accent);
2409
+ opacity: 0.8;
2410
+ }
2411
+ .minimap-fence {
2412
+ position: absolute;
2413
+ border: 1px dashed color-mix(in srgb, var(--c-purple) 45%, transparent);
2414
+ border-radius: 2px;
2415
+ background: color-mix(in srgb, var(--c-purple) 3%, transparent);
2416
+ }
2417
+ .minimap-presence {
2418
+ position: absolute;
2419
+ width: 8px;
2420
+ height: 8px;
2421
+ border-radius: 50%;
2422
+ background: var(--presence-color);
2423
+ border: 1.5px solid var(--c-bg);
2424
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--presence-color) 45%, transparent);
2425
+ z-index: 4;
2426
+ }
2427
+ /* Actively working = the moment the human is looking for: pulse the halo. */
2428
+ .minimap-presence.phase-thinking,
2429
+ .minimap-presence.phase-tooling {
2430
+ animation: presence-pulse 1.6s ease-in-out infinite;
2431
+ }
2432
+ .minimap-presence.is-worker {
2433
+ width: 6px;
2434
+ height: 6px;
2435
+ }
2436
+ .minimap-presence.is-external {
2437
+ opacity: 0.75;
2438
+ }
2439
+ .minimap-frame {
2440
+ position: absolute;
2441
+ border: 1.5px solid color-mix(in srgb, var(--c-accent) 85%, transparent);
2442
+ border-radius: 2px;
2443
+ background: color-mix(in srgb, var(--c-accent) 5%, transparent);
2444
+ cursor: grab;
2445
+ }
2446
+ .minimap-zoom {
2447
+ position: absolute;
2448
+ right: 5px;
2449
+ bottom: 3px;
2450
+ font: 8px var(--mono);
2451
+ color: var(--c-dim);
2452
+ }
2453
+
2454
+ /* ── Accessibility sweep (rail-chrome-v2 item 18) ───────────────
2455
+ One focus ring for every chrome control; nodes are focusable for the
2456
+ keyboard (arrow keys traverse, Enter opens); reduced motion below. */
2457
+ .tool-rail button:focus-visible,
2458
+ .top-bar button:focus-visible,
2459
+ .connection-banner button:focus-visible,
2460
+ .session-panel button:focus-visible,
2461
+ .session-panel input:focus-visible,
2462
+ .command-bar button:focus-visible,
2463
+ .command-bar-input:focus-visible,
2464
+ .selection-bar button:focus-visible,
2465
+ .activity-feed button:focus-visible,
2466
+ .writers-sheet button:focus-visible,
2467
+ .empty-state button:focus-visible,
2468
+ .session-receipt button:focus-visible,
2469
+ .snapshot-panel button:focus-visible,
2470
+ .expanded-header button:focus-visible,
2471
+ .group-action:focus-visible,
2472
+ .group-menu button:focus-visible,
2473
+ .command-palette-item:focus-visible,
2474
+ .canvas-node:focus-visible {
2475
+ outline: 2px solid var(--c-accent);
2476
+ outline-offset: 2px;
2477
+ }
2478
+ .command-bar-input:focus-visible {
2479
+ outline: none;
2480
+ }
2481
+ .canvas-node:focus {
2482
+ outline: none;
2483
+ }
2484
+ .canvas-node:focus-visible {
2485
+ outline: 2px solid var(--c-accent);
2486
+ outline-offset: 3px;
2487
+ }
2488
+
2489
+ @media (prefers-reduced-motion: reduce) {
2490
+ .human-cursor {
2491
+ transition: none;
2492
+ }
2493
+ .connection-banner-progress-fill,
2494
+ .connection-dot,
2495
+ .external-indicator-dot,
2496
+ .group-chip-expand,
2497
+ .beta-tag {
2498
+ margin-left: 2px;
2499
+ padding: 1px 5px;
2500
+ border-radius: 8px;
2501
+ border: 1px solid color-mix(in srgb, var(--c-accent) 45%, transparent);
2502
+ color: var(--c-accent);
2503
+ font-size: 9px;
2504
+ font-weight: 700;
2505
+ letter-spacing: 0.06em;
2506
+ text-transform: uppercase;
2507
+ line-height: 1.4;
2508
+ }
2509
+
2510
+ .start-session-dot {
2511
+ animation: none;
2512
+ }
2513
+ .command-palette,
2514
+ .snapshot-panel,
2515
+ .session-receipt,
2516
+ .canvas-node.group-node,
2517
+ .activity-feed,
2518
+ .writers-sheet,
2519
+ .context-budget-fill {
2520
+ animation: none;
2521
+ transition: none;
2522
+ }
2523
+ }
2524
+
2525
+ /* ── Edge creation (rail-chrome-v2 item 15) ───────────────────── */
2526
+ .canvas-node.is-edge-target {
2527
+ box-shadow: 0 0 0 2px var(--c-accent), 0 0 0 6px color-mix(in srgb, var(--c-accent) 18%, transparent);
2528
+ }
2529
+ .canvas-node.is-edge-target .node-port {
2530
+ opacity: 1;
2531
+ background: var(--c-accent);
2532
+ }
2533
+ .edge-hint-pill {
2534
+ position: absolute;
2535
+ z-index: 10000;
2536
+ display: inline-flex;
2537
+ align-items: center;
2538
+ gap: 6px;
2539
+ padding: 3px 10px;
2540
+ border-radius: 999px;
2541
+ background: color-mix(in srgb, var(--c-panel) 96%, transparent);
2542
+ border: 1px solid color-mix(in srgb, var(--c-accent) 40%, transparent);
2543
+ pointer-events: none;
2544
+ white-space: nowrap;
2545
+ }
2546
+ .edge-hint-main {
2547
+ font-size: 10px;
2548
+ font-weight: 600;
2549
+ color: var(--c-accent);
2550
+ }
2551
+ .edge-hint-keys {
2552
+ font: 9px var(--mono);
2553
+ color: var(--c-dim);
2554
+ }
2555
+
2556
+ /* ── Human collaborator presence (rail-chrome-v2 phase 8) ─────── */
2557
+ .human-presence-layer {
2558
+ position: absolute;
2559
+ left: 0;
2560
+ top: 0;
2561
+ pointer-events: none;
2562
+ z-index: 69;
2563
+ }
2564
+ .human-cursor {
2565
+ position: absolute;
2566
+ left: 0;
2567
+ top: 0;
2568
+ color: var(--c-ok);
2569
+ transition: transform 120ms linear;
2570
+ }
2571
+ .human-cursor-inner {
2572
+ transform-origin: top left;
2573
+ display: flex;
2574
+ flex-direction: column;
2575
+ align-items: flex-start;
2576
+ }
2577
+ .human-cursor-tag {
2578
+ margin-left: 11px;
2579
+ margin-top: -2px;
2580
+ padding: 3px 9px;
2581
+ border-radius: 999px;
2582
+ background: color-mix(in srgb, var(--c-ok) 92%, transparent);
2583
+ color: var(--c-bg);
2584
+ font-size: 10px;
2585
+ font-weight: 600;
2586
+ white-space: nowrap;
2587
+ }
2588
+ .human-cursor.is-grabbing .human-cursor-tag::after {
2589
+ content: ' · editing';
2590
+ font-weight: 500;
2591
+ opacity: 0.8;
2592
+ }
2593
+ .node-yield-pill {
2594
+ /* Inside the card (paint containment clips anything outside it). */
2595
+ position: absolute;
2596
+ left: 10px;
2597
+ bottom: 8px;
2598
+ z-index: 5;
2599
+ display: inline-flex;
2600
+ align-items: center;
2601
+ gap: 5px;
2602
+ padding: 2px 9px;
2603
+ border-radius: 999px;
2604
+ background: var(--c-panel-soft);
2605
+ border: 1px solid color-mix(in srgb, var(--c-warn) 40%, transparent);
2606
+ color: var(--c-warn);
2607
+ font-size: 9.5px;
2608
+ font-weight: 600;
2609
+ white-space: nowrap;
2610
+ }
2611
+ .node-yield-dot {
2612
+ width: 6px;
2613
+ height: 6px;
2614
+ border-radius: 50%;
2615
+ background: var(--c-warn);
2616
+ }
2617
+
2618
+ /* Quiet-board affordance in the top bar */
2619
+ .start-session-btn {
2620
+ display: inline-flex;
2621
+ align-items: center;
2622
+ gap: 7px;
2623
+ padding: 5px 12px;
2624
+ border-radius: 999px;
2625
+ border: 1px solid var(--c-line);
2626
+ background: none;
2627
+ color: var(--c-muted);
2628
+ font-size: 11px;
2629
+ font-weight: 600;
2630
+ white-space: nowrap;
2631
+ cursor: pointer;
2632
+ flex-shrink: 0;
2633
+ }
2634
+ .start-session-btn:hover {
2635
+ border-color: color-mix(in srgb, var(--c-purple) 40%, transparent);
2636
+ color: var(--c-purple);
2637
+ }
2638
+ .start-session-dot {
2639
+ width: 7px;
2640
+ height: 7px;
2641
+ border-radius: 50%;
2642
+ background: var(--c-dim);
2643
+ }
2644
+ .start-session-btn:hover .start-session-dot {
2645
+ background: var(--c-purple);
2646
+ }
2647
+ .session-end {
2648
+ padding: 3px 10px;
2649
+ border-radius: 6px;
2650
+ border: 1px solid var(--c-line);
2651
+ background: none;
2652
+ color: var(--c-muted);
2653
+ font-size: 10.5px;
2654
+ font-weight: 600;
2655
+ cursor: pointer;
2656
+ }
2657
+ .session-end:hover {
2658
+ border-color: color-mix(in srgb, var(--c-danger) 45%, transparent);
2659
+ color: var(--c-danger);
2660
+ }
2661
+
2662
+ /* Session receipt (design item 2) */
2663
+ .session-receipt {
2664
+ position: absolute;
2665
+ top: 14px;
2666
+ right: 14px;
2667
+ width: 290px;
2668
+ z-index: 9998;
2669
+ padding: 12px 14px;
2670
+ border-radius: 12px;
2671
+ border: 1px solid var(--c-line);
2672
+ background: color-mix(in srgb, var(--c-panel) 96%, transparent);
2673
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
2674
+ animation: session-panel-in 180ms ease;
2675
+ }
2676
+ .session-receipt-head {
2677
+ display: flex;
2678
+ align-items: center;
2679
+ gap: 8px;
2680
+ }
2681
+ .session-receipt-dot {
2682
+ width: 7px;
2683
+ height: 7px;
2684
+ border-radius: 50%;
2685
+ background: var(--c-dim);
2686
+ }
2687
+ .session-receipt-title {
2688
+ flex: 1;
2689
+ font-size: 12px;
2690
+ font-weight: 600;
2691
+ color: var(--c-text);
2692
+ }
2693
+ .session-receipt-close {
2694
+ width: 22px;
2695
+ height: 22px;
2696
+ border: none;
2697
+ border-radius: 6px;
2698
+ background: none;
2699
+ color: var(--c-muted);
2700
+ font-size: 14px;
2701
+ cursor: pointer;
2702
+ }
2703
+ .session-receipt-close:hover {
2704
+ background: var(--c-surface-hover);
2705
+ color: var(--c-text);
2706
+ }
2707
+ .session-receipt-tiles {
2708
+ display: grid;
2709
+ grid-template-columns: repeat(3, 1fr);
2710
+ gap: 8px;
2711
+ margin-top: 12px;
2712
+ }
2713
+ .session-receipt-tile {
2714
+ padding: 8px 10px;
2715
+ border-radius: 8px;
2716
+ border: 1px solid var(--c-line);
2717
+ background: color-mix(in srgb, var(--c-panel-soft) 70%, transparent);
2718
+ display: flex;
2719
+ flex-direction: column;
2720
+ gap: 2px;
2721
+ }
2722
+ .session-receipt-tile-label {
2723
+ font-size: 9.5px;
2724
+ color: var(--c-dim);
2725
+ }
2726
+ .session-receipt-tile-value {
2727
+ font-size: 15px;
2728
+ font-weight: 700;
2729
+ color: var(--c-text);
2730
+ }
2731
+ .session-receipt-tile-value.tone-ok {
2732
+ color: var(--c-ok);
2733
+ }
2734
+ .session-receipt-tile-value.tone-danger {
2735
+ color: var(--c-danger);
2736
+ }
2737
+ .session-receipt-note,
2738
+ .session-receipt-diff {
2739
+ margin-top: 10px;
2740
+ font-size: 10.5px;
2741
+ line-height: 1.5;
2742
+ color: var(--c-muted);
2743
+ }
2744
+ .session-receipt-diff {
2745
+ color: var(--c-text-soft);
2746
+ }
2747
+ .session-receipt-actions {
2748
+ display: flex;
2749
+ gap: 8px;
2750
+ margin-top: 12px;
2751
+ }
2752
+ .session-receipt-primary,
2753
+ .session-receipt-secondary {
2754
+ flex: 1;
2755
+ padding: 7px 10px;
2756
+ border-radius: 8px;
2757
+ font-size: 11px;
2758
+ font-weight: 600;
2759
+ cursor: pointer;
2760
+ }
2761
+ .session-receipt-primary {
2762
+ border: 1px solid var(--c-accent-25);
2763
+ background: var(--c-accent-12);
2764
+ color: var(--c-accent);
2765
+ }
2766
+ .session-receipt-primary:disabled {
2767
+ opacity: 0.5;
2768
+ cursor: default;
2769
+ }
2770
+ .session-receipt-secondary {
2771
+ border: 1px solid var(--c-line);
2772
+ background: none;
2773
+ color: var(--c-muted);
2774
+ }
2775
+ .session-receipt-secondary:hover {
2776
+ color: var(--c-text);
2777
+ }
2778
+
2779
+ /* Top-bar escalation badge while gates are pending */
2780
+ .gate-badge {
2781
+ display: inline-flex;
2782
+ align-items: center;
2783
+ padding: 5px 10px;
2784
+ border-radius: 999px;
2785
+ border: 1px solid color-mix(in srgb, var(--c-warn) 35%, transparent);
2786
+ background: color-mix(in srgb, var(--c-warn) 12%, transparent);
2787
+ color: var(--c-warn);
2788
+ font: 11px var(--mono);
2789
+ font-weight: 600;
2790
+ white-space: nowrap;
2791
+ flex-shrink: 0;
2792
+ }
2793
+
2794
+ @keyframes session-panel-in {
2795
+ from {
2796
+ opacity: 0;
2797
+ transform: translateX(8px);
2798
+ }
2799
+ to {
2800
+ opacity: 1;
2801
+ transform: none;
2802
+ }
2803
+ }
2804
+
2805
+ /* Below 1180px the panel floats over the canvas as a drawer (design item 12). */
2806
+ @media (max-width: 1180px) {
2807
+ .session-panel:not(.is-collapsed) {
2808
+ position: fixed;
2809
+ top: var(--hud-bar-height);
2810
+ right: 0;
2811
+ bottom: 0;
2812
+ width: 312px;
2813
+ box-shadow: -16px 0 40px rgba(0, 0, 0, 0.5);
2814
+ }
2815
+ }
2816
+
2817
+ @media (prefers-reduced-motion: reduce) {
2818
+ .session-panel {
2819
+ animation: none;
2820
+ }
2821
+ .session-live-dot,
2822
+ .session-item.status-running .session-glyph,
2823
+ .external-indicator-dot,
2824
+ .minimap-presence {
2825
+ animation: none;
2826
+ }
2827
+ .minimap {
2828
+ transition: none;
2829
+ }
2830
+ }
2831
+
2832
+ /* Pan tool / held Space: the world layer goes pointer-inert so drags land on
2833
+ the viewport container itself and pan — nodes cannot swallow the drag. */
2834
+ .canvas-viewport.pan-mode .canvas-world {
2835
+ pointer-events: none;
2836
+ }
2837
+ .canvas-viewport.pan-mode:active {
2838
+ cursor: grabbing;
2839
+ }
2840
+
2841
+ .toolbar-tooltip-anchor {
2842
+ position: relative;
2843
+ display: inline-flex;
2844
+ align-items: center;
2845
+ }
2846
+
2847
+ .toolbar-tooltip-anchor-start .toolbar-tooltip {
2848
+ left: 0;
2849
+ transform: translateX(0) translateY(6px);
2850
+ }
2851
+
2852
+ .toolbar-tooltip-anchor-end .toolbar-tooltip {
2853
+ left: auto;
2854
+ right: 0;
2855
+ transform: translateX(0) translateY(6px);
2856
+ }
2857
+
2858
+ .toolbar-tooltip {
2859
+ position: absolute;
2860
+ left: 50%;
2861
+ top: calc(100% + 10px);
2862
+ transform: translateX(-50%) translateY(6px);
2863
+ display: flex;
2864
+ flex-direction: column;
2865
+ gap: 4px;
2866
+ min-width: 168px;
2867
+ max-width: 240px;
2868
+ padding: 10px 12px;
2869
+ background: color-mix(in srgb, var(--c-panel) 92%, black 8%);
2870
+ border: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2871
+ border-radius: 10px;
2872
+ box-shadow: 0 14px 36px var(--c-shadow-heavy), 0 0 0 1px var(--c-accent-8);
2873
+ backdrop-filter: blur(14px);
2874
+ color: var(--c-text);
2875
+ font-size: 12px;
2876
+ line-height: 1.35;
2877
+ white-space: normal;
2878
+ opacity: 0;
2879
+ pointer-events: none;
2880
+ z-index: 10010;
2881
+ transition: opacity 0.14s ease, transform 0.14s ease;
2882
+ }
2883
+
2884
+ .toolbar-tooltip::after {
2885
+ content: '';
2886
+ position: absolute;
2887
+ left: 50%;
2888
+ top: -5px;
2889
+ width: 10px;
2890
+ height: 10px;
2891
+ background: inherit;
2892
+ border-top: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2893
+ border-left: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2894
+ transform: translateX(-50%) rotate(45deg);
2895
+ }
2896
+
2897
+ .toolbar-tooltip-anchor-start .toolbar-tooltip::after {
2898
+ left: 18px;
2899
+ transform: rotate(45deg);
2900
+ }
2901
+
2902
+ .toolbar-tooltip-anchor-end .toolbar-tooltip::after {
2903
+ left: auto;
2904
+ right: 18px;
2905
+ transform: rotate(45deg);
2906
+ }
2907
+
2908
+ /* Up variant: bottom-anchored bars (selection bar) open their tooltip above. */
2909
+ .toolbar-tooltip-anchor-up .toolbar-tooltip {
2910
+ top: auto;
2911
+ bottom: calc(100% + 10px);
2912
+ transform: translateX(-50%) translateY(-6px);
2913
+ }
2914
+ .toolbar-tooltip-anchor-up .toolbar-tooltip::after {
2915
+ top: auto;
2916
+ bottom: -5px;
2917
+ border-top: none;
2918
+ border-left: none;
2919
+ border-bottom: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2920
+ border-right: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2921
+ }
2922
+ .toolbar-tooltip-anchor-up:hover .toolbar-tooltip,
2923
+ .toolbar-tooltip-anchor-up > :focus-visible + .toolbar-tooltip {
2924
+ transform: translateX(-50%) translateY(0);
2925
+ }
2926
+
2927
+ /* :focus-within opens the tooltip only on tap-to-open (informational)
2928
+ anchors — an action button's tooltip must dismiss after its click. */
2929
+ .toolbar-tooltip-anchor:hover .toolbar-tooltip,
2930
+ .toolbar-tooltip-anchor-tap:focus-within .toolbar-tooltip,
2931
+ .toolbar-tooltip-anchor > :focus-visible + .toolbar-tooltip {
2932
+ opacity: 1;
2933
+ transform: translateX(-50%) translateY(0);
2934
+ }
2935
+
2936
+ .toolbar-tooltip-anchor-start:hover .toolbar-tooltip,
2937
+ .toolbar-tooltip-anchor-start.toolbar-tooltip-anchor-tap:focus-within .toolbar-tooltip,
2938
+ .toolbar-tooltip-anchor-start > :focus-visible + .toolbar-tooltip,
2939
+ .toolbar-tooltip-anchor-end:hover .toolbar-tooltip,
2940
+ .toolbar-tooltip-anchor-end.toolbar-tooltip-anchor-tap:focus-within .toolbar-tooltip,
2941
+ .toolbar-tooltip-anchor-end > :focus-visible + .toolbar-tooltip {
2942
+ transform: translateX(0) translateY(0);
2943
+ }
2944
+
2945
+ .toolbar-tooltip-anchor {
2946
+ outline: none;
2947
+ }
2948
+
2949
+ /* Rail variant: fixed beside the hovered button (the rail's scroll clip would
2950
+ swallow an absolute one), arrow on the left, mounted only while hovered. */
2951
+ .toolbar-tooltip.rail-tooltip {
2952
+ position: fixed;
2953
+ right: auto;
2954
+ bottom: auto;
2955
+ min-width: 0;
2956
+ opacity: 1;
2957
+ transform: translateY(-50%);
2958
+ animation: rail-tooltip-in 0.14s ease both;
2959
+ }
2960
+ .toolbar-tooltip.rail-tooltip::after {
2961
+ left: -5px;
2962
+ top: 50%;
2963
+ border-top: none;
2964
+ border-right: none;
2965
+ border-bottom: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2966
+ border-left: 1px solid color-mix(in srgb, var(--c-line) 78%, var(--c-accent) 22%);
2967
+ transform: translateY(-50%) rotate(45deg);
2968
+ }
2969
+ @keyframes rail-tooltip-in {
2970
+ from {
2971
+ opacity: 0;
2972
+ transform: translateY(-50%) translateX(-4px);
2973
+ }
2974
+ to {
2975
+ opacity: 1;
2976
+ transform: translateY(-50%) translateX(0);
1032
2977
  }
1033
2978
  }
1034
2979
 
1035
- .toolbar-group {
2980
+ .toolbar-tooltip-body {
2981
+ font-size: 11.5px;
2982
+ line-height: 1.45;
2983
+ color: var(--c-text-soft);
2984
+ }
2985
+
2986
+ .toolbar-tooltip-label {
2987
+ font-size: 13px;
2988
+ font-weight: 600;
2989
+ letter-spacing: 0.01em;
2990
+ color: var(--c-text);
2991
+ }
2992
+
2993
+ .toolbar-tooltip-meta {
2994
+ display: flex;
2995
+ align-items: center;
2996
+ justify-content: space-between;
2997
+ gap: 10px;
2998
+ color: var(--c-text-soft);
2999
+ }
3000
+
3001
+ .toolbar-tooltip-shortcut {
3002
+ display: inline-flex;
3003
+ align-items: center;
3004
+ justify-content: center;
3005
+ min-height: 20px;
3006
+ padding: 2px 7px;
3007
+ border-radius: 999px;
3008
+ border: 1px solid var(--c-accent-25);
3009
+ background: var(--c-accent-10);
3010
+ color: var(--c-accent);
3011
+ font: 11px/1 var(--mono);
3012
+ white-space: nowrap;
3013
+ }
3014
+
3015
+ .connection-dot {
3016
+ width: 8px;
3017
+ height: 8px;
3018
+ border-radius: 50%;
3019
+ flex-shrink: 0;
3020
+ }
3021
+
3022
+ .connection-dot.connected {
3023
+ background: var(--c-ok);
3024
+ }
3025
+ .connection-dot.connecting {
3026
+ background: var(--c-warn);
3027
+ animation: pulse 1.5s infinite;
3028
+ }
3029
+ .connection-dot.disconnected {
3030
+ background: var(--c-danger);
3031
+ }
3032
+ .connection-dot.reconnecting {
3033
+ background: var(--c-warn);
3034
+ animation: pulse 1.5s infinite;
3035
+ }
3036
+ .connection-dot.resyncing {
3037
+ background: var(--c-accent);
3038
+ animation: pulse 1.5s infinite;
3039
+ }
3040
+
3041
+ /* Degraded-connection banner under the top bar (phase 7, item 14) */
3042
+ .connection-banner {
1036
3043
  display: flex;
1037
- flex-wrap: wrap;
1038
3044
  align-items: center;
1039
- gap: 6px;
3045
+ gap: 9px;
3046
+ padding: 7px 14px;
3047
+ flex-shrink: 0;
3048
+ border-bottom: 1px solid var(--c-line);
3049
+ font-size: 11.5px;
3050
+ }
3051
+ .connection-banner.is-reconnecting {
3052
+ background: color-mix(in srgb, var(--c-warn) 10%, transparent);
3053
+ border-bottom-color: color-mix(in srgb, var(--c-warn) 35%, transparent);
3054
+ color: var(--c-warn);
3055
+ }
3056
+ .connection-banner.is-resyncing {
3057
+ background: color-mix(in srgb, var(--c-accent) 8%, transparent);
3058
+ border-bottom-color: color-mix(in srgb, var(--c-accent) 30%, transparent);
3059
+ color: var(--c-accent);
3060
+ }
3061
+ .connection-banner-glyph {
3062
+ font-size: 13px;
3063
+ line-height: 1;
3064
+ }
3065
+ .connection-banner-text {
3066
+ flex: 1;
1040
3067
  min-width: 0;
1041
- max-width: 100%;
3068
+ }
3069
+ .connection-banner-meta {
3070
+ font: 9.5px var(--mono);
3071
+ color: var(--c-muted);
3072
+ }
3073
+ .connection-banner-progress {
3074
+ width: 90px;
3075
+ height: 4px;
3076
+ border-radius: 2px;
3077
+ background: var(--c-line);
3078
+ overflow: hidden;
3079
+ }
3080
+ .connection-banner-progress-fill {
3081
+ display: block;
3082
+ width: 40%;
3083
+ height: 100%;
3084
+ background: var(--c-accent);
3085
+ animation: connection-resync 1.1s ease-in-out infinite;
3086
+ }
3087
+ @keyframes connection-resync {
3088
+ from {
3089
+ transform: translateX(-100%);
3090
+ }
3091
+ to {
3092
+ transform: translateX(260%);
3093
+ }
3094
+ }
3095
+
3096
+ @keyframes pulse {
3097
+ 0%,
3098
+ 100% {
3099
+ opacity: 1;
3100
+ }
3101
+ 50% {
3102
+ opacity: 0.4;
3103
+ }
1042
3104
  }
1043
3105
 
3106
+
1044
3107
  /* Positioning parent for a toolbar popover menu. Every menu MUST live inside
1045
3108
  one of these wrapped around its trigger — anchoring to a wider ancestor
1046
3109
  opens the menu far from the button (0.4.2 report Finding T). */
@@ -1049,16 +3112,15 @@ body,
1049
3112
  display: inline-flex;
1050
3113
  }
1051
3114
 
1052
- .canvas-toolbar button svg {
1053
- display: block;
1054
- }
1055
3115
 
1056
3116
  /* ── Toolbar popover menus (theme picker + narrow-screen More menu) ── */
1057
3117
  .toolbar-menu {
1058
3118
  position: absolute;
1059
3119
  top: calc(100% + 8px);
1060
3120
  right: 0;
1061
- z-index: 1200;
3121
+ /* Above the annotation capture layer (9996) — rail popovers overlap the
3122
+ canvas region and must stay clickable while an annotation tool is armed. */
3123
+ z-index: 9999;
1062
3124
  display: flex;
1063
3125
  flex-direction: column;
1064
3126
  gap: 2px;
@@ -1141,40 +3203,6 @@ body,
1141
3203
  border-radius: 50%;
1142
3204
  }
1143
3205
 
1144
- .toolbar-more-glyph {
1145
- display: block;
1146
- font-size: 16px;
1147
- font-weight: 700;
1148
- line-height: 1;
1149
- }
1150
-
1151
- /* Wide screens: the full two-bar toolbar; the More trigger stays hidden. */
1152
- .toolbar-collapsible {
1153
- display: contents;
1154
- }
1155
-
1156
- .toolbar-more {
1157
- display: none;
1158
- }
1159
-
1160
- /* Narrow screens / embedded panels: ONE compact bar (brand, status, view
1161
- controls) — every secondary control folds into the More menu instead of
1162
- wrapping into a second toolbar row. */
1163
- @media (max-width: 900px) {
1164
- .toolbar-collapsible {
1165
- display: none;
1166
- }
1167
-
1168
- .toolbar-actions-bar {
1169
- display: none;
1170
- }
1171
-
1172
- .toolbar-more {
1173
- /* inline-flex (NOT contents): this span is also the positioning anchor
1174
- for the More menu — display:contents cannot anchor absolute children. */
1175
- display: inline-flex;
1176
- }
1177
- }
1178
3206
 
1179
3207
  @media (max-width: 900px) {
1180
3208
  .toolbar-tooltip {
@@ -1193,16 +3221,39 @@ body,
1193
3221
  }
1194
3222
  }
1195
3223
 
1196
- /* Narrow embedding panels: drop low-value text from the HUD so the icon controls
1197
- fit in fewer rows. Buttons keep their aria-labels + tooltips, so nothing is
1198
- lost for a11y or discovery. */
1199
- @media (max-width: 720px) {
3224
+ /* Below 1180px the top bar drops its low-value meta text (board id, counts).
3225
+ Buttons keep their aria-labels + tooltips, so nothing is lost for a11y or
3226
+ discovery. */
3227
+ @media (max-width: 1180px) {
1200
3228
  .hud-collapsible-text {
1201
3229
  display: none;
1202
3230
  }
1203
3231
  }
1204
3232
 
1205
3233
  /* Raw markdown source editor */
3234
+ .md-edit-btn {
3235
+ position: absolute;
3236
+ top: 4px;
3237
+ right: 4px;
3238
+ padding: 3px 8px;
3239
+ font-size: 10px;
3240
+ background: var(--c-panel);
3241
+ border: 1px solid var(--c-line);
3242
+ border-radius: 4px;
3243
+ color: var(--c-text-soft);
3244
+ cursor: pointer;
3245
+ opacity: 0;
3246
+ transition: opacity 0.12s ease;
3247
+ }
3248
+ .canvas-node:hover .md-edit-btn,
3249
+ .md-edit-btn:focus-visible {
3250
+ opacity: 1;
3251
+ }
3252
+ .md-edit-btn:hover {
3253
+ color: var(--c-text);
3254
+ border-color: var(--c-accent-25);
3255
+ }
3256
+
1206
3257
  .md-editor-split {
1207
3258
  display: flex;
1208
3259
  height: 100%;
@@ -1736,6 +3787,10 @@ html.is-node-resizing .ext-app-preview-catcher {
1736
3787
  color: var(--c-accent);
1737
3788
  }
1738
3789
 
3790
+ .context-menu-item.is-danger .context-menu-label {
3791
+ color: var(--c-danger, #e5484d);
3792
+ }
3793
+
1739
3794
  .context-menu-shortcut {
1740
3795
  color: var(--c-muted);
1741
3796
  font-size: 10px;
@@ -1861,7 +3916,7 @@ html.is-node-resizing .ext-app-preview-catcher {
1861
3916
  constant screen size while zoomed out (see edgeChromeScale in EdgeLayer). */
1862
3917
  .edge-label {
1863
3918
  font-family: var(--font);
1864
- font-size: calc(11px * var(--edge-chrome-scale, 1));
3919
+ font-size: calc(11px * var(--edge-label-scale, 1));
1865
3920
  pointer-events: none;
1866
3921
  user-select: none;
1867
3922
  }
@@ -1869,7 +3924,7 @@ html.is-node-resizing .ext-app-preview-catcher {
1869
3924
  .edge-label-bg {
1870
3925
  fill: var(--c-panel-glass);
1871
3926
  stroke: var(--c-line);
1872
- stroke-width: calc(0.5 * var(--edge-chrome-scale, 1));
3927
+ stroke-width: calc(0.5 * var(--edge-label-scale, 1));
1873
3928
  }
1874
3929
 
1875
3930
  /* Trace nodes — compact pills for agent tool/subagent visualization */
@@ -2061,112 +4116,6 @@ html.is-node-resizing .ext-app-preview-catcher {
2061
4116
  color: var(--c-accent);
2062
4117
  }
2063
4118
 
2064
- /* Docked node — compact toolbar-flanking panel */
2065
- .docked-node {
2066
- min-width: 200px;
2067
- max-width: 360px;
2068
- background: var(--c-panel-glass);
2069
- backdrop-filter: blur(16px);
2070
- border: 1px solid var(--c-line);
2071
- border-radius: var(--radius);
2072
- box-shadow: 0 12px 40px var(--c-shadow-heavy), 0 0 0 1px rgba(255, 255, 255, 0.04);
2073
- display: flex;
2074
- flex-direction: column;
2075
- overflow: hidden;
2076
- }
2077
-
2078
- .docked-node:has(.context-body) {
2079
- width: 320px;
2080
- max-width: 320px;
2081
- }
2082
-
2083
- /* Collapsed docked widget = a single menu-height pill that flanks the toolbar.
2084
- Pinned to the same height as .canvas-toolbar so the top HUD row reads as one
2085
- continuous bar (status on the left, context on the right). */
2086
- .docked-node--collapsed {
2087
- height: var(--hud-bar-height);
2088
- box-sizing: border-box;
2089
- justify-content: center;
2090
- width: auto;
2091
- /* Reset the base .docked-node min-width so the collapsed pill hugs its content
2092
- (badge + count + controls) instead of stretching to a 200px bar. */
2093
- min-width: 0;
2094
- }
2095
- .docked-node--collapsed .docked-node-header {
2096
- height: 100%;
2097
- padding: 0 10px;
2098
- border-bottom: none;
2099
- }
2100
- .docked-node-count {
2101
- min-width: 18px;
2102
- height: 18px;
2103
- padding: 0 5px;
2104
- display: inline-flex;
2105
- align-items: center;
2106
- justify-content: center;
2107
- border-radius: 9px;
2108
- background: var(--c-accent);
2109
- color: var(--c-contrast-fg);
2110
- font-size: 10px;
2111
- font-weight: 700;
2112
- flex-shrink: 0;
2113
- }
2114
-
2115
- .docked-node-header {
2116
- display: flex;
2117
- align-items: center;
2118
- gap: 6px;
2119
- padding: 6px 10px;
2120
- border-bottom: 1px solid var(--c-line);
2121
- user-select: none;
2122
- flex-shrink: 0;
2123
- }
2124
-
2125
- .docked-node-header .node-type-badge {
2126
- font-size: 10px;
2127
- padding: 1px 6px;
2128
- border-radius: 4px;
2129
- background: var(--c-accent-12);
2130
- color: var(--c-accent);
2131
- text-transform: uppercase;
2132
- letter-spacing: 0.04em;
2133
- flex-shrink: 0;
2134
- }
2135
-
2136
- .docked-node-controls {
2137
- display: flex;
2138
- gap: 4px;
2139
- margin-left: auto;
2140
- flex-shrink: 0;
2141
- }
2142
-
2143
- .docked-node-controls button {
2144
- background: none;
2145
- border: none;
2146
- color: var(--c-muted);
2147
- cursor: pointer;
2148
- padding: 2px 4px;
2149
- font-size: 14px;
2150
- line-height: 1;
2151
- border-radius: 3px;
2152
- }
2153
-
2154
- .docked-node-controls button:hover {
2155
- background: var(--c-surface-hover);
2156
- color: var(--c-text);
2157
- }
2158
-
2159
- .docked-node-body {
2160
- padding: 8px 10px;
2161
- max-height: 200px;
2162
- overflow-y: auto;
2163
- }
2164
-
2165
- .docked-node-body.context-body {
2166
- max-height: 420px;
2167
- padding: 10px 14px;
2168
- }
2169
-
2170
4119
  /* MCP app iframe */
2171
4120
  .mcp-app-frame {
2172
4121
  width: 100%;
@@ -2222,10 +4171,36 @@ html.is-node-resizing .ext-app-preview-catcher {
2222
4171
  }
2223
4172
  }
2224
4173
 
2225
- /* ── Multi-node selection ─────────────────────────────────── */
4174
+ /* ── Multi-node selection (item 13: outline, corner handles, soft glow) ── */
2226
4175
  .canvas-node.selected {
2227
4176
  border-color: var(--c-accent);
2228
- box-shadow: 0 0 0 2px var(--c-accent), 0 6px 32px var(--c-accent-25);
4177
+ box-shadow: 0 0 0 1px var(--c-accent), 0 0 0 4px color-mix(in srgb, var(--c-accent) 10%, transparent);
4178
+ }
4179
+ .node-selection-handle {
4180
+ position: absolute;
4181
+ width: 7px;
4182
+ height: 7px;
4183
+ background: var(--c-bg);
4184
+ border: 1.5px solid var(--c-accent);
4185
+ border-radius: 2px;
4186
+ pointer-events: none;
4187
+ z-index: 3;
4188
+ }
4189
+ .node-selection-handle.is-tl {
4190
+ left: -4px;
4191
+ top: -4px;
4192
+ }
4193
+ .node-selection-handle.is-tr {
4194
+ right: -4px;
4195
+ top: -4px;
4196
+ }
4197
+ .node-selection-handle.is-bl {
4198
+ left: -4px;
4199
+ bottom: -4px;
4200
+ }
4201
+ .node-selection-handle.is-br {
4202
+ right: -4px;
4203
+ bottom: -4px;
2229
4204
  }
2230
4205
 
2231
4206
  /* Lasso rectangle overlay */
@@ -2343,83 +4318,147 @@ html.is-node-resizing .ext-app-preview-catcher {
2343
4318
  z-index: 9999;
2344
4319
  }
2345
4320
 
2346
- /* Selection action bar — fixed bottom-center */
4321
+ /* In-canvas text prompt (window.prompt replacement — embedded panes no-op it). */
4322
+ .text-prompt-backdrop {
4323
+ position: absolute;
4324
+ inset: 0;
4325
+ display: flex;
4326
+ align-items: flex-start;
4327
+ justify-content: center;
4328
+ padding-top: 18vh;
4329
+ background: color-mix(in srgb, var(--c-bg) 42%, transparent);
4330
+ z-index: 10015;
4331
+ }
4332
+ .text-prompt {
4333
+ width: min(440px, calc(100% - 48px));
4334
+ padding: 14px;
4335
+ background: var(--c-panel);
4336
+ border: 1px solid var(--c-line);
4337
+ border-radius: 12px;
4338
+ box-shadow: 0 18px 60px var(--c-shadow-heavy);
4339
+ display: flex;
4340
+ flex-direction: column;
4341
+ gap: 10px;
4342
+ }
4343
+ .text-prompt-title {
4344
+ font-size: 13px;
4345
+ font-weight: 600;
4346
+ color: var(--c-text);
4347
+ }
4348
+ .text-prompt-input {
4349
+ width: 100%;
4350
+ padding: 8px 10px;
4351
+ border: 1px solid var(--c-line);
4352
+ border-radius: 8px;
4353
+ background: var(--c-bg);
4354
+ color: var(--c-text);
4355
+ font: 13px/1.4 var(--mono);
4356
+ }
4357
+ .text-prompt-input:focus {
4358
+ outline: none;
4359
+ border-color: var(--c-accent);
4360
+ }
4361
+ .text-prompt-actions {
4362
+ display: flex;
4363
+ justify-content: flex-end;
4364
+ gap: 8px;
4365
+ }
4366
+ .text-prompt-cancel,
4367
+ .text-prompt-confirm {
4368
+ padding: 5px 12px;
4369
+ border-radius: 7px;
4370
+ border: 1px solid var(--c-line);
4371
+ background: none;
4372
+ color: var(--c-text-soft);
4373
+ cursor: pointer;
4374
+ font-size: 12px;
4375
+ }
4376
+ .text-prompt-confirm {
4377
+ background: var(--c-accent);
4378
+ border-color: var(--c-accent);
4379
+ color: var(--c-bg);
4380
+ font-weight: 600;
4381
+ }
4382
+
4383
+ /* Selection action bar — floating bottom-center of the canvas region
4384
+ (rail-chrome-v2 phase 7, item 13). */
4385
+ /* In a session the command bar owns the bottom-center slot — lift the
4386
+ selection bar clear of it (composer + chips row); on the quiet board the
4387
+ pin bar does, so lift past that instead. */
4388
+ [data-session-active='true'] .selection-bar {
4389
+ bottom: 124px;
4390
+ }
4391
+ .selection-bar.is-above-pin-bar {
4392
+ bottom: 70px;
4393
+ }
2347
4394
  .selection-bar {
2348
- position: fixed;
2349
- bottom: 60px;
4395
+ position: absolute;
4396
+ bottom: 18px;
2350
4397
  left: 50%;
2351
4398
  transform: translateX(-50%);
2352
4399
  display: flex;
2353
4400
  align-items: center;
2354
- gap: 8px;
2355
- padding: 8px 14px;
2356
- background: var(--c-panel-glass);
2357
- backdrop-filter: blur(12px);
2358
- border: 1px solid var(--c-accent);
2359
- border-radius: var(--radius);
2360
- box-shadow: 0 8px 32px var(--c-shadow), 0 0 0 1px var(--c-accent-15);
2361
- z-index: 10001;
4401
+ gap: 2px;
4402
+ padding: 6px 8px;
4403
+ background: color-mix(in srgb, var(--c-panel) 97%, transparent);
4404
+ backdrop-filter: blur(12px);
4405
+ border: 1px solid var(--c-line);
4406
+ border-radius: 10px;
4407
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5);
4408
+ z-index: 66;
2362
4409
  white-space: nowrap;
2363
4410
  }
2364
-
2365
4411
  .selection-bar-count {
2366
- font-size: 12px;
2367
- font-weight: 600;
2368
- color: var(--c-accent);
2369
- }
2370
-
2371
- .selection-bar-btn {
2372
- padding: 5px 12px;
2373
- font-size: 12px;
4412
+ padding: 0 8px;
4413
+ font-size: 11px;
2374
4414
  font-weight: 600;
2375
- background: var(--c-accent-10);
2376
- border: 1px solid var(--c-accent-30);
2377
- border-radius: var(--radius-sm);
2378
4415
  color: var(--c-accent);
2379
- cursor: pointer;
2380
- font-family: var(--font);
2381
- }
2382
-
2383
- .selection-bar-btn:hover {
2384
- background: var(--c-accent-25);
2385
- border-color: var(--c-accent);
2386
- }
2387
-
2388
- .selection-bar-ask {
2389
- background: var(--c-accent);
2390
- color: var(--c-contrast-fg);
2391
- border-color: var(--c-accent);
2392
4416
  }
2393
-
2394
- .selection-bar-ask:hover {
2395
- background: var(--c-accent-hover);
2396
- border-color: var(--c-accent-hover);
4417
+ .selection-bar-sep {
4418
+ width: 1px;
4419
+ height: 18px;
4420
+ margin: 0 4px;
4421
+ background: var(--c-line);
2397
4422
  }
2398
-
2399
- .selection-bar-clear {
2400
- background: none;
4423
+ .selection-bar-icon,
4424
+ .selection-bar-action {
4425
+ display: inline-flex;
4426
+ align-items: center;
4427
+ justify-content: center;
4428
+ gap: 5px;
4429
+ height: 28px;
2401
4430
  border: none;
4431
+ border-radius: 6px;
4432
+ background: none;
2402
4433
  color: var(--c-muted);
2403
- font-size: 16px;
2404
- padding: 2px 6px;
2405
- line-height: 1;
4434
+ cursor: pointer;
4435
+ font: inherit;
4436
+ font-size: 11px;
4437
+ font-weight: 600;
2406
4438
  }
2407
-
2408
- .selection-bar-clear:hover {
4439
+ .selection-bar-icon {
4440
+ width: 28px;
4441
+ font-size: 14px;
4442
+ }
4443
+ .selection-bar-action {
4444
+ padding: 0 9px;
4445
+ }
4446
+ .selection-bar-icon:hover,
4447
+ .selection-bar-action:hover {
4448
+ background: color-mix(in srgb, var(--c-text) 6%, transparent);
2409
4449
  color: var(--c-text);
2410
- background: var(--c-surface-hover);
2411
4450
  }
2412
-
2413
- /* "Pin as context" button in selection bar */
2414
- .selection-bar-pin-ctx {
2415
- background: var(--c-warn-12);
2416
- border-color: var(--c-warn-30);
4451
+ .selection-bar-icon:disabled {
4452
+ opacity: 0.35;
4453
+ cursor: default;
4454
+ }
4455
+ .selection-bar-action.is-pin:hover {
4456
+ background: color-mix(in srgb, var(--c-warn) 10%, transparent);
2417
4457
  color: var(--c-warn);
2418
4458
  }
2419
-
2420
- .selection-bar-pin-ctx:hover {
2421
- background: var(--c-warn-22);
2422
- border-color: var(--c-warn);
4459
+ .selection-bar-icon.is-danger:hover {
4460
+ background: color-mix(in srgb, var(--c-danger) 12%, transparent);
4461
+ color: var(--c-danger);
2423
4462
  }
2424
4463
 
2425
4464
  /* ── Context-pinned nodes — amber glow ───────────────────────── */
@@ -2589,11 +4628,13 @@ html.is-node-resizing .ext-app-preview-catcher {
2589
4628
  box-shadow: 0 0 24px rgba(75, 188, 255, 0.12);
2590
4629
  }
2591
4630
 
4631
+ /* Anchored to the canvas region (not the window): since the rail-chrome
4632
+ restructure the session panel owns the window's right edge. */
2592
4633
  .attention-toast {
2593
- position: fixed;
2594
- top: 76px;
4634
+ position: absolute;
4635
+ top: 18px;
2595
4636
  right: 18px;
2596
- max-width: min(260px, calc(100vw - 24px));
4637
+ max-width: min(260px, calc(100% - 24px));
2597
4638
  display: inline-flex;
2598
4639
  align-items: center;
2599
4640
  gap: 8px;
@@ -2606,7 +4647,7 @@ html.is-node-resizing .ext-app-preview-catcher {
2606
4647
  color: var(--c-text);
2607
4648
  font: inherit;
2608
4649
  cursor: pointer;
2609
- z-index: 10003;
4650
+ z-index: 9990; /* above the world, below the rail popovers and every modal overlay */
2610
4651
  animation: attention-toast-in 180ms ease-out;
2611
4652
  }
2612
4653
 
@@ -2651,96 +4692,11 @@ html.is-node-resizing .ext-app-preview-catcher {
2651
4692
  max-width: 200px;
2652
4693
  }
2653
4694
 
2654
- /* Context dock — expanded panel anchored top-right edge.
2655
- Mutually exclusive with the Updates panel (see DockedNode.tsx and
2656
- AttentionHistory.tsx) — opening one collapses the other, so they can both
2657
- share the same right: 18px anchor without overlapping. */
2658
- .context-dock-panel {
2659
- position: fixed;
2660
- top: 92px;
2661
- right: 18px;
2662
- width: min(360px, calc(100vw - 24px));
2663
- max-height: calc(100vh - 110px);
2664
- display: flex;
2665
- flex-direction: column;
2666
- gap: 10px;
2667
- padding: 14px;
2668
- background: color-mix(in srgb, var(--c-panel-glass) 96%, transparent);
2669
- backdrop-filter: blur(16px);
2670
- border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-accent) 18%);
2671
- border-radius: 18px;
2672
- box-shadow: 0 14px 36px var(--c-shadow), 0 0 0 1px color-mix(in srgb, var(--c-accent) 8%, transparent);
2673
- z-index: 10001;
2674
- overflow: hidden;
2675
- }
2676
-
2677
- .context-dock-header {
2678
- display: flex;
2679
- align-items: flex-start;
2680
- justify-content: space-between;
2681
- gap: 8px;
2682
- padding: 2px 2px 4px;
2683
- flex-shrink: 0;
2684
- }
2685
-
2686
- .context-dock-header-text {
2687
- display: flex;
2688
- flex-direction: column;
2689
- gap: 2px;
2690
- min-width: 0;
2691
- }
2692
-
2693
- .context-dock-title {
2694
- font-size: 12px;
2695
- font-weight: 700;
2696
- letter-spacing: 0.08em;
2697
- text-transform: uppercase;
2698
- color: var(--c-text);
2699
- }
2700
-
2701
- .context-dock-subtitle {
2702
- font-size: 11px;
2703
- color: var(--c-dim);
2704
- }
2705
-
2706
- .context-dock-controls {
2707
- display: flex;
2708
- gap: 4px;
2709
- flex-shrink: 0;
2710
- }
2711
-
2712
- .context-dock-icon-button {
2713
- width: 22px;
2714
- height: 22px;
2715
- border: 0;
2716
- border-radius: 6px;
2717
- background: transparent;
2718
- color: var(--c-dim);
2719
- font-size: 16px;
2720
- line-height: 1;
2721
- cursor: pointer;
2722
- display: grid;
2723
- place-items: center;
2724
- padding: 0;
2725
- }
2726
-
2727
- .context-dock-icon-button:hover {
2728
- color: var(--c-text);
2729
- background: var(--c-surface-hover);
2730
- }
2731
-
2732
- .context-dock-body {
2733
- flex: 1 1 auto;
2734
- min-height: 0;
2735
- overflow-y: auto;
2736
- padding-right: 2px;
2737
- }
2738
-
2739
4695
  .attention-history {
2740
- position: fixed;
2741
- top: 146px;
4696
+ position: absolute;
4697
+ top: 60px;
2742
4698
  right: 18px;
2743
- width: min(320px, calc(100vw - 24px));
4699
+ width: min(320px, calc(100% - 24px));
2744
4700
  display: flex;
2745
4701
  flex-direction: column;
2746
4702
  gap: 10px;
@@ -2750,12 +4706,12 @@ html.is-node-resizing .ext-app-preview-catcher {
2750
4706
  border: 1px solid color-mix(in srgb, var(--c-line) 82%, var(--c-warn) 18%);
2751
4707
  border-radius: 18px;
2752
4708
  box-shadow: 0 14px 36px var(--c-shadow), 0 0 0 1px color-mix(in srgb, var(--c-warn) 8%, transparent);
2753
- z-index: 10002;
4709
+ z-index: 9990;
2754
4710
  }
2755
4711
 
2756
4712
  .attention-history-tab {
2757
- position: fixed;
2758
- top: 146px;
4713
+ position: absolute;
4714
+ top: 60px;
2759
4715
  right: 0;
2760
4716
  display: flex;
2761
4717
  align-items: center;
@@ -2967,82 +4923,265 @@ html.is-node-resizing .ext-app-preview-catcher {
2967
4923
  color: color-mix(in srgb, var(--c-danger) 78%, var(--c-text) 22%);
2968
4924
  }
2969
4925
 
2970
- /* ── Group node — spatial container/frame ─────────────────────── */
4926
+ /* ── Group node — spatial container/frame (groups v2, item 20) ─────
4927
+ Dashed frame with the name pill + action cluster ON the top edge; the
4928
+ children live in the world layer. The frame brightens while a dragged node
4929
+ would join on release; a collapsed group is a compact chip. */
2971
4930
  .canvas-node.group-node {
2972
- background: transparent;
2973
- border: 2px dashed var(--group-color, var(--c-accent));
2974
- border-radius: 12px;
4931
+ background: color-mix(in srgb, var(--group-color, var(--c-accent)) 3%, transparent);
4932
+ border: 1.5px dashed color-mix(in srgb, var(--group-color, var(--c-accent)) 35%, transparent);
4933
+ border-radius: 14px;
2975
4934
  box-shadow: none;
2976
4935
  overflow: visible;
4936
+ /* The edge row hangs outside the frame: no paint containment here. */
4937
+ contain: layout style;
2977
4938
  min-width: 200px;
2978
4939
  min-height: 120px;
4940
+ transition:
4941
+ border-color 150ms ease,
4942
+ background 150ms ease;
2979
4943
  }
2980
-
2981
- .canvas-node.group-node .node-titlebar {
2982
- background: color-mix(in srgb, var(--group-color, var(--c-accent)) 12%, transparent);
2983
- border-bottom: 1px solid color-mix(in srgb, var(--group-color, var(--c-accent)) 25%, transparent);
2984
- border-radius: 10px 10px 0 0;
4944
+ .canvas-node.group-node:hover {
4945
+ border-color: color-mix(in srgb, var(--group-color, var(--c-accent)) 55%, transparent);
2985
4946
  }
2986
-
2987
- .canvas-node.group-node .node-type-badge {
2988
- background: color-mix(in srgb, var(--group-color, var(--c-accent)) 20%, transparent);
2989
- color: var(--group-color, var(--c-accent));
4947
+ .canvas-node.group-node.active,
4948
+ .canvas-node.group-node.selected {
4949
+ border-style: dashed;
4950
+ border-color: color-mix(in srgb, var(--group-color, var(--c-accent)) 70%, transparent);
4951
+ }
4952
+ .canvas-node.group-node.is-drop-target {
4953
+ border-color: color-mix(in srgb, var(--group-color, var(--c-accent)) 80%, transparent);
4954
+ background: color-mix(in srgb, var(--group-color, var(--c-accent)) 9%, transparent);
4955
+ }
4956
+ .canvas-node.group-node.is-drop-source {
4957
+ border-color: color-mix(in srgb, var(--c-warn) 60%, transparent);
2990
4958
  }
2991
-
2992
4959
  .canvas-node.group-node .node-body {
2993
- background: color-mix(in srgb, var(--group-color, var(--c-accent)) 4%, transparent);
2994
- padding: 12px;
4960
+ background: none;
4961
+ padding: 0;
4962
+ display: flex;
4963
+ align-items: center;
4964
+ justify-content: center;
2995
4965
  }
2996
-
2997
- .canvas-node.group-node:hover {
2998
- border-style: solid;
2999
- box-shadow: 0 0 0 1px color-mix(in srgb, var(--group-color, var(--c-accent)) 30%, transparent);
4966
+ .group-empty-hint {
4967
+ font-size: 11px;
4968
+ color: var(--c-dim);
4969
+ font-style: italic;
4970
+ text-align: center;
4971
+ padding: 12px 18px;
4972
+ opacity: 0.8;
4973
+ pointer-events: none;
3000
4974
  }
3001
4975
 
3002
- .canvas-node.group-node.active {
3003
- border-style: solid;
3004
- border-color: var(--group-color, var(--c-accent));
3005
- box-shadow: 0 0 0 2px color-mix(in srgb, var(--group-color, var(--c-accent)) 40%, transparent);
4976
+ /* Frame edge row: the drag handle for the whole group */
4977
+ .canvas-node.group-node .node-titlebar.group-edge-row {
4978
+ position: absolute;
4979
+ top: -12px;
4980
+ left: 12px;
4981
+ right: 12px;
4982
+ height: 24px;
4983
+ padding: 0;
4984
+ display: flex;
4985
+ align-items: center;
4986
+ gap: 6px;
4987
+ background: none;
4988
+ border: none;
4989
+ border-radius: 0;
4990
+ cursor: grab;
4991
+ overflow: visible;
4992
+ }
4993
+ .group-name-pill {
4994
+ display: inline-flex;
4995
+ align-items: center;
4996
+ gap: 6px;
4997
+ padding: 2px 10px;
4998
+ border-radius: 999px;
4999
+ background: var(--c-panel-soft);
5000
+ border: 1px solid color-mix(in srgb, var(--group-color, var(--c-accent)) 35%, transparent);
5001
+ max-width: 70%;
5002
+ }
5003
+ .group-name {
5004
+ font-size: 10px;
5005
+ font-weight: 700;
5006
+ letter-spacing: 0.08em;
5007
+ text-transform: uppercase;
5008
+ color: var(--group-color, var(--c-accent));
5009
+ white-space: nowrap;
5010
+ overflow: hidden;
5011
+ text-overflow: ellipsis;
5012
+ }
5013
+ .group-count {
5014
+ font: 9px var(--mono);
5015
+ color: var(--c-dim);
5016
+ }
5017
+ .group-title-input {
5018
+ width: 140px;
5019
+ font-size: 11px;
5020
+ }
5021
+ .group-edge-spacer {
5022
+ flex: 1;
5023
+ }
5024
+ .group-actions {
5025
+ position: relative;
5026
+ display: inline-flex;
5027
+ gap: 1px;
5028
+ padding: 2px 4px;
5029
+ border-radius: 999px;
5030
+ background: var(--c-panel-soft);
5031
+ border: 1px solid var(--c-line);
5032
+ }
5033
+ .group-action {
5034
+ display: inline-flex;
5035
+ width: 20px;
5036
+ height: 20px;
5037
+ align-items: center;
5038
+ justify-content: center;
5039
+ background: none;
5040
+ border: none;
5041
+ border-radius: 99px;
5042
+ color: var(--c-muted);
5043
+ cursor: pointer;
5044
+ font-size: 11px;
5045
+ line-height: 1;
5046
+ padding: 0;
5047
+ }
5048
+ .group-action:hover:not(:disabled) {
5049
+ color: var(--group-color, var(--c-accent));
5050
+ }
5051
+ .group-action:disabled {
5052
+ opacity: 0.35;
5053
+ cursor: default;
5054
+ }
5055
+ /* A group stacks BELOW its children by design (bringToFront re-stacks members
5056
+ above the frame), so the frame's own popover would paint under the member
5057
+ cards. While the ⋯ menu is open, lift the whole frame — !important because
5058
+ the node's z-index is an inline style from the store. */
5059
+ .canvas-node.group-menu-open {
5060
+ z-index: 9500 !important;
3006
5061
  }
3007
5062
 
3008
- .group-node-body {
5063
+ .group-menu {
5064
+ position: absolute;
5065
+ top: 26px;
5066
+ right: 0;
5067
+ min-width: 160px;
3009
5068
  display: flex;
3010
5069
  flex-direction: column;
3011
- gap: 8px;
3012
- height: 100%;
5070
+ padding: 4px;
5071
+ background: var(--c-panel);
5072
+ border: 1px solid var(--c-line);
5073
+ border-radius: 8px;
5074
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
5075
+ z-index: 20;
5076
+ }
5077
+ .group-menu button {
5078
+ padding: 6px 10px;
5079
+ border: none;
5080
+ border-radius: 6px;
5081
+ background: none;
5082
+ color: var(--c-text-soft);
5083
+ font: inherit;
5084
+ font-size: 11px;
5085
+ text-align: left;
5086
+ cursor: pointer;
5087
+ }
5088
+ .group-menu button:hover:not(:disabled) {
5089
+ background: color-mix(in srgb, var(--c-text) 6%, transparent);
5090
+ color: var(--c-text);
5091
+ }
5092
+ .group-menu button:disabled {
5093
+ opacity: 0.4;
5094
+ cursor: default;
5095
+ }
5096
+ .group-menu button.is-danger:hover {
5097
+ color: var(--c-danger);
5098
+ }
5099
+
5100
+ /* Collapsed group chip */
5101
+ .canvas-node.group-node.group-chip {
5102
+ min-width: 0;
5103
+ min-height: 0;
5104
+ padding: 0;
5105
+ background: color-mix(in srgb, var(--group-color, var(--c-accent)) 4%, transparent);
5106
+ border: 1.5px dashed color-mix(in srgb, var(--group-color, var(--c-accent)) 35%, transparent);
5107
+ border-radius: 12px;
5108
+ cursor: pointer;
5109
+ }
5110
+ .canvas-node.group-node.group-chip:hover {
5111
+ border-color: color-mix(in srgb, var(--group-color, var(--c-accent)) 60%, transparent);
5112
+ background: color-mix(in srgb, var(--group-color, var(--c-accent)) 8%, transparent);
3013
5113
  }
3014
-
3015
- .group-summary {
5114
+ .canvas-node.group-node .node-titlebar.group-chip-inner {
3016
5115
  display: flex;
3017
5116
  align-items: center;
3018
5117
  gap: 10px;
3019
- flex-wrap: wrap;
5118
+ padding: 10px 14px;
5119
+ background: none;
5120
+ border: none;
5121
+ cursor: grab;
3020
5122
  }
3021
-
3022
- .group-child-count {
5123
+ .group-chip-expand {
5124
+ background: none;
5125
+ border: none;
5126
+ padding: 0;
5127
+ color: var(--group-color, var(--c-accent));
3023
5128
  font-size: 13px;
3024
- font-weight: 600;
5129
+ line-height: 1;
5130
+ cursor: pointer;
5131
+ }
5132
+ .group-chip-name {
5133
+ font-size: 10px;
5134
+ font-weight: 700;
5135
+ letter-spacing: 0.08em;
5136
+ text-transform: uppercase;
3025
5137
  color: var(--group-color, var(--c-accent));
5138
+ white-space: nowrap;
3026
5139
  }
3027
-
3028
- .group-type-summary {
3029
- font-size: 12px;
3030
- color: var(--c-text-muted);
5140
+ .group-chip-meta {
5141
+ display: flex;
5142
+ align-items: center;
5143
+ gap: 5px;
5144
+ margin-top: 4px;
5145
+ }
5146
+ .group-kind-dot {
5147
+ width: 6px;
5148
+ height: 6px;
5149
+ border-radius: 2px;
5150
+ opacity: 0.8;
5151
+ }
5152
+ .group-chip-count {
5153
+ font: 9px var(--mono);
5154
+ color: var(--c-dim);
3031
5155
  }
3032
5156
 
3033
- .group-empty-hint {
3034
- font-size: 12px;
3035
- color: var(--c-text-muted);
3036
- font-style: italic;
3037
- padding: 12px 0;
3038
- text-align: center;
3039
- opacity: 0.7;
5157
+ /* Release pill under the dragged node */
5158
+ .drop-pill {
5159
+ position: absolute;
5160
+ z-index: 10000;
5161
+ display: inline-flex;
5162
+ align-items: center;
5163
+ gap: 6px;
5164
+ padding: 3px 10px;
5165
+ border-radius: 999px;
5166
+ background: color-mix(in srgb, var(--c-panel) 96%, transparent);
5167
+ border: 1px solid color-mix(in srgb, var(--c-accent) 40%, transparent);
5168
+ pointer-events: none;
5169
+ white-space: nowrap;
5170
+ }
5171
+ .drop-pill-text {
5172
+ font-size: 10px;
5173
+ font-weight: 600;
5174
+ color: var(--c-accent);
5175
+ }
5176
+ .drop-pill-hint {
5177
+ font: 9px var(--mono);
5178
+ color: var(--c-dim);
3040
5179
  }
3041
5180
 
3042
5181
  /* ── Context pin bar — persistent floating indicator ─────────── */
3043
5182
  .context-pin-bar {
3044
- position: fixed;
3045
- bottom: 20px;
5183
+ position: absolute;
5184
+ bottom: 18px;
3046
5185
  left: 50%;
3047
5186
  transform: translateX(-50%);
3048
5187
  display: flex;
@@ -3054,7 +5193,7 @@ html.is-node-resizing .ext-app-preview-catcher {
3054
5193
  border: 1px solid var(--c-warn);
3055
5194
  border-radius: var(--radius);
3056
5195
  box-shadow: 0 8px 32px var(--c-shadow), 0 0 0 1px var(--c-warn-15);
3057
- z-index: 10000;
5196
+ z-index: 64;
3058
5197
  white-space: nowrap;
3059
5198
  }
3060
5199
 
@@ -3107,6 +5246,114 @@ html.is-node-resizing .ext-app-preview-catcher {
3107
5246
  }
3108
5247
 
3109
5248
  /* ── Expanded overlay actions ────────────────────────────────── */
5249
+ /* Expanded node view (rail-chrome-v2 phase 7, item 16): scrim + inset panel
5250
+ with 36/48px margins, header with kind pill + pin state, footer strip. */
5251
+ .expanded-overlay-backdrop {
5252
+ position: absolute;
5253
+ inset: 0;
5254
+ z-index: 10001;
5255
+ background: rgba(4, 10, 18, 0.6);
5256
+ display: flex;
5257
+ align-items: stretch;
5258
+ justify-content: center;
5259
+ padding: 36px 48px;
5260
+ }
5261
+ .expanded-overlay-panel {
5262
+ flex: 1;
5263
+ max-width: 1400px;
5264
+ display: flex;
5265
+ flex-direction: column;
5266
+ background: var(--c-panel);
5267
+ border: 1px solid var(--c-line);
5268
+ border-radius: 14px;
5269
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
5270
+ overflow: hidden;
5271
+ }
5272
+ .expanded-overlay-panel.is-pinned {
5273
+ border-color: color-mix(in srgb, var(--c-warn) 45%, var(--c-line));
5274
+ }
5275
+ .expanded-header {
5276
+ display: flex;
5277
+ align-items: center;
5278
+ gap: 10px;
5279
+ height: 46px;
5280
+ padding: 0 16px;
5281
+ border-bottom: 1px solid var(--c-line);
5282
+ background: color-mix(in srgb, var(--c-bg) 60%, transparent);
5283
+ flex-shrink: 0;
5284
+ }
5285
+ .expanded-kind-icon {
5286
+ display: inline-flex;
5287
+ color: var(--c-accent);
5288
+ }
5289
+ .expanded-title {
5290
+ font-size: 13px;
5291
+ font-weight: 600;
5292
+ color: var(--c-text);
5293
+ white-space: nowrap;
5294
+ overflow: hidden;
5295
+ text-overflow: ellipsis;
5296
+ min-width: 0;
5297
+ }
5298
+ .expanded-kind-pill {
5299
+ font-size: 9px;
5300
+ font-weight: 600;
5301
+ padding: 2px 8px;
5302
+ border-radius: 999px;
5303
+ border: 1px solid var(--c-line);
5304
+ color: var(--c-muted);
5305
+ white-space: nowrap;
5306
+ }
5307
+ .expanded-pin {
5308
+ background: none;
5309
+ border: none;
5310
+ padding: 0 2px;
5311
+ font-size: 12px;
5312
+ color: var(--c-dim);
5313
+ cursor: pointer;
5314
+ }
5315
+ .expanded-pin.is-on {
5316
+ color: var(--c-warn);
5317
+ }
5318
+ .expanded-spacer {
5319
+ flex: 1;
5320
+ }
5321
+ .expanded-close {
5322
+ background: none;
5323
+ border: none;
5324
+ color: var(--c-muted);
5325
+ font-size: 16px;
5326
+ line-height: 1;
5327
+ cursor: pointer;
5328
+ padding: 0 4px;
5329
+ }
5330
+ .expanded-close:hover {
5331
+ color: var(--c-text);
5332
+ }
5333
+ .expanded-body {
5334
+ flex: 1;
5335
+ min-height: 0;
5336
+ overflow: auto;
5337
+ padding: 16px;
5338
+ }
5339
+ .expanded-body.is-embedded {
5340
+ display: flex;
5341
+ flex-direction: column;
5342
+ }
5343
+ .expanded-footer {
5344
+ display: flex;
5345
+ align-items: center;
5346
+ gap: 12px;
5347
+ padding: 8px 16px;
5348
+ border-top: 1px solid var(--c-line);
5349
+ background: color-mix(in srgb, var(--c-bg) 50%, transparent);
5350
+ font: 9.5px var(--mono);
5351
+ color: var(--c-dim);
5352
+ flex-shrink: 0;
5353
+ }
5354
+ .expanded-footer-hint.is-saving {
5355
+ color: var(--c-warn);
5356
+ }
3110
5357
  .expanded-actions {
3111
5358
  display: flex;
3112
5359
  align-items: center;
@@ -3369,51 +5616,60 @@ html.is-node-resizing .ext-app-preview-catcher {
3369
5616
 
3370
5617
  /* ── Snapshot Panel ───────────────────────────────────────── */
3371
5618
 
5619
+ /* History drawer (rail-chrome-v2 phase 7, item 8): snapshots + sessions as
5620
+ one reverse-chronological list in a right drawer of the canvas region. */
3372
5621
  .snapshot-panel {
3373
- position: fixed;
3374
- width: 320px;
3375
- max-height: 420px;
5622
+ position: absolute;
5623
+ top: 0;
5624
+ right: 0;
5625
+ bottom: 0;
5626
+ width: min(300px, 100%);
3376
5627
  display: flex;
3377
5628
  flex-direction: column;
3378
- background: var(--c-panel-glass);
3379
- backdrop-filter: blur(16px);
3380
- border: 1px solid var(--c-line);
3381
- border-radius: var(--radius);
3382
- box-shadow: 0 12px 40px var(--c-shadow-heavy), 0 0 0 1px rgba(255,255,255,0.04);
3383
- z-index: 10001;
5629
+ background: var(--c-panel-soft);
5630
+ border-left: 1px solid var(--c-line);
5631
+ box-shadow: -16px 0 40px rgba(0, 0, 0, 0.45);
5632
+ /* Above the receipt it is opened from, below the rail popovers. */
5633
+ z-index: 9999;
3384
5634
  overflow: hidden;
3385
- animation: snapshot-panel-in 0.15s ease-out;
5635
+ animation: snapshot-panel-in 0.18s ease-out;
3386
5636
  }
3387
5637
 
3388
5638
  @keyframes snapshot-panel-in {
3389
- from { opacity: 0; transform: translateY(-6px); }
3390
- to { opacity: 1; transform: translateY(0); }
5639
+ from { opacity: 0; transform: translateX(12px); }
5640
+ to { opacity: 1; transform: translateX(0); }
3391
5641
  }
3392
5642
 
3393
5643
  .snapshot-panel-header {
3394
5644
  display: flex;
3395
5645
  align-items: center;
3396
- justify-content: space-between;
3397
- padding: 10px 14px;
5646
+ gap: 8px;
5647
+ height: var(--hud-bar-height);
5648
+ padding: 0 14px;
3398
5649
  border-bottom: 1px solid var(--c-line);
5650
+ flex-shrink: 0;
3399
5651
  }
3400
-
3401
5652
  .snapshot-panel-title {
3402
5653
  font-size: 11px;
3403
- font-weight: 600;
5654
+ font-weight: 700;
5655
+ letter-spacing: 0.08em;
3404
5656
  text-transform: uppercase;
3405
- letter-spacing: 0.06em;
3406
- color: var(--c-muted);
5657
+ color: var(--c-text);
5658
+ }
5659
+ .snapshot-panel-sub {
5660
+ font-size: 10px;
5661
+ color: var(--c-dim);
5662
+ }
5663
+ .snapshot-panel-spacer {
5664
+ flex: 1;
3407
5665
  }
3408
-
3409
5666
  .snapshot-panel-close {
3410
5667
  background: none;
3411
5668
  border: none;
3412
- color: var(--c-dim);
3413
- font-size: 16px;
5669
+ color: var(--c-muted);
5670
+ font-size: 14px;
3414
5671
  cursor: pointer;
3415
5672
  padding: 0 2px;
3416
- line-height: 1;
3417
5673
  }
3418
5674
  .snapshot-panel-close:hover {
3419
5675
  color: var(--c-text);
@@ -3422,152 +5678,172 @@ html.is-node-resizing .ext-app-preview-catcher {
3422
5678
  .snapshot-save-form {
3423
5679
  display: flex;
3424
5680
  gap: 6px;
3425
- padding: 10px 14px;
3426
- border-bottom: 1px solid var(--c-line);
5681
+ padding: 10px 12px 6px;
3427
5682
  }
3428
-
3429
5683
  .snapshot-name-input {
3430
5684
  flex: 1;
3431
- background: var(--c-input-bg);
5685
+ min-width: 0;
5686
+ padding: 6px 10px;
3432
5687
  border: 1px solid var(--c-line);
3433
- border-radius: var(--radius-sm);
5688
+ border-radius: 7px;
5689
+ background: var(--c-panel);
3434
5690
  color: var(--c-text);
3435
- font-family: var(--font);
3436
- font-size: 12px;
3437
- padding: 6px 10px;
3438
- outline: none;
3439
- transition: border-color 0.15s;
5691
+ font: 11.5px var(--font);
3440
5692
  }
3441
5693
  .snapshot-name-input:focus {
3442
- border-color: var(--c-accent);
5694
+ outline: 2px solid var(--c-accent);
5695
+ outline-offset: 1px;
3443
5696
  }
3444
5697
  .snapshot-name-input::placeholder {
3445
5698
  color: var(--c-dim);
3446
5699
  }
3447
-
3448
5700
  .snapshot-save-btn {
3449
- background: var(--c-accent);
5701
+ padding: 6px 12px;
3450
5702
  border: none;
3451
- color: var(--c-contrast-fg);
3452
- font-family: var(--font);
5703
+ border-radius: 7px;
5704
+ background: var(--c-accent);
5705
+ color: var(--c-bg);
3453
5706
  font-size: 11px;
3454
5707
  font-weight: 600;
3455
- padding: 6px 14px;
3456
- border-radius: var(--radius-sm);
3457
5708
  cursor: pointer;
3458
- white-space: nowrap;
3459
- transition: background 0.15s;
3460
- }
3461
- .snapshot-save-btn:hover:not(:disabled) {
3462
- background: var(--c-accent-hover);
3463
5709
  }
3464
5710
  .snapshot-save-btn:disabled {
3465
- opacity: 0.4;
5711
+ opacity: 0.45;
3466
5712
  cursor: default;
3467
5713
  }
3468
-
3469
5714
  .snapshot-restore-note {
3470
- padding: 0 12px 10px;
3471
- font-size: 10px;
5715
+ padding: 0 12px 8px;
5716
+ font-size: 9.5px;
3472
5717
  color: var(--c-dim);
3473
5718
  }
3474
5719
 
3475
5720
  .snapshot-list {
3476
- overflow-y: auto;
3477
5721
  flex: 1;
3478
- padding: 4px 0;
5722
+ min-height: 0;
5723
+ overflow-y: auto;
5724
+ padding: 4px 12px 10px;
5725
+ display: flex;
5726
+ flex-direction: column;
5727
+ gap: 8px;
3479
5728
  }
3480
-
3481
5729
  .snapshot-empty {
3482
- padding: 20px 14px;
5730
+ padding: 14px 2px;
5731
+ font-size: 11px;
3483
5732
  color: var(--c-dim);
3484
- font-size: 12px;
3485
- text-align: center;
3486
- line-height: 1.5;
5733
+ }
5734
+ .snapshot-section-header {
5735
+ margin: 10px 2px 4px;
5736
+ font-size: 10px;
5737
+ font-weight: 700;
5738
+ letter-spacing: 0.08em;
5739
+ text-transform: uppercase;
5740
+ color: var(--c-muted);
3487
5741
  }
3488
5742
 
3489
5743
  .snapshot-item {
5744
+ padding: 10px 12px;
5745
+ border: 1px solid var(--c-line);
5746
+ border-radius: 10px;
5747
+ }
5748
+ .snapshot-item.is-session {
5749
+ border-color: color-mix(in srgb, var(--c-purple) 30%, transparent);
5750
+ background: color-mix(in srgb, var(--c-purple) 5%, transparent);
5751
+ }
5752
+ .snapshot-item-head {
3490
5753
  display: flex;
3491
5754
  align-items: center;
3492
- justify-content: space-between;
3493
- gap: 8px;
3494
- padding: 8px 14px;
3495
- transition: background 0.1s;
5755
+ gap: 7px;
3496
5756
  }
3497
- .snapshot-item:hover {
3498
- background: var(--c-surface-hover);
5757
+ .snapshot-session-dot {
5758
+ width: 7px;
5759
+ height: 7px;
5760
+ border-radius: 50%;
5761
+ background: var(--c-purple);
5762
+ flex-shrink: 0;
3499
5763
  }
3500
-
3501
- .snapshot-item-info {
3502
- display: flex;
3503
- flex-direction: column;
3504
- gap: 2px;
3505
- min-width: 0;
3506
- flex: 1;
5764
+ .snapshot-item-glyph {
5765
+ color: var(--c-muted);
5766
+ font-size: 12px;
5767
+ line-height: 1;
3507
5768
  }
3508
-
3509
5769
  .snapshot-item-name {
3510
- font-size: 12px;
3511
- font-weight: 500;
3512
- color: var(--c-text);
5770
+ flex: 1;
5771
+ min-width: 0;
5772
+ font-size: 11.5px;
5773
+ font-weight: 600;
5774
+ color: var(--c-text-soft);
3513
5775
  white-space: nowrap;
3514
5776
  overflow: hidden;
3515
5777
  text-overflow: ellipsis;
3516
5778
  }
3517
-
3518
- .snapshot-item-meta {
3519
- font-size: 10px;
5779
+ .snapshot-item.is-session .snapshot-item-name {
5780
+ color: var(--c-text);
5781
+ }
5782
+ .snapshot-item-time {
5783
+ font: 9px var(--mono);
3520
5784
  color: var(--c-dim);
3521
5785
  }
3522
-
5786
+ .snapshot-item-meta {
5787
+ margin-top: 3px;
5788
+ font-size: 10.5px;
5789
+ color: var(--c-muted);
5790
+ }
5791
+ .snapshot-item-diff {
5792
+ color: var(--c-accent);
5793
+ }
3523
5794
  .snapshot-item-actions {
3524
5795
  display: flex;
3525
- gap: 4px;
3526
- flex-shrink: 0;
3527
- opacity: 0;
3528
- transition: opacity 0.1s;
3529
- }
3530
- .snapshot-item:hover .snapshot-item-actions {
3531
- opacity: 1;
5796
+ gap: 6px;
5797
+ margin-top: 8px;
3532
5798
  }
3533
-
3534
5799
  .snapshot-action-btn {
3535
- background: none;
5800
+ flex: 1;
5801
+ padding: 5px 0;
3536
5802
  border: 1px solid var(--c-line);
5803
+ border-radius: 6px;
5804
+ background: none;
3537
5805
  color: var(--c-muted);
3538
- font-family: var(--font);
3539
- font-size: 10px;
3540
- padding: 3px 8px;
3541
- border-radius: var(--radius-sm);
5806
+ font-size: 10.5px;
5807
+ font-weight: 600;
3542
5808
  cursor: pointer;
3543
- transition: all 0.1s;
3544
5809
  }
3545
-
5810
+ .snapshot-action-btn:hover:not(:disabled) {
5811
+ color: var(--c-text);
5812
+ }
5813
+ .snapshot-action-btn:disabled {
5814
+ opacity: 0.5;
5815
+ cursor: default;
5816
+ }
5817
+ .snapshot-action-diff,
3546
5818
  .snapshot-action-restore {
5819
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
5820
+ border-color: color-mix(in srgb, var(--c-accent) 30%, transparent);
3547
5821
  color: var(--c-accent);
3548
- border-color: var(--c-accent-25);
3549
5822
  }
3550
- .snapshot-action-restore:hover {
3551
- background: var(--c-accent-12);
3552
- border-color: var(--c-accent);
5823
+ .snapshot-action-diff:hover:not(:disabled),
5824
+ .snapshot-action-restore:hover:not(:disabled) {
5825
+ background: color-mix(in srgb, var(--c-accent) 20%, transparent);
5826
+ color: var(--c-accent);
3553
5827
  }
3554
-
3555
5828
  .snapshot-action-delete {
3556
- color: var(--c-dim);
3557
- border-color: transparent;
3558
- padding: 3px 5px;
5829
+ flex: 0 0 auto;
5830
+ padding: 5px 9px;
3559
5831
  }
3560
- .snapshot-action-delete:hover {
5832
+ .snapshot-action-delete:hover:not(:disabled) {
5833
+ border-color: color-mix(in srgb, var(--c-danger) 40%, transparent);
3561
5834
  color: var(--c-danger);
3562
- border-color: var(--c-danger-12);
3563
5835
  }
3564
-
3565
5836
  .snapshot-action-confirm {
5837
+ background: color-mix(in srgb, var(--c-danger) 12%, transparent);
5838
+ border-color: color-mix(in srgb, var(--c-danger) 40%, transparent);
3566
5839
  color: var(--c-danger);
3567
- border-color: var(--c-danger);
3568
5840
  }
3569
- .snapshot-action-confirm:hover {
3570
- background: var(--c-danger-12);
5841
+ .snapshot-panel-foot {
5842
+ padding: 9px 14px;
5843
+ border-top: 1px solid var(--c-line);
5844
+ font-size: 9.5px;
5845
+ color: var(--c-dim);
5846
+ flex-shrink: 0;
3571
5847
  }
3572
5848
 
3573
5849
  /* ── Command Palette (Cmd/Ctrl+K) ──────────────────────────── */
@@ -3576,22 +5852,23 @@ html.is-node-resizing .ext-app-preview-catcher {
3576
5852
  position: fixed;
3577
5853
  inset: 0;
3578
5854
  z-index: 10002;
3579
- background: rgba(0, 0, 0, 0.25);
5855
+ background: rgba(4, 10, 18, 0.55);
3580
5856
  display: flex;
3581
5857
  justify-content: center;
3582
- padding-top: 18vh;
5858
+ padding-top: 56px;
3583
5859
  }
3584
5860
 
5861
+ /* ⌘K palette (rail-chrome-v2 phase 7, item 7): 560px, top-anchored at 56px,
5862
+ grouped results, footer key hints. */
3585
5863
  .command-palette {
3586
- width: 500px;
3587
- max-height: 440px;
5864
+ width: min(560px, calc(100% - 48px));
5865
+ max-height: min(520px, calc(100vh - 80px));
3588
5866
  display: flex;
3589
5867
  flex-direction: column;
3590
- background: var(--c-panel-glass);
3591
- backdrop-filter: blur(16px);
5868
+ background: var(--c-panel);
3592
5869
  border: 1px solid var(--c-line);
3593
- border-radius: var(--radius);
3594
- box-shadow: 0 12px 40px var(--c-shadow-heavy), 0 0 0 1px rgba(255,255,255,0.04);
5870
+ border-radius: 12px;
5871
+ box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
3595
5872
  overflow: hidden;
3596
5873
  animation: command-palette-in 0.12s ease-out;
3597
5874
  align-self: flex-start;
@@ -3602,107 +5879,99 @@ html.is-node-resizing .ext-app-preview-catcher {
3602
5879
  to { opacity: 1; transform: translateY(0) scale(1); }
3603
5880
  }
3604
5881
 
5882
+ .command-palette-search {
5883
+ display: flex;
5884
+ align-items: center;
5885
+ gap: 10px;
5886
+ padding: 12px 14px;
5887
+ border-bottom: 1px solid var(--c-line);
5888
+ color: var(--c-accent);
5889
+ }
3605
5890
  .command-palette-input {
3606
- background: var(--c-input-bg);
5891
+ flex: 1;
5892
+ min-width: 0;
5893
+ padding: 0;
3607
5894
  border: none;
3608
- border-bottom: 1px solid var(--c-line);
3609
- color: var(--c-text);
3610
- font-family: var(--font);
3611
- font-size: 14px;
3612
- padding: 14px 16px;
3613
5895
  outline: none;
3614
- width: 100%;
3615
- box-sizing: border-box;
3616
- }
3617
- .command-palette-input:focus {
3618
- border-bottom-color: var(--c-accent);
5896
+ background: none;
5897
+ color: var(--c-text);
5898
+ font: 13px var(--font);
3619
5899
  }
3620
5900
  .command-palette-input::placeholder {
3621
5901
  color: var(--c-dim);
3622
5902
  }
3623
-
3624
- .command-palette-hint {
3625
- display: flex;
3626
- gap: 12px;
3627
- padding: 6px 16px;
3628
- font-size: 10px;
3629
- color: var(--c-dim);
3630
- border-bottom: 1px solid var(--c-line);
3631
- }
3632
- .command-palette-hint kbd {
3633
- display: inline-block;
3634
- background: var(--c-surface-hover);
5903
+ .command-palette-esc,
5904
+ .command-palette-kbd {
5905
+ padding: 1px 6px;
3635
5906
  border: 1px solid var(--c-line);
3636
- border-radius: 3px;
3637
- padding: 0 4px;
3638
- font-family: var(--font);
3639
- font-size: 9px;
3640
- line-height: 1.6;
3641
- margin-right: 2px;
5907
+ border-radius: 4px;
5908
+ font: 9.5px var(--mono);
5909
+ color: var(--c-muted);
5910
+ }
5911
+ .command-palette-esc {
5912
+ padding: 2px 7px;
5913
+ border-radius: 5px;
5914
+ color: var(--c-dim);
3642
5915
  }
3643
5916
 
3644
5917
  .command-palette-results {
3645
- overflow-y: auto;
3646
5918
  flex: 1;
3647
- padding: 4px 0;
5919
+ min-height: 0;
5920
+ overflow-y: auto;
5921
+ padding: 6px 6px 4px;
3648
5922
  }
3649
-
3650
5923
  .command-palette-empty {
3651
- padding: 24px 16px;
3652
- text-align: center;
3653
- color: var(--c-dim);
5924
+ padding: 14px 10px;
3654
5925
  font-size: 12px;
5926
+ color: var(--c-dim);
5927
+ }
5928
+ .command-palette-group {
5929
+ padding: 6px 10px 4px;
5930
+ font-size: 9px;
5931
+ font-weight: 700;
5932
+ letter-spacing: 0.08em;
5933
+ text-transform: uppercase;
5934
+ color: var(--c-dim);
3655
5935
  }
3656
-
3657
5936
  .command-palette-item {
3658
5937
  display: flex;
3659
5938
  align-items: center;
3660
5939
  gap: 10px;
3661
5940
  width: 100%;
3662
- padding: 8px 16px;
3663
- background: none;
5941
+ padding: 7px 10px;
3664
5942
  border: none;
3665
- color: var(--c-text);
3666
- font-family: var(--font);
3667
- font-size: 12px;
5943
+ border-radius: 8px;
5944
+ background: none;
5945
+ color: var(--c-text-soft);
3668
5946
  cursor: pointer;
3669
5947
  text-align: left;
3670
- transition: background 0.06s;
3671
- }
3672
-
3673
- .command-palette-item.selected {
3674
- background: var(--c-accent-10);
5948
+ font: inherit;
3675
5949
  }
3676
-
3677
5950
  .command-palette-item:hover {
3678
- background: var(--c-surface-hover);
5951
+ background: color-mix(in srgb, var(--c-text) 5%, transparent);
3679
5952
  }
3680
-
5953
+ .command-palette-item.selected,
3681
5954
  .command-palette-item.selected:hover {
3682
- background: var(--c-accent-10);
5955
+ background: color-mix(in srgb, var(--c-accent) 12%, transparent);
5956
+ color: var(--c-text);
3683
5957
  }
3684
-
3685
- .command-palette-badge {
3686
- font-size: 9px;
3687
- padding: 1px 6px;
3688
- border-radius: 4px;
3689
- background: var(--c-accent-12);
3690
- color: var(--c-accent);
5958
+ .command-palette-icon {
5959
+ display: inline-flex;
3691
5960
  flex-shrink: 0;
3692
- font-weight: 600;
3693
- letter-spacing: 0.04em;
3694
- text-transform: uppercase;
3695
- min-width: 32px;
3696
- text-align: center;
5961
+ width: 14px;
5962
+ height: 14px;
5963
+ color: var(--c-accent);
3697
5964
  }
3698
-
3699
- .command-palette-badge--action {
3700
- background: rgba(176, 122, 255, 0.12);
5965
+ .command-palette-icon.tone-purple {
3701
5966
  color: var(--c-purple);
3702
5967
  }
3703
-
5968
+ .command-palette-icon.tone-muted {
5969
+ color: var(--c-muted);
5970
+ }
3704
5971
  .command-palette-label {
3705
5972
  flex: 1;
5973
+ min-width: 0;
5974
+ font-size: 12px;
3706
5975
  white-space: nowrap;
3707
5976
  overflow: hidden;
3708
5977
  text-overflow: ellipsis;
@@ -3712,15 +5981,21 @@ html.is-node-resizing .ext-app-preview-catcher {
3712
5981
  color: var(--c-accent);
3713
5982
  font-weight: 600;
3714
5983
  }
3715
-
3716
5984
  .command-palette-desc {
3717
- font-size: 11px;
3718
5985
  color: var(--c-dim);
3719
- white-space: nowrap;
3720
- overflow: hidden;
3721
- text-overflow: ellipsis;
3722
- max-width: 180px;
3723
- flex-shrink: 0;
5986
+ }
5987
+
5988
+ .command-palette-hint {
5989
+ display: flex;
5990
+ gap: 14px;
5991
+ padding: 8px 14px;
5992
+ border-top: 1px solid var(--c-line);
5993
+ background: color-mix(in srgb, var(--c-bg) 50%, transparent);
5994
+ font: 9.5px var(--mono);
5995
+ color: var(--c-dim);
5996
+ }
5997
+ .command-palette-hint-spacer {
5998
+ flex: 1;
3724
5999
  }
3725
6000
 
3726
6001
  /* ── Shortcut Overlay (Press ?) ────────────────────────────── */
@@ -3829,88 +6104,117 @@ html.is-node-resizing .ext-app-preview-catcher {
3829
6104
  line-height: 1.4;
3830
6105
  }
3831
6106
 
3832
- /* ── Welcome Card (empty canvas) ────────────────────────── */
3833
- .welcome-card {
6107
+ /* ── Empty board (rail-chrome-v2 phase 7, design item 11) ───── */
6108
+ .empty-state {
3834
6109
  position: absolute;
3835
6110
  top: 50%;
3836
6111
  left: 50%;
3837
6112
  transform: translate(-50%, -50%);
3838
6113
  z-index: 5;
6114
+ width: 560px;
6115
+ max-width: calc(100% - 48px);
3839
6116
  display: flex;
3840
6117
  flex-direction: column;
3841
6118
  align-items: center;
3842
- gap: 12px;
3843
- padding: 36px 44px;
3844
- background: var(--c-panel-glass);
3845
- backdrop-filter: blur(16px);
3846
- border: 1px solid var(--c-line);
3847
- border-radius: 16px;
3848
- box-shadow: 0 8px 32px var(--c-shadow), 0 0 0 1px var(--c-line-30);
3849
- animation: welcome-fade-in 0.5s ease-out;
3850
- pointer-events: auto;
3851
- max-width: 380px;
6119
+ gap: 16px;
3852
6120
  text-align: center;
6121
+ animation: empty-state-in 0.4s ease-out;
3853
6122
  }
3854
-
3855
- @keyframes welcome-fade-in {
3856
- from { opacity: 0; transform: translate(-50%, -48%); }
3857
- to { opacity: 1; transform: translate(-50%, -50%); }
6123
+ @keyframes empty-state-in {
6124
+ from {
6125
+ opacity: 0;
6126
+ transform: translate(-50%, -46%);
6127
+ }
6128
+ to {
6129
+ opacity: 1;
6130
+ transform: translate(-50%, -50%);
6131
+ }
3858
6132
  }
3859
-
3860
- .welcome-icon {
3861
- font-size: 32px;
3862
- color: var(--c-accent);
3863
- opacity: 0.7;
3864
- line-height: 1;
6133
+ .empty-state-mark {
6134
+ stroke: var(--c-line);
6135
+ stroke-width: 2.5;
3865
6136
  }
3866
-
3867
- .welcome-title {
3868
- font-size: 18px;
3869
- font-weight: 600;
6137
+ .empty-state-mark rect + rect {
6138
+ stroke: color-mix(in srgb, var(--c-line) 70%, var(--c-accent));
6139
+ }
6140
+ .empty-state-title {
6141
+ font-size: 20px;
6142
+ font-weight: 700;
6143
+ letter-spacing: -0.01em;
3870
6144
  color: var(--c-text);
3871
- letter-spacing: -0.3px;
3872
6145
  }
3873
-
3874
- .welcome-subtitle {
3875
- font-size: 12px;
3876
- color: var(--c-dim);
3877
- margin-bottom: 8px;
3878
- line-height: 1.55;
6146
+ .empty-state-sub {
6147
+ margin-top: 6px;
6148
+ font-size: 12.5px;
6149
+ color: var(--c-muted);
3879
6150
  }
3880
-
3881
- .welcome-hints {
3882
- display: flex;
3883
- flex-direction: column;
3884
- gap: 6px;
6151
+ .empty-state-grid {
6152
+ display: grid;
6153
+ grid-template-columns: 1fr 1fr;
6154
+ gap: 10px;
3885
6155
  width: 100%;
3886
6156
  }
3887
-
3888
- .welcome-hint {
6157
+ .empty-state-action {
3889
6158
  display: flex;
3890
6159
  align-items: center;
3891
- gap: 12px;
3892
- padding: 8px 12px;
3893
- background: var(--c-surface-subtle);
3894
- border: 1px solid transparent;
3895
- border-radius: var(--radius-sm);
6160
+ gap: 10px;
6161
+ padding: 13px 14px;
6162
+ background: var(--c-panel);
6163
+ border: 1px solid var(--c-line);
6164
+ border-radius: 10px;
6165
+ color: var(--c-text-soft);
6166
+ cursor: pointer;
3896
6167
  text-align: left;
3897
- cursor: default;
3898
6168
  font: inherit;
3899
- color: inherit;
3900
6169
  }
3901
-
3902
- button.welcome-hint {
6170
+ .empty-state-action:hover {
6171
+ border-color: color-mix(in srgb, var(--c-accent) 40%, transparent);
6172
+ }
6173
+ .empty-state-action.is-agent:hover {
6174
+ border-color: color-mix(in srgb, var(--c-purple) 45%, transparent);
6175
+ }
6176
+ .empty-state-action .tone-accent {
6177
+ color: var(--c-accent);
6178
+ }
6179
+ .empty-state-action .tone-warn {
6180
+ color: var(--c-warn);
6181
+ }
6182
+ .empty-state-action .tone-ok {
6183
+ color: var(--c-ok);
6184
+ }
6185
+ .empty-state-action .tone-purple {
6186
+ color: var(--c-purple);
6187
+ }
6188
+ .empty-state-action-label {
6189
+ flex: 1;
6190
+ font-size: 12px;
6191
+ font-weight: 600;
6192
+ }
6193
+ .empty-state-action kbd {
6194
+ padding: 1px 6px;
6195
+ border: 1px solid var(--c-line);
6196
+ border-radius: 4px;
6197
+ font: 9.5px var(--mono);
6198
+ color: var(--c-dim);
6199
+ }
6200
+ .empty-state-action-hint {
6201
+ font-size: 10px;
6202
+ color: var(--c-dim);
6203
+ }
6204
+ .empty-state-hint {
6205
+ background: none;
6206
+ border: none;
6207
+ padding: 0;
6208
+ font: 10.5px var(--mono);
6209
+ color: var(--c-dim);
3903
6210
  cursor: pointer;
3904
6211
  }
3905
-
3906
- button.welcome-hint:hover {
3907
- background: var(--c-surface-hover);
3908
- border-color: var(--c-line);
6212
+ .empty-state-hint:hover {
6213
+ color: var(--c-muted);
3909
6214
  }
3910
6215
 
3911
6216
  @media (max-width: 980px) {
3912
6217
  .attention-toast {
3913
- top: 70px;
3914
6218
  left: 12px;
3915
6219
  right: 12px;
3916
6220
  width: auto;
@@ -3924,16 +6228,11 @@ button.welcome-hint:hover {
3924
6228
  width: auto;
3925
6229
  }
3926
6230
 
3927
- .welcome-card {
3928
- width: calc(100vw - 24px);
3929
- max-width: 420px;
3930
- padding: 28px 24px;
3931
- }
3932
6231
  }
3933
6232
 
3934
6233
  @media (prefers-reduced-motion: reduce) {
3935
6234
  .attention-toast,
3936
- .welcome-card,
6235
+ .empty-state,
3937
6236
  .canvas-node.attention-pulse {
3938
6237
  animation: none !important;
3939
6238
  }
@@ -3945,32 +6244,8 @@ button.welcome-hint:hover {
3945
6244
  }
3946
6245
  }
3947
6246
 
3948
- .welcome-hint kbd {
3949
- display: inline-block;
3950
- background: var(--c-input-bg);
3951
- border: 1px solid var(--c-line);
3952
- border-radius: 4px;
3953
- padding: 2px 7px;
3954
- font-family: var(--mono);
3955
- font-size: 10px;
3956
- color: var(--c-accent);
3957
- white-space: nowrap;
3958
- min-width: 70px;
3959
- text-align: center;
3960
- flex-shrink: 0;
3961
- }
3962
6247
 
3963
- .welcome-hint span {
3964
- font-size: 12px;
3965
- color: var(--c-muted);
3966
- }
3967
6248
 
3968
- .welcome-footer {
3969
- font-size: 11px;
3970
- color: var(--c-dim);
3971
- margin-top: 4px;
3972
- line-height: 1.4;
3973
- }
3974
6249
 
3975
6250
  /* ── Image Node ─────────────────────────────────────────────── */
3976
6251
  .image-node {