@dfosco/storyboard-core 4.2.0-beta.3 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/commandpalette.config.json +109 -24
  2. package/dist/storyboard-ui.css +1 -1
  3. package/dist/storyboard-ui.js +16711 -27239
  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 -10
  11. package/scaffold/skills/canvas/SKILL.md +5 -4
  12. package/scaffold/skills/ship/SKILL.md +1 -1
  13. package/scaffold/storyboard.config.json +11 -1
  14. package/src/ActionMenuButton.jsx +103 -0
  15. package/src/AutosyncMenuButton.css +67 -0
  16. package/src/AutosyncMenuButton.jsx +242 -0
  17. package/src/BranchSelect.jsx +29 -0
  18. package/src/BranchSelect.module.css +30 -0
  19. package/src/CanvasAgentsMenu.jsx +89 -0
  20. package/src/CanvasCreateMenu.jsx +611 -0
  21. package/src/CanvasSnap.css +27 -0
  22. package/src/CanvasSnap.jsx +51 -0
  23. package/src/CanvasUndoRedo.css +36 -0
  24. package/src/CanvasUndoRedo.jsx +62 -0
  25. package/src/CanvasZoomControl.css +53 -0
  26. package/src/CanvasZoomControl.jsx +49 -0
  27. package/src/CanvasZoomToFit.css +18 -0
  28. package/src/CanvasZoomToFit.jsx +26 -0
  29. package/src/CommandMenu.css +8 -0
  30. package/src/CommandMenu.jsx +287 -0
  31. package/src/CommandPalette.jsx +35 -0
  32. package/src/CommandPaletteTrigger.jsx +25 -0
  33. package/src/CommentsMenuButton.jsx +40 -0
  34. package/src/CoreUIBar.css +47 -0
  35. package/src/CoreUIBar.jsx +858 -0
  36. package/src/CreateMenuButton.jsx +117 -0
  37. package/src/HideChromeTrigger.jsx +40 -0
  38. package/src/InspectorPanel.css +109 -0
  39. package/src/InspectorPanel.jsx +632 -0
  40. package/src/PwaInstallBanner.css +42 -0
  41. package/src/PwaInstallBanner.jsx +124 -0
  42. package/src/SidePanel.jsx +261 -0
  43. package/src/ThemeMenuButton.jsx +139 -0
  44. package/src/autosync/server.js +202 -5
  45. package/src/autosync/server.test.js +111 -0
  46. package/src/canvas/__tests__/agent-integration.test.js +596 -0
  47. package/src/canvas/__tests__/helpers/browser.js +95 -0
  48. package/src/canvas/__tests__/helpers/canvas-api.js +129 -0
  49. package/src/canvas/__tests__/helpers/perf.js +118 -0
  50. package/src/canvas/__tests__/helpers/setup.js +176 -0
  51. package/src/canvas/__tests__/helpers/tmux.js +130 -0
  52. package/src/canvas/__tests__/helpers/transcript.js +132 -0
  53. package/src/canvas/__tests__/terminal-integration.test.js +177 -0
  54. package/src/canvas/hot-pool.js +756 -0
  55. package/src/canvas/materializer.js +31 -0
  56. package/src/canvas/materializer.test.js +56 -0
  57. package/src/canvas/selectedWidgets.js +65 -7
  58. package/src/canvas/server.js +1802 -22
  59. package/src/canvas/server.test.js +239 -0
  60. package/src/canvas/terminal-config.js +330 -0
  61. package/src/canvas/terminal-registry.js +41 -3
  62. package/src/canvas/terminal-server.js +1098 -37
  63. package/src/canvas/writeGuard.js +51 -3
  64. package/src/canvasConfig.js +67 -1
  65. package/src/canvasConfig.test.js +79 -1
  66. package/src/cli/agent.js +85 -0
  67. package/src/cli/branch.js +232 -0
  68. package/src/cli/canvasAdd.js +61 -14
  69. package/src/cli/canvasBatch.js +98 -0
  70. package/src/cli/canvasBounds.js +1 -1
  71. package/src/cli/canvasRead.js +1 -1
  72. package/src/cli/canvasUpdate.js +179 -0
  73. package/src/cli/compact.js +0 -2
  74. package/src/cli/create.js +40 -16
  75. package/src/cli/dev.js +158 -84
  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 +149 -26
  81. package/src/cli/serverUrl.js +8 -3
  82. package/src/cli/sessions.js +133 -7
  83. package/src/cli/setup.js +138 -12
  84. package/src/cli/terminal-commands.js +20 -9
  85. package/src/cli/terminal-messaging.js +231 -0
  86. package/src/cli/terminal-welcome.js +449 -34
  87. package/src/cli/updateVersion.js +1 -1
  88. package/src/commandActions.js +1 -0
  89. package/src/commandPaletteConfig.js +9 -0
  90. package/src/comments/auth.js +2 -1
  91. package/src/comments/ui/AuthModal.jsx +114 -0
  92. package/src/comments/ui/CommentWindow.jsx +329 -0
  93. package/src/comments/ui/CommentsDrawer.jsx +102 -0
  94. package/src/comments/ui/Composer.jsx +64 -0
  95. package/src/comments/ui/authModal.test.js +1 -1
  96. package/src/comments/ui/commentWindow.js +16 -17
  97. package/src/comments/ui/commentsDrawer.js +25 -26
  98. package/src/comments/ui/composer.js +23 -24
  99. package/src/comments/ui/index.js +2 -3
  100. package/src/configSchema.js +59 -1
  101. package/src/configStore.js +161 -0
  102. package/src/core-ui-colors.css +12 -0
  103. package/src/devtools.js +17 -19
  104. package/src/devtools.test.js +18 -9
  105. package/src/featureFlags.js +12 -5
  106. package/src/fuzzySearch.test.js +10 -0
  107. package/src/index.js +15 -3
  108. package/src/lib/components/ui/alert/alert-action.jsx +11 -0
  109. package/src/lib/components/ui/alert/alert-description.jsx +11 -0
  110. package/src/lib/components/ui/alert/alert-title.jsx +11 -0
  111. package/src/lib/components/ui/alert/alert.jsx +25 -0
  112. package/src/lib/components/ui/alert/index.js +15 -15
  113. package/src/lib/components/ui/avatar/avatar-badge.jsx +22 -0
  114. package/src/lib/components/ui/avatar/avatar-fallback.jsx +18 -0
  115. package/src/lib/components/ui/avatar/avatar-group-count.jsx +19 -0
  116. package/src/lib/components/ui/avatar/avatar-group.jsx +19 -0
  117. package/src/lib/components/ui/avatar/avatar-image.jsx +15 -0
  118. package/src/lib/components/ui/avatar/avatar.jsx +19 -0
  119. package/src/lib/components/ui/avatar/index.js +20 -20
  120. package/src/lib/components/ui/badge/badge.jsx +31 -0
  121. package/src/lib/components/ui/badge/index.js +2 -2
  122. package/src/lib/components/ui/button/button.jsx +100 -0
  123. package/src/lib/components/ui/button/index.js +9 -9
  124. package/src/lib/components/ui/card/card-action.jsx +11 -0
  125. package/src/lib/components/ui/card/card-content.jsx +11 -0
  126. package/src/lib/components/ui/card/card-description.jsx +11 -0
  127. package/src/lib/components/ui/card/card-footer.jsx +11 -0
  128. package/src/lib/components/ui/card/card-header.jsx +19 -0
  129. package/src/lib/components/ui/card/card-title.jsx +11 -0
  130. package/src/lib/components/ui/card/card.jsx +17 -0
  131. package/src/lib/components/ui/card/index.js +23 -23
  132. package/src/lib/components/ui/checkbox/checkbox.jsx +29 -0
  133. package/src/lib/components/ui/checkbox/index.js +5 -5
  134. package/src/lib/components/ui/collapsible/collapsible-content.jsx +7 -0
  135. package/src/lib/components/ui/collapsible/collapsible-trigger.jsx +7 -0
  136. package/src/lib/components/ui/collapsible/collapsible.jsx +7 -0
  137. package/src/lib/components/ui/collapsible/index.js +11 -11
  138. package/src/lib/components/ui/dialog/dialog-close.jsx +7 -0
  139. package/src/lib/components/ui/dialog/dialog-content.jsx +34 -0
  140. package/src/lib/components/ui/dialog/dialog-description.jsx +15 -0
  141. package/src/lib/components/ui/dialog/dialog-footer.jsx +23 -0
  142. package/src/lib/components/ui/dialog/dialog-header.jsx +11 -0
  143. package/src/lib/components/ui/dialog/dialog-overlay.jsx +15 -0
  144. package/src/lib/components/ui/dialog/dialog-portal.jsx +4 -0
  145. package/src/lib/components/ui/dialog/dialog-title.jsx +15 -0
  146. package/src/lib/components/ui/dialog/dialog-trigger.jsx +7 -0
  147. package/src/lib/components/ui/dialog/dialog.jsx +4 -0
  148. package/src/lib/components/ui/dialog/index.js +32 -32
  149. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.jsx +8 -0
  150. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.jsx +30 -0
  151. package/src/lib/components/ui/dropdown-menu/dropdown-menu-content.jsx +22 -0
  152. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.jsx +16 -0
  153. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group.jsx +7 -0
  154. package/src/lib/components/ui/dropdown-menu/dropdown-menu-item.jsx +20 -0
  155. package/src/lib/components/ui/dropdown-menu/dropdown-menu-label.jsx +17 -0
  156. package/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.jsx +4 -0
  157. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.jsx +7 -0
  158. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.jsx +29 -0
  159. package/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.jsx +15 -0
  160. package/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.jsx +16 -0
  161. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.jsx +15 -0
  162. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.jsx +23 -0
  163. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.jsx +4 -0
  164. package/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.jsx +7 -0
  165. package/src/lib/components/ui/dropdown-menu/dropdown-menu.jsx +4 -0
  166. package/src/lib/components/ui/dropdown-menu/index.js +52 -52
  167. package/src/lib/components/ui/input/index.js +5 -5
  168. package/src/lib/components/ui/input/input.jsx +19 -0
  169. package/src/lib/components/ui/label/index.js +5 -5
  170. package/src/lib/components/ui/label/label.jsx +19 -0
  171. package/src/lib/components/ui/panel/index.js +21 -21
  172. package/src/lib/components/ui/panel/panel-body.jsx +11 -0
  173. package/src/lib/components/ui/panel/panel-close.jsx +16 -0
  174. package/src/lib/components/ui/panel/panel-content.jsx +29 -0
  175. package/src/lib/components/ui/panel/panel-footer.jsx +11 -0
  176. package/src/lib/components/ui/panel/panel-header.jsx +11 -0
  177. package/src/lib/components/ui/panel/panel-title.jsx +12 -0
  178. package/src/lib/components/ui/panel/panel.jsx +4 -0
  179. package/src/lib/components/ui/popover/index.js +26 -26
  180. package/src/lib/components/ui/popover/popover-close.jsx +7 -0
  181. package/src/lib/components/ui/popover/popover-content.jsx +22 -0
  182. package/src/lib/components/ui/popover/popover-description.jsx +11 -0
  183. package/src/lib/components/ui/popover/popover-header.jsx +11 -0
  184. package/src/lib/components/ui/popover/popover-portal.jsx +4 -0
  185. package/src/lib/components/ui/popover/popover-title.jsx +11 -0
  186. package/src/lib/components/ui/popover/popover-trigger.jsx +8 -0
  187. package/src/lib/components/ui/popover/popover.jsx +4 -0
  188. package/src/lib/components/ui/searchable-list.jsx +160 -0
  189. package/src/lib/components/ui/select/index.js +35 -35
  190. package/src/lib/components/ui/select/select-content.jsx +30 -0
  191. package/src/lib/components/ui/select/select-group-heading.jsx +17 -0
  192. package/src/lib/components/ui/select/select-group.jsx +15 -0
  193. package/src/lib/components/ui/select/select-item.jsx +26 -0
  194. package/src/lib/components/ui/select/select-label.jsx +11 -0
  195. package/src/lib/components/ui/select/select-portal.jsx +4 -0
  196. package/src/lib/components/ui/select/select-scroll-down-button.jsx +18 -0
  197. package/src/lib/components/ui/select/select-scroll-up-button.jsx +18 -0
  198. package/src/lib/components/ui/select/select-separator.jsx +15 -0
  199. package/src/lib/components/ui/select/select-trigger.jsx +25 -0
  200. package/src/lib/components/ui/select/select.jsx +4 -0
  201. package/src/lib/components/ui/separator/index.js +5 -5
  202. package/src/lib/components/ui/separator/separator.jsx +22 -0
  203. package/src/lib/components/ui/sheet/index.js +32 -32
  204. package/src/lib/components/ui/sheet/sheet-close.jsx +7 -0
  205. package/src/lib/components/ui/sheet/sheet-content.jsx +35 -0
  206. package/src/lib/components/ui/sheet/sheet-description.jsx +15 -0
  207. package/src/lib/components/ui/sheet/sheet-footer.jsx +11 -0
  208. package/src/lib/components/ui/sheet/sheet-header.jsx +11 -0
  209. package/src/lib/components/ui/sheet/sheet-overlay.jsx +15 -0
  210. package/src/lib/components/ui/sheet/sheet-portal.jsx +4 -0
  211. package/src/lib/components/ui/sheet/sheet-title.jsx +15 -0
  212. package/src/lib/components/ui/sheet/sheet-trigger.jsx +7 -0
  213. package/src/lib/components/ui/sheet/sheet.jsx +4 -0
  214. package/src/lib/components/ui/textarea/index.js +5 -5
  215. package/src/lib/components/ui/textarea/textarea.jsx +18 -0
  216. package/src/lib/components/ui/toggle/index.js +6 -9
  217. package/src/lib/components/ui/toggle/toggle.jsx +36 -0
  218. package/src/lib/components/ui/toggle-group/index.js +8 -8
  219. package/src/lib/components/ui/toggle-group/toggle-group-item.jsx +29 -0
  220. package/src/lib/components/ui/toggle-group/toggle-group.jsx +43 -0
  221. package/src/lib/components/ui/tooltip/index.js +3 -3
  222. package/src/lib/components/ui/tooltip/tooltip-content.jsx +21 -0
  223. package/src/lib/components/ui/tooltip/tooltip-trigger.jsx +23 -0
  224. package/src/lib/components/ui/tooltip/tooltip.jsx +11 -0
  225. package/src/lib/components/ui/trigger-button/index.js +3 -3
  226. package/src/lib/components/ui/trigger-button/trigger-button.css +38 -0
  227. package/src/lib/components/ui/trigger-button/trigger-button.jsx +63 -0
  228. package/src/logger/devLogger.js +238 -0
  229. package/src/logger/devLogger.test.js +193 -0
  230. package/src/modes.test.js +4 -4
  231. package/src/mountStoryboardCore.js +133 -35
  232. package/src/paletteProviders.js +3 -0
  233. package/src/paletteProviders.test.js +2 -2
  234. package/src/server/index.js +104 -40
  235. package/src/sidepanel.css +214 -0
  236. package/src/smoothCorners.js +1 -1
  237. package/src/styles/tailwind.css +1 -1
  238. package/src/svelte-plugin-ui/__tests__/ModeSwitch.test.ts +8 -8
  239. package/src/svelte-plugin-ui/__tests__/ToolbarShell.test.ts +11 -10
  240. package/src/svelte-plugin-ui/components/Icon.css +11 -0
  241. package/src/svelte-plugin-ui/components/Icon.jsx +281 -0
  242. package/src/svelte-plugin-ui/components/ModeSwitch.css +90 -0
  243. package/src/svelte-plugin-ui/components/ModeSwitch.jsx +47 -0
  244. package/src/svelte-plugin-ui/components/ToolbarShell.css +80 -0
  245. package/src/svelte-plugin-ui/components/ToolbarShell.jsx +84 -0
  246. package/src/svelte-plugin-ui/components/Viewfinder.css +412 -0
  247. package/src/svelte-plugin-ui/components/Viewfinder.jsx +513 -0
  248. package/src/svelte-plugin-ui/mount.ts +12 -16
  249. package/src/toolRegistry.js +4 -4
  250. package/src/toolbarConfigStore.js +30 -0
  251. package/src/tools/handlers/autosync.js +1 -1
  252. package/src/tools/handlers/canvasAddWidget.js +1 -1
  253. package/src/tools/handlers/canvasAgents.js +20 -0
  254. package/src/tools/handlers/canvasToolbar.js +8 -8
  255. package/src/tools/handlers/commandPalette.js +9 -0
  256. package/src/tools/handlers/comments.js +2 -2
  257. package/src/tools/handlers/create.js +1 -1
  258. package/src/tools/handlers/devtools.js +19 -3
  259. package/src/tools/handlers/devtools.test.js +38 -0
  260. package/src/tools/handlers/featureFlags.js +1 -1
  261. package/src/tools/handlers/flows.js +3 -3
  262. package/src/tools/handlers/hideChrome.js +9 -0
  263. package/src/tools/handlers/paletteTheme.js +35 -0
  264. package/src/tools/handlers/theme.js +1 -1
  265. package/src/tools/registry.js +4 -1
  266. package/src/tools/surfaces/commandList.js +3 -3
  267. package/src/tools/surfaces/mainToolbar.js +3 -3
  268. package/src/tools/surfaces/registry.js +4 -4
  269. package/src/ui/design-modes.ts +2 -2
  270. package/src/ui/viewfinder.ts +1 -1
  271. package/src/vite/server-plugin.js +243 -61
  272. package/src/workshop/features/createCanvas/CreateCanvasForm.jsx +260 -0
  273. package/src/workshop/features/createCanvas/index.js +1 -1
  274. package/src/workshop/features/createFlow/CreateFlowForm.jsx +334 -0
  275. package/src/workshop/features/createFlow/index.js +1 -1
  276. package/src/workshop/features/createPage/CreatePageForm.jsx +304 -0
  277. package/src/workshop/features/createPage/index.js +1 -1
  278. package/src/workshop/features/createPrototype/CreatePrototypeForm.jsx +289 -0
  279. package/src/workshop/features/createPrototype/index.js +1 -1
  280. package/src/workshop/features/createPrototype/server.js +98 -0
  281. package/src/workshop/features/createStory/CreateStoryForm.jsx +208 -0
  282. package/src/workshop/features/createStory/index.js +1 -1
  283. package/src/workshop/ui/WorkshopPanel.jsx +98 -0
  284. package/src/workshop/ui/mount.ts +1 -1
  285. package/src/worktree/port.js +48 -0
  286. package/src/worktree/serverRegistry.js +120 -0
  287. package/toolbar.config.json +93 -42
  288. package/widgets.config.json +580 -12
  289. package/scaffold/commandpalette.config.json +0 -4
  290. package/scaffold/toolbar.config.json +0 -4
  291. package/src/ActionMenuButton.svelte +0 -119
  292. package/src/AutosyncMenuButton.svelte +0 -397
  293. package/src/CanvasCreateMenu.svelte +0 -295
  294. package/src/CanvasSnap.svelte +0 -87
  295. package/src/CanvasUndoRedo.svelte +0 -108
  296. package/src/CanvasZoomControl.svelte +0 -111
  297. package/src/CanvasZoomToFit.svelte +0 -52
  298. package/src/CommandMenu.svelte +0 -249
  299. package/src/CommandPalette.svelte +0 -33
  300. package/src/CommentsMenuButton.svelte +0 -53
  301. package/src/CoreUIBar.svelte +0 -847
  302. package/src/CreateMenuButton.svelte +0 -133
  303. package/src/DocPanel.svelte +0 -299
  304. package/src/InspectorPanel.svelte +0 -745
  305. package/src/PwaInstallBanner.svelte +0 -124
  306. package/src/SidePanel.svelte +0 -480
  307. package/src/ThemeMenuButton.svelte +0 -132
  308. package/src/comments/ui/AuthModal.svelte +0 -108
  309. package/src/comments/ui/CommentWindow.svelte +0 -333
  310. package/src/comments/ui/CommentsDrawer.svelte +0 -96
  311. package/src/comments/ui/Composer.svelte +0 -65
  312. package/src/lib/components/ui/alert/alert-action.svelte +0 -19
  313. package/src/lib/components/ui/alert/alert-description.svelte +0 -22
  314. package/src/lib/components/ui/alert/alert-title.svelte +0 -22
  315. package/src/lib/components/ui/alert/alert.svelte +0 -38
  316. package/src/lib/components/ui/avatar/avatar-badge.svelte +0 -25
  317. package/src/lib/components/ui/avatar/avatar-fallback.svelte +0 -20
  318. package/src/lib/components/ui/avatar/avatar-group-count.svelte +0 -22
  319. package/src/lib/components/ui/avatar/avatar-group.svelte +0 -22
  320. package/src/lib/components/ui/avatar/avatar-image.svelte +0 -17
  321. package/src/lib/components/ui/avatar/avatar.svelte +0 -24
  322. package/src/lib/components/ui/badge/badge.svelte +0 -44
  323. package/src/lib/components/ui/button/button.svelte +0 -108
  324. package/src/lib/components/ui/card/card-action.svelte +0 -21
  325. package/src/lib/components/ui/card/card-content.svelte +0 -19
  326. package/src/lib/components/ui/card/card-description.svelte +0 -19
  327. package/src/lib/components/ui/card/card-footer.svelte +0 -18
  328. package/src/lib/components/ui/card/card-header.svelte +0 -21
  329. package/src/lib/components/ui/card/card-title.svelte +0 -14
  330. package/src/lib/components/ui/card/card.svelte +0 -21
  331. package/src/lib/components/ui/checkbox/checkbox.svelte +0 -39
  332. package/src/lib/components/ui/collapsible/collapsible-content.svelte +0 -7
  333. package/src/lib/components/ui/collapsible/collapsible-trigger.svelte +0 -7
  334. package/src/lib/components/ui/collapsible/collapsible.svelte +0 -11
  335. package/src/lib/components/ui/dialog/dialog-close.svelte +0 -11
  336. package/src/lib/components/ui/dialog/dialog-content.svelte +0 -42
  337. package/src/lib/components/ui/dialog/dialog-description.svelte +0 -17
  338. package/src/lib/components/ui/dialog/dialog-footer.svelte +0 -29
  339. package/src/lib/components/ui/dialog/dialog-header.svelte +0 -19
  340. package/src/lib/components/ui/dialog/dialog-overlay.svelte +0 -17
  341. package/src/lib/components/ui/dialog/dialog-portal.svelte +0 -7
  342. package/src/lib/components/ui/dialog/dialog-title.svelte +0 -17
  343. package/src/lib/components/ui/dialog/dialog-trigger.svelte +0 -11
  344. package/src/lib/components/ui/dialog/dialog.svelte +0 -7
  345. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +0 -16
  346. package/src/lib/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +0 -40
  347. package/src/lib/components/ui/dropdown-menu/dropdown-menu-content.svelte +0 -27
  348. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +0 -18
  349. package/src/lib/components/ui/dropdown-menu/dropdown-menu-group.svelte +0 -7
  350. package/src/lib/components/ui/dropdown-menu/dropdown-menu-item.svelte +0 -24
  351. package/src/lib/components/ui/dropdown-menu/dropdown-menu-label.svelte +0 -20
  352. package/src/lib/components/ui/dropdown-menu/dropdown-menu-portal.svelte +0 -7
  353. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +0 -16
  354. package/src/lib/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +0 -34
  355. package/src/lib/components/ui/dropdown-menu/dropdown-menu-separator.svelte +0 -17
  356. package/src/lib/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +0 -19
  357. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +0 -17
  358. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +0 -27
  359. package/src/lib/components/ui/dropdown-menu/dropdown-menu-sub.svelte +0 -7
  360. package/src/lib/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +0 -7
  361. package/src/lib/components/ui/dropdown-menu/dropdown-menu.svelte +0 -7
  362. package/src/lib/components/ui/input/input.svelte +0 -40
  363. package/src/lib/components/ui/label/label.svelte +0 -20
  364. package/src/lib/components/ui/panel/panel-body.svelte +0 -13
  365. package/src/lib/components/ui/panel/panel-close.svelte +0 -16
  366. package/src/lib/components/ui/panel/panel-content.svelte +0 -33
  367. package/src/lib/components/ui/panel/panel-footer.svelte +0 -13
  368. package/src/lib/components/ui/panel/panel-header.svelte +0 -16
  369. package/src/lib/components/ui/panel/panel-title.svelte +0 -14
  370. package/src/lib/components/ui/panel/panel.svelte +0 -15
  371. package/src/lib/components/ui/popover/popover-close.svelte +0 -7
  372. package/src/lib/components/ui/popover/popover-content.svelte +0 -27
  373. package/src/lib/components/ui/popover/popover-description.svelte +0 -19
  374. package/src/lib/components/ui/popover/popover-header.svelte +0 -19
  375. package/src/lib/components/ui/popover/popover-portal.svelte +0 -7
  376. package/src/lib/components/ui/popover/popover-title.svelte +0 -19
  377. package/src/lib/components/ui/popover/popover-trigger.svelte +0 -17
  378. package/src/lib/components/ui/popover/popover.svelte +0 -7
  379. package/src/lib/components/ui/select/select-content.svelte +0 -40
  380. package/src/lib/components/ui/select/select-group-heading.svelte +0 -19
  381. package/src/lib/components/ui/select/select-group.svelte +0 -17
  382. package/src/lib/components/ui/select/select-item.svelte +0 -38
  383. package/src/lib/components/ui/select/select-label.svelte +0 -18
  384. package/src/lib/components/ui/select/select-portal.svelte +0 -7
  385. package/src/lib/components/ui/select/select-scroll-down-button.svelte +0 -20
  386. package/src/lib/components/ui/select/select-scroll-up-button.svelte +0 -20
  387. package/src/lib/components/ui/select/select-separator.svelte +0 -17
  388. package/src/lib/components/ui/select/select-trigger.svelte +0 -27
  389. package/src/lib/components/ui/select/select.svelte +0 -11
  390. package/src/lib/components/ui/separator/separator.svelte +0 -23
  391. package/src/lib/components/ui/sheet/sheet-close.svelte +0 -7
  392. package/src/lib/components/ui/sheet/sheet-content.svelte +0 -43
  393. package/src/lib/components/ui/sheet/sheet-description.svelte +0 -17
  394. package/src/lib/components/ui/sheet/sheet-footer.svelte +0 -18
  395. package/src/lib/components/ui/sheet/sheet-header.svelte +0 -19
  396. package/src/lib/components/ui/sheet/sheet-overlay.svelte +0 -17
  397. package/src/lib/components/ui/sheet/sheet-portal.svelte +0 -7
  398. package/src/lib/components/ui/sheet/sheet-title.svelte +0 -17
  399. package/src/lib/components/ui/sheet/sheet-trigger.svelte +0 -7
  400. package/src/lib/components/ui/sheet/sheet.svelte +0 -7
  401. package/src/lib/components/ui/textarea/textarea.svelte +0 -21
  402. package/src/lib/components/ui/toggle/toggle.svelte +0 -45
  403. package/src/lib/components/ui/toggle-group/toggle-group-item.svelte +0 -35
  404. package/src/lib/components/ui/toggle-group/toggle-group.svelte +0 -63
  405. package/src/lib/components/ui/tooltip/tooltip-content.svelte +0 -24
  406. package/src/lib/components/ui/tooltip/tooltip-trigger.svelte +0 -27
  407. package/src/lib/components/ui/tooltip/tooltip.svelte +0 -9
  408. package/src/lib/components/ui/trigger-button/trigger-button.svelte +0 -106
  409. package/src/svelte-plugin-ui/components/Icon.svelte +0 -181
  410. package/src/svelte-plugin-ui/components/ModeSwitch.svelte +0 -121
  411. package/src/svelte-plugin-ui/components/ToolbarShell.svelte +0 -150
  412. package/src/svelte-plugin-ui/components/Viewfinder.svelte +0 -1001
  413. package/src/tools/handlers/docs.js +0 -11
  414. package/src/workshop/features/createCanvas/CreateCanvasForm.svelte +0 -139
  415. package/src/workshop/features/createFlow/CreateFlowForm.svelte +0 -314
  416. package/src/workshop/features/createPage/CreatePageForm.svelte +0 -249
  417. package/src/workshop/features/createPrototype/CreatePrototypeForm.svelte +0 -287
  418. package/src/workshop/features/createStory/CreateStoryForm.svelte +0 -161
  419. package/src/workshop/ui/WorkshopPanel.svelte +0 -97
