@1agh/maude 0.28.1 → 0.29.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 (339) hide show
  1. package/README.md +2 -2
  2. package/{plugins/design/dev-server → apps/studio}/ai-banner.tsx +1 -1
  3. package/{plugins/design/dev-server → apps/studio}/annotations-context-toolbar.tsx +285 -5
  4. package/{plugins/design/dev-server → apps/studio}/annotations-layer.tsx +1206 -119
  5. package/{plugins/design/dev-server → apps/studio}/api.ts +486 -32
  6. package/{plugins/design/dev-server → apps/studio}/artboard-activity-overlay.tsx +1 -1
  7. package/{plugins/design/dev-server → apps/studio}/artboard-marquee.tsx +1 -1
  8. package/apps/studio/bin/_motion-sample-playwright.mjs +129 -0
  9. package/{plugins/design/dev-server → apps/studio}/bin/canvas-edit.sh +1 -1
  10. package/{plugins/design/dev-server → apps/studio}/bin/draw-proof.sh +37 -2
  11. package/{plugins/design/dev-server → apps/studio}/bin/preflight.sh +1 -1
  12. package/apps/studio/bin/read-annotations.mjs +438 -0
  13. package/apps/studio/bin/read-annotations.sh +11 -0
  14. package/{plugins/design/dev-server → apps/studio}/bin/runtime-health.sh +1 -1
  15. package/{plugins/design/dev-server → apps/studio}/bin/screenshot.sh +62 -2
  16. package/{plugins/design/dev-server → apps/studio}/bin/server-up.sh +9 -3
  17. package/apps/studio/bin/to-lottie-verify.html +68 -0
  18. package/apps/studio/bin/to-lottie.sh +128 -0
  19. package/{plugins/design/dev-server → apps/studio}/build.ts +5 -3
  20. package/{plugins/design/dev-server → apps/studio}/canvas-arrowheads.ts +1 -1
  21. package/{plugins/design/dev-server → apps/studio}/canvas-comment-mount.tsx +1 -1
  22. package/apps/studio/canvas-create.ts +104 -0
  23. package/{plugins/design/dev-server → apps/studio}/canvas-cursors.ts +46 -12
  24. package/{plugins/design/dev-server → apps/studio}/canvas-icons.tsx +60 -1
  25. package/{plugins/design/dev-server → apps/studio}/canvas-lib-inline.ts +1 -1
  26. package/{plugins/design/dev-server → apps/studio}/canvas-lib-resolver.ts +1 -1
  27. package/{plugins/design/dev-server → apps/studio}/canvas-lib.tsx +31 -12
  28. package/{plugins/design/dev-server → apps/studio}/canvas-shell.tsx +56 -41
  29. package/{plugins/design/dev-server → apps/studio}/client/app.jsx +1713 -530
  30. package/apps/studio/client/canvas-url.js +81 -0
  31. package/{plugins/design/dev-server → apps/studio}/client/comments-overlay.css +41 -27
  32. package/{plugins/design/dev-server → apps/studio}/client/index.html +2 -1
  33. package/apps/studio/client/styles/1-tokens-maude.css +296 -0
  34. package/apps/studio/client/styles/3-shell-maude.css +459 -0
  35. package/{plugins/design/dev-server → apps/studio}/client/styles/3-shell.css +129 -0
  36. package/apps/studio/client/styles/4-components-maude.css +74 -0
  37. package/{plugins/design/dev-server → apps/studio}/client/styles/4-components.css +357 -34
  38. package/apps/studio/client/styles/5-maude-overrides.css +123 -0
  39. package/{plugins/design/dev-server → apps/studio}/client/styles/_index.css +9 -0
  40. package/{plugins/design/dev-server → apps/studio}/client/styles.css +1 -1
  41. package/apps/studio/client/tour/overlay.jsx +191 -0
  42. package/apps/studio/client/tour/usage-tour.js +35 -0
  43. package/apps/studio/client/whats-new-seen.js +52 -0
  44. package/apps/studio/client/whats-new.jsx +250 -0
  45. package/{plugins/design/dev-server → apps/studio}/commands/annotation-strokes-command.ts +1 -1
  46. package/{plugins/design/dev-server → apps/studio}/commands/equal-spacing-command.ts +1 -1
  47. package/{plugins/design/dev-server → apps/studio}/commands/move-artboards-command.ts +1 -1
  48. package/{plugins/design/dev-server → apps/studio}/comments-overlay.tsx +25 -6
  49. package/{plugins/design/dev-server → apps/studio}/context-menu.tsx +1 -1
  50. package/{plugins/design/dev-server → apps/studio}/contextual-toolbar.tsx +4 -7
  51. package/{plugins/design/dev-server → apps/studio}/cursors-overlay.tsx +1 -1
  52. package/apps/studio/dist/client.bundle.js +22825 -0
  53. package/apps/studio/dist/comment-mount.js +1960 -0
  54. package/apps/studio/dist/styles.css +5695 -0
  55. package/{plugins/design/dev-server → apps/studio}/dom-selection.ts +75 -4
  56. package/apps/studio/draw/animate.ts +333 -0
  57. package/{plugins/design/dev-server → apps/studio}/draw/brush.ts +1 -1
  58. package/{plugins/design/dev-server → apps/studio}/draw/composition.ts +1 -1
  59. package/{plugins/design/dev-server → apps/studio}/draw/geometry.ts +1 -1
  60. package/{plugins/design/dev-server → apps/studio}/draw/index.ts +4 -1
  61. package/{plugins/design/dev-server → apps/studio}/draw/layout.ts +1 -1
  62. package/apps/studio/draw/morph.ts +204 -0
  63. package/{plugins/design/dev-server → apps/studio}/draw/optimize.ts +1 -1
  64. package/{plugins/design/dev-server → apps/studio}/draw/palette.ts +1 -1
  65. package/{plugins/design/dev-server → apps/studio}/draw/primitives.ts +1 -1
  66. package/apps/studio/draw/serialize-animate.ts +324 -0
  67. package/{plugins/design/dev-server → apps/studio}/draw/serialize.ts +9 -3
  68. package/apps/studio/draw/test/animate.test.ts +172 -0
  69. package/apps/studio/draw/test/morph.test.ts +107 -0
  70. package/apps/studio/draw/test/serialize-animate.test.ts +142 -0
  71. package/{plugins/design/dev-server → apps/studio}/equal-spacing-detector.ts +1 -1
  72. package/{plugins/design/dev-server → apps/studio}/equal-spacing-handles.tsx +7 -29
  73. package/{plugins/design/dev-server → apps/studio}/export-dialog.tsx +13 -1
  74. package/{plugins/design/dev-server → apps/studio}/http.ts +102 -1
  75. package/{plugins/design/dev-server → apps/studio}/input-router.tsx +8 -1
  76. package/{plugins/design/dev-server → apps/studio}/inspect.ts +20 -3
  77. package/{plugins/design/dev-server → apps/studio}/marquee-overlay.tsx +5 -2
  78. package/{plugins/design/dev-server → apps/studio}/participants-chrome.tsx +1 -1
  79. package/{plugins/design/dev-server → apps/studio}/paths.ts +15 -11
  80. package/{plugins/design/dev-server → apps/studio}/server.ts +18 -0
  81. package/{plugins/design/dev-server → apps/studio}/sync/index.ts +1 -1
  82. package/{plugins/design/dev-server → apps/studio}/test/annotations-layer.test.ts +63 -0
  83. package/{plugins/design/dev-server → apps/studio}/test/annotations-roundtrip.test.ts +97 -0
  84. package/apps/studio/test/annotations-text-format.test.ts +396 -0
  85. package/apps/studio/test/asset-api.test.ts +149 -0
  86. package/apps/studio/test/canvas-create-api.test.ts +361 -0
  87. package/{plugins/design/dev-server → apps/studio}/test/canvas-cursors.test.ts +2 -0
  88. package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-resolver.test.ts +1 -1
  89. package/apps/studio/test/canvas-media-drop.test.ts +158 -0
  90. package/{plugins/design/dev-server → apps/studio}/test/canvas-origin-gate.test.ts +17 -1
  91. package/apps/studio/test/canvas-url.test.ts +99 -0
  92. package/apps/studio/test/index-data-canvas-ds.test.ts +97 -0
  93. package/apps/studio/test/motion-sample.test.ts +35 -0
  94. package/{plugins/design/dev-server → apps/studio}/test/perf-harness.ts +1 -1
  95. package/{plugins/design/dev-server → apps/studio}/test/phase-3.6-smoke.test.ts +3 -1
  96. package/apps/studio/test/read-annotations.test.ts +409 -0
  97. package/{plugins/design/dev-server → apps/studio}/test/sanitize-annotation-svg.test.ts +108 -2
  98. package/{plugins/design/dev-server → apps/studio}/test/shared-doc-convergence.test.ts +1 -1
  99. package/apps/studio/test/tour-overlay.test.tsx +56 -0
  100. package/{plugins/design/dev-server → apps/studio}/test/use-annotation-resize.test.ts +43 -0
  101. package/{plugins/design/dev-server → apps/studio}/test/use-tool-mode.test.tsx +4 -1
  102. package/apps/studio/test/whats-new.test.ts +101 -0
  103. package/apps/studio/text-imports.d.ts +9 -0
  104. package/{plugins/design/dev-server → apps/studio}/tool-palette.tsx +4 -69
  105. package/{plugins/design/dev-server → apps/studio}/undo-hud.tsx +1 -1
  106. package/{plugins/design/dev-server → apps/studio}/undo-stack.ts +1 -1
  107. package/{plugins/design/dev-server → apps/studio}/use-agent-presence.tsx +1 -1
  108. package/{plugins/design/dev-server → apps/studio}/use-annotation-resize.tsx +40 -7
  109. package/{plugins/design/dev-server → apps/studio}/use-annotation-selection.tsx +1 -1
  110. package/{plugins/design/dev-server → apps/studio}/use-annotations-visibility.tsx +1 -1
  111. package/{plugins/design/dev-server → apps/studio}/use-artboard-drag.tsx +1 -1
  112. package/{plugins/design/dev-server → apps/studio}/use-canvas-activity.tsx +1 -1
  113. package/apps/studio/use-canvas-media-drop.tsx +343 -0
  114. package/{plugins/design/dev-server → apps/studio}/use-collab.tsx +1 -1
  115. package/{plugins/design/dev-server → apps/studio}/use-cursor-modifiers.tsx +1 -1
  116. package/{plugins/design/dev-server → apps/studio}/use-keyboard-discipline.tsx +5 -2
  117. package/{plugins/design/dev-server → apps/studio}/use-selection-set.tsx +9 -1
  118. package/{plugins/design/dev-server → apps/studio}/use-snap-guides.tsx +1 -1
  119. package/{plugins/design/dev-server → apps/studio}/use-tool-mode.tsx +3 -1
  120. package/{plugins/design/dev-server → apps/studio}/use-undo-stack.tsx +1 -1
  121. package/apps/studio/whats-new.json +139 -0
  122. package/apps/studio/whats-new.schema.json +70 -0
  123. package/apps/studio/whats-new.ts +87 -0
  124. package/cli/bin/maude.mjs +10 -0
  125. package/cli/commands/design.mjs +15 -7
  126. package/cli/commands/design.test.mjs +36 -0
  127. package/cli/commands/help.mjs +8 -2
  128. package/cli/commands/hub.mjs +3 -3
  129. package/cli/commands/hub.test.mjs +1 -1
  130. package/cli/commands/scenario-report.mjs +2 -9
  131. package/cli/lib/flow-design-integration.test.mjs +1 -1
  132. package/cli/lib/gitignore-block.mjs +1 -0
  133. package/cli/lib/plugin-cli-reachability.test.mjs +8 -7
  134. package/cli/lib/preflight.mjs +1 -1
  135. package/package.json +15 -15
  136. package/plugins/design/templates/brief-board.tsx.template +61 -0
  137. package/plugins/design/templates/canvas.tsx.template +1 -1
  138. package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +1 -1
  139. package/plugins/design/templates/design-system-inspiration/core/preview/_motion-readme.md.tpl +1 -1
  140. package/plugins/flow/.claude-plugin/config.schema.json +16 -0
  141. package/plugins/design/dev-server/dist/client.bundle.js +0 -20692
  142. package/plugins/design/dev-server/dist/comment-mount.js +0 -1924
  143. package/plugins/design/dev-server/dist/styles.css +0 -2710
  144. /package/{plugins/design/dev-server → apps/studio}/activity.ts +0 -0
  145. /package/{plugins/design/dev-server → apps/studio}/bin/_enumerate-artboards-playwright.mjs +0 -0
  146. /package/{plugins/design/dev-server → apps/studio}/bin/_html-playwright.mjs +0 -0
  147. /package/{plugins/design/dev-server → apps/studio}/bin/_pdf-playwright.mjs +0 -0
  148. /package/{plugins/design/dev-server → apps/studio}/bin/_png-playwright.mjs +0 -0
  149. /package/{plugins/design/dev-server → apps/studio}/bin/_pptx-playwright.mjs +0 -0
  150. /package/{plugins/design/dev-server → apps/studio}/bin/_pw-launch.mjs +0 -0
  151. /package/{plugins/design/dev-server → apps/studio}/bin/_screenshot-playwright.mjs +0 -0
  152. /package/{plugins/design/dev-server → apps/studio}/bin/_svg-optimize.mjs +0 -0
  153. /package/{plugins/design/dev-server → apps/studio}/bin/_svg-playwright.mjs +0 -0
  154. /package/{plugins/design/dev-server → apps/studio}/bin/asset-sweep.sh +0 -0
  155. /package/{plugins/design/dev-server → apps/studio}/bin/bootstrap-check.sh +0 -0
  156. /package/{plugins/design/dev-server → apps/studio}/bin/check-runtime-bundles.sh +0 -0
  157. /package/{plugins/design/dev-server → apps/studio}/bin/draw-build.sh +0 -0
  158. /package/{plugins/design/dev-server → apps/studio}/bin/handoff.sh +0 -0
  159. /package/{plugins/design/dev-server → apps/studio}/bin/prep.sh +0 -0
  160. /package/{plugins/design/dev-server → apps/studio}/bin/scenario-report.mjs +0 -0
  161. /package/{plugins/design/dev-server → apps/studio}/bin/slug.sh +0 -0
  162. /package/{plugins/design/dev-server → apps/studio}/bin/smoke.sh +0 -0
  163. /package/{plugins/design/dev-server → apps/studio}/bin/svg-optimize.sh +0 -0
  164. /package/{plugins/design/dev-server → apps/studio}/bin/visual-sanity.sh +0 -0
  165. /package/{plugins/design/dev-server → apps/studio}/boot-self-heal.ts +0 -0
  166. /package/{plugins/design/dev-server → apps/studio}/canvas-build.ts +0 -0
  167. /package/{plugins/design/dev-server → apps/studio}/canvas-edit.ts +0 -0
  168. /package/{plugins/design/dev-server → apps/studio}/canvas-header.ts +0 -0
  169. /package/{plugins/design/dev-server → apps/studio}/canvas-meta.schema.json +0 -0
  170. /package/{plugins/design/dev-server → apps/studio}/canvas-pipeline.ts +0 -0
  171. /package/{plugins/design/dev-server → apps/studio}/client/hmr.mjs +0 -0
  172. /package/{plugins/design/dev-server → apps/studio}/client/iframe-lazy.mjs +0 -0
  173. /package/{plugins/design/dev-server → apps/studio}/client/styles/0-reset.css +0 -0
  174. /package/{plugins/design/dev-server → apps/studio}/client/styles/1-tokens.css +0 -0
  175. /package/{plugins/design/dev-server → apps/studio}/client/styles/2-layout.css +0 -0
  176. /package/{plugins/design/dev-server → apps/studio}/client/styles/5-utilities.css +0 -0
  177. /package/{plugins/design/dev-server → apps/studio}/collab/ai-activity.ts +0 -0
  178. /package/{plugins/design/dev-server → apps/studio}/collab/awareness-bridge.ts +0 -0
  179. /package/{plugins/design/dev-server → apps/studio}/collab/git-lifecycle.ts +0 -0
  180. /package/{plugins/design/dev-server → apps/studio}/collab/index.ts +0 -0
  181. /package/{plugins/design/dev-server → apps/studio}/collab/persistence.ts +0 -0
  182. /package/{plugins/design/dev-server → apps/studio}/collab/protocol.ts +0 -0
  183. /package/{plugins/design/dev-server → apps/studio}/collab/registry.ts +0 -0
  184. /package/{plugins/design/dev-server → apps/studio}/collab/room.ts +0 -0
  185. /package/{plugins/design/dev-server → apps/studio}/config.schema.json +0 -0
  186. /package/{plugins/design/dev-server → apps/studio}/context.ts +0 -0
  187. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/.min-sizes.json +0 -0
  188. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/lib0_decoding.js +0 -0
  189. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/lib0_encoding.js +0 -0
  190. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/motion.js +0 -0
  191. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/motion_react.js +0 -0
  192. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/pixi-js.js +0 -0
  193. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react-dom.js +0 -0
  194. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react-dom_client.js +0 -0
  195. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react.js +0 -0
  196. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react_jsx-dev-runtime.js +0 -0
  197. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react_jsx-runtime.js +0 -0
  198. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/y-protocols_awareness.js +0 -0
  199. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/y-protocols_sync.js +0 -0
  200. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/yjs.js +0 -0
  201. /package/{plugins/design/dev-server → apps/studio}/draw/test/brush.test.ts +0 -0
  202. /package/{plugins/design/dev-server → apps/studio}/draw/test/composition.test.ts +0 -0
  203. /package/{plugins/design/dev-server → apps/studio}/draw/test/geometry.test.ts +0 -0
  204. /package/{plugins/design/dev-server → apps/studio}/draw/test/gradient.test.ts +0 -0
  205. /package/{plugins/design/dev-server → apps/studio}/draw/test/layout.test.ts +0 -0
  206. /package/{plugins/design/dev-server → apps/studio}/draw/test/optimize.test.ts +0 -0
  207. /package/{plugins/design/dev-server → apps/studio}/draw/test/palette.test.ts +0 -0
  208. /package/{plugins/design/dev-server → apps/studio}/draw/test/primitives.test.ts +0 -0
  209. /package/{plugins/design/dev-server → apps/studio}/draw/test/serialize.test.ts +0 -0
  210. /package/{plugins/design/dev-server → apps/studio}/examples/README.md +0 -0
  211. /package/{plugins/design/dev-server → apps/studio}/examples/perf-100-artboards.tsx +0 -0
  212. /package/{plugins/design/dev-server → apps/studio}/exporters/_browser-bundles.ts +0 -0
  213. /package/{plugins/design/dev-server → apps/studio}/exporters/canva-handoff-prompt.ts +0 -0
  214. /package/{plugins/design/dev-server → apps/studio}/exporters/canva.ts +0 -0
  215. /package/{plugins/design/dev-server → apps/studio}/exporters/html.ts +0 -0
  216. /package/{plugins/design/dev-server → apps/studio}/exporters/index.ts +0 -0
  217. /package/{plugins/design/dev-server → apps/studio}/exporters/pdf.ts +0 -0
  218. /package/{plugins/design/dev-server → apps/studio}/exporters/png.ts +0 -0
  219. /package/{plugins/design/dev-server → apps/studio}/exporters/pptx.ts +0 -0
  220. /package/{plugins/design/dev-server → apps/studio}/exporters/scope.ts +0 -0
  221. /package/{plugins/design/dev-server → apps/studio}/exporters/svg.ts +0 -0
  222. /package/{plugins/design/dev-server → apps/studio}/exporters/zip.ts +0 -0
  223. /package/{plugins/design/dev-server → apps/studio}/fs-watch.ts +0 -0
  224. /package/{plugins/design/dev-server → apps/studio}/handoff.ts +0 -0
  225. /package/{plugins/design/dev-server → apps/studio}/history.ts +0 -0
  226. /package/{plugins/design/dev-server → apps/studio}/hmr-broadcast.ts +0 -0
  227. /package/{plugins/design/dev-server → apps/studio}/locator.ts +0 -0
  228. /package/{plugins/design/dev-server → apps/studio}/mem.ts +0 -0
  229. /package/{plugins/design/dev-server → apps/studio}/runtime-bundle.ts +0 -0
  230. /package/{plugins/design/dev-server → apps/studio}/server.mjs +0 -0
  231. /package/{plugins/design/dev-server → apps/studio}/sync/agent.ts +0 -0
  232. /package/{plugins/design/dev-server → apps/studio}/sync/atomic-write.ts +0 -0
  233. /package/{plugins/design/dev-server → apps/studio}/sync/codec.ts +0 -0
  234. /package/{plugins/design/dev-server → apps/studio}/sync/connection-state.ts +0 -0
  235. /package/{plugins/design/dev-server → apps/studio}/sync/echo-guard.ts +0 -0
  236. /package/{plugins/design/dev-server → apps/studio}/sync/fs-mirror.ts +0 -0
  237. /package/{plugins/design/dev-server → apps/studio}/sync/hubs-config.ts +0 -0
  238. /package/{plugins/design/dev-server → apps/studio}/sync/materialize.ts +0 -0
  239. /package/{plugins/design/dev-server → apps/studio}/sync/migrate-seed.ts +0 -0
  240. /package/{plugins/design/dev-server → apps/studio}/sync/origins.ts +0 -0
  241. /package/{plugins/design/dev-server → apps/studio}/sync/projection.ts +0 -0
  242. /package/{plugins/design/dev-server → apps/studio}/sync/status.ts +0 -0
  243. /package/{plugins/design/dev-server → apps/studio}/sync/untrusted.ts +0 -0
  244. /package/{plugins/design/dev-server → apps/studio}/test/_helpers.ts +0 -0
  245. /package/{plugins/design/dev-server → apps/studio}/test/active-state.test.ts +0 -0
  246. /package/{plugins/design/dev-server → apps/studio}/test/activity.test.ts +0 -0
  247. /package/{plugins/design/dev-server → apps/studio}/test/ai-activity.test.ts +0 -0
  248. /package/{plugins/design/dev-server → apps/studio}/test/annotation-strokes-command.test.ts +0 -0
  249. /package/{plugins/design/dev-server → apps/studio}/test/annotations-api.test.ts +0 -0
  250. /package/{plugins/design/dev-server → apps/studio}/test/annotations-draw-modifiers.test.ts +0 -0
  251. /package/{plugins/design/dev-server → apps/studio}/test/artboard-activity-overlay.test.tsx +0 -0
  252. /package/{plugins/design/dev-server → apps/studio}/test/binary-smoke.test.ts +0 -0
  253. /package/{plugins/design/dev-server → apps/studio}/test/boot-self-heal.test.ts +0 -0
  254. /package/{plugins/design/dev-server → apps/studio}/test/bundle-smoke.test.ts +0 -0
  255. /package/{plugins/design/dev-server → apps/studio}/test/canvas-build.test.ts +0 -0
  256. /package/{plugins/design/dev-server → apps/studio}/test/canvas-edit.test.ts +0 -0
  257. /package/{plugins/design/dev-server → apps/studio}/test/canvas-header.test.ts +0 -0
  258. /package/{plugins/design/dev-server → apps/studio}/test/canvas-hmr-runtime.test.tsx +0 -0
  259. /package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-inline.test.ts +0 -0
  260. /package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-motion.test.ts +0 -0
  261. /package/{plugins/design/dev-server → apps/studio}/test/canvas-meta-api.test.ts +0 -0
  262. /package/{plugins/design/dev-server → apps/studio}/test/canvas-pipeline.test.ts +0 -0
  263. /package/{plugins/design/dev-server → apps/studio}/test/canvas-route.test.ts +0 -0
  264. /package/{plugins/design/dev-server → apps/studio}/test/collab-annotations-bridge.test.ts +0 -0
  265. /package/{plugins/design/dev-server → apps/studio}/test/collab-awareness-bridge.test.ts +0 -0
  266. /package/{plugins/design/dev-server → apps/studio}/test/collab-bridge.test.ts +0 -0
  267. /package/{plugins/design/dev-server → apps/studio}/test/collab-loopback.test.ts +0 -0
  268. /package/{plugins/design/dev-server → apps/studio}/test/collab-protocol.test.ts +0 -0
  269. /package/{plugins/design/dev-server → apps/studio}/test/collab-reseed-guard.test.ts +0 -0
  270. /package/{plugins/design/dev-server → apps/studio}/test/collab-room.test.ts +0 -0
  271. /package/{plugins/design/dev-server → apps/studio}/test/collab-stress.test.ts +0 -0
  272. /package/{plugins/design/dev-server → apps/studio}/test/comment-mount.test.ts +0 -0
  273. /package/{plugins/design/dev-server → apps/studio}/test/comments-api.test.ts +0 -0
  274. /package/{plugins/design/dev-server → apps/studio}/test/compile-entry.test.ts +0 -0
  275. /package/{plugins/design/dev-server → apps/studio}/test/context-resolve-tokens.test.ts +0 -0
  276. /package/{plugins/design/dev-server → apps/studio}/test/csp-canvas-shell.test.ts +0 -0
  277. /package/{plugins/design/dev-server → apps/studio}/test/equal-spacing-detector.test.ts +0 -0
  278. /package/{plugins/design/dev-server → apps/studio}/test/exporters/canva.test.ts +0 -0
  279. /package/{plugins/design/dev-server → apps/studio}/test/exporters/endpoint.test.ts +0 -0
  280. /package/{plugins/design/dev-server → apps/studio}/test/exporters/history.test.ts +0 -0
  281. /package/{plugins/design/dev-server → apps/studio}/test/exporters/html.test.ts +0 -0
  282. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pdf.test.ts +0 -0
  283. /package/{plugins/design/dev-server → apps/studio}/test/exporters/png.test.ts +0 -0
  284. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pptx-deck.test.ts +0 -0
  285. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pptx.test.ts +0 -0
  286. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pw-launch.test.ts +0 -0
  287. /package/{plugins/design/dev-server → apps/studio}/test/exporters/scope.test.ts +0 -0
  288. /package/{plugins/design/dev-server → apps/studio}/test/exporters/svg.test.ts +0 -0
  289. /package/{plugins/design/dev-server → apps/studio}/test/exporters/zip.test.ts +0 -0
  290. /package/{plugins/design/dev-server → apps/studio}/test/fixtures/phase-20-annotations.svg +0 -0
  291. /package/{plugins/design/dev-server → apps/studio}/test/fixtures/phase-21-annotations.svg +0 -0
  292. /package/{plugins/design/dev-server → apps/studio}/test/fs-watch.test.ts +0 -0
  293. /package/{plugins/design/dev-server → apps/studio}/test/git-lifecycle.test.ts +0 -0
  294. /package/{plugins/design/dev-server → apps/studio}/test/handoff-static-frames.test.ts +0 -0
  295. /package/{plugins/design/dev-server → apps/studio}/test/handoff.test.ts +0 -0
  296. /package/{plugins/design/dev-server → apps/studio}/test/history-rollback.test.ts +0 -0
  297. /package/{plugins/design/dev-server → apps/studio}/test/hmr-broadcast.test.ts +0 -0
  298. /package/{plugins/design/dev-server → apps/studio}/test/hmr-classify.test.ts +0 -0
  299. /package/{plugins/design/dev-server → apps/studio}/test/input-router.test.ts +0 -0
  300. /package/{plugins/design/dev-server → apps/studio}/test/locator.test.ts +0 -0
  301. /package/{plugins/design/dev-server → apps/studio}/test/marquee-overlay.test.ts +0 -0
  302. /package/{plugins/design/dev-server → apps/studio}/test/move-artboards-command.test.ts +0 -0
  303. /package/{plugins/design/dev-server → apps/studio}/test/participants-chrome.test.ts +0 -0
  304. /package/{plugins/design/dev-server → apps/studio}/test/paths.test.ts +0 -0
  305. /package/{plugins/design/dev-server → apps/studio}/test/runtime-bundle-error-mapping.test.ts +0 -0
  306. /package/{plugins/design/dev-server → apps/studio}/test/runtime-bundle.test.ts +0 -0
  307. /package/{plugins/design/dev-server → apps/studio}/test/server-lifecycle.test.ts +0 -0
  308. /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-foundation.test.ts +0 -0
  309. /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-migrate.test.ts +0 -0
  310. /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-projection.test.ts +0 -0
  311. /package/{plugins/design/dev-server → apps/studio}/test/snap-distance-pill.test.ts +0 -0
  312. /package/{plugins/design/dev-server → apps/studio}/test/sync-agent.test.ts +0 -0
  313. /package/{plugins/design/dev-server → apps/studio}/test/sync-atomic-write.test.ts +0 -0
  314. /package/{plugins/design/dev-server → apps/studio}/test/sync-codec.test.ts +0 -0
  315. /package/{plugins/design/dev-server → apps/studio}/test/sync-connection-state.test.ts +0 -0
  316. /package/{plugins/design/dev-server → apps/studio}/test/sync-echo-guard.test.ts +0 -0
  317. /package/{plugins/design/dev-server → apps/studio}/test/sync-fs-mirror.test.ts +0 -0
  318. /package/{plugins/design/dev-server → apps/studio}/test/sync-hardening.test.ts +0 -0
  319. /package/{plugins/design/dev-server → apps/studio}/test/sync-hubs-config.test.ts +0 -0
  320. /package/{plugins/design/dev-server → apps/studio}/test/sync-meta-codec.test.ts +0 -0
  321. /package/{plugins/design/dev-server → apps/studio}/test/sync-runtime.test.ts +0 -0
  322. /package/{plugins/design/dev-server → apps/studio}/test/sync-status.test.ts +0 -0
  323. /package/{plugins/design/dev-server → apps/studio}/test/sync-untrusted.test.ts +0 -0
  324. /package/{plugins/design/dev-server → apps/studio}/test/system-endpoint.test.ts +0 -0
  325. /package/{plugins/design/dev-server → apps/studio}/test/tool-palette.test.tsx +0 -0
  326. /package/{plugins/design/dev-server → apps/studio}/test/undo-stack.test.ts +0 -0
  327. /package/{plugins/design/dev-server → apps/studio}/test/use-agent-presence.test.tsx +0 -0
  328. /package/{plugins/design/dev-server → apps/studio}/test/use-annotation-selection.test.tsx +0 -0
  329. /package/{plugins/design/dev-server → apps/studio}/test/use-artboard-drag.test.ts +0 -0
  330. /package/{plugins/design/dev-server → apps/studio}/test/use-canvas-activity.test.tsx +0 -0
  331. /package/{plugins/design/dev-server → apps/studio}/test/use-collab.test.ts +0 -0
  332. /package/{plugins/design/dev-server → apps/studio}/test/use-cursor-modifiers.test.ts +0 -0
  333. /package/{plugins/design/dev-server → apps/studio}/test/use-keyboard-discipline.test.ts +0 -0
  334. /package/{plugins/design/dev-server → apps/studio}/test/use-selection-set.test.tsx +0 -0
  335. /package/{plugins/design/dev-server → apps/studio}/test/use-snap-guides.test.ts +0 -0
  336. /package/{plugins/design/dev-server → apps/studio}/test/use-undo-stack.test.tsx +0 -0
  337. /package/{plugins/design/dev-server → apps/studio}/test/ws-handshake.test.ts +0 -0
  338. /package/{plugins/design/dev-server → apps/studio}/tsconfig.json +0 -0
  339. /package/{plugins/design/dev-server → apps/studio}/ws.ts +0 -0
