@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,478 @@
1
+ /**
2
+ * mountStoryboardCore — single entry point for consumer apps.
3
+ *
4
+ * Initializes all storyboard systems (URL state, history, comments, devtools)
5
+ * Consumers call this once at app startup.
6
+ *
7
+ * Usage:
8
+ * import { mountStoryboardCore } from './index.js'
9
+ * import storyboardConfig from '../storyboard.config.json'
10
+ * mountStoryboardCore(storyboardConfig, { basePath: import.meta.env.BASE_URL })
11
+ */
12
+
13
+ import { installHideParamListener } from './session/interceptHideParams.js'
14
+ import { installHistorySync } from './session/hideMode.js'
15
+ import { installBodyClassSync } from './session/bodyClasses.js'
16
+ import {
17
+ initCommentsConfig, isCommentsEnabled,
18
+ initFeatureFlags,
19
+ initPlugins,
20
+ initUIConfig,
21
+ initCanvasConfig,
22
+ initCommandPaletteConfig,
23
+ initToolbarConfig, consumeClientToolbarOverrides,
24
+ initCustomerModeConfig,
25
+ getConfig,
26
+ } from './index.js'
27
+
28
+ let _mounted = false
29
+
30
+ const CHROME_HIDDEN_KEY = 'sb-chrome-hidden'
31
+ const CHROME_COMPLETELY_HIDDEN_KEY = 'sb-chrome-completely-hidden'
32
+
33
+ /**
34
+ * Migrate localStorage keys renamed in 4.3.0.
35
+ * Runs once at startup, idempotent: only copies if new key doesn't exist yet.
36
+ */
37
+ function migrateLocalStorageKeys() {
38
+ if (typeof localStorage === 'undefined') return
39
+ const renames = [
40
+ ['sb-viewfinder-starred', 'sb-workspace-starred'],
41
+ ['sb-viewfinder-recent', 'sb-workspace-recent'],
42
+ ['sb-viewfinder-group-folders', 'sb-workspace-group-folders'],
43
+ ]
44
+ for (const [oldKey, newKey] of renames) {
45
+ if (localStorage.getItem(newKey) === null && localStorage.getItem(oldKey) !== null) {
46
+ localStorage.setItem(newKey, localStorage.getItem(oldKey))
47
+ }
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Restore the saved chrome-hidden state immediately, before React mounts.
53
+ * Prevents a flash of toolbars appearing then disappearing.
54
+ */
55
+ function applyEarlyChromeState() {
56
+ if (typeof document === 'undefined' || typeof localStorage === 'undefined') return
57
+ const hidden = localStorage.getItem(CHROME_HIDDEN_KEY) === '1'
58
+ const completelyHidden = localStorage.getItem(CHROME_COMPLETELY_HIDDEN_KEY) === '1'
59
+ if (hidden) {
60
+ document.documentElement.classList.add('storyboard-chrome-hidden')
61
+ }
62
+ if (completelyHidden) {
63
+ document.documentElement.classList.add('storyboard-chrome-completely-hidden')
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Watch for changes to chrome-hidden / chrome-completely-hidden classes
69
+ * and persist to localStorage. Works regardless of which code path toggles them.
70
+ */
71
+ function installChromeStatePersistence() {
72
+ if (typeof document === 'undefined' || typeof localStorage === 'undefined') return
73
+ const observer = new MutationObserver(() => {
74
+ const hidden = document.documentElement.classList.contains('storyboard-chrome-hidden')
75
+ const completelyHidden = document.documentElement.classList.contains('storyboard-chrome-completely-hidden')
76
+ localStorage.setItem(CHROME_HIDDEN_KEY, hidden ? '1' : '0')
77
+ localStorage.setItem(CHROME_COMPLETELY_HIDDEN_KEY, completelyHidden ? '1' : '0')
78
+ })
79
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] })
80
+ }
81
+
82
+ /**
83
+ * Apply the saved theme to Primer CSS attributes immediately, before
84
+ * React mount. This prevents a flash of wrong-theme content.
85
+ * Reads the same `sb-color-scheme` localStorage key used by themeStore.
86
+ */
87
+ function applyEarlyTheme() {
88
+ if (typeof document === 'undefined') return
89
+
90
+ const stored =
91
+ typeof localStorage !== 'undefined'
92
+ ? localStorage.getItem('sb-color-scheme')
93
+ : null
94
+ const storedSync =
95
+ typeof localStorage !== 'undefined'
96
+ ? localStorage.getItem('sb-theme-sync')
97
+ : null
98
+ let syncTargets = { prototype: true, toolbar: false, codeBoxes: true, canvas: true }
99
+ if (storedSync) {
100
+ try {
101
+ syncTargets = { ...syncTargets, ...JSON.parse(storedSync) }
102
+ } catch {
103
+ // Ignore malformed persisted sync settings and use defaults.
104
+ }
105
+ }
106
+ const theme = stored || 'system'
107
+ const el = document.documentElement
108
+ const searchParams =
109
+ typeof window !== 'undefined' ? new URLSearchParams(window.location.search) : null
110
+ const forcedTarget = searchParams?.get('_sb_theme_target')
111
+
112
+ // Resolve "system" to an actual theme for data-sb-theme
113
+ let resolved = theme
114
+ if (theme === 'system') {
115
+ resolved =
116
+ typeof window !== 'undefined' &&
117
+ window.matchMedia('(prefers-color-scheme: dark)').matches
118
+ ? 'dark'
119
+ : 'light'
120
+ }
121
+
122
+ const forcePrototype = forcedTarget === 'prototype'
123
+ const forceToolbar = forcedTarget === 'toolbar'
124
+
125
+ const prototypeTheme = forcePrototype
126
+ ? resolved
127
+ : (syncTargets.prototype ? resolved : 'light')
128
+ const toolbarTheme = forceToolbar
129
+ ? resolved
130
+ : (syncTargets.toolbar ? resolved : 'light')
131
+ const codeTheme = syncTargets.codeBoxes ? resolved : 'light'
132
+ const canvasTheme = syncTargets.canvas ? resolved : 'light'
133
+
134
+ el.setAttribute('data-sb-theme', prototypeTheme)
135
+ el.setAttribute('data-sb-toolbar-theme', toolbarTheme)
136
+ el.setAttribute('data-sb-code-theme', codeTheme)
137
+ el.setAttribute('data-sb-canvas-theme', canvasTheme)
138
+
139
+ if (theme === 'system' && syncTargets.prototype) {
140
+ el.setAttribute('data-color-mode', 'auto')
141
+ el.setAttribute('data-light-theme', 'light')
142
+ el.setAttribute('data-dark-theme', 'dark')
143
+ } else if (prototypeTheme.startsWith('dark')) {
144
+ el.setAttribute('data-color-mode', 'dark')
145
+ el.setAttribute('data-dark-theme', prototypeTheme)
146
+ el.setAttribute('data-light-theme', 'light')
147
+ } else {
148
+ el.setAttribute('data-color-mode', 'light')
149
+ el.setAttribute('data-light-theme', prototypeTheme)
150
+ el.setAttribute('data-dark-theme', 'dark')
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Inject the compiled UI stylesheet if not already present.
156
+ * In the source repo, Vite bundles this CSS into the ui-entry chunk
157
+ * automatically, so this is a no-op. In consumer repos it loads the
158
+ * pre-compiled dist/storyboard-ui.css.
159
+ */
160
+ async function injectUIStyles() {
161
+ if (document.querySelector('[data-storyboard-ui-css]')) return
162
+
163
+ // If the styles are already present from Vite's CSS code-splitting,
164
+ // skip the redundant import.
165
+ try {
166
+ const val = getComputedStyle(document.documentElement).getPropertyValue('--sb--bg')
167
+ if (val && val.trim()) return
168
+ } catch { /* fall through */ }
169
+
170
+ try {
171
+ // Dynamic import of CSS — Vite handles this as a side-effect import.
172
+ // In consumer repos: loads dist/storyboard-ui.css
173
+ // In source repo: Vite injects component styles via HMR
174
+ await import('@dfosco/storyboard/ui-runtime/style.css')
175
+ } catch {
176
+ // Graceful fallback — CSS may already be loaded by other means
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Mount the full storyboard core system.
182
+ *
183
+ * @param {object} [config={}] - Contents of storyboard.config.json
184
+ * @param {object} [options={}]
185
+ * @param {string} [options.basePath='/'] - Base URL path (e.g. import.meta.env.BASE_URL)
186
+ * @param {HTMLElement} [options.container=document.body] - Where to mount devtools
187
+ * @param {Record<string, () => Promise<any>>} [options.handlers={}] - Custom tool handlers (key → lazy loader)
188
+ */
189
+ export async function mountStoryboardCore(config = {}, options = {}) {
190
+ if (_mounted) return
191
+ _mounted = true
192
+
193
+ const basePath = options.basePath || '/'
194
+ const customHandlers = options.handlers || {}
195
+
196
+ // Migrate renamed localStorage keys (4.3.0: viewfinder → workspace)
197
+ migrateLocalStorageKeys()
198
+
199
+ // Apply saved chrome-hidden state immediately — before React mount
200
+ applyEarlyChromeState()
201
+
202
+ // Apply saved theme to DOM immediately — before React mount
203
+ applyEarlyTheme()
204
+
205
+ // Initialize framework-agnostic systems
206
+ installHideParamListener()
207
+ installHistorySync()
208
+ installBodyClassSync()
209
+ installChromeStatePersistence()
210
+
211
+ // Initialize config-driven systems.
212
+ // The unified config store is already seeded by the virtual module's initConfig().
213
+ // Individual stores are initialized here for backward compatibility — consumers
214
+ // that import directly from these stores still work.
215
+ const uc = getConfig()
216
+
217
+ if (uc.featureFlags && Object.keys(uc.featureFlags).length > 0) {
218
+ initFeatureFlags(uc.featureFlags)
219
+ } else if (config.featureFlags) {
220
+ initFeatureFlags(config.featureFlags)
221
+ }
222
+
223
+ if (uc.plugins && Object.keys(uc.plugins).length > 0) {
224
+ initPlugins(uc.plugins)
225
+ } else if (config.plugins) {
226
+ initPlugins(config.plugins)
227
+ }
228
+
229
+ if (uc.ui && Object.keys(uc.ui).length > 0) {
230
+ initUIConfig(uc.ui)
231
+ } else if (config.ui) {
232
+ initUIConfig(config.ui)
233
+ }
234
+
235
+ if (uc.canvas && Object.keys(uc.canvas).length > 0) {
236
+ initCanvasConfig(uc.canvas)
237
+ } else if (config.canvas) {
238
+ initCanvasConfig(config.canvas)
239
+ }
240
+
241
+ // Load and merge command palette config.
242
+ // If the unified store has commandPalette data, use it directly.
243
+ // Otherwise fall back to legacy merging with bundled defaults.
244
+ const ucCmdPalette = uc.commandPalette
245
+ if (ucCmdPalette && Object.keys(ucCmdPalette).length > 0) {
246
+ initCommandPaletteConfig(ucCmdPalette)
247
+ } else {
248
+ const defaultCmdPaletteConfig = (await import('../../commandpalette.config.json')).default
249
+ if (config.commandPalette) {
250
+ const merged = { ...defaultCmdPaletteConfig, ...config.commandPalette }
251
+ if (config.commandPalette.sections && defaultCmdPaletteConfig.sections) {
252
+ const clientIds = new Set(config.commandPalette.sections.map(s => s.id))
253
+ const preserved = defaultCmdPaletteConfig.sections.filter(s => !clientIds.has(s.id))
254
+ merged.sections = [...config.commandPalette.sections, ...preserved]
255
+ }
256
+ initCommandPaletteConfig(merged)
257
+ } else {
258
+ initCommandPaletteConfig({ ...defaultCmdPaletteConfig })
259
+ }
260
+ }
261
+
262
+ // Initialize customer mode config
263
+ if (uc.customerMode && Object.keys(uc.customerMode).length > 0) {
264
+ initCustomerModeConfig(uc.customerMode)
265
+ } else if (config.customerMode) {
266
+ initCustomerModeConfig(config.customerMode)
267
+ }
268
+
269
+ // Initialize comments config (framework-agnostic)
270
+ const commentsConfig = uc.comments && Object.keys(uc.comments).length > 0 ? uc.comments : config.comments
271
+ if (commentsConfig) {
272
+ initCommentsConfig({ ...config, comments: commentsConfig }, { basePath })
273
+ }
274
+
275
+ // Inject compiled UI styles (await to prevent late restyle / FOUC)
276
+ await injectUIStyles()
277
+
278
+ // Load toolbar config from the unified store.
279
+ // The unified store already has core defaults merged with client overrides.
280
+ // Fall back to legacy merging if unified store wasn't seeded.
281
+ const { deepMerge } = await import('./index.js')
282
+ let toolbarConfig = uc.toolbar && Object.keys(uc.toolbar).length > 0
283
+ ? { ...uc.toolbar }
284
+ : null
285
+
286
+ if (!toolbarConfig) {
287
+ // Legacy path: unified store not seeded, merge manually
288
+ const defaultConfig = (await import('../../toolbar.config.json')).default
289
+ const clientOverrides = consumeClientToolbarOverrides()
290
+ const explicitToolbar = config.toolbar
291
+
292
+ if (explicitToolbar && clientOverrides) {
293
+ toolbarConfig = deepMerge(deepMerge(defaultConfig, clientOverrides), explicitToolbar)
294
+ } else if (explicitToolbar) {
295
+ toolbarConfig = deepMerge(defaultConfig, explicitToolbar)
296
+ } else if (clientOverrides) {
297
+ toolbarConfig = deepMerge(defaultConfig, clientOverrides)
298
+ } else {
299
+ toolbarConfig = { ...defaultConfig }
300
+ }
301
+ }
302
+
303
+ // Inject repository URL into the toolbar config
304
+ const repo = uc.repository || config.repository
305
+ if (repo?.owner && repo?.name) {
306
+ const repoUrl = `https://github.com/${repo.owner}/${repo.name}`
307
+
308
+ // New tools schema
309
+ if (toolbarConfig.tools?.repository) {
310
+ toolbarConfig.tools.repository.url = repoUrl
311
+ }
312
+
313
+ // Legacy menus schema
314
+ const commandMenu = toolbarConfig.menus?.command
315
+ if (commandMenu?.actions) {
316
+ const repoAction = commandMenu.actions.find(a => a.id === 'core/repository')
317
+ if (repoAction) repoAction.url = repoUrl
318
+ }
319
+ }
320
+
321
+ // Seed the reactive toolbar config store (core → custom merge)
322
+ initToolbarConfig(toolbarConfig)
323
+
324
+ // Skip all UI mounting when loaded inside a prototype embed iframe
325
+ const isEmbed = typeof window !== 'undefined' && new URLSearchParams(window.location.search).has('_sb_embed')
326
+ if (isEmbed) {
327
+ // Broadcast route and hash changes to the parent canvas via postMessage
328
+ if (window.parent !== window) {
329
+ let lastHref = window.location.pathname + window.location.hash
330
+ function broadcastNavigation() {
331
+ const currentHref = window.location.pathname + window.location.hash
332
+ if (currentHref !== lastHref) {
333
+ lastHref = currentHref
334
+ const basePath = (import.meta.env?.BASE_URL || '/').replace(/\/$/, '')
335
+ const pathname = window.location.pathname
336
+ const hash = window.location.hash
337
+ const stripped = basePath && pathname.startsWith(basePath)
338
+ ? pathname.slice(basePath.length) || '/'
339
+ : pathname.replace(/^\/branch--[^/]+/, '') || '/'
340
+ const src = stripped + hash
341
+ window.parent.postMessage({ type: 'storyboard:embed:navigate', src }, '*')
342
+ }
343
+ }
344
+ // Intercept pushState/replaceState, popstate, and hashchange
345
+ const origPush = history.pushState.bind(history)
346
+ const origReplace = history.replaceState.bind(history)
347
+ history.pushState = (...args) => { origPush(...args); broadcastNavigation() }
348
+ history.replaceState = (...args) => { origReplace(...args); broadcastNavigation() }
349
+ window.addEventListener('popstate', broadcastNavigation)
350
+ window.addEventListener('hashchange', broadcastNavigation)
351
+ }
352
+
353
+ // Forward cmd+wheel events to parent so canvas zoom works while
354
+ // an iframe is focused. The parent's wheel handler on `document`
355
+ // can't see events fired inside the iframe's document.
356
+ if (window.parent !== window) {
357
+ document.addEventListener('wheel', (e) => {
358
+ if (!e.metaKey && !e.ctrlKey) return
359
+ e.preventDefault()
360
+ window.parent.postMessage({
361
+ type: 'storyboard:embed:wheel',
362
+ deltaY: e.deltaY,
363
+ clientX: e.clientX,
364
+ clientY: e.clientY,
365
+ }, '*')
366
+ }, { passive: false })
367
+ }
368
+
369
+ return
370
+ }
371
+
372
+ // Dynamically import the compiled UI bundle.
373
+ // Uses the package self-reference so resolution differs by context:
374
+ // Source repo: Vite alias overrides to src/ui-entry.js (source, HMR)
375
+ // Consumer repos: package.json exports resolve to dist/storyboard-ui.js (compiled)
376
+ const ui = await import('@dfosco/storyboard/ui-runtime')
377
+
378
+ // Mount devtools (CoreUIBar)
379
+ await ui.mountDevTools({
380
+ container: options.container,
381
+ basePath,
382
+ toolbarConfig,
383
+ customHandlers,
384
+ })
385
+
386
+ // Mount comments system if configured
387
+ if (isCommentsEnabled()) {
388
+ ui.mountComments()
389
+ }
390
+
391
+ // Show pending workshop notifications (e.g. canvas created before Vite reload)
392
+ showPendingNotification(basePath)
393
+
394
+ // Handle pending navigation (e.g. after PageSelector created a new canvas page)
395
+ handlePendingNavigation()
396
+ }
397
+
398
+ /**
399
+ * Check sessionStorage for a pending navigation target.
400
+ * Used by PageSelector when creating a new canvas page — Vite does a full-reload
401
+ * after detecting the new file, so we stash the target URL and navigate after reload.
402
+ */
403
+ function handlePendingNavigation() {
404
+ try {
405
+ const target = sessionStorage.getItem('sb-pending-navigate')
406
+ if (!target) return
407
+ sessionStorage.removeItem('sb-pending-navigate')
408
+ window.location.href = target
409
+ } catch { /* ignore */ }
410
+ }
411
+
412
+ /**
413
+ * Check sessionStorage for a pending workshop creation notification.
414
+ * Vite does a full-reload when new files are created, so the create form's
415
+ * success message is lost. This shows a temporary toast with the link.
416
+ */
417
+ function showPendingNotification(basePath) {
418
+ const KEYS = ['sb-canvas-created', 'sb-prototype-created', 'sb-flow-created', 'sb-story-created']
419
+ for (const key of KEYS) {
420
+ try {
421
+ const raw = sessionStorage.getItem(key)
422
+ if (!raw) continue
423
+ sessionStorage.removeItem(key)
424
+ const { success: message, route, path: filePath } = JSON.parse(raw)
425
+ if (!message) continue
426
+ // Skip toast if we're already on the created page
427
+ if (route) {
428
+ const currentPath = window.location.pathname
429
+ const fullRoute = route.startsWith('/') ? (basePath.replace(/\/$/, '') + route) : route
430
+ if (currentPath === fullRoute || currentPath === fullRoute + '/') continue
431
+ }
432
+ showToast(message, route, basePath, filePath)
433
+ return
434
+ } catch { /* ignore malformed session entry */ }
435
+ }
436
+ }
437
+
438
+ function showToast(message, route, basePath, filePath) {
439
+ const toast = document.createElement('div')
440
+ Object.assign(toast.style, {
441
+ position: 'fixed',
442
+ bottom: '7rem',
443
+ right: '1.5rem',
444
+ zIndex: '10000',
445
+ padding: '0.75rem 1rem',
446
+ borderRadius: '0.75rem',
447
+ background: 'var(--sb--color-popover, #fff)',
448
+ color: 'var(--sb--color-foreground, #1e293b)',
449
+ fontSize: '0.8125rem',
450
+ fontFamily: "'Mona Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif",
451
+ boxShadow: '0 8px 24px rgba(0,0,0,0.15)',
452
+ border: '1px solid var(--sb--color-border, #cbd5e1)',
453
+ display: 'flex',
454
+ flexDirection: 'column',
455
+ gap: '0.25rem',
456
+ opacity: '0',
457
+ transition: 'opacity 0.15s ease',
458
+ maxWidth: '320px',
459
+ })
460
+
461
+ const href = route?.startsWith('/') ? (basePath.replace(/\/$/, '') + route) : route
462
+ let html = `<span style="font-weight:500">✓ ${message.replace(/</g, '&lt;')}</span>`
463
+ if (href) {
464
+ html += `<a href="${href}" style="color:var(--sb--color-primary, #0969da);text-decoration:underline;font-size:0.8125rem">Open canvas</a>`
465
+ }
466
+ if (filePath) {
467
+ html += `<span style="font-size:0.75rem;color:var(--sb--color-muted, #64748b)">To edit your component, go to <code style="background:var(--sb--color-muted-bg, #f1f5f9);padding:1px 4px;border-radius:3px;font-size:0.75rem">${filePath.replace(/</g, '&lt;')}</code></span>`
468
+ }
469
+ toast.innerHTML = html
470
+
471
+ document.body.appendChild(toast)
472
+ requestAnimationFrame(() => { toast.style.opacity = '1' })
473
+
474
+ setTimeout(() => {
475
+ toast.style.opacity = '0'
476
+ setTimeout(() => toast.remove(), 300)
477
+ }, 8000)
478
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "watch": [
3
+ {
4
+ "path": "src/prototypes",
5
+ "extensions": [".jsx", ".tsx", ".mdx"],
6
+ "type": "prototype"
7
+ },
8
+ {
9
+ "path": "src/canvas",
10
+ "extensions": [".canvas.jsonl"],
11
+ "type": "canvas"
12
+ }
13
+ ],
14
+ "exclude": {
15
+ "filePrefixes": ["_"],
16
+ "directories": ["node_modules", ".git", "dist", "images", ".worktrees"]
17
+ },
18
+ "debounceMs": 500,
19
+ "autocommit": {
20
+ "enabled": true,
21
+ "prefix": "[storyboard-autofix]"
22
+ }
23
+ }