@dxos/plugin-kanban 0.9.1-staging.ee54ba693a → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/dist/lib/KanbanPlugin.mjs +18 -0
  2. package/dist/lib/KanbanPlugin.mjs.map +1 -0
  3. package/dist/lib/KanbanPlugin.node.mjs +11 -0
  4. package/dist/lib/KanbanPlugin.node.mjs.map +1 -0
  5. package/dist/lib/KanbanPlugin.workerd.mjs +11 -0
  6. package/dist/lib/KanbanPlugin.workerd.mjs.map +1 -0
  7. package/dist/lib/capabilities/node.mjs +10 -0
  8. package/dist/lib/capabilities/node.mjs.map +1 -0
  9. package/dist/lib/capabilities.mjs +11 -0
  10. package/dist/lib/capabilities.mjs.map +1 -0
  11. package/dist/lib/chunk-KanbanArticle.mjs +121 -0
  12. package/dist/lib/chunk-KanbanArticle.mjs.map +1 -0
  13. package/dist/lib/chunk-KanbanProperties.mjs +73 -0
  14. package/dist/lib/chunk-KanbanProperties.mjs.map +1 -0
  15. package/dist/lib/chunk-create-object.mjs +42 -0
  16. package/dist/lib/chunk-create-object.mjs.map +1 -0
  17. package/dist/lib/chunk-delete-card-field.mjs +50 -0
  18. package/dist/lib/chunk-delete-card-field.mjs.map +1 -0
  19. package/dist/lib/chunk-delete-card.mjs +23 -0
  20. package/dist/lib/chunk-delete-card.mjs.map +1 -0
  21. package/dist/lib/{neutral/chunk-V4AVOJVU.mjs → chunk-meta.mjs} +21 -29
  22. package/dist/lib/chunk-meta.mjs.map +1 -0
  23. package/dist/lib/chunk-operation-handler.mjs +11 -0
  24. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  25. package/dist/lib/chunk-react-surface.mjs +67 -0
  26. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  27. package/dist/lib/chunk-restore-card-field.mjs +48 -0
  28. package/dist/lib/chunk-restore-card-field.mjs.map +1 -0
  29. package/dist/lib/chunk-restore-card.mjs +22 -0
  30. package/dist/lib/chunk-restore-card.mjs.map +1 -0
  31. package/dist/lib/chunk-skill-definition.mjs +10 -0
  32. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  33. package/dist/lib/chunk-skills.mjs +20 -0
  34. package/dist/lib/chunk-skills.mjs.map +1 -0
  35. package/dist/lib/chunk-types.mjs +231 -0
  36. package/dist/lib/chunk-types.mjs.map +1 -0
  37. package/dist/lib/chunk-undo-mappings.mjs +25 -0
  38. package/dist/lib/chunk-undo-mappings.mjs.map +1 -0
  39. package/dist/lib/components.mjs +227 -0
  40. package/dist/lib/components.mjs.map +1 -0
  41. package/dist/lib/containers.mjs +8 -0
  42. package/dist/lib/containers.mjs.map +1 -0
  43. package/dist/lib/hooks.mjs +394 -0
  44. package/dist/lib/hooks.mjs.map +1 -0
  45. package/dist/lib/index.mjs +5 -0
  46. package/dist/lib/meta.mjs +2 -0
  47. package/dist/lib/operations.mjs +7 -0
  48. package/dist/lib/operations.mjs.map +1 -0
  49. package/dist/lib/plugin.mjs +9 -0
  50. package/dist/lib/plugin.mjs.map +1 -0
  51. package/dist/lib/skills.mjs +2 -0
  52. package/dist/lib/testing.mjs +72 -0
  53. package/dist/lib/testing.mjs.map +1 -0
  54. package/dist/lib/translations.mjs +38 -0
  55. package/dist/lib/translations.mjs.map +1 -0
  56. package/dist/lib/types.mjs +2 -0
  57. package/dist/types/src/capabilities/PivotColumnField.d.ts +12 -0
  58. package/dist/types/src/capabilities/PivotColumnField.d.ts.map +1 -0
  59. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  60. package/dist/types/src/capabilities/create-object.d.ts +1 -1
  61. package/dist/types/src/capabilities/node.d.ts +7 -0
  62. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  64. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  65. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/undo-mappings.d.ts +1 -1
  67. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts +3 -4
  68. package/dist/types/src/components/KanbanBoard/KanbanBoard.d.ts.map +1 -1
  69. package/dist/types/src/components/KanbanBoard/KanbanBoard.stories.d.ts.map +1 -1
  70. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
  71. package/dist/types/src/components/KanbanBoard/index.d.ts +1 -0
  72. package/dist/types/src/components/KanbanBoard/index.d.ts.map +1 -1
  73. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts +4 -1
  74. package/dist/types/src/containers/KanbanArticle/KanbanArticle.d.ts.map +1 -1
  75. package/dist/types/src/containers/KanbanArticle/KanbanArticle.stories.d.ts.map +1 -1
  76. package/dist/types/src/containers/KanbanProperties/KanbanProperties.d.ts +4 -8
  77. package/dist/types/src/containers/KanbanProperties/KanbanProperties.d.ts.map +1 -1
  78. package/dist/types/src/hooks/useKanbanBoardModel.d.ts +1 -1
  79. package/dist/types/src/hooks/useKanbanBoardModel.d.ts.map +1 -1
  80. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts +4 -3
  81. package/dist/types/src/hooks/useKanbanColumnEventHandler.d.ts.map +1 -1
  82. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts +4 -3
  83. package/dist/types/src/hooks/useKanbanItemEventHandler.d.ts.map +1 -1
  84. package/dist/types/src/hooks/useProjectionModel.d.ts +1 -1
  85. package/dist/types/src/hooks/useProjectionModel.d.ts.map +1 -1
  86. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -1
  87. package/dist/types/tsconfig.tsbuildinfo +1 -1
  88. package/dx.config.ts +1 -0
  89. package/package.json +58 -51
  90. package/src/capabilities/PivotColumnField.tsx +56 -0
  91. package/src/capabilities/node.ts +18 -0
  92. package/src/capabilities/react-surface.ts +45 -0
  93. package/src/components/KanbanBoard/KanbanBoard.stories.tsx +15 -4
  94. package/src/components/KanbanBoard/KanbanBoard.tsx +0 -3
  95. package/src/components/KanbanBoard/KanbanCard.tsx +5 -3
  96. package/src/components/KanbanBoard/index.ts +2 -0
  97. package/src/containers/KanbanArticle/KanbanArticle.stories.tsx +2 -1
  98. package/src/containers/KanbanArticle/KanbanArticle.tsx +3 -1
  99. package/src/containers/KanbanProperties/KanbanProperties.tsx +3 -1
  100. package/src/hooks/useItemsProjection.ts +1 -1
  101. package/src/hooks/useKanbanBoardModel.browser.test.ts +1 -1
  102. package/src/hooks/useKanbanBoardModel.ts +1 -1
  103. package/src/hooks/useKanbanColumnEventHandler.ts +6 -5
  104. package/src/hooks/useKanbanItemEventHandler.ts +6 -7
  105. package/src/hooks/useProjectionModel.ts +1 -1
  106. package/src/testing/KanbanCardTileSimple.tsx +2 -1
  107. package/dist/lib/neutral/KanbanArticle-JQMQQHRB.mjs +0 -132
  108. package/dist/lib/neutral/KanbanArticle-JQMQQHRB.mjs.map +0 -7
  109. package/dist/lib/neutral/KanbanPlugin.mjs +0 -44
  110. package/dist/lib/neutral/KanbanPlugin.mjs.map +0 -7
  111. package/dist/lib/neutral/KanbanPlugin.node.mjs +0 -27
  112. package/dist/lib/neutral/KanbanPlugin.node.mjs.map +0 -7
  113. package/dist/lib/neutral/KanbanPlugin.workerd.mjs +0 -21
  114. package/dist/lib/neutral/KanbanPlugin.workerd.mjs.map +0 -7
  115. package/dist/lib/neutral/KanbanProperties-W7MZNZVJ.mjs +0 -83
  116. package/dist/lib/neutral/KanbanProperties-W7MZNZVJ.mjs.map +0 -7
  117. package/dist/lib/neutral/capabilities/index.mjs +0 -17
  118. package/dist/lib/neutral/capabilities/index.mjs.map +0 -7
  119. package/dist/lib/neutral/chunk-7TVVF45P.mjs +0 -247
  120. package/dist/lib/neutral/chunk-7TVVF45P.mjs.map +0 -7
  121. package/dist/lib/neutral/chunk-7YLGUKDJ.mjs +0 -8
  122. package/dist/lib/neutral/chunk-7YLGUKDJ.mjs.map +0 -7
  123. package/dist/lib/neutral/chunk-CFPH5R6P.mjs +0 -26
  124. package/dist/lib/neutral/chunk-CFPH5R6P.mjs.map +0 -7
  125. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  126. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  127. package/dist/lib/neutral/chunk-V4AVOJVU.mjs.map +0 -7
  128. package/dist/lib/neutral/components/index.mjs +0 -245
  129. package/dist/lib/neutral/components/index.mjs.map +0 -7
  130. package/dist/lib/neutral/containers/index.mjs +0 -11
  131. package/dist/lib/neutral/containers/index.mjs.map +0 -7
  132. package/dist/lib/neutral/create-object-DIIFRS57.mjs +0 -45
  133. package/dist/lib/neutral/create-object-DIIFRS57.mjs.map +0 -7
  134. package/dist/lib/neutral/delete-card-TK2G6YHX.mjs +0 -24
  135. package/dist/lib/neutral/delete-card-TK2G6YHX.mjs.map +0 -7
  136. package/dist/lib/neutral/delete-card-field-LGWPBOUW.mjs +0 -39
  137. package/dist/lib/neutral/delete-card-field-LGWPBOUW.mjs.map +0 -7
  138. package/dist/lib/neutral/hooks/index.mjs +0 -431
  139. package/dist/lib/neutral/hooks/index.mjs.map +0 -7
  140. package/dist/lib/neutral/index.mjs +0 -34
  141. package/dist/lib/neutral/index.mjs.map +0 -7
  142. package/dist/lib/neutral/meta.json +0 -1
  143. package/dist/lib/neutral/meta.mjs +0 -8
  144. package/dist/lib/neutral/meta.mjs.map +0 -7
  145. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs +0 -13
  146. package/dist/lib/neutral/operation-handler-B7IW6MXU.mjs.map +0 -7
  147. package/dist/lib/neutral/operations/index.mjs +0 -8
  148. package/dist/lib/neutral/operations/index.mjs.map +0 -7
  149. package/dist/lib/neutral/plugin.mjs +0 -16
  150. package/dist/lib/neutral/plugin.mjs.map +0 -7
  151. package/dist/lib/neutral/react-surface-FQGXRR3X.mjs +0 -89
  152. package/dist/lib/neutral/react-surface-FQGXRR3X.mjs.map +0 -7
  153. package/dist/lib/neutral/restore-card-3O6PVN7J.mjs +0 -21
  154. package/dist/lib/neutral/restore-card-3O6PVN7J.mjs.map +0 -7
  155. package/dist/lib/neutral/restore-card-field-5G4DVYYY.mjs +0 -37
  156. package/dist/lib/neutral/restore-card-field-5G4DVYYY.mjs.map +0 -7
  157. package/dist/lib/neutral/skill-definition-YGTCKXGP.mjs +0 -15
  158. package/dist/lib/neutral/skill-definition-YGTCKXGP.mjs.map +0 -7
  159. package/dist/lib/neutral/skills/index.mjs +0 -8
  160. package/dist/lib/neutral/skills/index.mjs.map +0 -7
  161. package/dist/lib/neutral/testing/index.mjs +0 -64
  162. package/dist/lib/neutral/testing/index.mjs.map +0 -7
  163. package/dist/lib/neutral/translations.mjs +0 -44
  164. package/dist/lib/neutral/translations.mjs.map +0 -7
  165. package/dist/lib/neutral/types/index.mjs +0 -22
  166. package/dist/lib/neutral/types/index.mjs.map +0 -7
  167. package/dist/lib/neutral/undo-mappings-EZTHO4UL.mjs +0 -42
  168. package/dist/lib/neutral/undo-mappings-EZTHO4UL.mjs.map +0 -7
  169. package/src/capabilities/react-surface.tsx +0 -95