@@ -1,54 +1,54 @@
1
- import Root from "./dropdown-menu.svelte";
2
- import Sub from "./dropdown-menu-sub.svelte";
3
- import CheckboxGroup from "./dropdown-menu-checkbox-group.svelte";
4
- import CheckboxItem from "./dropdown-menu-checkbox-item.svelte";
5
- import Content from "./dropdown-menu-content.svelte";
6
- import Group from "./dropdown-menu-group.svelte";
7
- import Item from "./dropdown-menu-item.svelte";
8
- import Label from "./dropdown-menu-label.svelte";
9
- import RadioGroup from "./dropdown-menu-radio-group.svelte";
10
- import RadioItem from "./dropdown-menu-radio-item.svelte";
11
- import Separator from "./dropdown-menu-separator.svelte";
12
- import Shortcut from "./dropdown-menu-shortcut.svelte";
13
- import Trigger from "./dropdown-menu-trigger.svelte";
14
- import SubContent from "./dropdown-menu-sub-content.svelte";
15
- import SubTrigger from "./dropdown-menu-sub-trigger.svelte";
16
- import GroupHeading from "./dropdown-menu-group-heading.svelte";
17
- import Portal from "./dropdown-menu-portal.svelte";
1
+ import Root from "./dropdown-menu.jsx";
2
+ import Sub from "./dropdown-menu-sub.jsx";
3
+ import CheckboxGroup from "./dropdown-menu-checkbox-group.jsx";
4
+ import CheckboxItem from "./dropdown-menu-checkbox-item.jsx";
5
+ import Content from "./dropdown-menu-content.jsx";
6
+ import Group from "./dropdown-menu-group.jsx";
7
+ import Item from "./dropdown-menu-item.jsx";
8
+ import Label from "./dropdown-menu-label.jsx";
9
+ import RadioGroup from "./dropdown-menu-radio-group.jsx";
10
+ import RadioItem from "./dropdown-menu-radio-item.jsx";
11
+ import Separator from "./dropdown-menu-separator.jsx";
12
+ import Shortcut from "./dropdown-menu-shortcut.jsx";
13
+ import Trigger from "./dropdown-menu-trigger.jsx";
14
+ import SubContent from "./dropdown-menu-sub-content.jsx";
15
+ import SubTrigger from "./dropdown-menu-sub-trigger.jsx";
16
+ import GroupHeading from "./dropdown-menu-group-heading.jsx";
17
+ import Portal from "./dropdown-menu-portal.jsx";
18
18
 
