@btst/stack 1.10.0 → 1.12.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 (237) hide show
  1. package/dist/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@dnd-kit/core/dist/core.esm.cjs +1 -1
  2. package/dist/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0/node_modules/@dnd-kit/core/dist/core.esm.mjs +1 -1
  3. package/dist/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +77 -0
  4. package/dist/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.2.0_react@19.2.0__react@19.2.0__react@19.2.0/node_modules/@dnd-kit/sortable/dist/sortable.esm.mjs +79 -3
  5. package/dist/node_modules/.pnpm/@radix-ui_react-avatar@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react_850cfbef1935a6e49a6ad6c93c7ca70d/node_modules/@radix-ui/react-avatar/dist/index.cjs +140 -0
  6. package/dist/node_modules/.pnpm/@radix-ui_react-avatar@1.1.11_@types_react-dom@19.2.3_@types_react@19.2.6__@types_react_850cfbef1935a6e49a6ad6c93c7ca70d/node_modules/@radix-ui/react-avatar/dist/index.mjs +119 -0
  7. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.3_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.cjs +80 -0
  8. package/dist/node_modules/.pnpm/@radix-ui_react-context@1.1.3_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-context/dist/index.mjs +64 -0
  9. package/dist/node_modules/.pnpm/@radix-ui_react-use-is-hydrated@0.1.0_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-is-hydrated/dist/index.cjs +18 -0
  10. package/dist/node_modules/.pnpm/@radix-ui_react-use-is-hydrated@0.1.0_@types_react@19.2.6_react@19.2.0/node_modules/@radix-ui/react-use-is-hydrated/dist/index.mjs +16 -0
  11. package/dist/packages/better-stack/src/plugins/kanban/api/plugin.cjs +846 -0
  12. package/dist/packages/better-stack/src/plugins/kanban/api/plugin.mjs +844 -0
  13. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/board-form.cjs +85 -0
  14. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/board-form.mjs +83 -0
  15. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/column-form.cjs +72 -0
  16. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/column-form.mjs +70 -0
  17. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/task-form.cjs +200 -0
  18. package/dist/packages/better-stack/src/plugins/kanban/client/components/forms/task-form.mjs +198 -0
  19. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/board-skeleton.cjs +47 -0
  20. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/board-skeleton.mjs +45 -0
  21. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/boards-list-skeleton.cjs +30 -0
  22. package/dist/packages/better-stack/src/plugins/kanban/client/components/loading/boards-list-skeleton.mjs +28 -0
  23. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/404-page.cjs +27 -0
  24. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/404-page.mjs +25 -0
  25. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.cjs +31 -0
  26. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.internal.cjs +458 -0
  27. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.internal.mjs +456 -0
  28. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/board-page.mjs +29 -0
  29. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.cjs +30 -0
  30. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.internal.cjs +72 -0
  31. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.internal.mjs +70 -0
  32. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/boards-list-page.mjs +28 -0
  33. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.cjs +30 -0
  34. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.internal.cjs +51 -0
  35. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.internal.mjs +49 -0
  36. package/dist/packages/better-stack/src/plugins/kanban/client/components/pages/new-board-page.mjs +28 -0
  37. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/column-content.cjs +76 -0
  38. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/column-content.mjs +74 -0
  39. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/default-error.cjs +27 -0
  40. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/default-error.mjs +25 -0
  41. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/empty-state.cjs +32 -0
  42. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/empty-state.mjs +30 -0
  43. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/kanban-board.cjs +78 -0
  44. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/kanban-board.mjs +76 -0
  45. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/page-wrapper.cjs +15 -0
  46. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/page-wrapper.mjs +13 -0
  47. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/task-card.cjs +68 -0
  48. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/task-card.mjs +66 -0
  49. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/user-avatar.cjs +32 -0
  50. package/dist/packages/better-stack/src/plugins/kanban/client/components/shared/user-avatar.mjs +30 -0
  51. package/dist/packages/better-stack/src/plugins/kanban/client/hooks/kanban-hooks.cjs +391 -0
  52. package/dist/packages/better-stack/src/plugins/kanban/client/hooks/kanban-hooks.mjs +381 -0
  53. package/dist/packages/better-stack/src/plugins/kanban/client/plugin.cjs +290 -0
  54. package/dist/packages/better-stack/src/plugins/kanban/client/plugin.mjs +288 -0
  55. package/dist/packages/better-stack/src/plugins/kanban/db.cjs +125 -0
  56. package/dist/packages/better-stack/src/plugins/kanban/db.mjs +123 -0
  57. package/dist/packages/better-stack/src/plugins/kanban/schemas.cjs +117 -0
  58. package/dist/packages/better-stack/src/plugins/kanban/schemas.mjs +102 -0
  59. package/dist/packages/better-stack/src/plugins/kanban/utils.cjs +49 -0
  60. package/dist/packages/better-stack/src/plugins/kanban/utils.mjs +45 -0
  61. package/dist/packages/ui/src/components/avatar.cjs +58 -0
  62. package/dist/packages/ui/src/components/avatar.mjs +54 -0
  63. package/dist/packages/ui/src/components/command.cjs +3 -3
  64. package/dist/packages/ui/src/components/command.mjs +3 -3
  65. package/dist/packages/ui/src/components/form-builder/index.mjs +2 -2
  66. package/dist/packages/ui/src/components/kanban.cjs +835 -0
  67. package/dist/packages/ui/src/components/kanban.mjs +805 -0
  68. package/dist/packages/ui/src/components/minimal-tiptap/utils.cjs +15 -11
  69. package/dist/packages/ui/src/components/minimal-tiptap/utils.mjs +15 -11
  70. package/dist/packages/ui/src/components/popover.cjs +8 -3
  71. package/dist/packages/ui/src/components/popover.mjs +9 -4
  72. package/dist/packages/ui/src/components/search-select.cjs +75 -0
  73. package/dist/packages/ui/src/components/search-select.mjs +73 -0
  74. package/dist/packages/ui/src/components/ui-builder/index.cjs +9 -7
  75. package/dist/packages/ui/src/components/ui-builder/index.mjs +9 -7
  76. package/dist/packages/ui/src/components/ui-builder/internal/canvas/auto-frame.cjs +6 -3
  77. package/dist/packages/ui/src/components/ui-builder/internal/canvas/auto-frame.mjs +6 -3
  78. package/dist/packages/ui/src/components/ui-builder/internal/components/add-component-popover.cjs +228 -48
  79. package/dist/packages/ui/src/components/ui-builder/internal/components/add-component-popover.mjs +228 -48
  80. package/dist/packages/ui/src/components/ui-builder/internal/components/element-selector.cjs +1 -1
  81. package/dist/packages/ui/src/components/ui-builder/internal/components/element-selector.mjs +1 -1
  82. package/dist/packages/ui/src/components/ui-builder/internal/components/error-fallback.cjs +4 -2
  83. package/dist/packages/ui/src/components/ui-builder/internal/components/error-fallback.mjs +4 -2
  84. package/dist/packages/ui/src/components/ui-builder/internal/components/multi-select.cjs +6 -3
  85. package/dist/packages/ui/src/components/ui-builder/internal/components/multi-select.mjs +6 -3
  86. package/dist/packages/ui/src/components/ui-builder/internal/dnd/draggable-new-component.cjs +67 -0
  87. package/dist/packages/ui/src/components/ui-builder/internal/dnd/draggable-new-component.mjs +62 -0
  88. package/dist/packages/ui/src/components/ui-builder/internal/dnd/drop-zone.cjs +181 -37
  89. package/dist/packages/ui/src/components/ui-builder/internal/dnd/drop-zone.mjs +181 -38
  90. package/dist/packages/ui/src/components/ui-builder/internal/editor-panel.cjs +1 -1
  91. package/dist/packages/ui/src/components/ui-builder/internal/editor-panel.mjs +1 -1
  92. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-group-control.cjs +1 -1
  93. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-group-control.mjs +1 -1
  94. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-item-control.cjs +9 -2
  95. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/classname-control/classname-item-control.mjs +9 -2
  96. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/iconname-field.cjs +3 -2
  97. package/dist/packages/ui/src/components/ui-builder/internal/form-fields/iconname-field.mjs +3 -2
  98. package/dist/packages/ui/src/components/ui-builder/internal/layers-panel.cjs +1 -1
  99. package/dist/packages/ui/src/components/ui-builder/internal/layers-panel.mjs +1 -1
  100. package/dist/packages/ui/src/components/ui-builder/internal/props-panel.cjs +17 -5
  101. package/dist/packages/ui/src/components/ui-builder/internal/props-panel.mjs +17 -5
  102. package/dist/packages/ui/src/components/ui-builder/internal/utils/render-utils.cjs +70 -16
  103. package/dist/packages/ui/src/components/ui-builder/internal/utils/render-utils.mjs +73 -20
  104. package/dist/packages/ui/src/lib/compose-refs.cjs +56 -0
  105. package/dist/packages/ui/src/lib/compose-refs.mjs +39 -0
  106. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context-colission-utils.cjs +14 -9
  107. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context-colission-utils.mjs +14 -9
  108. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context.cjs +38 -10
  109. package/dist/packages/ui/src/lib/ui-builder/context/dnd-context.mjs +35 -11
  110. package/dist/packages/ui/src/lib/ui-builder/context/dnd-contexts.cjs +1 -0
  111. package/dist/packages/ui/src/lib/ui-builder/context/dnd-contexts.mjs +1 -0
  112. package/dist/packages/ui/src/lib/ui-builder/context/drag-overlay.cjs +7 -4
  113. package/dist/packages/ui/src/lib/ui-builder/context/drag-overlay.mjs +7 -4
  114. package/dist/packages/ui/src/lib/ui-builder/hooks/use-auto-scroll.cjs +4 -4
  115. package/dist/packages/ui/src/lib/ui-builder/hooks/use-auto-scroll.mjs +4 -4
  116. package/dist/packages/ui/src/lib/ui-builder/hooks/use-dnd-event-handlers.cjs +53 -16
  117. package/dist/packages/ui/src/lib/ui-builder/hooks/use-dnd-event-handlers.mjs +53 -16
  118. package/dist/packages/ui/src/lib/ui-builder/hooks/use-drop-validation.cjs +23 -7
  119. package/dist/packages/ui/src/lib/ui-builder/hooks/use-drop-validation.mjs +23 -7
  120. package/dist/packages/ui/src/lib/ui-builder/registry/form-field-overrides.cjs +110 -11
  121. package/dist/packages/ui/src/lib/ui-builder/registry/form-field-overrides.mjs +111 -13
  122. package/dist/packages/ui/src/lib/ui-builder/store/editor-store.cjs +3 -2
  123. package/dist/packages/ui/src/lib/ui-builder/store/editor-store.mjs +3 -2
  124. package/dist/packages/ui/src/lib/ui-builder/store/layer-store.cjs +53 -7
  125. package/dist/packages/ui/src/lib/ui-builder/store/layer-store.mjs +54 -8
  126. package/dist/packages/ui/src/lib/ui-builder/store/layer-utils.cjs +4 -3
  127. package/dist/packages/ui/src/lib/ui-builder/store/layer-utils.mjs +4 -3
  128. package/dist/packages/ui/src/lib/ui-builder/utils/variable-resolver.cjs +12 -0
  129. package/dist/packages/ui/src/lib/ui-builder/utils/variable-resolver.mjs +12 -1
  130. package/dist/plugins/blog/api/index.d.cts +1 -1
  131. package/dist/plugins/blog/api/index.d.mts +1 -1
  132. package/dist/plugins/blog/api/index.d.ts +1 -1
  133. package/dist/plugins/blog/client/hooks/index.d.cts +2 -2
  134. package/dist/plugins/blog/client/hooks/index.d.mts +2 -2
  135. package/dist/plugins/blog/client/hooks/index.d.ts +2 -2
  136. package/dist/plugins/blog/client/index.d.cts +1 -1
  137. package/dist/plugins/blog/client/index.d.mts +1 -1
  138. package/dist/plugins/blog/client/index.d.ts +1 -1
  139. package/dist/plugins/blog/query-keys.d.cts +2 -2
  140. package/dist/plugins/blog/query-keys.d.mts +2 -2
  141. package/dist/plugins/blog/query-keys.d.ts +2 -2
  142. package/dist/plugins/kanban/api/index.cjs +7 -0
  143. package/dist/plugins/kanban/api/index.d.cts +403 -0
  144. package/dist/plugins/kanban/api/index.d.mts +403 -0
  145. package/dist/plugins/kanban/api/index.d.ts +403 -0
  146. package/dist/plugins/kanban/api/index.mjs +1 -0
  147. package/dist/plugins/kanban/client/components/index.cjs +35 -0
  148. package/dist/plugins/kanban/client/components/index.d.cts +102 -0
  149. package/dist/plugins/kanban/client/components/index.d.mts +102 -0
  150. package/dist/plugins/kanban/client/components/index.d.ts +102 -0
  151. package/dist/plugins/kanban/client/components/index.mjs +15 -0
  152. package/dist/plugins/kanban/client/hooks/index.cjs +15 -0
  153. package/dist/plugins/kanban/client/hooks/index.d.cts +143 -0
  154. package/dist/plugins/kanban/client/hooks/index.d.mts +143 -0
  155. package/dist/plugins/kanban/client/hooks/index.d.ts +143 -0
  156. package/dist/plugins/kanban/client/hooks/index.mjs +1 -0
  157. package/dist/plugins/kanban/client/index.cjs +7 -0
  158. package/dist/plugins/kanban/client/index.d.cts +196 -0
  159. package/dist/plugins/kanban/client/index.d.mts +196 -0
  160. package/dist/plugins/kanban/client/index.d.ts +196 -0
  161. package/dist/plugins/kanban/client/index.mjs +1 -0
  162. package/dist/plugins/kanban/client.css +68 -0
  163. package/dist/plugins/kanban/query-keys.cjs +105 -0
  164. package/dist/plugins/kanban/query-keys.d.cts +59 -0
  165. package/dist/plugins/kanban/query-keys.d.mts +59 -0
  166. package/dist/plugins/kanban/query-keys.d.ts +59 -0
  167. package/dist/plugins/kanban/query-keys.mjs +103 -0
  168. package/dist/plugins/kanban/style.css +7 -0
  169. package/dist/plugins/ui-builder/client/components/index.d.cts +1 -1
  170. package/dist/plugins/ui-builder/client/components/index.d.mts +1 -1
  171. package/dist/plugins/ui-builder/client/components/index.d.ts +1 -1
  172. package/dist/plugins/ui-builder/client/hooks/index.d.cts +2 -2
  173. package/dist/plugins/ui-builder/client/hooks/index.d.mts +2 -2
  174. package/dist/plugins/ui-builder/client/hooks/index.d.ts +2 -2
  175. package/dist/plugins/ui-builder/client/index.d.cts +17 -7
  176. package/dist/plugins/ui-builder/client/index.d.mts +17 -7
  177. package/dist/plugins/ui-builder/client/index.d.ts +17 -7
  178. package/dist/plugins/ui-builder/index.d.cts +2 -2
  179. package/dist/plugins/ui-builder/index.d.mts +2 -2
  180. package/dist/plugins/ui-builder/index.d.ts +2 -2
  181. package/dist/plugins/ui-builder/style.css +6 -0
  182. package/dist/shared/{stack.BSM2cgoq.d.cts → stack.BYysGdHl.d.cts} +1 -1
  183. package/dist/shared/{stack.CqfZWfjJ.d.cts → stack.BdJFrdyt.d.cts} +8 -2
  184. package/dist/shared/{stack.e1FN86dE.d.mts → stack.ChVuHi5e.d.mts} +8 -2
  185. package/dist/shared/stack.DKDMI-QO.d.cts +70 -0
  186. package/dist/shared/stack.DKDMI-QO.d.mts +70 -0
  187. package/dist/shared/stack.DKDMI-QO.d.ts +70 -0
  188. package/dist/shared/{stack.CLtOoAqF.d.mts → stack.DYCFcnkL.d.mts} +1 -1
  189. package/dist/shared/{stack.MMntCVZZ.d.ts → stack.EhM4pmtN.d.ts} +8 -2
  190. package/dist/shared/stack.FeaWkglm.d.cts +190 -0
  191. package/dist/shared/stack.FeaWkglm.d.mts +190 -0
  192. package/dist/shared/stack.FeaWkglm.d.ts +190 -0
  193. package/dist/shared/{stack.BD1m-4yB.d.ts → stack.kFbDspnF.d.ts} +1 -1
  194. package/package.json +56 -2
  195. package/src/plugins/kanban/api/index.ts +6 -0
  196. package/src/plugins/kanban/api/plugin.ts +1245 -0
  197. package/src/plugins/kanban/client/components/forms/board-form.tsx +108 -0
  198. package/src/plugins/kanban/client/components/forms/column-form.tsx +97 -0
  199. package/src/plugins/kanban/client/components/forms/task-form.tsx +274 -0
  200. package/src/plugins/kanban/client/components/index.tsx +21 -0
  201. package/src/plugins/kanban/client/components/loading/board-skeleton.tsx +49 -0
  202. package/src/plugins/kanban/client/components/loading/boards-list-skeleton.tsx +34 -0
  203. package/src/plugins/kanban/client/components/loading/index.tsx +2 -0
  204. package/src/plugins/kanban/client/components/pages/404-page.tsx +28 -0
  205. package/src/plugins/kanban/client/components/pages/board-page.internal.tsx +575 -0
  206. package/src/plugins/kanban/client/components/pages/board-page.tsx +31 -0
  207. package/src/plugins/kanban/client/components/pages/boards-list-page.internal.tsx +101 -0
  208. package/src/plugins/kanban/client/components/pages/boards-list-page.tsx +26 -0
  209. package/src/plugins/kanban/client/components/pages/new-board-page.internal.tsx +65 -0
  210. package/src/plugins/kanban/client/components/pages/new-board-page.tsx +26 -0
  211. package/src/plugins/kanban/client/components/shared/column-content.tsx +108 -0
  212. package/src/plugins/kanban/client/components/shared/default-error.tsx +32 -0
  213. package/src/plugins/kanban/client/components/shared/empty-state.tsx +37 -0
  214. package/src/plugins/kanban/client/components/shared/kanban-board.tsx +87 -0
  215. package/src/plugins/kanban/client/components/shared/page-wrapper.tsx +20 -0
  216. package/src/plugins/kanban/client/components/shared/task-card.tsx +79 -0
  217. package/src/plugins/kanban/client/components/shared/user-avatar.tsx +63 -0
  218. package/src/plugins/kanban/client/hooks/index.tsx +11 -0
  219. package/src/plugins/kanban/client/hooks/kanban-hooks.tsx +560 -0
  220. package/src/plugins/kanban/client/index.ts +8 -0
  221. package/src/plugins/kanban/client/localization/index.ts +28 -0
  222. package/src/plugins/kanban/client/localization/kanban-common.ts +69 -0
  223. package/src/plugins/kanban/client/localization/kanban-forms.ts +70 -0
  224. package/src/plugins/kanban/client/localization/kanban-list.ts +36 -0
  225. package/src/plugins/kanban/client/overrides.ts +145 -0
  226. package/src/plugins/kanban/client/plugin.tsx +463 -0
  227. package/src/plugins/kanban/client.css +68 -0
  228. package/src/plugins/kanban/db.ts +125 -0
  229. package/src/plugins/kanban/query-keys.ts +154 -0
  230. package/src/plugins/kanban/schemas.ts +143 -0
  231. package/src/plugins/kanban/style.css +7 -0
  232. package/src/plugins/kanban/types.ts +106 -0
  233. package/src/plugins/kanban/utils.ts +107 -0
  234. package/src/plugins/ui-builder/style.css +6 -0
  235. package/dist/shared/{stack.DLhzx1-D.d.mts → stack.CcI4sYJP.d.cts} +1 -1
  236. package/dist/shared/{stack.DLhzx1-D.d.ts → stack.CcI4sYJP.d.mts} +1 -1
  237. package/dist/shared/{stack.DLhzx1-D.d.cts → stack.CcI4sYJP.d.ts} +1 -1