package/dx.config.ts CHANGED
@@ -32,5 +32,6 @@ export default Config2.make({
32
32
  icon: { key: 'ph--kanban--regular', hue: 'green' },
33
33
  spec: 'PLUGIN.mdl',
34
34
  screenshots: [{ dark: 'https://dxos.network/plugin-details-kanban-dark.png' }],
35
+ tags: ['beta'],
35
36
  },
36
37
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-kanban",
3
- "version": "0.9.1-staging.ee54ba693a",
3
+ "version": "0.11.0",
4
4
  "description": "Kanban DXOS Surface plugin",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -16,37 +16,41 @@
16
16
  "#skills": {
17
17
  "source": "./src/skills/index.ts",
18
18
  "types": "./dist/types/src/skills/index.d.ts",
19
- "default": "./dist/lib/neutral/skills/index.mjs"
19
+ "default": "./dist/lib/skills.mjs"
20
20
  },
21
21
  "#capabilities": {
22
- "source": "./src/capabilities/index.ts",
22
+ "source": {
23
+ "node": "./src/capabilities/node.ts",
24
+ "default": "./src/capabilities/index.ts"
25
+ },
23
26
  "types": "./dist/types/src/capabilities/index.d.ts",
24
- "default": "./dist/lib/neutral/capabilities/index.mjs"
27
+ "node": "./dist/lib/capabilities/node.mjs",
28
+ "default": "./dist/lib/capabilities.mjs"
25
29
  },
26
30
  "#components": {
27
31
  "source": "./src/components/index.ts",
28
32
  "types": "./dist/types/src/components/index.d.ts",
29
- "default": "./dist/lib/neutral/components/index.mjs"
33
+ "default": "./dist/lib/components.mjs"
30
34
  },
31
35
  "#containers": {
32
36
  "source": "./src/containers/index.ts",
33
37
  "types": "./dist/types/src/containers/index.d.ts",
34
- "default": "./dist/lib/neutral/containers/index.mjs"
38
+ "default": "./dist/lib/containers.mjs"
35
39
  },
36
40
  "#hooks": {
37
41
  "source": "./src/hooks/index.ts",
38
42
  "types": "./dist/types/src/hooks/index.d.ts",
39
- "default": "./dist/lib/neutral/hooks/index.mjs"
43
+ "default": "./dist/lib/hooks.mjs"
40
44
  },
41
45
  "#meta": {
42
46
  "source": "./src/meta.ts",
43
47
  "types": "./dist/types/src/meta.d.ts",
44
- "default": "./dist/lib/neutral/meta.mjs"
48
+ "default": "./dist/lib/meta.mjs"
45
49
  },
46
50
  "#operations": {
47
51
  "source": "./src/operations/index.ts",
48
52
  "types": "./dist/types/src/operations/index.d.ts",
49
- "default": "./dist/lib/neutral/operations/index.mjs"
53
+ "default": "./dist/lib/operations.mjs"
50
54
  },
51
55
  "#plugin": {
52
56
  "source": {
@@ -55,48 +59,48 @@
55
59
  "default": "./src/KanbanPlugin.tsx"
56
60
  },
57
61
  "types": "./dist/types/src/KanbanPlugin.d.ts",
58
- "workerd": "./dist/lib/neutral/KanbanPlugin.workerd.mjs",
59
- "node": "./dist/lib/neutral/KanbanPlugin.node.mjs",
60
- "default": "./dist/lib/neutral/KanbanPlugin.mjs"
62
+ "workerd": "./dist/lib/KanbanPlugin.workerd.mjs",
63
+ "node": "./dist/lib/KanbanPlugin.node.mjs",
64
+ "default": "./dist/lib/KanbanPlugin.mjs"
61
65
  },
62
66
  "#testing": "./src/testing/index.ts",
63
67
  "#translations": {
64
68
  "source": "./src/translations.ts",
65
69
  "types": "./dist/types/src/translations.d.ts",
66
- "default": "./dist/lib/neutral/translations.mjs"
70
+ "default": "./dist/lib/translations.mjs"
67
71
  },
68
72
  "#types": {
69
73
  "source": "./src/types/index.ts",
70
74
  "types": "./dist/types/src/types/index.d.ts",
71
- "default": "./dist/lib/neutral/types/index.mjs"
75
+ "default": "./dist/lib/types.mjs"
72
76
  }
73
77
  },
