@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,1419 @@
1
+ /* ============================================================
2
+ Design plugin — local browser UI
3
+ Universal styling, no project tokens. Neutral zinc grayscale.
4
+ ============================================================ */
5
+
6
+ :root {
7
+ /* Surfaces — zinc */
8
+ --u-bg-0: #09090b;
9
+ --u-bg-1: #18181b;
10
+ --u-bg-2: #27272a;
11
+ --u-bg-3: #3f3f46;
12
+ --u-bg-4: #52525b;
13
+ --u-bg-hover: rgba(255,255,255,0.05);
14
+ --u-bg-active: rgba(255,255,255,0.08);
15
+ --u-bg-selected: rgba(255,255,255,0.10);
16
+
17
+ /* Text */
18
+ --u-fg-0: #fafafa;
19
+ --u-fg-1: #d4d4d8;
20
+ --u-fg-2: #a1a1aa;
21
+ --u-fg-3: #71717a;
22
+
23
+ /* Borders */
24
+ --u-border: rgba(255,255,255,0.08);
25
+ --u-border-strong: rgba(255,255,255,0.16);
26
+
27
+ /* Accent — neutral gray-blue, intentionally not "branded" */
28
+ --u-accent: #38bdf8; /* sky-400 — works on dark, not too strong */
29
+ --u-accent-bg: rgba(56,189,248,0.14);
30
+ --u-accent-line: rgba(56,189,248,0.50);
31
+ --u-accent-strong: #0ea5e9;
32
+
33
+ /* Status */
34
+ --u-status-success: #22c55e;
35
+ --u-status-warn: #f59e0b;
36
+ --u-status-error: #ef4444;
37
+ --u-status-live: #ef4444;
38
+
39
+ /* Radii */
40
+ --u-r-xs: 2px;
41
+ --u-r-sm: 4px;
42
+ --u-r-md: 6px;
43
+ --u-r-lg: 8px;
44
+ --u-r-pill: 999px;
45
+
46
+ /* Spacing */
47
+ --u-s-1: 4px;
48
+ --u-s-2: 8px;
49
+ --u-s-3: 12px;
50
+ --u-s-4: 16px;
51
+ --u-s-5: 24px;
52
+
53
+ /* Type */
54
+ --u-font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif;
55
+ --u-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', 'Menlo', monospace;
56
+ --u-font-display: 'Inter', ui-sans-serif, system-ui, sans-serif;
57
+
58
+ /* Layout */
59
+ --u-sidebar-w: 320px;
60
+ --u-rsidebar-w: 320px;
61
+ --u-header-h: 44px;
62
+ --u-status-h: 28px;
63
+ }
64
+
65
+ * { box-sizing: border-box; }
66
+
67
+ html, body {
68
+ margin: 0; padding: 0; height: 100%;
69
+ background: var(--u-bg-0);
70
+ color: var(--u-fg-0);
71
+ font-family: var(--u-font-sans);
72
+ font-size: 13px;
73
+ line-height: 1.45;
74
+ -webkit-font-smoothing: antialiased;
75
+ -moz-osx-font-smoothing: grayscale;
76
+ }
77
+
78
+ button { font: inherit; }
79
+ ::selection { background: var(--u-accent-bg); color: var(--u-fg-0); }
80
+
81
+ /* ----- App shell ----- */
82
+ .app {
83
+ display: grid;
84
+ grid-template-columns: var(--u-sidebar-w) 1fr;
85
+ height: 100vh;
86
+ }
87
+ .app.with-rsidebar {
88
+ grid-template-columns: var(--u-sidebar-w) 1fr var(--u-rsidebar-w);
89
+ }
90
+
91
+ /* ----- Sidebar ----- */
92
+ .sidebar {
93
+ background: var(--u-bg-1);
94
+ border-right: 1px solid var(--u-border);
95
+ overflow-y: auto;
96
+ display: flex;
97
+ flex-direction: column;
98
+ }
99
+ .sidebar::-webkit-scrollbar { width: 6px; }
100
+ .sidebar::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 3px; }
101
+
102
+ .brand {
103
+ padding: var(--u-s-3) var(--u-s-4);
104
+ display: flex;
105
+ align-items: center;
106
+ gap: var(--u-s-2);
107
+ border-bottom: 1px solid var(--u-border);
108
+ }
109
+ .brand-mark {
110
+ width: 24px; height: 24px;
111
+ border-radius: var(--u-r-sm);
112
+ background: var(--u-accent);
113
+ color: var(--u-bg-0);
114
+ font-weight: 700;
115
+ display: grid;
116
+ place-items: center;
117
+ font-family: var(--u-font-display);
118
+ font-size: 12px;
119
+ }
120
+ .brand-title {
121
+ font-family: var(--u-font-display);
122
+ font-weight: 600;
123
+ font-size: 14px;
124
+ letter-spacing: -0.01em;
125
+ color: var(--u-fg-0);
126
+ flex: 1;
127
+ }
128
+ .brand-status {
129
+ width: 6px; height: 6px;
130
+ border-radius: 999px;
131
+ background: var(--u-fg-3);
132
+ transition: background 200ms ease-out;
133
+ }
134
+ .brand-status.connected { background: var(--u-status-success); box-shadow: 0 0 6px var(--u-status-success); }
135
+
136
+ /* Search */
137
+ .search {
138
+ margin: var(--u-s-3) var(--u-s-3) var(--u-s-2);
139
+ height: 30px;
140
+ display: flex;
141
+ align-items: center;
142
+ gap: var(--u-s-2);
143
+ padding: 0 var(--u-s-3);
144
+ background: var(--u-bg-2);
145
+ border: 1px solid var(--u-border);
146
+ border-radius: var(--u-r-md);
147
+ transition: border-color 120ms ease-out;
148
+ }
149
+ .search:focus-within { border-color: var(--u-accent-line); }
150
+ .search svg { flex: none; color: var(--u-fg-3); }
151
+ .search input {
152
+ flex: 1;
153
+ background: transparent;
154
+ border: 0;
155
+ color: var(--u-fg-0);
156
+ font-size: 12px;
157
+ outline: none;
158
+ font-family: inherit;
159
+ min-width: 0;
160
+ }
161
+ .search-clear {
162
+ background: transparent;
163
+ border: 0;
164
+ color: var(--u-fg-3);
165
+ cursor: pointer;
166
+ padding: 0 4px;
167
+ font-size: 14px;
168
+ line-height: 1;
169
+ }
170
+ .search-clear:hover { color: var(--u-fg-0); }
171
+ .search-kbd {
172
+ font-family: var(--u-font-mono);
173
+ font-size: 10px;
174
+ padding: 1px 5px;
175
+ color: var(--u-fg-3);
176
+ border: 1px solid var(--u-border);
177
+ border-radius: var(--u-r-sm);
178
+ }
179
+
180
+ /* Tree */
181
+ .tree {
182
+ flex: 1;
183
+ padding: 0 var(--u-s-2) var(--u-s-3);
184
+ }
185
+ .tree-section {
186
+ margin-bottom: var(--u-s-3);
187
+ }
188
+ .tree-h2 {
189
+ display: flex;
190
+ align-items: baseline;
191
+ justify-content: space-between;
192
+ font-size: 10px;
193
+ font-weight: 600;
194
+ text-transform: uppercase;
195
+ letter-spacing: 0.08em;
196
+ color: var(--u-fg-2);
197
+ margin: 0 var(--u-s-2) var(--u-s-2);
198
+ }
199
+ .tree-h2 .count {
200
+ color: var(--u-fg-3);
201
+ font-weight: 500;
202
+ font-family: var(--u-font-mono);
203
+ }
204
+ .tree-empty {
205
+ padding: 0 var(--u-s-2) 0;
206
+ color: var(--u-fg-3);
207
+ font-size: 11px;
208
+ line-height: 1.5;
209
+ }
210
+ .tree-empty code {
211
+ font-family: var(--u-font-mono);
212
+ font-size: 10px;
213
+ background: var(--u-bg-2);
214
+ padding: 1px 4px;
215
+ border-radius: var(--u-r-xs);
216
+ }
217
+
218
+ .tree details { margin-left: 4px; }
219
+ .tree details > summary {
220
+ cursor: pointer;
221
+ padding: 3px var(--u-s-2);
222
+ border-radius: var(--u-r-sm);
223
+ font-weight: 500;
224
+ user-select: none;
225
+ list-style: none;
226
+ display: flex;
227
+ align-items: center;
228
+ gap: var(--u-s-1);
229
+ color: var(--u-fg-1);
230
+ }
231
+ .tree details > summary::-webkit-details-marker { display: none; }
232
+ .tree details > summary::before {
233
+ content: "▸";
234
+ color: var(--u-fg-3);
235
+ font-size: 10px;
236
+ width: 12px;
237
+ display: inline-block;
238
+ transition: transform 100ms;
239
+ }
240
+ .tree details[open] > summary::before { transform: rotate(90deg); }
241
+ .tree details > summary:hover { background: var(--u-bg-hover); }
242
+
243
+ .tree-files { list-style: none; padding: 0 0 0 20px; margin: 0; }
244
+ .tree-file {
245
+ display: block;
246
+ padding: 4px var(--u-s-2);
247
+ color: var(--u-fg-1);
248
+ text-decoration: none;
249
+ border-radius: var(--u-r-sm);
250
+ font-size: 12px;
251
+ white-space: nowrap;
252
+ overflow: hidden;
253
+ text-overflow: ellipsis;
254
+ cursor: pointer;
255
+ background: transparent;
256
+ border: 0;
257
+ width: 100%;
258
+ text-align: left;
259
+ font-family: inherit;
260
+ }
261
+ .tree-file:hover { background: var(--u-bg-hover); color: var(--u-fg-0); }
262
+ .tree-file.active {
263
+ background: var(--u-accent-bg);
264
+ color: var(--u-accent);
265
+ }
266
+ .tree-file .tf-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
267
+ .tree-file.active .tf-name::before {
268
+ content: "● ";
269
+ color: var(--u-accent);
270
+ }
271
+ .tree-file { display: flex; align-items: center; gap: var(--u-s-1); }
272
+ .tf-badge {
273
+ font-family: var(--u-font-mono);
274
+ font-size: 9px;
275
+ background: #facc15;
276
+ color: #1c1917;
277
+ border-radius: var(--u-r-pill);
278
+ padding: 1px 6px;
279
+ font-weight: 600;
280
+ flex: none;
281
+ }
282
+
283
+ /* System link button (above search) */
284
+ .system-link {
285
+ display: flex;
286
+ align-items: center;
287
+ gap: var(--u-s-2);
288
+ margin: var(--u-s-3) var(--u-s-3) 0;
289
+ padding: 8px var(--u-s-3);
290
+ background: var(--u-bg-2);
291
+ border: 1px solid var(--u-border);
292
+ border-radius: var(--u-r-md);
293
+ color: var(--u-fg-1);
294
+ cursor: pointer;
295
+ font-family: inherit;
296
+ font-size: 12px;
297
+ font-weight: 500;
298
+ text-align: left;
299
+ transition: all 120ms ease-out;
300
+ }
301
+ .system-link:hover {
302
+ background: var(--u-bg-3);
303
+ color: var(--u-fg-0);
304
+ border-color: var(--u-border-strong);
305
+ }
306
+ .system-link.active {
307
+ background: var(--u-accent-bg);
308
+ color: var(--u-accent);
309
+ border-color: var(--u-accent-line);
310
+ }
311
+ .system-link .sl-glyph {
312
+ font-size: 14px;
313
+ line-height: 1;
314
+ }
315
+ .system-link .sl-label { flex: 1; }
316
+ .system-link .sl-arrow {
317
+ color: var(--u-fg-3);
318
+ font-size: 11px;
319
+ font-family: var(--u-font-mono);
320
+ }
321
+ .system-link.active .sl-arrow { color: var(--u-accent); }
322
+
323
+ /* Cheatsheet */
324
+ .cheatsheet {
325
+ margin-top: auto;
326
+ padding: var(--u-s-3) var(--u-s-2) var(--u-s-3);
327
+ border-top: 1px solid var(--u-border);
328
+ background: var(--u-bg-1);
329
+ }
330
+ .cheatsheet > details {
331
+ margin-bottom: 4px;
332
+ }
333
+ .cheatsheet > details > summary {
334
+ padding: 4px var(--u-s-2);
335
+ font-size: 11px;
336
+ font-weight: 500;
337
+ color: var(--u-fg-1);
338
+ border-radius: var(--u-r-sm);
339
+ cursor: pointer;
340
+ list-style: none;
341
+ display: flex;
342
+ align-items: center;
343
+ gap: var(--u-s-1);
344
+ }
345
+ .cheatsheet > details > summary::-webkit-details-marker { display: none; }
346
+ .cheatsheet > details > summary::before {
347
+ content: "▸";
348
+ color: var(--u-fg-3);
349
+ font-size: 10px;
350
+ width: 12px;
351
+ display: inline-block;
352
+ transition: transform 100ms;
353
+ }
354
+ .cheatsheet > details[open] > summary::before { transform: rotate(90deg); }
355
+ .cheatsheet > details > summary:hover { background: var(--u-bg-hover); }
356
+
357
+ .cheatsheet ul, .cheatsheet ol {
358
+ padding: 4px var(--u-s-2) var(--u-s-2) var(--u-s-4);
359
+ margin: 0;
360
+ font-size: 11px;
361
+ line-height: 1.6;
362
+ }
363
+ .cheatsheet li {
364
+ display: flex;
365
+ align-items: baseline;
366
+ gap: var(--u-s-2);
367
+ padding: 2px 0;
368
+ }
369
+ .cheatsheet li > span {
370
+ color: var(--u-fg-3);
371
+ font-size: 10px;
372
+ margin-left: auto;
373
+ text-align: right;
374
+ }
375
+ .cheatsheet kbd {
376
+ font-family: var(--u-font-mono);
377
+ font-size: 10px;
378
+ background: var(--u-bg-2);
379
+ border: 1px solid var(--u-border);
380
+ padding: 1px 5px;
381
+ border-radius: var(--u-r-xs);
382
+ color: var(--u-fg-0);
383
+ }
384
+ .cheatsheet code {
385
+ font-family: var(--u-font-mono);
386
+ font-size: 10px;
387
+ color: var(--u-accent);
388
+ background: var(--u-accent-bg);
389
+ padding: 1px 4px;
390
+ border-radius: var(--u-r-xs);
391
+ }
392
+ .cheatsheet code i { font-style: normal; color: var(--u-fg-2); }
393
+
394
+ .cheatsheet ul.cmds li, .cheatsheet ul.files li {
395
+ flex-direction: column;
396
+ align-items: flex-start;
397
+ gap: 2px;
398
+ }
399
+ .cheatsheet ul.cmds li > span, .cheatsheet ul.files li > span {
400
+ margin-left: 0;
401
+ text-align: left;
402
+ }
403
+
404
+ /* ----- Main ----- */
405
+ .main {
406
+ display: flex;
407
+ flex-direction: column;
408
+ min-width: 0;
409
+ }
410
+
411
+ .header {
412
+ display: flex;
413
+ align-items: center;
414
+ gap: var(--u-s-2);
415
+ padding: var(--u-s-2) var(--u-s-3);
416
+ background: var(--u-bg-1);
417
+ border-bottom: 1px solid var(--u-border);
418
+ min-height: var(--u-header-h);
419
+ }
420
+
421
+ .tabs {
422
+ display: flex;
423
+ gap: 4px;
424
+ flex: 1;
425
+ min-width: 0;
426
+ overflow-x: auto;
427
+ }
428
+ .tabs::-webkit-scrollbar { height: 0; }
429
+
430
+ .tab {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: var(--u-s-2);
434
+ padding: 6px var(--u-s-3);
435
+ background: var(--u-bg-2);
436
+ border: 1px solid var(--u-border);
437
+ border-radius: var(--u-r-md);
438
+ font-size: 12px;
439
+ cursor: pointer;
440
+ white-space: nowrap;
441
+ max-width: 240px;
442
+ color: var(--u-fg-1);
443
+ font-family: inherit;
444
+ }
445
+ .tab:hover { background: var(--u-bg-3); }
446
+ .tab.active {
447
+ background: var(--u-bg-3);
448
+ border-color: var(--u-border-strong);
449
+ color: var(--u-fg-0);
450
+ }
451
+ .tab .name {
452
+ overflow: hidden;
453
+ text-overflow: ellipsis;
454
+ flex: 1;
455
+ min-width: 0;
456
+ }
457
+ .tab .close {
458
+ color: var(--u-fg-3);
459
+ cursor: pointer;
460
+ padding: 0 4px;
461
+ border-radius: var(--u-r-xs);
462
+ line-height: 1;
463
+ font-size: 14px;
464
+ background: transparent;
465
+ border: 0;
466
+ font-family: inherit;
467
+ }
468
+ .tab .close:hover {
469
+ background: rgba(255,255,255,0.10);
470
+ color: var(--u-fg-0);
471
+ }
472
+
473
+ .actions {
474
+ display: flex;
475
+ gap: 4px;
476
+ align-items: center;
477
+ }
478
+ .actions button, .actions a {
479
+ background: var(--u-bg-2);
480
+ color: var(--u-fg-1);
481
+ border: 1px solid var(--u-border);
482
+ padding: 5px var(--u-s-3);
483
+ font-size: 11px;
484
+ border-radius: var(--u-r-md);
485
+ cursor: pointer;
486
+ font-family: var(--u-font-mono);
487
+ text-decoration: none;
488
+ display: inline-flex;
489
+ align-items: center;
490
+ gap: 4px;
491
+ }
492
+ .actions button:hover, .actions a:hover {
493
+ background: var(--u-bg-3);
494
+ color: var(--u-fg-0);
495
+ }
496
+ .actions a.icon-only {
497
+ background: transparent;
498
+ border: 0;
499
+ padding: 5px var(--u-s-2);
500
+ color: var(--u-fg-2);
501
+ }
502
+ .actions a.icon-only:hover { color: var(--u-accent); }
503
+
504
+ /* Viewport */
505
+ .viewport {
506
+ flex: 1;
507
+ position: relative;
508
+ background: var(--u-bg-0);
509
+ }
510
+ /* Direct-child only — avoids matching preview iframes nested inside .system-view */
511
+ .viewport > iframe {
512
+ position: absolute;
513
+ inset: 0;
514
+ width: 100%;
515
+ height: 100%;
516
+ border: 0;
517
+ display: none;
518
+ background: var(--u-bg-0);
519
+ }
520
+ .viewport > iframe.active { display: block; }
521
+
522
+ .empty-state {
523
+ display: flex;
524
+ align-items: center;
525
+ justify-content: center;
526
+ height: 100%;
527
+ color: var(--u-fg-3);
528
+ flex-direction: column;
529
+ gap: var(--u-s-4);
530
+ padding: 48px;
531
+ text-align: center;
532
+ }
533
+ .empty-state .big {
534
+ font-family: var(--u-font-display);
535
+ font-size: 18px;
536
+ color: var(--u-fg-1);
537
+ font-weight: 600;
538
+ letter-spacing: -0.01em;
539
+ }
540
+ .empty-state .small {
541
+ font-size: 12px;
542
+ max-width: 480px;
543
+ line-height: 1.6;
544
+ }
545
+ .empty-state .small kbd {
546
+ font-family: var(--u-font-mono);
547
+ background: var(--u-bg-2);
548
+ border: 1px solid var(--u-border);
549
+ padding: 1px 6px;
550
+ border-radius: var(--u-r-xs);
551
+ font-size: 11px;
552
+ color: var(--u-fg-1);
553
+ }
554
+ .empty-state .small code {
555
+ font-family: var(--u-font-mono);
556
+ font-size: 11px;
557
+ background: var(--u-bg-2);
558
+ padding: 1px 4px;
559
+ border-radius: var(--u-r-xs);
560
+ color: var(--u-accent);
561
+ }
562
+
563
+ /* Status bar */
564
+ .statusbar {
565
+ font-family: var(--u-font-mono);
566
+ font-size: 10px;
567
+ color: var(--u-fg-3);
568
+ padding: var(--u-s-1) var(--u-s-3);
569
+ background: var(--u-bg-1);
570
+ border-top: 1px solid var(--u-border);
571
+ display: flex;
572
+ align-items: center;
573
+ gap: var(--u-s-3);
574
+ height: var(--u-status-h);
575
+ }
576
+ .statusbar .file {
577
+ color: var(--u-accent);
578
+ overflow: hidden;
579
+ text-overflow: ellipsis;
580
+ white-space: nowrap;
581
+ max-width: 280px;
582
+ }
583
+ .statusbar .selected-info {
584
+ display: flex;
585
+ align-items: center;
586
+ gap: var(--u-s-1);
587
+ flex: 1;
588
+ min-width: 0;
589
+ }
590
+ .statusbar .sel-text {
591
+ color: var(--u-fg-1);
592
+ overflow: hidden;
593
+ text-overflow: ellipsis;
594
+ white-space: nowrap;
595
+ max-width: 600px;
596
+ }
597
+ .statusbar .clear-sel {
598
+ background: transparent;
599
+ color: var(--u-fg-3);
600
+ border: 1px solid var(--u-border);
601
+ border-radius: var(--u-r-xs);
602
+ padding: 1px 6px;
603
+ font-family: inherit;
604
+ font-size: 10px;
605
+ line-height: 1;
606
+ cursor: pointer;
607
+ }
608
+ .statusbar .clear-sel:hover { color: var(--u-fg-0); background: var(--u-bg-2); }
609
+ .statusbar .ws { margin-left: auto; }
610
+ .statusbar .ws.connected { color: var(--u-status-success); }
611
+
612
+ .filter-no-match {
613
+ display: none !important;
614
+ }
615
+
616
+ /* ----- System tab ----- */
617
+ .tab-system {
618
+ background: var(--u-accent-bg);
619
+ border-color: var(--u-accent-line);
620
+ color: var(--u-accent);
621
+ }
622
+ .tab-system:hover { background: var(--u-accent-bg); }
623
+ .tab-system.active { color: var(--u-accent); border-color: var(--u-accent); }
624
+
625
+ /* ----- System view ----- */
626
+ .system-view {
627
+ position: absolute;
628
+ inset: 0;
629
+ display: none;
630
+ overflow-y: auto;
631
+ background: var(--u-bg-0);
632
+ }
633
+ .system-view.active { display: block; }
634
+ .system-view::-webkit-scrollbar { width: 8px; }
635
+ .system-view::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 4px; }
636
+
637
+ .sv {
638
+ max-width: 1280px;
639
+ margin: 0 auto;
640
+ padding: var(--u-s-5) var(--u-s-5) 80px;
641
+ }
642
+ .sv-empty {
643
+ display: grid;
644
+ place-items: center;
645
+ height: 50vh;
646
+ color: var(--u-fg-3);
647
+ }
648
+
649
+ .sv-header {
650
+ padding-bottom: var(--u-s-4);
651
+ border-bottom: 1px solid var(--u-border);
652
+ margin-bottom: var(--u-s-5);
653
+ }
654
+ .sv-header h1 {
655
+ font-family: var(--u-font-display);
656
+ font-size: 28px;
657
+ font-weight: 600;
658
+ letter-spacing: -0.02em;
659
+ color: var(--u-fg-0);
660
+ margin: 0 0 var(--u-s-2);
661
+ }
662
+ .sv-meta {
663
+ display: flex;
664
+ flex-wrap: wrap;
665
+ gap: var(--u-s-2);
666
+ align-items: center;
667
+ font-size: 12px;
668
+ color: var(--u-fg-3);
669
+ margin: 0;
670
+ }
671
+ .sv-meta code {
672
+ font-family: var(--u-font-mono);
673
+ font-size: 11px;
674
+ background: var(--u-bg-2);
675
+ padding: 1px 6px;
676
+ border-radius: var(--u-r-xs);
677
+ color: var(--u-fg-1);
678
+ }
679
+
680
+ .sv-section {
681
+ margin-bottom: var(--u-s-5);
682
+ }
683
+ .sv-section h2 {
684
+ font-family: var(--u-font-display);
685
+ font-size: 16px;
686
+ font-weight: 600;
687
+ color: var(--u-fg-0);
688
+ letter-spacing: -0.01em;
689
+ margin: 0 0 var(--u-s-3);
690
+ display: flex;
691
+ align-items: baseline;
692
+ gap: var(--u-s-2);
693
+ }
694
+ .sv-section h3 {
695
+ font-family: var(--u-font-display);
696
+ font-size: 11px;
697
+ font-weight: 600;
698
+ color: var(--u-fg-2);
699
+ text-transform: uppercase;
700
+ letter-spacing: 0.08em;
701
+ margin: var(--u-s-3) 0 var(--u-s-2);
702
+ display: flex;
703
+ align-items: baseline;
704
+ gap: var(--u-s-2);
705
+ }
706
+ .sv-count {
707
+ font-family: var(--u-font-mono);
708
+ font-size: 11px;
709
+ color: var(--u-fg-3);
710
+ font-weight: 500;
711
+ }
712
+
713
+ .sv-readme {
714
+ font-family: var(--u-font-mono);
715
+ font-size: 12px;
716
+ line-height: 1.6;
717
+ color: var(--u-fg-1);
718
+ background: var(--u-bg-1);
719
+ border: 1px solid var(--u-border);
720
+ border-radius: var(--u-r-md);
721
+ padding: var(--u-s-4);
722
+ white-space: pre-wrap;
723
+ overflow-x: auto;
724
+ max-height: 480px;
725
+ overflow-y: auto;
726
+ }
727
+
728
+ /* Tokens */
729
+ .sv-tokens-group { margin-bottom: var(--u-s-3); }
730
+ .sv-tokens {
731
+ display: grid;
732
+ gap: var(--u-s-2);
733
+ }
734
+ .sv-tokens-color { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
735
+ .sv-tokens-font, .sv-tokens-fontsize { grid-template-columns: 1fr; }
736
+ .sv-tokens-radius, .sv-tokens-shadow { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
737
+ .sv-tokens-space { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); }
738
+ .sv-tokens-other, .sv-tokens-weight, .sv-tokens-leading, .sv-tokens-motion {
739
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
740
+ }
741
+
742
+ .tok {
743
+ background: var(--u-bg-1);
744
+ border: 1px solid var(--u-border);
745
+ border-radius: var(--u-r-md);
746
+ padding: var(--u-s-2);
747
+ display: flex;
748
+ flex-direction: column;
749
+ gap: var(--u-s-2);
750
+ min-width: 0;
751
+ }
752
+ .tok-meta {
753
+ display: flex;
754
+ flex-direction: column;
755
+ gap: 2px;
756
+ font-size: 11px;
757
+ min-width: 0;
758
+ }
759
+ .tok-meta code {
760
+ font-family: var(--u-font-mono);
761
+ color: var(--u-fg-0);
762
+ font-size: 11px;
763
+ overflow: hidden;
764
+ text-overflow: ellipsis;
765
+ white-space: nowrap;
766
+ }
767
+ .tok-meta span {
768
+ font-family: var(--u-font-mono);
769
+ color: var(--u-fg-3);
770
+ font-size: 10px;
771
+ overflow: hidden;
772
+ text-overflow: ellipsis;
773
+ white-space: nowrap;
774
+ }
775
+
776
+ .tok-color { flex-direction: row; align-items: center; }
777
+ .tok-swatch {
778
+ width: 48px;
779
+ height: 48px;
780
+ border-radius: var(--u-r-sm);
781
+ border: 1px solid var(--u-border-strong);
782
+ flex: none;
783
+ background-image:
784
+ linear-gradient(45deg, rgba(255,255,255,0.05) 25%, transparent 25%),
785
+ linear-gradient(-45deg, rgba(255,255,255,0.05) 25%, transparent 25%),
786
+ linear-gradient(45deg, transparent 75%, rgba(255,255,255,0.05) 75%),
787
+ linear-gradient(-45deg, transparent 75%, rgba(255,255,255,0.05) 75%);
788
+ background-size: 12px 12px;
789
+ background-position: 0 0, 0 6px, 6px -6px, -6px 0;
790
+ }
791
+ .tok-color .tok-swatch { background: inherit; }
792
+
793
+ .tok-text .tok-sample {
794
+ color: var(--u-fg-0);
795
+ font-size: 18px;
796
+ line-height: 1.3;
797
+ overflow: hidden;
798
+ text-overflow: ellipsis;
799
+ white-space: nowrap;
800
+ }
801
+
802
+ .tok-radius { flex-direction: row; align-items: center; }
803
+ .tok-radius .tok-shape {
804
+ width: 48px; height: 48px;
805
+ background: var(--u-bg-3);
806
+ border: 1px solid var(--u-border-strong);
807
+ flex: none;
808
+ }
809
+ .tok-shadow { flex-direction: row; align-items: center; padding: var(--u-s-3); }
810
+ .tok-shadow .tok-shape {
811
+ width: 48px; height: 48px;
812
+ background: var(--u-bg-2);
813
+ border-radius: var(--u-r-md);
814
+ flex: none;
815
+ }
816
+ .tok-space { flex-direction: column; }
817
+ .tok-space .tok-bar {
818
+ height: 8px;
819
+ background: var(--u-accent);
820
+ border-radius: var(--u-r-pill);
821
+ max-width: 100%;
822
+ }
823
+
824
+ /* Galleries (preview / ui_kits) */
825
+ .sv-previews {
826
+ display: grid;
827
+ grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
828
+ gap: var(--u-s-3);
829
+ }
830
+ .sv-previews-ui_kits {
831
+ grid-template-columns: repeat(auto-fill, minmax(560px, 1fr));
832
+ }
833
+ .sv-previews-ui_kits .sv-preview-frame {
834
+ aspect-ratio: 16 / 10;
835
+ }
836
+ .sv-preview-card {
837
+ background: var(--u-bg-1);
838
+ border: 1px solid var(--u-border);
839
+ border-radius: var(--u-r-md);
840
+ overflow: hidden;
841
+ cursor: pointer;
842
+ transition: all 120ms;
843
+ }
844
+ .sv-preview-card:hover {
845
+ border-color: var(--u-accent-line);
846
+ transform: translateY(-1px);
847
+ }
848
+ .sv-preview-frame {
849
+ position: relative;
850
+ aspect-ratio: 16 / 10;
851
+ background: var(--u-bg-0);
852
+ border-bottom: 1px solid var(--u-border);
853
+ overflow: hidden;
854
+ }
855
+ .sv-preview-frame iframe {
856
+ position: absolute;
857
+ top: 0;
858
+ left: 0;
859
+ width: 200%;
860
+ height: 200%;
861
+ border: 0;
862
+ transform: scale(0.5);
863
+ transform-origin: top left;
864
+ /* `pointer-events: none` blocks click-through; .sv-preview-card has its own
865
+ onClick that handles opening the file. Keep iframe interactive-blocked so
866
+ hovers/clicks don't get swallowed by the inner specimen. */
867
+ pointer-events: none;
868
+ background: var(--u-bg-0);
869
+ }
870
+ .sv-preview-foot {
871
+ padding: var(--u-s-2) var(--u-s-3);
872
+ display: flex;
873
+ flex-direction: column;
874
+ gap: 2px;
875
+ }
876
+ .sv-preview-foot strong {
877
+ font-size: 12px;
878
+ color: var(--u-fg-0);
879
+ font-weight: 600;
880
+ }
881
+ .sv-preview-foot code {
882
+ font-family: var(--u-font-mono);
883
+ font-size: 10px;
884
+ color: var(--u-fg-3);
885
+ overflow: hidden;
886
+ text-overflow: ellipsis;
887
+ white-space: nowrap;
888
+ }
889
+
890
+ /* Components / list */
891
+ .sv-list {
892
+ list-style: none;
893
+ margin: 0;
894
+ padding: 0;
895
+ display: grid;
896
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
897
+ gap: var(--u-s-1);
898
+ }
899
+ .sv-list li {
900
+ background: var(--u-bg-1);
901
+ border: 1px solid var(--u-border);
902
+ border-radius: var(--u-r-sm);
903
+ padding: var(--u-s-2) var(--u-s-3);
904
+ display: flex;
905
+ flex-direction: column;
906
+ gap: 2px;
907
+ min-width: 0;
908
+ }
909
+ .sv-list code {
910
+ font-family: var(--u-font-mono);
911
+ font-size: 12px;
912
+ color: var(--u-fg-0);
913
+ font-weight: 500;
914
+ }
915
+ .sv-list-path {
916
+ font-family: var(--u-font-mono);
917
+ font-size: 10px;
918
+ color: var(--u-fg-3);
919
+ overflow: hidden;
920
+ text-overflow: ellipsis;
921
+ white-space: nowrap;
922
+ }
923
+
924
+ /* Assets */
925
+ .sv-assets {
926
+ display: grid;
927
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
928
+ gap: var(--u-s-2);
929
+ }
930
+ .sv-asset {
931
+ background: var(--u-bg-1);
932
+ border: 1px solid var(--u-border);
933
+ border-radius: var(--u-r-sm);
934
+ padding: var(--u-s-3);
935
+ margin: 0;
936
+ display: flex;
937
+ flex-direction: column;
938
+ align-items: center;
939
+ gap: var(--u-s-2);
940
+ }
941
+ .sv-asset img {
942
+ max-width: 100%;
943
+ max-height: 80px;
944
+ height: auto;
945
+ width: auto;
946
+ object-fit: contain;
947
+ }
948
+ .sv-asset figcaption {
949
+ font-family: var(--u-font-mono);
950
+ font-size: 10px;
951
+ color: var(--u-fg-3);
952
+ text-align: center;
953
+ overflow: hidden;
954
+ text-overflow: ellipsis;
955
+ white-space: nowrap;
956
+ max-width: 100%;
957
+ }
958
+
959
+ /* ----- Comment bar ----- */
960
+ .comment-bar {
961
+ background: var(--u-bg-1);
962
+ border-top: 1px solid var(--u-border);
963
+ padding: 6px var(--u-s-3);
964
+ display: flex;
965
+ flex-direction: column;
966
+ gap: 4px;
967
+ font-size: 12px;
968
+ }
969
+ .cb-row {
970
+ display: flex;
971
+ align-items: center;
972
+ gap: var(--u-s-2);
973
+ flex-wrap: wrap;
974
+ }
975
+ /* Composer — stacked vertically so the textarea has real estate */
976
+ .composer {
977
+ display: flex;
978
+ flex-direction: column;
979
+ gap: var(--u-s-2);
980
+ padding: var(--u-s-3);
981
+ background: var(--u-bg-2);
982
+ border: 1px solid var(--u-accent-line);
983
+ border-radius: var(--u-r-md);
984
+ margin: 4px 0;
985
+ }
986
+ .composer-head {
987
+ display: flex;
988
+ align-items: baseline;
989
+ gap: var(--u-s-2);
990
+ font-size: 11px;
991
+ color: var(--u-fg-3);
992
+ }
993
+ .composer-selector {
994
+ font-family: var(--u-font-mono);
995
+ font-size: 11px;
996
+ color: var(--u-fg-1);
997
+ background: var(--u-bg-1);
998
+ padding: 2px 8px;
999
+ border-radius: var(--u-r-sm);
1000
+ border: 1px solid var(--u-border);
1001
+ overflow: hidden;
1002
+ text-overflow: ellipsis;
1003
+ white-space: nowrap;
1004
+ flex: 1;
1005
+ min-width: 0;
1006
+ }
1007
+ .comment-bar textarea.composer-textarea {
1008
+ width: 100%;
1009
+ background: var(--u-bg-1);
1010
+ border: 1px solid var(--u-border);
1011
+ border-radius: var(--u-r-sm);
1012
+ color: var(--u-fg-0);
1013
+ font-family: inherit;
1014
+ font-size: 13px;
1015
+ line-height: 1.5;
1016
+ padding: var(--u-s-3);
1017
+ resize: vertical;
1018
+ min-height: 100px;
1019
+ outline: none;
1020
+ }
1021
+ .comment-bar textarea.composer-textarea:focus { border-color: var(--u-accent-line); }
1022
+ .comment-bar textarea.composer-textarea::placeholder { color: var(--u-fg-3); }
1023
+ .composer-actions {
1024
+ display: flex;
1025
+ justify-content: flex-end;
1026
+ gap: 6px;
1027
+ }
1028
+
1029
+ .cb-row.composer {
1030
+ align-items: stretch;
1031
+ flex-wrap: nowrap;
1032
+ }
1033
+ .cb-label {
1034
+ color: var(--u-fg-3);
1035
+ font-size: 11px;
1036
+ flex: none;
1037
+ align-self: center;
1038
+ }
1039
+ .cb-label code {
1040
+ font-family: var(--u-font-mono);
1041
+ font-size: 10px;
1042
+ background: var(--u-bg-2);
1043
+ padding: 1px 4px;
1044
+ border-radius: var(--u-r-xs);
1045
+ color: var(--u-fg-1);
1046
+ }
1047
+ .comment-bar textarea {
1048
+ flex: 1;
1049
+ background: var(--u-bg-2);
1050
+ border: 1px solid var(--u-border);
1051
+ border-radius: var(--u-r-sm);
1052
+ color: var(--u-fg-0);
1053
+ font-family: inherit;
1054
+ font-size: 12px;
1055
+ padding: var(--u-s-2);
1056
+ resize: vertical;
1057
+ min-height: 40px;
1058
+ outline: none;
1059
+ }
1060
+ .comment-bar textarea:focus { border-color: var(--u-accent-line); }
1061
+ .cb-actions {
1062
+ display: flex;
1063
+ gap: 4px;
1064
+ align-self: flex-end;
1065
+ }
1066
+ .cb-primary, .cb-secondary {
1067
+ border: 1px solid var(--u-border);
1068
+ background: var(--u-bg-2);
1069
+ color: var(--u-fg-1);
1070
+ border-radius: var(--u-r-sm);
1071
+ padding: 4px var(--u-s-3);
1072
+ font-family: var(--u-font-mono);
1073
+ font-size: 11px;
1074
+ cursor: pointer;
1075
+ }
1076
+ .cb-primary {
1077
+ background: var(--u-accent);
1078
+ color: var(--u-bg-0);
1079
+ border-color: var(--u-accent);
1080
+ font-weight: 600;
1081
+ }
1082
+ .cb-primary:hover { background: var(--u-accent-strong); border-color: var(--u-accent-strong); }
1083
+ .cb-primary:disabled { opacity: 0.5; cursor: not-allowed; }
1084
+ .cb-secondary:hover { background: var(--u-bg-3); color: var(--u-fg-0); }
1085
+
1086
+ .cb-row.focused {
1087
+ background: var(--u-bg-2);
1088
+ border-radius: var(--u-r-sm);
1089
+ padding: 4px var(--u-s-2);
1090
+ }
1091
+ .cb-pinno {
1092
+ font-family: var(--u-font-mono);
1093
+ font-size: 11px;
1094
+ background: #facc15;
1095
+ color: #1c1917;
1096
+ border-radius: var(--u-r-pill);
1097
+ padding: 1px 6px;
1098
+ font-weight: 700;
1099
+ flex: none;
1100
+ }
1101
+ .cb-text {
1102
+ flex: 1;
1103
+ color: var(--u-fg-0);
1104
+ overflow: hidden;
1105
+ text-overflow: ellipsis;
1106
+ white-space: nowrap;
1107
+ font-size: 12px;
1108
+ }
1109
+ .cb-target code {
1110
+ font-family: var(--u-font-mono);
1111
+ font-size: 10px;
1112
+ background: var(--u-bg-3);
1113
+ padding: 1px 6px;
1114
+ border-radius: var(--u-r-xs);
1115
+ color: var(--u-fg-2);
1116
+ max-width: 240px;
1117
+ overflow: hidden;
1118
+ text-overflow: ellipsis;
1119
+ white-space: nowrap;
1120
+ display: inline-block;
1121
+ }
1122
+
1123
+ .cb-row.strip {
1124
+ font-size: 11px;
1125
+ color: var(--u-fg-3);
1126
+ }
1127
+ .cb-pin-strip {
1128
+ display: flex;
1129
+ gap: 4px;
1130
+ flex: 1;
1131
+ flex-wrap: wrap;
1132
+ }
1133
+ .cb-pin-chip {
1134
+ font-family: var(--u-font-mono);
1135
+ font-size: 10px;
1136
+ background: #facc15;
1137
+ color: #1c1917;
1138
+ border: 0;
1139
+ border-radius: var(--u-r-pill);
1140
+ padding: 2px 7px;
1141
+ font-weight: 600;
1142
+ cursor: pointer;
1143
+ transition: transform 100ms;
1144
+ }
1145
+ .cb-pin-chip:hover { transform: scale(1.1); }
1146
+ .cb-more { font-family: var(--u-font-mono); font-size: 10px; color: var(--u-fg-3); align-self: center; }
1147
+
1148
+ /* ----- Right sidebar — Comments panel ----- */
1149
+ .rsidebar {
1150
+ background: var(--u-bg-1);
1151
+ border-left: 1px solid var(--u-border);
1152
+ display: flex;
1153
+ flex-direction: column;
1154
+ min-width: 0;
1155
+ }
1156
+ .rsidebar-header {
1157
+ padding: var(--u-s-3) var(--u-s-4);
1158
+ border-bottom: 1px solid var(--u-border);
1159
+ }
1160
+ .rsidebar-header h2 {
1161
+ font-family: var(--u-font-display);
1162
+ font-size: 13px;
1163
+ font-weight: 600;
1164
+ margin: 0 0 var(--u-s-2);
1165
+ color: var(--u-fg-0);
1166
+ display: flex;
1167
+ align-items: center;
1168
+ gap: var(--u-s-2);
1169
+ }
1170
+ .rsidebar-header h2 .total {
1171
+ font-family: var(--u-font-mono);
1172
+ font-size: 11px;
1173
+ color: var(--u-fg-3);
1174
+ font-weight: 500;
1175
+ margin-left: auto;
1176
+ }
1177
+ .rsidebar-filters {
1178
+ display: flex;
1179
+ gap: 4px;
1180
+ background: var(--u-bg-2);
1181
+ border-radius: var(--u-r-md);
1182
+ padding: 3px;
1183
+ border: 1px solid var(--u-border);
1184
+ }
1185
+ .rsidebar-filter {
1186
+ flex: 1;
1187
+ background: transparent;
1188
+ border: 0;
1189
+ color: var(--u-fg-2);
1190
+ cursor: pointer;
1191
+ font-family: inherit;
1192
+ font-size: 11px;
1193
+ font-weight: 500;
1194
+ padding: 5px 6px;
1195
+ border-radius: var(--u-r-sm);
1196
+ display: flex;
1197
+ align-items: center;
1198
+ justify-content: center;
1199
+ gap: 4px;
1200
+ transition: all 100ms;
1201
+ }
1202
+ .rsidebar-filter:hover { color: var(--u-fg-0); }
1203
+ .rsidebar-filter.active {
1204
+ background: var(--u-bg-3);
1205
+ color: var(--u-fg-0);
1206
+ box-shadow: 0 1px 2px rgba(0,0,0,0.3);
1207
+ }
1208
+ .rsidebar-filter .fc {
1209
+ font-family: var(--u-font-mono);
1210
+ font-size: 10px;
1211
+ color: var(--u-fg-3);
1212
+ }
1213
+ .rsidebar-filter.active .fc { color: var(--u-fg-1); }
1214
+
1215
+ .rsidebar-body {
1216
+ flex: 1;
1217
+ overflow-y: auto;
1218
+ padding: var(--u-s-2);
1219
+ }
1220
+ .rsidebar-body::-webkit-scrollbar { width: 6px; }
1221
+ .rsidebar-body::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 3px; }
1222
+ .rsidebar-empty {
1223
+ padding: var(--u-s-5) var(--u-s-3);
1224
+ text-align: center;
1225
+ color: var(--u-fg-3);
1226
+ font-size: 12px;
1227
+ line-height: 1.5;
1228
+ }
1229
+ .rsidebar-empty kbd {
1230
+ font-family: var(--u-font-mono);
1231
+ background: var(--u-bg-2);
1232
+ border: 1px solid var(--u-border);
1233
+ padding: 1px 5px;
1234
+ border-radius: var(--u-r-xs);
1235
+ font-size: 11px;
1236
+ color: var(--u-fg-1);
1237
+ }
1238
+
1239
+ .rs-group {
1240
+ margin-bottom: var(--u-s-2);
1241
+ }
1242
+ .rs-group-h {
1243
+ display: flex;
1244
+ align-items: center;
1245
+ gap: var(--u-s-1);
1246
+ padding: var(--u-s-2) var(--u-s-2) 4px;
1247
+ font-size: 11px;
1248
+ font-weight: 600;
1249
+ color: var(--u-fg-2);
1250
+ background: transparent;
1251
+ border: 0;
1252
+ width: 100%;
1253
+ text-align: left;
1254
+ cursor: pointer;
1255
+ font-family: inherit;
1256
+ }
1257
+ .rs-group-h:hover { color: var(--u-fg-0); }
1258
+ .rs-group-h .rs-group-name {
1259
+ overflow: hidden;
1260
+ text-overflow: ellipsis;
1261
+ white-space: nowrap;
1262
+ flex: 1;
1263
+ min-width: 0;
1264
+ }
1265
+ .rs-group-h .rs-group-count {
1266
+ font-family: var(--u-font-mono);
1267
+ font-size: 10px;
1268
+ color: var(--u-fg-3);
1269
+ font-weight: 500;
1270
+ }
1271
+
1272
+ .rs-comment {
1273
+ background: var(--u-bg-2);
1274
+ border: 1px solid var(--u-border);
1275
+ border-radius: var(--u-r-md);
1276
+ padding: var(--u-s-2) var(--u-s-3);
1277
+ margin-bottom: 4px;
1278
+ cursor: pointer;
1279
+ transition: all 100ms;
1280
+ display: flex;
1281
+ flex-direction: column;
1282
+ gap: 4px;
1283
+ }
1284
+ .rs-comment:hover {
1285
+ border-color: var(--u-border-strong);
1286
+ background: var(--u-bg-3);
1287
+ }
1288
+ .rs-comment.active-pin {
1289
+ border-color: var(--u-accent-line);
1290
+ background: var(--u-accent-bg);
1291
+ }
1292
+ .rs-comment.resolved {
1293
+ opacity: 0.65;
1294
+ }
1295
+ .rs-comment-head {
1296
+ display: flex;
1297
+ align-items: center;
1298
+ gap: var(--u-s-2);
1299
+ }
1300
+ .rs-num {
1301
+ font-family: var(--u-font-mono);
1302
+ font-size: 10px;
1303
+ background: #facc15;
1304
+ color: #1c1917;
1305
+ border-radius: var(--u-r-pill);
1306
+ padding: 1px 6px;
1307
+ font-weight: 700;
1308
+ flex: none;
1309
+ }
1310
+ .rs-comment.resolved .rs-num {
1311
+ background: var(--u-status-success);
1312
+ color: #052e16;
1313
+ }
1314
+ .rs-time {
1315
+ font-family: var(--u-font-mono);
1316
+ font-size: 10px;
1317
+ color: var(--u-fg-3);
1318
+ margin-left: auto;
1319
+ flex: none;
1320
+ }
1321
+ .rs-comment-text {
1322
+ font-size: 12px;
1323
+ color: var(--u-fg-0);
1324
+ line-height: 1.45;
1325
+ display: -webkit-box;
1326
+ -webkit-line-clamp: 3;
1327
+ -webkit-box-orient: vertical;
1328
+ overflow: hidden;
1329
+ word-break: break-word;
1330
+ }
1331
+ .rs-comment.resolved .rs-comment-text {
1332
+ color: var(--u-fg-2);
1333
+ text-decoration: line-through;
1334
+ text-decoration-color: rgba(255,255,255,0.25);
1335
+ }
1336
+ .rs-comment-foot {
1337
+ display: flex;
1338
+ align-items: center;
1339
+ gap: var(--u-s-1);
1340
+ font-size: 10px;
1341
+ }
1342
+ .rs-comment-foot code {
1343
+ font-family: var(--u-font-mono);
1344
+ font-size: 10px;
1345
+ background: var(--u-bg-3);
1346
+ color: var(--u-fg-2);
1347
+ padding: 1px 5px;
1348
+ border-radius: var(--u-r-xs);
1349
+ overflow: hidden;
1350
+ text-overflow: ellipsis;
1351
+ white-space: nowrap;
1352
+ flex: 1;
1353
+ min-width: 0;
1354
+ }
1355
+ .rs-comment-actions {
1356
+ display: flex;
1357
+ gap: 4px;
1358
+ flex: none;
1359
+ }
1360
+ .rs-act {
1361
+ background: transparent;
1362
+ border: 1px solid var(--u-border);
1363
+ color: var(--u-fg-2);
1364
+ border-radius: var(--u-r-xs);
1365
+ padding: 1px 6px;
1366
+ font-family: var(--u-font-mono);
1367
+ font-size: 10px;
1368
+ cursor: pointer;
1369
+ line-height: 1.4;
1370
+ }
1371
+ .rs-act:hover {
1372
+ background: var(--u-bg-3);
1373
+ color: var(--u-fg-0);
1374
+ }
1375
+ .rs-act.danger:hover {
1376
+ background: var(--u-status-error);
1377
+ color: #fff;
1378
+ border-color: var(--u-status-error);
1379
+ }
1380
+
1381
+ /* Header — comments toggle button */
1382
+ .actions .rs-toggle {
1383
+ position: relative;
1384
+ }
1385
+ .actions .rs-toggle.active {
1386
+ background: var(--u-accent-bg);
1387
+ color: var(--u-accent);
1388
+ border-color: var(--u-accent-line);
1389
+ }
1390
+ .actions .rs-toggle .rs-badge {
1391
+ position: absolute;
1392
+ top: -4px;
1393
+ right: -4px;
1394
+ background: #facc15;
1395
+ color: #1c1917;
1396
+ border-radius: var(--u-r-pill);
1397
+ padding: 0 5px;
1398
+ font-family: var(--u-font-mono);
1399
+ font-size: 9px;
1400
+ font-weight: 700;
1401
+ line-height: 1.4;
1402
+ }
1403
+
1404
+ /* Status bar — add comment button */
1405
+ .add-comment {
1406
+ background: transparent;
1407
+ color: var(--u-accent);
1408
+ border: 1px solid var(--u-accent-line);
1409
+ border-radius: var(--u-r-xs);
1410
+ padding: 1px 8px;
1411
+ font-family: var(--u-font-mono);
1412
+ font-size: 10px;
1413
+ line-height: 1.4;
1414
+ cursor: pointer;
1415
+ }
1416
+ .add-comment:hover {
1417
+ background: var(--u-accent-bg);
1418
+ color: var(--u-accent);
1419
+ }