@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
@@ -0,0 +1,805 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { useSensors, useSensor, closestCenter, pointerWithin, rectIntersection, getFirstCollision, DndContext, MeasuringStrategy, DragOverlay, defaultDropAnimationSideEffects, KeyboardSensor, TouchSensor, MouseSensor, KeyboardCode, closestCorners } from '../../../../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';
4
+ import { verticalListSortingStrategy, arrayMove, SortableContext, horizontalListSortingStrategy, useSortable, defaultAnimateLayoutChanges } from '../../../../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';
5
+ import { CSS } from '../../../../node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.2.0/node_modules/@dnd-kit/utilities/dist/utilities.esm.mjs';
6
+ import { Slot } from '@radix-ui/react-slot';
7
+ import * as React from 'react';
8
+ import * as ReactDOM from 'react-dom';
9
+ import { useComposedRefs } from '../lib/compose-refs.mjs';
10
+ import { cn } from '../lib/utils.mjs';
11
+
12
+ const directions = [
13
+ KeyboardCode.Down,
14
+ KeyboardCode.Right,
15
+ KeyboardCode.Up,
16
+ KeyboardCode.Left
17
+ ];
18
+ const coordinateGetter = (event, { context }) => {
19
+ const { active, droppableRects, droppableContainers, collisionRect } = context;
20
+ if (directions.includes(event.code)) {
21
+ event.preventDefault();
22
+ if (!active || !collisionRect) return;
23
+ const filteredContainers = [];
24
+ for (const entry of droppableContainers.getEnabled()) {
25
+ if (!entry || entry?.disabled) return;
26
+ const rect = droppableRects.get(entry.id);
27
+ if (!rect) return;
28
+ const data = entry.data.current;
29
+ if (data) {
30
+ const { type, children } = data;
31
+ if (type === "container" && children?.length > 0) {
32
+ if (active.data.current?.type !== "container") {
33
+ return;
34
+ }
35
+ }
36
+ }
37
+ switch (event.code) {
38
+ case KeyboardCode.Down:
39
+ if (collisionRect.top < rect.top) {
40
+ filteredContainers.push(entry);
41
+ }
42
+ break;
43
+ case KeyboardCode.Up:
44
+ if (collisionRect.top > rect.top) {
45
+ filteredContainers.push(entry);
46
+ }
47
+ break;
48
+ case KeyboardCode.Left:
49
+ if (collisionRect.left >= rect.left + rect.width) {
50
+ filteredContainers.push(entry);
51
+ }
52
+ break;
53
+ case KeyboardCode.Right:
54
+ if (collisionRect.left + collisionRect.width <= rect.left) {
55
+ filteredContainers.push(entry);
56
+ }
57
+ break;
58
+ }
59
+ }
60
+ const collisions = closestCorners({
61
+ collisionRect,
62
+ droppableRects,
63
+ droppableContainers: filteredContainers});
64
+ const closestId = getFirstCollision(collisions, "id");
65
+ if (closestId != null) {
66
+ const newDroppable = droppableContainers.get(closestId);
67
+ const newNode = newDroppable?.node.current;
68
+ const newRect = newDroppable?.rect.current;
69
+ if (newNode && newRect) {
70
+ if (newDroppable.id === "placeholder") {
71
+ return {
72
+ x: newRect.left + (newRect.width - collisionRect.width) / 2,
73
+ y: newRect.top + (newRect.height - collisionRect.height) / 2
74
+ };
75
+ }
76
+ if (newDroppable.data.current?.type === "container") {
77
+ return {
78
+ x: newRect.left + 20,
79
+ y: newRect.top + 74
80
+ };
81
+ }
82
+ return {
83
+ x: newRect.left,
84
+ y: newRect.top
85
+ };
86
+ }
87
+ }
88
+ }
89
+ return void 0;
90
+ };
91
+ const ROOT_NAME = "Kanban";
92
+ const BOARD_NAME = "KanbanBoard";
93
+ const COLUMN_NAME = "KanbanColumn";
94
+ const COLUMN_HANDLE_NAME = "KanbanColumnHandle";
95
+ const ITEM_NAME = "KanbanItem";
96
+ const ITEM_HANDLE_NAME = "KanbanItemHandle";
97
+ const OVERLAY_NAME = "KanbanOverlay";
98
+ const KanbanContext = React.createContext(
99
+ null
100
+ );
101
+ KanbanContext.displayName = ROOT_NAME;
102
+ function useKanbanContext(consumerName) {
103
+ const context = React.useContext(KanbanContext);
104
+ if (!context) {
105
+ throw new Error(`\`${consumerName}\` must be used within \`${ROOT_NAME}\``);
106
+ }
107
+ return context;
108
+ }
109
+ function KanbanRoot(props) {
110
+ const {
111
+ value,
112
+ onValueChange,
113
+ modifiers,
114
+ strategy = verticalListSortingStrategy,
115
+ orientation = "horizontal",
116
+ onMove,
117
+ getItemValue: getItemValueProp,
118
+ accessibility,
119
+ flatCursor = false,
120
+ ...kanbanProps
121
+ } = props;
122
+ const id = React.useId();
123
+ const [activeId, setActiveId] = React.useState(null);
124
+ const lastOverIdRef = React.useRef(null);
125
+ const hasMovedRef = React.useRef(false);
126
+ const sensors = useSensors(
127
+ useSensor(MouseSensor),
128
+ useSensor(TouchSensor),
129
+ useSensor(KeyboardSensor, {
130
+ coordinateGetter
131
+ })
132
+ );
133
+ const getItemValue = React.useCallback(
134
+ (item) => {
135
+ if (typeof item === "object" && !getItemValueProp) {
136
+ throw new Error("getItemValue is required when using array of objects");
137
+ }
138
+ return getItemValueProp ? getItemValueProp(item) : item;
139
+ },
140
+ [getItemValueProp]
141
+ );
142
+ const getColumn = React.useCallback(
143
+ (id2) => {
144
+ if (id2 in value) return id2;
145
+ for (const [columnId, items] of Object.entries(value)) {
146
+ if (items.some((item) => getItemValue(item) === id2)) {
147
+ return columnId;
148
+ }
149
+ }
150
+ return null;
151
+ },
152
+ [value, getItemValue]
153
+ );
154
+ const collisionDetection = React.useCallback(
155
+ (args) => {
156
+ if (activeId && activeId in value) {
157
+ return closestCenter({
158
+ ...args,
159
+ droppableContainers: args.droppableContainers.filter(
160
+ (container) => container.id in value
161
+ )
162
+ });
163
+ }
164
+ const pointerIntersections = pointerWithin(args);
165
+ const intersections = pointerIntersections.length > 0 ? pointerIntersections : rectIntersection(args);
166
+ let overId = getFirstCollision(intersections, "id");
167
+ if (!overId) {
168
+ if (hasMovedRef.current) {
169
+ lastOverIdRef.current = activeId;
170
+ }
171
+ return lastOverIdRef.current ? [{ id: lastOverIdRef.current }] : [];
172
+ }
173
+ if (overId in value) {
174
+ const containerItems = value[overId];
175
+ if (containerItems && containerItems.length > 0) {
176
+ const closestItem = closestCenter({
177
+ ...args,
178
+ droppableContainers: args.droppableContainers.filter(
179
+ (container) => container.id !== overId && containerItems.some(
180
+ (item) => getItemValue(item) === container.id
181
+ )
182
+ )
183
+ });
184
+ if (closestItem.length > 0) {
185
+ overId = closestItem[0]?.id ?? overId;
186
+ }
187
+ }
188
+ }
189
+ lastOverIdRef.current = overId;
190
+ return [{ id: overId }];
191
+ },
192
+ [activeId, value, getItemValue]
193
+ );
194
+ const onDragStart = React.useCallback(
195
+ (event) => {
196
+ kanbanProps.onDragStart?.(event);
197
+ if (event.activatorEvent.defaultPrevented) return;
198
+ setActiveId(event.active.id);
199
+ },
200
+ // eslint-disable-next-line react-hooks/exhaustive-deps
201
+ [kanbanProps.onDragStart]
202
+ );
203
+ const onDragOver = React.useCallback(
204
+ (event) => {
205
+ kanbanProps.onDragOver?.(event);
206
+ if (event.activatorEvent.defaultPrevented) return;
207
+ const { active, over } = event;
208
+ if (!over) return;
209
+ const activeColumn = getColumn(active.id);
210
+ const overColumn = getColumn(over.id);
211
+ if (!activeColumn || !overColumn) return;
212
+ if (activeColumn === overColumn) {
213
+ const items = value[activeColumn];
214
+ if (!items) return;
215
+ const activeIndex = items.findIndex(
216
+ (item) => getItemValue(item) === active.id
217
+ );
218
+ const overIndex = items.findIndex(
219
+ (item) => getItemValue(item) === over.id
220
+ );
221
+ if (activeIndex !== overIndex) {
222
+ const newColumns = { ...value };
223
+ newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex);
224
+ onValueChange?.(newColumns);
225
+ }
226
+ } else {
227
+ const activeItems = value[activeColumn];
228
+ const overItems = value[overColumn];
229
+ if (!activeItems || !overItems) return;
230
+ const activeIndex = activeItems.findIndex(
231
+ (item) => getItemValue(item) === active.id
232
+ );
233
+ if (activeIndex === -1) return;
234
+ const activeItem = activeItems[activeIndex];
235
+ if (!activeItem) return;
236
+ const updatedItems = {
237
+ ...value,
238
+ [activeColumn]: activeItems.filter(
239
+ (item) => getItemValue(item) !== active.id
240
+ ),
241
+ [overColumn]: [...overItems, activeItem]
242
+ };
243
+ onValueChange?.(updatedItems);
244
+ hasMovedRef.current = true;
245
+ }
246
+ },
247
+ // eslint-disable-next-line react-hooks/exhaustive-deps
248
+ [value, getColumn, getItemValue, onValueChange, kanbanProps.onDragOver]
249
+ );
250
+ const onDragEnd = React.useCallback(
251
+ (event) => {
252
+ kanbanProps.onDragEnd?.(event);
253
+ if (event.activatorEvent.defaultPrevented) return;
254
+ const { active, over } = event;
255
+ if (!over) {
256
+ setActiveId(null);
257
+ return;
258
+ }
259
+ if (active.id in value && over.id in value) {
260
+ const activeIndex = Object.keys(value).indexOf(active.id);
261
+ const overIndex = Object.keys(value).indexOf(over.id);
262
+ if (activeIndex !== overIndex) {
263
+ const orderedColumns = Object.keys(value);
264
+ const newOrder = arrayMove(orderedColumns, activeIndex, overIndex);
265
+ const newColumns = {};
266
+ for (const key of newOrder) {
267
+ const items = value[key];
268
+ if (items) {
269
+ newColumns[key] = items;
270
+ }
271
+ }
272
+ if (onMove) {
273
+ onMove({ ...event, activeIndex, overIndex });
274
+ } else {
275
+ onValueChange?.(newColumns);
276
+ }
277
+ }
278
+ } else {
279
+ const activeColumn = getColumn(active.id);
280
+ const overColumn = getColumn(over.id);
281
+ if (!activeColumn || !overColumn) {
282
+ setActiveId(null);
283
+ return;
284
+ }
285
+ if (activeColumn === overColumn) {
286
+ const items = value[activeColumn];
287
+ if (!items) {
288
+ setActiveId(null);
289
+ return;
290
+ }
291
+ const activeIndex = items.findIndex(
292
+ (item) => getItemValue(item) === active.id
293
+ );
294
+ const overIndex = items.findIndex(
295
+ (item) => getItemValue(item) === over.id
296
+ );
297
+ if (activeIndex !== overIndex) {
298
+ const newColumns = { ...value };
299
+ newColumns[activeColumn] = arrayMove(items, activeIndex, overIndex);
300
+ if (onMove) {
301
+ onMove({
302
+ ...event,
303
+ activeIndex,
304
+ overIndex
305
+ });
306
+ } else {
307
+ onValueChange?.(newColumns);
308
+ }
309
+ }
310
+ }
311
+ }
312
+ setActiveId(null);
313
+ hasMovedRef.current = false;
314
+ },
315
+ // eslint-disable-next-line react-hooks/exhaustive-deps
316
+ [
317
+ value,
318
+ getColumn,
319
+ getItemValue,
320
+ onValueChange,
321
+ onMove,
322
+ kanbanProps.onDragEnd
323
+ ]
324
+ );
325
+ const onDragCancel = React.useCallback(
326
+ (event) => {
327
+ kanbanProps.onDragCancel?.(event);
328
+ if (event.activatorEvent.defaultPrevented) return;
329
+ setActiveId(null);
330
+ hasMovedRef.current = false;
331
+ },
332
+ // eslint-disable-next-line react-hooks/exhaustive-deps
333
+ [kanbanProps.onDragCancel]
334
+ );
335
+ const announcements = React.useMemo(
336
+ () => ({
337
+ onDragStart({ active }) {
338
+ const isColumn = active.id in value;
339
+ const itemType = isColumn ? "column" : "item";
340
+ const position = isColumn ? Object.keys(value).indexOf(active.id) + 1 : (() => {
341
+ const column = getColumn(active.id);
342
+ if (!column || !value[column]) return 1;
343
+ return value[column].findIndex(
344
+ (item) => getItemValue(item) === active.id
345
+ ) + 1;
346
+ })();
347
+ const total = isColumn ? Object.keys(value).length : (() => {
348
+ const column = getColumn(active.id);
349
+ return column ? value[column]?.length ?? 0 : 0;
350
+ })();
351
+ return `Picked up ${itemType} at position ${position} of ${total}`;
352
+ },
353
+ onDragOver({ active, over }) {
354
+ if (!over) return;
355
+ const isColumn = active.id in value;
356
+ const itemType = isColumn ? "column" : "item";
357
+ const position = isColumn ? Object.keys(value).indexOf(over.id) + 1 : (() => {
358
+ const column = getColumn(over.id);
359
+ if (!column || !value[column]) return 1;
360
+ return value[column].findIndex(
361
+ (item) => getItemValue(item) === over.id
362
+ ) + 1;
363
+ })();
364
+ const total = isColumn ? Object.keys(value).length : (() => {
365
+ const column = getColumn(over.id);
366
+ return column ? value[column]?.length ?? 0 : 0;
367
+ })();
368
+ const overColumn = getColumn(over.id);
369
+ const activeColumn = getColumn(active.id);
370
+ if (isColumn) {
371
+ return `${itemType} is now at position ${position} of ${total}`;
372
+ }
373
+ if (activeColumn !== overColumn) {
374
+ return `${itemType} is now at position ${position} of ${total} in ${overColumn}`;
375
+ }
376
+ return `${itemType} is now at position ${position} of ${total}`;
377
+ },
378
+ onDragEnd({ active, over }) {
379
+ if (!over) return;
380
+ const isColumn = active.id in value;
381
+ const itemType = isColumn ? "column" : "item";
382
+ const position = isColumn ? Object.keys(value).indexOf(over.id) + 1 : (() => {
383
+ const column = getColumn(over.id);
384
+ if (!column || !value[column]) return 1;
385
+ return value[column].findIndex(
386
+ (item) => getItemValue(item) === over.id
387
+ ) + 1;
388
+ })();
389
+ const total = isColumn ? Object.keys(value).length : (() => {
390
+ const column = getColumn(over.id);
391
+ return column ? value[column]?.length ?? 0 : 0;
392
+ })();
393
+ const overColumn = getColumn(over.id);
394
+ const activeColumn = getColumn(active.id);
395
+ if (isColumn) {
396
+ return `${itemType} was dropped at position ${position} of ${total}`;
397
+ }
398
+ if (activeColumn !== overColumn) {
399
+ return `${itemType} was dropped at position ${position} of ${total} in ${overColumn}`;
400
+ }
401
+ return `${itemType} was dropped at position ${position} of ${total}`;
402
+ },
403
+ onDragCancel({ active }) {
404
+ const isColumn = active.id in value;
405
+ const itemType = isColumn ? "column" : "item";
406
+ return `Dragging was cancelled. ${itemType} was dropped.`;
407
+ }
408
+ }),
409
+ [value, getColumn, getItemValue]
410
+ );
411
+ const contextValue = React.useMemo(
412
+ () => ({
413
+ id,
414
+ items: value,
415
+ modifiers,
416
+ strategy,
417
+ orientation,
418
+ activeId,
419
+ setActiveId,
420
+ getItemValue,
421
+ flatCursor
422
+ }),
423
+ [
424
+ id,
425
+ value,
426
+ activeId,
427
+ modifiers,
428
+ strategy,
429
+ orientation,
430
+ getItemValue,
431
+ flatCursor
432
+ ]
433
+ );
434
+ return /* @__PURE__ */ jsx(KanbanContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
435
+ DndContext,
436
+ {
437
+ collisionDetection,
438
+ modifiers,
439
+ sensors,
440
+ ...kanbanProps,
441
+ id,
442
+ measuring: {
443
+ droppable: {
444
+ strategy: MeasuringStrategy.Always
445
+ }
446
+ },
447
+ onDragStart,
448
+ onDragOver,
449
+ onDragEnd,
450
+ onDragCancel,
451
+ accessibility: {
452
+ announcements,
453
+ screenReaderInstructions: {
454
+ draggable: `
455
+ To pick up a kanban item or column, press space or enter.
456
+ While dragging, use the arrow keys to move the item.
457
+ Press space or enter again to drop the item in its new position, or press escape to cancel.
458
+ `
459
+ },
460
+ ...accessibility
461
+ }
462
+ }
463
+ ) });
464
+ }
465
+ const KanbanBoardContext = React.createContext(false);
466
+ KanbanBoardContext.displayName = BOARD_NAME;
467
+ const KanbanBoard = React.forwardRef(
468
+ (props, forwardedRef) => {
469
+ const { asChild, className, ...boardProps } = props;
470
+ const context = useKanbanContext(BOARD_NAME);
471
+ const columns = React.useMemo(() => {
472
+ return Object.keys(context.items);
473
+ }, [context.items]);
474
+ const BoardPrimitive = asChild ? Slot : "div";
475
+ return /* @__PURE__ */ jsx(KanbanBoardContext.Provider, { value: true, children: /* @__PURE__ */ jsx(
476
+ SortableContext,
477
+ {
478
+ items: columns,
479
+ strategy: context.orientation === "horizontal" ? horizontalListSortingStrategy : verticalListSortingStrategy,
480
+ children: /* @__PURE__ */ jsx(
481
+ BoardPrimitive,
482
+ {
483
+ "aria-orientation": context.orientation,
484
+ "data-orientation": context.orientation,
485
+ "data-slot": "kanban-board",
486
+ ...boardProps,
487
+ ref: forwardedRef,
488
+ className: cn(
489
+ "flex size-full gap-4",
490
+ context.orientation === "horizontal" ? "flex-row" : "flex-col",
491
+ className
492
+ )
493
+ }
494
+ )
495
+ }
496
+ ) });
497
+ }
498
+ );
499
+ KanbanBoard.displayName = BOARD_NAME;
500
+ const KanbanColumnContext = React.createContext(null);
501
+ KanbanColumnContext.displayName = COLUMN_NAME;
502
+ function useKanbanColumnContext(consumerName) {
503
+ const context = React.useContext(KanbanColumnContext);
504
+ if (!context) {
505
+ throw new Error(
506
+ `\`${consumerName}\` must be used within \`${COLUMN_NAME}\``
507
+ );
508
+ }
509
+ return context;
510
+ }
511
+ const animateLayoutChanges = (args) => defaultAnimateLayoutChanges({ ...args, wasDragging: true });
512
+ const KanbanColumn = React.forwardRef(
513
+ (props, forwardedRef) => {
514
+ const {
515
+ value,
516
+ asChild,
517
+ asHandle,
518
+ disabled,
519
+ className,
520
+ style,
521
+ ...columnProps
522
+ } = props;
523
+ const id = React.useId();
524
+ const context = useKanbanContext(COLUMN_NAME);
525
+ const inBoard = React.useContext(KanbanBoardContext);
526
+ const inOverlay = React.useContext(KanbanOverlayContext);
527
+ if (!inBoard && !inOverlay) {
528
+ throw new Error(
529
+ `\`${COLUMN_NAME}\` must be used within \`${BOARD_NAME}\` or \`${OVERLAY_NAME}\``
530
+ );
531
+ }
532
+ if (value === "") {
533
+ throw new Error(`\`${COLUMN_NAME}\` value cannot be an empty string`);
534
+ }
535
+ const {
536
+ attributes,
537
+ listeners,
538
+ setNodeRef,
539
+ setActivatorNodeRef,
540
+ transform,
541
+ transition,
542
+ isDragging
543
+ } = useSortable({
544
+ id: value,
545
+ disabled,
546
+ animateLayoutChanges
547
+ });
548
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
549
+ if (disabled) return;
550
+ setNodeRef(node);
551
+ });
552
+ const composedStyle = React.useMemo(() => {
553
+ return {
554
+ transform: CSS.Transform.toString(transform),
555
+ transition,
556
+ ...style
557
+ };
558
+ }, [transform, transition, style]);
559
+ const items = React.useMemo(() => {
560
+ const items2 = context.items[value] ?? [];
561
+ return items2.map((item) => context.getItemValue(item));
562
+ }, [context.items, value, context.getItemValue]);
563
+ const columnContext = React.useMemo(
564
+ () => ({
565
+ id,
566
+ attributes,
567
+ listeners,
568
+ setActivatorNodeRef,
569
+ isDragging,
570
+ disabled
571
+ }),
572
+ [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled]
573
+ );
574
+ const ColumnPrimitive = asChild ? Slot : "div";
575
+ return /* @__PURE__ */ jsx(KanbanColumnContext.Provider, { value: columnContext, children: /* @__PURE__ */ jsx(
576
+ SortableContext,
577
+ {
578
+ items,
579
+ strategy: context.orientation === "horizontal" ? horizontalListSortingStrategy : verticalListSortingStrategy,
580
+ children: /* @__PURE__ */ jsx(
581
+ ColumnPrimitive,
582
+ {
583
+ id,
584
+ "data-disabled": disabled,
585
+ "data-dragging": isDragging ? "" : void 0,
586
+ "data-slot": "kanban-column",
587
+ ...columnProps,
588
+ ...asHandle && !disabled ? attributes : {},
589
+ ...asHandle && !disabled ? listeners : {},
590
+ ref: composedRef,
591
+ style: composedStyle,
592
+ className: cn(
593
+ "flex size-full min-w-0 flex-col gap-2 rounded-lg border bg-zinc-100 p-2.5 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:bg-zinc-900",
594
+ {
595
+ "touch-none select-none": asHandle,
596
+ "cursor-default": context.flatCursor,
597
+ "data-dragging:cursor-grabbing": !context.flatCursor,
598
+ "cursor-grab": !isDragging && asHandle && !context.flatCursor,
599
+ "opacity-50": isDragging,
600
+ "pointer-events-none opacity-50": disabled
601
+ },
602
+ className
603
+ )
604
+ }
605
+ )
606
+ }
607
+ ) });
608
+ }
609
+ );
610
+ KanbanColumn.displayName = COLUMN_NAME;
611
+ const KanbanColumnHandle = React.forwardRef((props, forwardedRef) => {
612
+ const { asChild, disabled, className, ...columnHandleProps } = props;
613
+ const context = useKanbanContext(COLUMN_NAME);
614
+ const columnContext = useKanbanColumnContext(COLUMN_HANDLE_NAME);
615
+ const isDisabled = disabled ?? columnContext.disabled;
616
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
617
+ if (isDisabled) return;
618
+ columnContext.setActivatorNodeRef(node);
619
+ });
620
+ const HandlePrimitive = asChild ? Slot : "button";
621
+ return /* @__PURE__ */ jsx(
622
+ HandlePrimitive,
623
+ {
624
+ type: "button",
625
+ "aria-controls": columnContext.id,
626
+ "data-disabled": isDisabled,
627
+ "data-dragging": columnContext.isDragging ? "" : void 0,
628
+ "data-slot": "kanban-column-handle",
629
+ ...columnHandleProps,
630
+ ...isDisabled ? {} : columnContext.attributes,
631
+ ...isDisabled ? {} : columnContext.listeners,
632
+ ref: composedRef,
633
+ className: cn(
634
+ "select-none disabled:pointer-events-none disabled:opacity-50",
635
+ context.flatCursor ? "cursor-default" : "cursor-grab data-dragging:cursor-grabbing",
636
+ className
637
+ ),
638
+ disabled: isDisabled
639
+ }
640
+ );
641
+ });
642
+ KanbanColumnHandle.displayName = COLUMN_HANDLE_NAME;
643
+ const KanbanItemContext = React.createContext(
644
+ null
645
+ );
646
+ KanbanItemContext.displayName = ITEM_NAME;
647
+ function useKanbanItemContext(consumerName) {
648
+ const context = React.useContext(KanbanItemContext);
649
+ if (!context) {
650
+ throw new Error(`\`${consumerName}\` must be used within \`${ITEM_NAME}\``);
651
+ }
652
+ return context;
653
+ }
654
+ const KanbanItem = React.forwardRef(
655
+ (props, forwardedRef) => {
656
+ const {
657
+ value,
658
+ style,
659
+ asHandle,
660
+ asChild,
661
+ disabled,
662
+ className,
663
+ ...itemProps
664
+ } = props;
665
+ const id = React.useId();
666
+ const context = useKanbanContext(ITEM_NAME);
667
+ const inBoard = React.useContext(KanbanBoardContext);
668
+ const inOverlay = React.useContext(KanbanOverlayContext);
669
+ if (!inBoard && !inOverlay) {
670
+ throw new Error(`\`${ITEM_NAME}\` must be used within \`${BOARD_NAME}\``);
671
+ }
672
+ const {
673
+ attributes,
674
+ listeners,
675
+ setNodeRef,
676
+ setActivatorNodeRef,
677
+ transform,
678
+ transition,
679
+ isDragging
680
+ } = useSortable({ id: value, disabled });
681
+ if (value === "") {
682
+ throw new Error(`\`${ITEM_NAME}\` value cannot be an empty string`);
683
+ }
684
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
685
+ if (disabled) return;
686
+ setNodeRef(node);
687
+ });
688
+ const composedStyle = React.useMemo(() => {
689
+ return {
690
+ transform: CSS.Transform.toString(transform),
691
+ transition,
692
+ ...style
693
+ };
694
+ }, [transform, transition, style]);
695
+ const itemContext = React.useMemo(
696
+ () => ({
697
+ id,
698
+ attributes,
699
+ listeners,
700
+ setActivatorNodeRef,
701
+ isDragging,
702
+ disabled
703
+ }),
704
+ [id, attributes, listeners, setActivatorNodeRef, isDragging, disabled]
705
+ );
706
+ const ItemPrimitive = asChild ? Slot : "div";
707
+ return /* @__PURE__ */ jsx(KanbanItemContext.Provider, { value: itemContext, children: /* @__PURE__ */ jsx(
708
+ ItemPrimitive,
709
+ {
710
+ id,
711
+ "data-disabled": disabled,
712
+ "data-dragging": isDragging ? "" : void 0,
713
+ "data-slot": "kanban-item",
714
+ ...itemProps,
715
+ ...asHandle && !disabled ? attributes : {},
716
+ ...asHandle && !disabled ? listeners : {},
717
+ ref: composedRef,
718
+ style: composedStyle,
719
+ className: cn(
720
+ "focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1",
721
+ {
722
+ "touch-none select-none": asHandle,
723
+ "cursor-default": context.flatCursor,
724
+ "data-dragging:cursor-grabbing": !context.flatCursor,
725
+ "cursor-grab": !isDragging && asHandle && !context.flatCursor,
726
+ "opacity-50": isDragging,
727
+ "pointer-events-none opacity-50": disabled
728
+ },
729
+ className
730
+ )
731
+ }
732
+ ) });
733
+ }
734
+ );
735
+ KanbanItem.displayName = ITEM_NAME;
736
+ const KanbanItemHandle = React.forwardRef((props, forwardedRef) => {
737
+ const { asChild, disabled, className, ...itemHandleProps } = props;
738
+ const context = useKanbanContext(ITEM_HANDLE_NAME);
739
+ const itemContext = useKanbanItemContext(ITEM_HANDLE_NAME);
740
+ const isDisabled = disabled ?? itemContext.disabled;
741
+ const composedRef = useComposedRefs(forwardedRef, (node) => {
742
+ if (isDisabled) return;
743
+ itemContext.setActivatorNodeRef(node);
744
+ });
745
+ const HandlePrimitive = asChild ? Slot : "button";
746
+ return /* @__PURE__ */ jsx(
747
+ HandlePrimitive,
748
+ {
749
+ type: "button",
750
+ "aria-controls": itemContext.id,
751
+ "data-disabled": isDisabled,
752
+ "data-dragging": itemContext.isDragging ? "" : void 0,
753
+ "data-slot": "kanban-item-handle",
754
+ ...itemHandleProps,
755
+ ...isDisabled ? {} : itemContext.attributes,
756
+ ...isDisabled ? {} : itemContext.listeners,
757
+ ref: composedRef,
758
+ className: cn(
759
+ "select-none disabled:pointer-events-none disabled:opacity-50",
760
+ context.flatCursor ? "cursor-default" : "cursor-grab data-dragging:cursor-grabbing",
761
+ className
762
+ ),
763
+ disabled: isDisabled
764
+ }
765
+ );
766
+ });
767
+ KanbanItemHandle.displayName = ITEM_HANDLE_NAME;
768
+ const KanbanOverlayContext = React.createContext(false);
769
+ KanbanOverlayContext.displayName = OVERLAY_NAME;
770
+ const dropAnimation = {
771
+ sideEffects: defaultDropAnimationSideEffects({
772
+ styles: {
773
+ active: {
774
+ opacity: "0.4"
775
+ }
776
+ }
777
+ })
778
+ };
779
+ function KanbanOverlay(props) {
780
+ const { container: containerProp, children, ...overlayProps } = props;
781
+ const context = useKanbanContext(OVERLAY_NAME);
782
+ const [mounted, setMounted] = React.useState(false);
783
+ React.useLayoutEffect(() => setMounted(true), []);
784
+ const container = containerProp ?? (mounted ? globalThis.document?.body : null);
785
+ if (!container) return null;
786
+ const variant = context.activeId && context.activeId in context.items ? "column" : "item";
787
+ return ReactDOM.createPortal(
788
+ /* @__PURE__ */ jsx(
789
+ DragOverlay,
790
+ {
791
+ dropAnimation,
792
+ modifiers: context.modifiers,
793
+ className: cn(!context.flatCursor && "cursor-grabbing"),
794
+ ...overlayProps,
795
+ children: /* @__PURE__ */ jsx(KanbanOverlayContext.Provider, { value: true, children: context.activeId && children ? typeof children === "function" ? children({
796
+ value: context.activeId,
797
+ variant
798
+ }) : children : null })
799
+ }
800
+ ),
801
+ container
802
+ );
803
+ }
804
+
805
+ export { KanbanBoard as Board, KanbanColumn as Column, KanbanColumnHandle as ColumnHandle, KanbanItem as Item, KanbanItemHandle as ItemHandle, KanbanRoot as Kanban, KanbanBoard, KanbanColumn, KanbanColumnHandle, KanbanItem, KanbanItemHandle, KanbanOverlay, KanbanOverlay as Overlay, KanbanRoot as Root };