74
78
  "exports": {
75
79
  ".": {
76
80
  "source": "./src/index.ts",
77
81
  "types": "./dist/types/src/index.d.ts",
78
- "default": "./dist/lib/neutral/index.mjs"
82
+ "import": "./dist/lib/index.mjs"
79
83
  },
80
84
  "./assets/PLUGIN.mdl": "./PLUGIN.mdl",
81
85
  "./skills": {
82
86
  "source": "./src/skills/index.ts",
83
87
  "types": "./dist/types/src/skills/index.d.ts",
84
- "default": "./dist/lib/neutral/skills/index.mjs"
88
+ "import": "./dist/lib/skills.mjs"
85
89
  },
86
90
  "./plugin": {
87
91
  "source": "./src/plugin.ts",
88
92
  "types": "./dist/types/src/plugin.d.ts",
89
- "default": "./dist/lib/neutral/plugin.mjs"
93
+ "import": "./dist/lib/plugin.mjs"
90
94
  },
91
95
  "./translations": {
92
96
  "source": "./src/translations.ts",
93
97
  "types": "./dist/types/src/translations.d.ts",
94
- "default": "./dist/lib/neutral/translations.mjs"
98
+ "import": "./dist/lib/translations.mjs"
95
99
  },
96
100
  "./types": {
97
101
  "source": "./src/types/index.ts",
98
102
  "types": "./dist/types/src/types/index.d.ts",
99
- "default": "./dist/lib/neutral/types/index.mjs"
103
+ "import": "./dist/lib/types.mjs"
100
104
  }
101
105
  },