@@ -10,6 +10,7 @@ const editorStore = require('../../../../lib/ui-builder/store/editor-store.cjs')
10
10
  const utils = require('../../../../lib/utils.cjs');
11
11
  const layerRenderer = require('../../layer-renderer.cjs');
12
12
  const layerUtils = require('../../../../lib/ui-builder/store/layer-utils.cjs');
13
+ const draggableNewComponent = require('../dnd/draggable-new-component.cjs');
13
14
 
14
15
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
15
16
 
@@ -17,22 +18,44 @@ const React__default = /*#__PURE__*/_interopDefaultCompat(React);
17
18
 
18
19
  const fallback = /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full bg-muted rounded border animate-pulse" });
19
20
  const previewLayerCache = /* @__PURE__ */ new Map();
21
+ function isValidChildOfParent(componentRegistry, componentType, parentType) {
22
+ const def = componentRegistry[componentType];
23
+ if (!def?.childOf) {
24
+ return true;
25
+ }
26
+ if (!parentType) {
27
+ return false;
28
+ }
29
+ return def.childOf.includes(parentType);
30
+ }
31
+ function isChildOnlyComponent(componentRegistry, componentType) {
32
+ const def = componentRegistry[componentType];
33
+ return Boolean(def?.childOf);
34
+ }
20
35
  function AddComponentsPopover({
21
36
  className,
22
37
  children,
23
38
  addPosition,
24
39
  parentLayerId,
25
40
  onOpenChange,
41
+ enableDragToCanvas = false,
26
42
  onChange
27
43
  }) {
28
44
  const [open, setOpen] = React__default.useState(false);
45
+ const [activeView, setActiveView] = React__default.useState("components");
29
46
  const componentRegistry = editorStore.useEditorStore((state) => state.registry);
47
+ const blocks = editorStore.useEditorStore((state) => state.blocks);
48
+ const findLayerById = layerStore.useLayerStore((state) => state.findLayerById);
49
+ const parentLayerType = React.useMemo(() => {
50
+ const parentLayer = findLayerById(parentLayerId);
51
+ return parentLayer?.type;
52
+ }, [findLayerById, parentLayerId]);
30
53
  const groupedOptions = React.useMemo(() => {
31
- const componentOptions = Object.keys(componentRegistry).map((name) => ({
54
+ const componentOptions = Object.keys(componentRegistry).filter((name) => isValidChildOfParent(componentRegistry, name, parentLayerType)).map((name) => ({
32
55
  value: name,
33
56
  label: name,
34
57
  type: "component",
35
- from: componentRegistry[name].from
58
+ from: componentRegistry[name]?.from
36
59
  }));
37
60
  return componentOptions.reduce(
38
61
  (acc, option) => {
@@ -41,16 +64,34 @@ function AddComponentsPopover({
41
64
  if (!acc[group]) {
42
65
  acc[group] = [];
43
66
  }
44
- acc[group].push(option);
67
+ acc[group]?.push(option);
45
68
  return acc;
46
69
  },
47
70
  {}
48
71
  );
49
- }, [componentRegistry]);
72
+ }, [componentRegistry, parentLayerType]);
50
73
  const categories = React.useMemo(() => {
51
74
  return Object.keys(groupedOptions);
52
75
  }, [groupedOptions]);
76
+ const groupedBlocks = React.useMemo(() => {
77
+ if (!blocks) return {};
78
+ return Object.values(blocks).reduce(
79
+ (acc, block) => {
80
+ if (!acc[block.category]) {
81
+ acc[block.category] = [];
82
+ }
83
+ acc[block.category]?.push(block);
84
+ return acc;
85
+ },
86
+ {}
87
+ );
88
+ }, [blocks]);
89
+ const blockCategories = React.useMemo(() => {
90
+ return Object.keys(groupedBlocks);
91
+ }, [groupedBlocks]);
92
+ const hasBlocks = blocks && Object.keys(blocks).length > 0;
53
93
  const addComponentLayer = layerStore.useLayerStore((state) => state.addComponentLayer);
94
+ const addLayerDirect = layerStore.useLayerStore((state) => state.addLayerDirect);
54
95
  const handleSelect = React__default.useCallback(
55
96
  (currentValue) => {
56
97
  if (onChange) {
@@ -75,6 +116,15 @@ function AddComponentsPopover({
75
116
  onChange
76
117
  ]
77
118
  );
119
+ const handleBlockSelect = React__default.useCallback(
120
+ (block) => {
121
+ const clonedTemplate = cloneLayerWithNewIds(block.template);
122
+ addLayerDirect(clonedTemplate, parentLayerId, addPosition);
123
+ setOpen(false);
124
+ onOpenChange?.(false);
125
+ },
126
+ [addLayerDirect, parentLayerId, addPosition, onOpenChange]
127
+ );
78
128
  const handleOpenChange = React.useCallback(
79
129
  (open2) => {
80
130
  setOpen(open2);
@@ -82,63 +132,180 @@ function AddComponentsPopover({
82
132
  },
83
133
  [onOpenChange]
84
134
  );
135
+ const handleDragStart = React.useCallback(() => {
136
+ setOpen(false);
137
+ onOpenChange?.(false);
138
+ }, [onOpenChange]);
85
139
  const defaultTab = categories[0] || "";
140
+ const defaultBlockCategory = blockCategories[0] || "";
86
141
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("relative flex justify-center", className), children: /* @__PURE__ */ jsxRuntime.jsxs(popover.Popover, { open, onOpenChange: handleOpenChange, children: [
87
142
  /* @__PURE__ */ jsxRuntime.jsx(popover.PopoverTrigger, { asChild: true, children }),
88
- /* @__PURE__ */ jsxRuntime.jsx(popover.PopoverContent, { className: "w-[280px] p-0", align: "start", children: categories.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(tabs.Tabs, { defaultValue: defaultTab, className: "w-full", children: [
89
- /* @__PURE__ */ jsxRuntime.jsx(tabs.TabsList, { className: utils.cn(categories.length > 1 ? "h-14 w-full rounded-none border-b flex flex-row overflow-x-scroll justify-start" : "hidden"), children: categories.map((category) => /* @__PURE__ */ jsxRuntime.jsxs(tabs.TabsTrigger, { value: category, className: "flex flex-col justify-start items-start overflow-hidden px-2 py-1 min-w-24 min-h-11 flex-shrink-0", children: [
90
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", children: formatCategoryName(category) }),
91
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full min-h-[12px] text-[8px] leading-[9px] text-left text-muted-foreground text-wrap", children: category })
92
- ] }, category)) }),
93
- categories.map((category) => /* @__PURE__ */ jsxRuntime.jsx(tabs.TabsContent, { value: category, className: "m-0", children: /* @__PURE__ */ jsxRuntime.jsxs(command.Command, { className: "border-0", children: [
94
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center px-3 w-full [&>div:first-child]:w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
95
- command.CommandInput,
143
+ /* @__PURE__ */ jsxRuntime.jsxs(popover.PopoverContent, { className: "w-[320px] p-0", align: "start", children: [
144
+ hasBlocks && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex border-b", children: [
145
+ /* @__PURE__ */ jsxRuntime.jsx(
146
+ "button",
147
+ {
148
+ className: utils.cn(
149
+ "flex-1 px-4 py-2 text-sm font-medium transition-colors",
150
+ activeView === "components" ? "bg-background border-b-2 border-primary" : "bg-muted/50 text-muted-foreground hover:text-foreground"
151
+ ),
152
+ onClick: () => setActiveView("components"),
153
+ children: "Components"
154
+ }
155
+ ),
156
+ /* @__PURE__ */ jsxRuntime.jsx(
157
+ "button",
96
158
  {
97
- placeholder: "Find components",
98
- className: "border-0 focus:ring-0 w-full"
159
+ className: utils.cn(
160
+ "flex-1 px-4 py-2 text-sm font-medium transition-colors",
161
+ activeView === "blocks" ? "bg-background border-b-2 border-primary" : "bg-muted/50 text-muted-foreground hover:text-foreground"
162
+ ),
163
+ onClick: () => setActiveView("blocks"),
164
+ children: "Blocks"
99
165
  }
100
- ) }),
101
- /* @__PURE__ */ jsxRuntime.jsxs(command.CommandList, { className: "max-h-[250px]", children: [
102
- /* @__PURE__ */ jsxRuntime.jsx(command.CommandEmpty, { children: "No components found" }),
103
- /* @__PURE__ */ jsxRuntime.jsx(command.CommandGroup, { children: groupedOptions[category].map((component) => /* @__PURE__ */ jsxRuntime.jsx(
104
- GroupedComponentItem,
166
+ )
167
+ ] }),
168
+ activeView === "components" && categories.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(tabs.Tabs, { defaultValue: defaultTab, className: "w-full", children: [
169
+ /* @__PURE__ */ jsxRuntime.jsx(tabs.TabsList, { className: utils.cn(categories.length > 1 ? "h-14 w-full rounded-none border-b flex flex-row overflow-x-scroll justify-start" : "hidden"), children: categories.map((category) => /* @__PURE__ */ jsxRuntime.jsxs(tabs.TabsTrigger, { value: category, className: "flex flex-col justify-start items-start overflow-hidden px-2 py-1 min-w-24 min-h-11 shrink-0", children: [
170
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", children: formatCategoryName(category) }),
171
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full min-h-[12px] text-[8px] leading-[9px] text-left text-muted-foreground text-wrap", children: category })
172
+ ] }, category)) }),
173
+ categories.map((category) => /* @__PURE__ */ jsxRuntime.jsx(tabs.TabsContent, { value: category, className: "m-0", children: /* @__PURE__ */ jsxRuntime.jsxs(command.Command, { className: "border-0", children: [
174
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center px-3 w-full [&>div:first-child]:w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
175
+ command.CommandInput,
105
176
  {
106
- component,
107
- onClick: handleSelect
108
- },
109
- component.value
110
- )) })
111
- ] })
112
- ] }) }, category))
113
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(command.Command, { children: [
114
- /* @__PURE__ */ jsxRuntime.jsx(command.CommandInput, { placeholder: "Add component" }),
115
- /* @__PURE__ */ jsxRuntime.jsx(command.CommandList, { children: /* @__PURE__ */ jsxRuntime.jsx(command.CommandEmpty, { children: "No components found" }) })
116
- ] }) })
177
+ placeholder: "Find components",
178
+ className: "border-0 focus:ring-0 w-full"
179
+ }
180
+ ) }),
181
+ /* @__PURE__ */ jsxRuntime.jsxs(command.CommandList, { className: "max-h-[250px]", children: [
182
+ /* @__PURE__ */ jsxRuntime.jsx(command.CommandEmpty, { children: "No components found" }),
183
+ /* @__PURE__ */ jsxRuntime.jsx(command.CommandGroup, { children: groupedOptions[category]?.map((component) => /* @__PURE__ */ jsxRuntime.jsx(
184
+ GroupedComponentItem,
185
+ {
186
+ component,
187
+ onClick: handleSelect,
188
+ onDragStart: handleDragStart,
189
+ enableDrag: enableDragToCanvas
190
+ },
191
+ component.value
192
+ )) })
193
+ ] })
194
+ ] }) }, category))
195
+ ] }) : activeView === "components" ? /* @__PURE__ */ jsxRuntime.jsxs(command.Command, { children: [
196
+ /* @__PURE__ */ jsxRuntime.jsx(command.CommandInput, { placeholder: "Add component" }),
197
+ /* @__PURE__ */ jsxRuntime.jsx(command.CommandList, { children: /* @__PURE__ */ jsxRuntime.jsx(command.CommandEmpty, { children: "No components found" }) })
198
+ ] }) : null,
199
+ activeView === "blocks" && hasBlocks && /* @__PURE__ */ jsxRuntime.jsxs(tabs.Tabs, { defaultValue: defaultBlockCategory, className: "w-full", children: [
200
+ /* @__PURE__ */ jsxRuntime.jsx(tabs.TabsList, { className: "h-14 w-full rounded-none border-b flex flex-row overflow-x-scroll justify-start", children: blockCategories.map((category) => /* @__PURE__ */ jsxRuntime.jsxs(tabs.TabsTrigger, { value: category, className: "flex flex-col justify-start items-start overflow-hidden px-2 py-1 min-w-24 min-h-11 shrink-0", children: [
201
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", children: formatCategoryName(category) }),
202
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full min-h-[12px] text-[8px] leading-[9px] text-left text-muted-foreground", children: [
203
+ groupedBlocks[category]?.length,
204
+ " blocks"
205
+ ] })
206
+ ] }, category)) }),
207
+ blockCategories.map((category) => /* @__PURE__ */ jsxRuntime.jsx(tabs.TabsContent, { value: category, className: "m-0", children: /* @__PURE__ */ jsxRuntime.jsxs(command.Command, { className: "border-0", children: [
208
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center px-3 w-full [&>div:first-child]:w-full", children: /* @__PURE__ */ jsxRuntime.jsx(
209
+ command.CommandInput,
210
+ {
211
+ placeholder: "Find blocks",
212
+ className: "border-0 focus:ring-0 w-full"
213
+ }
214
+ ) }),
215
+ /* @__PURE__ */ jsxRuntime.jsxs(command.CommandList, { className: "max-h-[250px]", children: [
216
+ /* @__PURE__ */ jsxRuntime.jsx(command.CommandEmpty, { children: "No blocks found" }),
217
+ /* @__PURE__ */ jsxRuntime.jsx(command.CommandGroup, { children: groupedBlocks[category]?.map((block) => /* @__PURE__ */ jsxRuntime.jsx(
218
+ BlockItem,
219
+ {
220
+ block,
221
+ onClick: handleBlockSelect
222
+ },
223
+ block.name
224
+ )) })
225
+ ] })
226
+ ] }) }, category))
227
+ ] })
228
+ ] })
117
229
  ] }) });
