@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,1001 +0,0 @@
1
- <!--
2
- Viewfinder — prototype index and flow dashboard.
3
-
4
- Full-page component that lists prototypes as expandable groups,
5
- each showing its flows. Global flows (not belonging to any prototype)
6
- appear as an "Other flows" group.
7
-
8
- Mounted via mountViewfinder() from the viewfinder plugin entry point.
9
- -->
10
-
11
- <script lang="ts">
12
- import { buildPrototypeIndex } from '../../viewfinder.js'
13
- import { getLocal, setLocal } from '../../localStorage.js'
14
- import Icon from './Icon.svelte'
15
-
16
- interface Props {
17
- title?: string
18
- subtitle?: string
19
- basePath?: string
20
- knownRoutes?: string[]
21
- showThumbnails?: boolean
22
- hideDefaultFlow?: boolean
23
- }
24
-
25
- let {
26
- title = 'Storyboard',
27
- subtitle = '',
28
- basePath = '/',
29
- knownRoutes = [],
30
- showThumbnails = false,
31
- hideDefaultFlow = false,
32
- }: Props = $props()
33
-
34
- const prototypeIndex = $derived(buildPrototypeIndex(knownRoutes))
35
-
36
- const globalFlows = $derived(
37
- hideDefaultFlow
38
- ? prototypeIndex.globalFlows.filter((f: any) => f.key !== 'default')
39
- : prototypeIndex.globalFlows
40
- )
41
-
42
- // Build a flat display list: folders (with nested prototypes), ungrouped prototypes, global flows
43
- const ungroupedProtos = $derived(prototypeIndex.prototypes)
44
-
45
- const folders = $derived(prototypeIndex.folders || [])
46
-
47
- const otherFlows = $derived.by(() => {
48
- if (globalFlows.length === 0) return null
49
- return {
50
- name: 'Other flows',
51
- dirName: '__global__',
52
- description: null,
53
- author: null,
54
- gitAuthor: null,
55
- lastModified: null,
56
- icon: null,
57
- team: null,
58
- tags: null,
59
- flows: globalFlows,
60
- }
61
- })
62
-
63
- const totalProtos = $derived(
64
- ungroupedProtos.length + folders.reduce((sum: number, f: any) => sum + f.prototypes.length, 0)
65
- )
66
-
67
- const totalFlows = $derived(
68
- ungroupedProtos.reduce((sum: number, p: any) => sum + p.flows.length, 0) +
69
- globalFlows.length +
70
- folders.reduce((sum: number, f: any) =>
71
- sum + f.prototypes.reduce((s: number, p: any) => s + p.flows.length, 0), 0)
72
- )
73
-
74
- // Sorting — use pre-sorted arrays from buildPrototypeIndex
75
- type SortMode = 'updated' | 'title'
76
- let sortBy: SortMode = $state('updated')
77
-
78
- const sortedProtos = $derived(prototypeIndex.sorted?.[sortBy]?.prototypes ?? ungroupedProtos)
79
- const sortedFolders = $derived(prototypeIndex.sorted?.[sortBy]?.folders ?? folders)
80
-
81
- // Canvases
82
- const ungroupedCanvases = $derived(prototypeIndex.canvases || [])
83
- const sortedCanvases = $derived(prototypeIndex.sorted?.[sortBy]?.canvases ?? ungroupedCanvases)
84
-
85
- // View mode — top-level toggle between Prototypes and Canvases
86
- type ViewMode = 'prototypes' | 'canvases'
87
- const VIEW_MODE_KEY = 'viewfinder.viewMode'
88
- let viewMode: ViewMode = $state(getLocal(VIEW_MODE_KEY) === 'canvases' ? 'canvases' : 'prototypes')
89
-
90
- $effect(() => {
91
- setLocal(VIEW_MODE_KEY, viewMode)
92
- })
93
-
94
- // Canvas folder data: extract folders that contain canvases for canvas view
95
- const canvasFolders = $derived.by(() => {
96
- const src = prototypeIndex.sorted?.[sortBy]?.folders ?? folders
97
- return src
98
- .filter((f: any) => f.canvases && f.canvases.length > 0)
99
- .map((f: any) => ({ ...f, prototypes: [], canvases: f.canvases }))
100
- })
101
-
102
- const totalCanvases = $derived(
103
- ungroupedCanvases.length + folders.reduce((sum: number, f: any) => sum + (f.canvases?.length || 0), 0)
104
- )
105
-
106
- // For prototype view: filter canvases out of folder contents
107
- const protoOnlyFolders = $derived.by(() => {
108
- const src = prototypeIndex.sorted?.[sortBy]?.folders ?? folders
109
- return src
110
- .filter((f: any) => f.prototypes.length > 0)
111
- .map((f: any) => ({ ...f, canvases: [] }))
112
- })
113
-
114
- // Expanded state — persisted in localStorage
115
- const EXPANDED_KEY = 'viewfinder.expanded'
116
-
117
- function loadExpanded(): Record<string, boolean> {
118
- const raw = getLocal(EXPANDED_KEY)
119
- if (!raw) return {}
120
- try { return JSON.parse(raw) } catch { return {} }
121
- }
122
-
123
- let expanded: Record<string, boolean> = $state(loadExpanded())
124
-
125
- function isExpanded(dirName: string): boolean {
126
- return expanded[dirName] ?? false
127
- }
128
-
129
- function toggle(dirName: string) {
130
- expanded[dirName] = !isExpanded(dirName)
131
- setLocal(EXPANDED_KEY, JSON.stringify(expanded))
132
- }
133
-
134
- function withBase(route: string): string {
135
- const normalizedRoute = route.startsWith('/') ? route : `/${route}`
136
- const normalizedBase = (basePath || '/').replace(/\/+$/, '')
137
- if (!normalizedBase || normalizedBase === '/') return normalizedRoute
138
- return `${normalizedBase}${normalizedRoute}`.replace(/\/+/g, '/')
139
- }
140
-
141
- function protoRoute(dirName: string): string {
142
- return withBase(`/${dirName}`)
143
- }
144
-
145
- function formatName(name: string): string {
146
- return name
147
- .split('-')
148
- .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))
149
- .join(' ')
150
- }
151
-
152
- function placeholderSvg(name: string): string {
153
- const h = (function hashStr(s: string) {
154
- let v = 0
155
- for (let i = 0; i < s.length; i++) v = ((v << 5) - v + s.charCodeAt(i)) | 0
156
- return Math.abs(v)
157
- })(name)
158
-
159
- let rects = ''
160
- for (let i = 0; i < 12; i++) {
161
- const s = h * (i + 1)
162
- const x = (s * 7 + i * 31) % 320
163
- const y = (s * 13 + i * 17) % 200
164
- const w = 20 + (s * (i + 3)) % 80
165
- const ht = 8 + (s * (i + 7)) % 40
166
- const opacity = 0.06 + ((s * (i + 2)) % 20) / 100
167
- const fill = i % 3 === 0 ? 'var(--sb--placeholder-accent)' : i % 3 === 1 ? 'var(--sb--placeholder-fg)' : 'var(--sb--placeholder-muted)'
168
- rects += `<rect x="${x}" y="${y}" width="${w}" height="${ht}" rx="2" fill="${fill}" opacity="${opacity}" />`
169
- }
170
-
171
- let lines = ''
172
- for (let i = 0; i < 6; i++) {
173
- const s = h * (i + 5)
174
- const y = 10 + (s % 180)
175
- lines += `<line x1="0" y1="${y}" x2="320" y2="${y}" stroke="var(--sb--placeholder-grid)" stroke-width="0.5" opacity="0.4" />`
176
- }
177
- for (let i = 0; i < 8; i++) {
178
- const s = h * (i + 9)
179
- const x = 10 + (s % 300)
180
- lines += `<line x1="${x}" y1="0" x2="${x}" y2="200" stroke="var(--sb--placeholder-grid)" stroke-width="0.5" opacity="0.3" />`
181
- }
182
-
183
- return `<svg viewBox="0 0 320 200" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><rect width="320" height="200" fill="var(--sb--placeholder-bg)" />${lines}${rects}</svg>`
184
- }
185
-
186
- // Branch switching — populated by Vite server plugin when available
187
- interface Branch { branch: string; folder: string }
188
-
189
- let branches: Branch[] | null = $state(
190
- (typeof window !== 'undefined' && Array.isArray((window as any).__SB_BRANCHES__))
191
- ? (window as any).__SB_BRANCHES__
192
- : null
193
- )
194
-
195
- const branchBasePath = $derived(
196
- (basePath || '/storyboard-source/').replace(/\/branch--[^/]*\/$/, '/')
197
- )
198
-
199
- const currentBranch = $derived(
200
- (() => {
201
- const m = (basePath || '').match(/\/branch--([^/]+)\/?$/)
202
- return m ? m[1] : 'main'
203
- })()
204
- )
205
-
206
- function handleBranchChange(e: Event) {
207
- const folder = (e.target as HTMLSelectElement).value
208
- if (folder) {
209
- window.location.href = `${branchBasePath}${folder}/`
210
- }
211
- }
212
- </script>
213
-
214
- <div class="container">
215
- <header class="header">
216
- <div class="headerTop">
217
- <div>
218
- <h1 class="title">{title}</h1>
219
- {#if subtitle}
220
- <p class="subtitle">{subtitle}</p>
221
- {/if}
222
- </div>
223
- </div>
224
- <div class="controlsRow">
225
- <!-- View mode toggle (Prototypes / Canvases) -->
226
- <div class="sortToggle">
227
- <button
228
- class="sortButton"
229
- class:sortButtonActive={viewMode === 'prototypes'}
230
- onclick={() => viewMode = 'prototypes'}
231
- >
232
- Prototypes
233
- </button>
234
- <button
235
- class="sortButton"
236
- class:sortButtonActive={viewMode === 'canvases'}
237
- onclick={() => viewMode = 'canvases'}
238
- >
239
- Canvas
240
- </button>
241
- </div>
242
- <!-- <span class="sceneCount">
243
- {(folders.length > 0 ? `${folders.length} folder${folders.length !== 1 ? 's' : ''} · ` : '') + `${totalProtos} prototype${totalProtos !== 1 ? 's' : ''} · ${totalFlows} flow${totalFlows !== 1 ? 's' : ''}`}
244
- </span> -->
245
- <!-- Sort toggle — hidden for now -->
246
- <div class="sortToggle" style="display: none;">
247
- <button
248
- class="sortButton"
249
- class:sortButtonActive={sortBy === 'updated'}
250
- onclick={() => sortBy = 'updated'}
251
- >
252
- <Icon name="primer/clock" size={14} color="var(--fgColor-muted)" />
253
- Last updated
254
- </button>
255
- <button
256
- class="sortButton"
257
- class:sortButtonActive={sortBy === 'title'}
258
- onclick={() => sortBy = 'title'}
259
- >
260
- <Icon name="primer/sort-asc" size={14} color="var(--fgColor-muted)" />
261
- Title A–Z
262
- </button>
263
- </div>
264
- {#if branches && branches.length > 0}
265
- <div class="branchDropdown">
266
- <span class="branchIcon"><Icon size={16} color="var(--fgColor-muted)" offsetY={-1} offsetX={2} name="primer/git-branch" /></span>
267
- <select
268
- class="branchSelect"
269
- onchange={handleBranchChange}
270
- aria-label="Switch branch"
271
- >
272
- <option value="" disabled selected>{currentBranch}</option>
273
- {#each branches as b (b.folder)}
274
- <option value={b.folder}>{b.branch}</option>
275
- {/each}
276
- </select>
277
- </div>
278
- {/if}
279
- </div>
280
- </header>
281
-
282
- {#if viewMode === 'prototypes' && totalProtos === 0 && folders.length === 0}
283
- <p class="empty">No flows found. Add a <code>*.flow.json</code> file to get started.</p>
284
- {:else if viewMode === 'canvases' && totalCanvases === 0}
285
- <p class="empty">No canvases found. Add a <code>*.canvas.jsonl</code> file to get started.</p>
286
- {:else}
287
- <div class="list">
288
- {#snippet protoEntry(proto)}
289
- <section class="protoGroup">
290
- {#if proto.isExternal}
291
- <!-- External prototype — opens in new tab -->
292
- <a class="listItem" href={proto.externalUrl} target="_blank" rel="noopener noreferrer">
293
- <div class="cardBody">
294
- <p class="protoName">
295
- {#if proto.icon}<span class="protoIcon">{proto.icon}</span>{/if}
296
- {proto.name}
297
- <span class="externalBadge">
298
- <Icon size={12} color="var(--fgColor-muted)" name="primer/link-external" offsetY={-2} />
299
- external
300
- </span>
301
- </p>
302
- {#if proto.description}
303
- <p class="protoDesc">{proto.description}</p>
304
- {/if}
305
- {#if proto.author}
306
- {@const authors = Array.isArray(proto.author) ? proto.author : [proto.author]}
307
- <div class="author">
308
- <span class="authorAvatars">
309
- {#each authors as a (a)}
310
- <img
311
- src="https://github.com/{a}.png?size=48"
312
- alt={a}
313
- class="authorAvatar"
314
- />
315
- {/each}
316
- </span>
317
- <span class="authorName">{authors.join(', ')}</span>
318
- </div>
319
- {:else if proto.gitAuthor}
320
- <p class="authorPlain">{proto.gitAuthor}</p>
321
- {/if}
322
- </div>
323
- </a>
324
- {:else if proto.hideFlows && proto.flows.length === 1}
325
- <!-- Single flow, hidden — navigates directly to the flow -->
326
- <a class="listItem" href={withBase(proto.flows[0].route)}>
327
- <div class="cardBody">
328
- <p class="protoName" class:otherflows={proto.dirName === '__global__'}>
329
- {#if proto.icon}<span class="protoIcon">{proto.icon}</span>{/if}
330
- {proto.name}
331
- </p>
332
- {#if proto.description}
333
- <p class="protoDesc">{proto.description}</p>
334
- {/if}
335
- {#if proto.author}
336
- {@const authors = Array.isArray(proto.author) ? proto.author : [proto.author]}
337
- <div class="author">
338
- <span class="authorAvatars">
339
- {#each authors as a (a)}
340
- <img
341
- src="https://github.com/{a}.png?size=48"
342
- alt={a}
343
- class="authorAvatar"
344
- />
345
- {/each}
346
- </span>
347
- <span class="authorName">{authors.join(', ')}</span>
348
- </div>
349
- {:else if proto.gitAuthor}
350
- <p class="authorPlain">{proto.gitAuthor}</p>
351
- {/if}
352
- </div>
353
- </a>
354
- {:else if proto.flows.length > 0}
355
- <!-- Expandable prototype with flows -->
356
- <button
357
- class="listItem protoHeader"
358
- onclick={() => toggle(proto.dirName)}
359
- aria-expanded={isExpanded(proto.dirName)}
360
- >
361
- <div class="cardBody">
362
- <p class="protoName" class:otherflows={proto.dirName === '__global__'}>
363
- {#if proto.icon}<span class="protoIcon">{proto.icon}</span>{/if}
364
- {proto.name}
365
- <span class="protoChevron">
366
- {#if isExpanded(proto.dirName)}
367
- <Icon size={12} color="var(--fgColor-disabled)" name="primer/chevron-down" offsetY={-3} offsetX={2} />
368
- {:else}
369
- <Icon size={12} color="var(--fgColor-disabled)" name="primer/chevron-right" offsetY={-3} offsetX={2} />
370
- {/if}
371
- </span>
372
- </p>
373
- {#if proto.description}
374
- <p class="protoDesc">{proto.description}</p>
375
- {/if}
376
- {#if proto.author}
377
- {@const authors = Array.isArray(proto.author) ? proto.author : [proto.author]}
378
- <div class="author">
379
- <span class="authorAvatars">
380
- {#each authors as a (a)}
381
- <img
382
- src="https://github.com/{a}.png?size=48"
383
- alt={a}
384
- class="authorAvatar"
385
- />
386
- {/each}
387
- </span>
388
- <span class="authorName">{authors.join(', ')}</span>
389
- </div>
390
- {:else if proto.gitAuthor}
391
- <p class="authorPlain">{proto.gitAuthor}</p>
392
- {/if}
393
- </div>
394
- </button>
395
- {:else}
396
- <!-- Prototype with no flows — navigates directly -->
397
- <a class="listItem" href={protoRoute(proto.dirName)}>
398
- <div class="cardBody">
399
- <p class="protoName" class:otherflows={proto.dirName === '__global__'}>
400
- {#if proto.icon}<span class="protoIcon">{proto.icon}</span>{/if}
401
- {proto.name}
402
- </p>
403
- {#if proto.description}
404
- <p class="protoDesc">{proto.description}</p>
405
- {/if}
406
- {#if proto.author}
407
- {@const authors = Array.isArray(proto.author) ? proto.author : [proto.author]}
408
- <div class="author">
409
- <span class="authorAvatars">
410
- {#each authors as a (a)}
411
- <img
412
- src="https://github.com/{a}.png?size=48"
413
- alt={a}
414
- class="authorAvatar"
415
- />
416
- {/each}
417
- </span>
418
- <span class="authorName">{authors.join(', ')}</span>
419
- </div>
420
- {:else if proto.gitAuthor}
421
- <p class="authorPlain">{proto.gitAuthor}</p>
422
- {/if}
423
- </div>
424
- </a>
425
- {/if}
426
-
427
- {#if !(proto.hideFlows && proto.flows.length === 1) && isExpanded(proto.dirName) && proto.flows.length > 0}
428
- <div class="flowList">
429
- {#each proto.flows as flow (flow.key)}
430
- <a href={withBase(flow.route)} class="listItem flowItem">
431
- {#if showThumbnails}
432
- <div class="thumbnail">
433
- {@html placeholderSvg(flow.key)}
434
- </div>
435
- {/if}
436
- <div class="cardBody">
437
- <p class="protoName">{flow.meta?.title || formatName(flow.name)}</p>
438
- {#if flow.meta?.description}
439
- <p class="flowDesc">{flow.meta.description}</p>
440
- {/if}
441
- </div>
442
- </a>
443
- {/each}
444
- </div>
445
- {/if}
446
- </section>
447
- {/snippet}
448
-
449
- {#snippet canvasEntry(canvas)}
450
- <section class="protoGroup">
451
- <a class="listItem" href={withBase(canvas.route)}>
452
- <div class="cardBody">
453
- <p class="protoName">
454
- <span class="protoIcon">{canvas.icon || ''}</span>
455
- {canvas.name}
456
- </p>
457
- {#if canvas.description}
458
- <p class="protoDesc">{canvas.description}</p>
459
- {/if}
460
- {#if canvas.author}
461
- {@const authors = Array.isArray(canvas.author) ? canvas.author : [canvas.author]}
462
- <div class="author">
463
- <span class="authorAvatars">
464
- {#each authors as a (a)}
465
- <img
466
- src="https://github.com/{a}.png?size=48"
467
- alt={a}
468
- class="authorAvatar"
469
- />
470
- {/each}
471
- </span>
472
- <span class="authorName">{authors.join(', ')}</span>
473
- </div>
474
- {:else if canvas.gitAuthor}
475
- <p class="authorPlain">{canvas.gitAuthor}</p>
476
- {/if}
477
- </div>
478
- </a>
479
- </section>
480
- {/snippet}
481
-
482
- {#if viewMode === 'prototypes'}
483
- {#each protoOnlyFolders as folder (folder.dirName)}
484
- <section class="folderGroup" class:folderGroupOpen={isExpanded(`folder:${folder.dirName}`)}>
485
- <button
486
- class="folderHeader"
487
- onclick={() => toggle(`folder:${folder.dirName}`)}
488
- aria-expanded={isExpanded(`folder:${folder.dirName}`)}
489
- >
490
- <p class="folderName">
491
- <span>
492
- {#if isExpanded(`folder:${folder.dirName}`)}
493
- <Icon size={20} offsetY={-1.5} name="folder-open" color="#54aeff" />
494
- {:else}
495
- <Icon size={20} offsetY={-1.5} name="folder" color="#54aeff" />
496
- {/if}
497
- </span>
498
- {folder.name}
499
- </p>
500
- {#if folder.description}
501
- <p class="folderDesc">{folder.description}</p>
502
- {/if}
503
- </button>
504
- {#if isExpanded(`folder:${folder.dirName}`) && folder.prototypes.length > 0}
505
- <div class="folderContent">
506
- {#each folder.prototypes as proto (proto.dirName)}
507
- {@render protoEntry(proto)}
508
- {/each}
509
- </div>
510
- {/if}
511
- </section>
512
- {/each}
513
-
514
- <!-- Ungrouped prototypes (not in any folder) -->
515
- {#each sortedProtos as proto (proto.dirName)}
516
- {@render protoEntry(proto)}
517
- {/each}
518
-
519
- <!-- Other flows (always at the bottom) -->
520
- {#if otherFlows}
521
- {@render protoEntry(otherFlows)}
522
- {/if}
523
- {:else}
524
- <!-- Canvas view -->
525
- <div class="canvasWarning">
526
- <Icon size={14} name="primer/alert" color="#9a6700" offsetY={-1} />
527
- <span>Canvas is an experimental feature. Use with caution.</span>
528
- </div>
529
- {#each canvasFolders as folder (folder.dirName)}
530
- <section class="folderGroup" class:folderGroupOpen={isExpanded(`folder:${folder.dirName}`)}>
531
- <button
532
- class="folderHeader"
533
- onclick={() => toggle(`folder:${folder.dirName}`)}
534
- aria-expanded={isExpanded(`folder:${folder.dirName}`)}
535
- >
536
- <p class="folderName">
537
- <span>
538
- {#if isExpanded(`folder:${folder.dirName}`)}
539
- <Icon size={20} offsetY={-1.5} name="folder-open" color="#54aeff" />
540
- {:else}
541
- <Icon size={20} offsetY={-1.5} name="folder" color="#54aeff" />
542
- {/if}
543
- </span>
544
- {folder.name}
545
- </p>
546
- {#if folder.description}
547
- <p class="folderDesc">{folder.description}</p>
548
- {/if}
549
- </button>
550
- {#if isExpanded(`folder:${folder.dirName}`) && folder.canvases?.length > 0}
551
- <div class="folderContent">
552
- {#each folder.canvases as canvas (canvas.dirName)}
553
- {@render canvasEntry(canvas)}
554
- {/each}
555
- </div>
556
- {/if}
557
- </section>
558
- {/each}
559
-
560
- <!-- Ungrouped canvases -->
561
- {#each sortedCanvases as canvas (canvas.dirName)}
562
- {@render canvasEntry(canvas)}
563
- {/each}
564
- {/if}
565
- </div>
566
- {/if}
567
- </div>
568
-
569
- <style>
570
- .container {
571
- min-height: 100vh;
572
- background-color: var(--bgColor-default, #0d1117);
573
- color: var(--fgColor-default, #e6edf3);
574
- padding: 80px 32px 48px;
575
- max-width: 960px;
576
- margin: 0 auto;
577
- }
578
-
579
- .header {
580
- max-width: 720px;
581
- margin: 0 auto 40px;
582
- }
583
-
584
- .headerTop {
585
- display: flex;
586
- align-items: baseline;
587
- gap: 16px;
588
- }
589
-
590
- .title {
591
- font: var(--text-display-shorthand);
592
- margin: 0 0 12px;
593
- color: var(--fgColor-default, #e6edf3);
594
- letter-spacing: -0.03em;
595
- line-height: 1;
596
- }
597
-
598
- .subtitle {
599
- font-size: 15px;
600
- color: var(--fgColor-muted, #848d97);
601
- margin: 4px 0 0;
602
- letter-spacing: 0.01em;
603
- }
604
-
605
- .controlsRow {
606
- display: flex;
607
- align-items: center;
608
- gap: 8px;
609
- margin: 16px 0 0;
610
- }
611
-
612
- /* .sceneCount {
613
- font-size: 13px;
614
- color: var(--fgColor-muted, #848d97);
615
- letter-spacing: 0.01em;
616
- white-space: nowrap;
617
- } */
618
-
619
- .sortToggle {
620
- display: flex;
621
- gap: 2px;
622
- background: var(--bgColor-inset);
623
- padding: var(--base-size-4) var(--base-size-6);
624
- border-radius: 9999px;
625
- }
626
-
627
- .sortButton {
628
- display: inline-flex;
629
- align-items: center;
630
- border-radius: 9999px;
631
- gap: 6px;
632
- padding: 6px 10px;
633
- font-size: 12px;
634
- font-family: inherit;
635
- color: var(--fgColor-muted, #848d97);
636
- background: transparent;
637
- border: none;
638
- cursor: pointer;
639
- transition: color 0.15s, background 0.15s, border-color 0.15s;
640
-
641
- &:first-child {
642
- transform: translateX(-1px);
643
- }
644
-
645
- &:last-child {
646
- transform: translateX(1px);
647
- }
648
- }
649
-
650
- .sortButton:hover {
651
- color: var(--fgColor-default, #e6edf3);
652
- background: var(--bgColor-neutral-muted, rgba(110, 118, 129, 0.1));
653
- }
654
-
655
- .sortButtonActive {
656
- color: var(--fgColor-default, #e6edf3);
657
- background: var(--bgColor-neutral-muted, rgba(110, 118, 129, 0.15));
658
- border: none;
659
- }
660
-
661
- .sortButton:first-child {
662
- transform: translateX(-1px);
663
- }
664
-
665
- .branchDropdown {
666
- display: flex;
667
- align-items: center;
668
- gap: 0;
669
- flex-shrink: 0;
670
- position: relative;
671
- margin-left: auto;
672
- }
673
-
674
- .branchIcon {
675
- position: absolute;
676
- left: 10px;
677
- color: var(--fgColor-muted, #848d97);
678
- pointer-events: none;
679
- z-index: 1;
680
- }
681
-
682
- .branchSelect {
683
- appearance: none;
684
- background-color: transparent;
685
- color: var(--fgColor-default, #e6edf3);
686
- border: 1px solid var(--borderColor-default, #30363d);
687
- border-radius: 20px;
688
- padding: 6px 32px 6px 32px;
689
- font-size: 13px;
690
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
691
- cursor: pointer;
692
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23848d97'%3E%3Cpath d='M6 8.5L1.5 4h9L6 8.5z'/%3E%3C/svg%3E");
693
- background-repeat: no-repeat;
694
- background-position: right 12px center;
695
- min-width: 140px;
696
- max-width: 220px;
697
- text-overflow: ellipsis;
698
- overflow: hidden;
699
- transition: border-color 0.15s ease;
700
- }
701
-
702
- .branchSelect:hover {
703
- border-color: #bbbbbb;
704
- }
705
-
706
- .branchSelect:focus-visible {
707
- outline: 2px solid var(--borderColor-accent-emphasis, #1f6feb);
708
- outline-offset: -1px;
709
- }
710
-
711
- .list {
712
- display: flex;
713
- flex-direction: column;
714
- gap: var(--base-size-8);
715
- max-width: 720px;
716
- margin: 0 auto;
717
- }
718
-
719
- .protoGroup {
720
- display: flex;
721
- flex-direction: column;
722
- gap: var(--base-size-8);
723
- }
724
-
725
- .protoGroup > .listItem {
726
- border: 1px solid var(--borderColor-muted, #30363d);
727
- border-radius: var(--base-size-6);
728
- }
729
-
730
- .folderGroup {
731
- display: flex;
732
- flex-direction: column;
733
- gap: var(--base-size-8);
734
- }
735
-
736
- .folderHeader {
737
- display: flex;
738
- flex-direction: row;
739
- align-items: baseline;
740
- justify-content: flex-start;
741
- gap: var(--base-size-8);
742
- appearance: none;
743
- border: none;
744
- border-radius: var(--base-size-6);
745
- border: 1px solid var(--borderColor-muted, #30363d);
746
- background: none;
747
- width: 100%;
748
- text-align: left;
749
- cursor: pointer;
750
- color: inherit;
751
- padding: var(--base-size-16);
752
-
753
- &:hover,
754
- .folderGroupOpen & {
755
- background-color: var(--bgColor-muted, #161b22);
756
- }
757
- }
758
-
759
-
760
- .folderGroupOpen .folderHeader {
761
- background-color: var(--bgColor-muted, #161b22);
762
- }
763
-
764
-
765
- .folderName {
766
- display: inline-flex;
767
- align-items: center;
768
- gap: var(--base-size-8);
769
- font-size: var(--text-body-size-small);
770
- font-weight: 600;
771
- color: var(--fgColor-default);
772
- margin: 0;
773
- letter-spacing: 0.04em;
774
- text-transform: uppercase;
775
- line-height: 1.6;
776
- }
777
-
778
- .folderDesc {
779
- font-size: var(--text-body-size-small);
780
- color: var(--fgColor-muted, #848d97);
781
- margin: 0;
782
- letter-spacing: 0.01em;
783
- text-transform: none;
784
- font-weight: 400;
785
- }
786
-
787
- .folderContent {
788
- display: flex;
789
- flex-direction: column;
790
- gap: var(--base-size-8);
791
- }
792
-
793
- .listItem {
794
- display: block;
795
- text-decoration: none;
796
- color: inherit;
797
- }
798
-
799
- .listItem:hover {
800
- text-decoration: none !important;
801
- }
802
-
803
- .protoHeader {
804
- appearance: none;
805
- border: none;
806
- background: none;
807
- border-radius: var(--base-size-6);
808
- width: 100%;
809
- text-align: left;
810
- cursor: pointer;
811
- color: inherit;
812
- padding: 0;
813
- }
814
-
815
- .protoHeader[aria-expanded="true"] .cardBody {
816
- background-color: var(--bgColor-muted);
817
- border-radius: var(--base-size-6);
818
- }
819
-
820
- .cardBody {
821
- padding: 12px 16px;
822
- }
823
-
824
- .cardBody:hover {
825
- background-color: var(--bgColor-muted);
826
- border-radius: var(--base-size-6);
827
- }
828
-
829
- .protoName {
830
- font-size: var(--text-title-size-medium);
831
- font-weight: 400;
832
- color: var(--fgColor-default, #e6edf3);
833
- margin: 0;
834
- letter-spacing: -0.02em;
835
- line-height: 1.6;
836
- transition: font-style 0.15s ease;
837
- }
838
-
839
- .protoName.otherflows {
840
- font-size: var(--text-body-size-small);
841
- font-weight: 600;
842
- text-transform: uppercase;
843
- direction: rtl;
844
-
845
- & .protoChevron {
846
- margin-right: var(--base-size-8);
847
- }
848
-
849
- }
850
-
851
- .protoDesc {
852
- font-size: 13px;
853
- color: var(--fgColor-muted, #848d97);
854
- margin: 4px 0 0;
855
- letter-spacing: 0.01em;
856
- }
857
-
858
- .externalBadge {
859
- display: inline-flex;
860
- align-items: center;
861
- gap: 4px;
862
- font-size: 11px;
863
- font-weight: 500;
864
- color: var(--fgColor-muted, #848d97);
865
- background: var(--bgColor-neutral-muted, rgba(110, 118, 129, 0.1));
866
- border-radius: 9999px;
867
- padding: 2px 8px;
868
- margin-left: 8px;
869
- vertical-align: middle;
870
- letter-spacing: 0.02em;
871
- }
872
-
873
- .author {
874
- display: flex;
875
- align-items: center;
876
- gap: 8px;
877
- margin-top: 6px;
878
- }
879
-
880
- .authorAvatars {
881
- display: flex;
882
- flex-direction: row;
883
- }
884
-
885
- .authorAvatars:hover .authorAvatar:not(:first-child) {
886
- margin-left: -2px;
887
- }
888
-
889
- .authorAvatar {
890
- width: 24px;
891
- height: 24px;
892
- border-radius: 50%;
893
- margin-left: -8px;
894
- transition: margin-left 50ms linear;
895
- outline: 2px solid var(--bgColor-default, #0d1117);
896
- position: relative;
897
- }
898
-
899
- .authorAvatar:first-child {
900
- margin-left: 0;
901
- }
902
-
903
-
904
- .authorName {
905
- font-size: 13px;
906
- color: var(--fgColor-muted, #848d97);
907
- letter-spacing: 0.01em;
908
- }
909
-
910
- .authorPlain {
911
- font-size: 13px;
912
- color: var(--fgColor-muted);
913
- margin: 4px 0 0;
914
- letter-spacing: 0.01em;
915
- }
916
-
917
- .flowList {
918
- margin: 0;
919
- padding: 0;
920
- display: flex;
921
- flex-direction: column;
922
- }
923
-
924
- .flowItem {
925
- border: 1px solid var(--borderColor-muted);
926
- padding: 0;
927
- }
928
-
929
- .flowItem:not(:first-child) {
930
- margin-top: -1px;
931
- }
932
-
933
- .flowItem:first-child {
934
- border-top-left-radius: var(--base-size-6);
935
- border-top-right-radius: var(--base-size-6);
936
- }
937
-
938
- .flowItem:last-child {
939
- border-bottom-left-radius: var(--base-size-6);
940
- border-bottom-right-radius: var(--base-size-6);
941
- }
942
-
943
- .flowItem:only-child {
944
- border-radius: var(--base-size-6);
945
- }
946
-
947
- .flowItem .protoName {
948
- font-size: var(--text-title-size-small);
949
- color: var(--fgColor-muted);
950
- }
951
-
952
- .flowDesc {
953
- font-size: 13px;
954
- color: var(--fgColor-muted, #848d97);
955
- margin: 4px 0 0;
956
- letter-spacing: 0.01em;
957
- }
958
-
959
- .thumbnail {
960
- aspect-ratio: 16 / 10;
961
- display: flex;
962
- align-items: center;
963
- justify-content: center;
964
- overflow: hidden;
965
- background: var(--bgColor-inset, #010409);
966
-
967
- --sb--placeholder-bg: var(--bgColor-inset, #010409);
968
- --sb--placeholder-grid: var(--borderColor-default, #30363d);
969
- --sb--placeholder-accent: var(--fgColor-accent, #58a6ff);
970
- --sb--placeholder-fg: var(--fgColor-default, #c9d1d9);
971
- --sb--placeholder-muted: var(--fgColor-muted, #484f58);
972
- }
973
-
974
- .thumbnail :global(svg) {
975
- width: 100%;
976
- height: 100%;
977
- }
978
-
979
- .empty {
980
- text-align: center;
981
- padding: 80px 24px;
982
- color: var(--fgColor-muted, #848d97);
983
- font-size: 15px;
984
- max-width: 720px;
985
- margin: 0 auto;
986
- }
987
-
988
- .canvasWarning {
989
- display: flex;
990
- align-items: center;
991
- gap: 8px;
992
- padding: 10px 14px;
993
- margin-bottom: 16px;
994
- border-radius: 8px;
995
- border: 1px solid var(--borderColor-default, var(--sb--color-border, #d0d7de));
996
- background: var(--bgColor-attention-muted, #3d2e00);
997
- color: var(--fgColor-attention, #9a6700);
998
- font-size: 13px;
999
- line-height: 1.4;
1000
- }
1001
- </style>