@dxos/plugin-kanban 0.8.4-main.dedc0f3 → 0.8.4-main.dfabb4ec29

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 (275) hide show
  1. package/dist/lib/neutral/KanbanContainer-QK6LNCYT.mjs +132 -0
  2. package/dist/lib/neutral/KanbanContainer-QK6LNCYT.mjs.map +7 -0
  3. package/dist/lib/neutral/KanbanPlugin.mjs +36 -0
  4. package/dist/lib/neutral/KanbanPlugin.mjs.map +7 -0
  5. package/dist/lib/neutral/KanbanPlugin.node.mjs +27 -0
  6. package/dist/lib/neutral/KanbanPlugin.node.mjs.map +7 -0
  7. package/dist/lib/neutral/KanbanSettings-G6M47NSK.mjs +83 -0
  8. package/dist/lib/neutral/KanbanSettings-G6M47NSK.mjs.map +7 -0
  9. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs +15 -0
  10. package/dist/lib/neutral/blueprint-definition-FHVIEKTQ.mjs.map +7 -0
  11. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  12. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  13. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-E65AME5F.mjs +255 -0
  15. package/dist/lib/neutral/chunk-E65AME5F.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  17. package/dist/lib/neutral/chunk-KDPM77BD.mjs +21 -0
  18. package/dist/lib/neutral/chunk-KDPM77BD.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-Z7O5CETK.mjs +8 -0
  20. package/dist/lib/neutral/chunk-Z7O5CETK.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs +26 -0
  22. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +7 -0
  23. package/dist/lib/neutral/components/index.mjs +243 -0
  24. package/dist/lib/neutral/components/index.mjs.map +7 -0
  25. package/dist/lib/neutral/containers/index.mjs +11 -0
  26. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  27. package/dist/lib/neutral/create-object-DKBSI46K.mjs +40 -0
  28. package/dist/lib/neutral/create-object-DKBSI46K.mjs.map +7 -0
  29. package/dist/lib/neutral/delete-card-QKT6OXGP.mjs +24 -0
  30. package/dist/lib/neutral/delete-card-QKT6OXGP.mjs.map +7 -0
  31. package/dist/lib/neutral/delete-card-field-XQKM7ZXE.mjs +42 -0
  32. package/dist/lib/neutral/delete-card-field-XQKM7ZXE.mjs.map +7 -0
  33. package/dist/lib/neutral/hooks/index.mjs +432 -0
  34. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  35. package/dist/lib/neutral/index.mjs +34 -0
  36. package/dist/lib/neutral/index.mjs.map +7 -0
  37. package/dist/lib/neutral/meta.json +1 -0
  38. package/dist/lib/neutral/meta.mjs +8 -0
  39. package/dist/lib/neutral/meta.mjs.map +7 -0
  40. package/dist/lib/neutral/migrations-4NS6H7U2.mjs +31 -0
  41. package/dist/lib/neutral/migrations-4NS6H7U2.mjs.map +7 -0
  42. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +13 -0
  43. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +7 -0
  44. package/dist/lib/neutral/operations/index.mjs +8 -0
  45. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  46. package/dist/lib/neutral/plugin.mjs +16 -0
  47. package/dist/lib/neutral/plugin.mjs.map +7 -0
  48. package/dist/lib/neutral/react-surface-6RVSCHMJ.mjs +93 -0
  49. package/dist/lib/neutral/react-surface-6RVSCHMJ.mjs.map +7 -0
  50. package/dist/lib/neutral/restore-card-XW7AHMPO.mjs +21 -0
  51. package/dist/lib/neutral/restore-card-XW7AHMPO.mjs.map +7 -0
  52. package/dist/lib/neutral/restore-card-field-QOAUY3RJ.mjs +40 -0
  53. package/dist/lib/neutral/restore-card-field-QOAUY3RJ.mjs.map +7 -0
  54. package/dist/lib/neutral/testing/index.mjs +60 -0
  55. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +44 -0
  57. package/dist/lib/neutral/translations.mjs.map +7 -0
  58. package/dist/lib/neutral/types/index.mjs +22 -0
  59. package/dist/lib/neutral/types/index.mjs.map +7 -0
  60. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
  61. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
  62. package/dist/types/src/KanbanPlugin.d.ts +3 -1
  63. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  64. package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
  65. package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
  66. package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
  67. package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
  68. package/dist/types/src/blueprints/index.d.ts +2 -0
  69. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  70. package/dist/types/src/blueprints/kanban-blueprint.d.ts +4 -0
  71. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -2
  73. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -4
  75. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  77. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/index.d.ts +13 -3
  79. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/migrations.d.ts +5 -0
  81. package/dist/types/src/capabilities/migrations.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  83. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  85. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  87. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  88. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +37 -0
  89. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -0
  90. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +72 -0
  91. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +9 -0
  93. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -0
  94. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +8 -0
  95. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -0
  96. package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
  97. package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
  98. package/dist/types/src/components/KanbanBoard/index.d.ts +2 -0
  99. package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -0
  100. package/dist/types/src/components/index.d.ts +1 -2
  101. package/dist/types/src/components/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts +6 -0
  103. package/dist/types/src/containers/KanbanContainer/KanbanContainer.d.ts.map +1 -0
  104. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts +79 -0
  105. package/dist/types/src/containers/KanbanContainer/KanbanContainer.stories.d.ts.map +1 -0
  106. package/dist/types/src/containers/KanbanContainer/index.d.ts +2 -0
  107. package/dist/types/src/containers/KanbanContainer/index.d.ts.map +1 -0
  108. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
  109. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
  110. package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
  111. package/dist/types/src/containers/KanbanSettings/index.d.ts.map +1 -0
  112. package/dist/types/src/containers/index.d.ts +4 -0
  113. package/dist/types/src/containers/index.d.ts.map +1 -0
  114. package/dist/types/src/hooks/index.d.ts +7 -0
  115. package/dist/types/src/hooks/index.d.ts.map +1 -0
  116. package/dist/types/src/hooks/useEchoChangeCallback.d.ts +13 -0
  117. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -0
  118. package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
  119. package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
  120. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
  121. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
  122. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +16 -0
  123. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -0
  124. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +22 -0
  125. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +19 -0
  127. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -0
  128. package/dist/types/src/hooks/useProjectionModel.d.ts +15 -0
  129. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
  130. package/dist/types/src/index.d.ts +3 -1
  131. package/dist/types/src/index.d.ts.map +1 -1
  132. package/dist/types/src/meta.d.ts +2 -3
  133. package/dist/types/src/meta.d.ts.map +1 -1
  134. package/dist/types/src/operations/delete-card-field.d.ts +5 -0
  135. package/dist/types/src/operations/delete-card-field.d.ts.map +1 -0
  136. package/dist/types/src/operations/delete-card.d.ts +5 -0
  137. package/dist/types/src/operations/delete-card.d.ts.map +1 -0
  138. package/dist/types/src/operations/index.d.ts +3 -0
  139. package/dist/types/src/operations/index.d.ts.map +1 -0
  140. package/dist/types/src/operations/restore-card-field.d.ts +5 -0
  141. package/dist/types/src/operations/restore-card-field.d.ts.map +1 -0
  142. package/dist/types/src/operations/restore-card.d.ts +5 -0
  143. package/dist/types/src/operations/restore-card.d.ts.map +1 -0
  144. package/dist/types/src/playwright/board-manager.d.ts +5 -0
  145. package/dist/types/src/playwright/board-manager.d.ts.map +1 -0
  146. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  147. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  148. package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
  149. package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
  150. package/dist/types/src/plugin.d.ts +4 -0
  151. package/dist/types/src/plugin.d.ts.map +1 -0
  152. package/dist/types/src/testing/KanbanCardTileSimple.d.ts +7 -0
  153. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -0
  154. package/dist/types/src/testing/index.d.ts +2 -0
  155. package/dist/types/src/testing/index.d.ts.map +1 -0
  156. package/dist/types/src/translations.d.ts +50 -22
  157. package/dist/types/src/translations.d.ts.map +1 -1
  158. package/dist/types/src/types/Kanban.d.ts +109 -0
  159. package/dist/types/src/types/Kanban.d.ts.map +1 -0
  160. package/dist/types/src/types/KanbanOperation.d.ts +52 -0
  161. package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
  162. package/dist/types/src/types/constants.d.ts +6 -0
  163. package/dist/types/src/types/constants.d.ts.map +1 -0
  164. package/dist/types/src/types/index.d.ts +3 -0
  165. package/dist/types/src/types/index.d.ts.map +1 -1
  166. package/dist/types/src/types/migrations.test.d.ts +2 -0
  167. package/dist/types/src/types/migrations.test.d.ts.map +1 -0
  168. package/dist/types/src/types/schema.d.ts +18 -52
  169. package/dist/types/src/types/schema.d.ts.map +1 -1
  170. package/dist/types/src/types/types.d.ts +28 -0
  171. package/dist/types/src/types/types.d.ts.map +1 -1
  172. package/dist/types/src/util/arrangement.d.ts +72 -0
  173. package/dist/types/src/util/arrangement.d.ts.map +1 -0
  174. package/dist/types/src/util/arrangement.test.d.ts +2 -0
  175. package/dist/types/src/util/arrangement.test.d.ts.map +1 -0
  176. package/dist/types/src/util/index.d.ts +2 -0
  177. package/dist/types/src/util/index.d.ts.map +1 -0
  178. package/dist/types/tsconfig.tsbuildinfo +1 -1
  179. package/package.json +120 -57
  180. package/src/KanbanPlugin.node.ts +21 -0
  181. package/src/KanbanPlugin.test.ts +31 -0
  182. package/src/KanbanPlugin.tsx +29 -57
  183. package/src/blueprints/index.ts +5 -0
  184. package/src/blueprints/kanban-blueprint.ts +27 -0
  185. package/src/capabilities/artifact-definition.ts +117 -113
  186. package/src/capabilities/blueprint-definition.ts +13 -24
  187. package/src/capabilities/create-object.ts +40 -0
  188. package/src/capabilities/index.ts +12 -4
  189. package/src/capabilities/migrations.ts +35 -0
  190. package/src/capabilities/operation-handler.ts +14 -0
  191. package/src/capabilities/react-surface.tsx +79 -68
  192. package/src/capabilities/undo-mappings.ts +34 -0
  193. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +146 -0
  194. package/src/components/KanbanBoard/KanbanBoard.tsx +164 -0
  195. package/src/components/KanbanBoard/KanbanCard.tsx +101 -0
  196. package/src/components/KanbanBoard/KanbanColumn.tsx +72 -0
  197. package/src/components/KanbanBoard/context.ts +54 -0
  198. package/src/components/KanbanBoard/index.ts +5 -0
  199. package/src/components/index.ts +1 -2
  200. package/src/containers/KanbanContainer/KanbanContainer.stories.tsx +277 -0
  201. package/src/containers/KanbanContainer/KanbanContainer.tsx +178 -0
  202. package/src/containers/KanbanContainer/index.ts +5 -0
  203. package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
  204. package/src/containers/KanbanSettings/index.ts +5 -0
  205. package/src/containers/index.ts +8 -0
  206. package/src/hooks/index.ts +10 -0
  207. package/src/hooks/useEchoChangeCallback.ts +30 -0
  208. package/src/hooks/useItemsProjection.ts +44 -0
  209. package/src/hooks/useKanbanBoardModel.browser.test.ts +235 -0
  210. package/src/hooks/useKanbanBoardModel.ts +157 -0
  211. package/src/hooks/useKanbanColumnEventHandler.ts +106 -0
  212. package/src/hooks/useKanbanItemEventHandler.ts +133 -0
  213. package/src/hooks/useProjectionModel.ts +58 -0
  214. package/src/index.ts +3 -2
  215. package/src/meta.ts +9 -7
  216. package/src/operations/delete-card-field.ts +47 -0
  217. package/src/operations/delete-card.ts +23 -0
  218. package/src/operations/index.ts +10 -0
  219. package/src/operations/restore-card-field.ts +41 -0
  220. package/src/operations/restore-card.ts +21 -0
  221. package/src/playwright/board-manager.ts +13 -0
  222. package/src/playwright/playwright.config.ts +19 -0
  223. package/src/playwright/smoke.spec.ts +107 -0
  224. package/src/plugin.ts +11 -0
  225. package/src/testing/KanbanCardTileSimple.tsx +82 -0
  226. package/src/testing/index.ts +5 -0
  227. package/src/translations.ts +28 -20
  228. package/src/types/Kanban.ts +151 -0
  229. package/src/types/KanbanOperation.ts +67 -0
  230. package/src/types/constants.ts +9 -0
  231. package/src/types/index.ts +4 -0
  232. package/src/types/migrations.test.ts +83 -0
  233. package/src/types/schema.ts +33 -45
  234. package/src/types/types.ts +35 -0
  235. package/src/util/arrangement.test.ts +218 -0
  236. package/src/util/arrangement.ts +177 -0
  237. package/src/util/index.ts +5 -0
  238. package/dist/lib/browser/blueprint-definition-GFG7LX2C.mjs +0 -28
  239. package/dist/lib/browser/blueprint-definition-GFG7LX2C.mjs.map +0 -7
  240. package/dist/lib/browser/chunk-NCNNL74W.mjs +0 -82
  241. package/dist/lib/browser/chunk-NCNNL74W.mjs.map +0 -7
  242. package/dist/lib/browser/index.mjs +0 -106
  243. package/dist/lib/browser/index.mjs.map +0 -7
  244. package/dist/lib/browser/intent-resolver-KHOAFPNN.mjs +0 -111
  245. package/dist/lib/browser/intent-resolver-KHOAFPNN.mjs.map +0 -7
  246. package/dist/lib/browser/meta.json +0 -1
  247. package/dist/lib/browser/react-surface-UBRYXDKS.mjs +0 -253
  248. package/dist/lib/browser/react-surface-UBRYXDKS.mjs.map +0 -7
  249. package/dist/lib/browser/types/index.mjs +0 -11
  250. package/dist/lib/node-esm/blueprint-definition-MIMDXMUM.mjs +0 -30
  251. package/dist/lib/node-esm/blueprint-definition-MIMDXMUM.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-5B3LKGA7.mjs +0 -84
  253. package/dist/lib/node-esm/chunk-5B3LKGA7.mjs.map +0 -7
  254. package/dist/lib/node-esm/index.mjs +0 -107
  255. package/dist/lib/node-esm/index.mjs.map +0 -7
  256. package/dist/lib/node-esm/intent-resolver-MKO5HVES.mjs +0 -112
  257. package/dist/lib/node-esm/intent-resolver-MKO5HVES.mjs.map +0 -7
  258. package/dist/lib/node-esm/meta.json +0 -1
  259. package/dist/lib/node-esm/react-surface-B2FPS52G.mjs +0 -254
  260. package/dist/lib/node-esm/react-surface-B2FPS52G.mjs.map +0 -7
  261. package/dist/lib/node-esm/types/index.mjs +0 -12
  262. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  263. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  264. package/dist/types/src/components/KanbanContainer.d.ts +0 -7
  265. package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
  266. package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -41
  267. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
  268. package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
  269. package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
  270. package/src/capabilities/intent-resolver.ts +0 -71
  271. package/src/components/KanbanContainer.stories.tsx +0 -190
  272. package/src/components/KanbanContainer.tsx +0 -95
  273. package/src/components/KanbanViewEditor.tsx +0 -62
  274. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  275. /package/dist/lib/{node-esm/types/index.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/components/KanbanBoard/KanbanBoard.tsx", "../../../../src/components/KanbanBoard/context.ts", "../../../../src/components/KanbanBoard/KanbanCard.tsx", "../../../../src/components/KanbanBoard/KanbanColumn.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { type ComponentPropsWithoutRef, type PropsWithChildren, useCallback, useContext, useMemo } from 'react';\n\nimport { Obj } from '@dxos/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { Board, useBoard } from '@dxos/react-ui-mosaic';\nimport type { ProjectionModel } from '@dxos/schema';\nimport { composable, composableProps } from '@dxos/ui-theme';\n\nimport { useKanbanBoardModel, useKanbanColumnEventHandler } from '#hooks';\nimport { meta } from '#meta';\nimport { type Kanban, UNCATEGORIZED_ATTRIBUTES, UNCATEGORIZED_VALUE } from '#types';\n\nimport {\n KanbanBoardContext,\n type KanbanBoardContextValue,\n type KanbanCardProps,\n type KanbanColumnProps,\n useKanbanBoard,\n} from './context';\nimport { KanbanCard } from './KanbanCard';\nimport { KanbanColumn } from './KanbanColumn';\n\n// TODO(burdon): Rename Kanban.\n\n//\n// Root\n//\n\nconst KANBAN_BOARD_ROOT = 'KanbanBoard.Root';\n\ntype KanbanBoardRootProps = PropsWithChildren<\n {\n kanban: Kanban.Kanban;\n /** Required when providing context; Root derives columnFieldPath, pivotFieldId, getPivotAttributes from kanban + projection. */\n projection: ProjectionModel;\n /** Atom of items (e.g. from AtomQuery for DB, or Atom.make([]) for in-memory). */\n items: Atom.Atom<Obj.Unknown[]>;\n onCardAdd?: (columnValue: string | undefined) => string | undefined;\n onCardRemove?: (card: Obj.Unknown) => void;\n } & Pick<KanbanBoardContextValue, 'change' | 'itemTile'> &\n ComponentPropsWithoutRef<'div'>\n>;\n\nexport const KanbanBoardRoot = ({\n children,\n kanban,\n projection,\n items,\n change,\n itemTile = KanbanCard,\n onCardAdd,\n onCardRemove,\n}: KanbanBoardRootProps) => {\n const registry = useContext(RegistryContext);\n const { t } = useTranslation(meta.id);\n const model = useKanbanBoardModel(kanban, projection, items, registry);\n const columns = model?.getColumns?.() ?? [];\n const view = kanban?.spec.kind === 'view' ? kanban.spec.view.target : undefined;\n const pivotFieldId = view?.projection?.pivotFieldId;\n const columnFieldPath = useMemo(() => {\n // Items-variant kanbans use the property name itself as the pivot field\n // (no view/projection translation layer).\n if (kanban?.spec.kind === 'items') {\n return kanban.spec.pivotField;\n }\n if (pivotFieldId === undefined || !projection) {\n return undefined;\n }\n\n return projection.tryGetFieldProjection(pivotFieldId)?.props.property;\n }, [kanban?.spec, projection, pivotFieldId]);\n\n const getPivotAttributes = useCallback<KanbanBoardContextValue['getPivotAttributes']>(\n (columnValue) => {\n if (columnValue === UNCATEGORIZED_VALUE) {\n return UNCATEGORIZED_ATTRIBUTES;\n }\n\n const options = projection?.tryGetFieldProjection(pivotFieldId ?? '')?.props.options ?? [];\n const option = options.find((option) => option.id === columnValue);\n return option ?? ({ title: columnValue, color: 'neutral' } as const);\n },\n [projection, pivotFieldId],\n );\n\n if (columns.length === 0) {\n return (\n <div className='flex flex-1 items-center justify-center p-8 text-center text-description'>\n {t('select-pivot.placeholder')}\n </div>\n );\n }\n\n return (\n <KanbanBoardContext\n kanbanId={Obj.getDXN(kanban).toString()}\n projection={projection}\n columnFieldPath={columnFieldPath}\n pivotFieldId={pivotFieldId}\n getPivotAttributes={getPivotAttributes}\n itemTile={itemTile}\n change={change}\n onCardAdd={onCardAdd}\n onCardRemove={onCardRemove}\n >\n <Board.Root model={model}>{children}</Board.Root>\n </KanbanBoardContext>\n );\n};\n\nKanbanBoardRoot.displayName = KANBAN_BOARD_ROOT;\n\n//\n// KanbanBoardContent\n//\n\nconst KANBAN_BOARD_CONTENT = 'KanbanBoard.Content';\n\ntype KanbanBoardContentProps = {};\n\nexport const KanbanBoardContent = composable<HTMLDivElement, KanbanBoardContentProps>((props, forwardedRef) => {\n const { model } = useBoard(KANBAN_BOARD_CONTENT);\n const { kanbanId, projection, pivotFieldId, change } = useKanbanBoard(KANBAN_BOARD_CONTENT);\n\n const columnEventHandler = useKanbanColumnEventHandler({\n id: `${kanbanId}-columns`,\n model,\n projection: projection ?? undefined,\n pivotFieldId: pivotFieldId ?? undefined,\n change,\n });\n\n return (\n <Board.Content\n {...composableProps(props)}\n ref={forwardedRef}\n id={kanbanId}\n eventHandler={columnEventHandler}\n Tile={KanbanColumn}\n />\n );\n});\n\nKanbanBoardContent.displayName = KANBAN_BOARD_CONTENT;\n\n//\n// KanbanBoard\n//\n\nexport const KanbanBoard = {\n Root: KanbanBoardRoot,\n Content: KanbanBoardContent,\n Column: KanbanColumn,\n Card: KanbanCard,\n};\n\nexport { useKanbanBoard };\n\nexport type { KanbanBoardRootProps as KanbanBoardProps, KanbanCardProps, KanbanColumnProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type ComponentType } from 'react';\n\nimport { type Obj } from '@dxos/echo';\nimport { type MosaicTileProps } from '@dxos/react-ui-mosaic';\nimport { type ProjectionModel } from '@dxos/schema';\n\nimport { type ColumnStructure, type KanbanChangeCallback, UNCATEGORIZED_ATTRIBUTES, UNCATEGORIZED_VALUE } from '#types';\n\nconst KANBAN_BOARD_NAME = 'KanbanBoard.Context';\n\n/**\n * Card tile props. Defined here (rather than in `KanbanCard.tsx`) so the\n * context type can reference it without forming a cycle through that\n * module's runtime exports — webkit treats the resulting TDZ as a hard\n * error while other engines are lenient.\n */\nexport type KanbanCardProps = Pick<MosaicTileProps<Obj.Unknown>, 'location' | 'data' | 'debug' | 'draggable'>;\n\n/**\n * Column tile props. See note on {@link KanbanCardProps}.\n */\nexport type KanbanColumnProps = Pick<MosaicTileProps<ColumnStructure>, 'location' | 'data' | 'debug' | 'draggable'>;\n\n/**\n * Context value for the Kanban board.\n * Items are Echo objects (Obj.Unknown).\n */\nexport type KanbanBoardContextValue = {\n kanbanId: string;\n projection: ProjectionModel | undefined;\n columnFieldPath: string | undefined;\n change: KanbanChangeCallback<Obj.Unknown>;\n pivotFieldId: string | undefined;\n getPivotAttributes: (columnValue: string) => { title: string; color: string };\n itemTile?: ComponentType<KanbanCardProps>; // TODO(burdon): Prop.\n onCardAdd?: (columnValue: string | undefined) => string | undefined;\n onCardRemove?: (card: Obj.Unknown) => void;\n};\n\nexport const [KanbanBoardContext, useKanbanBoard] = createContext<KanbanBoardContextValue>(KANBAN_BOARD_NAME, {\n kanbanId: 'never',\n projection: undefined,\n columnFieldPath: undefined,\n change: { kanban: () => {}, setItemField: () => {} },\n pivotFieldId: undefined,\n getPivotAttributes: (id: string) =>\n id === UNCATEGORIZED_VALUE ? UNCATEGORIZED_ATTRIBUTES : { title: id, color: 'neutral' },\n itemTile: (() => null) as ComponentType<KanbanCardProps>,\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { forwardRef, useCallback, useMemo, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface, useObjectMenuItems } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Card, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { Menu, createMenuAction } from '@dxos/react-ui-menu';\nimport { Focus, Mosaic, useBoard } from '@dxos/react-ui-mosaic';\n\nimport { meta } from '#meta';\n\nimport { type KanbanCardProps, useKanbanBoard } from './context';\n\nexport { type KanbanCardProps };\n\nconst KANBAN_CARD_TILE_NAME = 'KanbanBoard.Card';\n\n/**\n * Mosaic Tile for Kanban card.\n * Uses Surface for content; requires plugin manager context.\n */\nexport const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(\n ({ data, location, debug, draggable }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { model } = useBoard(KANBAN_CARD_TILE_NAME);\n const { projection, columnFieldPath, onCardRemove } = useKanbanBoard(KANBAN_CARD_TILE_NAME);\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n const dragHandleRef = useCallback((el: HTMLButtonElement | null) => setDragHandle(el), []);\n\n const objectMenuItems = useObjectMenuItems(data);\n\n const menuItems = useMemo(\n () => [\n ...objectMenuItems,\n ...(onCardRemove\n ? [\n createMenuAction('remove', () => onCardRemove(data), {\n label: t('remove-card.label'),\n icon: 'ph--trash--regular',\n }),\n ]\n : []),\n ],\n [objectMenuItems, onCardRemove, data, t],\n );\n\n return (\n <Menu.Root>\n <Mosaic.Tile\n asChild\n id={model.getItemId(data)}\n data={data}\n location={location}\n debug={debug}\n draggable={draggable}\n dragHandle={dragHandle}\n >\n <Focus.Item asChild>\n <Card.Root ref={forwardedRef} data-testid='board-item'>\n <Card.Toolbar>\n <Card.DragHandle ref={dragHandleRef} testId='mosaicBoard.cardDragHandle' />\n <Card.Title data-testid='mosaicBoard.cardTitle'>{Obj.getLabel(data)}</Card.Title>\n {/* TODO(wittjosiah): Reconcile with Card.Menu. */}\n <Menu.Trigger asChild disabled={!menuItems?.length}>\n <Toolbar.IconButton\n iconOnly\n variant='ghost'\n icon='ph--dots-three-vertical--regular'\n label={t('action-menu.label')}\n />\n </Menu.Trigger>\n <Menu.Content items={menuItems} />\n </Card.Toolbar>\n <Card.Content>\n {projection && (\n <Surface.Surface\n type={AppSurface.Card}\n limit={1}\n data={{\n subject: data,\n projection,\n // Hide the pivot field: its value is already conveyed by\n // which column the card sits in.\n ignorePaths: columnFieldPath ? [columnFieldPath] : undefined,\n }}\n />\n )}\n </Card.Content>\n </Card.Root>\n </Focus.Item>\n </Mosaic.Tile>\n </Menu.Root>\n );\n },\n);\n\nKanbanCard.displayName = KANBAN_CARD_TILE_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { FC, forwardRef, useState } from 'react';\n\nimport type { Obj } from '@dxos/echo';\nimport { Board, type MosaicTileProps, useBoard } from '@dxos/react-ui-mosaic';\n\nimport { useKanbanItemEventHandler } from '#hooks';\nimport { type ColumnStructure, UNCATEGORIZED_VALUE } from '#types';\n\nimport { type KanbanColumnProps, useKanbanBoard } from './context';\n\nexport { type KanbanColumnProps };\n\nconst KANBAN_COLUMN_NAME = 'KanbanBoard.Column';\n\n/**\n * Mosaic Tile for Kanban column.\n */\nexport const KanbanColumn = forwardRef<HTMLDivElement, KanbanColumnProps>(\n ({ data: column, location, debug, draggable }, forwardedRef) => {\n const { model } = useBoard<ColumnStructure, Obj.Unknown>(KANBAN_COLUMN_NAME);\n const { columnFieldPath, change, onCardAdd, getPivotAttributes, itemTile } = useKanbanBoard(KANBAN_COLUMN_NAME);\n\n const { title } = getPivotAttributes(column.columnValue);\n const uncategorized = column.columnValue === UNCATEGORIZED_VALUE;\n const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);\n\n const eventHandler = useKanbanItemEventHandler({\n column,\n columnFieldPath,\n model,\n change,\n });\n\n return (\n <Board.Column.Root\n data={column}\n location={location}\n classNames='grid grid-rows-[var(--dx-rail-action)_1fr_var(--dx-rail-action)]'\n debug={debug}\n draggable={draggable}\n dragHandle={dragHandle}\n ref={forwardedRef}\n >\n {uncategorized ? (\n <div className='border-b border-separator p-2' data-testid='board-column-header'>\n <span className='font-medium'>{title}</span>\n </div>\n ) : (\n <Board.Column.Header label={title} dragHandleRef={setDragHandle} />\n )}\n <Board.Column.Body\n data={column}\n eventHandler={eventHandler}\n Tile={itemTile as FC<MosaicTileProps<Obj.Unknown>>}\n />\n <Board.Column.Footer\n onAdd={\n onCardAdd\n ? () => onCardAdd(column.columnValue === UNCATEGORIZED_VALUE ? undefined : column.columnValue)\n : undefined\n }\n />\n </Board.Column.Root>\n );\n },\n);\n\nKanbanColumn.displayName = KANBAN_COLUMN_NAME;\n"],
5
+ "mappings": "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",
6
+ "names": ["RegistryContext", "React", "useCallback", "useContext", "useMemo", "Obj", "useTranslation", "Board", "useBoard", "composable", "composableProps", "useKanbanBoardModel", "useKanbanColumnEventHandler", "meta", "UNCATEGORIZED_ATTRIBUTES", "UNCATEGORIZED_VALUE", "createContext", "UNCATEGORIZED_ATTRIBUTES", "UNCATEGORIZED_VALUE", "KANBAN_BOARD_NAME", "KanbanBoardContext", "useKanbanBoard", "kanbanId", "projection", "undefined", "columnFieldPath", "change", "kanban", "setItemField", "pivotFieldId", "getPivotAttributes", "id", "title", "color", "itemTile", "React", "forwardRef", "useCallback", "useMemo", "useState", "Surface", "AppSurface", "useObjectMenuItems", "Obj", "Card", "Toolbar", "useTranslation", "Menu", "createMenuAction", "Focus", "Mosaic", "useBoard", "meta", "KANBAN_CARD_TILE_NAME", "KanbanCard", "forwardRef", "data", "location", "debug", "draggable", "forwardedRef", "t", "useTranslation", "meta", "id", "model", "useBoard", "projection", "columnFieldPath", "onCardRemove", "useKanbanBoard", "dragHandle", "setDragHandle", "useState", "dragHandleRef", "useCallback", "el", "objectMenuItems", "useObjectMenuItems", "menuItems", "useMemo", "createMenuAction", "label", "icon", "Menu", "Root", "Mosaic", "Tile", "asChild", "getItemId", "Focus", "Item", "Card", "ref", "data-testid", "Toolbar", "DragHandle", "testId", "Title", "Obj", "getLabel", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "items", "Surface", "type", "AppSurface", "limit", "subject", "ignorePaths", "undefined", "displayName", "React", "forwardRef", "useState", "Board", "useBoard", "useKanbanItemEventHandler", "UNCATEGORIZED_VALUE", "KANBAN_COLUMN_NAME", "KanbanColumn", "forwardRef", "data", "column", "location", "debug", "draggable", "forwardedRef", "model", "useBoard", "columnFieldPath", "change", "onCardAdd", "getPivotAttributes", "itemTile", "useKanbanBoard", "title", "columnValue", "uncategorized", "UNCATEGORIZED_VALUE", "dragHandle", "setDragHandle", "useState", "eventHandler", "useKanbanItemEventHandler", "React", "Board", "Column", "Root", "classNames", "ref", "div", "className", "data-testid", "span", "Header", "label", "dragHandleRef", "Body", "Tile", "Footer", "onAdd", "undefined", "displayName", "KANBAN_BOARD_ROOT", "KanbanBoardRoot", "children", "kanban", "projection", "items", "change", "itemTile", "KanbanCard", "onCardAdd", "onCardRemove", "registry", "useContext", "RegistryContext", "t", "useTranslation", "meta", "id", "model", "useKanbanBoardModel", "columns", "getColumns", "view", "spec", "kind", "target", "undefined", "pivotFieldId", "columnFieldPath", "useMemo", "pivotField", "tryGetFieldProjection", "props", "property", "getPivotAttributes", "useCallback", "columnValue", "UNCATEGORIZED_VALUE", "UNCATEGORIZED_ATTRIBUTES", "options", "option", "find", "title", "color", "length", "React", "div", "className", "KanbanBoardContext", "kanbanId", "Obj", "getDXN", "toString", "Board", "Root", "displayName", "KANBAN_BOARD_CONTENT", "KanbanBoardContent", "composable", "forwardedRef", "useBoard", "useKanbanBoard", "columnEventHandler", "useKanbanColumnEventHandler", "Content", "composableProps", "ref", "eventHandler", "Tile", "KanbanColumn", "KanbanBoard", "Column", "Card"]
7
+ }
@@ -0,0 +1,11 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/containers/index.ts
4
+ import { lazy } from "react";
5
+ var KanbanContainer = lazy(() => import("../KanbanContainer-QK6LNCYT.mjs"));
6
+ var KanbanSettings = lazy(() => import("../KanbanSettings-G6M47NSK.mjs"));
7
+ export {
8
+ KanbanContainer,
9
+ KanbanSettings
10
+ };
11
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/containers/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const KanbanContainer: ComponentType<any> = lazy(() => import('./KanbanContainer'));\nexport const KanbanSettings: ComponentType<any> = lazy(() => import('./KanbanSettings'));\n"],
5
+ "mappings": ";;;AAIA,SAA6BA,YAAY;AAElC,IAAMC,kBAAsCD,KAAK,MAAM,OAAO,iCAAA,CAAA;AAC9D,IAAME,iBAAqCF,KAAK,MAAM,OAAO,gCAAA,CAAA;",
6
+ "names": ["lazy", "KanbanContainer", "KanbanSettings"]
7
+ }
@@ -0,0 +1,40 @@
1
+ import "./chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/create-object.ts
4
+ import * as Effect from "effect/Effect";
5
+ import { Capability } from "@dxos/app-framework";
6
+ import { Operation } from "@dxos/compute";
7
+ import { Type } from "@dxos/echo";
8
+ import { SpaceOperation } from "@dxos/plugin-space";
9
+ import { SpaceCapabilities } from "@dxos/plugin-space";
10
+ import { ViewModel } from "@dxos/schema";
11
+ import { CreateKanbanSchema, Kanban } from "#types";
12
+ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
13
+ return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
14
+ id: Type.getTypename(Kanban.Kanban),
15
+ inputSchema: CreateKanbanSchema,
16
+ createObject: (props, options) => Effect.gen(function* () {
17
+ const object = yield* Effect.promise(async () => {
18
+ const { view } = await ViewModel.makeFromDatabase({
19
+ db: options.db,
20
+ typename: props.typename,
21
+ pivotFieldName: props.initialPivotColumn
22
+ });
23
+ return Kanban.make({
24
+ name: props.name,
25
+ view
26
+ });
27
+ });
28
+ return yield* Operation.invoke(SpaceOperation.AddObject, {
29
+ object,
30
+ target: options.target,
31
+ hidden: true,
32
+ targetNodeId: options.targetNodeId
33
+ });
34
+ })
35
+ });
36
+ }));
37
+ export {
38
+ create_object_default as default
39
+ };
40
+ //# sourceMappingURL=create-object-DKBSI46K.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/capabilities/create-object.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { ViewModel } from '@dxos/schema';\n\nimport { CreateKanbanSchema, Kanban } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Kanban.Kanban),\n inputSchema: CreateKanbanSchema,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = yield* Effect.promise(async () => {\n const { view } = await ViewModel.makeFromDatabase({\n db: options.db,\n typename: props.typename,\n pivotFieldName: props.initialPivotColumn,\n });\n return Kanban.make({ name: props.name, view });\n });\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n hidden: true,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
5
+ "mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,iBAAiB;AAE1B,SAASC,oBAAoBC,cAAc;AAE3C,IAAA,wBAAeP,WAAWQ,WACjBC,kBAAW,aAAA;AAChB,SAAOT,WAAWU,YAAYN,kBAAkBO,mBAAmB;IACjEC,IAAIV,KAAKW,YAAYN,OAAOA,MAAM;IAClCO,aAAaR;IACbS,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAAS,OAAcC,eAAQ,YAAA;AACnC,cAAM,EAAEC,KAAI,IAAK,MAAMhB,UAAUiB,iBAAiB;UAChDC,IAAIN,QAAQM;UACZC,UAAUR,MAAMQ;UAChBC,gBAAgBT,MAAMU;QACxB,CAAA;AACA,eAAOnB,OAAOoB,KAAK;UAAEC,MAAMZ,MAAMY;UAAMP;QAAK,CAAA;MAC9C,CAAA;AACA,aAAO,OAAOpB,UAAU4B,OAAO1B,eAAe2B,WAAW;QACvDX;QACAY,QAAQd,QAAQc;QAChBC,QAAQ;QACRC,cAAchB,QAAQgB;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
6
+ "names": ["Effect", "Capability", "Operation", "Type", "SpaceOperation", "SpaceCapabilities", "ViewModel", "CreateKanbanSchema", "Kanban", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "inputSchema", "createObject", "props", "options", "gen", "object", "promise", "view", "makeFromDatabase", "db", "typename", "pivotFieldName", "initialPivotColumn", "make", "name", "invoke", "AddObject", "target", "hidden", "targetNodeId"]
7
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ KanbanOperation_exports
3
+ } from "./chunk-E65AME5F.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/operations/delete-card.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { Operation } from "@dxos/compute";
9
+ import { Obj } from "@dxos/echo";
10
+ import { invariant } from "@dxos/invariant";
11
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/operations/delete-card.ts";
12
+ var handler = KanbanOperation_exports.DeleteCard.pipe(Operation.withHandler(({ card }) => Effect.sync(() => {
13
+ const db = Obj.getDatabase(card);
14
+ invariant(db, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 9, S: void 0, A: ["db", ""] });
15
+ db.remove(card);
16
+ return {
17
+ card
18
+ };
19
+ })));
20
+ var delete_card_default = handler;
21
+ export {
22
+ delete_card_default as default
23
+ };
24
+ //# sourceMappingURL=delete-card-QKT6OXGP.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/delete-card.ts"],
4
+ "sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Obj } from '@dxos/echo';\nimport { invariant } from '@dxos/invariant';\n\nimport { KanbanOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof KanbanOperation.DeleteCard> = KanbanOperation.DeleteCard.pipe(\n Operation.withHandler(({ card }) =>\n Effect.sync(() => {\n const db = Obj.getDatabase(card);\n invariant(db);\n db.remove(card);\n\n return { card };\n }),\n ),\n);\n\nexport default handler;\n"],
5
+ "mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,WAAW;AACpB,SAASC,iBAAiB;AAI1B,IAAA,eAA0EC;cAIpEC,wBAAUC,WAAAA,KAAAA,UAAAA,YAAAA,CAAAA,EAAAA,KAAAA,MAAAA,YAAAA,MAAAA;AACVA,QAAGC,KAAOC,IAAAA,YAAAA,IAAAA;AAEV,YAAO,IAAA,QAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,GAAA,GAAA,QAAA,GAAA,CAAA,MAAA,EAAA,EAAA,CAAA;YAAEA,IAAAA;AAAK,SAAA;IAChB;EAIJ;;;",
6
+ "names": ["Effect", "Operation", "Obj", "invariant", "KanbanOperation", "invariant", "db", "remove", "card"]
7
+ }
@@ -0,0 +1,42 @@
1
+ import {
2
+ KanbanOperation_exports
3
+ } from "./chunk-E65AME5F.mjs";
4
+ import "./chunk-J5LGTIGS.mjs";
5
+
6
+ // src/operations/delete-card-field.ts
7
+ import * as Effect from "effect/Effect";
8
+ import { Capabilities, Capability } from "@dxos/app-framework";
9
+ import { Operation } from "@dxos/compute";
10
+ import { JsonSchema, Obj } from "@dxos/echo";
11
+ import { invariant } from "@dxos/invariant";
12
+ import { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from "@dxos/schema";
13
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/operations/delete-card-field.ts";
14
+ var handler = KanbanOperation_exports.DeleteCardField.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ view, fieldId }) {
15
+ const registry = yield* Capability.get(Capabilities.AtomRegistry);
16
+ const db = Obj.getDatabase(view);
17
+ invariant(db, "Database not found", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 12, S: this, A: ["db", "'Database not found'"] });
18
+ const schema = yield* Effect.promise(() => db.schemaRegistry.query({
19
+ typename: getTypenameFromQuery(view.query.ast),
20
+ location: [
21
+ "database",
22
+ "runtime"
23
+ ]
24
+ }).first());
25
+ const projection = new ProjectionModel({
26
+ registry,
27
+ view,
28
+ baseSchema: JsonSchema.toJsonSchema(schema),
29
+ change: createEchoChangeCallback(view, schema)
30
+ });
31
+ const result = projection.deleteFieldProjection(fieldId);
32
+ return {
33
+ field: result.deleted.field,
34
+ props: result.deleted.props,
35
+ index: result.index
36
+ };
37
+ })));
38
+ var delete_card_field_default = handler;
39
+ export {
40
+ delete_card_field_default as default
41
+ };
42
+ //# sourceMappingURL=delete-card-field-XQKM7ZXE.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/delete-card-field.ts"],
4
+ "sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { JsonSchema, Obj } from '@dxos/echo';\nimport { type EchoSchema } from '@dxos/echo/internal';\nimport { invariant } from '@dxos/invariant';\nimport { ProjectionModel, createEchoChangeCallback, getTypenameFromQuery } from '@dxos/schema';\n\nimport { KanbanOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof KanbanOperation.DeleteCardField> = KanbanOperation.DeleteCardField.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ view, fieldId }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const db = Obj.getDatabase(view);\n invariant(db, 'Database not found');\n const schema = yield* Effect.promise(() =>\n db.schemaRegistry\n .query({\n typename: getTypenameFromQuery(view.query.ast)!,\n location: ['database', 'runtime'],\n })\n .first(),\n );\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: JsonSchema.toJsonSchema(schema),\n change: createEchoChangeCallback(view, schema as EchoSchema),\n });\n\n const result = projection.deleteFieldProjection(fieldId);\n\n return {\n field: result.deleted.field,\n props: result.deleted.props,\n index: result.index,\n };\n }),\n ),\n);\n\nexport default handler;\n"],
5
+ "mappings": ";;;;;;AAEA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,iBAAiB;AAC1B,SAASC,YAAYC,WAAW;AAEhC,SAASC,iBAAiB;AAC1B,SAASC,iBAAiBC,0BAA0BC,4BAA4B;AAIhF,IAAA,eAA+EC;IAIzE,UAAWC,wBAAgBC,gBAAAA,KAAAA,UAAAA,YAAAA,kBAAAA,WAAAA,EAAAA,MAAAA,QAAAA,GAAAA;AAC3BC,QAAAA,WAAc,OAAA,WAAA,IAAA,aAAA,YAAA;AACd,QAAMC,KAAAA,IAAS,YAAOC,IAAOC;YAGvBC,IAAAA,sBAAUC,EAAAA,YAA0BC,YAAS,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,MAAA,sBAAA,EAAA,CAAA;iBAC7CC,OAAU,eAAA,MAAA,GAAA,eAAA,MAAA;cAAC,qBAAA,KAAA,MAAA,GAAA;cAAY;MAAU;MAE7B;IAGJC;EACJC,CAAAA,EAAAA,MAAAA,CAAAA;QACAV,aAAAA,IAAAA,gBAAAA;IACAW;IACAC;IACF,YAAA,WAAA,aAAA,MAAA;IAEA,QAAMC,yBAAoBC,MAAAA,MAAsBC;EAEhD,CAAA;QACEC,SAAOH,WAAeG,sBAAK,OAAA;SAC3BC;IACAC,OAAOL,OAAOK,QAAK;IACrB,OAAA,OAAA,QAAA;IACF,OAAA,OAAA;EAIJ;;;",
6
+ "names": ["Effect", "Capabilities", "Capability", "Operation", "JsonSchema", "Obj", "invariant", "ProjectionModel", "createEchoChangeCallback", "getTypenameFromQuery", "KanbanOperation", "Obj", "view", "invariant", "schema", "Effect", "promise", "typename", "getTypenameFromQuery", "query", "location", "projection", "registry", "baseSchema", "change", "result", "deleteFieldProjection", "fieldId", "field", "props", "index"]
7
+ }
@@ -0,0 +1,432 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/hooks/useEchoChangeCallback.ts
4
+ import { useMemo } from "react";
5
+ import { Obj } from "@dxos/echo";
6
+ var createEchoChangeCallback = (kanban) => ({
7
+ kanban: (mutate) => Obj.update(kanban, (kanban2) => mutate(kanban2)),
8
+ setItemField: (item, field, value) => {
9
+ Obj.update(item, (item2) => {
10
+ item2[field] = value;
11
+ });
12
+ }
13
+ });
14
+ var useEchoChangeCallback = (kanban) => useMemo(() => kanban ? createEchoChangeCallback(kanban) : null, [
15
+ kanban
16
+ ]);
17
+
18
+ // src/hooks/useItemsProjection.ts
19
+ import { Atom } from "@effect-atom/atom-react";
20
+ import { useMemo as useMemo2 } from "react";
21
+ var useItemsProjection = (kanban) => {
22
+ return useMemo2(() => {
23
+ const pivotField = kanban.spec.pivotField;
24
+ const optionIds = Object.keys(kanban.arrangement?.columns ?? {});
25
+ const options = optionIds.map((id) => ({
26
+ id,
27
+ title: id,
28
+ color: "neutral"
29
+ }));
30
+ const fieldProjection = {
31
+ field: {
32
+ id: pivotField,
33
+ path: pivotField
34
+ },
35
+ props: {
36
+ property: pivotField,
37
+ options
38
+ }
39
+ };
40
+ const fields = Atom.make(() => [
41
+ fieldProjection.field
42
+ ]);
43
+ const stub = {
44
+ fields,
45
+ tryGetFieldProjection: (id) => id === pivotField ? fieldProjection : void 0,
46
+ getFieldProjections: () => [],
47
+ getHiddenProperties: () => [
48
+ pivotField
49
+ ]
50
+ };
51
+ return stub;
52
+ }, [
53
+ kanban.arrangement?.columns,
54
+ kanban.spec.pivotField
55
+ ]);
56
+ };
57
+
58
+ // src/hooks/useKanbanBoardModel.ts
59
+ import { Atom as Atom2 } from "@effect-atom/atom-react";
60
+ import { useMemo as useMemo3 } from "react";
61
+ import { Obj as Obj2 } from "@dxos/echo";
62
+ import { AtomObj } from "@dxos/echo-atom";
63
+
64
+ // src/util/arrangement.ts
65
+ import { UNCATEGORIZED_VALUE } from "#types";
66
+ var getOrderFromArrangement = (arrangement) => {
67
+ const order = arrangement?.order;
68
+ if (order != null && Array.isArray(order) && order.length > 0) {
69
+ return [
70
+ ...order
71
+ ];
72
+ }
73
+ return [];
74
+ };
75
+ var getOrderByColumnFromArrangement = (arrangement) => {
76
+ const columns = arrangement?.columns;
77
+ if (columns != null && Object.keys(columns).length > 0) {
78
+ return Object.fromEntries(Object.entries(columns).map(([key, entry]) => {
79
+ const rawIds = entry.ids;
80
+ const ids = Array.isArray(rawIds) ? [
81
+ ...rawIds
82
+ ] : [];
83
+ return [
84
+ key,
85
+ {
86
+ ids,
87
+ ...entry.hidden !== void 0 && {
88
+ hidden: entry.hidden
89
+ }
90
+ }
91
+ ];
92
+ }));
93
+ }
94
+ return {};
95
+ };
96
+ var computeColumnStructure = (effectiveOrder, effectiveByColumn, selectOptions) => {
97
+ const order = [
98
+ ...effectiveOrder
99
+ ];
100
+ if (!order.includes(UNCATEGORIZED_VALUE)) {
101
+ order.unshift(UNCATEGORIZED_VALUE);
102
+ }
103
+ for (const opt of selectOptions) {
104
+ if (opt.id !== UNCATEGORIZED_VALUE && !order.includes(opt.id)) {
105
+ order.push(opt.id);
106
+ }
107
+ }
108
+ return order.filter((columnValue) => effectiveByColumn[columnValue]?.hidden !== true).map((columnValue) => ({
109
+ columnValue,
110
+ ids: effectiveByColumn[columnValue]?.ids ?? []
111
+ }));
112
+ };
113
+ var orderItemsInColumn = (items, ids, columnValue, pivotPath, validColumnValues) => {
114
+ const orderMap = new Map(ids.map((id, index) => [
115
+ id,
116
+ index
117
+ ]));
118
+ const cardsWithExistingOrder = [];
119
+ const newCards = [];
120
+ for (const item of items) {
121
+ const itemColumn = pivotPath !== void 0 ? item[pivotPath] : void 0;
122
+ const isValidColumn = itemColumn != null && validColumnValues.has(itemColumn);
123
+ const belongsInColumn = columnValue === UNCATEGORIZED_VALUE ? !isValidColumn : itemColumn === columnValue;
124
+ if (belongsInColumn) {
125
+ (orderMap.has(item.id) ? cardsWithExistingOrder : newCards).push(item);
126
+ }
127
+ }
128
+ cardsWithExistingOrder.sort((a, b) => {
129
+ const indexA = orderMap.get(a.id) ?? Infinity;
130
+ const indexB = orderMap.get(b.id) ?? Infinity;
131
+ return indexA - indexB;
132
+ });
133
+ return [
134
+ ...cardsWithExistingOrder,
135
+ ...newCards
136
+ ];
137
+ };
138
+
139
+ // src/hooks/useKanbanBoardModel.ts
140
+ function useKanbanBoardModel(kanban, projection, itemsAtom, registry) {
141
+ const arrangementAtom = useMemo3(() => AtomObj.makeProperty(kanban, "arrangement"), [
142
+ kanban
143
+ ]);
144
+ const viewSnapshotAtom = useMemo3(() => kanban?.spec?.kind === "view" && kanban.spec.view ? AtomObj.make(kanban.spec.view) : Atom2.make(() => void 0), [
145
+ kanban?.spec
146
+ ]);
147
+ const pivotFieldIdAtom = useMemo3(() => Atom2.make((get) => {
148
+ if (kanban?.spec.kind === "items") {
149
+ return kanban.spec.pivotField;
150
+ }
151
+ return get(viewSnapshotAtom)?.projection?.pivotFieldId;
152
+ }), [
153
+ kanban?.spec,
154
+ viewSnapshotAtom
155
+ ]);
156
+ const effectiveByColumnAtom = useMemo3(() => Atom2.make((get) => getOrderByColumnFromArrangement(get(arrangementAtom))), [
157
+ arrangementAtom
158
+ ]);
159
+ const columnsAtom = useMemo3(() => Atom2.make((get) => {
160
+ const pivotFieldId = get(pivotFieldIdAtom);
161
+ if (pivotFieldId === void 0) {
162
+ return [];
163
+ }
164
+ get(projection.fields);
165
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
166
+ if (!fieldProj) {
167
+ return [];
168
+ }
169
+ const selectOptions = fieldProj.props.options ?? [];
170
+ if (selectOptions.length === 0) {
171
+ return [];
172
+ }
173
+ const arrangement = get(arrangementAtom);
174
+ const order = getOrderFromArrangement(arrangement);
175
+ const byColumn = getOrderByColumnFromArrangement(arrangement);
176
+ return computeColumnStructure(order, byColumn, selectOptions);
177
+ }), [
178
+ pivotFieldIdAtom,
179
+ arrangementAtom,
180
+ projection
181
+ ]);
182
+ const columnArrangementAtomFamily = useMemo3(() => Atom2.family((columnValue) => Atom2.make((get) => {
183
+ const byColumn = get(effectiveByColumnAtom);
184
+ return {
185
+ columnValue,
186
+ ids: [
187
+ ...byColumn[columnValue]?.ids ?? []
188
+ ]
189
+ };
190
+ })), [
191
+ effectiveByColumnAtom
192
+ ]);
193
+ const itemsAtomFamily = useMemo3(() => Atom2.family((columnValue) => Atom2.make((get) => {
194
+ const columnArr = get(columnArrangementAtomFamily(columnValue));
195
+ const allItems = get(itemsAtom);
196
+ const pivotFieldId = get(pivotFieldIdAtom);
197
+ if (pivotFieldId === void 0) {
198
+ return [];
199
+ }
200
+ get(projection.fields);
201
+ const fieldProj = projection.tryGetFieldProjection(pivotFieldId);
202
+ if (!fieldProj) {
203
+ return [];
204
+ }
205
+ const selectOptions = fieldProj.props.options ?? [];
206
+ const pivotPath = fieldProj.props.property;
207
+ const validColumnValues = new Set(selectOptions.map((opt) => opt.id));
208
+ return orderItemsInColumn(allItems, columnArr.ids, columnValue, pivotPath, validColumnValues);
209
+ })), [
210
+ columnArrangementAtomFamily,
211
+ itemsAtom,
212
+ pivotFieldIdAtom,
213
+ projection
214
+ ]);
215
+ return useMemo3(() => ({
216
+ getColumnId: (data) => data.columnValue,
217
+ getItemId: (data) => data.id,
218
+ isColumn: (obj) => typeof obj === "object" && obj !== null && "columnValue" in obj && "ids" in obj,
219
+ // TODO(wittjosiah): This should be restricted to objects of the type of the kanban view.
220
+ isItem: (obj) => Obj2.isObject(obj),
221
+ columns: columnsAtom,
222
+ items: (column) => itemsAtomFamily(column.columnValue),
223
+ getColumns: () => registry.get(columnsAtom) ?? [],
224
+ getItems: (column) => registry.get(itemsAtomFamily(column.columnValue)) ?? []
225
+ }), [
226
+ columnsAtom,
227
+ itemsAtomFamily,
228
+ registry
229
+ ]);
230
+ }
231
+
232
+ // src/hooks/useKanbanColumnEventHandler.ts
233
+ import { useMemo as useMemo4 } from "react";
234
+ import { arrayMove } from "@dxos/util";
235
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE2 } from "#types";
236
+ function useKanbanColumnEventHandler({ id, model, projection, pivotFieldId, change }) {
237
+ return useMemo4(() => ({
238
+ id,
239
+ canDrop: ({ source }) => {
240
+ if (!projection) {
241
+ return false;
242
+ }
243
+ const data = source.data;
244
+ const columnValue = model.getColumnId(data);
245
+ return model.isColumn(source.data) && columnValue !== UNCATEGORIZED_VALUE2 && source.id !== UNCATEGORIZED_VALUE2;
246
+ },
247
+ onDrop: ({ source, target }) => {
248
+ if (!projection || pivotFieldId === void 0) {
249
+ return;
250
+ }
251
+ const sourceColumnData = source.data;
252
+ const sourceColumnId = model.getColumnId(sourceColumnData);
253
+ if (sourceColumnId === UNCATEGORIZED_VALUE2) {
254
+ return;
255
+ }
256
+ const currentColumns = model.getColumns();
257
+ const sourceIndex = currentColumns.findIndex((c) => model.getColumnId(c) === sourceColumnId);
258
+ if (sourceIndex === -1) {
259
+ return;
260
+ }
261
+ let targetIndex;
262
+ if (target?.type === "tile" || target?.type === "placeholder") {
263
+ targetIndex = typeof target.location === "number" ? Math.floor(target.location) : -1;
264
+ } else if (target?.type === "container") {
265
+ targetIndex = currentColumns.length;
266
+ } else {
267
+ return;
268
+ }
269
+ if (targetIndex < 0) {
270
+ return;
271
+ }
272
+ const currentColumnIds = currentColumns.map((c) => model.getColumnId(c));
273
+ const reorderedColumnIds = arrayMove([
274
+ ...currentColumnIds
275
+ ], sourceIndex, targetIndex);
276
+ const fieldProjection = projection.getFieldProjection(pivotFieldId);
277
+ const currentOptions = [
278
+ ...fieldProjection.props.options ?? []
279
+ ];
280
+ const optionsInNewOrder = reorderedColumnIds.map((columnId) => currentOptions.find((o) => o.id === columnId)).filter((o) => o != null);
281
+ projection.setFieldProjection({
282
+ ...fieldProjection,
283
+ props: {
284
+ ...fieldProjection.props,
285
+ options: optionsInNewOrder
286
+ }
287
+ });
288
+ change.kanban((kanban) => {
289
+ kanban.arrangement.order = reorderedColumnIds.filter((columnId) => columnId !== UNCATEGORIZED_VALUE2);
290
+ });
291
+ }
292
+ }), [
293
+ id,
294
+ model,
295
+ projection,
296
+ pivotFieldId,
297
+ change
298
+ ]);
299
+ }
300
+
301
+ // src/hooks/useKanbanItemEventHandler.ts
302
+ import { useMemo as useMemo5 } from "react";
303
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE3 } from "#types";
304
+ function findColumn(id, arrangement) {
305
+ return arrangement.find(({ columnValue, cards }) => columnValue === id || cards.some((card) => card.id === id));
306
+ }
307
+ function useKanbanItemEventHandler({ column, columnFieldPath, model, change }) {
308
+ return useMemo5(() => ({
309
+ id: column.columnValue,
310
+ canDrop: ({ source }) => model.isItem(source.data),
311
+ onTake: ({ source }, cb) => {
312
+ void cb(source.data);
313
+ },
314
+ onDrop: ({ source, target }) => {
315
+ const columns = model.getColumns();
316
+ const currentArrangement = columns.map((col) => ({
317
+ columnValue: col.columnValue,
318
+ cards: model.getItems(col) ?? []
319
+ }));
320
+ const sourceColumnInSnapshot = findColumn(source.id, currentArrangement);
321
+ if (!sourceColumnInSnapshot) {
322
+ return;
323
+ }
324
+ const workingArrangement = currentArrangement.map((col) => ({
325
+ columnValue: col.columnValue,
326
+ cards: [
327
+ ...col.cards
328
+ ]
329
+ }));
330
+ const sourceColumnInWorking = workingArrangement.find((c) => c.columnValue === sourceColumnInSnapshot.columnValue || c.cards.some((card) => card.id === source.id));
331
+ const targetColumnInWorking = workingArrangement.find((c) => c.columnValue === column.columnValue);
332
+ if (!sourceColumnInWorking || !targetColumnInWorking) {
333
+ return;
334
+ }
335
+ const sourceIndex = sourceColumnInWorking.cards.findIndex((card) => card.id === source.id);
336
+ if (sourceIndex === -1) {
337
+ return;
338
+ }
339
+ const [movedCard] = sourceColumnInWorking.cards.splice(sourceIndex, 1);
340
+ if (columnFieldPath !== void 0) {
341
+ const newValue = targetColumnInWorking.columnValue === UNCATEGORIZED_VALUE3 ? void 0 : targetColumnInWorking.columnValue;
342
+ change.setItemField(movedCard, columnFieldPath, newValue);
343
+ }
344
+ const existingTargetIndex = target?.type === "tile" ? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === target.id) : -1;
345
+ const closestEdge = target?.type === "placeholder" && typeof target.location === "number" ? target.location <= targetColumnInWorking.cards.length / 2 ? "top" : "bottom" : "bottom";
346
+ let insertIndex;
347
+ if (target?.type === "placeholder" && typeof target.location === "number") {
348
+ insertIndex = Math.max(0, Math.min(targetColumnInWorking.cards.length, Math.floor(target.location)));
349
+ } else if (target?.type === "container" || existingTargetIndex === -1) {
350
+ insertIndex = targetColumnInWorking.cards.length;
351
+ } else if (sourceColumnInWorking.columnValue === targetColumnInWorking.columnValue) {
352
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
353
+ if (sourceIndex < existingTargetIndex) {
354
+ insertIndex -= 1;
355
+ }
356
+ } else {
357
+ insertIndex = closestEdge === "bottom" ? existingTargetIndex + 1 : existingTargetIndex;
358
+ }
359
+ targetColumnInWorking.cards.splice(insertIndex, 0, movedCard);
360
+ change.kanban((kanban) => {
361
+ kanban.arrangement = {
362
+ order: workingArrangement.map(({ columnValue }) => columnValue),
363
+ columns: Object.fromEntries(workingArrangement.map(({ columnValue, cards }) => [
364
+ columnValue,
365
+ {
366
+ ids: cards.map((c) => c.id)
367
+ }
368
+ ]))
369
+ };
370
+ });
371
+ }
372
+ }), [
373
+ column,
374
+ columnFieldPath,
375
+ model,
376
+ change
377
+ ]);
378
+ }
379
+
380
+ // src/hooks/useProjectionModel.ts
381
+ import { useState } from "react";
382
+ import { JsonSchema, Type } from "@dxos/echo";
383
+ import { log } from "@dxos/log";
384
+ import { useAsyncEffect } from "@dxos/react-ui";
385
+ import { ProjectionModel, createEchoChangeCallback as createEchoChangeCallback2 } from "@dxos/schema";
386
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-kanban/src/hooks/useProjectionModel.ts";
387
+ var useProjectionModel = (schema, kanban, registry) => {
388
+ const [projection, setProjection] = useState();
389
+ useAsyncEffect(async (controller) => {
390
+ if (!schema || !kanban || kanban.spec.kind !== "view") {
391
+ return;
392
+ }
393
+ try {
394
+ const view = await kanban.spec.view.load();
395
+ if (controller.signal.aborted) {
396
+ return;
397
+ }
398
+ const jsonSchema = Type.isMutable(schema) ? schema.jsonSchema : JsonSchema.toJsonSchema(schema);
399
+ const change = createEchoChangeCallback2(view, Type.isMutable(schema) ? schema : void 0);
400
+ const projection2 = new ProjectionModel({
401
+ registry,
402
+ view,
403
+ baseSchema: jsonSchema,
404
+ change
405
+ });
406
+ projection2.normalizeView();
407
+ if (!controller.signal.aborted) {
408
+ setProjection(projection2);
409
+ }
410
+ } catch (err) {
411
+ log.catch(err, {
412
+ schema,
413
+ kanban
414
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 41, S: void 0 });
415
+ }
416
+ }, [
417
+ schema,
418
+ kanban,
419
+ registry
420
+ ]);
421
+ return projection;
422
+ };
423
+ export {
424
+ createEchoChangeCallback,
425
+ useEchoChangeCallback,
426
+ useItemsProjection,
427
+ useKanbanBoardModel,
428
+ useKanbanColumnEventHandler,
429
+ useKanbanItemEventHandler,
430
+ useProjectionModel
431
+ };
432
+ //# sourceMappingURL=index.mjs.map