19
19
  export {
20
- CheckboxGroup,
21
- CheckboxItem,
22
- Content,
23
- Portal,
24
- Root as DropdownMenu,
25
- CheckboxGroup as DropdownMenuCheckboxGroup,
26
- CheckboxItem as DropdownMenuCheckboxItem,
27
- Content as DropdownMenuContent,
28
- Portal as DropdownMenuPortal,
29
- Group as DropdownMenuGroup,
30
- Item as DropdownMenuItem,
31
- Label as DropdownMenuLabel,
32
- RadioGroup as DropdownMenuRadioGroup,
33
- RadioItem as DropdownMenuRadioItem,
34
- Separator as DropdownMenuSeparator,
35
- Shortcut as DropdownMenuShortcut,
36
- Sub as DropdownMenuSub,
37
- SubContent as DropdownMenuSubContent,
38
- SubTrigger as DropdownMenuSubTrigger,
39
- Trigger as DropdownMenuTrigger,
40
- GroupHeading as DropdownMenuGroupHeading,
41
- Group,
42
- GroupHeading,
43
- Item,
44
- Label,
45
- RadioGroup,
46
- RadioItem,
47
- Root,
48
- Separator,
49
- Shortcut,
50
- Sub,
51
- SubContent,
52
- SubTrigger,
53
- Trigger,
54
- };
20
+ CheckboxGroup,
21
+ CheckboxItem,
22
+ Content,
23
+ Portal,
24
+ Root as DropdownMenu,
25
+ CheckboxGroup as DropdownMenuCheckboxGroup,
26
+ CheckboxItem as DropdownMenuCheckboxItem,
27
+ Content as DropdownMenuContent,
28
+ Portal as DropdownMenuPortal,
29
+ Group as DropdownMenuGroup,
30
+ Item as DropdownMenuItem,
31
+ Label as DropdownMenuLabel,
32
+ RadioGroup as DropdownMenuRadioGroup,
33
+ RadioItem as DropdownMenuRadioItem,
34
+ Separator as DropdownMenuSeparator,
35
+ Shortcut as DropdownMenuShortcut,
36
+ Sub as DropdownMenuSub,
37
+ SubContent as DropdownMenuSubContent,
38
+ SubTrigger as DropdownMenuSubTrigger,
39
+ Trigger as DropdownMenuTrigger,
40
+ GroupHeading as DropdownMenuGroupHeading,
41
+ Group,
42
+ GroupHeading,
43
+ Item,
44
+ Label,
45
+ RadioGroup,
46
+ RadioItem,
47
+ Root,
48
+ Separator,
49
+ Shortcut,
50
+ Sub,
51
+ SubContent,
52
+ SubTrigger,
53
+ Trigger,
54
+ };
@@ -1,7 +1,7 @@
1
- import Root from "./input.svelte";
1
+ import Root from "./input.jsx";
2
2
 
