@1agh/maude 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/cli/bin/maude.exe +15 -0
  4. package/cli/bin/maude.mjs +45 -0
  5. package/cli/bin/mdcc.exe +10 -0
  6. package/cli/bin/mdcc.mjs +7 -0
  7. package/cli/cli-wrapper.cjs +67 -0
  8. package/cli/commands/config.mjs +94 -0
  9. package/cli/commands/design.mjs +386 -0
  10. package/cli/commands/help.mjs +57 -0
  11. package/cli/commands/init.mjs +178 -0
  12. package/cli/commands/version.mjs +7 -0
  13. package/cli/install.cjs +113 -0
  14. package/cli/lib/argv.mjs +37 -0
  15. package/cli/lib/argv.test.mjs +46 -0
  16. package/cli/lib/copy-tree.mjs +78 -0
  17. package/package.json +94 -0
  18. package/plugins/design/dev-server/annotations-context-toolbar.tsx +397 -0
  19. package/plugins/design/dev-server/annotations-layer.tsx +1717 -0
  20. package/plugins/design/dev-server/api.ts +674 -0
  21. package/plugins/design/dev-server/bin/_screenshot-playwright.mjs +50 -0
  22. package/plugins/design/dev-server/bin/bootstrap-check.sh +83 -0
  23. package/plugins/design/dev-server/bin/canvas-edit.sh +48 -0
  24. package/plugins/design/dev-server/bin/handoff.sh +27 -0
  25. package/plugins/design/dev-server/bin/screenshot.sh +232 -0
  26. package/plugins/design/dev-server/bin/server-up.sh +135 -0
  27. package/plugins/design/dev-server/bin/slug.sh +22 -0
  28. package/plugins/design/dev-server/bin/smoke.sh +272 -0
  29. package/plugins/design/dev-server/build.ts +267 -0
  30. package/plugins/design/dev-server/canvas-build.ts +219 -0
  31. package/plugins/design/dev-server/canvas-edit.ts +388 -0
  32. package/plugins/design/dev-server/canvas-header.ts +165 -0
  33. package/plugins/design/dev-server/canvas-icons.tsx +131 -0
  34. package/plugins/design/dev-server/canvas-lib-inline.ts +260 -0
  35. package/plugins/design/dev-server/canvas-lib-resolver.ts +85 -0
  36. package/plugins/design/dev-server/canvas-lib.tsx +1995 -0
  37. package/plugins/design/dev-server/canvas-meta.schema.json +181 -0
  38. package/plugins/design/dev-server/canvas-pipeline.ts +270 -0
  39. package/plugins/design/dev-server/canvas-shell.tsx +813 -0
  40. package/plugins/design/dev-server/client/app.jsx +2027 -0
  41. package/plugins/design/dev-server/client/hmr.mjs +85 -0
  42. package/plugins/design/dev-server/client/iframe-lazy.mjs +121 -0
  43. package/plugins/design/dev-server/client/index.html +15 -0
  44. package/plugins/design/dev-server/client/styles/0-reset.css +18 -0
  45. package/plugins/design/dev-server/client/styles/1-tokens.css +297 -0
  46. package/plugins/design/dev-server/client/styles/2-layout.css +35 -0
  47. package/plugins/design/dev-server/client/styles/3-shell.css +906 -0
  48. package/plugins/design/dev-server/client/styles/4-components.css +1268 -0
  49. package/plugins/design/dev-server/client/styles/5-utilities.css +4 -0
  50. package/plugins/design/dev-server/client/styles/_index.css +24 -0
  51. package/plugins/design/dev-server/client/styles.css +1419 -0
  52. package/plugins/design/dev-server/config.schema.json +147 -0
  53. package/plugins/design/dev-server/context-menu.tsx +343 -0
  54. package/plugins/design/dev-server/context.ts +173 -0
  55. package/plugins/design/dev-server/dist/client.bundle.js +20323 -0
  56. package/plugins/design/dev-server/dist/styles.css +2875 -0
  57. package/plugins/design/dev-server/examples/README.md +9 -0
  58. package/plugins/design/dev-server/examples/perf-100-artboards.tsx +113 -0
  59. package/plugins/design/dev-server/fs-watch.ts +63 -0
  60. package/plugins/design/dev-server/handoff.ts +721 -0
  61. package/plugins/design/dev-server/history.ts +125 -0
  62. package/plugins/design/dev-server/hmr-broadcast.ts +114 -0
  63. package/plugins/design/dev-server/http.ts +413 -0
  64. package/plugins/design/dev-server/input-router.tsx +485 -0
  65. package/plugins/design/dev-server/inspect.ts +365 -0
  66. package/plugins/design/dev-server/locator.ts +159 -0
  67. package/plugins/design/dev-server/mem.ts +97 -0
  68. package/plugins/design/dev-server/runtime-bundle.ts +235 -0
  69. package/plugins/design/dev-server/server.mjs +1246 -0
  70. package/plugins/design/dev-server/server.ts +131 -0
  71. package/plugins/design/dev-server/test/_helpers.ts +81 -0
  72. package/plugins/design/dev-server/test/active-state.test.ts +145 -0
  73. package/plugins/design/dev-server/test/annotations-api.test.ts +146 -0
  74. package/plugins/design/dev-server/test/annotations-layer.test.ts +419 -0
  75. package/plugins/design/dev-server/test/binary-smoke.test.ts +47 -0
  76. package/plugins/design/dev-server/test/bundle-smoke.test.ts +29 -0
  77. package/plugins/design/dev-server/test/canvas-build.test.ts +78 -0
  78. package/plugins/design/dev-server/test/canvas-edit.test.ts +139 -0
  79. package/plugins/design/dev-server/test/canvas-header.test.ts +127 -0
  80. package/plugins/design/dev-server/test/canvas-lib-inline.test.ts +146 -0
  81. package/plugins/design/dev-server/test/canvas-lib-resolver.test.ts +112 -0
  82. package/plugins/design/dev-server/test/canvas-meta-api.test.ts +236 -0
  83. package/plugins/design/dev-server/test/canvas-pipeline.test.ts +180 -0
  84. package/plugins/design/dev-server/test/canvas-route.test.ts +176 -0
  85. package/plugins/design/dev-server/test/fs-watch.test.ts +41 -0
  86. package/plugins/design/dev-server/test/handoff-static-frames.test.ts +215 -0
  87. package/plugins/design/dev-server/test/handoff.test.ts +281 -0
  88. package/plugins/design/dev-server/test/history-rollback.test.ts +62 -0
  89. package/plugins/design/dev-server/test/hmr-broadcast.test.ts +108 -0
  90. package/plugins/design/dev-server/test/input-router.test.ts +316 -0
  91. package/plugins/design/dev-server/test/locator.test.ts +214 -0
  92. package/plugins/design/dev-server/test/perf-harness.ts +193 -0
  93. package/plugins/design/dev-server/test/phase-3.6-smoke.test.ts +77 -0
  94. package/plugins/design/dev-server/test/runtime-bundle.test.ts +69 -0
  95. package/plugins/design/dev-server/test/server-lifecycle.test.ts +28 -0
  96. package/plugins/design/dev-server/test/tool-palette.test.tsx +55 -0
  97. package/plugins/design/dev-server/test/use-annotation-selection.test.tsx +77 -0
  98. package/plugins/design/dev-server/test/use-artboard-drag.test.ts +325 -0
  99. package/plugins/design/dev-server/test/use-selection-set.test.tsx +166 -0
  100. package/plugins/design/dev-server/test/use-snap-guides.test.ts +190 -0
  101. package/plugins/design/dev-server/test/use-tool-mode.test.tsx +93 -0
  102. package/plugins/design/dev-server/test/ws-handshake.test.ts +33 -0
  103. package/plugins/design/dev-server/tool-palette.tsx +278 -0
  104. package/plugins/design/dev-server/tsconfig.json +26 -0
  105. package/plugins/design/dev-server/use-annotation-selection.tsx +92 -0
  106. package/plugins/design/dev-server/use-annotations-visibility.tsx +43 -0
  107. package/plugins/design/dev-server/use-artboard-drag.tsx +445 -0
  108. package/plugins/design/dev-server/use-selection-set.tsx +224 -0
  109. package/plugins/design/dev-server/use-snap-guides.tsx +215 -0
  110. package/plugins/design/dev-server/use-tool-mode.tsx +114 -0
  111. package/plugins/design/dev-server/ws.ts +90 -0
  112. package/plugins/design/templates/_shell.html +177 -0
  113. package/plugins/design/templates/canvas.tsx.template +54 -0
  114. package/plugins/design/templates/design-system-inspiration/_MAPPING.md +277 -0
  115. package/plugins/design/templates/design-system-inspiration/_README.md +71 -0
  116. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-banner.html +68 -0
  117. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-empty-state-generous.html +39 -0
  118. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-feature-grid.html +62 -0
  119. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-marketing-card.html +63 -0
  120. package/plugins/design/templates/design-system-inspiration/audience-consumer/components-testimonial.html +80 -0
  121. package/plugins/design/templates/design-system-inspiration/audience-developer/components-code-block.html +71 -0
  122. package/plugins/design/templates/design-system-inspiration/audience-developer/components-diff-view.html +65 -0
  123. package/plugins/design/templates/design-system-inspiration/audience-developer/components-log-stream.html +62 -0
  124. package/plugins/design/templates/design-system-inspiration/audience-developer/components-monospace-table.html +57 -0
  125. package/plugins/design/templates/design-system-inspiration/audience-developer/components-terminal-pane.html +67 -0
  126. package/plugins/design/templates/design-system-inspiration/audience-developer/type-mono.html +57 -0
  127. package/plugins/design/templates/design-system-inspiration/audience-pro/colors-presence.html +74 -0
  128. package/plugins/design/templates/design-system-inspiration/audience-pro/components-command-palette.html +90 -0
  129. package/plugins/design/templates/design-system-inspiration/audience-pro/components-keyboard.html +51 -0
  130. package/plugins/design/templates/design-system-inspiration/audience-pro/components-list.html +89 -0
  131. package/plugins/design/templates/design-system-inspiration/audience-pro/components-shortcuts-overlay.html +85 -0
  132. package/plugins/design/templates/design-system-inspiration/audience-pro/components-toast-menu.html +80 -0
  133. package/plugins/design/templates/design-system-inspiration/core/INDEX.md.tpl +25 -0
  134. package/plugins/design/templates/design-system-inspiration/core/README.orchestration.md.tpl +71 -0
  135. package/plugins/design/templates/design-system-inspiration/core/README.philosophy.md.tpl +77 -0
  136. package/plugins/design/templates/design-system-inspiration/core/SKILL.md.tpl +50 -0
  137. package/plugins/design/templates/design-system-inspiration/core/colors_and_type.css.tpl +111 -0
  138. package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +28 -0
  139. package/plugins/design/templates/design-system-inspiration/core/preview/_layout.css +113 -0
  140. package/plugins/design/templates/design-system-inspiration/core/preview/colors-accent.html +48 -0
  141. package/plugins/design/templates/design-system-inspiration/core/preview/colors-surfaces.html +49 -0
  142. package/plugins/design/templates/design-system-inspiration/core/preview/colors-text.html +52 -0
  143. package/plugins/design/templates/design-system-inspiration/core/preview/components-buttons.html +83 -0
  144. package/plugins/design/templates/design-system-inspiration/core/preview/components-cards.html +79 -0
  145. package/plugins/design/templates/design-system-inspiration/core/preview/components-inputs.html +82 -0
  146. package/plugins/design/templates/design-system-inspiration/core/preview/motion.html +66 -0
  147. package/plugins/design/templates/design-system-inspiration/core/preview/spacing-scale.html +53 -0
  148. package/plugins/design/templates/design-system-inspiration/core/preview/type-scale.html +62 -0
  149. package/plugins/design/templates/design-system-inspiration/foundations/borders.html +39 -0
  150. package/plugins/design/templates/design-system-inspiration/foundations/elevation.html +46 -0
  151. package/plugins/design/templates/design-system-inspiration/foundations/focus.html +48 -0
  152. package/plugins/design/templates/design-system-inspiration/foundations/grid.html +51 -0
  153. package/plugins/design/templates/design-system-inspiration/foundations/iconography.html +73 -0
  154. package/plugins/design/templates/design-system-inspiration/foundations/opacity.html +45 -0
  155. package/plugins/design/templates/design-system-inspiration/foundations/radii.html +40 -0
  156. package/plugins/design/templates/design-system-inspiration/foundations/selection.html +45 -0
  157. package/plugins/design/templates/design-system-inspiration/meta/accessibility.html +62 -0
  158. package/plugins/design/templates/design-system-inspiration/meta/i18n.html +73 -0
  159. package/plugins/design/templates/design-system-inspiration/meta/presence-multiplayer.html +71 -0
  160. package/plugins/design/templates/design-system-inspiration/meta/tokens-index.html +80 -0
  161. package/plugins/design/templates/design-system-inspiration/patterns/patterns-auth.html +78 -0
  162. package/plugins/design/templates/design-system-inspiration/patterns/patterns-data-density.html +61 -0
  163. package/plugins/design/templates/design-system-inspiration/patterns/patterns-error-pages.html +70 -0
  164. package/plugins/design/templates/design-system-inspiration/patterns/patterns-form-layouts.html +70 -0
  165. package/plugins/design/templates/design-system-inspiration/patterns/patterns-onboarding.html +71 -0
  166. package/plugins/design/templates/design-system-inspiration/patterns/patterns-pricing.html +83 -0
  167. package/plugins/design/templates/design-system-inspiration/platform-desktop/components-resize-panels.html +63 -0
  168. package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-index.html +55 -0
  169. package/plugins/design/templates/design-system-inspiration/platform-desktop/ui_kits-desktop-showcase.html +302 -0
  170. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-bottom-sheet.html +63 -0
  171. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-pull-to-refresh.html +74 -0
  172. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-segmented-control.html +51 -0
  173. package/plugins/design/templates/design-system-inspiration/platform-mobile/components-tab-bar.html +57 -0
  174. package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-index.html +58 -0
  175. package/plugins/design/templates/design-system-inspiration/platform-mobile/ui_kits-mobile-showcase.html +237 -0
  176. package/plugins/design/templates/design-system-inspiration/status/colors-status.html +49 -0
  177. package/plugins/design/templates/design-system-inspiration/status/components-status.html +63 -0
  178. package/plugins/design/templates/design-system-inspiration/status/skeletons.html +74 -0
  179. package/plugins/design/templates/design-system-inspiration/theme-both/colors-themes-side-by-side.html +59 -0
  180. package/plugins/design/templates/design-system-inspiration/universal/components-callout.html +74 -0
  181. package/plugins/design/templates/design-system-inspiration/universal/components-dialogs.html +81 -0
  182. package/plugins/design/templates/design-system-inspiration/universal/components-tables.html +101 -0
  183. package/plugins/design/templates/design-system-inspiration/universal/components-toggles.html +74 -0
  184. package/plugins/design/templates/design-system-inspiration/universal/components-tooltips.html +74 -0
  185. package/plugins/design/templates/design-system-inspiration/universal/empty-state.html.tpl +34 -0
  186. package/plugins/design/templates/design-system-inspiration/universal/logo.html +42 -0
  187. package/plugins/design/templates/ds-specimen.tsx.template +59 -0
  188. package/plugins/flow/.claude-plugin/config.schema.json +398 -0
  189. package/plugins/flow/README.md +45 -0
  190. package/plugins/flow/templates/ai-skeleton/INDEX.md +50 -0
  191. package/plugins/flow/templates/ai-skeleton/README.md +46 -0
  192. package/plugins/flow/templates/ai-skeleton/browser/har/.gitkeep +0 -0
  193. package/plugins/flow/templates/ai-skeleton/browser/snapshots/.gitkeep +0 -0
  194. package/plugins/flow/templates/ai-skeleton/business/README.md +12 -0
  195. package/plugins/flow/templates/ai-skeleton/context/README.md +12 -0
  196. package/plugins/flow/templates/ai-skeleton/decisions/README.md +20 -0
  197. package/plugins/flow/templates/ai-skeleton/design-import/.gitkeep +0 -0
  198. package/plugins/flow/templates/ai-skeleton/dev-logs/.gitkeep +0 -0
  199. package/plugins/flow/templates/ai-skeleton/device/.gitkeep +0 -0
  200. package/plugins/flow/templates/ai-skeleton/docs/README.md +5 -0
  201. package/plugins/flow/templates/ai-skeleton/logs/.gitkeep +0 -0
  202. package/plugins/flow/templates/ai-skeleton/logs/README.md +13 -0
  203. package/plugins/flow/templates/ai-skeleton/plans/README.md +16 -0
  204. package/plugins/flow/templates/ai-skeleton/plans/archive/.gitkeep +0 -0
  205. package/plugins/flow/templates/ai-skeleton/release-guide.md +35 -0
  206. package/plugins/flow/templates/ai-skeleton/reviews/README.md +15 -0
  207. package/plugins/flow/templates/ai-skeleton/scenarios/README.md +26 -0
  208. package/plugins/flow/templates/ai-skeleton/scenarios/_lib/.gitkeep +0 -0
  209. package/plugins/flow/templates/ai-skeleton/state/STATE.md +25 -0
  210. package/plugins/flow/templates/ai-skeleton/templates/HANDOFF.md +32 -0
  211. package/plugins/flow/templates/ai-skeleton/workflows.config.json +74 -0
