@dxos/plugin-kanban 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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/LICENSE +102 -5
  2. package/PLUGIN.mdl +398 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/KanbanArticle-T4CPKAZH.mjs +132 -0
  5. package/dist/lib/neutral/KanbanArticle-T4CPKAZH.mjs.map +7 -0
  6. package/dist/lib/neutral/KanbanPlugin.mjs +44 -0
  7. package/dist/lib/neutral/KanbanPlugin.mjs.map +7 -0
  8. package/dist/lib/neutral/KanbanPlugin.node.mjs +27 -0
  9. package/dist/lib/neutral/KanbanPlugin.node.mjs.map +7 -0
  10. package/dist/lib/neutral/KanbanPlugin.workerd.mjs +21 -0
  11. package/dist/lib/neutral/KanbanPlugin.workerd.mjs.map +7 -0
  12. package/dist/lib/neutral/KanbanSettings-5WOS4CUE.mjs +83 -0
  13. package/dist/lib/neutral/KanbanSettings-5WOS4CUE.mjs.map +7 -0
  14. package/dist/lib/neutral/blueprint-definition-6DV3Q5MC.mjs +15 -0
  15. package/dist/lib/neutral/blueprint-definition-6DV3Q5MC.mjs.map +7 -0
  16. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  17. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  18. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-6ZHHQWO5.mjs +39 -0
  20. package/dist/lib/neutral/chunk-6ZHHQWO5.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-DAKIZO46.mjs +246 -0
  22. package/dist/lib/neutral/chunk-DAKIZO46.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  24. package/dist/lib/neutral/chunk-M5ISZWZU.mjs +8 -0
  25. package/dist/lib/neutral/chunk-M5ISZWZU.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs +26 -0
  27. package/dist/lib/neutral/chunk-ZTQW5KQS.mjs.map +7 -0
  28. package/dist/lib/neutral/components/index.mjs +243 -0
  29. package/dist/lib/neutral/components/index.mjs.map +7 -0
  30. package/dist/lib/neutral/containers/index.mjs +11 -0
  31. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  32. package/dist/lib/neutral/create-object-DKBSI46K.mjs +40 -0
  33. package/dist/lib/neutral/create-object-DKBSI46K.mjs.map +7 -0
  34. package/dist/lib/neutral/delete-card-VNAV3CZV.mjs +24 -0
  35. package/dist/lib/neutral/delete-card-VNAV3CZV.mjs.map +7 -0
  36. package/dist/lib/neutral/delete-card-field-XHOLGS6L.mjs +39 -0
  37. package/dist/lib/neutral/delete-card-field-XHOLGS6L.mjs.map +7 -0
  38. package/dist/lib/neutral/hooks/index.mjs +431 -0
  39. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  40. package/dist/lib/neutral/index.mjs +34 -0
  41. package/dist/lib/neutral/index.mjs.map +7 -0
  42. package/dist/lib/neutral/meta.json +1 -0
  43. package/dist/lib/neutral/meta.mjs +8 -0
  44. package/dist/lib/neutral/meta.mjs.map +7 -0
  45. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +13 -0
  46. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +7 -0
  47. package/dist/lib/neutral/operations/index.mjs +8 -0
  48. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  49. package/dist/lib/neutral/plugin.mjs +16 -0
  50. package/dist/lib/neutral/plugin.mjs.map +7 -0
  51. package/dist/lib/neutral/react-surface-VZEVEJL5.mjs +91 -0
  52. package/dist/lib/neutral/react-surface-VZEVEJL5.mjs.map +7 -0
  53. package/dist/lib/neutral/restore-card-EKVEPATL.mjs +21 -0
  54. package/dist/lib/neutral/restore-card-EKVEPATL.mjs.map +7 -0
  55. package/dist/lib/neutral/restore-card-field-TQCTGGNO.mjs +37 -0
  56. package/dist/lib/neutral/restore-card-field-TQCTGGNO.mjs.map +7 -0
  57. package/dist/lib/neutral/testing/index.mjs +62 -0
  58. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  59. package/dist/lib/neutral/translations.mjs +44 -0
  60. package/dist/lib/neutral/translations.mjs.map +7 -0
  61. package/dist/lib/neutral/types/index.mjs +22 -0
  62. package/dist/lib/neutral/types/index.mjs.map +7 -0
  63. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs +42 -0
  64. package/dist/lib/neutral/undo-mappings-6CHW6BOF.mjs.map +7 -0
  65. package/dist/types/src/KanbanPlugin.d.ts +3 -1
  66. package/dist/types/src/KanbanPlugin.d.ts.map +1 -1
  67. package/dist/types/src/KanbanPlugin.node.d.ts +4 -0
  68. package/dist/types/src/KanbanPlugin.node.d.ts.map +1 -0
  69. package/dist/types/src/KanbanPlugin.test.d.ts +2 -0
  70. package/dist/types/src/KanbanPlugin.test.d.ts.map +1 -0
  71. package/dist/types/src/KanbanPlugin.workerd.d.ts +4 -0
  72. package/dist/types/src/KanbanPlugin.workerd.d.ts.map +1 -0
  73. package/dist/types/src/blueprints/index.d.ts +2 -0
  74. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  75. package/dist/types/src/blueprints/kanban-blueprint.d.ts +4 -0
  76. package/dist/types/src/blueprints/kanban-blueprint.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -2
  78. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  80. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  82. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/index.d.ts +13 -2
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  86. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  87. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  88. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  90. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  91. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +37 -0
  92. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -0
  93. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts +72 -0
  94. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -0
  95. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts +9 -0
  96. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -0
  97. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts +8 -0
  98. package/dist/types/src/components/KanbanBoard/KanbanColumn.d.ts.map +1 -0
  99. package/dist/types/src/components/KanbanBoard/context.d.ts +38 -0
  100. package/dist/types/src/components/KanbanBoard/context.d.ts.map +1 -0
  101. package/dist/types/src/components/KanbanBoard/index.d.ts +2 -0
  102. package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -0
  103. package/dist/types/src/components/index.d.ts +1 -2
  104. package/dist/types/src/components/index.d.ts.map +1 -1
  105. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +6 -0
  106. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -0
  107. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts +79 -0
  108. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -0
  109. package/dist/types/src/containers/KanbanArticle/index.d.ts +2 -0
  110. package/dist/types/src/containers/KanbanArticle/index.d.ts.map +1 -0
  111. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts +13 -0
  112. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -0
  113. package/dist/types/src/containers/KanbanSettings/index.d.ts +2 -0
  114. package/dist/types/src/containers/KanbanSettings/index.d.ts.map +1 -0
  115. package/dist/types/src/containers/index.d.ts +4 -0
  116. package/dist/types/src/containers/index.d.ts.map +1 -0
  117. package/dist/types/src/hooks/index.d.ts +7 -0
  118. package/dist/types/src/hooks/index.d.ts.map +1 -0
  119. package/dist/types/src/hooks/useEchoChangeCallback.d.ts +13 -0
  120. package/dist/types/src/hooks/useEchoChangeCallback.d.ts.map +1 -0
  121. package/dist/types/src/hooks/useItemsProjection.d.ts +10 -0
  122. package/dist/types/src/hooks/useItemsProjection.d.ts.map +1 -0
  123. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts +2 -0
  124. package/dist/types/src/hooks/useKanbanBoardModel.browser.test.d.ts.map +1 -0
  125. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +16 -0
  126. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -0
  127. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +22 -0
  128. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -0
  129. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +19 -0
  130. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -0
  131. package/dist/types/src/hooks/useProjectionModel.d.ts +15 -0
  132. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -0
  133. package/dist/types/src/index.d.ts +3 -1
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/types/src/meta.d.ts +2 -3
  136. package/dist/types/src/meta.d.ts.map +1 -1
  137. package/dist/types/src/operations/delete-card-field.d.ts +5 -0
  138. package/dist/types/src/operations/delete-card-field.d.ts.map +1 -0
  139. package/dist/types/src/operations/delete-card.d.ts +5 -0
  140. package/dist/types/src/operations/delete-card.d.ts.map +1 -0
  141. package/dist/types/src/operations/index.d.ts +3 -0
  142. package/dist/types/src/operations/index.d.ts.map +1 -0
  143. package/dist/types/src/operations/restore-card-field.d.ts +5 -0
  144. package/dist/types/src/operations/restore-card-field.d.ts.map +1 -0
  145. package/dist/types/src/operations/restore-card.d.ts +5 -0
  146. package/dist/types/src/operations/restore-card.d.ts.map +1 -0
  147. package/dist/types/src/playwright/board-manager.d.ts +5 -0
  148. package/dist/types/src/playwright/board-manager.d.ts.map +1 -0
  149. package/dist/types/src/playwright/playwright.config.d.ts +3 -0
  150. package/dist/types/src/playwright/playwright.config.d.ts.map +1 -0
  151. package/dist/types/src/playwright/smoke.spec.d.ts +2 -0
  152. package/dist/types/src/playwright/smoke.spec.d.ts.map +1 -0
  153. package/dist/types/src/plugin.d.ts +4 -0
  154. package/dist/types/src/plugin.d.ts.map +1 -0
  155. package/dist/types/src/testing/KanbanCardTileSimple.d.ts +7 -0
  156. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -0
  157. package/dist/types/src/testing/index.d.ts +2 -0
  158. package/dist/types/src/testing/index.d.ts.map +1 -0
  159. package/dist/types/src/translations.d.ts +50 -22
  160. package/dist/types/src/translations.d.ts.map +1 -1
  161. package/dist/types/src/types/Kanban.d.ts +94 -0
  162. package/dist/types/src/types/Kanban.d.ts.map +1 -0
  163. package/dist/types/src/types/KanbanOperation.d.ts +52 -0
  164. package/dist/types/src/types/KanbanOperation.d.ts.map +1 -0
  165. package/dist/types/src/types/constants.d.ts +6 -0
  166. package/dist/types/src/types/constants.d.ts.map +1 -0
  167. package/dist/types/src/types/index.d.ts +3 -1
  168. package/dist/types/src/types/index.d.ts.map +1 -1
  169. package/dist/types/src/types/schema.d.ts +18 -95
  170. package/dist/types/src/types/schema.d.ts.map +1 -1
  171. package/dist/types/src/types/types.d.ts +28 -0
  172. package/dist/types/src/types/types.d.ts.map +1 -1
  173. package/dist/types/src/util/arrangement.d.ts +72 -0
  174. package/dist/types/src/util/arrangement.d.ts.map +1 -0
  175. package/dist/types/src/util/arrangement.test.d.ts +2 -0
  176. package/dist/types/src/util/arrangement.test.d.ts.map +1 -0
  177. package/dist/types/src/util/index.d.ts +2 -0
  178. package/dist/types/src/util/index.d.ts.map +1 -0
  179. package/dist/types/tsconfig.tsbuildinfo +1 -1
  180. package/package.json +127 -55
  181. package/src/KanbanPlugin.node.ts +21 -0
  182. package/src/KanbanPlugin.test.ts +31 -0
  183. package/src/KanbanPlugin.tsx +24 -52
  184. package/src/KanbanPlugin.workerd.ts +18 -0
  185. package/src/blueprints/index.ts +5 -0
  186. package/src/blueprints/kanban-blueprint.ts +27 -0
  187. package/src/capabilities/artifact-definition.ts +119 -114
  188. package/src/capabilities/blueprint-definition.ts +19 -0
  189. package/src/capabilities/create-object.ts +40 -0
  190. package/src/capabilities/index.ts +16 -3
  191. package/src/capabilities/operation-handler.ts +14 -0
  192. package/src/capabilities/react-surface.tsx +90 -69
  193. package/src/capabilities/undo-mappings.ts +34 -0
  194. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +145 -0
  195. package/src/components/KanbanBoard/KanbanBoard.tsx +164 -0
  196. package/src/components/KanbanBoard/KanbanCard.tsx +101 -0
  197. package/src/components/KanbanBoard/KanbanColumn.tsx +72 -0
  198. package/src/components/KanbanBoard/context.ts +54 -0
  199. package/src/components/KanbanBoard/index.ts +5 -0
  200. package/src/components/index.ts +1 -2
  201. package/src/containers/KanbanArticle/KanbanArticle.stories.tsx +277 -0
  202. package/src/containers/KanbanArticle/KanbanArticle.tsx +179 -0
  203. package/src/containers/KanbanArticle/index.ts +5 -0
  204. package/src/containers/KanbanSettings/KanbanSettings.tsx +94 -0
  205. package/src/containers/KanbanSettings/index.ts +5 -0
  206. package/src/containers/index.ts +8 -0
  207. package/src/hooks/index.ts +10 -0
  208. package/src/hooks/useEchoChangeCallback.ts +30 -0
  209. package/src/hooks/useItemsProjection.ts +44 -0
  210. package/src/hooks/useKanbanBoardModel.browser.test.ts +230 -0
  211. package/src/hooks/useKanbanBoardModel.ts +156 -0
  212. package/src/hooks/useKanbanColumnEventHandler.ts +106 -0
  213. package/src/hooks/useKanbanItemEventHandler.ts +133 -0
  214. package/src/hooks/useProjectionModel.ts +58 -0
  215. package/src/index.ts +3 -2
  216. package/src/meta.ts +27 -8
  217. package/src/operations/delete-card-field.ts +42 -0
  218. package/src/operations/delete-card.ts +23 -0
  219. package/src/operations/index.ts +10 -0
  220. package/src/operations/restore-card-field.ts +36 -0
  221. package/src/operations/restore-card.ts +21 -0
  222. package/src/playwright/board-manager.ts +13 -0
  223. package/src/playwright/playwright.config.ts +19 -0
  224. package/src/playwright/smoke.spec.ts +107 -0
  225. package/src/plugin.ts +11 -0
  226. package/src/testing/KanbanCardTileSimple.tsx +82 -0
  227. package/src/testing/index.ts +5 -0
  228. package/src/translations.ts +28 -20
  229. package/src/types/Kanban.ts +134 -0
  230. package/src/types/KanbanOperation.ts +79 -0
  231. package/src/types/constants.ts +9 -0
  232. package/src/types/index.ts +4 -1
  233. package/src/types/schema.ts +33 -45
  234. package/src/types/types.ts +35 -0
  235. package/src/util/arrangement.test.ts +217 -0
  236. package/src/util/arrangement.ts +177 -0
  237. package/src/util/index.ts +5 -0
  238. package/src/vite-env.d.ts +10 -0
  239. package/dist/lib/browser/chunk-5BR6HNHI.mjs +0 -108
  240. package/dist/lib/browser/chunk-5BR6HNHI.mjs.map +0 -7
  241. package/dist/lib/browser/index.mjs +0 -99
  242. package/dist/lib/browser/index.mjs.map +0 -7
  243. package/dist/lib/browser/intent-resolver-65UVYRI2.mjs +0 -111
  244. package/dist/lib/browser/intent-resolver-65UVYRI2.mjs.map +0 -7
  245. package/dist/lib/browser/meta.json +0 -1
  246. package/dist/lib/browser/react-surface-KX5U6PJ2.mjs +0 -256
  247. package/dist/lib/browser/react-surface-KX5U6PJ2.mjs.map +0 -7
  248. package/dist/lib/browser/types/index.mjs +0 -13
  249. package/dist/lib/node-esm/chunk-WLFZKRIJ.mjs +0 -110
  250. package/dist/lib/node-esm/chunk-WLFZKRIJ.mjs.map +0 -7
  251. package/dist/lib/node-esm/index.mjs +0 -100
  252. package/dist/lib/node-esm/index.mjs.map +0 -7
  253. package/dist/lib/node-esm/intent-resolver-R3MYQATZ.mjs +0 -112
  254. package/dist/lib/node-esm/intent-resolver-R3MYQATZ.mjs.map +0 -7
  255. package/dist/lib/node-esm/meta.json +0 -1
  256. package/dist/lib/node-esm/react-surface-BAMERRU5.mjs +0 -257
  257. package/dist/lib/node-esm/react-surface-BAMERRU5.mjs.map +0 -7
  258. package/dist/lib/node-esm/types/index.mjs +0 -14
  259. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  260. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  261. package/dist/types/src/components/KanbanContainer.d.ts +0 -7
  262. package/dist/types/src/components/KanbanContainer.d.ts.map +0 -1
  263. package/dist/types/src/components/KanbanContainer.stories.d.ts +0 -10
  264. package/dist/types/src/components/KanbanContainer.stories.d.ts.map +0 -1
  265. package/dist/types/src/components/KanbanViewEditor.d.ts +0 -8
  266. package/dist/types/src/components/KanbanViewEditor.d.ts.map +0 -1
  267. package/dist/types/src/types/kanban.d.ts +0 -11
  268. package/dist/types/src/types/kanban.d.ts.map +0 -1
  269. package/src/capabilities/intent-resolver.ts +0 -70
  270. package/src/components/KanbanContainer.stories.tsx +0 -189
  271. package/src/components/KanbanContainer.tsx +0 -95
  272. package/src/components/KanbanViewEditor.tsx +0 -60
  273. package/src/types/kanban.ts +0 -29
  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,246 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-J5LGTIGS.mjs";