3
3
  export {
4
- Root,
5
- //
6
- Root as Input,
7
- };
4
+ Root,
5
+ //
6
+ Root as Input,
7
+ };
@@ -0,0 +1,19 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const Input = forwardRef(function Input({ className, type, "data-slot": dataSlot = "input", ...props }, ref) {
5
+ return (
6
+ <input
7
+ ref={ref}
8
+ data-slot={dataSlot}
9
+ type={type}
10
+ className={cn(
11
+ "dark:bg-input/30 border-input focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 disabled:bg-input/50 dark:disabled:bg-input/80 h-8 rounded-lg border bg-transparent px-2.5 py-1 text-base transition-colors file:h-6 file:text-sm file:font-medium focus-visible:ring-3 aria-invalid:ring-3 md:text-sm file:text-foreground placeholder:text-muted-foreground w-full min-w-0 outline-none file:inline-flex file:border-0 file:bg-transparent disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
12
+ className
13
+ )}
14
+ {...props}
15
+ />
16
+ );
17
+ });
18
+
19
+ export default Input;
@@ -1,7 +1,7 @@
1
- import Root from "./label.svelte";
1
+ import Root from "./label.jsx";
2
2
 
3
3
  export {
4
- Root,
5
- //
6
- Root as Label,
7
- };
4
+ Root,
5
+ //
6
+ Root as Label,
7
+ };
@@ -0,0 +1,19 @@
1
+ import { forwardRef } from "react";
2
+ import * as LabelPrimitive from "@radix-ui/react-label";
3
+ import { cn } from "../../../utils/index.js";
4
+
5
+ const Label = forwardRef(function Label({ className, ...props }, ref) {
6
+ return (
7
+ <LabelPrimitive.Root
8
+ ref={ref}
9
+ data-slot="label"
10
+ className={cn(
11
+ "gap-2 text-sm leading-none font-medium group-data-[disabled=true]:opacity-50 peer-disabled:opacity-50 flex items-center select-none group-data-[disabled=true]:pointer-events-none peer-disabled:cursor-not-allowed",
12
+ className
13
+ )}
14
+ {...props}
15
+ />
16
+ );
17
+ });
18
+
19
+ export default Label;
@@ -1,24 +1,24 @@
1
- import Root from "./panel.svelte";
2
- import Content from "./panel-content.svelte";
3
- import Header from "./panel-header.svelte";
4
- import Title from "./panel-title.svelte";
5
- import Body from "./panel-body.svelte";
6
- import Footer from "./panel-footer.svelte";
7
- import Close from "./panel-close.svelte";
1
+ import Root from "./panel.jsx";
2
+ import Content from "./panel-content.jsx";
3
+ import Header from "./panel-header.jsx";
4
+ import Title from "./panel-title.jsx";
5
+ import Body from "./panel-body.jsx";
6
+ import Footer from "./panel-footer.jsx";
7
+ import Close from "./panel-close.jsx";
8
8
 