118
230
  }
231
+ function cloneLayerWithNewIds(layer) {
232
+ const newId = generateUniqueId();
233
+ let newChildren;
234
+ if (Array.isArray(layer.children)) {
235
+ newChildren = layer.children.map((child) => cloneLayerWithNewIds(child));
236
+ } else if (typeof layer.children === "string") {
237
+ newChildren = layer.children;
238
+ } else if (layer.children && typeof layer.children === "object" && "__variableRef" in layer.children) {
239
+ newChildren = layer.children;
240
+ } else {
241
+ newChildren = layer.children;
242
+ }
243
+ return {
244
+ ...layer,
245
+ id: newId,
246
+ children: newChildren
247
+ };
248
+ }
249
+ function generateUniqueId() {
250
+ return Math.random().toString(36).substring(2, 9);
251
+ }
252
+ const BlockItem = React.memo(({
253
+ block,
254
+ onClick
255
+ }) => {
256
+ const handleSelect = React.useCallback(() => {
257
+ onClick(block);
258
+ }, [onClick, block]);
259
+ return /* @__PURE__ */ jsxRuntime.jsxs(
260
+ command.CommandItem,
261
+ {
262
+ onSelect: handleSelect,
263
+ className: "cursor-pointer flex flex-col items-start gap-1 py-3",
264
+ children: [
265
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: formatBlockName(block.name) }),
266
+ block.description && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground line-clamp-2", children: block.description })
267
+ ]
268
+ }
269
+ );
270
+ });
271
+ BlockItem.displayName = "BlockItem";
272
+ function formatBlockName(name) {
273
+ return name.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
274
+ }
119
275
  const GroupedComponentItem = React.memo(({
120
276
  component,
121
- onClick
277
+ onClick,
278
+ onDragStart,
279
+ enableDrag = false
122
280
  }) => {
123
281
  const handleSelect = React.useCallback(() => {
124
282
  onClick(component.value);
125
283
  }, [onClick, component.value]);
126
284
  const componentRegistry = editorStore.useEditorStore((state) => state.registry);
127
- return /* @__PURE__ */ jsxRuntime.jsxs(
285
+ const content = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
286
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 w-10 h-6 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
287
+ LazyComponentPreview,
288
+ {
289
+ componentType: component.value,
290
+ componentRegistry
291
+ }
292
+ ) }),
293
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center flex-1 min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: component.label }) })
294
+ ] });
295
+ return /* @__PURE__ */ jsxRuntime.jsx(
128
296
  command.CommandItem,
129
297
  {
130
298
  onSelect: handleSelect,
131
- className: "cursor-pointer flex items-center gap-3 py-3",
132
- children: [
133
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-shrink-0 w-10 h-8 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
134
- LazyComponentPreview,
135
- {
136
- componentType: component.value,
137
- componentRegistry
138
- }
139
- ) }),
140
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center flex-1 min-w-0", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: component.label }) })
141
- ]
299
+ className: "cursor-pointer flex items-center gap-2 py-2",
300
+ children: enableDrag ? /* @__PURE__ */ jsxRuntime.jsx(
301
+ draggableNewComponent.DraggableNewComponent,
302
+ {
303
+ componentType: component.value,
304
+ onDragStart,
305
+ className: "flex-1",
306
+ children: content
307
+ }
308
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: content })
142
309
  },