102
106
  "types": "dist/types/src/index.d.ts",
@@ -107,52 +111,55 @@
107
111
  "PLUGIN.mdl"
108
112
  ],
109
113
  "dependencies": {
114
+ "@effect-atom/atom": "^0.5.3",
110
115
  "@effect-atom/atom-react": "^0.5.0",
111
116
  "@radix-ui/react-context": "1.1.1",
112
117
  "effect": "3.21.4",
113
- "@dxos/ai": "0.9.1-staging.ee54ba693a",
114
- "@dxos/app-framework": "0.9.1-staging.ee54ba693a",
115
- "@dxos/assistant": "0.9.1-staging.ee54ba693a",
116
- "@dxos/compute": "0.9.1-staging.ee54ba693a",
117
- "@dxos/echo": "0.9.1-staging.ee54ba693a",
118
- "@dxos/effect": "0.9.1-staging.ee54ba693a",
119
- "@dxos/invariant": "0.9.1-staging.ee54ba693a",
120
- "@dxos/log": "0.9.1-staging.ee54ba693a",
121
- "@dxos/random": "0.9.1-staging.ee54ba693a",
122
- "@dxos/react-client": "0.9.1-staging.ee54ba693a",
123
- "@dxos/plugin-client": "0.9.1-staging.ee54ba693a",
124
- "@dxos/react-ui-form": "0.9.1-staging.ee54ba693a",
125
- "@dxos/plugin-space": "0.9.1-staging.ee54ba693a",
126
- "@dxos/react-ui": "0.9.1-staging.ee54ba693a",
127
- "@dxos/react-ui-menu": "0.9.1-staging.ee54ba693a",
128
- "@dxos/react-ui-mosaic": "0.9.1-staging.ee54ba693a",
129
- "@dxos/schema": "0.9.1-staging.ee54ba693a",
130
- "@dxos/app-toolkit": "0.9.1-staging.ee54ba693a",
131
- "@dxos/types": "0.9.1-staging.ee54ba693a",
132
- "@dxos/util": "0.9.1-staging.ee54ba693a"
118
+ "@dxos/ai": "0.11.0",
119
+ "@dxos/app-framework": "0.11.0",
120
+ "@dxos/app-toolkit": "0.11.0",
121
+ "@dxos/assistant": "0.11.0",
122
+ "@dxos/compute": "0.11.0",
123
+ "@dxos/echo": "0.11.0",
124
+ "@dxos/echo-react": "0.11.0",
125
+ "@dxos/effect": "0.11.0",
126
+ "@dxos/invariant": "0.11.0",
127
+ "@dxos/log": "0.11.0",
128
+ "@dxos/plugin-client": "0.11.0",
129
+ "@dxos/plugin-space": "0.11.0",
130
+ "@dxos/random": "0.11.0",
131
+ "@dxos/react-client": "0.11.0",
132
+ "@dxos/react-ui": "0.11.0",
133
+ "@dxos/react-ui-dnd": "0.11.0",
134
+ "@dxos/react-ui-form": "0.11.0",
135
+ "@dxos/react-ui-menu": "0.11.0",
136
+ "@dxos/react-ui-mosaic": "0.11.0",
137
+ "@dxos/schema": "0.11.0",
138
+ "@dxos/types": "0.11.0",
139
+ "@dxos/util": "0.11.0"
133
140
  },