@@ -0,0 +1,906 @@
1
+ /* @layer shell — chrome: sidebar, header, status bar, viewport frame. */
2
+ @layer shell {
3
+ /* ----- Sidebar (CV-08 tree-panel) -----
4
+ The mock's left tree panel is the canonical structure: header `FILES N/N`,
5
+ search input, body with PROJECT / DESIGN SYSTEM / UI CANVASES / RUNTIME
6
+ sections (SKU pill counters), rows with .dir / .sel / .star / .modified
7
+ modifiers. Brand block is gone — `■ MDCC` now lives in the top menubar. */
8
+ .sidebar {
9
+ background: var(--u-bg-1);
10
+ border-right: 1px solid var(--u-border);
11
+ display: flex;
12
+ flex-direction: column;
13
+ min-height: 0;
14
+ font-family: var(--u-font-mono);
15
+ font-size: var(--type-xs);
16
+ }
17
+
18
+ .tree-panel-hd {
19
+ display: flex;
20
+ align-items: baseline;
21
+ justify-content: space-between;
22
+ padding: 8px var(--u-s-3) 6px;
23
+ font-size: 10px;
24
+ font-weight: 700;
25
+ letter-spacing: var(--tracking-sku);
26
+ text-transform: uppercase;
27
+ color: var(--u-fg-0);
28
+ font-family: var(--u-font-mono);
29
+ border-bottom: 1px solid var(--u-border);
30
+ background: var(--u-bg-2);
31
+ flex: none;
32
+ }
33
+ .tree-panel-hd .ct {
34
+ color: var(--u-fg-2);
35
+ font-weight: 500;
36
+ display: inline-flex;
37
+ align-items: center;
38
+ gap: 6px;
39
+ }
40
+ .tree-panel-hd .live-dot {
41
+ width: 6px;
42
+ height: 6px;
43
+ background: var(--u-fg-3);
44
+ transition: background var(--dur-panel) var(--ease-out);
45
+ flex: none;
46
+ }
47
+ .tree-panel-hd .live-dot.connected { background: var(--u-status-success); }
48
+
49
+ .tree-panel-search {
50
+ padding: 5px var(--u-s-3);
51
+ display: flex;
52
+ align-items: center;
53
+ gap: 6px;
54
+ background: var(--u-bg-1);
55
+ border-bottom: 1px solid var(--u-border-subtle);
56
+ flex: none;
57
+ }
58
+ .tree-panel-search svg { color: var(--u-fg-2); flex: none; }
59
+ .tree-panel-search input {
60
+ flex: 1;
61
+ background: var(--u-bg-0);
62
+ border: 1px solid var(--u-border);
63
+ color: var(--u-fg-0);
64
+ font-size: 11px;
65
+ outline: none;
66
+ font-family: var(--u-font-mono);
67
+ min-width: 0;
68
+ padding: 3px 8px;
69
+ border-radius: 0;
70
+ transition: border-color var(--dur-flip) var(--ease-out);
71
+ }
72
+ .tree-panel-search input::placeholder { color: var(--u-fg-3); }
73
+ .tree-panel-search input:focus-visible {
74
+ border-color: var(--u-border-strong);
75
+ box-shadow: var(--shadow-focus);
76
+ }
77
+ .search-clear {
78
+ background: transparent;
79
+ border: 0;
80
+ color: var(--u-fg-3);
81
+ cursor: pointer;
82
+ padding: 0 4px;
83
+ font-size: 14px;
84
+ line-height: 1;
85
+ }
86
+ .search-clear:hover { color: var(--u-fg-0); }
87
+ .search-kbd {
88
+ font-family: var(--u-font-mono);
89
+ font-size: 10px;
90
+ padding: 1px 5px;
91
+ color: var(--u-fg-3);
92
+ border: 1px solid var(--u-border);
93
+ background: var(--u-bg-2);
94
+ flex: none;
95
+ }
96
+
97
+ .tree-panel-body {
98
+ flex: 1;
99
+ min-height: 0;
100
+ overflow-y: auto;
101
+ padding: 4px 0 var(--u-s-3);
102
+ }
103
+ .tree-panel-body::-webkit-scrollbar { width: 6px; }
104
+ .tree-panel-body::-webkit-scrollbar-thumb { background: var(--u-border); }
105
+
106
+ .tp-section-hd {
107
+ display: flex;
108
+ align-items: baseline;
109
+ justify-content: space-between;
110
+ gap: 8px;
111
+ padding: 6px var(--u-s-3) 2px;
112
+ font-size: 9px;
113
+ font-weight: 700;
114
+ letter-spacing: var(--tracking-sku);
115
+ text-transform: uppercase;
116
+ color: var(--u-fg-1);
117
+ font-family: var(--u-font-mono);
118
+ }
119
+ .tp-section-hd:not(:first-child) { margin-top: 6px; }
120
+ .tp-section-hd > span:first-child {
121
+ overflow: hidden;
122
+ text-overflow: ellipsis;
123
+ white-space: nowrap;
124
+ }
125
+ .tp-section-hd .pill {
126
+ padding: 0 5px;
127
+ background: var(--u-bg-2);
128
+ border: 1px solid var(--u-border);
129
+ font-size: 9px;
130
+ letter-spacing: var(--tracking-sku);
131
+ color: var(--u-fg-2);
132
+ font-family: var(--u-font-mono);
133
+ font-weight: 600;
134
+ flex: none;
135
+ }
136
+
137
+ .tp-row {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 4px;
141
+ padding: 2px var(--u-s-3);
142
+ color: var(--u-fg-1);
143
+ font-family: var(--u-font-mono);
144
+ font-size: 11px;
145
+ line-height: 1.55;
146
+ cursor: pointer;
147
+ border: 0;
148
+ background: transparent;
149
+ width: 100%;
150
+ text-align: left;
151
+ border-left: 2px solid transparent;
152
+ }
153
+ .tp-row:hover { background: var(--u-bg-2); color: var(--u-fg-0); }
154
+ .tp-row:focus-visible {
155
+ outline: none;
156
+ box-shadow: var(--shadow-focus);
157
+ z-index: 1;
158
+ position: relative;
159
+ }
160
+ .tp-row .glyph {
161
+ width: 12px;
162
+ display: inline-block;
163
+ text-align: center;
164
+ color: var(--u-fg-2);
165
+ font-size: 10px;
166
+ flex: none;
167
+ }
168
+ .tp-row .name {
169
+ flex: 1;
170
+ min-width: 0;
171
+ overflow: hidden;
172
+ text-overflow: ellipsis;
173
+ white-space: nowrap;
174
+ }
175
+ .tp-row.dir {
176
+ color: var(--u-fg-0);
177
+ font-weight: 600;
178
+ }
179
+ .tp-row.dir .glyph { color: var(--u-fg-1); }
180
+ .tp-row.sel {
181
+ background: var(--u-accent-bg);
182
+ color: var(--u-fg-0);
183
+ border-left-color: var(--u-border-strong);
184
+ font-weight: 600;
185
+ }
186
+ .tp-row.sel .glyph { color: var(--u-accent); }
187
+ .tp-row.modified .name::after {
188
+ content: "●";
189
+ color: var(--u-status-warn);
190
+ margin-left: 6px;
191
+ font-size: 8px;
192
+ vertical-align: middle;
193
+ }
194
+ .tp-row.star::before {
195
+ content: "★";
196
+ color: var(--u-accent);
197
+ font-size: 9px;
198
+ margin-right: 4px;
199
+ flex: none;
200
+ }
201
+ .tp-row .badge {
202
+ padding: 0 5px;
203
+ background: var(--u-accent);
204
+ color: var(--u-accent-fg);
205
+ font-size: 9px;
206
+ letter-spacing: var(--tracking-sku);
207
+ font-weight: 700;
208
+ font-family: var(--u-font-mono);
209
+ flex: none;
210
+ }
211
+ .tp-row.muted,
212
+ .tp-row.muted .name {
213
+ color: var(--u-fg-3);
214
+ }
215
+ .tp-row.muted .glyph { color: var(--u-fg-3); }
216
+ .tp-row.muted[aria-disabled="true"] { cursor: default; }
217
+ .tp-row.muted[aria-disabled="true"]:hover {
218
+ background: transparent;
219
+ color: var(--u-fg-3);
220
+ }
221
+ .tp-row[aria-disabled="true"] { cursor: default; }
222
+ .tp-empty {
223
+ padding: 4px var(--u-s-3);
224
+ color: var(--u-fg-3);
225
+ font-size: 11px;
226
+ font-style: italic;
227
+ }
228
+
229
+ /* Cheatsheet */
230
+ .cheatsheet {
231
+ margin-top: auto;
232
+ padding: var(--u-s-3) var(--u-s-2) var(--u-s-3);
233
+ border-top: 1px solid var(--u-border);
234
+ background: var(--u-bg-1);
235
+ }
236
+ .cheatsheet > details {
237
+ margin-bottom: 4px;
238
+ }
239
+ .cheatsheet > details > summary {
240
+ padding: 4px var(--u-s-2);
241
+ font-size: 11px;
242
+ font-weight: 500;
243
+ color: var(--u-fg-1);
244
+ border-radius: var(--u-r-sm);
245
+ cursor: pointer;
246
+ list-style: none;
247
+ display: flex;
248
+ align-items: center;
249
+ gap: var(--u-s-1);
250
+ }
251
+ .cheatsheet > details > summary::-webkit-details-marker { display: none; }
252
+ .cheatsheet > details > summary::before {
253
+ content: "▸";
254
+ color: var(--u-fg-3);
255
+ font-size: 10px;
256
+ width: 12px;
257
+ display: inline-block;
258
+ transition: transform 100ms;
259
+ }
260
+ .cheatsheet > details[open] > summary::before { transform: rotate(90deg); }
261
+ .cheatsheet > details > summary:hover { background: var(--u-bg-hover); }
262
+
263
+ .cheatsheet ul, .cheatsheet ol {
264
+ padding: 4px var(--u-s-2) var(--u-s-2) var(--u-s-4);
265
+ margin: 0;
266
+ font-size: 11px;
267
+ line-height: 1.6;
268
+ }
269
+ .cheatsheet li {
270
+ display: flex;
271
+ align-items: baseline;
272
+ gap: var(--u-s-2);
273
+ padding: 2px 0;
274
+ }
275
+ .cheatsheet li > span {
276
+ color: var(--u-fg-3);
277
+ font-size: 10px;
278
+ margin-left: auto;
279
+ text-align: right;
280
+ }
281
+ .cheatsheet kbd {
282
+ font-family: var(--u-font-mono);
283
+ font-size: 10px;
284
+ background: var(--u-bg-2);
285
+ border: 1px solid var(--u-border);
286
+ padding: 1px 5px;
287
+ border-radius: var(--u-r-xs);
288
+ color: var(--u-fg-0);
289
+ }
290
+ .cheatsheet code {
291
+ font-family: var(--u-font-mono);
292
+ font-size: 10px;
293
+ color: var(--u-accent);
294
+ background: var(--u-accent-bg);
295
+ padding: 1px 4px;
296
+ border-radius: var(--u-r-xs);
297
+ }
298
+ .cheatsheet code i { font-style: normal; color: var(--u-fg-2); }
299
+
300
+ .cheatsheet ul.cmds li, .cheatsheet ul.files li {
301
+ flex-direction: column;
302
+ align-items: flex-start;
303
+ gap: 2px;
304
+ }
305
+ .cheatsheet ul.cmds li > span, .cheatsheet ul.files li > span {
306
+ margin-left: 0;
307
+ text-align: left;
308
+ }
309
+
310
+ /* ----- Main ----- */
311
+ .main {
312
+ display: flex;
313
+ flex-direction: column;
314
+ min-width: 0;
315
+ }
316
+
317
+ /* Menubar — 30 px topbar shared across every canvas view (mirrors CV-08+).
318
+ Brand mark · menu items · spacer · view-state stamp. Replaces the legacy
319
+ action-button .header chrome. Hard-edge ink rule below, mono everywhere. */
320
+ .mb {
321
+ display: flex;
322
+ align-items: stretch;
323
+ gap: 0;
324
+ padding: 0;
325
+ height: 30px;
326
+ background: var(--u-bg-2);
327
+ border-bottom: 1px solid var(--u-fg-0);
328
+ font-family: var(--u-font-mono);
329
+ font-size: var(--type-xs);
330
+ flex-shrink: 0;
331
+ position: relative;
332
+ /* `overflow: hidden` is intentionally NOT set on .mb itself — the View
333
+ dropdown is absolutely-positioned at top: 30px (i.e. below the menubar)
334
+ and would be clipped. Right-side overflow (rsidebar narrow) is clamped
335
+ inside .mb-status (overflow: hidden + min-width: 0). */
336
+ min-width: 0;
337
+ }
338
+ .mb-brand {
339
+ padding: 0 var(--u-s-3);
340
+ border-right: 1px solid var(--u-border);
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 6px;
344
+ font-weight: 700;
345
+ color: var(--u-fg-0);
346
+ font-size: 11px;
347
+ letter-spacing: var(--tracking-sku);
348
+ text-transform: uppercase;
349
+ }
350
+ .mb-brand .dot {
351
+ width: 8px;
352
+ height: 8px;
353
+ background: var(--u-accent);
354
+ flex: none;
355
+ }
356
+ .mb-menus {
357
+ display: flex;
358
+ align-items: stretch;
359
+ }
360
+ .mb-menu {
361
+ padding: 0 12px;
362
+ background: transparent;
363
+ border: 0;
364
+ font-family: var(--u-font-mono);
365
+ font-size: var(--type-xs);
366
+ color: var(--u-fg-1);
367
+ cursor: pointer;
368
+ display: flex;
369
+ align-items: center;
370
+ height: 100%;
371
+ white-space: nowrap;
372
+ }
373
+ .mb-menu:hover { background: var(--u-bg-3); color: var(--u-fg-0); }
374
+ .mb-menu[aria-expanded="true"] {
375
+ background: var(--u-accent);
376
+ color: var(--u-accent-fg);
377
+ font-weight: 600;
378
+ }
379
+ .mb-menu:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--u-accent); }
380
+ .mb-menu:disabled,
381
+ .mb-menu[aria-disabled="true"] {
382
+ color: var(--u-fg-3);
383
+ cursor: not-allowed;
384
+ }
385
+ .mb-menu:disabled:hover,
386
+ .mb-menu[aria-disabled="true"]:hover { background: transparent; color: var(--u-fg-3); }
387
+
388
+ .mb-spacer { flex: 1; min-width: 0; }
389
+ .mb-status {
390
+ padding: 0 var(--u-s-3);
391
+ display: flex;
392
+ align-items: center;
393
+ gap: var(--u-s-3);
394
+ color: var(--u-fg-2);
395
+ font-size: 10px;
396
+ letter-spacing: var(--tracking-sku);
397
+ text-transform: uppercase;
398
+ border-left: 1px solid var(--u-border);
399
+ min-width: 0;
400
+ overflow: hidden;
401
+ white-space: nowrap;
402
+ flex-shrink: 1;
403
+ }
404
+ .mb-status > * { flex: none; }
405
+ .mb-status > .file { flex: 0 1 auto; min-width: 0; }
406
+ .mb-status .cv-stamp {
407
+ background: var(--u-fg-0);
408
+ color: var(--u-bg-0);
409
+ padding: 2px 6px;
410
+ font-weight: 700;
411
+ font-size: 10px;
412
+ }
413
+ .mb-status .file {
414
+ color: var(--u-fg-1);
415
+ max-width: 280px;
416
+ overflow: hidden;
417
+ text-overflow: ellipsis;
418
+ white-space: nowrap;
419
+ }
420
+ .mb-status .file b { color: var(--u-fg-0); font-weight: 700; }
421
+ .mb-status .sep {
422
+ width: 1px;
423
+ height: 14px;
424
+ background: var(--u-border);
425
+ display: inline-block;
426
+ flex: none;
427
+ }
428
+ .mb-status b { color: var(--u-fg-0); font-weight: 700; }
429
+ .mb-status .ok { color: var(--u-status-success); }
430
+ .mb-status .warn { color: var(--u-accent); }
431
+ .mb-status .accent-dot {
432
+ color: var(--u-accent);
433
+ font-size: 8px;
434
+ }
435
+
436
+ /* Dropdown panel — opens below a menu item. Hard-edge + offset shadow,
437
+ no blur. */
438
+ .mb-dropdown {
439
+ position: absolute;
440
+ top: 30px;
441
+ background: var(--u-bg-2);
442
+ border: 1px solid var(--u-fg-0);
443
+ min-width: 240px;
444
+ padding: 4px 0;
445
+ z-index: 100;
446
+ font-family: var(--u-font-mono);
447
+ font-size: var(--type-xs);
448
+ box-shadow: 4px 4px 0 var(--u-fg-0);
449
+ }
450
+ .mb-dd-hd {
451
+ padding: 4px 12px 2px;
452
+ font-size: 9px;
453
+ letter-spacing: var(--tracking-sku);
454
+ text-transform: uppercase;
455
+ color: var(--u-fg-2);
456
+ font-weight: 600;
457
+ }
458
+ .mb-dd-item {
459
+ padding: 5px 12px;
460
+ display: flex;
461
+ align-items: center;
462
+ justify-content: space-between;
463
+ gap: 16px;
464
+ cursor: pointer;
465
+ color: var(--u-fg-0);
466
+ background: transparent;
467
+ border: 0;
468
+ width: 100%;
469
+ text-align: left;
470
+ font-family: var(--u-font-mono);
471
+ font-size: var(--type-xs);
472
+ }
473
+ .mb-dd-item:hover { background: var(--u-bg-3); }
474
+ .mb-dd-item.active { color: var(--u-accent); }
475
+ .mb-dd-item[aria-disabled="true"] { color: var(--u-fg-3); cursor: not-allowed; }
476
+ .mb-dd-item[aria-disabled="true"]:hover { background: transparent; }
477
+ .mb-dd-item .lbl { display: inline-flex; align-items: center; gap: 6px; }
478
+ .mb-dd-item .check {
479
+ color: var(--u-accent);
480
+ width: 12px;
481
+ display: inline-block;
482
+ text-align: left;
483
+ }
484
+ .mb-dd-item .shortcut {
485
+ color: var(--u-fg-2);
486
+ font-family: var(--u-font-mono);
487
+ font-size: 10px;
488
+ letter-spacing: var(--tracking-wide);
489
+ flex: none;
490
+ }
491
+ .mb-dd-item .phase-tag {
492
+ color: var(--u-fg-3);
493
+ font-size: 9px;
494
+ letter-spacing: var(--tracking-sku);
495
+ text-transform: uppercase;
496
+ }
497
+ .mb-dd-sep { height: 1px; background: var(--u-border); margin: 4px 0; }
498
+
499
+ .header {
500
+ display: flex;
501
+ align-items: center;
502
+ gap: var(--u-s-3);
503
+ padding: var(--u-s-2) var(--u-s-3);
504
+ background: var(--u-bg-1);
505
+ border-bottom: 1px solid var(--u-border);
506
+ min-height: var(--u-header-h);
507
+ font-family: var(--u-font-mono);
508
+ }
509
+
510
+ /* Tabs — mono labels, hairline active-underline, no pills.
511
+ Stack the underline on the active tab via an inset bottom shadow so the
512
+ shared bottom hairline from .header still reads as one continuous line. */
513
+ .tabs {
514
+ display: flex;
515
+ gap: 0;
516
+ flex: 1;
517
+ min-width: 0;
518
+ overflow-x: auto;
519
+ align-self: stretch;
520
+ margin: calc(var(--u-s-2) * -1) calc(var(--u-s-3) * -1);
521
+ padding: 0;
522
+ }
523
+ .tabs::-webkit-scrollbar { height: 0; }
524
+
525
+ .tab {
526
+ display: flex;
527
+ align-items: center;
528
+ gap: var(--u-s-2);
529
+ padding: var(--u-s-2) var(--u-s-3);
530
+ background: var(--u-bg-1);
531
+ border: 0;
532
+ border-right: 1px solid var(--u-border-subtle);
533
+ border-radius: 0;
534
+ font-size: var(--type-xs);
535
+ font-family: var(--u-font-mono);
536
+ letter-spacing: var(--tracking-wide);
537
+ cursor: pointer;
538
+ white-space: nowrap;
539
+ max-width: 240px;
540
+ color: var(--u-fg-2);
541
+ position: relative;
542
+ transition: color var(--dur-flip) var(--ease-out),
543
+ background var(--dur-flip) var(--ease-out);
544
+ }
545
+ .tab:hover { color: var(--u-fg-0); background: var(--u-bg-2); }
546
+ .tab.active {
547
+ background: var(--u-bg-0);
548
+ color: var(--u-fg-0);
549
+ font-weight: 700;
550
+ }
551
+ .tab.active::after {
552
+ content: "";
553
+ position: absolute;
554
+ left: 0; right: 0; bottom: -1px;
555
+ height: 2px;
556
+ background: var(--u-accent);
557
+ }
558
+ .tab:focus-visible {
559
+ outline: none;
560
+ box-shadow: var(--shadow-focus);
561
+ z-index: 2;
562
+ }
563
+ .tab .name {
564
+ overflow: hidden;
565
+ text-overflow: ellipsis;
566
+ flex: 1;
567
+ min-width: 0;
568
+ }
569
+ .tab .close {
570
+ color: var(--u-fg-3);
571
+ cursor: pointer;
572
+ padding: 0 4px;
573
+ border-radius: var(--u-r-xs);
574
+ line-height: 1;
575
+ font-size: 14px;
576
+ background: transparent;
577
+ border: 0;
578
+ font-family: inherit;
579
+ }
580
+ .tab .close:hover {
581
+ background: var(--u-bg-3);
582
+ color: var(--u-fg-0);
583
+ }
584
+
585
+ .actions {
586
+ display: flex;
587
+ gap: var(--u-s-1);
588
+ align-items: center;
589
+ }
590
+ /* Project DS — ghost chrome buttons. Transparent base, 1 px hairline,
591
+ hover bumps surface + ink contrast (no fill in chrome). */
592
+ .actions button, .actions a {
593
+ position: relative;
594
+ background: transparent;
595
+ color: var(--u-fg-1);
596
+ border: 1px solid var(--u-border);
597
+ padding: 4px var(--u-s-3);
598
+ font-size: var(--type-xs);
599
+ line-height: 1.2;
600
+ border-radius: var(--u-r-sm);
601
+ cursor: pointer;
602
+ font-family: var(--u-font-mono);
603
+ letter-spacing: var(--tracking-wide);
604
+ text-decoration: none;
605
+ display: inline-flex;
606
+ align-items: center;
607
+ gap: 6px;
608
+ transition: color var(--dur-flip) var(--ease-out),
609
+ background var(--dur-flip) var(--ease-out),
610
+ border-color var(--dur-flip) var(--ease-out);
611
+ }
612
+ .actions button:hover, .actions a:hover {
613
+ background: var(--u-bg-2);
614
+ color: var(--u-fg-0);
615
+ border-color: var(--u-border-strong);
616
+ }
617
+ .actions button:focus-visible, .actions a:focus-visible {
618
+ outline: none;
619
+ box-shadow: var(--shadow-focus);
620
+ z-index: 1;
621
+ }
622
+ .actions a.icon-only {
623
+ border-color: transparent;
624
+ color: var(--u-fg-2);
625
+ }
626
+ .actions a.icon-only:hover {
627
+ color: var(--u-fg-0);
628
+ background: var(--u-bg-2);
629
+ border-color: var(--u-border);
630
+ }
631
+ .theme-toggle-label {
632
+ text-transform: lowercase;
633
+ }
634
+
635
+ /* Viewport — 24 px paper-grid surface (CV-01 idle infinite canvas).
636
+ The grid signals "this is the canvas plane" in the empty state; once an
637
+ iframe mounts it covers the bg with its own --u-bg-0 fill. Hairlines use
638
+ --u-border-subtle so the texture reads as ink-on-paper in light and as
639
+ soft phosphor-on-dark in dark. */
640
+ .viewport {
641
+ flex: 1;
642
+ position: relative;
643
+ background-color: var(--u-bg-1);
644
+ background-image:
645
+ linear-gradient(var(--u-border-subtle) 1px, transparent 1px),
646
+ linear-gradient(90deg, var(--u-border-subtle) 1px, transparent 1px);
647
+ background-size: 24px 24px;
648
+ }
649
+ /* Direct-child only — avoids matching preview iframes nested inside .system-view */
650
+ .viewport > iframe {
651
+ position: absolute;
652
+ inset: 0;
653
+ width: 100%;
654
+ height: 100%;
655
+ border: 0;
656
+ display: none;
657
+ background: var(--u-bg-0);
658
+ }
659
+ .viewport > iframe.active { display: block; }
660
+
661
+ .empty-state {
662
+ display: flex;
663
+ align-items: center;
664
+ justify-content: center;
665
+ height: 100%;
666
+ color: var(--u-fg-3);
667
+ flex-direction: column;
668
+ gap: var(--u-s-4);
669
+ padding: 48px;
670
+ text-align: center;
671
+ }
672
+ .empty-state .big {
673
+ font-family: var(--u-font-display);
674
+ font-size: 18px;
675
+ color: var(--u-fg-1);
676
+ font-weight: 600;
677
+ letter-spacing: -0.01em;
678
+ }
679
+ .empty-state .small {
680
+ font-size: 12px;
681
+ max-width: 480px;
682
+ line-height: 1.6;
683
+ }
684
+ .empty-state .small kbd {
685
+ font-family: var(--u-font-mono);
686
+ background: var(--u-bg-2);
687
+ border: 1px solid var(--u-border);
688
+ padding: 1px 6px;
689
+ border-radius: var(--u-r-xs);
690
+ font-size: 11px;
691
+ color: var(--u-fg-1);
692
+ }
693
+ .empty-state .small code {
694
+ font-family: var(--u-font-mono);
695
+ font-size: 11px;
696
+ background: var(--u-bg-2);
697
+ padding: 1px 4px;
698
+ border-radius: var(--u-r-xs);
699
+ color: var(--u-accent);
700
+ }
701
+
702
+ /* Status bar — named slots separated by 1 px hairlines.
703
+ Slot order: active path · selected element · open comments · live · spacer · theme.
704
+ Hairlines render as inset right borders on each slot (no extra DOM). */
705
+ .statusbar {
706
+ font-family: var(--u-font-mono);
707
+ font-size: 10px;
708
+ color: var(--u-fg-2);
709
+ letter-spacing: var(--tracking-wide);
710
+ padding: 0;
711
+ background: var(--u-bg-1);
712
+ border-top: 1px solid var(--u-border);
713
+ display: flex;
714
+ align-items: stretch;
715
+ height: var(--u-status-h);
716
+ /* Defensive clamp — `.sb-selected` shows the selected element's selector
717
+ which can be very long (deep CSS selectors). Combined with .main's
718
+ minmax(0, 1fr) grid clamp this keeps the chrome inside the viewport. */
719
+ min-width: 0;
720
+ overflow: hidden;
721
+ }
722
+ .sb-slot {
723
+ display: inline-flex;
724
+ align-items: center;
725
+ gap: var(--u-s-2);
726
+ padding: 0 var(--u-s-3);
727
+ border-right: 1px solid var(--u-border-subtle);
728
+ min-width: 0;
729
+ }
730
+ .sb-key {
731
+ color: var(--u-fg-3);
732
+ text-transform: uppercase;
733
+ letter-spacing: var(--tracking-sku);
734
+ }
735
+ .sb-active {
736
+ flex: 0 1 auto;
737
+ min-width: 0;
738
+ }
739
+ .sb-active .sb-file {
740
+ color: var(--u-fg-1);
741
+ overflow: hidden;
742
+ text-overflow: ellipsis;
743
+ white-space: nowrap;
744
+ max-width: 360px;
745
+ }
746
+ .sb-selected {
747
+ flex: 1 1 auto;
748
+ min-width: 0;
749
+ }
750
+ .sb-selected .sb-dot {
751
+ color: var(--u-accent);
752
+ }
753
+ .sb-selected .sb-sel-text {
754
+ color: var(--u-fg-1);
755
+ overflow: hidden;
756
+ text-overflow: ellipsis;
757
+ white-space: nowrap;
758
+ flex: 1;
759
+ min-width: 0;
760
+ }
761
+ .sb-clear-sel,
762
+ .sb-add-comment {
763
+ background: transparent;
764
+ color: var(--u-fg-2);
765
+ border: 1px solid var(--u-border);
766
+ border-radius: var(--u-r-xs);
767
+ padding: 1px 6px;
768
+ font-family: inherit;
769
+ font-size: 10px;
770
+ line-height: 1.4;
771
+ letter-spacing: var(--tracking-sku);
772
+ text-transform: uppercase;
773
+ cursor: pointer;
774
+ }
775
+ .sb-add-comment {
776
+ color: var(--u-accent);
777
+ border-color: var(--u-accent);
778
+ }
779
+ .sb-clear-sel:hover {
780
+ color: var(--u-fg-0);
781
+ background: var(--u-bg-2);
782
+ border-color: var(--u-border-strong);
783
+ }
784
+ .sb-add-comment:hover {
785
+ background: var(--u-accent);
786
+ color: var(--u-accent-fg);
787
+ }
788
+ .sb-unread .sb-count {
789
+ font-family: var(--u-font-mono);
790
+ font-size: 10px;
791
+ color: var(--u-fg-0);
792
+ font-variant-numeric: tabular-nums;
793
+ font-weight: 700;
794
+ padding: 0 5px;
795
+ background: var(--u-bg-2);
796
+ border: 1px solid var(--u-border);
797
+ }
798
+ /* Note (Phase 3.5 T16): canvas-state slots (ARTBOARDS / ZOOM) live in the
799
+ .mb-status section of the top menubar now, mirroring CV-01/CV-08. The
800
+ statusbar keeps only chrome-state: ACTIVE / SELECTED / COMMENTS / LIVE / THEME. */
801
+ .sb-live-dot {
802
+ width: 7px; height: 7px;
803
+ background: var(--u-fg-3);
804
+ border-radius: 50%;
805
+ flex: none;
806
+ }
807
+ .sb-live-dot.connected {
808
+ background: var(--u-status-error);
809
+ }
810
+ .sb-live .sb-key { color: var(--u-fg-1); }
811
+ .sb-spacer {
812
+ flex: 1 0 auto;
813
+ border-right: 1px solid var(--u-border-subtle);
814
+ }
815
+ .sb-theme {
816
+ border-right: 0;
817
+ padding: 0 var(--u-s-2);
818
+ }
819
+ .sb-theme .theme-toggle {
820
+ background: transparent;
821
+ border: 0;
822
+ color: var(--u-fg-2);
823
+ font-family: var(--u-font-mono);
824
+ font-size: 10px;
825
+ letter-spacing: var(--tracking-sku);
826
+ text-transform: uppercase;
827
+ padding: 2px var(--u-s-2);
828
+ display: inline-flex;
829
+ align-items: center;
830
+ gap: 6px;
831
+ cursor: pointer;
832
+ }
833
+ .sb-theme .theme-toggle:hover { color: var(--u-fg-0); background: var(--u-bg-2); }
834
+ .sb-theme .theme-toggle:focus-visible { outline: none; box-shadow: var(--shadow-focus); }
835
+ .theme-toggle-label { color: inherit; }
836
+
837
+ .filter-no-match {
838
+ display: none !important;
839
+ }
840
+
841
+ /* Wordmark — empty-state watermark, top-left of viewport.
842
+ Mirrors CV-01 .wm: 40 px display glyph + SKU-tracked sub-line.
843
+ Sits above the paper-grid via absolute positioning; iframes mount
844
+ on top with their own opaque bg and cover this naturally. */
845
+ .wm {
846
+ position: absolute;
847
+ top: var(--u-s-4);
848
+ left: var(--u-s-5);
849
+ font-family: var(--u-font-display);
850
+ font-weight: 700;
851
+ line-height: 1;
852
+ color: var(--u-fg-0);
853
+ pointer-events: none;
854
+ z-index: 1;
855
+ user-select: none;
856
+ }
857
+ .wm-glyph {
858
+ font-size: 40px;
859
+ letter-spacing: var(--tracking-tight);
860
+ display: block;
861
+ }
862
+ .wm-sub {
863
+ font-size: var(--type-xs);
864
+ letter-spacing: var(--tracking-sku);
865
+ text-transform: uppercase;
866
+ color: var(--u-fg-2);
867
+ font-weight: 500;
868
+ margin-top: var(--u-s-2);
869
+ display: flex;
870
+ gap: var(--u-s-3);
871
+ align-items: center;
872
+ }
873
+ .wm-sub b {
874
+ color: var(--u-accent);
875
+ font-weight: 700;
876
+ }
877
+ .wm-sep {
878
+ color: var(--u-fg-3);
879
+ }
880
+
881
+ /* Selection halo — accent 2 px outline + 4 corner ticks around the
882
+ active iframe when an element is selected. Mirrors CV-02 .sel-halo.
883
+ Outlines the iframe frame (the artboard), not the inner element —
884
+ element-level overlay is Phase 4 territory. */
885
+ .sel-halo {
886
+ position: absolute;
887
+ inset: 0;
888
+ border: 2px solid var(--u-accent);
889
+ pointer-events: none;
890
+ z-index: 5;
891
+ }
892
+ .sel-halo::before,
893
+ .sel-halo::after,
894
+ .sel-halo > i::before,
895
+ .sel-halo > i::after {
896
+ content: "";
897
+ position: absolute;
898
+ width: 8px;
899
+ height: 8px;
900
+ background: var(--u-accent);
901
+ }
902
+ .sel-halo::before { top: -3px; left: -3px; }
903
+ .sel-halo::after { top: -3px; right: -3px; }
904
+ .sel-halo > i::before { bottom: -3px; left: -3px; }
905
+ .sel-halo > i::after { bottom: -3px; right: -3px; }
906
+ }