4
+
5
+ // src/types/constants.ts
6
+ var UNCATEGORIZED_VALUE = "__uncategorized__";
7
+ var UNCATEGORIZED_ATTRIBUTES = {
8
+ title: "Uncategorized",
9
+ color: "neutral"
10
+ };
11
+
12
+ // src/types/schema.ts
13
+ import * as Schema from "effect/Schema";
14
+ import { TypeInputOptionsAnnotation } from "@dxos/plugin-space";
15
+ var PivotColumnAnnotationId = /* @__PURE__ */ Symbol.for("@dxos/plugin-kanban/annotation/PivotColumn");
16
+ var KanbanSettingsSchema = Schema.Struct({
17
+ hideUncategorized: Schema.Boolean.annotations({
18
+ title: "Hide uncategorized column",
19
+ description: "When enabled, items without a pivot value won\u2019t be shown as a column."
20
+ }).pipe(Schema.optional)
21
+ });
22
+ var KanbanViewSettingsSchema = Schema.Struct({
23
+ columnFieldId: Schema.String.annotations({
24
+ title: "Column field"
25
+ }),
26
+ ...KanbanSettingsSchema.fields
27
+ });
28
+ var CreateKanbanSchema = Schema.Struct({
29
+ name: Schema.optional(Schema.String),
30
+ // TODO(wittjosiah): This should be a query input instead.
31
+ typename: Schema.String.pipe(Schema.annotations({
32
+ title: "Select card type"
33
+ }), TypeInputOptionsAnnotation.set({
34
+ location: [
35
+ "database",
36
+ "runtime"
37
+ ],
38
+ kind: [
39
+ "user"
40
+ ]
41
+ }), Schema.optional),
42
+ initialPivotColumn: Schema.optional(Schema.String.annotations({
43
+ [PivotColumnAnnotationId]: true,
44
+ title: "Pivot column"
45
+ }))
46
+ });
47
+
48
+ // src/types/Kanban.ts
49
+ var Kanban_exports = {};
50
+ __export(Kanban_exports, {
51
+ Arrangement: () => Arrangement,
52
+ Kanban: () => Kanban,
53
+ KanbanItemsSpec: () => KanbanItemsSpec,
54
+ KanbanSpec: () => KanbanSpec,
55
+ KanbanViewSpec: () => KanbanViewSpec,
56
+ isKanbanItems: () => isKanbanItems,
57
+ isKanbanView: () => isKanbanView,
58
+ make: () => make,
59
+ makeItems: () => makeItems
60
+ });
61
+ import * as Schema2 from "effect/Schema";
62
+ import { DXN, Annotation, Obj, Ref, Type, View } from "@dxos/echo";
63
+ import { FormInputAnnotation, LabelAnnotation } from "@dxos/echo/Annotation";
64
+ import { ViewAnnotation } from "@dxos/schema";
65
+ var ArrangementColumnEntry = Schema2.Struct({
66
+ ids: Schema2.Array(Obj.ID),
67
+ hidden: Schema2.Boolean.pipe(Schema2.optional)
68
+ });
69
+ var ArrangementColumns = Schema2.Record({
70
+ key: Schema2.String,
71
+ value: ArrangementColumnEntry
72
+ }).pipe(FormInputAnnotation.set(false));
73
+ var Arrangement = Schema2.Struct({
74
+ order: Schema2.Array(Schema2.String).pipe(FormInputAnnotation.set(false)),
75
+ columns: ArrangementColumns
76
+ }).pipe(FormInputAnnotation.set(false));
77
+ var KanbanViewSpec = Schema2.Struct({
78
+ kind: Schema2.Literal("view").pipe(FormInputAnnotation.set(false)),
79
+ view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false))
80
+ });
81
+ var KanbanItemsSpec = Schema2.Struct({
82
+ kind: Schema2.Literal("items").pipe(FormInputAnnotation.set(false)),
83
+ /** Property path on each item that drives column membership (e.g. `'listName'`). */
84
+ pivotField: Schema2.String,
85
+ /** Items owned directly by the kanban. */
86
+ items: Schema2.Array(Ref.Ref(Obj.Unknown)).pipe(FormInputAnnotation.set(false))
87
+ });
88
+ var KanbanSpec = Schema2.Union(KanbanViewSpec, KanbanItemsSpec);
89
+ var Kanban = Schema2.Struct({
90
+ name: Schema2.String.pipe(Schema2.optional),
91
+ arrangement: Arrangement,
92
+ /** How this kanban sources its items. Discriminated by `spec.kind`. */
93
+ spec: KanbanSpec
94
+ }).pipe(LabelAnnotation.set([
95
+ "name"
96
+ ]), ViewAnnotation.set([
97
+ "spec",
98
+ "view"
99
+ ]), Annotation.IconAnnotation.set({
100
+ icon: "ph--kanban--regular",
101
+ hue: "green"
102
+ }), Type.makeObject(DXN.make("org.dxos.type.kanban", "0.2.0")));
103
+ var isKanbanView = (kanban) => kanban.spec.kind === "view";
104
+ var isKanbanItems = (kanban) => kanban.spec.kind === "items";
105
+ var make = (props) => {
106
+ const { name, view, arrangement } = props;
107
+ const order = arrangement?.order ?? [];
108
+ const columns = arrangement?.columns ?? {};
109
+ return Obj.make(Kanban, {
110
+ name,
111
+ arrangement: {
112
+ order,
113
+ columns
114
+ },
115
+ spec: {
116
+ kind: "view",
117
+ view: Ref.make(view)
118
+ }
119
+ });
120
+ };
121
+ var makeItems = (props) => {
122
+ const { name, arrangement, pivotField, items = [] } = props;
123
+ const order = arrangement?.order ?? [];
124
+ const columns = arrangement?.columns ?? {};
125
+ return Obj.make(Kanban, {
126
+ name,
127
+ arrangement: {
128
+ order,
129
+ columns
130
+ },
131
+ spec: {
132
+ kind: "items",
133
+ pivotField,
134
+ items
135
+ }
136
+ });
137
+ };
138
+
139
+ // src/types/KanbanOperation.ts
140
+ var KanbanOperation_exports = {};
141
+ __export(KanbanOperation_exports, {
142
+ DeleteCard: () => DeleteCard,
143
+ DeleteCardField: () => DeleteCardField,
144
+ DeleteCardFieldOutput: () => DeleteCardFieldOutput,
145
+ DeleteCardOutput: () => DeleteCardOutput,
146
+ RestoreCard: () => RestoreCard,
147
+ RestoreCardField: () => RestoreCardField
148
+ });
149
+ import * as Schema3 from "effect/Schema";
150
+ import { Capability } from "@dxos/app-framework";
151
+ import { Operation } from "@dxos/compute";
152
+ import { Type as Type2, View as View2, DXN as DXN2 } from "@dxos/echo";
153
+ import { meta } from "#meta";
154
+ var makeKey = (name) => DXN2.make(`${meta.id}.operation.${name}`);
155
+ var DeleteCardFieldOutput = Schema3.Struct({
156
+ field: View2.FieldSchema.annotations({
157
+ description: "The deleted field schema."
158
+ }),
159
+ props: Schema3.Any.annotations({
160
+ description: "The deleted field properties."
161
+ }),
162
+ index: Schema3.Number.annotations({
163
+ description: "The index the field was at."
164
+ })
165
+ });
166
+ var DeleteCardField = Operation.make({
167
+ meta: {
168
+ key: makeKey("deleteCardField"),
169
+ name: "Delete Card Field",
170
+ icon: "ph--minus-circle--regular"
171
+ },
172
+ services: [
173
+ Capability.Service
174
+ ],
175
+ input: Schema3.Struct({
176
+ view: Type2.getSchema(View2.View),
177
+ fieldId: Schema3.String
178
+ }),
179
+ output: DeleteCardFieldOutput
180
+ });
181
+ var DeleteCardOutput = Schema3.Struct({
182
+ card: Schema3.Any.annotations({
183
+ description: "The deleted card."
184
+ })
185
+ });
186
+ var DeleteCard = Operation.make({
187
+ meta: {
188
+ key: makeKey("deleteCard"),
189
+ name: "Delete Card",
190
+ icon: "ph--trash--regular"
191
+ },
192
+ input: Schema3.Struct({
193
+ card: Schema3.Any
194
+ }),
195
+ output: DeleteCardOutput
196
+ });
197
+ var RestoreCardField = Operation.make({
198
+ meta: {
199
+ key: makeKey("restoreCardField"),
200
+ name: "Restore Card Field",
201
+ icon: "ph--clock-counter-clockwise--regular"
202
+ },
203
+ services: [
204
+ Capability.Service
205
+ ],
206
+ input: Schema3.Struct({
207
+ view: Type2.getSchema(View2.View).annotations({
208
+ description: "The view to restore the field to."
209
+ }),
210
+ field: View2.FieldSchema.annotations({
211
+ description: "The field schema to restore."
212
+ }),
213
+ props: Schema3.Any.annotations({
214
+ description: "The field properties to restore."
215
+ }),
216
+ index: Schema3.Number.annotations({
217
+ description: "The index to restore the field at."
218
+ })
219
+ }),
220
+ output: Schema3.Void
221
+ });
222
+ var RestoreCard = Operation.make({
223
+ meta: {
224
+ key: makeKey("restoreCard"),
225
+ name: "Restore Card",
226
+ icon: "ph--clock-counter-clockwise--regular"
227
+ },
228
+ input: Schema3.Struct({
229
+ card: Schema3.Any.annotations({
230
+ description: "The card to restore."
231
+ })
232
+ }),
233
+ output: Schema3.Void
234
+ });
235
+
236
+ export {
237
+ UNCATEGORIZED_VALUE,
238
+ UNCATEGORIZED_ATTRIBUTES,
239
+ PivotColumnAnnotationId,
240
+ KanbanSettingsSchema,
241
+ KanbanViewSettingsSchema,
242
+ CreateKanbanSchema,
243
+ Kanban_exports,
244
+ KanbanOperation_exports
245
+ };
246
+ //# sourceMappingURL=chunk-DAKIZO46.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/types/constants.ts", "../../../src/types/schema.ts", "../../../src/types/Kanban.ts", "../../../src/types/KanbanOperation.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nexport const UNCATEGORIZED_VALUE = '__uncategorized__' as const;\nexport const UNCATEGORIZED_ATTRIBUTES = {\n title: 'Uncategorized',\n color: 'neutral',\n} as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { TypeInputOptionsAnnotation } from '@dxos/plugin-space';\n\n/**\n * Kanban data model.\n * A Kanban board is a collection of columns, each of which contains a collection of items.\n * The layout of columns and items is controlled by models.\n * The underlying data model may be represented by direct object relationships\n * (e.g., a column object containing an array of ordered items) or projections constructed\n * by the model (e.g., a query of items based on metadata within a column object).\n */\n\n// TODO(wittjosiah): Factor out?\nexport const PivotColumnAnnotationId = Symbol.for('@dxos/plugin-kanban/annotation/PivotColumn');\n\n/**\n * Settings common to every Kanban (view or items). Rendered as form fields\n * by `KanbanSettings`.\n */\nexport const KanbanSettingsSchema = Schema.Struct({\n hideUncategorized: Schema.Boolean.annotations({\n title: 'Hide uncategorized column',\n description: 'When enabled, items without a pivot value won’t be shown as a column.',\n }).pipe(Schema.optional),\n});\n\n/**\n * Settings for view-variant Kanbans only. Spreads {@link KanbanSettingsSchema}'s\n * fields and adds a column-field picker that binds the View’s pivot field.\n * Items-variant kanbans use a hardcoded `spec.pivotField` and don’t expose\n * this control.\n */\nexport const KanbanViewSettingsSchema = Schema.Struct({\n columnFieldId: Schema.String.annotations({\n title: 'Column field',\n }),\n ...KanbanSettingsSchema.fields,\n});\n\nexport const CreateKanbanSchema = Schema.Struct({\n name: Schema.optional(Schema.String),\n // TODO(wittjosiah): This should be a query input instead.\n typename: Schema.String.pipe(\n Schema.annotations({ title: 'Select card type' }),\n TypeInputOptionsAnnotation.set({\n location: ['database', 'runtime'],\n kind: ['user'],\n }),\n Schema.optional,\n ),\n initialPivotColumn: Schema.optional(\n Schema.String.annotations({\n [PivotColumnAnnotationId]: true,\n title: 'Pivot column',\n }),\n ),\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\n// QueryAST is referenced indirectly through `Type.InstanceType<typeof ...Schema>`\n// (Ref.Ref(View.View) → View.View → QueryAST.Query) in the emitted .d.ts; the\n// namespace import keeps the inferred types portable.\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport { DXN, Annotation, Obj, QueryAST, Ref, Type, View } from '@dxos/echo';\nimport { FormInputAnnotation, LabelAnnotation } from '@dxos/echo/Annotation';\nimport { ViewAnnotation } from '@dxos/schema';\n\n/**\n * Per-column entry: ordered card ids plus an optional `hidden` flag that\n * removes the column from the rendered board (and from the model's column\n * list). Today only the uncategorized column is exposed in settings, but\n * the data structure supports per-column hiding generally.\n */\nconst ArrangementColumnEntry = Schema.Struct({\n ids: Schema.Array(Obj.ID),\n hidden: Schema.Boolean.pipe(Schema.optional),\n});\n\n/** Keyed by columnValue. */\nconst ArrangementColumns = Schema.Record({\n key: Schema.String,\n value: ArrangementColumnEntry,\n}).pipe(FormInputAnnotation.set(false));\n\n/** Column order and per-column card ids. */\nexport const Arrangement = Schema.Struct({\n order: Schema.Array(Schema.String).pipe(FormInputAnnotation.set(false)),\n columns: ArrangementColumns,\n}).pipe(FormInputAnnotation.set(false));\n\nexport type Arrangement = Schema.Schema.Type<typeof Arrangement>;\n\n//\n// Mirrors the canonical DXOS pattern (see `Trigger.Spec` in\n// `@dxos/functions/src/types/Trigger.ts` and `Sequence.Source` in\n// `@dxos/plugin-zen`): the `Type.makeObject` schema is a flat `Schema.Struct`,\n// and the discriminated union lives one level down as a single field whose\n// variants are tagged with a `kind` literal.\n//\n\n/** View-variant: items come from running the View's query (the original behaviour). */\nexport const KanbanViewSpec = Schema.Struct({\n kind: Schema.Literal('view').pipe(FormInputAnnotation.set(false)),\n view: Ref.Ref(View.View).pipe(FormInputAnnotation.set(false)),\n});\nexport type KanbanViewSpec = Schema.Schema.Type<typeof KanbanViewSpec>;\n\n/** Items-variant: kanban owns its items as an explicit ref array (used by externally-synced kanbans). */\nexport const KanbanItemsSpec = Schema.Struct({\n kind: Schema.Literal('items').pipe(FormInputAnnotation.set(false)),\n /** Property path on each item that drives column membership (e.g. `'listName'`). */\n pivotField: Schema.String,\n /** Items owned directly by the kanban. */\n items: Schema.Array(Ref.Ref(Obj.Unknown)).pipe(FormInputAnnotation.set(false)),\n});\nexport type KanbanItemsSpec = Schema.Schema.Type<typeof KanbanItemsSpec>;\n\n/** Discriminated union of source specs. Distinguished by `kind`. */\nexport const KanbanSpec = Schema.Union(KanbanViewSpec, KanbanItemsSpec);\nexport type KanbanSpec = Schema.Schema.Type<typeof KanbanSpec>;\n\nexport const Kanban = Schema.Struct({\n name: Schema.String.pipe(Schema.optional),\n arrangement: Arrangement,\n /** How this kanban sources its items. Discriminated by `spec.kind`. */\n spec: KanbanSpec,\n}).pipe(\n LabelAnnotation.set(['name']),\n ViewAnnotation.set(['spec', 'view']),\n Annotation.IconAnnotation.set({ icon: 'ph--kanban--regular', hue: 'green' }),\n Type.makeObject(DXN.make('org.dxos.type.kanban', '0.2.0')),\n);\n\n/**\n * Instance type; narrow on `kanban.spec.kind` (or use the guards below).\n */\nexport interface Kanban extends Type.InstanceType<typeof Kanban> {}\n\n/** Narrowed view-variant kanban. */\nexport type KanbanView = Kanban & { spec: KanbanViewSpec };\n\n/** Narrowed items-variant kanban. */\nexport type KanbanItems = Kanban & { spec: KanbanItemsSpec };\n\nexport const isKanbanView = (kanban: Kanban): kanban is KanbanView => kanban.spec.kind === 'view';\nexport const isKanbanItems = (kanban: Kanban): kanban is KanbanItems => kanban.spec.kind === 'items';\n\ntype MakeViewProps = {\n name?: string;\n view: View.View;\n arrangement?: Arrangement;\n};\n\n/**\n * Make a view-variant kanban (items sourced via the View's query).\n */\nexport const make = (props: MakeViewProps): Kanban => {\n const { name, view, arrangement } = props;\n const order = arrangement?.order ?? [];\n const columns = arrangement?.columns ?? {};\n return Obj.make(Kanban, {\n name,\n arrangement: { order, columns },\n spec: { kind: 'view' as const, view: Ref.make(view) },\n });\n};\n\ntype MakeItemsProps = {\n name?: string;\n arrangement?: Arrangement;\n pivotField: string;\n items?: ReadonlyArray<Ref.Ref<Obj.Unknown>>;\n};\n\n/**\n * Make an items-variant kanban (items list owned by the kanban itself, e.g. populated by a sync integration).\n */\nexport const makeItems = (props: MakeItemsProps): Kanban => {\n const { name, arrangement, pivotField, items = [] } = props;\n const order = arrangement?.order ?? [];\n const columns = arrangement?.columns ?? {};\n return Obj.make(Kanban, {\n name,\n arrangement: { order, columns },\n spec: { kind: 'items' as const, pivotField, items },\n });\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type, View, DXN } from '@dxos/echo';\n\nimport { meta } from '#meta';\n\nconst makeKey = (name: string) => DXN.make(`${meta.id}.operation.${name}`);\n\nexport const DeleteCardFieldOutput = Schema.Struct({\n field: View.FieldSchema.annotations({ description: 'The deleted field schema.' }),\n props: Schema.Any.annotations({ description: 'The deleted field properties.' }),\n index: Schema.Number.annotations({ description: 'The index the field was at.' }),\n});\n\nexport type DeleteCardFieldOutput = Schema.Schema.Type<typeof DeleteCardFieldOutput>;\n\nexport const DeleteCardField = Operation.make({\n meta: {\n key: makeKey('deleteCardField'),\n name: 'Delete Card Field',\n icon: 'ph--minus-circle--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n view: Type.getSchema(View.View),\n fieldId: Schema.String,\n }),\n output: DeleteCardFieldOutput,\n});\n\nexport const DeleteCardOutput = Schema.Struct({\n card: Schema.Any.annotations({ description: 'The deleted card.' }),\n});\n\nexport type DeleteCardOutput = Schema.Schema.Type<typeof DeleteCardOutput>;\n\nexport const DeleteCard = Operation.make({\n meta: { key: makeKey('deleteCard'), name: 'Delete Card', icon: 'ph--trash--regular' },\n input: Schema.Struct({\n card: Schema.Any,\n }),\n output: DeleteCardOutput,\n});\n\nexport const RestoreCardField = Operation.make({\n meta: {\n key: makeKey('restoreCardField'),\n name: 'Restore Card Field',\n icon: 'ph--clock-counter-clockwise--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n view: Type.getSchema(View.View).annotations({ description: 'The view to restore the field to.' }),\n field: View.FieldSchema.annotations({ description: 'The field schema to restore.' }),\n props: Schema.Any.annotations({ description: 'The field properties to restore.' }),\n index: Schema.Number.annotations({ description: 'The index to restore the field at.' }),\n }),\n output: Schema.Void,\n});\n\nexport const RestoreCard = Operation.make({\n meta: {\n key: makeKey('restoreCard'),\n name: 'Restore Card',\n icon: 'ph--clock-counter-clockwise--regular',\n },\n input: Schema.Struct({\n card: Schema.Any.annotations({ description: 'The card to restore.' }),\n }),\n output: Schema.Void,\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["UNCATEGORIZED_VALUE", "UNCATEGORIZED_ATTRIBUTES", "title", "color", "Schema", "TypeInputOptionsAnnotation", "PivotColumnAnnotationId", "Symbol", "for", "KanbanSettingsSchema", "Struct", "hideUncategorized", "Boolean", "annotations", "title", "description", "pipe", "optional", "KanbanViewSettingsSchema", "columnFieldId", "String", "fields", "CreateKanbanSchema", "name", "typename", "set", "location", "kind", "initialPivotColumn", "Schema", "DXN", "Annotation", "Obj", "Ref", "Type", "View", "FormInputAnnotation", "LabelAnnotation", "ViewAnnotation", "ArrangementColumnEntry", "Struct", "ids", "Array", "ID", "hidden", "Boolean", "pipe", "optional", "ArrangementColumns", "Record", "key", "String", "value", "set", "Arrangement", "order", "columns", "KanbanViewSpec", "kind", "Literal", "view", "KanbanItemsSpec", "pivotField", "items", "Unknown", "KanbanSpec", "Union", "Kanban", "name", "arrangement", "spec", "IconAnnotation", "icon", "hue", "makeObject", "make", "isKanbanView", "kanban", "isKanbanItems", "props", "makeItems", "Schema", "Capability", "Operation", "Type", "View", "DXN", "meta", "makeKey", "name", "make", "id", "DeleteCardFieldOutput", "Struct", "field", "FieldSchema", "annotations", "description", "props", "Any", "index", "Number", "DeleteCardField", "key", "icon", "services", "Service", "input", "view", "getSchema", "fieldId", "String", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
7
+ }
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-J5LGTIGS.mjs.map
@@ -0,0 +1,8 @@
1
+ // src/operations/index.ts
2
+ import { OperationHandlerSet } from "@dxos/compute";
3
+ var KanbanOperationHandlerSet = OperationHandlerSet.lazy(() => import("./delete-card-VNAV3CZV.mjs"), () => import("./delete-card-field-XHOLGS6L.mjs"), () => import("./restore-card-EKVEPATL.mjs"), () => import("./restore-card-field-TQCTGGNO.mjs"));
4
+
5
+ export {
6
+ KanbanOperationHandlerSet
7
+ };
8
+ //# sourceMappingURL=chunk-M5ISZWZU.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/operations/index.ts"],
4
+ "sourcesContent": ["// Copyright 2025 DXOS.org\n\nimport { OperationHandlerSet } from '@dxos/compute';\n\nexport const KanbanOperationHandlerSet = OperationHandlerSet.lazy(\n () => import('./delete-card'),\n () => import('./delete-card-field'),\n () => import('./restore-card'),\n () => import('./restore-card-field'),\n);\n"],
5
+ "mappings": ";AAEA,SAASA,2BAA2B;AAE7B,IAAMC,4BAA4BD,oBAAoBE,KAC3D,MAAM,OAAO,4BAAA,GACb,MAAM,OAAO,kCAAA,GACb,MAAM,OAAO,6BAAA,GACb,MAAM,OAAO,mCAAA,CAAA;",
6
+ "names": ["OperationHandlerSet", "KanbanOperationHandlerSet", "lazy"]
7
+ }
@@ -0,0 +1,26 @@
1
+ // src/blueprints/kanban-blueprint.ts
2
+ import { Blueprint, Template } from "@dxos/compute";
3
+ import { trim } from "@dxos/util";
4
+ var BLUEPRINT_KEY = "org.dxos.blueprint.kanban";
5
+ var make = () => Blueprint.make({
6
+ key: BLUEPRINT_KEY,
7
+ name: "Kanban",
8
+ tools: Blueprint.toolDefinitions({
9
+ tools: []
10
+ }),
11
+ instructions: Template.make({
12
+ source: trim`
13
+ You can create and update kanban boards to show data in sorted columns defined by schema.
14
+ `
15
+ })
16
+ });
17
+ var blueprint = {
18
+ key: BLUEPRINT_KEY,
19
+ make
20
+ };
21
+ var kanban_blueprint_default = blueprint;
22
+
23
+ export {
24
+ kanban_blueprint_default
25
+ };
26
+ //# sourceMappingURL=chunk-ZTQW5KQS.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/blueprints/kanban-blueprint.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Blueprint, Template } from '@dxos/compute';\nimport { trim } from '@dxos/util';\n\nconst BLUEPRINT_KEY = 'org.dxos.blueprint.kanban';\n\nconst make = () =>\n Blueprint.make({\n key: BLUEPRINT_KEY,\n name: 'Kanban',\n tools: Blueprint.toolDefinitions({ tools: [] }),\n instructions: Template.make({\n source: trim`\n You can create and update kanban boards to show data in sorted columns defined by schema.\n `,\n }),\n });\n\nconst blueprint: Blueprint.Definition = {\n key: BLUEPRINT_KEY,\n make,\n};\n\nexport default blueprint;\n"],
5
+ "mappings": ";AAIA,SAASA,WAAWC,gBAAgB;AACpC,SAASC,YAAY;AAErB,IAAMC,gBAAgB;AAEtB,IAAMC,OAAO,MACXJ,UAAUI,KAAK;EACbC,KAAKF;EACLG,MAAM;EACNC,OAAOP,UAAUQ,gBAAgB;IAAED,OAAO,CAAA;EAAG,CAAA;EAC7CE,cAAcR,SAASG,KAAK;IAC1BM,QAAQR;;;EAGV,CAAA;AACF,CAAA;AAEF,IAAMS,YAAkC;EACtCN,KAAKF;EACLC;AACF;AAEA,IAAA,2BAAeO;",
6
+ "names": ["Blueprint", "Template", "trim", "BLUEPRINT_KEY", "make", "key", "name", "tools", "toolDefinitions", "instructions", "source", "blueprint"]
7
+ }
@@ -0,0 +1,243 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/components/KanbanBoard/KanbanBoard.tsx
4
+ import { RegistryContext } from "@effect-atom/atom-react";
5
+ import React3, { useCallback as useCallback2, useContext, useMemo as useMemo2 } from "react";
6
+ import { Obj as Obj2 } from "@dxos/echo";
7
+ import { useTranslation as useTranslation2 } from "@dxos/react-ui";
8
+ import { composable, composableProps } from "@dxos/react-ui";
9
+ import { Board as Board2, useBoard as useBoard3 } from "@dxos/react-ui-mosaic";
10
+ import { useKanbanBoardModel, useKanbanColumnEventHandler } from "#hooks";
11
+ import { meta as meta2 } from "#meta";
12
+ import { UNCATEGORIZED_ATTRIBUTES as UNCATEGORIZED_ATTRIBUTES2, UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE3 } from "#types";
13
+
14
+ // src/components/KanbanBoard/context.ts
15
+ import { createContext } from "@radix-ui/react-context";
16
+ import { UNCATEGORIZED_ATTRIBUTES, UNCATEGORIZED_VALUE } from "#types";
17
+ var KANBAN_BOARD_NAME = "KanbanBoard.Context";
18
+ var [KanbanBoardContext, useKanbanBoard] = createContext(KANBAN_BOARD_NAME, {
19
+ kanbanId: "never",
20
+ projection: void 0,
21
+ columnFieldPath: void 0,
22
+ change: {
23
+ kanban: () => {
24
+ },
25
+ setItemField: () => {
26
+ }
27
+ },
28
+ pivotFieldId: void 0,
29
+ getPivotAttributes: (id) => id === UNCATEGORIZED_VALUE ? UNCATEGORIZED_ATTRIBUTES : {
30
+ title: id,
31
+ color: "neutral"
32
+ },
33
+ itemTile: () => null
34
+ });
35
+
36
+ // src/components/KanbanBoard/KanbanCard.tsx
37
+ import React, { forwardRef, useCallback, useMemo, useState } from "react";
38
+ import { Surface } from "@dxos/app-framework/ui";
39
+ import { AppSurface, useObjectMenuItems } from "@dxos/app-toolkit/ui";
40
+ import { Obj } from "@dxos/echo";
41
+ import { Card, Toolbar, useTranslation } from "@dxos/react-ui";
42
+ import { Menu, createMenuAction } from "@dxos/react-ui-menu";
43
+ import { Focus, Mosaic, useBoard } from "@dxos/react-ui-mosaic";
44
+ import { meta } from "#meta";
45
+ var KANBAN_CARD_TILE_NAME = "KanbanBoard.Card";
46
+ var KanbanCard = /* @__PURE__ */ forwardRef(({ data, location, debug, draggable }, forwardedRef) => {
47
+ const { t } = useTranslation(meta.id);
48
+ const { model } = useBoard(KANBAN_CARD_TILE_NAME);
49
+ const { projection, columnFieldPath, onCardRemove } = useKanbanBoard(KANBAN_CARD_TILE_NAME);
50
+ const [dragHandle, setDragHandle] = useState(null);
51
+ const dragHandleRef = useCallback((el) => setDragHandle(el), []);
52
+ const objectMenuItems = useObjectMenuItems(data);
53
+ const menuItems = useMemo(() => [
54
+ ...objectMenuItems,
55
+ ...onCardRemove ? [
56
+ createMenuAction("remove", () => onCardRemove(data), {
57
+ label: t("remove-card.label"),
58
+ icon: "ph--trash--regular"
59
+ })
60
+ ] : []
61
+ ], [
62
+ objectMenuItems,
63
+ onCardRemove,
64
+ data,
65
+ t
66
+ ]);
67
+ return /* @__PURE__ */ React.createElement(Menu.Root, null, /* @__PURE__ */ React.createElement(Mosaic.Tile, {
68
+ asChild: true,
69
+ id: model.getItemId(data),
70
+ data,
71
+ location,
72
+ debug,
73
+ draggable,
74
+ dragHandle
75
+ }, /* @__PURE__ */ React.createElement(Focus.Item, {
76
+ asChild: true
77
+ }, /* @__PURE__ */ React.createElement(Card.Root, {
78
+ ref: forwardedRef,
79
+ "data-testid": "board-item"
80
+ }, /* @__PURE__ */ React.createElement(Card.Header, null, /* @__PURE__ */ React.createElement(Card.DragHandle, {
81
+ ref: dragHandleRef,
82
+ testId: "mosaicBoard.cardDragHandle"
83
+ }), /* @__PURE__ */ React.createElement(Card.Title, {
84
+ "data-testid": "mosaicBoard.cardTitle"
85
+ }, Obj.getLabel(data)), /* @__PURE__ */ React.createElement(Menu.Trigger, {
86
+ asChild: true,
87
+ disabled: !menuItems?.length
88
+ }, /* @__PURE__ */ React.createElement(Toolbar.IconButton, {
89
+ iconOnly: true,
90
+ variant: "ghost",
91
+ icon: "ph--dots-three-vertical--regular",
92
+ label: t("action-menu.label")
93
+ })), /* @__PURE__ */ React.createElement(Menu.Content, {
94
+ items: menuItems
95
+ })), /* @__PURE__ */ React.createElement(Card.Body, null, projection && /* @__PURE__ */ React.createElement(Surface.Surface, {
96
+ type: AppSurface.Card,
97
+ limit: 1,
98
+ data: {
99
+ subject: data,
100
+ projection,
101
+ // Hide the pivot field: its value is already conveyed by
102
+ // which column the card sits in.
103
+ ignorePaths: columnFieldPath ? [
104
+ columnFieldPath
105
+ ] : void 0
106
+ }
107
+ }))))));
108
+ });
109
+ KanbanCard.displayName = KANBAN_CARD_TILE_NAME;
110
+
111
+ // src/components/KanbanBoard/KanbanColumn.tsx
112
+ import React2, { forwardRef as forwardRef2, useState as useState2 } from "react";
113
+ import { Board, useBoard as useBoard2 } from "@dxos/react-ui-mosaic";
114
+ import { useKanbanItemEventHandler } from "#hooks";
115
+ import { UNCATEGORIZED_VALUE as UNCATEGORIZED_VALUE2 } from "#types";
116
+ var KANBAN_COLUMN_NAME = "KanbanBoard.Column";
117
+ var KanbanColumn = /* @__PURE__ */ forwardRef2(({ data: column, location, debug, draggable }, forwardedRef) => {
118
+ const { model } = useBoard2(KANBAN_COLUMN_NAME);
119
+ const { columnFieldPath, change, onCardAdd, getPivotAttributes, itemTile } = useKanbanBoard(KANBAN_COLUMN_NAME);
120
+ const { title } = getPivotAttributes(column.columnValue);
121
+ const uncategorized = column.columnValue === UNCATEGORIZED_VALUE2;
122
+ const [dragHandle, setDragHandle] = useState2(null);
123
+ const eventHandler = useKanbanItemEventHandler({
124
+ column,
125
+ columnFieldPath,
126
+ model,
127
+ change
128
+ });
129
+ return /* @__PURE__ */ React2.createElement(Board.Column.Root, {
130
+ data: column,
131
+ location,
132
+ classNames: "grid grid-rows-[var(--dx-rail-action)_1fr_var(--dx-rail-action)]",
133
+ debug,
134
+ draggable,
135
+ dragHandle,
136
+ ref: forwardedRef
137
+ }, uncategorized ? /* @__PURE__ */ React2.createElement("div", {
138
+ className: "border-b border-separator p-2",
139
+ "data-testid": "board-column-header"
140
+ }, /* @__PURE__ */ React2.createElement("span", {
141
+ className: "font-medium"
142
+ }, title)) : /* @__PURE__ */ React2.createElement(Board.Column.Header, {
143
+ label: title,
144
+ dragHandleRef: setDragHandle
145
+ }), /* @__PURE__ */ React2.createElement(Board.Column.Body, {
146
+ data: column,
147
+ eventHandler,
148
+ Tile: itemTile
149
+ }), /* @__PURE__ */ React2.createElement(Board.Column.Footer, {
150
+ onAdd: onCardAdd ? () => onCardAdd(column.columnValue === UNCATEGORIZED_VALUE2 ? void 0 : column.columnValue) : void 0
151
+ }));
152
+ });
153
+ KanbanColumn.displayName = KANBAN_COLUMN_NAME;
154
+
155
+ // src/components/KanbanBoard/KanbanBoard.tsx
156
+ var KANBAN_BOARD_ROOT = "KanbanBoard.Root";
157
+ var KanbanBoardRoot = ({ children, kanban, projection, items, change, itemTile = KanbanCard, onCardAdd, onCardRemove }) => {
158
+ const registry = useContext(RegistryContext);
159
+ const { t } = useTranslation2(meta2.id);
160
+ const model = useKanbanBoardModel(kanban, projection, items, registry);
161
+ const columns = model?.getColumns?.() ?? [];
162
+ const view = kanban?.spec.kind === "view" ? kanban.spec.view.target : void 0;
163
+ const pivotFieldId = view?.projection?.pivotFieldId;
164
+ const columnFieldPath = useMemo2(() => {
165
+ if (kanban?.spec.kind === "items") {
166
+ return kanban.spec.pivotField;
167
+ }
168
+ if (pivotFieldId === void 0 || !projection) {
169
+ return void 0;
170
+ }
171
+ return projection.tryGetFieldProjection(pivotFieldId)?.props.property;
172
+ }, [
173
+ kanban?.spec,
174
+ projection,
175
+ pivotFieldId
176
+ ]);
177
+ const getPivotAttributes = useCallback2((columnValue) => {
178
+ if (columnValue === UNCATEGORIZED_VALUE3) {
179
+ return UNCATEGORIZED_ATTRIBUTES2;
180
+ }
181
+ const options = projection?.tryGetFieldProjection(pivotFieldId ?? "")?.props.options ?? [];
182
+ const option = options.find((option2) => option2.id === columnValue);
183
+ return option ?? {
184
+ title: columnValue,
185
+ color: "neutral"
186
+ };
187
+ }, [
188
+ projection,
189
+ pivotFieldId
190
+ ]);
191
+ if (columns.length === 0) {
192
+ return /* @__PURE__ */ React3.createElement("div", {
193
+ className: "flex flex-1 items-center justify-center p-8 text-center text-description"
194
+ }, t("select-pivot.placeholder"));
195
+ }
196
+ return /* @__PURE__ */ React3.createElement(KanbanBoardContext, {
197
+ kanbanId: Obj2.getURI(kanban),
198
+ projection,
199
+ columnFieldPath,
200
+ pivotFieldId,
201
+ getPivotAttributes,
202
+ itemTile,
203
+ change,
204
+ onCardAdd,
205
+ onCardRemove
206
+ }, /* @__PURE__ */ React3.createElement(Board2.Root, {
207
+ model
208
+ }, children));
209
+ };
210
+ KanbanBoardRoot.displayName = KANBAN_BOARD_ROOT;
211
+ var KANBAN_BOARD_CONTENT = "KanbanBoard.Content";
212
+ var KanbanBoardContent = composable((props, forwardedRef) => {
213
+ const { model } = useBoard3(KANBAN_BOARD_CONTENT);
214
+ const { kanbanId, projection, pivotFieldId, change } = useKanbanBoard(KANBAN_BOARD_CONTENT);
215
+ const columnEventHandler = useKanbanColumnEventHandler({
216
+ id: `${kanbanId}-columns`,
217
+ model,
218
+ projection: projection ?? void 0,
219
+ pivotFieldId: pivotFieldId ?? void 0,
220
+ change
221
+ });
222
+ return /* @__PURE__ */ React3.createElement(Board2.Content, {
223
+ ...composableProps(props),
224
+ ref: forwardedRef,
225
+ id: kanbanId,
226
+ eventHandler: columnEventHandler,
227
+ Tile: KanbanColumn
228
+ });
229
+ });
230
+ KanbanBoardContent.displayName = KANBAN_BOARD_CONTENT;
231
+ var KanbanBoard = {
232
+ Root: KanbanBoardRoot,
233
+ Content: KanbanBoardContent,
234
+ Column: KanbanColumn,
235
+ Card: KanbanCard
236
+ };
237
+ export {
238
+ KanbanBoard,
239
+ KanbanBoardContent,
240
+ KanbanBoardRoot,
241
+ useKanbanBoard
242
+ };
243
+ //# sourceMappingURL=index.mjs.map
@@ -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 { composable, composableProps } from '@dxos/react-ui';\nimport { Board, useBoard } from '@dxos/react-ui-mosaic';\nimport type { ProjectionModel } from '@dxos/schema';\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.getURI(kanban)}\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.Header>\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.Header>\n <Card.Body>\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.Body>\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", "composable", "composableProps", "Board", "useBoard", "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", "Header", "DragHandle", "testId", "Title", "Obj", "getLabel", "Trigger", "disabled", "length", "Toolbar", "IconButton", "iconOnly", "variant", "Content", "items", "Body", "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", "getURI", "Board", "Root", "displayName", "KANBAN_BOARD_CONTENT", "KanbanBoardContent", "composable", "forwardedRef", "useBoard", "useKanbanBoard", "columnEventHandler", "useKanbanColumnEventHandler", "Content", "composableProps", "ref", "eventHandler", "Tile", "KanbanColumn", "KanbanBoard", "Column", "Card"]
7
+ }