@dfosco/storyboard 0.5.0-alpha.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 (592) hide show
  1. package/commandpalette.config.json +152 -0
  2. package/dist/storyboard-ui.css +1 -0
  3. package/dist/storyboard-ui.js +21328 -0
  4. package/dist/storyboard-ui.js.map +1 -0
  5. package/dist/tailwind.css +2 -0
  6. package/dist/tiny-canvas.css +1 -0
  7. package/dist/tiny-canvas.js +389 -0
  8. package/package.json +121 -0
  9. package/paste.config.json +67 -0
  10. package/scaffold/AGENTS.md +432 -0
  11. package/scaffold/agents/prompt-agent.agent.md +181 -0
  12. package/scaffold/agents/terminal-agent.agent.md +351 -0
  13. package/scaffold/codex/config.toml +246 -0
  14. package/scaffold/deploy.yml +103 -0
  15. package/scaffold/githooks/pre-push +114 -0
  16. package/scaffold/gitignore +64 -0
  17. package/scaffold/manifest.json +56 -0
  18. package/scaffold/preview.yml +181 -0
  19. package/scaffold/scripts/link.sh +26 -0
  20. package/scaffold/scripts/unlink.sh +10 -0
  21. package/scaffold/skills/agent-browser/SKILL.md +260 -0
  22. package/scaffold/skills/canvas/SKILL.md +364 -0
  23. package/scaffold/skills/create/SKILL.md +501 -0
  24. package/scaffold/skills/ship/SKILL.md +237 -0
  25. package/scaffold/skills/storyboard/SKILL.md +360 -0
  26. package/scaffold/skills/update-storyboard/SKILL.md +16 -0
  27. package/scaffold/skills/update-storyboard/update-storyboard-packages.sh +26 -0
  28. package/scaffold/skills/vitest/GENERATION.md +5 -0
  29. package/scaffold/skills/vitest/SKILL.md +52 -0
  30. package/scaffold/skills/vitest/references/advanced-environments.md +264 -0
  31. package/scaffold/skills/vitest/references/advanced-projects.md +300 -0
  32. package/scaffold/skills/vitest/references/advanced-type-testing.md +237 -0
  33. package/scaffold/skills/vitest/references/advanced-vi.md +249 -0
  34. package/scaffold/skills/vitest/references/core-cli.md +166 -0
  35. package/scaffold/skills/vitest/references/core-config.md +174 -0
  36. package/scaffold/skills/vitest/references/core-describe.md +193 -0
  37. package/scaffold/skills/vitest/references/core-expect.md +219 -0
  38. package/scaffold/skills/vitest/references/core-hooks.md +244 -0
  39. package/scaffold/skills/vitest/references/core-test-api.md +233 -0
  40. package/scaffold/skills/vitest/references/features-concurrency.md +250 -0
  41. package/scaffold/skills/vitest/references/features-context.md +238 -0
  42. package/scaffold/skills/vitest/references/features-coverage.md +207 -0
  43. package/scaffold/skills/vitest/references/features-filtering.md +211 -0
  44. package/scaffold/skills/vitest/references/features-mocking.md +265 -0
  45. package/scaffold/skills/vitest/references/features-snapshots.md +207 -0
  46. package/scaffold/skills/worktree/SKILL.md +93 -0
  47. package/scaffold/storyboard.config.json +44 -0
  48. package/src/canvas/Canvas.jsx +78 -0
  49. package/src/canvas/Draggable.jsx +235 -0
  50. package/src/canvas/index.d.ts +41 -0
  51. package/src/canvas/index.js +6 -0
  52. package/src/canvas/style.css +118 -0
  53. package/src/canvas/useResetCanvas.js +17 -0
  54. package/src/canvas/utils.js +136 -0
  55. package/src/core/assets/fonts/IoskeleyMono-Bold.woff2 +0 -0
  56. package/src/core/assets/fonts/IoskeleyMono-Italic.woff2 +0 -0
  57. package/src/core/assets/fonts/IoskeleyMono-Medium.woff2 +0 -0
  58. package/src/core/assets/fonts/IoskeleyMono-Regular.woff2 +0 -0
  59. package/src/core/assets/fonts/IoskeleyMono-SemiBold.woff2 +0 -0
  60. package/src/core/autosync/server.js +714 -0
  61. package/src/core/autosync/server.test.js +158 -0
  62. package/src/core/canvas/__tests__/agent-integration.test.js +596 -0
  63. package/src/core/canvas/__tests__/helpers/browser.js +95 -0
  64. package/src/core/canvas/__tests__/helpers/canvas-api.js +129 -0
  65. package/src/core/canvas/__tests__/helpers/perf.js +118 -0
  66. package/src/core/canvas/__tests__/helpers/setup.js +176 -0
  67. package/src/core/canvas/__tests__/helpers/tmux.js +130 -0
  68. package/src/core/canvas/__tests__/helpers/transcript.js +132 -0
  69. package/src/core/canvas/__tests__/terminal-integration.test.js +177 -0
  70. package/src/core/canvas/collision.js +292 -0
  71. package/src/core/canvas/collision.test.js +371 -0
  72. package/src/core/canvas/compact.js +83 -0
  73. package/src/core/canvas/deriveCanvasId.test.js +40 -0
  74. package/src/core/canvas/githubEmbeds.js +527 -0
  75. package/src/core/canvas/githubEmbeds.test.js +302 -0
  76. package/src/core/canvas/hot-pool.js +766 -0
  77. package/src/core/canvas/identity.js +107 -0
  78. package/src/core/canvas/identity.test.js +100 -0
  79. package/src/core/canvas/materializer.js +259 -0
  80. package/src/core/canvas/materializer.test.js +356 -0
  81. package/src/core/canvas/selectedWidgets.js +270 -0
  82. package/src/core/canvas/selectedWidgets.test.js +321 -0
  83. package/src/core/canvas/server.js +3134 -0
  84. package/src/core/canvas/server.test.js +379 -0
  85. package/src/core/canvas/terminal-config.js +330 -0
  86. package/src/core/canvas/terminal-registry.js +465 -0
  87. package/src/core/canvas/terminal-server.js +1436 -0
  88. package/src/core/canvas/writeGuard.js +53 -0
  89. package/src/core/cli/agent.js +85 -0
  90. package/src/core/cli/branch.js +386 -0
  91. package/src/core/cli/canvasAdd.js +241 -0
  92. package/src/core/cli/canvasBatch.js +98 -0
  93. package/src/core/cli/canvasBounds.js +160 -0
  94. package/src/core/cli/canvasRead.js +236 -0
  95. package/src/core/cli/canvasUpdate.js +179 -0
  96. package/src/core/cli/code.js +67 -0
  97. package/src/core/cli/compact.js +62 -0
  98. package/src/core/cli/create.js +674 -0
  99. package/src/core/cli/dev-helpers.js +53 -0
  100. package/src/core/cli/dev-helpers.test.js +53 -0
  101. package/src/core/cli/dev.js +430 -0
  102. package/src/core/cli/exit.js +38 -0
  103. package/src/core/cli/flags.js +174 -0
  104. package/src/core/cli/flags.test.js +155 -0
  105. package/src/core/cli/index.js +233 -0
  106. package/src/core/cli/intro.js +37 -0
  107. package/src/core/cli/proxy.js +319 -0
  108. package/src/core/cli/proxy.test.js +63 -0
  109. package/src/core/cli/schemas.js +223 -0
  110. package/src/core/cli/server.js +192 -0
  111. package/src/core/cli/serverUrl.js +61 -0
  112. package/src/core/cli/sessions.js +459 -0
  113. package/src/core/cli/setup.js +404 -0
  114. package/src/core/cli/terminal-commands.js +287 -0
  115. package/src/core/cli/terminal-messaging.js +231 -0
  116. package/src/core/cli/terminal-welcome.js +515 -0
  117. package/src/core/cli/updateVersion.js +124 -0
  118. package/src/core/comments/api.js +284 -0
  119. package/src/core/comments/api.test.js +282 -0
  120. package/src/core/comments/auth.js +151 -0
  121. package/src/core/comments/auth.test.js +167 -0
  122. package/src/core/comments/commentCache.js +109 -0
  123. package/src/core/comments/commentCache.test.js +48 -0
  124. package/src/core/comments/commentDrafts.js +68 -0
  125. package/src/core/comments/commentMode.js +63 -0
  126. package/src/core/comments/commentMode.test.js +90 -0
  127. package/src/core/comments/config.js +47 -0
  128. package/src/core/comments/config.test.js +77 -0
  129. package/src/core/comments/graphql.js +65 -0
  130. package/src/core/comments/graphql.test.js +95 -0
  131. package/src/core/comments/index.js +42 -0
  132. package/src/core/comments/metadata.js +52 -0
  133. package/src/core/comments/metadata.test.js +110 -0
  134. package/src/core/comments/queries.js +245 -0
  135. package/src/core/comments/ui/AuthModal.jsx +114 -0
  136. package/src/core/comments/ui/CommentOverlay.js +52 -0
  137. package/src/core/comments/ui/CommentWindow.jsx +329 -0
  138. package/src/core/comments/ui/CommentsDrawer.jsx +102 -0
  139. package/src/core/comments/ui/Composer.jsx +64 -0
  140. package/src/core/comments/ui/authModal.js +66 -0
  141. package/src/core/comments/ui/authModal.test.js +76 -0
  142. package/src/core/comments/ui/comment-cursor-dark.svg +1 -0
  143. package/src/core/comments/ui/comment-cursor.svg +1 -0
  144. package/src/core/comments/ui/comment-layout.css +142 -0
  145. package/src/core/comments/ui/commentWindow.js +121 -0
  146. package/src/core/comments/ui/comments.css +242 -0
  147. package/src/core/comments/ui/commentsDrawer.js +84 -0
  148. package/src/core/comments/ui/composer.js +136 -0
  149. package/src/core/comments/ui/index.js +14 -0
  150. package/src/core/comments/ui/mount.js +687 -0
  151. package/src/core/comments/ui/mount.test.js +336 -0
  152. package/src/core/data/dotPath.js +53 -0
  153. package/src/core/data/dotPath.test.js +114 -0
  154. package/src/core/data/loader.js +409 -0
  155. package/src/core/data/loader.test.js +599 -0
  156. package/src/core/data/viewfinder.js +363 -0
  157. package/src/core/data/viewfinder.test.js +456 -0
  158. package/src/core/devtools/devtools-consumer.js +28 -0
  159. package/src/core/devtools/devtools.js +144 -0
  160. package/src/core/devtools/devtools.test.js +75 -0
  161. package/src/core/devtools/sceneDebug.js +112 -0
  162. package/src/core/devtools/sceneDebug.test.js +141 -0
  163. package/src/core/index.js +124 -0
  164. package/src/core/inspector/fiberWalker.js +239 -0
  165. package/src/core/inspector/highlighter.js +275 -0
  166. package/src/core/inspector/mouseMode.js +259 -0
  167. package/src/core/lib/components/ui/alert/alert-action.jsx +11 -0
  168. package/src/core/lib/components/ui/alert/alert-description.jsx +11 -0
  169. package/src/core/lib/components/ui/alert/alert-title.jsx +11 -0
  170. package/src/core/lib/components/ui/alert/alert.jsx +25 -0
  171. package/src/core/lib/components/ui/alert/index.js +17 -0
  172. package/src/core/lib/components/ui/avatar/avatar-badge.jsx +22 -0
  173. package/src/core/lib/components/ui/avatar/avatar-fallback.jsx +18 -0
  174. package/src/core/lib/components/ui/avatar/avatar-group-count.jsx +19 -0
  175. package/src/core/lib/components/ui/avatar/avatar-group.jsx +19 -0
  176. package/src/core/lib/components/ui/avatar/avatar-image.jsx +15 -0
  177. package/src/core/lib/components/ui/avatar/avatar.jsx +19 -0
  178. package/src/core/lib/components/ui/avatar/index.js +22 -0
  179. package/src/core/lib/components/ui/badge/badge.jsx +31 -0
  180. package/src/core/lib/components/ui/badge/index.js +2 -0
  181. package/src/core/lib/components/ui/button/button.jsx +100 -0
  182. package/src/core/lib/components/ui/button/index.js +12 -0
  183. package/src/core/lib/components/ui/card/card-action.jsx +11 -0
  184. package/src/core/lib/components/ui/card/card-content.jsx +11 -0
  185. package/src/core/lib/components/ui/card/card-description.jsx +11 -0
  186. package/src/core/lib/components/ui/card/card-footer.jsx +11 -0
  187. package/src/core/lib/components/ui/card/card-header.jsx +19 -0
  188. package/src/core/lib/components/ui/card/card-title.jsx +11 -0
  189. package/src/core/lib/components/ui/card/card.jsx +17 -0
  190. package/src/core/lib/components/ui/card/index.js +25 -0
  191. package/src/core/lib/components/ui/checkbox/checkbox.jsx +29 -0
  192. package/src/core/lib/components/ui/checkbox/index.js +6 -0
  193. package/src/core/lib/components/ui/collapsible/collapsible-content.jsx +7 -0
  194. package/src/core/lib/components/ui/collapsible/collapsible-trigger.jsx +7 -0
  195. package/src/core/lib/components/ui/collapsible/collapsible.jsx +7 -0
  196. package/src/core/lib/components/ui/collapsible/index.js +13 -0
  197. package/src/core/lib/components/ui/dialog/dialog-close.jsx +7 -0
  198. package/src/core/lib/components/ui/dialog/dialog-content.jsx +34 -0
  199. package/src/core/lib/components/ui/dialog/dialog-description.jsx +15 -0
  200. package/src/core/lib/components/ui/dialog/dialog-footer.jsx +23 -0
  201. package/src/core/lib/components/ui/dialog/dialog-header.jsx +11 -0
  202. package/src/core/lib/components/ui/dialog/dialog-overlay.jsx +15 -0
  203. package/src/core/lib/components/ui/dialog/dialog-portal.jsx +4 -0
  204. package/src/core/lib/components/ui/dialog/dialog-title.jsx +15 -0
  205. package/src/core/lib/components/ui/dialog/dialog-trigger.jsx +7 -0
  206. package/src/core/lib/components/ui/dialog/dialog.jsx +4 -0
  207. package/src/core/lib/components/ui/dialog/index.js +34 -0
  208. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.jsx +8 -0
  209. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.jsx +30 -0
  210. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-content.jsx +22 -0
  211. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.jsx +16 -0
  212. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-group.jsx +7 -0
  213. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-item.jsx +20 -0
  214. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-label.jsx +17 -0
  215. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-portal.jsx +4 -0
  216. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.jsx +7 -0
  217. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.jsx +29 -0
  218. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-separator.jsx +15 -0
  219. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.jsx +16 -0
  220. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.jsx +15 -0
  221. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.jsx +23 -0
  222. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-sub.jsx +4 -0
  223. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu-trigger.jsx +7 -0
  224. package/src/core/lib/components/ui/dropdown-menu/dropdown-menu.jsx +4 -0
  225. package/src/core/lib/components/ui/dropdown-menu/index.js +54 -0
  226. package/src/core/lib/components/ui/input/index.js +7 -0
  227. package/src/core/lib/components/ui/input/input.jsx +19 -0
  228. package/src/core/lib/components/ui/label/index.js +7 -0
  229. package/src/core/lib/components/ui/label/label.jsx +19 -0
  230. package/src/core/lib/components/ui/panel/index.js +24 -0
  231. package/src/core/lib/components/ui/panel/panel-body.jsx +11 -0
  232. package/src/core/lib/components/ui/panel/panel-close.jsx +16 -0
  233. package/src/core/lib/components/ui/panel/panel-content.jsx +29 -0
  234. package/src/core/lib/components/ui/panel/panel-footer.jsx +11 -0
  235. package/src/core/lib/components/ui/panel/panel-header.jsx +11 -0
  236. package/src/core/lib/components/ui/panel/panel-title.jsx +12 -0
  237. package/src/core/lib/components/ui/panel/panel.jsx +4 -0
  238. package/src/core/lib/components/ui/popover/index.js +28 -0
  239. package/src/core/lib/components/ui/popover/popover-close.jsx +7 -0
  240. package/src/core/lib/components/ui/popover/popover-content.jsx +22 -0
  241. package/src/core/lib/components/ui/popover/popover-description.jsx +11 -0
  242. package/src/core/lib/components/ui/popover/popover-header.jsx +11 -0
  243. package/src/core/lib/components/ui/popover/popover-portal.jsx +4 -0
  244. package/src/core/lib/components/ui/popover/popover-title.jsx +11 -0
  245. package/src/core/lib/components/ui/popover/popover-trigger.jsx +8 -0
  246. package/src/core/lib/components/ui/popover/popover.jsx +4 -0
  247. package/src/core/lib/components/ui/searchable-list.jsx +160 -0
  248. package/src/core/lib/components/ui/select/index.js +37 -0
  249. package/src/core/lib/components/ui/select/select-content.jsx +30 -0
  250. package/src/core/lib/components/ui/select/select-group-heading.jsx +17 -0
  251. package/src/core/lib/components/ui/select/select-group.jsx +15 -0
  252. package/src/core/lib/components/ui/select/select-item.jsx +26 -0
  253. package/src/core/lib/components/ui/select/select-label.jsx +11 -0
  254. package/src/core/lib/components/ui/select/select-portal.jsx +4 -0
  255. package/src/core/lib/components/ui/select/select-scroll-down-button.jsx +18 -0
  256. package/src/core/lib/components/ui/select/select-scroll-up-button.jsx +18 -0
  257. package/src/core/lib/components/ui/select/select-separator.jsx +15 -0
  258. package/src/core/lib/components/ui/select/select-trigger.jsx +25 -0
  259. package/src/core/lib/components/ui/select/select.jsx +4 -0
  260. package/src/core/lib/components/ui/separator/index.js +7 -0
  261. package/src/core/lib/components/ui/separator/separator.jsx +22 -0
  262. package/src/core/lib/components/ui/sheet/index.js +34 -0
  263. package/src/core/lib/components/ui/sheet/sheet-close.jsx +7 -0
  264. package/src/core/lib/components/ui/sheet/sheet-content.jsx +35 -0
  265. package/src/core/lib/components/ui/sheet/sheet-description.jsx +15 -0
  266. package/src/core/lib/components/ui/sheet/sheet-footer.jsx +11 -0
  267. package/src/core/lib/components/ui/sheet/sheet-header.jsx +11 -0
  268. package/src/core/lib/components/ui/sheet/sheet-overlay.jsx +15 -0
  269. package/src/core/lib/components/ui/sheet/sheet-portal.jsx +4 -0
  270. package/src/core/lib/components/ui/sheet/sheet-title.jsx +15 -0
  271. package/src/core/lib/components/ui/sheet/sheet-trigger.jsx +7 -0
  272. package/src/core/lib/components/ui/sheet/sheet.jsx +4 -0
  273. package/src/core/lib/components/ui/textarea/index.js +7 -0
  274. package/src/core/lib/components/ui/textarea/textarea.jsx +18 -0
  275. package/src/core/lib/components/ui/toggle/index.js +8 -0
  276. package/src/core/lib/components/ui/toggle/toggle.jsx +36 -0
  277. package/src/core/lib/components/ui/toggle-group/index.js +10 -0
  278. package/src/core/lib/components/ui/toggle-group/toggle-group-item.jsx +29 -0
  279. package/src/core/lib/components/ui/toggle-group/toggle-group.jsx +43 -0
  280. package/src/core/lib/components/ui/tooltip/index.js +3 -0
  281. package/src/core/lib/components/ui/tooltip/tooltip-content.jsx +21 -0
  282. package/src/core/lib/components/ui/tooltip/tooltip-trigger.jsx +23 -0
  283. package/src/core/lib/components/ui/tooltip/tooltip.jsx +11 -0
  284. package/src/core/lib/components/ui/trigger-button/index.js +6 -0
  285. package/src/core/lib/components/ui/trigger-button/trigger-button.css +38 -0
  286. package/src/core/lib/components/ui/trigger-button/trigger-button.jsx +63 -0
  287. package/src/core/lib/utils/index.js +6 -0
  288. package/src/core/logger/devLogger.js +238 -0
  289. package/src/core/logger/devLogger.test.js +193 -0
  290. package/src/core/modes/modes.css +98 -0
  291. package/src/core/modes/modes.js +492 -0
  292. package/src/core/modes/modes.test.js +562 -0
  293. package/src/core/mountStoryboardCore.js +478 -0
  294. package/src/core/rename-watcher/config.json +23 -0
  295. package/src/core/rename-watcher/watcher.js +531 -0
  296. package/src/core/scaffold.js +100 -0
  297. package/src/core/server/index.js +391 -0
  298. package/src/core/session/bodyClasses.js +128 -0
  299. package/src/core/session/bodyClasses.test.js +192 -0
  300. package/src/core/session/hashSubscribe.js +19 -0
  301. package/src/core/session/hashSubscribe.test.js +62 -0
  302. package/src/core/session/hideMode.js +424 -0
  303. package/src/core/session/hideMode.test.js +268 -0
  304. package/src/core/session/interceptHideParams.js +35 -0
  305. package/src/core/session/interceptHideParams.test.js +90 -0
  306. package/src/core/session/localStorage.js +134 -0
  307. package/src/core/session/localStorage.test.js +148 -0
  308. package/src/core/session/session.js +76 -0
  309. package/src/core/session/session.test.js +91 -0
  310. package/src/core/stores/canvasConfig.js +134 -0
  311. package/src/core/stores/canvasConfig.test.js +120 -0
  312. package/src/core/stores/commandActions.js +284 -0
  313. package/src/core/stores/commandPaletteConfig.js +31 -0
  314. package/src/core/stores/configSchema.js +232 -0
  315. package/src/core/stores/configSchema.test.js +72 -0
  316. package/src/core/stores/configStore.js +161 -0
  317. package/src/core/stores/customerModeConfig.js +30 -0
  318. package/src/core/stores/featureFlags.js +127 -0
  319. package/src/core/stores/paletteProviders.js +360 -0
  320. package/src/core/stores/paletteProviders.test.js +186 -0
  321. package/src/core/stores/plugins.js +40 -0
  322. package/src/core/stores/plugins.test.js +68 -0
  323. package/src/core/stores/recentArtifacts.js +68 -0
  324. package/src/core/stores/recentArtifacts.test.js +71 -0
  325. package/src/core/stores/sidePanelStore.ts +143 -0
  326. package/src/core/stores/themeStore.ts +291 -0
  327. package/src/core/stores/toolRegistry.js +227 -0
  328. package/src/core/stores/toolStateStore.js +183 -0
  329. package/src/core/stores/toolStateStore.test.js +220 -0
  330. package/src/core/stores/toolbarConfigStore.js +165 -0
  331. package/src/core/stores/uiConfig.js +64 -0
  332. package/src/core/stores/uiConfig.test.js +63 -0
  333. package/src/core/styles/tailwind.css +204 -0
  334. package/src/core/tools/handlers/autosync.js +12 -0
  335. package/src/core/tools/handlers/canvasAddWidget.js +11 -0
  336. package/src/core/tools/handlers/canvasAgents.js +20 -0
  337. package/src/core/tools/handlers/canvasToolbar.js +56 -0
  338. package/src/core/tools/handlers/commandPalette.js +9 -0
  339. package/src/core/tools/handlers/comments.js +16 -0
  340. package/src/core/tools/handlers/create.js +39 -0
  341. package/src/core/tools/handlers/devtools.js +122 -0
  342. package/src/core/tools/handlers/devtools.test.js +87 -0
  343. package/src/core/tools/handlers/featureFlags.js +21 -0
  344. package/src/core/tools/handlers/flows.js +68 -0
  345. package/src/core/tools/handlers/hideChrome.js +9 -0
  346. package/src/core/tools/handlers/hideToolbars.js +25 -0
  347. package/src/core/tools/handlers/inspector.js +19 -0
  348. package/src/core/tools/handlers/paletteTheme.js +35 -0
  349. package/src/core/tools/handlers/theme.js +9 -0
  350. package/src/core/tools/registry.js +26 -0
  351. package/src/core/tools/surfaces/canvasToolbar.js +10 -0
  352. package/src/core/tools/surfaces/commandList.js +10 -0
  353. package/src/core/tools/surfaces/mainToolbar.js +11 -0
  354. package/src/core/tools/surfaces/registry.js +19 -0
  355. package/src/core/ui/ActionMenuButton.jsx +114 -0
  356. package/src/core/ui/AutosyncMenuButton.css +67 -0
  357. package/src/core/ui/AutosyncMenuButton.jsx +242 -0
  358. package/src/core/ui/BranchSelect.jsx +29 -0
  359. package/src/core/ui/BranchSelect.module.css +30 -0
  360. package/src/core/ui/CanvasAgentsMenu.jsx +89 -0
  361. package/src/core/ui/CanvasCreateMenu.jsx +611 -0
  362. package/src/core/ui/CanvasSnap.css +27 -0
  363. package/src/core/ui/CanvasSnap.jsx +51 -0
  364. package/src/core/ui/CanvasUndoRedo.css +36 -0
  365. package/src/core/ui/CanvasUndoRedo.jsx +62 -0
  366. package/src/core/ui/CanvasZoomControl.css +53 -0
  367. package/src/core/ui/CanvasZoomControl.jsx +49 -0
  368. package/src/core/ui/CanvasZoomToFit.css +18 -0
  369. package/src/core/ui/CanvasZoomToFit.jsx +26 -0
  370. package/src/core/ui/CommandMenu.css +8 -0
  371. package/src/core/ui/CommandMenu.jsx +287 -0
  372. package/src/core/ui/CommandPalette.jsx +35 -0
  373. package/src/core/ui/CommandPaletteTrigger.jsx +25 -0
  374. package/src/core/ui/CommentsMenuButton.jsx +40 -0
  375. package/src/core/ui/CoreUIBar.css +47 -0
  376. package/src/core/ui/CoreUIBar.jsx +905 -0
  377. package/src/core/ui/CreateMenuButton.jsx +117 -0
  378. package/src/core/ui/HideChromeTrigger.jsx +48 -0
  379. package/src/core/ui/Icon.jsx +279 -0
  380. package/src/core/ui/InspectorPanel.css +109 -0
  381. package/src/core/ui/InspectorPanel.jsx +632 -0
  382. package/src/core/ui/PwaInstallBanner.css +42 -0
  383. package/src/core/ui/PwaInstallBanner.jsx +124 -0
  384. package/src/core/ui/SidePanel.jsx +261 -0
  385. package/src/core/ui/ThemeMenuButton.jsx +139 -0
  386. package/src/core/ui/core-ui-colors.css +129 -0
  387. package/src/core/ui/design-modes.ts +7 -0
  388. package/src/core/ui/sidepanel.css +301 -0
  389. package/src/core/ui/viewfinder.ts +7 -0
  390. package/src/core/ui-entry.js +30 -0
  391. package/src/core/utils/fuzzySearch.js +117 -0
  392. package/src/core/utils/fuzzySearch.test.js +119 -0
  393. package/src/core/utils/mobileViewport.js +57 -0
  394. package/src/core/utils/mobileViewport.test.js +68 -0
  395. package/src/core/utils/prodMode.js +38 -0
  396. package/src/core/utils/smoothCorners.js +20 -0
  397. package/src/core/vite/docs-handler.js +155 -0
  398. package/src/core/vite/server-plugin.js +797 -0
  399. package/src/core/workshop/features/createCanvas/CreateCanvasForm.jsx +260 -0
  400. package/src/core/workshop/features/createCanvas/index.js +14 -0
  401. package/src/core/workshop/features/createFlow/CreateFlowForm.jsx +334 -0
  402. package/src/core/workshop/features/createFlow/index.js +19 -0
  403. package/src/core/workshop/features/createFlow/server.js +663 -0
  404. package/src/core/workshop/features/createPage/CreatePageForm.jsx +304 -0
  405. package/src/core/workshop/features/createPage/index.js +11 -0
  406. package/src/core/workshop/features/createPrototype/CreatePrototypeForm.jsx +289 -0
  407. package/src/core/workshop/features/createPrototype/index.js +19 -0
  408. package/src/core/workshop/features/createPrototype/server.js +433 -0
  409. package/src/core/workshop/features/createStory/CreateStoryForm.jsx +208 -0
  410. package/src/core/workshop/features/createStory/index.js +14 -0
  411. package/src/core/workshop/features/registry-server.js +22 -0
  412. package/src/core/workshop/features/registry.js +28 -0
  413. package/src/core/workshop/features/templateIndex.js +155 -0
  414. package/src/core/workshop/ui/WorkshopPanel.jsx +98 -0
  415. package/src/core/workshop/ui/mount.ts +6 -0
  416. package/src/core/worktree/port.js +268 -0
  417. package/src/core/worktree/port.test.js +222 -0
  418. package/src/core/worktree/serverRegistry.js +120 -0
  419. package/src/internals/AuthModal/AuthModal.jsx +132 -0
  420. package/src/internals/AuthModal/AuthModal.module.css +221 -0
  421. package/src/internals/BranchBar/BranchBar.jsx +87 -0
  422. package/src/internals/BranchBar/BranchBar.module.css +247 -0
  423. package/src/internals/BranchBar/useBranches.js +93 -0
  424. package/src/internals/BranchBar/useBranches.test.js +68 -0
  425. package/src/internals/CommandPalette/CommandPalette.jsx +1361 -0
  426. package/src/internals/CommandPalette/CreateDialog.jsx +219 -0
  427. package/src/internals/CommandPalette/command-palette.css +180 -0
  428. package/src/internals/FlowError.module.css +30 -0
  429. package/src/internals/Icon.jsx +279 -0
  430. package/src/internals/StoryboardContext.js +3 -0
  431. package/src/internals/Viewfinder.jsx +1479 -0
  432. package/src/internals/Viewfinder.module.css +1540 -0
  433. package/src/internals/Workspace.jsx +7 -0
  434. package/src/internals/__mocks__/virtual-storyboard-data-index.js +4 -0
  435. package/src/internals/canvas/CanvasControls.jsx +112 -0
  436. package/src/internals/canvas/CanvasControls.module.css +135 -0
  437. package/src/internals/canvas/CanvasPage.bridge.test.jsx +387 -0
  438. package/src/internals/canvas/CanvasPage.dragdrop.test.jsx +350 -0
  439. package/src/internals/canvas/CanvasPage.jsx +3092 -0
  440. package/src/internals/canvas/CanvasPage.module.css +187 -0
  441. package/src/internals/canvas/CanvasPage.multiselect.test.jsx +358 -0
  442. package/src/internals/canvas/CanvasToolbar.jsx +73 -0
  443. package/src/internals/canvas/CanvasToolbar.module.css +92 -0
  444. package/src/internals/canvas/ComponentErrorBoundary.jsx +50 -0
  445. package/src/internals/canvas/ConnectorLayer.jsx +208 -0
  446. package/src/internals/canvas/ConnectorLayer.module.css +129 -0
  447. package/src/internals/canvas/MarqueeOverlay.jsx +20 -0
  448. package/src/internals/canvas/PageSelector.jsx +587 -0
  449. package/src/internals/canvas/PageSelector.module.css +261 -0
  450. package/src/internals/canvas/PageSelector.test.jsx +113 -0
  451. package/src/internals/canvas/WebGLContextPool.jsx +292 -0
  452. package/src/internals/canvas/WebGLContextPool.test.jsx +165 -0
  453. package/src/internals/canvas/canvasApi.js +164 -0
  454. package/src/internals/canvas/canvasReloadGuard.js +37 -0
  455. package/src/internals/canvas/canvasReloadGuard.test.js +27 -0
  456. package/src/internals/canvas/canvasTheme.js +118 -0
  457. package/src/internals/canvas/componentIsolate.jsx +165 -0
  458. package/src/internals/canvas/componentSetIsolate.jsx +257 -0
  459. package/src/internals/canvas/computeCanvasBounds.test.js +121 -0
  460. package/src/internals/canvas/connectorGeometry.js +132 -0
  461. package/src/internals/canvas/hotPoolDevLogs.js +25 -0
  462. package/src/internals/canvas/textSelection.js +10 -0
  463. package/src/internals/canvas/textSelection.test.js +26 -0
  464. package/src/internals/canvas/useCanvas.js +126 -0
  465. package/src/internals/canvas/useCanvas.test.js +26 -0
  466. package/src/internals/canvas/useMarqueeSelect.js +213 -0
  467. package/src/internals/canvas/useMarqueeSelect.test.js +78 -0
  468. package/src/internals/canvas/useUndoRedo.js +86 -0
  469. package/src/internals/canvas/useUndoRedo.test.js +231 -0
  470. package/src/internals/canvas/widgets/CodePenEmbed.jsx +293 -0
  471. package/src/internals/canvas/widgets/CodePenEmbed.module.css +161 -0
  472. package/src/internals/canvas/widgets/ComponentSetWidget.jsx +2 -0
  473. package/src/internals/canvas/widgets/ComponentSetWidget.module.css +89 -0
  474. package/src/internals/canvas/widgets/ComponentWidget.jsx +14 -0
  475. package/src/internals/canvas/widgets/ComponentWidget.module.css +0 -0
  476. package/src/internals/canvas/widgets/CropOverlay.jsx +179 -0
  477. package/src/internals/canvas/widgets/CropOverlay.module.css +154 -0
  478. package/src/internals/canvas/widgets/ExpandedPane.jsx +474 -0
  479. package/src/internals/canvas/widgets/ExpandedPane.module.css +179 -0
  480. package/src/internals/canvas/widgets/ExpandedPane.test.jsx +240 -0
  481. package/src/internals/canvas/widgets/ExpandedPaneTopBar.jsx +111 -0
  482. package/src/internals/canvas/widgets/ExpandedPaneTopBar.module.css +59 -0
  483. package/src/internals/canvas/widgets/ExpandedPaneTopBar.test.jsx +45 -0
  484. package/src/internals/canvas/widgets/FigmaEmbed.jsx +296 -0
  485. package/src/internals/canvas/widgets/FigmaEmbed.module.css +222 -0
  486. package/src/internals/canvas/widgets/FrozenTerminalOverlay.jsx +151 -0
  487. package/src/internals/canvas/widgets/FrozenTerminalOverlay.module.css +83 -0
  488. package/src/internals/canvas/widgets/ImageWidget.jsx +287 -0
  489. package/src/internals/canvas/widgets/ImageWidget.module.css +81 -0
  490. package/src/internals/canvas/widgets/LinkPreview.jsx +439 -0
  491. package/src/internals/canvas/widgets/LinkPreview.module.css +585 -0
  492. package/src/internals/canvas/widgets/LinkPreview.test.jsx +193 -0
  493. package/src/internals/canvas/widgets/MarkdownBlock.jsx +354 -0
  494. package/src/internals/canvas/widgets/MarkdownBlock.module.css +377 -0
  495. package/src/internals/canvas/widgets/MarkdownBlock.test.jsx +92 -0
  496. package/src/internals/canvas/widgets/PromptWidget.jsx +428 -0
  497. package/src/internals/canvas/widgets/PromptWidget.module.css +273 -0
  498. package/src/internals/canvas/widgets/PrototypeEmbed.jsx +463 -0
  499. package/src/internals/canvas/widgets/PrototypeEmbed.module.css +579 -0
  500. package/src/internals/canvas/widgets/PrototypeEmbed.test.jsx +10 -0
  501. package/src/internals/canvas/widgets/ResizeHandle.jsx +67 -0
  502. package/src/internals/canvas/widgets/ResizeHandle.module.css +29 -0
  503. package/src/internals/canvas/widgets/StickyNote.jsx +92 -0
  504. package/src/internals/canvas/widgets/StickyNote.module.css +70 -0
  505. package/src/internals/canvas/widgets/StickyNote.test.jsx +116 -0
  506. package/src/internals/canvas/widgets/StorySetWidget.jsx +208 -0
  507. package/src/internals/canvas/widgets/StorySetWidget.module.css +89 -0
  508. package/src/internals/canvas/widgets/StoryWidget.jsx +334 -0
  509. package/src/internals/canvas/widgets/StoryWidget.module.css +211 -0
  510. package/src/internals/canvas/widgets/TerminalReadWidget.jsx +146 -0
  511. package/src/internals/canvas/widgets/TerminalReadWidget.module.css +94 -0
  512. package/src/internals/canvas/widgets/TerminalWidget.jsx +704 -0
  513. package/src/internals/canvas/widgets/TerminalWidget.module.css +444 -0
  514. package/src/internals/canvas/widgets/TilesWidget.jsx +300 -0
  515. package/src/internals/canvas/widgets/TilesWidget.module.css +133 -0
  516. package/src/internals/canvas/widgets/WidgetChrome.jsx +580 -0
  517. package/src/internals/canvas/widgets/WidgetChrome.module.css +421 -0
  518. package/src/internals/canvas/widgets/WidgetWrapper.jsx +15 -0
  519. package/src/internals/canvas/widgets/WidgetWrapper.module.css +25 -0
  520. package/src/internals/canvas/widgets/codepenUrl.js +75 -0
  521. package/src/internals/canvas/widgets/codepenUrl.test.js +76 -0
  522. package/src/internals/canvas/widgets/embedInteraction.test.jsx +173 -0
  523. package/src/internals/canvas/widgets/embedOverlay.module.css +35 -0
  524. package/src/internals/canvas/widgets/embedTheme.js +148 -0
  525. package/src/internals/canvas/widgets/expandUtils.js +559 -0
  526. package/src/internals/canvas/widgets/expandUtils.test.js +155 -0
  527. package/src/internals/canvas/widgets/figmaUrl.js +118 -0
  528. package/src/internals/canvas/widgets/figmaUrl.test.js +139 -0
  529. package/src/internals/canvas/widgets/githubUrl.js +82 -0
  530. package/src/internals/canvas/widgets/githubUrl.test.js +74 -0
  531. package/src/internals/canvas/widgets/iframeDevLogs.js +49 -0
  532. package/src/internals/canvas/widgets/iframeDevLogs.test.jsx +81 -0
  533. package/src/internals/canvas/widgets/index.js +42 -0
  534. package/src/internals/canvas/widgets/pasteRules.js +295 -0
  535. package/src/internals/canvas/widgets/pasteRules.test.js +474 -0
  536. package/src/internals/canvas/widgets/snapshotDisplay.test.jsx +211 -0
  537. package/src/internals/canvas/widgets/tilePool.js +23 -0
  538. package/src/internals/canvas/widgets/tiles/diagonal-bl.png +0 -0
  539. package/src/internals/canvas/widgets/tiles/diagonal-br.png +0 -0
  540. package/src/internals/canvas/widgets/tiles/diagonal-tl.png +0 -0
  541. package/src/internals/canvas/widgets/tiles/leaf.png +0 -0
  542. package/src/internals/canvas/widgets/tiles/quarter-tl.png +0 -0
  543. package/src/internals/canvas/widgets/tiles/quarter-tr.png +0 -0
  544. package/src/internals/canvas/widgets/tiles/solid-a.png +0 -0
  545. package/src/internals/canvas/widgets/tiles/solid-b.png +0 -0
  546. package/src/internals/canvas/widgets/widgetConfig.js +291 -0
  547. package/src/internals/canvas/widgets/widgetConfig.test.js +68 -0
  548. package/src/internals/canvas/widgets/widgetIcons.jsx +190 -0
  549. package/src/internals/canvas/widgets/widgetProps.js +133 -0
  550. package/src/internals/context/FormContext.js +13 -0
  551. package/src/internals/context/FormContext.test.js +48 -0
  552. package/src/internals/context.jsx +481 -0
  553. package/src/internals/context.test.jsx +296 -0
  554. package/src/internals/hashPreserver.js +73 -0
  555. package/src/internals/hashPreserver.test.js +107 -0
  556. package/src/internals/hooks/useConfig.js +14 -0
  557. package/src/internals/hooks/useFeatureFlag.js +14 -0
  558. package/src/internals/hooks/useFlows.js +50 -0
  559. package/src/internals/hooks/useFlows.test.js +134 -0
  560. package/src/internals/hooks/useHideMode.js +31 -0
  561. package/src/internals/hooks/useHideMode.test.js +43 -0
  562. package/src/internals/hooks/useLocalStorage.js +57 -0
  563. package/src/internals/hooks/useLocalStorage.test.js +75 -0
  564. package/src/internals/hooks/useMode.js +43 -0
  565. package/src/internals/hooks/useObject.js +101 -0
  566. package/src/internals/hooks/useObject.test.js +74 -0
  567. package/src/internals/hooks/useOverride.js +84 -0
  568. package/src/internals/hooks/useOverride.test.js +71 -0
  569. package/src/internals/hooks/usePrototypeReloadGuard.js +64 -0
  570. package/src/internals/hooks/useRecord.js +158 -0
  571. package/src/internals/hooks/useRecord.test.js +221 -0
  572. package/src/internals/hooks/useScene.js +38 -0
  573. package/src/internals/hooks/useScene.test.js +66 -0
  574. package/src/internals/hooks/useSceneData.js +108 -0
  575. package/src/internals/hooks/useSceneData.test.js +136 -0
  576. package/src/internals/hooks/useSession.js +4 -0
  577. package/src/internals/hooks/useSession.test.js +8 -0
  578. package/src/internals/hooks/useThemeState.js +61 -0
  579. package/src/internals/hooks/useThemeState.test.js +66 -0
  580. package/src/internals/hooks/useUndoRedo.js +28 -0
  581. package/src/internals/hooks/useUndoRedo.test.js +64 -0
  582. package/src/internals/index.js +58 -0
  583. package/src/internals/story/ComponentSetPage.jsx +198 -0
  584. package/src/internals/story/ComponentSetPage.module.css +129 -0
  585. package/src/internals/story/StoryPage.jsx +147 -0
  586. package/src/internals/story/StoryPage.module.css +18 -0
  587. package/src/internals/test-utils.js +45 -0
  588. package/src/internals/vite/data-plugin.js +1508 -0
  589. package/src/internals/vite/data-plugin.test.js +1223 -0
  590. package/src/test-utils.js +44 -0
  591. package/toolbar.config.json +271 -0
  592. package/widgets.config.json +1537 -0
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Toolbar Config Store — reactive toolbar configuration with layered overrides.
3
+ *
4
+ * Override priority (highest wins):
5
+ * core (toolbar.config.json) → custom (client repo) → prototype → user (future)
6
+ *
7
+ * Framework-agnostic (zero npm dependencies).
8
+ */
9
+
10
+ import { deepMerge } from '../data/loader.js'
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Internal state
14
+ // ---------------------------------------------------------------------------
15
+
16
+ /** @type {object} Merged core + custom config (set once at startup) */
17
+ let _baseConfig = {}
18
+
19
+ /** @type {object|null} Active prototype toolbar overrides */
20
+ let _prototypeConfig = null
21
+
22
+ /** @type {object} Final merged config (base + prototype) */
23
+ let _mergedConfig = {}
24
+
25
+ /** @type {Set<Function>} */
26
+ const _listeners = new Set()
27
+
28
+ /** @type {object|null} Client-repo toolbar overrides (set by virtual module before mount) */
29
+ let _clientOverrides = null
30
+
31
+ let _snapshotVersion = 0
32
+
33
+ // ---------------------------------------------------------------------------
34
+ // Initialization
35
+ // ---------------------------------------------------------------------------
36
+
37
+ /**
38
+ * Set the base toolbar config (core defaults merged with client overrides).
39
+ * Called once at app startup by mountStoryboardCore.
40
+ *
41
+ * @param {object} config - Already-merged core + custom toolbar config
42
+ */
43
+ export function initToolbarConfig(config) {
44
+ _baseConfig = config
45
+ _prototypeConfig = null
46
+ _recompute()
47
+ }
48
+
49
+ // ---------------------------------------------------------------------------
50
+ // Prototype overrides
51
+ // ---------------------------------------------------------------------------
52
+
53
+ /**
54
+ * Set toolbar overrides for the active prototype.
55
+ * Called on route change when entering a prototype that has a toolbar.config.json.
56
+ *
57
+ * @param {object|null} config - Prototype-level overrides, or null to clear
58
+ */
59
+ export function setPrototypeToolbarConfig(config) {
60
+ _prototypeConfig = config || null
61
+ _recompute()
62
+ }
63
+
64
+ /**
65
+ * Clear prototype overrides (e.g. when navigating to viewfinder or a
66
+ * prototype without its own toolbar.config.json).
67
+ */
68
+ export function clearPrototypeToolbarConfig() {
69
+ if (_prototypeConfig === null) return
70
+ _prototypeConfig = null
71
+ _recompute()
72
+ }
73
+
74
+ // ---------------------------------------------------------------------------
75
+ // Access
76
+ // ---------------------------------------------------------------------------
77
+
78
+ /**
79
+ * Get the current merged toolbar config.
80
+ *
81
+ * @returns {object}
82
+ */
83
+ export function getToolbarConfig() {
84
+ return _mergedConfig
85
+ }
86
+
87
+ // ---------------------------------------------------------------------------
88
+ // Reactivity
89
+ // ---------------------------------------------------------------------------
90
+
91
+ /**
92
+ * Subscribe to toolbar config changes. Compatible with external stores.
93
+ *
94
+ * @param {Function} callback
95
+ * @returns {Function} Unsubscribe
96
+ */
97
+ export function subscribeToToolbarConfig(callback) {
98
+ _listeners.add(callback)
99
+ callback(_mergedConfig)
100
+ return () => _listeners.delete(callback)
101
+ }
102
+
103
+ /**
104
+ * Snapshot for useSyncExternalStore.
105
+ *
106
+ * @returns {string}
107
+ */
108
+ export function getToolbarConfigSnapshot() {
109
+ return String(_snapshotVersion)
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Internal
114
+ // ---------------------------------------------------------------------------
115
+
116
+ function _recompute() {
117
+ _mergedConfig = _prototypeConfig
118
+ ? deepMerge(_baseConfig, _prototypeConfig)
119
+ : _baseConfig
120
+ _snapshotVersion++
121
+ for (const cb of _listeners) {
122
+ try { cb(_mergedConfig) } catch (err) {
123
+ console.error('[storyboard] Error in toolbar config subscriber:', err)
124
+ }
125
+ }
126
+ }
127
+
128
+ // ---------------------------------------------------------------------------
129
+ // Client overrides (set by Vite data plugin before mountStoryboardCore runs)
130
+ // ---------------------------------------------------------------------------
131
+
132
+ /**
133
+ * Store client-repo toolbar overrides from a root toolbar.config.json.
134
+ * Called from the generated virtual module at import time.
135
+ *
136
+ * @param {object} config - Client toolbar config (tools, surfaces, etc.)
137
+ */
138
+ export function setClientToolbarOverrides(config) {
139
+ _clientOverrides = config
140
+ }
141
+
142
+ /**
143
+ * Consume and clear pending client overrides.
144
+ * Called once by mountStoryboardCore during toolbar config init.
145
+ *
146
+ * @returns {object|null}
147
+ */
148
+ export function consumeClientToolbarOverrides() {
149
+ const overrides = _clientOverrides
150
+ _clientOverrides = null
151
+ return overrides
152
+ }
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // Test helpers
156
+ // ---------------------------------------------------------------------------
157
+
158
+ export function _resetToolbarConfig() {
159
+ _baseConfig = {}
160
+ _prototypeConfig = null
161
+ _clientOverrides = null
162
+ _mergedConfig = {}
163
+ _listeners.clear()
164
+ _snapshotVersion = 0
165
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * UI Config — project-level overrides for storyboard chrome visibility.
3
+ *
4
+ * Client repos use the "ui" key in storyboard.config.json to hide
5
+ * specific menus or UI elements from the CoreUIBar.
6
+ *
7
+ * {
8
+ * "ui": {
9
+ * "hide": ["docs", "comments"]
10
+ * }
11
+ * }
12
+ *
13
+ * Framework-agnostic (zero npm dependencies).
14
+ */
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Internal state
18
+ // ---------------------------------------------------------------------------
19
+
20
+ let _hiddenItems = new Set()
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Configuration
24
+ // ---------------------------------------------------------------------------
25
+
26
+ /**
27
+ * Initialize UI config from storyboard.config.json's "ui" key.
28
+ * Called by the Vite data plugin's generated virtual module.
29
+ *
30
+ * @param {{ hide?: string[] }} [config]
31
+ */
32
+ export function initUIConfig(config = {}) {
33
+ _hiddenItems = new Set(Array.isArray(config.hide) ? config.hide : [])
34
+ }
35
+
36
+ /**
37
+ * Check whether a specific menu is hidden by project config.
38
+ *
39
+ * @param {string} key Menu key (e.g. 'docs', 'inspector', 'create', 'comments', 'command')
40
+ * @returns {boolean}
41
+ */
42
+ export function isMenuHidden(key) {
43
+ return _hiddenItems.has(key)
44
+ }
45
+
46
+ /**
47
+ * Get the full set of hidden item keys.
48
+ *
49
+ * @returns {string[]}
50
+ */
51
+ export function getHiddenItems() {
52
+ return Array.from(_hiddenItems)
53
+ }
54
+
55
+ // ---------------------------------------------------------------------------
56
+ // Test helpers
57
+ // ---------------------------------------------------------------------------
58
+
59
+ /**
60
+ * Reset all internal state. Only for use in tests.
61
+ */
62
+ export function _resetUIConfig() {
63
+ _hiddenItems = new Set()
64
+ }
@@ -0,0 +1,63 @@
1
+ import { initUIConfig, isMenuHidden, getHiddenItems, _resetUIConfig } from './uiConfig.js'
2
+
3
+ afterEach(() => {
4
+ _resetUIConfig()
5
+ })
6
+
7
+ describe('initUIConfig', () => {
8
+ it('starts with no hidden items', () => {
9
+ expect(getHiddenItems()).toEqual([])
10
+ })
11
+
12
+ it('accepts a hide array', () => {
13
+ initUIConfig({ hide: ['docs', 'comments'] })
14
+ expect(getHiddenItems()).toEqual(['docs', 'comments'])
15
+ })
16
+
17
+ it('handles empty config', () => {
18
+ initUIConfig({})
19
+ expect(getHiddenItems()).toEqual([])
20
+ })
21
+
22
+ it('handles no args', () => {
23
+ initUIConfig()
24
+ expect(getHiddenItems()).toEqual([])
25
+ })
26
+
27
+ it('replaces previous config on re-init', () => {
28
+ initUIConfig({ hide: ['docs'] })
29
+ initUIConfig({ hide: ['inspector'] })
30
+ expect(getHiddenItems()).toEqual(['inspector'])
31
+ })
32
+ })
33
+
34
+ describe('isMenuHidden', () => {
35
+ it('returns false for non-hidden menus', () => {
36
+ initUIConfig({ hide: ['docs'] })
37
+ expect(isMenuHidden('inspector')).toBe(false)
38
+ })
39
+
40
+ it('returns true for hidden menus', () => {
41
+ initUIConfig({ hide: ['docs', 'comments'] })
42
+ expect(isMenuHidden('docs')).toBe(true)
43
+ expect(isMenuHidden('comments')).toBe(true)
44
+ })
45
+
46
+ it('returns false when no config is set', () => {
47
+ expect(isMenuHidden('docs')).toBe(false)
48
+ })
49
+
50
+ it('can hide the command menu', () => {
51
+ initUIConfig({ hide: ['command'] })
52
+ expect(isMenuHidden('command')).toBe(true)
53
+ })
54
+ })
55
+
56
+ describe('_resetUIConfig', () => {
57
+ it('clears all hidden items', () => {
58
+ initUIConfig({ hide: ['docs', 'inspector', 'create'] })
59
+ _resetUIConfig()
60
+ expect(getHiddenItems()).toEqual([])
61
+ expect(isMenuHidden('docs')).toBe(false)
62
+ })
63
+ })
@@ -0,0 +1,204 @@
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @source "../**/*.{jsx,js,ts}";
4
+
5
+ @font-face {
6
+ font-family: "Hubot Sans";
7
+ src:
8
+ url("../../../../assets/fonts/HubotSans/Hubot-Sans.woff2") format("woff2 supports variations"),
9
+ url("../../../../assets/fonts/HubotSans/Hubot-Sans.woff2") format("woff2-variations");
10
+ font-weight: 200 900;
11
+ font-stretch: 75% 125%;
12
+ font-display: swap;
13
+ }
14
+
15
+ @font-face {
16
+ font-family: "Mona Sans";
17
+ src:
18
+ url("../../../../assets/fonts/MonaSans/MonaSans.woff2") format("woff2 supports variations"),
19
+ url("../../../../assets/fonts/MonaSans/MonaSans.woff2") format("woff2-variations");
20
+ font-weight: 200 900;
21
+ font-stretch: 75% 125%;
22
+ font-display: swap;
23
+ }
24
+
25
+ @custom-variant dark (&:where([data-sb-theme^="dark"], [data-sb-theme^="dark"] *));
26
+
27
+ @theme {
28
+ --color-background: hsl(0 0% 100%);
29
+ --color-foreground: hsl(222.2 84% 4.9%);
30
+ --color-card: hsl(0 0% 100%);
31
+ --color-card-foreground: hsl(222.2 84% 4.9%);
32
+ --color-popover: hsl(0 0% 100%);
33
+ --color-popover-foreground: hsl(222.2 84% 4.9%);
34
+ --color-primary: hsl(222.2 47.4% 11.2%);
35
+ --color-primary-foreground: hsl(210 40% 98%);
36
+ --color-secondary: hsl(210 40% 96.1%);
37
+ --color-secondary-foreground: hsl(222.2 47.4% 11.2%);
38
+ --color-muted: hsl(210 40% 96.1%);
39
+ --color-muted-foreground: hsl(215.4 16.3% 46.9%);
40
+ --color-accent: hsl(210 40% 96.1%);
41
+ --color-accent-foreground: hsl(222.2 47.4% 11.2%);
42
+ --color-destructive: hsl(0 84.2% 60.2%);
43
+ --color-destructive-foreground: hsl(210 40% 98%);
44
+ --color-border: hsl(214.3 31.8% 91.4%);
45
+ --color-input: hsl(214.3 31.8% 91.4%);
46
+ --color-ring: hsl(222.2 84% 4.9%);
47
+ --color-success: hsl(142 71% 36%);
48
+ --color-success-foreground: hsl(0 0% 100%);
49
+ --radius: 0.5rem;
50
+ --font-sans: "Hubot Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
51
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;
52
+
53
+ --sb--color-background: hsl(0 0% 100%);
54
+ --sb--color-foreground: hsl(222.2 84% 4.9%);
55
+ --sb--color-card: hsl(0 0% 100%);
56
+ --sb--color-card-foreground: hsl(222.2 84% 4.9%);
57
+ --sb--color-popover: hsl(0 0% 100%);
58
+ --sb--color-popover-foreground: hsl(222.2 84% 4.9%);
59
+ --sb--color-primary: hsl(222.2 47.4% 11.2%);
60
+ --sb--color-primary-foreground: hsl(210 40% 98%);
61
+ --sb--color-secondary: hsl(210 40% 96.1%);
62
+ --sb--color-secondary-foreground: hsl(222.2 47.4% 11.2%);
63
+ --sb--color-muted: hsl(210 40% 96.1%);
64
+ --sb--color-muted-foreground: hsl(215.4 16.3% 46.9%);
65
+ --sb--color-accent: hsl(210 40% 96.1%);
66
+ --sb--color-accent-foreground: hsl(222.2 47.4% 11.2%);
67
+ --sb--color-destructive: hsl(0 84.2% 60.2%);
68
+ --sb--color-destructive-foreground: hsl(210 40% 98%);
69
+ --sb--color-border: hsl(214.3 31.8% 91.4%);
70
+ --sb--color-input: hsl(214.3 31.8% 91.4%);
71
+ --sb--color-ring: hsl(222.2 84% 4.9%);
72
+ --sb--color-success: hsl(142 71% 36%);
73
+ --sb--color-success-foreground: hsl(0 0% 100%);
74
+ --sb--radius: var(--radius);
75
+ --sb--font-sans: var(--font-sans);
76
+ --sb--font-mono: var(--font-mono);
77
+ }
78
+
79
+ @layer base {
80
+ [data-sb-theme^="dark"] {
81
+ --color-background: hsl(222.2 84% 4.9%);
82
+ --color-foreground: hsl(210 40% 98%);
83
+ --color-card: hsl(222.2 84% 4.9%);
84
+ --color-card-foreground: hsl(210 40% 98%);
85
+ --color-popover: hsl(222.2 84% 4.9%);
86
+ --color-popover-foreground: hsl(210 40% 98%);
87
+ --color-primary: hsl(210 40% 98%);
88
+ --color-primary-foreground: hsl(222.2 47.4% 11.2%);
89
+ --color-secondary: hsl(217.2 32.6% 17.5%);
90
+ --color-secondary-foreground: hsl(210 40% 98%);
91
+ --color-muted: hsl(217.2 32.6% 17.5%);
92
+ --color-muted-foreground: hsl(215 20.2% 65.1%);
93
+ --color-accent: hsl(217.2 32.6% 17.5%);
94
+ --color-accent-foreground: hsl(210 40% 98%);
95
+ --color-destructive: hsl(0 62.8% 30.6%);
96
+ --color-destructive-foreground: hsl(210 40% 98%);
97
+ --color-border: hsl(217.2 32.6% 17.5%);
98
+ --color-input: hsl(217.2 32.6% 17.5%);
99
+ --color-ring: hsl(212.7 26.8% 83.9%);
100
+ --color-success: hsl(142 71% 45%);
101
+ --color-success-foreground: hsl(0 0% 100%);
102
+
103
+ --sb--color-background: hsl(222.2 84% 4.9%);
104
+ --sb--color-foreground: hsl(210 40% 98%);
105
+ --sb--color-card: hsl(222.2 84% 4.9%);
106
+ --sb--color-card-foreground: hsl(210 40% 98%);
107
+ --sb--color-popover: hsl(222.2 84% 4.9%);
108
+ --sb--color-popover-foreground: hsl(210 40% 98%);
109
+ --sb--color-primary: hsl(210 40% 98%);
110
+ --sb--color-primary-foreground: hsl(222.2 47.4% 11.2%);
111
+ --sb--color-secondary: hsl(217.2 32.6% 17.5%);
112
+ --sb--color-secondary-foreground: hsl(210 40% 98%);
113
+ --sb--color-muted: hsl(217.2 32.6% 17.5%);
114
+ --sb--color-muted-foreground: hsl(215 20.2% 65.1%);
115
+ --sb--color-accent: hsl(217.2 32.6% 17.5%);
116
+ --sb--color-accent-foreground: hsl(210 40% 98%);
117
+ --sb--color-destructive: hsl(0 62.8% 30.6%);
118
+ --sb--color-destructive-foreground: hsl(210 40% 98%);
119
+ --sb--color-border: hsl(217.2 32.6% 17.5%);
120
+ --sb--color-input: hsl(217.2 32.6% 17.5%);
121
+ --sb--color-ring: hsl(212.7 26.8% 83.9%);
122
+ --sb--color-success: hsl(142 71% 45%);
123
+ --sb--color-success-foreground: hsl(0 0% 100%);
124
+ }
125
+ }
126
+ @custom-variant data-open {
127
+ &:where([data-state="open"]), &:where([data-open]:not([data-open="false"])) {
128
+ @slot;
129
+ }
130
+ }
131
+ @custom-variant data-closed {
132
+ &:where([data-state="closed"]), &:where([data-closed]:not([data-closed="false"])) {
133
+ @slot;
134
+ }
135
+ }
136
+ @custom-variant data-checked {
137
+ &:where([data-state="checked"]), &:where([data-checked]:not([data-checked="false"])) {
138
+ @slot;
139
+ }
140
+ }
141
+ @custom-variant data-unchecked {
142
+ &:where([data-state="unchecked"]), &:where([data-unchecked]:not([data-unchecked="false"])) {
143
+ @slot;
144
+ }
145
+ }
146
+ @custom-variant data-selected {
147
+ &:where([data-selected]) {
148
+ @slot;
149
+ }
150
+ }
151
+ @custom-variant data-disabled {
152
+ &:where([data-disabled="true"]), &:where([data-disabled]:not([data-disabled="false"])) {
153
+ @slot;
154
+ }
155
+ }
156
+ @custom-variant data-active {
157
+ &:where([data-state="active"]), &:where([data-active]:not([data-active="false"])) {
158
+ @slot;
159
+ }
160
+ }
161
+ @custom-variant data-horizontal {
162
+ &:where([data-orientation="horizontal"]) {
163
+ @slot;
164
+ }
165
+ }
166
+ @custom-variant data-vertical {
167
+ &:where([data-orientation="vertical"]) {
168
+ @slot;
169
+ }
170
+ }
171
+ @utility no-scrollbar {
172
+ -ms-overflow-style: none;
173
+ scrollbar-width: none;
174
+ &::-webkit-scrollbar {
175
+ display: none;
176
+ }
177
+ }
178
+
179
+ @utility smooth-corners {
180
+ mask-image: paint(smooth-corners);
181
+ -webkit-mask-image: paint(smooth-corners);
182
+ }
183
+
184
+ @layer base {
185
+ :root {
186
+ --sb--smooth-corners: 4;
187
+ --sb--radius-md: var(--radius-md);
188
+ }
189
+ }
190
+
191
+ /*
192
+ * Prevent unlayered CSS framework resets (e.g. Primer's `button { border-radius: 0 }`)
193
+ * from overriding layered Tailwind utilities on storyboard UI elements.
194
+ * `revert-layer` falls back to the value from the cascade layers (Tailwind utilities).
195
+ */
196
+ [data-slot="button"] {
197
+ border-radius: revert-layer;
198
+ font-weight: revert-layer;
199
+ }
200
+
201
+ [data-slot="panel-content"] select,
202
+ [data-slot="panel-content"] input {
203
+ border-radius: revert-layer;
204
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Autosync tool handler.
3
+ *
4
+ * Dev-only tool (localOnly) that auto-commits and pushes changes
5
+ * to a selected branch every 30 seconds.
6
+ */
7
+ export const id = 'autosync'
8
+
9
+ export async function component() {
10
+ const mod = await import('../../ui/AutosyncMenuButton.jsx')
11
+ return mod.default
12
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Canvas add-widget tool module — dropdown menu for adding widgets to canvas.
3
+ *
4
+ * Wraps the CanvasCreateMenu component. Only active on canvas pages.
5
+ */
6
+ export const id = 'canvas-add-widget'
7
+
8
+ export async function component() {
9
+ const mod = await import('../../ui/CanvasCreateMenu.jsx')
10
+ return mod.default
11
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Canvas agents tool module — dropdown menu for adding agent widgets to canvas.
3
+ *
4
+ * Renders agent options from canvas.agents config. Only active on canvas pages
5
+ * when agents are configured.
6
+ */
7
+ export const id = 'canvas-agents'
8
+
9
+ export async function guard(_ctx) {
10
+ void _ctx
11
+ const { getConfig } = await import('../../index.js')
12
+ const canvasConfig = getConfig('canvas')
13
+ const agents = canvasConfig?.agents
14
+ return agents && typeof agents === 'object' && Object.keys(agents).length > 0
15
+ }
16
+
17
+ export async function component() {
18
+ const mod = await import('../../ui/CanvasAgentsMenu.jsx')
19
+ return mod.default
20
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Canvas toolbar tool module — shared actions for all canvas toolbar tools.
3
+ *
4
+ * Each canvas tool (zoom, zoom-to-fit, undo-redo, snap) references this
5
+ * handler. The component() export returns the component matching the tool's
6
+ * render type, resolved at load time via the toolConfig passed to component().
7
+ */
8
+ import { getCanvasZoom } from '../../index.js'
9
+
10
+ export const id = 'canvas-toolbar'
11
+
12
+ export async function handler() {
13
+ const { min: ZOOM_MIN, max: ZOOM_MAX, step: ZOOM_STEP } = getCanvasZoom()
14
+
15
+ return {
16
+ zoomIn(currentZoom) {
17
+ const next = Math.min(ZOOM_MAX, currentZoom + ZOOM_STEP)
18
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:set-zoom', { detail: { zoom: next } }))
19
+ },
20
+ zoomOut(currentZoom) {
21
+ const next = Math.max(ZOOM_MIN, currentZoom - ZOOM_STEP)
22
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:set-zoom', { detail: { zoom: next } }))
23
+ },
24
+ zoomReset() {
25
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:set-zoom', { detail: { zoom: 100 } }))
26
+ },
27
+ zoomToFit() {
28
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:zoom-to-fit'))
29
+ },
30
+ undo() {
31
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:undo'))
32
+ },
33
+ redo() {
34
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:redo'))
35
+ },
36
+ toggleSnap() {
37
+ document.dispatchEvent(new CustomEvent('storyboard:canvas:toggle-snap'))
38
+ },
39
+ ZOOM_MIN,
40
+ ZOOM_MAX,
41
+ }
42
+ }
43
+
44
+ const componentMap = {
45
+ 'canvas-zoom': () => import('../../ui/CanvasZoomControl.jsx'),
46
+ 'canvas-zoom-to-fit': () => import('../../ui/CanvasZoomToFit.jsx'),
47
+ 'canvas-undo-redo': () => import('../../ui/CanvasUndoRedo.jsx'),
48
+ 'canvas-snap': () => import('../../ui/CanvasSnap.jsx'),
49
+ }
50
+
51
+ export async function component(renderType) {
52
+ const loader = componentMap[renderType]
53
+ if (!loader) return null
54
+ const mod = await loader()
55
+ return mod.default
56
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Command Palette tool — toolbar button that opens the ⌘K command palette.
3
+ */
4
+ export const id = 'command-palette'
5
+
6
+ export async function component() {
7
+ const mod = await import('../../ui/CommandPaletteTrigger.jsx')
8
+ return mod.default
9
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Comments tool module — comment pins and annotation system.
3
+ *
4
+ * Guard: only mounts if comments are enabled in storyboard.config.json.
5
+ */
6
+ export const id = 'comments'
7
+
8
+ export async function guard() {
9
+ const { isCommentsEnabled } = await import('../../index.js')
10
+ return isCommentsEnabled()
11
+ }
12
+
13
+ export async function component() {
14
+ const mod = await import('../../ui/CommentsMenuButton.jsx')
15
+ return mod.default
16
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Create tool module — workshop prototype/flow/canvas creation.
3
+ *
4
+ * Loads the workshop feature registry and CreateMenuButton component.
5
+ * Guard: only mounts if at least one create feature has an overlay.
6
+ */
7
+ export const id = 'create'
8
+
9
+ export async function setup(ctx) {
10
+ const { config } = ctx
11
+ const { features } = await import('../../workshop/features/registry.js')
12
+
13
+ const createActions = Array.isArray(config.actions) ? config.actions : []
14
+ const createFeatures = createActions
15
+ .filter(a => a.feature)
16
+ .map(a => {
17
+ const feat = features[a.feature]
18
+ if (!feat || !feat.overlayId || !feat.overlay) return null
19
+ return {
20
+ name: feat.name,
21
+ label: a.label || feat.label,
22
+ overlayId: feat.overlayId,
23
+ overlay: feat.overlay,
24
+ }
25
+ })
26
+ .filter(Boolean)
27
+
28
+ return { features: createFeatures }
29
+ }
30
+
31
+ export async function guard(ctx) {
32
+ const result = await setup(ctx)
33
+ return result.features.length > 0
34
+ }
35
+
36
+ export async function component() {
37
+ const mod = await import('../../ui/CreateMenuButton.jsx')
38
+ return mod.default
39
+ }