@dfosco/storyboard-core 4.2.0-beta.2 → 4.2.0-beta.21

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 (414) hide show
  1. package/commandpalette.config.json +109 -24
  2. package/dist/storyboard-ui.css +1 -1
  3. package/dist/storyboard-ui.js +17379 -28568
  4. package/dist/storyboard-ui.js.map +1 -1
  5. package/dist/tailwind.css +1 -1
  6. package/package.json +5 -2
  7. package/scaffold/agents/prompt-agent.agent.md +181 -0
  8. package/scaffold/agents/terminal-agent.agent.md +351 -0
  9. package/scaffold/codex/config.toml +246 -0
  10. package/scaffold/manifest.json +5 -0
  11. package/scaffold/skills/canvas/SKILL.md +5 -4
  12. package/scaffold/skills/ship/SKILL.md +1 -1
  13. package/scaffold/storyboard.config.json +14 -1
  14. package/scaffold/toolbar.config.json +1 -1
  15. package/src/ActionMenuButton.jsx +100 -0
  16. package/src/AutosyncMenuButton.css +67 -0
  17. package/src/AutosyncMenuButton.jsx +241 -0
  18. package/src/BranchSelect.jsx +29 -0
  19. package/src/BranchSelect.module.css +30 -0
  20. package/src/CanvasAgentsMenu.jsx +87 -0
  21. package/src/CanvasCreateMenu.jsx +609 -0
  22. package/src/CanvasSnap.css +27 -0
  23. package/src/CanvasSnap.jsx +51 -0
  24. package/src/CanvasUndoRedo.css +36 -0
  25. package/src/CanvasUndoRedo.jsx +62 -0
  26. package/src/CanvasZoomControl.css +53 -0
  27. package/src/CanvasZoomControl.jsx +49 -0
  28. package/src/CanvasZoomToFit.css +18 -0
  29. package/src/CanvasZoomToFit.jsx +26 -0
  30. package/src/CommandMenu.css +8 -0
  31. package/src/CommandMenu.jsx +286 -0
  32. package/src/CommandPalette.jsx +35 -0
  33. package/src/CommandPaletteTrigger.jsx +25 -0
  34. package/src/CommentsMenuButton.jsx +38 -0
  35. package/src/CoreUIBar.css +47 -0
  36. package/src/CoreUIBar.jsx +855 -0
  37. package/src/CreateMenuButton.jsx +116 -0
  38. package/src/HideChromeTrigger.jsx +40 -0
  39. package/src/InspectorPanel.css +109 -0
  40. package/src/InspectorPanel.jsx +629 -0
  41. package/src/PwaInstallBanner.css +42 -0
  42. package/src/PwaInstallBanner.jsx +124 -0
  43. package/src/SidePanel.jsx +260 -0
  44. package/src/ThemeMenuButton.jsx +136 -0
  45. package/src/autosync/server.js +202 -5
  46. package/src/autosync/server.test.js +112 -0
  47. package/src/canvas/__tests__/agent-integration.test.js +593 -0
  48. package/src/canvas/__tests__/helpers/browser.js +95 -0
  49. package/src/canvas/__tests__/helpers/canvas-api.js +129 -0
  50. package/src/canvas/__tests__/helpers/perf.js +118 -0
  51. package/src/canvas/__tests__/helpers/setup.js +176 -0
  52. package/src/canvas/__tests__/helpers/tmux.js +130 -0
  53. package/src/canvas/__tests__/helpers/transcript.js +129 -0
  54. package/src/canvas/__tests__/terminal-integration.test.js +175 -0
  55. package/src/canvas/hot-pool.js +757 -0
  56. package/src/canvas/materializer.js +31 -0
  57. package/src/canvas/materializer.test.js +56 -0
  58. package/src/canvas/selectedWidgets.js +65 -7
  59. package/src/canvas/server.js +1801 -22
  60. package/src/canvas/server.test.js +239 -0
  61. package/src/canvas/terminal-config.js +331 -0
  62. package/src/canvas/terminal-registry.js +38 -0
  63. package/src/canvas/terminal-server.js +1037 -29
  64. package/src/canvas/writeGuard.js +51 -3
  65. package/src/canvasConfig.js +67 -1
  66. package/src/canvasConfig.test.js +79 -1
  67. package/src/cli/agent.js +85 -0
  68. package/src/cli/branch.js +232 -0
  69. package/src/cli/canvasAdd.js +59 -12
  70. package/src/cli/canvasBatch.js +98 -0
  71. package/src/cli/canvasBounds.js +1 -1
  72. package/src/cli/canvasRead.js +1 -1
  73. package/src/cli/canvasUpdate.js +179 -0
  74. package/src/cli/create.js +38 -14
  75. package/src/cli/dev.js +157 -83
  76. package/src/cli/exit.js +23 -24
  77. package/src/cli/index.js +55 -2
  78. package/src/cli/proxy.js +96 -37
  79. package/src/cli/schemas.js +22 -4
  80. package/src/cli/server.js +148 -25
  81. package/src/cli/serverUrl.js +8 -3
  82. package/src/cli/sessions.js +131 -5
  83. package/src/cli/setup.js +109 -11
  84. package/src/cli/terminal-commands.js +16 -8
  85. package/src/cli/terminal-messaging.js +231 -0
  86. package/src/cli/terminal-welcome.js +365 -33
  87. package/src/commandActions.js +1 -0
  88. package/src/commandPaletteConfig.js +9 -0
  89. package/src/comments/auth.js +2 -1
  90. package/src/comments/ui/AuthModal.jsx +114 -0
  91. package/src/comments/ui/CommentWindow.jsx +329 -0
  92. package/src/comments/ui/CommentsDrawer.jsx +102 -0
  93. package/src/comments/ui/Composer.jsx +64 -0
  94. package/src/comments/ui/authModal.test.js +1 -1
  95. package/src/comments/ui/commentWindow.js +16 -17
  96. package/src/comments/ui/commentsDrawer.js +25 -26
  97. package/src/comments/ui/composer.js +23 -24
  98. package/src/comments/ui/index.js +2 -3
  99. package/src/configSchema.js +59 -1
  100. package/src/configStore.js +161 -0
  101. package/src/core-ui-colors.css +12 -0
  102. package/src/devtools.js +17 -19
  103. package/src/devtools.test.js +18 -9
  104. package/src/featureFlags.js +12 -5
  105. package/src/fuzzySearch.test.js +10 -0
  106. package/src/index.js +14 -2
  107. package/src/lib/components/ui/alert/alert-action.jsx +11 -0
  108. package/src/lib/components/ui/alert/alert-description.jsx +11 -0
  109. package/src/lib/components/ui/alert/alert-title.jsx +11 -0
  110. package/src/lib/components/ui/alert/alert.jsx +25 -0
  111. package/src/lib/components/ui/alert/index.js +15 -15
  112. package/src/lib/components/ui/avatar/avatar-badge.jsx +22 -0
  113. package/src/lib/components/ui/avatar/avatar-fallback.jsx +18 -0
  114. package/src/lib/components/ui/avatar/avatar-group-count.jsx +19 -0
  115. package/src/lib/components/ui/avatar/avatar-group.jsx +19 -0
  116. package/src/lib/components/ui/avatar/avatar-image.jsx +15 -0
  117. package/src/lib/components/ui/avatar/avatar.jsx +19 -0
  118. package/src/lib/components/ui/avatar/index.js +20 -20
  119. package/src/lib/components/ui/badge/badge.jsx +31 -0
  120. package/src/lib/components/ui/badge/index.js +2 -2
  121. package/src/lib/components/ui/button/button.jsx +100 -0
  122. package/src/lib/components/ui/button/index.js +9 -9
  123. package/src/lib/components/ui/card/card-action.jsx +11 -0
  124. package/src/lib/components/ui/card/card-content.jsx +11 -0
  125. package/src/lib/components/ui/card/card-description.jsx +11 -0
  126. package/src/lib/components/ui/card/card-footer.jsx +11 -0
  127. package/src/lib/components/ui/card/card-header.jsx +19 -0
  128. package/src/lib/components/ui/card/card-title.jsx +11 -0
  129. package/src/lib/components/ui/card/card.jsx +17 -0
  130. package/src/lib/components/ui/card/index.js +23 -23
  131. package/src/lib/components/ui/checkbox/checkbox.jsx +29 -0
  132. package/src/lib/components/ui/checkbox/index.js +5 -5
  133. package/src/lib/components/ui/collapsible/collapsible-content.jsx +7 -0
  134. package/src/lib/components/ui/collapsible/collapsible-trigger.jsx +7 -0
  135. package/src/lib/components/ui/collapsible/collapsible.jsx +7 -0
  136. package/src/lib/components/ui/collapsible/index.js +11 -11
  137. package/src/lib/components/ui/dialog/dialog-close.jsx +7 -0
  138. package/src/lib/components/ui/dialog/dialog-content.jsx +34 -0
  139. package/src/lib/components/ui/dialog/dialog-description.jsx +15 -0
  140. package/src/lib/components/ui/dialog/dialog-footer.jsx +23 -0
  141. package/src/lib/components/ui/dialog/dialog-header.jsx +11 -0
  142. package/src/lib/components/ui/dialog/dialog-overlay.jsx +15 -0
  143. package/src/lib/components/ui/dialog/dialog-portal.jsx +4 -0
  144. package/src/lib/components/ui/dialog/dialog-title.jsx +15 -0
  145. package/src/lib/components/ui/dialog/dialog-trigger.jsx +7 -0
  146. package/src/lib/components/ui/dialog/dialog.jsx +4 -0
  147. package/src/lib/components/ui/dialog/index.js +32 -32
  148. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.jsx +8 -0
  149. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.jsx +30 -0
  150. package/src/lib/components/ui/dropdown-menu/dropdown-menu-content.jsx +22 -0
  151. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.jsx +16 -0
  152. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group.jsx +7 -0
  153. package/src/lib/components/ui/dropdown-menu/dropdown-menu-item.jsx +20 -0
  154. package/src/lib/components/ui/dropdown-menu/dropdown-menu-label.jsx +17 -0
  155. package/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.jsx +4 -0
  156. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.jsx +7 -0
  157. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.jsx +29 -0
  158. package/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.jsx +15 -0
  159. package/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.jsx +16 -0
  160. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.jsx +15 -0
  161. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.jsx +23 -0
  162. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.jsx +4 -0
  163. package/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.jsx +7 -0
  164. package/src/lib/components/ui/dropdown-menu/dropdown-menu.jsx +4 -0
  165. package/src/lib/components/ui/dropdown-menu/index.js +52 -52
  166. package/src/lib/components/ui/input/index.js +5 -5
  167. package/src/lib/components/ui/input/input.jsx +19 -0
  168. package/src/lib/components/ui/label/index.js +5 -5
  169. package/src/lib/components/ui/label/label.jsx +19 -0
  170. package/src/lib/components/ui/panel/index.js +21 -21
  171. package/src/lib/components/ui/panel/panel-body.jsx +11 -0
  172. package/src/lib/components/ui/panel/panel-close.jsx +16 -0
  173. package/src/lib/components/ui/panel/panel-content.jsx +29 -0
  174. package/src/lib/components/ui/panel/panel-footer.jsx +11 -0
  175. package/src/lib/components/ui/panel/panel-header.jsx +11 -0
  176. package/src/lib/components/ui/panel/panel-title.jsx +12 -0
  177. package/src/lib/components/ui/panel/panel.jsx +4 -0
  178. package/src/lib/components/ui/popover/index.js +26 -26
  179. package/src/lib/components/ui/popover/popover-close.jsx +7 -0
  180. package/src/lib/components/ui/popover/popover-content.jsx +22 -0
  181. package/src/lib/components/ui/popover/popover-description.jsx +11 -0
  182. package/src/lib/components/ui/popover/popover-header.jsx +11 -0
  183. package/src/lib/components/ui/popover/popover-portal.jsx +4 -0
  184. package/src/lib/components/ui/popover/popover-title.jsx +11 -0
  185. package/src/lib/components/ui/popover/popover-trigger.jsx +8 -0
  186. package/src/lib/components/ui/popover/popover.jsx +4 -0
  187. package/src/lib/components/ui/searchable-list.jsx +159 -0
  188. package/src/lib/components/ui/select/index.js +35 -35
  189. package/src/lib/components/ui/select/select-content.jsx +30 -0
  190. package/src/lib/components/ui/select/select-group-heading.jsx +17 -0
  191. package/src/lib/components/ui/select/select-group.jsx +15 -0
  192. package/src/lib/components/ui/select/select-item.jsx +26 -0
  193. package/src/lib/components/ui/select/select-label.jsx +11 -0
  194. package/src/lib/components/ui/select/select-portal.jsx +4 -0
  195. package/src/lib/components/ui/select/select-scroll-down-button.jsx +18 -0
  196. package/src/lib/components/ui/select/select-scroll-up-button.jsx +18 -0
  197. package/src/lib/components/ui/select/select-separator.jsx +15 -0
  198. package/src/lib/components/ui/select/select-trigger.jsx +25 -0
  199. package/src/lib/components/ui/select/select.jsx +4 -0
  200. package/src/lib/components/ui/separator/index.js +5 -5
  201. package/src/lib/components/ui/separator/separator.jsx +22 -0
  202. package/src/lib/components/ui/sheet/index.js +32 -32
  203. package/src/lib/components/ui/sheet/sheet-close.jsx +7 -0
  204. package/src/lib/components/ui/sheet/sheet-content.jsx +35 -0
  205. package/src/lib/components/ui/sheet/sheet-description.jsx +15 -0
  206. package/src/lib/components/ui/sheet/sheet-footer.jsx +11 -0
  207. package/src/lib/components/ui/sheet/sheet-header.jsx +11 -0
  208. package/src/lib/components/ui/sheet/sheet-overlay.jsx +15 -0
  209. package/src/lib/components/ui/sheet/sheet-portal.jsx +4 -0
  210. package/src/lib/components/ui/sheet/sheet-title.jsx +15 -0
  211. package/src/lib/components/ui/sheet/sheet-trigger.jsx +7 -0
  212. package/src/lib/components/ui/sheet/sheet.jsx +4 -0
  213. package/src/lib/components/ui/textarea/index.js +5 -5
  214. package/src/lib/components/ui/textarea/textarea.jsx +18 -0
  215. package/src/lib/components/ui/toggle/index.js +6 -9
  216. package/src/lib/components/ui/toggle/toggle.jsx +36 -0
  217. package/src/lib/components/ui/toggle-group/index.js +8 -8
  218. package/src/lib/components/ui/toggle-group/toggle-group-item.jsx +29 -0
  219. package/src/lib/components/ui/toggle-group/toggle-group.jsx +43 -0
  220. package/src/lib/components/ui/tooltip/index.js +3 -3
  221. package/src/lib/components/ui/tooltip/tooltip-content.jsx +21 -0
  222. package/src/lib/components/ui/tooltip/tooltip-trigger.jsx +23 -0
  223. package/src/lib/components/ui/tooltip/tooltip.jsx +11 -0
  224. package/src/lib/components/ui/trigger-button/index.js +3 -3
  225. package/src/lib/components/ui/trigger-button/trigger-button.css +38 -0
  226. package/src/lib/components/ui/trigger-button/trigger-button.jsx +63 -0
  227. package/src/logger/devLogger.js +238 -0
  228. package/src/logger/devLogger.test.js +193 -0
  229. package/src/modes.test.js +4 -4
  230. package/src/mountStoryboardCore.js +123 -27
  231. package/src/paletteProviders.js +3 -0
  232. package/src/paletteProviders.test.js +2 -2
  233. package/src/server/index.js +98 -36
  234. package/src/sidepanel.css +214 -0
  235. package/src/styles/tailwind.css +1 -1
  236. package/src/svelte-plugin-ui/__tests__/ModeSwitch.test.ts +8 -8
  237. package/src/svelte-plugin-ui/__tests__/ToolbarShell.test.ts +11 -10
  238. package/src/svelte-plugin-ui/components/Icon.css +11 -0
  239. package/src/svelte-plugin-ui/components/Icon.jsx +281 -0
  240. package/src/svelte-plugin-ui/components/ModeSwitch.css +90 -0
  241. package/src/svelte-plugin-ui/components/ModeSwitch.jsx +47 -0
  242. package/src/svelte-plugin-ui/components/ToolbarShell.css +80 -0
  243. package/src/svelte-plugin-ui/components/ToolbarShell.jsx +84 -0
  244. package/src/svelte-plugin-ui/components/Viewfinder.css +412 -0
  245. package/src/svelte-plugin-ui/components/Viewfinder.jsx +512 -0
  246. package/src/svelte-plugin-ui/mount.ts +12 -16
  247. package/src/toolRegistry.js +4 -4
  248. package/src/toolbarConfigStore.js +30 -0
  249. package/src/tools/handlers/autosync.js +1 -1
  250. package/src/tools/handlers/canvasAddWidget.js +1 -1
  251. package/src/tools/handlers/canvasAgents.js +19 -0
  252. package/src/tools/handlers/canvasToolbar.js +8 -8
  253. package/src/tools/handlers/commandPalette.js +9 -0
  254. package/src/tools/handlers/comments.js +1 -1
  255. package/src/tools/handlers/create.js +1 -1
  256. package/src/tools/handlers/devtools.js +16 -0
  257. package/src/tools/handlers/devtools.test.js +38 -0
  258. package/src/tools/handlers/flows.js +1 -1
  259. package/src/tools/handlers/hideChrome.js +9 -0
  260. package/src/tools/handlers/paletteTheme.js +35 -0
  261. package/src/tools/handlers/theme.js +1 -1
  262. package/src/tools/registry.js +4 -1
  263. package/src/tools/surfaces/commandList.js +3 -3
  264. package/src/tools/surfaces/mainToolbar.js +3 -3
  265. package/src/tools/surfaces/registry.js +4 -4
  266. package/src/ui/design-modes.ts +2 -2
  267. package/src/ui/viewfinder.ts +1 -1
  268. package/src/vite/server-plugin.js +242 -60
  269. package/src/workshop/features/createCanvas/CreateCanvasForm.jsx +260 -0
  270. package/src/workshop/features/createCanvas/index.js +1 -1
  271. package/src/workshop/features/createFlow/CreateFlowForm.jsx +334 -0
  272. package/src/workshop/features/createFlow/index.js +1 -1
  273. package/src/workshop/features/createPage/CreatePageForm.jsx +304 -0
  274. package/src/workshop/features/createPage/index.js +1 -1
  275. package/src/workshop/features/createPrototype/CreatePrototypeForm.jsx +289 -0
  276. package/src/workshop/features/createPrototype/index.js +1 -1
  277. package/src/workshop/features/createPrototype/server.js +98 -0
  278. package/src/workshop/features/createStory/CreateStoryForm.jsx +208 -0
  279. package/src/workshop/features/createStory/index.js +1 -1
  280. package/src/workshop/ui/WorkshopPanel.jsx +98 -0
  281. package/src/workshop/ui/mount.ts +1 -1
  282. package/src/worktree/port.js +48 -0
  283. package/src/worktree/serverRegistry.js +120 -0
  284. package/toolbar.config.json +93 -42
  285. package/widgets.config.json +580 -12
  286. package/src/ActionMenuButton.svelte +0 -119
  287. package/src/AutosyncMenuButton.svelte +0 -397
  288. package/src/CanvasCreateMenu.svelte +0 -295
  289. package/src/CanvasSnap.svelte +0 -87
  290. package/src/CanvasUndoRedo.svelte +0 -108
  291. package/src/CanvasZoomControl.svelte +0 -111
  292. package/src/CanvasZoomToFit.svelte +0 -52
  293. package/src/CommandMenu.svelte +0 -249
  294. package/src/CommandPalette.svelte +0 -33
  295. package/src/CommentsMenuButton.svelte +0 -53
  296. package/src/CoreUIBar.svelte +0 -847
  297. package/src/CreateMenuButton.svelte +0 -133
  298. package/src/DocPanel.svelte +0 -299
  299. package/src/InspectorPanel.svelte +0 -745
  300. package/src/PwaInstallBanner.svelte +0 -124
  301. package/src/SidePanel.svelte +0 -480
  302. package/src/ThemeMenuButton.svelte +0 -132
  303. package/src/comments/ui/AuthModal.svelte +0 -108
  304. package/src/comments/ui/CommentWindow.svelte +0 -333
  305. package/src/comments/ui/CommentsDrawer.svelte +0 -96
  306. package/src/comments/ui/Composer.svelte +0 -65
  307. package/src/lib/components/ui/alert/alert-action.svelte +0 -19
  308. package/src/lib/components/ui/alert/alert-description.svelte +0 -22
  309. package/src/lib/components/ui/alert/alert-title.svelte +0 -22
  310. package/src/lib/components/ui/alert/alert.svelte +0 -38
  311. package/src/lib/components/ui/avatar/avatar-badge.svelte +0 -25
  312. package/src/lib/components/ui/avatar/avatar-fallback.svelte +0 -20
  313. package/src/lib/components/ui/avatar/avatar-group-count.svelte +0 -22
  314. package/src/lib/components/ui/avatar/avatar-group.svelte +0 -22
  315. package/src/lib/components/ui/avatar/avatar-image.svelte +0 -17
  316. package/src/lib/components/ui/avatar/avatar.svelte +0 -24
  317. package/src/lib/components/ui/badge/badge.svelte +0 -44
  318. package/src/lib/components/ui/button/button.svelte +0 -108
  319. package/src/lib/components/ui/card/card-action.svelte +0 -21
  320. package/src/lib/components/ui/card/card-content.svelte +0 -19
  321. package/src/lib/components/ui/card/card-description.svelte +0 -19
  322. package/src/lib/components/ui/card/card-footer.svelte +0 -18
  323. package/src/lib/components/ui/card/card-header.svelte +0 -21
  324. package/src/lib/components/ui/card/card-title.svelte +0 -14
  325. package/src/lib/components/ui/card/card.svelte +0 -21
  326. package/src/lib/components/ui/checkbox/checkbox.svelte +0 -39
  327. package/src/lib/components/ui/collapsible/collapsible-content.svelte +0 -7
  328. package/src/lib/components/ui/collapsible/collapsible-trigger.svelte +0 -7
  329. package/src/lib/components/ui/collapsible/collapsible.svelte +0 -11
  330. package/src/lib/components/ui/dialog/dialog-close.svelte +0 -11
  331. package/src/lib/components/ui/dialog/dialog-content.svelte +0 -42
  332. package/src/lib/components/ui/dialog/dialog-description.svelte +0 -17
  333. package/src/lib/components/ui/dialog/dialog-footer.svelte +0 -29
  334. package/src/lib/components/ui/dialog/dialog-header.svelte +0 -19
  335. package/src/lib/components/ui/dialog/dialog-overlay.svelte +0 -17
  336. package/src/lib/components/ui/dialog/dialog-portal.svelte +0 -7
  337. package/src/lib/components/ui/dialog/dialog-title.svelte +0 -17
  338. package/src/lib/components/ui/dialog/dialog-trigger.svelte +0 -11
  339. package/src/lib/components/ui/dialog/dialog.svelte +0 -7
  340. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +0 -16
  341. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -40
  342. package/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -27
  343. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -18
  344. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
  345. package/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -24
  346. package/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -20
  347. package/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte +0 -7
  348. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
  349. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -34
  350. package/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
  351. package/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -19
  352. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -17
  353. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -27
  354. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte +0 -7
  355. package/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
  356. package/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte +0 -7
  357. package/src/lib/components/ui/input/input.svelte +0 -40
  358. package/src/lib/components/ui/label/label.svelte +0 -20
  359. package/src/lib/components/ui/panel/panel-body.svelte +0 -13
  360. package/src/lib/components/ui/panel/panel-close.svelte +0 -16
  361. package/src/lib/components/ui/panel/panel-content.svelte +0 -33
  362. package/src/lib/components/ui/panel/panel-footer.svelte +0 -13
  363. package/src/lib/components/ui/panel/panel-header.svelte +0 -16
  364. package/src/lib/components/ui/panel/panel-title.svelte +0 -14
  365. package/src/lib/components/ui/panel/panel.svelte +0 -15
  366. package/src/lib/components/ui/popover/popover-close.svelte +0 -7
  367. package/src/lib/components/ui/popover/popover-content.svelte +0 -27
  368. package/src/lib/components/ui/popover/popover-description.svelte +0 -19
  369. package/src/lib/components/ui/popover/popover-header.svelte +0 -19
  370. package/src/lib/components/ui/popover/popover-portal.svelte +0 -7
  371. package/src/lib/components/ui/popover/popover-title.svelte +0 -19
  372. package/src/lib/components/ui/popover/popover-trigger.svelte +0 -17
  373. package/src/lib/components/ui/popover/popover.svelte +0 -7
  374. package/src/lib/components/ui/select/select-content.svelte +0 -40
  375. package/src/lib/components/ui/select/select-group-heading.svelte +0 -19
  376. package/src/lib/components/ui/select/select-group.svelte +0 -17
  377. package/src/lib/components/ui/select/select-item.svelte +0 -38
  378. package/src/lib/components/ui/select/select-label.svelte +0 -18
  379. package/src/lib/components/ui/select/select-portal.svelte +0 -7
  380. package/src/lib/components/ui/select/select-scroll-down-button.svelte +0 -20
  381. package/src/lib/components/ui/select/select-scroll-up-button.svelte +0 -20
  382. package/src/lib/components/ui/select/select-separator.svelte +0 -17
  383. package/src/lib/components/ui/select/select-trigger.svelte +0 -27
  384. package/src/lib/components/ui/select/select.svelte +0 -11
  385. package/src/lib/components/ui/separator/separator.svelte +0 -23
  386. package/src/lib/components/ui/sheet/sheet-close.svelte +0 -7
  387. package/src/lib/components/ui/sheet/sheet-content.svelte +0 -43
  388. package/src/lib/components/ui/sheet/sheet-description.svelte +0 -17
  389. package/src/lib/components/ui/sheet/sheet-footer.svelte +0 -18
  390. package/src/lib/components/ui/sheet/sheet-header.svelte +0 -19
  391. package/src/lib/components/ui/sheet/sheet-overlay.svelte +0 -17
  392. package/src/lib/components/ui/sheet/sheet-portal.svelte +0 -7
  393. package/src/lib/components/ui/sheet/sheet-title.svelte +0 -17
  394. package/src/lib/components/ui/sheet/sheet-trigger.svelte +0 -7
  395. package/src/lib/components/ui/sheet/sheet.svelte +0 -7
  396. package/src/lib/components/ui/textarea/textarea.svelte +0 -21
  397. package/src/lib/components/ui/toggle/toggle.svelte +0 -45
  398. package/src/lib/components/ui/toggle-group/toggle-group-item.svelte +0 -35
  399. package/src/lib/components/ui/toggle-group/toggle-group.svelte +0 -63
  400. package/src/lib/components/ui/tooltip/tooltip-content.svelte +0 -24
  401. package/src/lib/components/ui/tooltip/tooltip-trigger.svelte +0 -27
  402. package/src/lib/components/ui/tooltip/tooltip.svelte +0 -9
  403. package/src/lib/components/ui/trigger-button/trigger-button.svelte +0 -106
  404. package/src/svelte-plugin-ui/components/Icon.svelte +0 -181
  405. package/src/svelte-plugin-ui/components/ModeSwitch.svelte +0 -121
  406. package/src/svelte-plugin-ui/components/ToolbarShell.svelte +0 -150
  407. package/src/svelte-plugin-ui/components/Viewfinder.svelte +0 -1001
  408. package/src/tools/handlers/docs.js +0 -11
  409. package/src/workshop/features/createCanvas/CreateCanvasForm.svelte +0 -139
  410. package/src/workshop/features/createFlow/CreateFlowForm.svelte +0 -314
  411. package/src/workshop/features/createPage/CreatePageForm.svelte +0 -249
  412. package/src/workshop/features/createPrototype/CreatePrototypeForm.svelte +0 -287
  413. package/src/workshop/features/createStory/CreateStoryForm.svelte +0 -161
  414. package/src/workshop/ui/WorkshopPanel.svelte +0 -97