134
141
  "devDependencies": {
135
142
  "@types/react": "~19.2.17",
136
143
  "@types/react-dom": "~19.2.3",
137
144
  "react": "~19.2.7",
138
145
  "react-dom": "~19.2.7",
139
- "vite": "^8.0.16",
140
- "@dxos/keys": "0.9.1-staging.ee54ba693a",
141
- "@dxos/echo-client": "0.9.1-staging.ee54ba693a",
142
- "@dxos/plugin-preview": "0.9.1-staging.ee54ba693a",
143
- "@dxos/plugin-testing": "0.9.1-staging.ee54ba693a",
144
- "@dxos/plugin-theme": "0.9.1-staging.ee54ba693a",
145
- "@dxos/react-ui-syntax-highlighter": "0.9.1-staging.ee54ba693a",
146
- "@dxos/test-utils": "0.9.1-staging.ee54ba693a",
147
- "@dxos/ui-theme": "0.9.1-staging.ee54ba693a",
148
- "@dxos/storybook-utils": "0.9.1-staging.ee54ba693a"
146
+ "vite": "^8.1.4",
147
+ "@dxos/echo-client": "0.11.0",
148
+ "@dxos/keys": "0.11.0",
149
+ "@dxos/plugin-preview": "0.11.0",
150
+ "@dxos/plugin-testing": "0.11.0",
151
+ "@dxos/plugin-theme": "0.11.0",
152
+ "@dxos/react-ui-syntax-highlighter": "0.11.0",
153
+ "@dxos/storybook-utils": "0.11.0",
154
+ "@dxos/test-utils": "0.11.0",
155
+ "@dxos/ui-theme": "0.11.0"
149
156
  },
150
157
  "peerDependencies": {
151
158
  "effect": "3.21.4",
152
159
  "react": "~19.2.7",
153
160
  "react-dom": "~19.2.7",
154
- "@dxos/ui-theme": "0.9.1-staging.ee54ba693a",
155
- "@dxos/react-ui": "0.9.1-staging.ee54ba693a"
161
+ "@dxos/react-ui": "^0.11.0",
162
+ "@dxos/ui-theme": "^0.11.0"
156
163
  },
157
164
  "publishConfig": {
158
165
  "access": "public"
@@ -0,0 +1,56 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useMemo } from 'react';
6
+
7
+ import { type Surface } from '@dxos/app-framework/ui';
8
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
9
+ import { Database, Obj, Type } from '@dxos/echo';
10
+ import { type FormFieldRendererProps, SelectField, useFormValues } from '@dxos/react-ui-form';
11
+
12
+ /** The form renderer's own props ride alongside `data` on the surface envelope; `type` comes from the field AST. */
13
+ export type PivotColumnFieldProps = Surface.ComponentProps<AppSurface.FormInputData> &
14
+ Omit<FormFieldRendererProps, 'type'>;
15
+
16
+ /**
17
+ * Form field offering the single-select properties of the form's currently chosen typename as the
18
+ * kanban's pivot column. It consumes the whole surface envelope, so it takes no `props` mapper.
19
+ */
20
+ export const PivotColumnField = ({ data, ...inputProps }: PivotColumnFieldProps) => {
21
+ const ast = data.fieldPropertyAst;
22
+ const target = data.target;
23
+ const db = Database.isDatabase(target) ? target : Obj.isObject(target) ? Obj.getDatabase(target) : undefined;
24
+ const { typename } = useFormValues('KanbanForm');
25
+ const [selectedSchema] = useMemo(
26
+ () =>
27
+ db
28
+ ? db.graph.registry
29
+ .list()
30
+ .filter(Type.isType)
31
+ .filter((type) => Type.getTypename(type) === typename)
32
+ : [],
33
+ [db, typename],
34
+ );
35
+ const singleSelectColumns = useMemo(() => {
36
+ const properties = selectedSchema?.jsonSchema.properties;
37
+ if (!properties) {
38
+ return [];
39
+ }
40
+
41
+ return Object.entries(properties).reduce<string[]>((acc, [key, value]) => {
42
+ if (typeof value === 'object' && value !== null && (value as { format?: string }).format === 'single-select') {
43
+ acc.push(key);
44
+ }
45
+ return acc;
46
+ }, []);
47
+ }, [selectedSchema]);
48
+
49
+ if (!ast || !db || !typename) {
50
+ return null;
51
+ }
52
+
53
+ const props: FormFieldRendererProps = { ...inputProps, type: ast };
54
+
55
+ return <SelectField {...props} options={singleSelectColumns.map((column) => ({ value: column }))} />;
56
+ };
@@ -0,0 +1,18 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { Capability } from '@dxos/app-framework';
6
+ import type { OperationHandlerSet } from '@dxos/compute';
7
+
8
+ // The capabilities `KanbanPlugin.node` activates, and only those. `Capability.lazy` defers the
9
+ // import at runtime but a bundler still walks it, so listing the React surfaces here would pull
10
+ // the plugin's components into every node and bun build.
11
+
12
+ export const SkillDefinition = Capability.lazy('SkillDefinition', () => import('./skill-definition'));
13
+ export const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));
14
+ export const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(
15
+ 'OperationHandler',
16
+ () => import('./operation-handler'),
17
+ );
18
+ export const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));
@@ -0,0 +1,45 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
8
+ import { Surface } from '@dxos/app-framework/ui';
9
+ import { AppSurface } from '@dxos/app-toolkit/ui';
10
+ import { SchemaEx } from '@dxos/effect';
11
+ import { Position } from '@dxos/util';
12
+
13
+ import { KanbanArticle, KanbanProperties } from '#containers';
14
+ import { Kanban, PivotColumnAnnotationId } from '#types';
15
+
16
+ import { PivotColumnField } from './PivotColumnField';
17
+
18
+ export default Capability.makeModule(() =>
19
+ Effect.succeed(
20
+ Capability.contributes(Capabilities.ReactSurface, [
21
+ Surface.create({
22
+ id: 'root',
23
+ // TODO(wittjosiah): Split into multiple surfaces if this filter proves too strict for non-article roles.
24
+ filter: AppSurface.oneOf(
25
+ AppSurface.object(AppSurface.Article, Kanban.Kanban),
26
+ AppSurface.object(AppSurface.Section, Kanban.Kanban),
27
+ ),
28
+ component: KanbanArticle,
29
+ props: ({ role, data: { subject } }) => ({ role, subject }),
30
+ }),
31
+ Surface.create({
32
+ id: 'objectProperties',
33
+ position: Position.first,
34
+ filter: AppSurface.object(AppSurface.ObjectProperties, Kanban.Kanban),
35
+ component: KanbanProperties,
36
+ props: ({ data: { subject } }) => ({ subject }),
37
+ }),
38
+ Surface.create({
39
+ id: 'createInitialSchemaForm',
40
+ filter: AppSurface.formInputBySchema((ast) => !!SchemaEx.findAnnotation<boolean>(ast, PivotColumnAnnotationId)),
41
+ component: PivotColumnField,
42
+ }),
43
+ ]),
44
+ ),
45
+ );
@@ -10,7 +10,7 @@ import { Filter, JsonSchema, Obj, Query, type View } from '@dxos/echo';
10
10
  import { random } from '@dxos/random';