9
9
  export {
10
- Root,
11
- Content,
12
- Header,
13
- Title,
14
- Body,
15
- Footer,
16
- Close,
17
- Root as Panel,
18
- Content as PanelContent,
19
- Header as PanelHeader,
20
- Title as PanelTitle,
21
- Body as PanelBody,
22
- Footer as PanelFooter,
23
- Close as PanelClose,
10
+ Root,
11
+ Content,
12
+ Header,
13
+ Title,
14
+ Body,
15
+ Footer,
16
+ Close,
17
+ Root as Panel,
18
+ Content as PanelContent,
19
+ Header as PanelHeader,
20
+ Title as PanelTitle,
21
+ Body as PanelBody,
22
+ Footer as PanelFooter,
23
+ Close as PanelClose,
24
24
  };
@@ -0,0 +1,11 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const PanelBody = forwardRef(function PanelBody({ className, children, ...props }, ref) {
5
+ return (
6
+ <div ref={ref} data-slot="panel-body" className={cn("flex-1 overflow-auto px-4 py-2", className)} {...props}>
7
+ {children}
8
+ </div>
9
+ );
10
+ });
11
+ export default PanelBody;
@@ -0,0 +1,16 @@
1
+ import { forwardRef } from "react";
2
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
3
+ import { Button } from "../../../components/ui/button/index.js";
4
+ import { X } from "lucide-react";
5
+
6
+ const PanelClose = forwardRef(function PanelClose({ className, ...props }, ref) {
7
+ return (
8
+ <DialogPrimitive.Close asChild data-slot="panel-close">
9
+ <Button ref={ref} variant="ghost" size="icon-sm" className={className} {...props}>
10
+ <X />
11
+ <span className="sr-only">Close</span>
12
+ </Button>
13
+ </DialogPrimitive.Close>
14
+ );
15
+ });
16
+ export default PanelClose;
@@ -0,0 +1,29 @@
1
+ import { forwardRef } from "react";
2
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
3
+ import { cn } from "../../../utils/index.js";
4
+
5
+ const PanelContent = forwardRef(function PanelContent({ className, children, ...props }, ref) {
6
+ return (
7
+ <DialogPrimitive.Portal>
8
+ <DialogPrimitive.Content
9
+ ref={ref}
10
+ data-slot="panel-content"
11
+ onInteractOutside={(e) => e.preventDefault()}
12
+ onFocusOutside={(e) => e.preventDefault()}
13
+ className={cn(
14
+ "font-sans fixed z-[10000] bottom-28 right-6 w-[400px] max-h-[90vh] flex flex-col",
15
+ "bg-popover text-popover-foreground border-3 border-slate-400",
16
+ "rounded-xl shadow-xl overflow-x-hidden overflow-y-auto",
17
+ "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:slide-in-from-bottom-4",
18
+ "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-bottom-4",
19
+ "duration-150",
20
+ className
21
+ )}
22
+ {...props}
23
+ >
24
+ {children}
25
+ </DialogPrimitive.Content>
26
+ </DialogPrimitive.Portal>
27
+ );
28
+ });
29
+ export default PanelContent;
@@ -0,0 +1,11 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const PanelFooter = forwardRef(function PanelFooter({ className, children, ...props }, ref) {
5
+ return (
6
+ <div ref={ref} data-slot="panel-footer" className={cn("flex items-center justify-end gap-2 px-4 pt-2 pb-4", className)} {...props}>
7
+ {children}
8
+ </div>
9
+ );
10
+ });
11
+ export default PanelFooter;
@@ -0,0 +1,11 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const PanelHeader = forwardRef(function PanelHeader({ className, children, ...props }, ref) {
5
+ return (
6
+ <div ref={ref} data-slot="panel-header" className={cn("flex items-center justify-between gap-2 px-4 pt-4 pb-2", className)} {...props}>
7
+ {children}
8
+ </div>
9
+ );
10
+ });
11
+ export default PanelHeader;
@@ -0,0 +1,12 @@
1
+ import { forwardRef } from "react";
2
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
3
+ import { cn } from "../../../utils/index.js";
4
+
5
+ const PanelTitle = forwardRef(function PanelTitle({ className, children, ...props }, ref) {
6
+ return (
7
+ <DialogPrimitive.Title ref={ref} data-slot="panel-title" className={cn("text-sm font-semibold", className)} {...props}>
8
+ {children}
9
+ </DialogPrimitive.Title>
10
+ );
11
+ });
12
+ export default PanelTitle;
@@ -0,0 +1,4 @@
1
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
2
+ export default function Panel({ children, ...props }) {
3
+ return <DialogPrimitive.Root {...props}>{children}</DialogPrimitive.Root>;
4
+ }
@@ -1,28 +1,28 @@
1
- import Root from "./popover.svelte";
2
- import Close from "./popover-close.svelte";
3
- import Content from "./popover-content.svelte";
4
- import Description from "./popover-description.svelte";
5
- import Header from "./popover-header.svelte";
6
- import Title from "./popover-title.svelte";
7
- import Trigger from "./popover-trigger.svelte";
8
- import Portal from "./popover-portal.svelte";
1
+ import Root from "./popover.jsx";
2
+ import Close from "./popover-close.jsx";
3
+ import Content from "./popover-content.jsx";
4
+ import Description from "./popover-description.jsx";
5
+ import Header from "./popover-header.jsx";
6
+ import Title from "./popover-title.jsx";
7
+ import Trigger from "./popover-trigger.jsx";
8
+ import Portal from "./popover-portal.jsx";
9
9
 