@@ -1,295 +0,0 @@
1
- <!--
2
- CanvasCreateMenu — CoreUIBar dropdown for adding widgets to the active canvas.
3
- Dispatches custom events to bridge Svelte → React.
4
- Only visible when a canvas page is active.
5
- -->
6
-
7
- <script lang="ts">
8
- import { TriggerButton } from './lib/components/ui/trigger-button/index.js'
9
- import * as DropdownMenu from './lib/components/ui/dropdown-menu/index.js'
10
- import { Button } from './lib/components/ui/button/index.js'
11
- import { Input } from './lib/components/ui/input/index.js'
12
- import { Label } from './lib/components/ui/label/index.js'
13
- import Icon from './svelte-plugin-ui/components/Icon.svelte'
14
-
15
- interface Props {
16
- config?: any
17
- data?: any
18
- canvasName?: string
19
- zoom?: number
20
- tabindex?: number
21
- }
22
-
23
- let { config = {}, data, canvasName = '', zoom, tabindex }: Props = $props()
24
-
25
- const widgetTypes = [
26
- { type: 'sticky-note', label: 'Sticky Note' },
27
- { type: 'markdown', label: 'Markdown' },
28
- { type: 'prototype', label: 'Prototype' },
29
- ]
30
-
31
- interface StoryEntry {
32
- name: string
33
- path: string
34
- exports: string[]
35
- }
36
-
37
- type View = 'menu' | 'create' | 'notification'
38
-
39
- let menuOpen = $state(false)
40
- let view: View = $state('menu')
41
- let stories: StoryEntry[] = $state([])
42
- let storiesLoaded = $state(false)
43
-
44
- // Create form state
45
- let createName = $state('')
46
- let createLocation = $state('canvas')
47
- let createFormat = $state('jsx')
48
- let submitting = $state(false)
49
- let createError: string | null = $state(null)
50
- let notificationPath: string | null = $state(null)
51
-
52
- const kebabName = $derived(
53
- createName.replace(/[^a-zA-Z0-9\s_-]/g, '').trim().replace(/[\s_]+/g, '-').toLowerCase().replace(/-+/g, '-').replace(/^-|-$/g, '')
54
- )
55
- const nameError = $derived(
56
- createName.trim() && !kebabName ? 'Name must contain at least one alphanumeric character' : null
57
- )
58
- const filePreview = $derived(
59
- kebabName ? `${kebabName}.story.${createFormat}` : ''
60
- )
61
- const canSubmit = $derived(!!kebabName && !nameError && !submitting)
62
-
63
- function getApiUrl() {
64
- const basePath = (window as any).__STORYBOARD_BASE_PATH__ || '/'
65
- return basePath.replace(/\/$/, '') + '/_storyboard/canvas'
66
- }
67
-
68
- async function loadStories() {
69
- try {
70
- const res = await fetch(getApiUrl() + '/stories')
71
- if (res.ok) {
72
- const data = await res.json()
73
- stories = data.stories || []
74
- }
75
- } catch { /* ignore */ }
76
- storiesLoaded = true
77
- }
78
-
79
- // Load stories when menu opens
80
- $effect(() => {
81
- if (menuOpen) loadStories()
82
- })
83
-
84
- // Focus the first menu item when the dropdown opens
85
- $effect(() => {
86
- if (menuOpen && view === 'menu') {
87
- requestAnimationFrame(() => {
88
- const item = document.querySelector('[data-bits-dropdown-menu-content] [data-bits-dropdown-menu-item]:not([data-disabled])') as HTMLElement
89
- item?.focus()
90
- })
91
- }
92
- })
93
-
94
- // Reset view when menu closes (but not during view transitions)
95
- $effect(() => {
96
- if (!menuOpen && view === 'menu') {
97
- resetCreateForm()
98
- }
99
- })
100
-
101
- function resetCreateForm() {
102
- createName = ''
103
- createLocation = 'canvas'
104
- createFormat = 'jsx'
105
- createError = null
106
- submitting = false
107
- }
108
-
109
- function addWidget(type: string) {
110
- document.dispatchEvent(new CustomEvent('storyboard:canvas:add-widget', {
111
- detail: { type, canvasName }
112
- }))
113
- menuOpen = false
114
- }
115
-
116
- function addStoryWidget(storyId: string) {
117
- document.dispatchEvent(new CustomEvent('storyboard:canvas:add-story-widget', {
118
- detail: { storyId, canvasName }
119
- }))
120
- menuOpen = false
121
- }
122
-
123
- function showCreateForm() {
124
- resetCreateForm()
125
- view = 'create'
126
- }
127
-
128
- async function submitCreate() {
129
- if (!canSubmit) return
130
- submitting = true; createError = null
131
- try {
132
- const bridgeState = (window as any).__storyboardCanvasBridgeState
133
- const activeCanvasId = bridgeState?.canvasId || bridgeState?.name || canvasName
134
-
135
- const res = await fetch(getApiUrl() + '/create-story', {
136
- method: 'POST',
137
- headers: { 'Content-Type': 'application/json' },
138
- body: JSON.stringify({
139
- name: kebabName,
140
- location: createLocation,
141
- format: createFormat,
142
- canvasName: createLocation === 'canvas' ? activeCanvasId : undefined,
143
- }),
144
- })
145
- const data = await res.json()
146
- if (!res.ok) { createError = data.error || 'Failed to create component'; submitting = false; return }
147
-
148
- // Add the new component to the canvas
149
- addStoryWidget(data.name)
150
-
151
- // Show inline notification
152
- notificationPath = data.path
153
- view = 'notification'
154
- menuOpen = true
155
-
156
- // Refresh story list for next time
157
- storiesLoaded = false
158
-
159
- // Auto-dismiss after 6 seconds
160
- setTimeout(() => {
161
- if (view === 'notification') {
162
- menuOpen = false
163
- view = 'menu'
164
- notificationPath = null
165
- }
166
- }, 6000)
167
- } catch (err: any) { createError = err.message || 'Network error' } finally { submitting = false }
168
- }
169
- </script>
170
-
171
- <DropdownMenu.Root bind:open={menuOpen} onOpenChange={(open) => {
172
- if (!open && view !== 'menu') {
173
- // User dismissed the panel — reset everything
174
- view = 'menu'
175
- notificationPath = null
176
- resetCreateForm()
177
- }
178
- }}>
179
- <DropdownMenu.Trigger>
180
- {#snippet child({ props })}
181
- <TriggerButton
182
- active={menuOpen}
183
- size="icon-xl"
184
- aria-label={config.ariaLabel || 'Add widget'}
185
- {tabindex}
186
- {...props}
187
- >
188
- {#if config.icon}
189
- <Icon name={config.icon} size={16} {...(config.meta || {})} />
190
- {:else}
191
- +
192
- {/if}
193
- </TriggerButton>
194
- {/snippet}
195
- </DropdownMenu.Trigger>
196
-
197
- <DropdownMenu.Content side="top" align="start" sideOffset={16} class="min-w-[180px]" style={config.menuWidth ? `width: ${config.menuWidth}` : ''} onInteractOutside={(e) => { if (view === 'create') e.preventDefault() }}>
198
- {#if view === 'menu'}
199
- <DropdownMenu.Label>Add to canvas</DropdownMenu.Label>
200
- {#each widgetTypes as wt (wt.type)}
201
- <DropdownMenu.Item onclick={() => addWidget(wt.type)}>
202
- {wt.label}
203
- </DropdownMenu.Item>
204
- {/each}
205
-
206
- <DropdownMenu.Sub>
207
- <DropdownMenu.SubTrigger>Component</DropdownMenu.SubTrigger>
208
- <DropdownMenu.SubContent class="min-w-[200px] max-h-[320px] overflow-y-auto">
209
- <button
210
- class="relative flex cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent hover:text-accent-foreground w-full text-left bg-transparent border-none"
211
- onclick={(e) => { e.preventDefault(); e.stopPropagation(); showCreateForm() }}
212
- onpointerdown={(e) => e.stopPropagation()}
213
- >
214
- <span class="font-medium">Create new component…</span>
215
- </button>
216
- {#if stories.length > 0}
217
- <DropdownMenu.Separator />
218
- <DropdownMenu.Label>Existing stories</DropdownMenu.Label>
219
- {#each stories as story (story.name)}
220
- <DropdownMenu.Item onclick={() => addStoryWidget(story.name)}>
221
- <span class="flex flex-col">
222
- <span>{story.name}</span>
223
- <span class="text-xs text-muted-foreground">{story.path}</span>
224
- </span>
225
- </DropdownMenu.Item>
226
- {/each}
227
- {/if}
228
- </DropdownMenu.SubContent>
229
- </DropdownMenu.Sub>
230
-
231
- <DropdownMenu.Separator />
232
- <div class="px-2 py-1.5 text-xs text-muted-foreground flex flex-row items-baseline"><span class="inline-flex w-2 h-2 rounded-full mr-1.5" style="background: hsl(212, 92%, 45%)"></span>Only available in dev environment</div>
233
-
234
- {:else if view === 'create'}
235
- <!-- svelte-ignore a11y_no_static_element_interactions -->
236
- <div class="p-3 space-y-3 min-w-[280px]" onkeydown={(e) => { if (e.key === 'Enter' && canSubmit) submitCreate(); if (e.key === 'Escape') { view = 'menu' } }} onclick={(e) => e.stopPropagation()} onpointerdown={(e) => e.stopPropagation()}>
237
- <div class="flex items-center justify-between">
238
- <span class="text-sm font-medium">Create component</span>
239
- <button class="text-muted-foreground hover:text-foreground text-xs bg-transparent border-none cursor-pointer p-0.5" onclick={() => { view = 'menu' }}>← Back</button>
240
- </div>
241
-
242
- <div class="space-y-1">
243
- <Label for="sb-create-comp-name" class="text-xs">Name</Label>
244
- <Input id="sb-create-comp-name" placeholder="e.g. user-card" autocomplete="off" spellcheck="false" bind:value={createName} class="h-8 text-sm" />
245
- {#if nameError}<p class="text-xs text-destructive">{nameError}</p>{/if}
246
- {#if filePreview}<p class="text-xs text-muted-foreground">{filePreview}</p>{/if}
247
- </div>
248
-
249
- <fieldset class="space-y-1">
250
- <Label class="text-xs">Location</Label>
251
- <div class="flex flex-col gap-1">
252
- <label class="flex items-center gap-1.5 text-xs cursor-pointer">
253
- <input type="radio" name="sb-create-location" value="canvas" bind:group={createLocation} class="accent-primary" />
254
- This canvas directory
255
- </label>
256
- <label class="flex items-center gap-1.5 text-xs cursor-pointer">
257
- <input type="radio" name="sb-create-location" value="components" bind:group={createLocation} class="accent-primary" />
258
- <code class="text-xs">src/components/</code>
259
- </label>
260
- </div>
261
- </fieldset>
262
-
263
- <fieldset class="space-y-1">
264
- <Label class="text-xs">Format</Label>
265
- <div class="flex gap-3">
266
- <label class="flex items-center gap-1.5 text-xs cursor-pointer">
267
- <input type="radio" name="sb-create-format" value="jsx" bind:group={createFormat} class="accent-primary" />
268
- JSX
269
- </label>
270
- <label class="flex items-center gap-1.5 text-xs cursor-pointer">
271
- <input type="radio" name="sb-create-format" value="tsx" bind:group={createFormat} class="accent-primary" />
272
- TSX
273
- </label>
274
- </div>
275
- </fieldset>
276
-
277
- {#if createError}<p class="text-xs text-destructive">{createError}</p>{/if}
278
-
279
- <div class="flex gap-2 justify-end pt-1">
280
- <Button variant="outline" size="sm" onclick={() => { view = 'menu' }}>Cancel</Button>
281
- <Button size="sm" onclick={submitCreate} disabled={!canSubmit}>{submitting ? 'Creating…' : 'Create'}</Button>
282
- </div>
283
- </div>
284
-
285
- {:else if view === 'notification'}
286
- <div class="p-3 min-w-[260px] space-y-1">
287
- <p class="text-sm font-medium">✓ Component added to canvas</p>
288
- {#if notificationPath}
289
- <p class="text-xs text-muted-foreground">To edit your component, go to</p>
290
- <code class="text-xs block bg-muted px-2 py-1 rounded">{notificationPath}</code>
291
- {/if}
292
- </div>
293
- {/if}
294
- </DropdownMenu.Content>
295
- </DropdownMenu.Root>
@@ -1,87 +0,0 @@
1
- <!--
2
- CanvasSnap — standalone snap-to-grid toggle button.
3
- -->
4
- <script lang="ts">
5
- import { onMount, onDestroy } from 'svelte'
6
- import * as Tooltip from './lib/components/ui/tooltip/index.js'
7
- import Icon from './svelte-plugin-ui/components/Icon.svelte'
8
-
9
- interface Props {
10
- config?: any
11
- data?: any
12
- tabindex?: number
13
- }
14
-
15
- let { config = {}, data, tabindex = -1 }: Props = $props()
16
-
17
- let snapEnabled = $state(false)
18
-
19
- function handleSnapState(e: CustomEvent) {
20
- snapEnabled = !!e.detail?.snapEnabled
21
- }
22
-
23
- onMount(() => {
24
- document.addEventListener('storyboard:canvas:snap-state', handleSnapState as EventListener)
25
- // Broadcast configured gridSize to React on mount
26
- const gridSize = config.gridSize
27
- if (gridSize) {
28
- document.dispatchEvent(new CustomEvent('storyboard:canvas:grid-size', {
29
- detail: { gridSize }
30
- }))
31
- }
32
- // Request current snap state from React (may have dispatched before we mounted)
33
- document.dispatchEvent(new CustomEvent('storyboard:canvas:snap-state-request'))
34
- })
35
-
36
- onDestroy(() => {
37
- document.removeEventListener('storyboard:canvas:snap-state', handleSnapState as EventListener)
38
- })
39
- </script>
40
-
41
- {#if data}
42
- <Tooltip.Root>
43
- <Tooltip.Trigger>
44
- <button
45
- class="canvas-snap-btn"
46
- class:canvas-snap-btn-active={snapEnabled}
47
- onclick={() => data.toggleSnap()}
48
- aria-label={config.label || 'Snap to grid'}
49
- aria-pressed={snapEnabled}
50
- {tabindex}
51
- >
52
- <Icon name={config.icon || 'iconoir/view-grid'} size={16} {...(config.meta || {})} />
53
- </button>
54
- </Tooltip.Trigger>
55
- <Tooltip.Content side="top">{snapEnabled ? (config.labelOn || 'Snap to grid (on)') : (config.labelOff || 'Snap to grid (off)')}</Tooltip.Content>
56
- </Tooltip.Root>
57
- {/if}
58
-
59
- <style>
60
- .canvas-snap-btn {
61
- all: unset;
62
- cursor: pointer;
63
- display: flex;
64
- align-items: center;
65
- justify-content: center;
66
- width: 38px;
67
- height: 38px;
68
- border-radius: 10px;
69
- border: 2.5px solid var(--sb--trigger-border, var(--color-slate-400));
70
- background: var(--sb--trigger-bg, var(--color-slate-100));
71
- color: var(--sb--trigger-text, var(--color-slate-600));
72
- transition: background 120ms;
73
- }
74
-
75
- .canvas-snap-btn:hover:not(:disabled) {
76
- background: var(--sb--trigger-bg-hover, var(--color-slate-300));
77
- }
78
-
79
- .canvas-snap-btn-active {
80
- background: var(--sb--trigger-bg-hover, var(--color-slate-300));
81
- border-color: var(--sb--trigger-text, var(--color-slate-600));
82
- }
83
-
84
- .canvas-snap-btn-active:hover {
85
- opacity: 0.85;
86
- }
87
- </style>
@@ -1,108 +0,0 @@
1
- <!--
2
- CanvasUndoRedo — grouped undo/redo button bar.
3
- -->
4
- <script lang="ts">
5
- import { onMount, onDestroy } from 'svelte'
6
- import * as Tooltip from './lib/components/ui/tooltip/index.js'
7
-
8
- interface Props {
9
- config?: any
10
- data?: any
11
- tabindex?: number
12
- }
13
-
14
- let { config = {}, data, tabindex = -1 }: Props = $props()
15
-
16
- let canUndo = $state(false)
17
- let canRedo = $state(false)
18
-
19
- function handleUndoRedoState(e: CustomEvent) {
20
- canUndo = !!e.detail?.canUndo
21
- canRedo = !!e.detail?.canRedo
22
- }
23
-
24
- onMount(() => {
25
- document.addEventListener('storyboard:canvas:undo-redo-state', handleUndoRedoState as EventListener)
26
- })
27
-
28
- onDestroy(() => {
29
- document.removeEventListener('storyboard:canvas:undo-redo-state', handleUndoRedoState as EventListener)
30
- })
31
- </script>
32
-
33
- {#if data}
34
- <div class="canvas-undo-bar" role="group" aria-label={config.ariaLabel || 'Undo and redo'}>
35
- <Tooltip.Root>
36
- <Tooltip.Trigger>
37
- <button
38
- class="canvas-undo-btn"
39
- onclick={() => data.undo()}
40
- disabled={!canUndo}
41
- aria-label="Undo"
42
- {tabindex}
43
- >
44
- <svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
45
- <path d="M6.78 1.97a.75.75 0 0 1 0 1.06L3.81 6h6.44A4.75 4.75 0 0 1 15 10.75v2.5a.75.75 0 0 1-1.5 0v-2.5a3.25 3.25 0 0 0-3.25-3.25H3.81l2.97 2.97a.75.75 0 1 1-1.06 1.06L1.47 7.28a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0Z" />
46
- </svg>
47
- </button>
48
- </Tooltip.Trigger>
49
- <Tooltip.Content side="top">Undo (⌘Z)</Tooltip.Content>
50
- </Tooltip.Root>
51
- <span class="canvas-undo-separator"></span>
52
- <Tooltip.Root>
53
- <Tooltip.Trigger>
54
- <button
55
- class="canvas-undo-btn"
56
- onclick={() => data.redo()}
57
- disabled={!canRedo}
58
- aria-label="Redo"
59
- tabindex={-1}
60
- >
61
- <svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true">
62
- <path d="M9.22 1.97a.75.75 0 0 0 0 1.06L12.19 6H5.75A4.75 4.75 0 0 0 1 10.75v2.5a.75.75 0 0 0 1.5 0v-2.5a3.25 3.25 0 0 1 3.25-3.25h6.44l-2.97 2.97a.75.75 0 1 0 1.06 1.06l4.25-4.25a.75.75 0 0 0 0-1.06l-4.25-4.25a.75.75 0 0 0-1.06 0Z" />
63
- </svg>
64
- </button>
65
- </Tooltip.Trigger>
66
- <Tooltip.Content side="top">Redo (⌘⇧Z)</Tooltip.Content>
67
- </Tooltip.Root>
68
- </div>
69
- {/if}
70
-
71
- <style>
72
- .canvas-undo-bar {
73
- display: flex;
74
- align-items: center;
75
- border-radius: 10px;
76
- border: 2.5px solid var(--sb--trigger-border, var(--color-slate-400));
77
- background: var(--sb--trigger-bg, var(--color-slate-100));
78
- overflow: hidden;
79
- }
80
-
81
- .canvas-undo-btn {
82
- all: unset;
83
- cursor: pointer;
84
- display: flex;
85
- align-items: center;
86
- justify-content: center;
87
- width: 36px;
88
- height: 38px;
89
- color: var(--sb--trigger-text, var(--color-slate-600));
90
- transition: background 120ms;
91
- }
92
-
93
- .canvas-undo-btn:hover:not(:disabled) {
94
- background: var(--sb--trigger-bg-hover, var(--color-slate-300));
95
- }
96
-
97
- .canvas-undo-btn:disabled {
98
- opacity: 0.3;
99
- cursor: default;
100
- }
101
-
102
- .canvas-undo-separator {
103
- width: 2px;
104
- height: 40px;
105
- background: var(--sb--trigger-border, var(--color-slate-400));
106
- flex-shrink: 0;
107
- }
108
- </style>
@@ -1,111 +0,0 @@
1
- <!--
2
- CanvasZoomControl — zoom in/out/reset bar for canvas pages.
3
- -->
4
- <script lang="ts">
5
- import * as Tooltip from './lib/components/ui/tooltip/index.js'
6
-
7
- interface Props {
8
- config?: any
9
- data?: any
10
- zoom?: number
11
- tabindex?: number
12
- }
13
-
14
- let { config = {}, data, zoom = 100, tabindex = -1 }: Props = $props()
15
- </script>
16
-
17
- {#if data}
18
- <div class="canvas-zoom-bar" role="group" aria-label={config.ariaLabel || 'Zoom controls'}>
19
- <Tooltip.Root>
20
- <Tooltip.Trigger>
21
- <button
22
- class="canvas-zoom-btn"
23
- onclick={() => data.zoomOut(zoom)}
24
- disabled={zoom <= data.ZOOM_MIN}
25
- aria-label="Decrease zoom"
26
- {tabindex}
27
- >−</button>
28
- </Tooltip.Trigger>
29
- <Tooltip.Content side="top">Decrease zoom</Tooltip.Content>
30
- </Tooltip.Root>
31
- <Tooltip.Root>
32
- <Tooltip.Trigger>
33
- <button
34
- class="canvas-zoom-label"
35
- onclick={() => data.zoomReset()}
36
- aria-label="Zoom to 100%"
37
- tabindex={-1}
38
- >{zoom}%</button>
39
- </Tooltip.Trigger>
40
- <Tooltip.Content side="top">Zoom to 100%</Tooltip.Content>
41
- </Tooltip.Root>
42
- <Tooltip.Root>
43
- <Tooltip.Trigger>
44
- <button
45
- class="canvas-zoom-btn"
46
- onclick={() => data.zoomIn(zoom)}
47
- disabled={zoom >= data.ZOOM_MAX}
48
- aria-label="Increase zoom"
49
- tabindex={-1}
50
- >+</button>
51
- </Tooltip.Trigger>
52
- <Tooltip.Content side="top">Increase zoom</Tooltip.Content>
53
- </Tooltip.Root>
54
- </div>
55
- {/if}
56
-
57
- <style>
58
- .canvas-zoom-bar {
59
- display: flex;
60
- align-items: center;
61
- border-radius: 10px;
62
- border: 2.5px solid var(--sb--trigger-border, var(--color-slate-400));
63
- background: var(--sb--trigger-bg, var(--color-slate-100));
64
- overflow: hidden;
65
- }
66
-
67
- .canvas-zoom-btn {
68
- all: unset;
69
- cursor: pointer;
70
- display: flex;
71
- align-items: center;
72
- justify-content: center;
73
- width: 36px;
74
- height: 38px;
75
- font-size: 16px;
76
- font-weight: 600;
77
- color: var(--sb--trigger-text, var(--color-slate-600));
78
- transition: background 120ms;
79
- }
80
-
81
- .canvas-zoom-btn:hover:not(:disabled) {
82
- background: var(--sb--trigger-bg-hover, var(--color-slate-300));
83
- }
84
-
85
- .canvas-zoom-btn:disabled {
86
- opacity: 0.3;
87
- cursor: default;
88
- }
89
-
90
- .canvas-zoom-label {
91
- all: unset;
92
- cursor: pointer;
93
- display: flex;
94
- align-items: center;
95
- justify-content: center;
96
- min-width: 48px;
97
- height: 38px;
98
- padding: 0 4px;
99
- font-size: 13px;
100
- font-weight: 600;
101
- font-variant-numeric: tabular-nums;
102
- color: var(--sb--trigger-text, var(--color-slate-600));
103
- border-left: 2px solid var(--sb--trigger-border, var(--color-slate-400));
104
- border-right: 2px solid var(--sb--trigger-border, var(--color-slate-400));
105
- transition: background 120ms;
106
- }
107
-
108
- .canvas-zoom-label:hover {
109
- background: var(--sb--trigger-bg-hover, var(--color-slate-300));
110
- }
111
- </style>
@@ -1,52 +0,0 @@
1
- <!--
2
- CanvasZoomToFit — standalone zoom-to-objects button.
3
- -->
4
- <script lang="ts">
5
- import * as Tooltip from './lib/components/ui/tooltip/index.js'
6
- import Icon from './svelte-plugin-ui/components/Icon.svelte'
7
-
8
- interface Props {
9
- config?: any
10
- data?: any
11
- tabindex?: number
12
- }
13
-
14
- let { config = {}, data, tabindex = -1 }: Props = $props()
15
- </script>
16
-
17
- {#if data}
18
- <Tooltip.Root>
19
- <Tooltip.Trigger>
20
- <button
21
- class="canvas-standalone-btn"
22
- onclick={() => data.zoomToFit()}
23
- aria-label={config.label || 'Zoom to objects'}
24
- {tabindex}
25
- >
26
- <Icon name={config.icon || 'iconoir/square-3d-three-points'} size={16} {...(config.meta || {})} />
27
- </button>
28
- </Tooltip.Trigger>
29
- <Tooltip.Content side="top">{config.label || 'Zoom to objects'}</Tooltip.Content>
30
- </Tooltip.Root>
31
- {/if}
32
-
33
- <style>
34
- .canvas-standalone-btn {
35
- all: unset;
36
- cursor: pointer;
37
- display: flex;
38
- align-items: center;
39
- justify-content: center;
40
- width: 38px;
41
- height: 38px;
42
- border-radius: 10px;
43
- border: 2.5px solid var(--sb--trigger-border, var(--color-slate-400));
44
- background: var(--sb--trigger-bg, var(--color-slate-100));
45
- color: var(--sb--trigger-text, var(--color-slate-600));
46
- transition: background 120ms;
47
- }
48
-
49
- .canvas-standalone-btn:hover {
50
- background: var(--sb--trigger-bg-hover, var(--color-slate-300));
51
- }
52
- </style>