11
11
  import { withMosaic } from '@dxos/react-ui-mosaic/testing';
12
12
  import { Loading, withLayout, withTheme } from '@dxos/react-ui/testing';
13
- import { ProjectionModel, ViewModel, createEchoChangeCallback } from '@dxos/schema';
13
+ import { ProjectionModel, ViewModel, createDirectChangeCallback, createEchoChangeCallback } from '@dxos/schema';
14
14
  import { withRegistry } from '@dxos/storybook-utils';
15
15
  import { Organization } from '@dxos/types';
16
16
 
@@ -46,9 +46,14 @@ const DefaultStory = () => {
46
46
  }>();
47
47
 
48
48
  useEffect(() => {
49
+ // Single mutable schema shared by the view, the projection base, and the change callback so
50
+ // schema mutations (e.g. reordering pivot-field options during a column drag) persist and read
51
+ // back. `createDirectChangeCallback` mutates it in place — the ECHO callback would throw
52
+ // "Schema is not mutable" for these non-ECHO, in-memory story objects.
53
+ const jsonSchema = JsonSchema.toJsonSchema(Organization.Organization);
49
54
  const view = ViewModel.make({
50
55
  query: Query.select(Filter.type(Organization.Organization)),
51
- jsonSchema: JsonSchema.toJsonSchema(Organization.Organization),
56
+ jsonSchema,
52
57
  pivotFieldName: 'status',
53
58
  });
54
59
  const kanban = Kanban.make({ view });
@@ -56,8 +61,14 @@ const DefaultStory = () => {
56
61
  const projection = new ProjectionModel({
57
62
  registry,
58
63
  view,
59
- baseSchema: JsonSchema.toJsonSchema(Organization.Organization),
60
- change: createEchoChangeCallback(view),
64
+ baseSchema: jsonSchema,
65
+ // Hybrid change callback: the view is reactive (nested in the Kanban object) so its
66
+ // projection must be mutated via Obj.update, but the plain in-memory jsonSchema is
67
+ // mutated directly. Neither factory alone fits, so compose the correct mutator from each.
68
+ change: {
69
+ projection: createEchoChangeCallback(view).projection,
70
+ schema: createDirectChangeCallback(view.projection, jsonSchema).schema,
71
+ },
61
72
  });
62
73
  projection.normalizeView();
63
74
 
@@ -139,7 +139,6 @@ export const KanbanBoardContent = composable<HTMLDivElement, KanbanBoardContentP
139
139
  <Board.Content
140
140
  {...composableProps(props)}
141
141
  ref={forwardedRef}
142
- id={kanbanId}
143
142
  eventHandler={columnEventHandler}
144
143
  Tile={KanbanColumn}
145
144
  />
@@ -159,6 +158,4 @@ export const KanbanBoard = {
159
158
  Card: KanbanCard,
160
159
  };
161
160
 
162
- export { useKanbanBoard };
163
-
164
161
  export type { KanbanBoardRootProps as KanbanBoardProps, KanbanCardProps, KanbanColumnProps };
@@ -5,7 +5,7 @@
5
5
  import React, { forwardRef, useCallback, useMemo, useState } from 'react';
6
6
 
7
7
  import { Surface } from '@dxos/app-framework/ui';
8
- import { AppSurface, useObjectMenuItems } from '@dxos/app-toolkit/ui';
8
+ import { AppSurface, useCardPivot, useObjectMenuItems } from '@dxos/app-toolkit/ui';
9
9
  import { Obj } from '@dxos/echo';
10
10
  import { Card, IconButton, useTranslation } from '@dxos/react-ui';
11
11
  import { Menu, createMenuAction } from '@dxos/react-ui-menu';
@@ -31,7 +31,9 @@ export const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(
31
31
  const [dragHandle, setDragHandle] = useState<HTMLButtonElement | null>(null);
32
32
  const dragHandleRef = useCallback((el: HTMLButtonElement | null) => setDragHandle(el), []);
33
33
 
34
- const objectMenuItems = useObjectMenuItems(data);
34
+ // Card.Root already takes the forwarded ref; walk from the header to resolve the origin plank.
35
+ const [cardRef, pivotId] = useCardPivot();
36
+ const objectMenuItems = useObjectMenuItems(data, pivotId);
35
37
 
36
38
  const menuItems = useMemo(
37
39
  () => [
@@ -61,7 +63,7 @@ export const KanbanCard = forwardRef<HTMLDivElement, KanbanCardProps>(
61
63
  >
62
64
  <Focus.Item asChild>
63
65
  <Card.Root ref={forwardedRef} data-testid='board-item'>
64
- <Card.Header>
66
+ <Card.Header ref={cardRef}>
65
67
  <Card.DragHandle ref={dragHandleRef} testId='mosaicBoard.cardDragHandle' />
66
68
  <Card.Title data-testid='mosaicBoard.cardTitle'>{Obj.getLabel(data)}</Card.Title>
67
69
  {/* TODO(wittjosiah): Reconcile with Card.Menu. */}
@@ -2,4 +2,6 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
+ export { useKanbanBoard } from './context';
6
+
5
7
  export * from './KanbanBoard';
@@ -12,6 +12,7 @@ import { withPluginManager } from '@dxos/app-framework/testing';
12
12
  import { Surface } from '@dxos/app-framework/ui';
13
13
  import { AppSurface } from '@dxos/app-toolkit/ui';
14
14
  import { Filter, Obj, type QueryAST, Type, View } from '@dxos/echo';
15
+ import { useQuery, useType } from '@dxos/echo-react';
15
16
  import { type Mutable } from '@dxos/echo/Obj';
16
17
  import { invariant } from '@dxos/invariant';
17
18
  // `/plugin` entrypoints used here for the same reason as `corePlugins()` —
@@ -22,7 +23,7 @@ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
22
23
  import { SpacePlugin } from '@dxos/plugin-space/testing';
23
24
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
24
25
  import { random } from '@dxos/random';
25
- import { type Space, useQuery, useSpaces, useType } from '@dxos/react-client/echo';
26
+ import { type Space, useSpaces } from '@dxos/react-client/echo';
26
27
  import { ViewEditor } from '@dxos/react-ui-form';
27
28
  import { Syntax } from '@dxos/react-ui-syntax-highlighter';
28
29
  import { withLayout } from '@dxos/react-ui/testing';
@@ -9,7 +9,7 @@ import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
9
9
  import { AppCapabilities } from '@dxos/app-toolkit';
10
10
  import { type AppSurface, useSchemaFilter } from '@dxos/app-toolkit/ui';
11
11
  import { Filter, Obj, Query, type Ref, Type } from '@dxos/echo';
12
- import { useObject, useType } from '@dxos/react-client/echo';
12
+ import { useObject, useType } from '@dxos/echo-react';
13
13
  import { Panel, Toolbar } from '@dxos/react-ui';
14
14
  import { getTagFromQuery, getTypeURIFromQuery } from '@dxos/schema';
15
15
 
@@ -177,3 +177,5 @@ const ItemsKanbanArticle = ({ role, subject: object }: ItemsKanbanArticleProps)
177
177
  </Panel.Root>
178
178
  );
179
179
  };
180
+
181
+ KanbanArticle.displayName = 'KanbanArticle';
@@ -7,8 +7,8 @@ import React, { useCallback, useContext, useMemo } from 'react';
7
7
 
8
8
  import { type AppSurface } from '@dxos/app-toolkit/ui';
9
9
  import { Obj } from '@dxos/echo';
10
+ import { useObject, useType } from '@dxos/echo-react';
10
11
  import { Format } from '@dxos/echo/Format';
11
- import { useObject, useType } from '@dxos/react-client/echo';
12
12
  import { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';
13
13
  import { getTypeURIFromQuery } from '@dxos/schema';
14
14
 
@@ -99,3 +99,5 @@ export const KanbanProperties = ({ subject: object }: KanbanPropertiesProps) =>
99
99
  </Form.Section>
100
100
  );
101
101
  };
102
+
103
+ KanbanProperties.displayName = 'KanbanProperties';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { Atom } from '@effect-atom/atom-react';
5
+ import { Atom } from '@effect-atom/atom';
6
6
  import { useMemo } from 'react';
7
7
 
8
8
  import type { ProjectionModel } from '@dxos/schema';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Atom, Registry } from '@effect-atom/atom-react';
5
+ import { Atom, Registry } from '@effect-atom/atom';
6
6
  import { act, renderHook } from '@testing-library/react';
7
7
  import * as Schema from 'effect/Schema';
8
8
  import { beforeEach, describe, test } from 'vitest';
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Atom, type Registry } from '@effect-atom/atom-react';
5
+ import { Atom, type Registry } from '@effect-atom/atom';
6
6
  import { useMemo } from 'react';
7
7
 
8
8
  import { Obj } from '@dxos/echo';
@@ -4,7 +4,8 @@
4
4
 
5
5
  import { useMemo } from 'react';
6
6
 
7
- import type { BoardModel, MosaicEventHandler, MosaicTileData } from '@dxos/react-ui-mosaic';
7
+ import type { DndContainerHandler, DndTileData } from '@dxos/react-ui-dnd';
8
+ import type { BoardModel } from '@dxos/react-ui-mosaic';
8
9
  import type { ProjectionModel } from '@dxos/schema';
9
10
  import { arrayMove } from '@dxos/util';
10
11
 
@@ -19,7 +20,7 @@ import { type BaseKanbanItem, type ColumnStructure, type KanbanChangeCallback, U
19
20
  * @param projection - ProjectionModel for pivot field options (column order).
20
21
  * @param pivotFieldId - Pivot field id; undefined disables drop.
21
22
  * @param change - Callback to persist kanban.arrangement.order.
22
- * @returns MosaicEventHandler for column tiles.
23
+ * @returns DndContainerHandler for column tiles.
23
24
  */
24
25
  export function useKanbanColumnEventHandler<T extends BaseKanbanItem>({
25
26
  id,
@@ -33,8 +34,8 @@ export function useKanbanColumnEventHandler<T extends BaseKanbanItem>({
33
34
  projection: ProjectionModel | undefined;
34
35
  pivotFieldId: string | undefined;
35
36
  change: KanbanChangeCallback<T>;
36
- }): MosaicEventHandler<ColumnStructure> {
37
- return useMemo<MosaicEventHandler<ColumnStructure>>(
37
+ }): DndContainerHandler<ColumnStructure> {
38
+ return useMemo<DndContainerHandler<ColumnStructure>>(
38
39
  () => ({
39
40
  id,
40
41
  canDrop: ({ source }) => {
@@ -46,7 +47,7 @@ export function useKanbanColumnEventHandler<T extends BaseKanbanItem>({
46
47
  return (
47
48
  model.isColumn(source.data) &&
48
49
  columnValue !== UNCATEGORIZED_VALUE &&
49
- (source as MosaicTileData<ColumnStructure>).id !== UNCATEGORIZED_VALUE
50
+ (source as DndTileData<ColumnStructure>).id !== UNCATEGORIZED_VALUE
50
51
  );
51
52
  },
52
53
  onDrop: ({ source, target }) => {
@@ -4,7 +4,8 @@
4
4
 
5
5
  import { useMemo } from 'react';
6
6
 
7
- import type { BoardModel, MosaicEventHandler, MosaicTileData } from '@dxos/react-ui-mosaic';
7
+ import type { DndContainerHandler, DndTileData } from '@dxos/react-ui-dnd';
8
+ import type { BoardModel } from '@dxos/react-ui-mosaic';
8
9
 
9
10
  import {
10
11
  type ArrangedCards,
@@ -29,7 +30,7 @@ function findColumn<T extends BaseKanbanItem>(
29
30
  * @param columnFieldPath - Item property path for the pivot field (used when moving to another column).
30
31
  * @param model - Board model for getColumns / getItems.
31
32
  * @param change - Callback to persist arrangement and item field updates.
32
- * @returns MosaicEventHandler for item tiles in this column.
33
+ * @returns DndContainerHandler for item tiles in this column.
33
34
  */
34
35
  export function useKanbanItemEventHandler<T extends BaseKanbanItem>({
35
36
  column,
@@ -41,8 +42,8 @@ export function useKanbanItemEventHandler<T extends BaseKanbanItem>({
41
42
  columnFieldPath: string | undefined;
42
43
  model: BoardModel<ColumnStructure, T>;
43
44
  change: KanbanChangeCallback<T>;
44
- }): MosaicEventHandler<T> {
45
- return useMemo<MosaicEventHandler<T>>(
45
+ }): DndContainerHandler<T> {
46
+ return useMemo<DndContainerHandler<T>>(
46
47
  () => ({
47
48
  id: column.columnValue,
48
49
  canDrop: ({ source }) => model.isItem(source.data),
@@ -91,9 +92,7 @@ export function useKanbanItemEventHandler<T extends BaseKanbanItem>({
91
92
  // 5. Compute insert index in target column, then insert.
92
93
  const existingTargetIndex =
93
94
  target?.type === 'tile'
94
- ? targetColumnInWorking.cards.findIndex(
95
- (card) => model.getItemId(card) === (target as MosaicTileData<T>).id,
96
- )
95
+ ? targetColumnInWorking.cards.findIndex((card) => model.getItemId(card) === (target as DndTileData<T>).id)
97
96
  : -1;
98
97
  const closestEdge: 'top' | 'bottom' =
99
98
  target?.type === 'placeholder' && typeof target.location === 'number'
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type Registry } from '@effect-atom/atom-react';
5
+ import { type Registry } from '@effect-atom/atom';
6
6
  import { useState } from 'react';
7
7
 
8
8
  import { JsonSchema, Type } from '@dxos/echo';
@@ -18,7 +18,7 @@ const KANBAN_CARD_TILE_SIMPLE_NAME = 'KanbanCardTileSimple';
18
18
  * Card tile without Surface; for stories and tests when plugin manager is not available.
19
19
  */
20
20
  export const KanbanCardTileSimple = forwardRef<HTMLDivElement, KanbanCardProps>(
21
- ({ data, location, debug }, forwardedRef) => {
21
+ ({ data, location, debug, draggable }, forwardedRef) => {
22
22
  const { t } = useTranslation(meta.profile.key);
23
23
  const { model } = useBoard(KANBAN_CARD_TILE_SIMPLE_NAME);
24
24
  const { onCardRemove } = useKanbanBoard(KANBAN_CARD_TILE_SIMPLE_NAME);
@@ -46,6 +46,7 @@ export const KanbanCardTileSimple = forwardRef<HTMLDivElement, KanbanCardProps>(
46
46
  data={data}
47
47
  location={location}
48
48
  debug={debug}
49
+ draggable={draggable}
49
50
  dragHandle={dragHandle}
50
51
  >
51
52
  <Focus.Item asChild>