10
10
  export {
11
- Root,
12
- Content,
13
- Description,
14
- Header,
15
- Title,
16
- Trigger,
17
- Close,
18
- Portal,
19
- //
20
- Root as Popover,
21
- Content as PopoverContent,
22
- Description as PopoverDescription,
23
- Header as PopoverHeader,
24
- Title as PopoverTitle,
25
- Trigger as PopoverTrigger,
26
- Close as PopoverClose,
27
- Portal as PopoverPortal,
28
- };
11
+ Root,
12
+ Content,
13
+ Description,
14
+ Header,
15
+ Title,
16
+ Trigger,
17
+ Close,
18
+ Portal,
19
+ //
20
+ Root as Popover,
21
+ Content as PopoverContent,
22
+ Description as PopoverDescription,
23
+ Header as PopoverHeader,
24
+ Title as PopoverTitle,
25
+ Trigger as PopoverTrigger,
26
+ Close as PopoverClose,
27
+ Portal as PopoverPortal,
28
+ };
@@ -0,0 +1,7 @@
1
+ import { forwardRef } from "react";
2
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
3
+
4
+ const PopoverClose = forwardRef(function PopoverClose(props, ref) {
5
+ return <PopoverPrimitive.Close ref={ref} data-slot="popover-close" {...props} />;
6
+ });
7
+ export default PopoverClose;
@@ -0,0 +1,22 @@
1
+ import { forwardRef } from "react";
2
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
3
+ import { cn } from "../../../utils/index.js";
4
+
5
+ const PopoverContent = forwardRef(function PopoverContent({ className, sideOffset = 4, align = "center", ...props }, ref) {
6
+ return (
7
+ <PopoverPrimitive.Portal>
8
+ <PopoverPrimitive.Content
9
+ ref={ref}
10
+ data-slot="popover-content"
11
+ sideOffset={sideOffset}
12
+ align={align}
13
+ className={cn(
14
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 flex flex-col gap-2.5 rounded-lg p-2.5 text-sm shadow-md ring-1 duration-100 z-50 w-72 origin-(--transform-origin) outline-hidden",
15
+ className
16
+ )}
17
+ {...props}
18
+ />
19
+ </PopoverPrimitive.Portal>
20
+ );
21
+ });
22
+ export default PopoverContent;
@@ -0,0 +1,11 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const PopoverDescription = forwardRef(function PopoverDescription({ className, children, ...props }, ref) {
5
+ return (
6
+ <div ref={ref} data-slot="popover-description" className={cn("text-muted-foreground", className)} {...props}>
7
+ {children}
8
+ </div>
9
+ );
10
+ });
11
+ export default PopoverDescription;
@@ -0,0 +1,11 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const PopoverHeader = forwardRef(function PopoverHeader({ className, children, ...props }, ref) {
5
+ return (
6
+ <div ref={ref} data-slot="popover-header" className={cn("flex flex-col gap-0.5 text-sm", className)} {...props}>
7
+ {children}
8
+ </div>
9
+ );
10
+ });
11
+ export default PopoverHeader;
@@ -0,0 +1,4 @@
1
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
+ export default function PopoverPortal(props) {
3
+ return <PopoverPrimitive.Portal {...props} />;
4
+ }
@@ -0,0 +1,11 @@
1
+ import { forwardRef } from "react";
2
+ import { cn } from "../../../utils/index.js";
3
+
4
+ const PopoverTitle = forwardRef(function PopoverTitle({ className, children, ...props }, ref) {
5
+ return (
6
+ <div ref={ref} data-slot="popover-title" className={cn("font-medium", className)} {...props}>
7
+ {children}
8
+ </div>
9
+ );
10
+ });
11
+ export default PopoverTitle;
@@ -0,0 +1,8 @@
1
+ import { forwardRef } from "react";
2
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
3
+ import { cn } from "../../../utils/index.js";
4
+
5
+ const PopoverTrigger = forwardRef(function PopoverTrigger({ className, ...props }, ref) {
6
+ return <PopoverPrimitive.Trigger ref={ref} data-slot="popover-trigger" className={cn("", className)} {...props} />;
7
+ });
8
+ export default PopoverTrigger;
@@ -0,0 +1,4 @@
1
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
2
+ export default function Popover({ children, ...props }) {
3
+ return <PopoverPrimitive.Root {...props}>{children}</PopoverPrimitive.Root>;
4
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * SearchableList — a filterable list with an auto-focused search input.
3
+ *
4
+ * Designed to work inside dropdown menus and popovers. Prevents printable-key
5
+ * events from bubbling so host menus (e.g. Radix typeahead) don't hijack input.
6
+ * Navigation keys (arrows, escape, tab) still bubble for menu keyboard nav.
7
+ *
8
+ * Usage:
9
+ * <SearchableList
10
+ * items={items}
11
+ * filterFn={(item, query) => item.name.toLowerCase().includes(query)}
12
+ * renderItem={(item) => <MenuItem key={item.id}>{item.name}</MenuItem>}
13
+ * placeholder="Filter…"
14
+ * />
15
+ */
16
+ import { useState, useRef, useEffect, useMemo, useCallback, forwardRef } from 'react'
17
+ import { Input } from './input/index.js'
18
+ import { cn } from '../../utils/index.js'
19
+
20
+ /** Keys that should always bubble to the parent menu for navigation. */
21
+ const PASSTHROUGH_KEYS = new Set([
22
+ 'Escape', 'Tab', 'ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight',
23
+ 'Home', 'End', 'Enter', 'PageUp', 'PageDown',
24
+ ])
25
+
26
+ /**
27
+ * @param {Object} props
28
+ * @param {Array} props.items - Items to display and filter
29
+ * @param {(item: any, query: string) => boolean} props.filterFn - Filter predicate (query is pre-lowercased)
30
+ * @param {(item: any, index: number) => React.ReactNode} props.renderItem - Render each item
31
+ * @param {string} [props.placeholder='Search…'] - Input placeholder
32
+ * @param {string} [props.emptyMessage='No results'] - Shown when filter yields no results
33
+ * @param {string} [props.loadingMessage='Loading…'] - Shown while loading
34
+ * @param {boolean} [props.loading=false] - Whether items are still loading
35
+ * @param {React.ReactNode} [props.header] - Slot rendered between input and results (always visible)
36
+ * @param {boolean} [props.autoFocus=true] - Focus the input on mount
37
+ * @param {string} [props.className] - Wrapper className
38
+ * @param {string} [props.listClassName] - Scrollable results area className
39
+ * @param {React.RefObject} [props.inputRef] - External ref for the input element
40
+ */
41
+ const SearchableList = forwardRef(function SearchableList(
42
+ {
43
+ items = [],
44
+ filterFn,
45
+ renderItem,
46
+ placeholder = 'Search…',
47
+ emptyMessage = 'No results',
48
+ loadingMessage = 'Loading…',
49
+ loading = false,
50
+ header,
51
+ autoFocus = true,
52
+ className,
53
+ listClassName,
54
+ inputRef: externalInputRef,
55
+ },
56
+ ref,
57
+ ) {
58
+ const [query, setQuery] = useState('')
59
+ const internalInputRef = useRef(null)
60
+ const inputRef = externalInputRef || internalInputRef
61
+ const listRef = useRef(null)
62
+
63
+ // Auto-focus the input on mount — double rAF lets the host menu
64
+ // finish its own focus management before we steal focus.
65
+ useEffect(() => {
66
+ if (!autoFocus) return
67
+ const outer = requestAnimationFrame(() => {
68
+ requestAnimationFrame(() => {
69
+ inputRef.current?.focus()
70
+ })
71
+ })
72
+ return () => cancelAnimationFrame(outer)
73
+ }, [autoFocus])
74
+
75
+ const filteredItems = useMemo(() => {
76
+ const q = query.trim().toLowerCase()
77
+ if (!q || !filterFn) return items
78
+ return items.filter((item) => filterFn(item, q))
79
+ }, [items, query, filterFn])
80
+
81
+ // Handle keyboard navigation between input and list.
82
+ // Printable keys are suppressed so Radix typeahead doesn't intercept them.
83
+ const handleKeyDown = useCallback((e) => {
84
+ // ArrowDown from input → focus first menu item in results
85
+ if (e.key === 'ArrowDown') {
86
+ const firstItem = listRef.current?.querySelector('[role="menuitem"]')
87
+ if (firstItem) {
88
+ e.preventDefault()
89
+ e.stopPropagation()
90
+ firstItem.focus()
91
+ }
92
+ return
93
+ }
94
+ // Tab from input → focus first menu item (keeps user in the dropdown)
95
+ if (e.key === 'Tab' && !e.shiftKey) {
96
+ const firstItem = listRef.current?.querySelector('[role="menuitem"]')
97
+ if (firstItem) {
98
+ e.preventDefault()
99
+ e.stopPropagation()
100
+ firstItem.focus()
101
+ }
102
+ return
103
+ }
104
+ if (!PASSTHROUGH_KEYS.has(e.key)) {
105
+ e.stopPropagation()
106
+ }
107
+ }, [])
108
+
109
+ // Shift+Tab from any list item → return focus to the input
110
+ // eslint-disable-next-line react-hooks/preserve-manual-memoization
111
+ const handleListKeyDown = useCallback((e) => {
112
+ if (e.key === 'Tab' && e.shiftKey) {
113
+ e.preventDefault()
114
+ e.stopPropagation()
115
+ inputRef.current?.focus()
116
+ }
117
+ }, [])
118
+
119
+ return (
120
+ <div ref={ref} className={cn('flex flex-col', className)}>
121
+ {/* Search input — pinned at top */}
122
+ <div
123
+ className="px-2 pt-1 pb-1.5"
124
+ onKeyDown={handleKeyDown}
125
+ onPointerDown={(e) => e.stopPropagation()}
126
+ >
127
+ <Input
128
+ ref={inputRef}
129
+ type="text"
130
+ value={query}
131
+ onChange={(e) => setQuery(e.target.value)}
132
+ placeholder={placeholder}
133
+ autoComplete="off"
134
+ spellCheck={false}
135
+ className="h-9 text-xs rounded"
136
+ aria-label={placeholder}
137
+ />
138
+ </div>
139
+
140
+ {/* Optional header slot (e.g. "Create new…" button) — always visible */}
141
+ {header}
142
+
143
+ {/* Scrollable results area */}
144
+ <div ref={listRef} className={cn('overflow-y-auto', listClassName)} onKeyDown={handleListKeyDown}>
145
+ {loading ? (
146
+ <p className="px-2 py-3 text-xs text-muted-foreground text-center">{loadingMessage}</p>
147
+ ) : filteredItems.length > 0 ? (
148
+ filteredItems.map(renderItem)
149
+ ) : query.trim() ? (
150
+ <p className="px-2 py-3 text-xs text-muted-foreground text-center">{emptyMessage}</p>
151
+ ) : items.length === 0 ? (
152
+ <p className="px-2 py-3 text-xs text-muted-foreground text-center">No items</p>
153
+ ) : null}
154
+ </div>
155
+ </div>
156
+ )
157
+ })
158
+
159
+ export { SearchableList }
160
+ export default SearchableList