143
310
  component.value
144
311
  );
@@ -156,7 +323,7 @@ const LazyComponentPreview = React.memo(({
156
323
  let timeoutId = null;
157
324
  const observer = new IntersectionObserver(
158
325
  ([entry]) => {
159
- if (entry.isIntersecting) {
326
+ if (entry?.isIntersecting) {
160
327
  timeoutId = setTimeout(() => setShouldLoad(true), 50);
161
328
  }
162
329
  },
@@ -179,12 +346,20 @@ const LazyComponentPreview = React.memo(({
179
346
  ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full bg-muted rounded border" }) });
180
347
  });
181
348
  LazyComponentPreview.displayName = "LazyComponentPreview";
349
+ const ChildOnlyPlaceholder = React.memo(({ componentType }) => {
350
+ const initials = componentType.replace(/([A-Z])/g, " $1").trim().split(" ").map((word) => word[0]).slice(0, 2).join("");
351
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full bg-muted/50 rounded border border-dashed flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[8px] font-medium text-muted-foreground", children: initials }) });
352
+ });
353
+ ChildOnlyPlaceholder.displayName = "ChildOnlyPlaceholder";
182
354
  const ComponentPreview = React.memo(({
183
355
  componentType,
184
356
  componentRegistry
185
357
  }) => {
186
- const style = { width: "200%", height: "200%" };
358
+ const isChildOnly = isChildOnlyComponent(componentRegistry, componentType);
187
359
  const previewLayer = React.useMemo(() => {
360
+ if (isChildOnly) {
361
+ return null;
362
+ }
188
363
  const cacheKey = `${componentType}-${JSON.stringify(componentRegistry[componentType]?.schema)}`;
189
364
  if (previewLayerCache.has(cacheKey)) {
190
365
  return previewLayerCache.get(cacheKey);
@@ -200,15 +375,20 @@ const ComponentPreview = React.memo(({
200
375
  console.warn(`Failed to create preview for component ${componentType}:`, error);
201
376
  return null;
202
377
  }
203
- }, [componentType, componentRegistry]);
378
+ }, [componentType, componentRegistry, isChildOnly]);
379
+ if (isChildOnly) {
380
+ return /* @__PURE__ */ jsxRuntime.jsx(ChildOnlyPlaceholder, { componentType });
381
+ }
204
382
  if (!previewLayer) {
205
383
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full bg-muted rounded border" });
206
384
  }
385
+ const style = { width: "200%", height: "200%" };
207
386
  return /* @__PURE__ */ jsxRuntime.jsx(
208
387
  "div",
209
388
  {
210
- className: "w-full h-full bg-background rounded border overflow-hidden transform scale-50 origin-top-left",
389
+ className: "w-full h-full bg-background rounded border overflow-hidden transform scale-50 origin-top-left pointer-events-none",
211
390
  style,
391
+ inert: true,
212
392
  children: /* @__PURE__ */ jsxRuntime.jsx(
213
393
  layerRenderer,
214
394
  {
@@ -224,7 +404,7 @@ ComponentPreview.displayName = "ComponentPreview";
224
404
  function formatCategoryName(name) {
225
405
  const words = name.split("/");
226
406
  const lastWord = words[words.length - 1];
227
- return lastWord.replace(/-/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
407
+ return lastWord?.replace(/-/g, " ").replace(/\b\w/g, (char) => char.toUpperCase()) ?? "";
228
408
  }
229
409
 
230
410
  exports.AddComponentsPopover = AddComponentsPopover;