@@ -0,0 +1,81 @@
1
+ // Canvas iframe URL builder — pure, dependency-free (URLSearchParams only) so it
2
+ // is unit-testable without booting React or a DOM. `app.jsx` imports both
3
+ // helpers; `test/canvas-url.test.ts` exercises the token-resolution branches.
4
+ //
5
+ // DDR-093 — a UI canvas resolves its tokens/components from its OWN design
6
+ // system (`meta.designSystem`, surfaced by the server as
7
+ // `cfg.canvasDesignSystems[path]`), NOT unconditionally from `designSystems[0]`.
8
+ // Before this, every `ui/*.tsx` authored under a non-default DS loaded the
9
+ // default DS's tokens — whose ladder is scoped to a different `.<rootClass>`
10
+ // subtree — so every `var(--*)` went undefined and the canvas rendered white.
11
+
12
+ export function urlOf(p) {
13
+ return '/' + p.split('/').map(encodeURIComponent).join('/');
14
+ }
15
+
16
+ export function canvasUrl(p, cfg, opts) {
17
+ if (!p.endsWith('.tsx')) return urlOf(p);
18
+ const designRel = (cfg?.designRel || '.design').replace(/^\/+|\/+$/g, '');
19
+ // Path under designRoot.
20
+ let rel = p;
21
+ if (rel.startsWith(designRel + '/')) rel = rel.slice(designRel.length + 1);
22
+ // Pass `rel` to URLSearchParams RAW — it does encoding once. Pre-encoding
23
+ // with encodeURIComponent then handing to URLSearchParams produced
24
+ // `Docs%2520Site.tsx` (the `%` of `%20` got re-encoded as `%25`) and broke
25
+ // every UI canvas with a space in its filename.
26
+ const params = new URLSearchParams();
27
+ params.set('canvas', rel);
28
+ params.set('designRel', designRel);
29
+ // Gallery thumbnails suppress the shell-owned comment layer (`?comments=0`)
30
+ // so previews stay non-interactive; opening the same canvas as a real tab
31
+ // omits the flag and gets comments. See canvas-comment-mount.tsx.
32
+ if (opts?.thumbnail) params.set('comments', '0');
33
+ const ds0 = cfg?.designSystems?.[0];
34
+ // Specimen detection: anything under `system/<ds>/preview/` belongs to that
35
+ // specific DS, so it must render with *that* DS's tokens — not always the
36
+ // first one. In a multi-DS project this is what keeps each design system's
37
+ // preview distinct (beta previews use beta tokens, not alpha's).
38
+ const specMatch = rel.match(/^system\/([^/]+)\/preview\//);
39
+ const specDsEntry = specMatch
40
+ ? cfg?.designSystems?.find(
41
+ (d) => d.path === `system/${specMatch[1]}` || d.path.endsWith(`/${specMatch[1]}`)
42
+ )
43
+ : null;
44
+ // For a UI canvas (NOT a specimen), honor its declared design system. The
45
+ // explicit `opts.ds` wins (the unit-test seam); otherwise the server-surfaced
46
+ // `cfg.canvasDesignSystems[path]` map tells us which DS this canvas authored
47
+ // against. Unknown DS (single-DS / legacy / default-DS canvas) → `ds0`, which
48
+ // keeps the historical behavior byte-for-byte. DDR-093.
49
+ const uiDsName = !specMatch ? (opts?.ds ?? cfg?.canvasDesignSystems?.[p]) : null;
50
+ const uiDsEntry = uiDsName ? cfg?.designSystems?.find((d) => d.name === uiDsName) : null;
51
+ const uiDs = uiDsEntry || ds0;
52
+ // Resolve tokens path. For a specimen, prefer the matching DS's tokensCssRel
53
+ // (fall back to the `system/<ds>/colors_and_type.css` convention). Otherwise
54
+ // prefer the canvas's own design system's tokensCssRel — falling back to ds0
55
+ // then the legacy top-level `cfg.tokensCssRel` (`system/colors_and_type.css`,
56
+ // usually absent post-bootstrap).
57
+ const tokens = specMatch
58
+ ? specDsEntry?.tokensCssRel || `system/${specMatch[1]}/colors_and_type.css`
59
+ : uiDs?.tokensCssRel || cfg?.tokensCssRel;
60
+ if (tokens) params.set('tokens', tokens);
61
+ if (cfg?.componentsCssRel) params.set('components', cfg.componentsCssRel);
62
+ if (specMatch) {
63
+ const dsName = specMatch[1];
64
+ params.set('layout', `system/${dsName}/preview/_layout.css`);
65
+ if (!cfg?.componentsCssRel) {
66
+ params.set('components', `system/${dsName}/preview/_components.css`);
67
+ }
68
+ } else if (uiDs?.path) {
69
+ // UI canvas — load the canvas's own DS `_components.css` so the dc-canvas /
70
+ // dc-section / dc-artboard chrome (and any DS classes the canvas reuses)
71
+ // renders correctly under the same DS as the tokens above.
72
+ if (!cfg?.componentsCssRel) {
73
+ params.set('components', `${uiDs.path}/preview/_components.css`);
74
+ }
75
+ }
76
+ // T2 (9.1-A) — load the iframe from the segregated canvas origin when the
77
+ // server advertises one; fall back to a same-origin relative URL otherwise
78
+ // (older server, tests). The trailing path + query are identical either way.
79
+ const origin = cfg?.canvasOrigin || '';
80
+ return `${origin}/_canvas-shell.html?${params.toString()}`;
81
+ }
@@ -28,12 +28,13 @@
28
28
  height: 24px;
29
29
  padding: 0;
30
30
  margin: 0;
31
- background: var(--accent, #d63b1f);
31
+ background: var(--accent, #6f63ef);
32
32
  color: var(--accent-fg, #faf6ef);
33
- border: 1px solid var(--border-strong, #2a2520);
34
- border-radius: 0;
33
+ border: 1.5px solid var(--bg-0, #14131a);
34
+ border-radius: var(--radius-sm, 5px) var(--radius-sm, 5px) var(--radius-sm, 5px) 2px;
35
+ box-shadow: var(--shadow-md, 0 4px 14px rgba(0,0,0,0.3));
35
36
  font: 600 var(--type-xs, 11px) / 1 var(--font-mono, ui-monospace, monospace);
36
- letter-spacing: var(--tracking-sku, 0.04em);
37
+ letter-spacing: var(--tracking-wide, 0.04em);
37
38
  display: grid;
38
39
  place-items: center;
39
40
  cursor: pointer;
@@ -70,11 +71,11 @@
70
71
  position: absolute;
71
72
  width: 300px;
72
73
  background: var(--bg-1, #faf6ef);
73
- border: var(--rule-thin, 1px solid #2a2520);
74
+ border: 1px solid var(--border-default, #3a352f);
74
75
  border-radius: var(--radius-sm, 2px);
75
76
  padding: var(--space-4, 12px);
76
- box-shadow: none;
77
- font: var(--type-sm, 13px) / var(--lh-sm, 1.45) var(--font-mono, ui-monospace, monospace);
77
+ box-shadow: var(--shadow-md, 0 4px 14px rgba(0,0,0,0.22));
78
+ font: var(--type-sm, 13px) / var(--lh-base, 1.5) var(--font-body, system-ui, sans-serif);
78
79
  color: var(--fg-0, #2a2520);
79
80
  pointer-events: auto;
80
81
  z-index: 4;
@@ -107,8 +108,8 @@
107
108
  resize: vertical;
108
109
  background: var(--bg-0, #ffffff);
109
110
  color: var(--fg-0, #2a2520);
110
- border: var(--rule-thin, 1px solid #2a2520);
111
- border-radius: 0;
111
+ border: 1px solid var(--border-default, #3a352f);
112
+ border-radius: var(--radius-sm, 5px);
112
113
  padding: var(--space-3, 8px);
113
114
  font: inherit;
114
115
  box-sizing: border-box;
@@ -132,8 +133,8 @@
132
133
  letter-spacing: var(--tracking-eyebrow, 0.08em);
133
134
  text-transform: uppercase;
134
135
  padding: var(--space-2, 4px) var(--space-3, 8px);
135
- border: var(--rule-thin, 1px solid #2a2520);
136
- border-radius: 0;
136
+ border: 1px solid var(--border-default, #3a352f);
137
+ border-radius: var(--radius-sm, 5px);
137
138
  cursor: pointer;
138
139
  background: transparent;
139
140
  color: var(--fg-0, #2a2520);
@@ -171,11 +172,11 @@
171
172
  max-height: 60vh;
172
173
  overflow: auto;
173
174
  background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
174
- border: var(--rule-thin, 1px solid #2a2520);
175
+ border: 1px solid var(--border-default, #3a352f);
175
176
  border-radius: var(--radius-sm, 2px);
176
177
  padding: var(--space-4, 12px);
177
- box-shadow: none;
178
- font: var(--type-sm, 13px) / var(--lh-sm, 1.45) var(--font-mono, ui-monospace, monospace);
178
+ box-shadow: var(--shadow-md, 0 4px 14px rgba(0,0,0,0.22));
179
+ font: var(--type-sm, 13px) / var(--lh-base, 1.5) var(--font-body, system-ui, sans-serif);
179
180
  color: var(--fg-0, #2a2520);
180
181
  pointer-events: auto;
181
182
  z-index: 5;
@@ -186,26 +187,39 @@
186
187
  flex-direction: column;
187
188
  gap: var(--space-2, 4px);
188
189
  padding-bottom: var(--space-3, 8px);
189
- border-bottom: var(--rule-thin, 1px solid #2a2520);
190
+ border-bottom: 1px solid var(--border-default, #3a352f);
190
191
  }
191
192
 
192
193
  .cm-thread__head-row {
193
194
  display: flex;
194
- justify-content: space-between;
195
- align-items: baseline;
195
+ justify-content: flex-start;
196
+ align-items: center;
196
197
  gap: var(--space-2, 4px);
197
198
  }
198
199
 
200
+ /* Plan C P18 — pin/sequence badge in the thread popover header. */
201
+ .cm-thread__seq {
202
+ flex: none;
203
+ display: inline-grid;
204
+ place-items: center;
205
+ width: 18px;
206
+ height: 18px;
207
+ border-radius: 4px;
208
+ background: var(--accent, #d63b1f);
209
+ color: var(--accent-fg, #fff);
210
+ font: 600 var(--type-xs, 11px) / 1 var(--font-mono, ui-monospace, monospace);
211
+ }
212
+
199
213
  .cm-thread__close {
200
214
  background: transparent;
201
215
  color: var(--fg-2, #6e6660);
202
- border: var(--rule-thin, 1px solid #2a2520);
203
- border-radius: 0;
216
+ border: 1px solid var(--border-default, #3a352f);
217
+ border-radius: var(--radius-sm, 5px);
204
218
  padding: 0 var(--space-2, 4px);
205
219
  font: 600 var(--type-xs, 11px) / 1.2 var(--font-mono, ui-monospace, monospace);
206
220
  cursor: pointer;
207
221
  align-self: flex-start;
208
- margin-left: var(--space-2, 4px);
222
+ margin-left: auto;
209
223
  transition: background var(--dur-flip, 120ms) var(--ease-out, ease-out);
210
224
  }
211
225
 
@@ -285,7 +299,7 @@
285
299
 
286
300
  .cm-thread__reply-form {
287
301
  padding-top: var(--space-3, 8px);
288
- border-top: var(--rule-thin, 1px solid #2a2520);
302
+ border-top: 1px solid var(--border-default, #3a352f);
289
303
  display: flex;
290
304
  flex-direction: column;
291
305
  gap: var(--space-2, 4px);
@@ -297,8 +311,8 @@
297
311
  resize: vertical;
298
312
  background: var(--bg-0, #ffffff);
299
313
  color: var(--fg-0, #2a2520);
300
- border: var(--rule-thin, 1px solid #2a2520);
301
- border-radius: 0;
314
+ border: 1px solid var(--border-default, #3a352f);
315
+ border-radius: var(--radius-sm, 5px);
302
316
  padding: var(--space-3, 8px);
303
317
  font: inherit;
304
318
  box-sizing: border-box;
@@ -321,7 +335,7 @@
321
335
  gap: var(--space-2, 4px);
322
336
  padding-top: var(--space-3, 8px);
323
337
  margin-top: var(--space-3, 8px);
324
- border-top: var(--rule-thin, 1px solid #2a2520);
338
+ border-top: 1px solid var(--border-default, #3a352f);
325
339
  }
326
340
 
327
341
  .cm-thread__actions .cm-btn--danger {
@@ -338,14 +352,14 @@
338
352
  .cm-mention-popup {
339
353
  position: absolute;
340
354
  background: var(--bg-2, color-mix(in oklab, var(--bg-1, #faf6ef) 80%, var(--fg-0, #2a2520) 6%));
341
- border: var(--rule-thin, 1px solid #2a2520);
342
- border-radius: 0;
355
+ border: 1px solid var(--border-default, #3a352f);
356
+ border-radius: var(--radius-sm, 5px);
343
357
  font: var(--type-xs, 11px) / var(--lh-xs, 1.3) var(--font-mono, ui-monospace, monospace);
344
358
  color: var(--fg-0, #2a2520);
345
359
  max-height: 180px;
346
360
  min-width: 160px;
347
361
  overflow: auto;
348
- box-shadow: none;
362
+ box-shadow: var(--shadow-md, 0 4px 14px rgba(0,0,0,0.22));
349
363
  pointer-events: auto;
350
364
  z-index: 6;
351
365
  list-style: none;
@@ -2,7 +2,8 @@
2
2
  <html data-theme="dark">
3
3
  <head>
4
4
  <meta charset="utf-8">
5
- <title>Design local browser</title>
5
+ <title>maude · studio</title>
6
+ <link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2032%2032'%3E%3Cpath%20d='M7%200H25A7%207%200%200%201%2032%207V32H7A7%207%200%200%201%200%2025V7A7%207%200%200%201%207%200Z'%20fill='%235b62e8'/%3E%3Cpath%20d='M16%205l2.8%208.2L27%2016l-8.2%202.8L16%2027l-2.8-8.2L5%2016l8.2-2.8z'%20fill='%23fff'/%3E%3C/svg%3E">
6
7
  <link rel="preconnect" href="https://fonts.googleapis.com">
7
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
8
9
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap">
@@ -0,0 +1,296 @@
1
+ /* @layer tokens — maude DS token ladder for the studio shell (Plan B).
2
+ *
3
+ * Lifted VERBATIM from `.design/system/maude/colors_and_type.css` (the
4
+ * authoritative maude token file — "Unified Pro Studio", dark-first), with ONE
5
+ * scoping adaptation: the dark block is bound to `.maude[data-theme="dark"]`
6
+ * ONLY — NOT `:root` — so it stays additive alongside the legacy amber-rust
7
+ * shell ladder in `1-tokens.css` while the shell is rewritten slice-by-slice
8
+ * (Plan B Tasks 3–7). The new `.st-*` chrome lives under a `.maude[data-theme]`
9
+ * wrapper; old chrome keeps resolving the `:root` amber tokens until removed.
10
+ *
11
+ * The `.maude[data-theme]` scope (specificity 0,2,0) wins over `:root` for any
12
+ * element inside the wrapper, so the maude ladder drives every `.st-*` rule.
13
+ * Once the last legacy chrome rule is gone (end of Task 6) the amber
14
+ * `1-tokens.css` + `--u-*` bridge can be deleted and these can fold to `:root`.
15
+ *
16
+ * Per CLAUDE.md "Lift, don't reinvent" + DDR-014 (@layer order preserved).
17
+ */
18
+
19
+ @layer tokens {
20
+
21
+ /* ─── DARK — default studio theme ──────────────────────────────────────────── */
22
+ .maude[data-theme="dark"] {
23
+ /* Surfaces (deepest → highest) — cool-neutral ladder, hue 255 */
24
+ --bg-0: oklch(0.165 0.012 255);
25
+ --bg-1: oklch(0.198 0.012 255);
26
+ --bg-2: oklch(0.232 0.013 255);
27
+ --bg-3: oklch(0.270 0.013 252);
28
+ --bg-4: oklch(0.310 0.014 252);
29
+
30
+ /* Borders — crisp 1px hairlines */
31
+ --border-subtle: oklch(0.290 0.012 255);
32
+ --border-default: oklch(0.360 0.013 252);
33
+ --border-strong: oklch(0.450 0.014 250);
34
+
35
+ /* Text */
36
+ --fg-0: oklch(0.955 0.005 250);
37
+ --fg-1: oklch(0.790 0.008 250);
38
+ --fg-2: oklch(0.660 0.010 250);
39
+ --fg-3: oklch(0.500 0.010 250);
40
+
41
+ /* Accent — single confident indigo, hue 268 */
42
+ --accent: oklch(0.680 0.180 268);
43
+ --accent-hover: oklch(0.730 0.170 268);
44
+ --accent-active: oklch(0.630 0.180 268);
45
+ --accent-fg: oklch(0.180 0.030 268);
46
+ --accent-muted: oklch(0.460 0.110 268);
47
+ --accent-tint: color-mix(in oklab, var(--accent) 16%, transparent);
48
+
49
+ /* Status */
50
+ --status-success: oklch(0.760 0.150 162);
51
+ --status-warn: oklch(0.800 0.130 78);
52
+ --status-error: oklch(0.660 0.190 25);
53
+ --status-info: oklch(0.720 0.120 238);
54
+
55
+ /* Presence (collaborators + AI agent) */
56
+ --presence-online: oklch(0.740 0.160 145);
57
+ --presence-away: oklch(0.800 0.130 78);
58
+ --presence-offline: oklch(0.560 0.020 255);
59
+ --presence-agent: oklch(0.700 0.190 322);
60
+
61
+ /* Shadows — subtle on dark */
62
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.40);
63
+ --shadow-md: 0 4px 14px rgba(0, 0, 0, 0.46);
64
+ --shadow-lg: 0 14px 38px rgba(0, 0, 0, 0.56);
65
+
66
+ /* Radii */
67
+ --radius-xs: 3px;
68
+ --radius-sm: 5px;
69
+ --radius-md: 7px;
70
+ --radius-lg: 10px;
71
+ --radius-xl: 14px;
72
+ --radius-pill: 999px;
73
+
74
+ /* Spacing — dense, 4px base */
75
+ --space-0: 0;
76
+ --space-1: 2px;
77
+ --space-2: 4px;
78
+ --space-3: 8px;
79
+ --space-4: 12px;
80
+ --space-5: 16px;
81
+ --space-6: 24px;
82
+ --space-7: 32px;
83
+ --space-8: 48px;
84
+
85
+ /* Typography */
86
+ --font-display: "Inter Tight", "Inter", system-ui, -apple-system, sans-serif;
87
+ --font-body: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
88
+ --font-mono: "JetBrains Mono", "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
89
+
90
+ --type-xs: 11px; --lh-xs: 16px;
91
+ --type-sm: 12px; --lh-sm: 18px;
92
+ --type-base: 14px; --lh-base: 20px;
93
+ --type-md: 16px; --lh-md: 24px;
94
+ --type-lg: 19px; --lh-lg: 26px;
95
+ --type-xl: 23px; --lh-xl: 30px;
96
+ --type-2xl: 28px; --lh-2xl: 34px;
97
+ --type-3xl: 34px; --lh-3xl: 40px;
98
+
99
+ --tracking-tight: -0.014em;
100
+ --tracking-wide: 0.04em;
101
+
102
+ /* Motion — crisp, snappy (Zed-fast) */
103
+ --dur-flip: 140ms;
104
+ --dur-panel: 220ms;
105
+ --dur-route: 280ms;
106
+ --dur-soft: 120ms;
107
+ --ease-out: cubic-bezier(0.2, 0, 0, 1);
108
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
109
+
110
+ /* Canvas (the signature surface — dotted infinite canvas) */
111
+ --canvas-bg: var(--bg-0);
112
+ --canvas-dot: oklch(0.340 0.012 255);
113
+ --canvas-grid: 24px;
114
+
115
+ /* Layout */
116
+ --layout-max-w: none;
117
+ --layout-gutter: var(--space-5);
118
+
119
+ color-scheme: dark;
120
+ }
121
+
122
+ /* ─── LIGHT — equal-status secondary theme (reading / handoff) ──────────────── */
123
+ .maude[data-theme="light"] {
124
+ --bg-0: oklch(0.975 0.004 255);
125
+ --bg-1: oklch(1.000 0 0);
126
+ --bg-2: oklch(0.987 0.003 255);
127
+ --bg-3: oklch(0.955 0.005 255);
128
+ --bg-4: oklch(0.928 0.006 255);
129
+
130
+ --border-subtle: oklch(0.922 0.005 255);
131
+ --border-default: oklch(0.868 0.007 255);
132
+ --border-strong: oklch(0.780 0.009 255);
133
+
134
+ --fg-0: oklch(0.225 0.015 260);
135
+ --fg-1: oklch(0.400 0.014 260);
136
+ --fg-2: oklch(0.510 0.012 260);
137
+ --fg-3: oklch(0.660 0.010 260);
138
+
139
+ --accent: oklch(0.520 0.195 268);
140
+ --accent-hover: oklch(0.470 0.195 268);
141
+ --accent-active: oklch(0.430 0.190 268);
142
+ --accent-fg: oklch(0.995 0.004 268);
143
+ --accent-muted: oklch(0.895 0.050 268);
144
+ --accent-tint: color-mix(in oklab, var(--accent) 12%, transparent);
145
+
146
+ --status-success: oklch(0.560 0.150 162);
147
+ --status-warn: oklch(0.640 0.140 70);
148
+ --status-error: oklch(0.560 0.200 25);
149
+ --status-info: oklch(0.530 0.150 238);
150
+
151
+ --presence-online: oklch(0.560 0.160 145);
152
+ --presence-away: oklch(0.640 0.140 70);
153
+ --presence-offline: oklch(0.700 0.010 255);
154
+ --presence-agent: oklch(0.520 0.190 322);
155
+
156
+ --shadow-sm: 0 1px 2px rgba(18, 20, 30, 0.08);
157
+ --shadow-md: 0 4px 14px rgba(18, 20, 30, 0.10);
158
+ --shadow-lg: 0 14px 38px rgba(18, 20, 30, 0.14);
159
+
160
+ --canvas-bg: oklch(0.965 0.004 255);
161
+ --canvas-dot: oklch(0.860 0.008 255);
162
+
163
+ color-scheme: light;
164
+ }
165
+
166
+ /* ─── Legacy `--u-*` alias bridge, RE-DECLARED under `.maude` ────────────────
167
+ * CRITICAL: the `--u-*` aliases in 1-tokens.css are declared at `:root`, so each
168
+ * `--u-x: var(--y)` is COMPUTED against the amber `:root --y` and then inherits
169
+ * that amber value into `.maude` — the `.maude` redefinition of `--y` does NOT
170
+ * re-trigger the alias. Result: every legacy surface still consuming `--u-*`
171
+ * (SystemView `.sv-*`, HelpModal, tour nudge, what's-new, CommentBar) rendered
172
+ * AMBER even inside `.maude`.
173
+ *
174
+ * Re-declaring the bridge HERE (selector `.maude`, matching the same element that
175
+ * carries `data-theme` + the maude `--bg-*`/`--accent`/… ladder) re-computes each
176
+ * alias against the MAUDE tokens — so all legacy chrome inside the shell turns
177
+ * maude in one shot, without rewriting each legacy component. Theme-agnostic
178
+ * selector: the `var(--accent)` etc. re-resolve per the element's current theme.
179
+ * Remove once the legacy classes are themselves ported to `.st-*`. */
180
+ .maude {
181
+ /* ─── Theme-AGNOSTIC structural tokens ────────────────────────────────────
182
+ * Radii / spacing / type / motion are identical in dark + light. They were
183
+ * originally declared ONLY in the `[data-theme="dark"]` block, so under
184
+ * `[data-theme="light"]` they fell through to the legacy amber `:root`
185
+ * (radius 2px, Berkeley Mono) — the "light mode = square corners + wrong
186
+ * font" bug. Declaring them here (`.maude`, which already wins over `:root`)
187
+ * gives BOTH themes the maude ladder; the dark block's copies are now
188
+ * redundant but harmless. (Plan C follow-up; [[css-var-alias-scope-trap]].) */
189
+ --radius-xs: 3px;
190
+ --radius-sm: 5px;
191
+ --radius-md: 7px;
192
+ --radius-lg: 10px;
193
+ --radius-xl: 14px;
194
+ --radius-pill: 999px;
195
+
196
+ --space-0: 0;
197
+ --space-1: 2px;
198
+ --space-2: 4px;
199
+ --space-3: 8px;
200
+ --space-4: 12px;
201
+ --space-5: 16px;
202
+ --space-6: 24px;
203
+ --space-7: 32px;
204
+ --space-8: 48px;
205
+
206
+ --font-display: "Inter Tight", "Inter", system-ui, -apple-system, sans-serif;
207
+ --font-body: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
208
+ --font-mono: "JetBrains Mono", "Geist Mono", ui-monospace, "SF Mono", Menlo, monospace;
209
+
210
+ --type-xs: 11px; --lh-xs: 16px;
211
+ --type-sm: 12px; --lh-sm: 18px;
212
+ --type-base: 14px; --lh-base: 20px;
213
+ --type-md: 16px; --lh-md: 24px;
214
+ --type-lg: 19px; --lh-lg: 26px;
215
+ --type-xl: 23px; --lh-xl: 30px;
216
+ --type-2xl: 28px; --lh-2xl: 34px;
217
+ --type-3xl: 34px; --lh-3xl: 40px;
218
+
219
+ --tracking-tight: -0.014em;
220
+ --tracking-wide: 0.04em;
221
+
222
+ --dur-flip: 140ms;
223
+ --dur-panel: 220ms;
224
+ --dur-route: 280ms;
225
+ --dur-soft: 120ms;
226
+ --ease-out: cubic-bezier(0.2, 0, 0, 1);
227
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
228
+
229
+ --canvas-grid: 24px;
230
+ --layout-max-w: none;
231
+ --layout-gutter: var(--space-5);
232
+
233
+ --u-bg-0: var(--bg-0);
234
+ --u-bg-1: var(--bg-1);
235
+ --u-bg-2: var(--bg-2);
236
+ --u-bg-3: var(--bg-3);
237
+ --u-bg-4: var(--bg-4);
238
+ --u-bg-hover: var(--bg-3);
239
+ --u-bg-active: var(--bg-4);
240
+ --u-bg-selected: var(--accent-tint);
241
+
242
+ --u-fg-0: var(--fg-0);
243
+ --u-fg-1: var(--fg-1);
244
+ --u-fg-2: var(--fg-2);
245
+ --u-fg-3: var(--fg-3);
246
+
247
+ --u-border: var(--border-default);
248
+ --u-border-subtle: var(--border-subtle);
249
+ --u-border-strong: var(--border-strong);
250
+
251
+ --u-accent: var(--accent);
252
+ --u-accent-bg: var(--accent-tint);
253
+ --u-accent-line: var(--accent-hover);
254
+ --u-accent-strong: var(--accent-active);
255
+ --u-accent-fg: var(--accent-fg);
256
+
257
+ --u-status-success: var(--status-success);
258
+ --u-status-warn: var(--status-warn);
259
+ --u-status-error: var(--status-error);
260
+ --u-status-info: var(--status-info);
261
+ --u-status-live: var(--presence-online);
262
+
263
+ --u-r-xs: var(--radius-xs);
264
+ --u-r-sm: var(--radius-sm);
265
+ --u-r-md: var(--radius-md);
266
+ --u-r-lg: var(--radius-lg);
267
+ --u-r-pill: var(--radius-pill);
268
+
269
+ --u-s-1: var(--space-2);
270
+ --u-s-2: var(--space-3);
271
+ --u-s-3: var(--space-4);
272
+ --u-s-4: var(--space-5);
273
+ --u-s-5: var(--space-6);
274
+
275
+ --u-font-display: var(--font-display);
276
+ --u-font-body: var(--font-body);
277
+ --u-font-sans: var(--font-body);
278
+ --u-font-mono: var(--font-mono);
279
+
280
+ --u-mono-cell-bg: var(--bg-2);
281
+ --u-mono-cell-fg: var(--fg-0);
282
+ --u-mono-rule: var(--border-subtle);
283
+ }
284
+
285
+ /* Reduced-motion: collapse durations everywhere (a11y invariant). */
286
+ @media (prefers-reduced-motion: reduce) {
287
+ .maude[data-theme="dark"],
288
+ .maude[data-theme="light"] {
289
+ --dur-flip: 1ms;
290
+ --dur-panel: 1ms;
291
+ --dur-route: 1ms;
292
+ --dur-soft: 1ms;
293
+ }
294
+ }
295
+
296
+ }