@dxos/plugin-kanban 0.9.0 → 0.9.1-main.c7dcc2e112

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 (67) hide show
  1. package/dist/lib/neutral/KanbanPlugin.mjs +2 -2
  2. package/dist/lib/neutral/KanbanPlugin.mjs.map +4 -4
  3. package/dist/lib/neutral/{KanbanSettings-5WOS4CUE.mjs → KanbanSettings-FTIIR6PR.mjs} +3 -3
  4. package/dist/lib/neutral/{KanbanSettings-5WOS4CUE.mjs.map → KanbanSettings-FTIIR6PR.mjs.map} +3 -3
  5. package/dist/lib/neutral/capabilities/index.mjs +2 -2
  6. package/dist/lib/neutral/capabilities/index.mjs.map +2 -2
  7. package/dist/lib/neutral/chunk-2IGEE5J5.mjs +50 -0
  8. package/dist/lib/neutral/chunk-2IGEE5J5.mjs.map +7 -0
  9. package/dist/lib/neutral/chunk-NDJNHR4K.mjs +8 -0
  10. package/dist/lib/neutral/{chunk-DAKIZO46.mjs → chunk-Y2G24ZGD.mjs} +2 -2
  11. package/dist/lib/neutral/{chunk-DAKIZO46.mjs.map → chunk-Y2G24ZGD.mjs.map} +3 -3
  12. package/dist/lib/neutral/components/index.mjs +9 -7
  13. package/dist/lib/neutral/components/index.mjs.map +3 -3
  14. package/dist/lib/neutral/containers/index.mjs +1 -1
  15. package/dist/lib/neutral/{delete-card-VNAV3CZV.mjs → delete-card-NMULYEXS.mjs} +2 -2
  16. package/dist/lib/neutral/{delete-card-field-XHOLGS6L.mjs → delete-card-field-NGYNI6GL.mjs} +2 -2
  17. package/dist/lib/neutral/index.mjs +3 -3
  18. package/dist/lib/neutral/meta.json +1 -1
  19. package/dist/lib/neutral/meta.mjs +1 -1
  20. package/dist/lib/neutral/operations/index.mjs +1 -1
  21. package/dist/lib/neutral/plugin.mjs +2 -2
  22. package/dist/lib/neutral/{react-surface-VZEVEJL5.mjs → react-surface-5Y6IHGKR.mjs} +7 -10
  23. package/dist/lib/neutral/react-surface-5Y6IHGKR.mjs.map +7 -0
  24. package/dist/lib/neutral/{restore-card-EKVEPATL.mjs → restore-card-JQ5N7G6G.mjs} +2 -2
  25. package/dist/lib/neutral/{restore-card-field-TQCTGGNO.mjs → restore-card-field-4SU6IR4V.mjs} +2 -2
  26. package/dist/lib/neutral/testing/index.mjs +7 -5
  27. package/dist/lib/neutral/testing/index.mjs.map +3 -3
  28. package/dist/lib/neutral/translations.mjs +1 -1
  29. package/dist/lib/neutral/translations.mjs.map +3 -3
  30. package/dist/lib/neutral/types/index.mjs +1 -1
  31. package/dist/lib/neutral/{undo-mappings-6CHW6BOF.mjs → undo-mappings-EZTHO4UL.mjs} +3 -3
  32. package/dist/lib/neutral/{undo-mappings-6CHW6BOF.mjs.map → undo-mappings-EZTHO4UL.mjs.map} +3 -3
  33. package/dist/types/dx.config.d.ts +28 -0
  34. package/dist/types/dx.config.d.ts.map +1 -0
  35. package/dist/types/src/capabilities/index.d.ts +4 -10
  36. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  37. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  38. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  39. package/dist/types/src/components/KanbanBoard/KanbanCard.d.ts.map +1 -1
  40. package/dist/types/src/containers/KanbanSettings/KanbanSettings.d.ts.map +1 -1
  41. package/dist/types/src/meta.d.ts +28 -2
  42. package/dist/types/src/meta.d.ts.map +1 -1
  43. package/dist/types/src/testing/KanbanCardTileSimple.d.ts.map +1 -1
  44. package/dist/types/tsconfig.tsbuildinfo +1 -1
  45. package/dx.config.ts +36 -0
  46. package/package.json +33 -32
  47. package/src/KanbanPlugin.test.ts +1 -1
  48. package/src/KanbanPlugin.tsx +1 -1
  49. package/src/capabilities/index.ts +1 -7
  50. package/src/capabilities/react-surface.tsx +13 -24
  51. package/src/capabilities/undo-mappings.ts +2 -2
  52. package/src/components/KanbanBoard/KanbanBoard.tsx +1 -1
  53. package/src/components/KanbanBoard/KanbanCard.tsx +14 -12
  54. package/src/containers/KanbanSettings/KanbanSettings.tsx +10 -3
  55. package/src/meta.ts +2 -29
  56. package/src/testing/KanbanCardTileSimple.tsx +13 -11
  57. package/src/translations.ts +1 -1
  58. package/src/types/KanbanOperation.ts +1 -1
  59. package/dist/lib/neutral/chunk-6ZHHQWO5.mjs +0 -39
  60. package/dist/lib/neutral/chunk-6ZHHQWO5.mjs.map +0 -7
  61. package/dist/lib/neutral/chunk-M5ISZWZU.mjs +0 -8
  62. package/dist/lib/neutral/react-surface-VZEVEJL5.mjs.map +0 -7
  63. /package/dist/lib/neutral/{chunk-M5ISZWZU.mjs.map → chunk-NDJNHR4K.mjs.map} +0 -0
  64. /package/dist/lib/neutral/{delete-card-VNAV3CZV.mjs.map → delete-card-NMULYEXS.mjs.map} +0 -0
  65. /package/dist/lib/neutral/{delete-card-field-XHOLGS6L.mjs.map → delete-card-field-NGYNI6GL.mjs.map} +0 -0
  66. /package/dist/lib/neutral/{restore-card-EKVEPATL.mjs.map → restore-card-JQ5N7G6G.mjs.map} +0 -0
  67. /package/dist/lib/neutral/{restore-card-field-TQCTGGNO.mjs.map → restore-card-field-4SU6IR4V.mjs.map} +0 -0
@@ -8,7 +8,7 @@ import { meta } from "#meta";
8
8
  import { translations } from "#translations";
9
9
  import { Kanban } from "#types";
10
10
 
11
- // raw-loader:/__w/dxos/dxos/packages/plugins/plugin-kanban/PLUGIN.mdl?raw
11
+ // raw-loader:/__w/dxos/dxos/packages/plugins/plugin-kanban/PLUGIN.mdl
12
12
  var PLUGIN_default = '---\nid: org.dxos.plugin.kanban\nname: KanbanPlugin\nversion: 0.1.0\n---\n\nVisual project management plugin for `DXOS` Composer \u2014 organise any ECHO type into drag-and-drop columns driven by a single-select field, with full local-first persistence and real-time peer replication.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype ArrangementColumnEntry\n fields:\n ids: string[] # ordered card ids within the column\n hidden?: boolean # when true the column is hidden from the board\n```\n\n```mdl\ntype Arrangement\n fields:\n order: string[] # ordered column values\n columns: Map<string, ArrangementColumnEntry>\n```\n\n```mdl\ntype KanbanViewSpec\n fields:\n kind: "view" # discriminator \u2014 items sourced from a View query\n view: Ref<View> # the View whose query drives card membership\n```\n\n```mdl\ntype KanbanItemsSpec\n fields:\n kind: "items" # discriminator \u2014 kanban owns items explicitly\n pivotField: string # property path that drives column membership\n items: Ref<object>[] # items owned directly by the kanban\n```\n\n```mdl\ntype KanbanSpec\n desc: Discriminated union of item-source strategies.\n literals: KanbanViewSpec | KanbanItemsSpec\n```\n\n```mdl\ntype Kanban\n desc: Root ECHO object for a kanban board. Stored with typename org.dxos.type.kanban v0.2.0.\n fields:\n name?: string\n arrangement: Arrangement\n spec: KanbanSpec # discriminated by spec.kind\n```\n\n```mdl\ntype KanbanSettings\n fields:\n hideUncategorized?: boolean # hides items with no pivot value\n```\n\n```mdl\ntype KanbanViewSettings\n fields:\n columnFieldId: string # id of the View field used as pivot column\n hideUncategorized?: boolean\n```\n\n```mdl\ntype CreateKanbanInput\n fields:\n name?: string\n typename?: string # ECHO typename of card objects\n initialPivotColumn?: string # initial single-select field to pivot on\n```\n\n## Components\n\n```mdl\ncomponent KanbanArticle\n desc: Main article surface for a Kanban. Branches internally on spec.kind \u2014 view-variant runs a typename query via the linked View; items-variant dereferences spec.items directly.\n props:\n subject: Kanban\n role: "article" | "section"\n state:\n projection: ProjectionModel # column/field projection derived from View + schema\n items: AtomQuery # reactive card query (view-variant) or array (items-variant)\n actions:\n addCard(columnValue: string) \u2192 string # returns new card id\n removeCard(card: object)\n moveCard(card: object, toColumn: string, toIndex: number)\n deleteCardField(fieldId: string)\n layout: |\n \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 [toolbar slot] \u2502\n \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 Col A \u2502 Col B \u2502 Col C \u2502\n \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2026 \u2502\n \u2502 \u2502 card \u2502 \u2502 \u2502 card \u2502 \u2502 \u2502\n \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502\n \u2502 [+ Add card]\u2502 \u2502 \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```mdl\ncomponent KanbanSettings\n desc: Properties panel for a Kanban. View-variant shows a column-field picker plus common settings; items-variant shows only common settings.\n props:\n subject: Kanban\n state:\n selectFields: { value: string; label: string }[] # single-select fields available as pivot\n actions:\n changeColumnField(fieldId: string)\n toggleHideUncategorized(hidden: boolean)\n```\n\n## Operations\n\n```mdl\nop deleteCard\n desc: Removes a card object from the ECHO database.\n input:\n card: object # the card to remove\n output: DeleteCardOutput # { card } snapshot of the removed card\n effects: [echo:write]\n```\n\n```mdl\nop deleteCardField\n desc: Removes a field projection from the View\'s schema; returns enough data to undo.\n input:\n view: View\n fieldId: string\n output: DeleteCardFieldOutput # { field, props, index }\n effects: [echo:write]\n requires: [AtomRegistry, Database]\n```\n\n```mdl\nop restoreCard\n desc: Undo counterpart to deleteCard \u2014 re-adds a previously removed card to the database.\n input:\n card: object # the card snapshot to restore\n output: void\n effects: [echo:write]\n```\n\n```mdl\nop restoreCardField\n desc: Undo counterpart to deleteCardField \u2014 re-inserts a field projection at its original index.\n input:\n view: View\n field: FieldSchema\n props: object # field properties\n index: number # position to restore at\n output: void\n effects: [echo:write]\n requires: [AtomRegistry, Database]\n```\n\n## Features\n\n```mdl\nfeat F-1: Board Layout\n\n req F-1.1: Columns are ordered by Arrangement.order; each column contains its cards in Arrangement.columns[value].ids order.\n req F-1.2: Cards within a column are rendered in the stored id order.\n req F-1.3:\n when: settings.hideUncategorized is true\n then: the uncategorized column is not rendered\n```\n\n```mdl\nfeat F-2: Drag and Drop\n\n req F-2.1:\n when: user drags a card to a different column\n then: card\'s pivot field is updated to the target column value; Arrangement updated\n\n req F-2.2:\n when: user drags a card within the same column\n then: card ids are reordered in Arrangement.columns[value].ids\n\n req F-2.3:\n when: user drags a column header\n then: Arrangement.order is updated to reflect the new column order\n```\n\n```mdl\nfeat F-3: Card Management\n\n req F-3.1:\n when: user clicks Add Card in a column\n then: a new ECHO object of the board\'s card type is created with the pivot field set to that column\'s value\n\n req F-3.2:\n when: user removes a card\n then: op:deleteCard runs; card is removed from the ECHO database and from the board\n\n req F-3.3:\n when: user undoes a delete-card action\n then: op:restoreCard re-adds the card; board reflects restored state\n```\n\n```mdl\nfeat F-4: Column Configuration\n\n req F-4.1:\n when: user opens KanbanSettings for a view-variant board\n then: column-field picker shows all single-select fields from the card schema\n\n req F-4.2:\n when: user selects a different column field\n then: View.projection.pivotFieldId is updated; board re-renders with new columns\n\n req F-4.3:\n when: user removes a column field\n then: op:deleteCardField removes the projection; op:restoreCardField can reverse it\n```\n\n```mdl\nfeat F-5: Item Source Variants\n\n req F-5.1:\n when: spec.kind === "view"\n then: items come from running the View\'s typename query against the ECHO database\n\n req F-5.2:\n when: spec.kind === "items"\n then: items come from spec.items (explicit ref array); used by externally-synced boards (e.g. Linear, GitHub)\n\n req F-5.3: Both variants share the same Arrangement persistence and drag-and-drop logic.\n```\n\n```mdl\nfeat F-6: ECHO Persistence and Collaboration\n\n req F-6.1: All Kanban, Arrangement, and card mutations are written to ECHO and replicated to peers.\n req F-6.2:\n when: a peer updates a card or moves it\n then: KanbanArticle re-renders reactively via AtomQuery / AtomObj subscriptions\n\n req F-6.3: View-variant kanbans own an associated View object that is hidden from the space browser.\n```\n\n```mdl\nfeat F-7: AI Blueprint\n\n req F-7.1: Plugin contributes a Kanban blueprint that lets an AI agent create and update kanban boards.\n req F-7.2:\n when: an AI agent calls the blueprint\n then: agent can create boards, place cards in columns, and update card fields\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Create kanban board\n given: a space with a custom ECHO type that has a single-select field "status"\n when: user creates a new Kanban selecting that type and "status" as the pivot column\n then:\n - Kanban object written to ECHO with spec.kind === "view"\n - columns correspond to the "status" field\'s enum values\n - existing objects appear as cards in their respective columns\n```\n\n```mdl\ntest T-2: Drag card between columns\n given: a Kanban with columns "todo", "in-progress", "done" and a card in "todo"\n when: user drags the card to "in-progress"\n then:\n - card\'s "status" field updated to "in-progress"\n - Arrangement reflects card in "in-progress" column\n - change replicated to peers via ECHO\n```\n\n```mdl\ntest T-3: Reorder cards within a column\n given: a column with cards [A, B, C] in order\n when: user drags card C above card A\n then:\n - Arrangement.columns["col"].ids === [C, A, B]\n - board renders in new order\n```\n\n```mdl\ntest T-4: Add card to column\n given: a board with a "todo" column\n when: user clicks Add Card in "todo"\n then:\n - new ECHO object created with pivot field set to "todo"\n - card appears at the bottom of the "todo" column\n```\n\n```mdl\ntest T-5: Delete and restore card\n given: a board with card X in column "todo"\n when: user deletes card X, then undoes\n then:\n - after delete: card X absent from board and ECHO database\n - after undo: card X restored to ECHO and reappears in "todo"\n```\n\n```mdl\ntest T-6: Hide uncategorized column\n given: a board with some cards that have no pivot value (uncategorized)\n when: user enables "Hide uncategorized column" in KanbanSettings\n then:\n - uncategorized column no longer rendered\n - Arrangement.columns[UNCATEGORIZED].hidden === true\n```\n\n```mdl\ntest T-7: Switch pivot column field\n given: a view-variant board currently pivoting on "status"\n when: user opens settings and selects "priority" as the column field\n then:\n - View.projection.pivotFieldId updated to "priority"\n - board re-renders with columns derived from "priority" enum values\n```\n\n---\n\n## Appendix: Extension Definitions\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next test\n uri: org.dxos.mdl.test@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n';
13
13
 
14
14
  // src/KanbanPlugin.tsx
@@ -30,7 +30,7 @@ var KanbanPlugin = Plugin.define(meta).pipe(AppPlugin.addBlueprintDefinitionModu
30
30
  translations
31
31
  }), AppPlugin.addPluginAssetModule({
32
32
  asset: {
33
- pluginId: meta.id,
33
+ pluginId: meta.profile.key,
34
34
  path: "PLUGIN.mdl",
35
35
  content: PLUGIN_default,
36
36
  mimeType: "application/x-mdl"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/KanbanPlugin.tsx", "raw-loader:/__w/dxos/dxos/packages/plugins/plugin-kanban/PLUGIN.mdl?raw"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\n\nimport { BlueprintDefinition, CreateObject, OperationHandler, UndoMappings, ReactSurface } from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\nimport { Kanban } from '#types';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\nexport const KanbanPlugin = Plugin.define(meta).pipe(\n AppPlugin.addBlueprintDefinitionModule({ activate: BlueprintDefinition }),\n AppPlugin.addCreateObjectModule({ activate: CreateObject }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addUndoMappingsModule({ activate: UndoMappings }),\n AppPlugin.addSchemaModule({ schema: [Kanban.Kanban] }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.id, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default KanbanPlugin;\n", "---\nid: org.dxos.plugin.kanban\nname: KanbanPlugin\nversion: 0.1.0\n---\n\nVisual project management plugin for `DXOS` Composer \u2014 organise any ECHO type into drag-and-drop columns driven by a single-select field, with full local-first persistence and real-time peer replication.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype ArrangementColumnEntry\n fields:\n ids: string[] # ordered card ids within the column\n hidden?: boolean # when true the column is hidden from the board\n```\n\n```mdl\ntype Arrangement\n fields:\n order: string[] # ordered column values\n columns: Map<string, ArrangementColumnEntry>\n```\n\n```mdl\ntype KanbanViewSpec\n fields:\n kind: \"view\" # discriminator \u2014 items sourced from a View query\n view: Ref<View> # the View whose query drives card membership\n```\n\n```mdl\ntype KanbanItemsSpec\n fields:\n kind: \"items\" # discriminator \u2014 kanban owns items explicitly\n pivotField: string # property path that drives column membership\n items: Ref<object>[] # items owned directly by the kanban\n```\n\n```mdl\ntype KanbanSpec\n desc: Discriminated union of item-source strategies.\n literals: KanbanViewSpec | KanbanItemsSpec\n```\n\n```mdl\ntype Kanban\n desc: Root ECHO object for a kanban board. Stored with typename org.dxos.type.kanban v0.2.0.\n fields:\n name?: string\n arrangement: Arrangement\n spec: KanbanSpec # discriminated by spec.kind\n```\n\n```mdl\ntype KanbanSettings\n fields:\n hideUncategorized?: boolean # hides items with no pivot value\n```\n\n```mdl\ntype KanbanViewSettings\n fields:\n columnFieldId: string # id of the View field used as pivot column\n hideUncategorized?: boolean\n```\n\n```mdl\ntype CreateKanbanInput\n fields:\n name?: string\n typename?: string # ECHO typename of card objects\n initialPivotColumn?: string # initial single-select field to pivot on\n```\n\n## Components\n\n```mdl\ncomponent KanbanArticle\n desc: Main article surface for a Kanban. Branches internally on spec.kind \u2014 view-variant runs a typename query via the linked View; items-variant dereferences spec.items directly.\n props:\n subject: Kanban\n role: \"article\" | \"section\"\n state:\n projection: ProjectionModel # column/field projection derived from View + schema\n items: AtomQuery # reactive card query (view-variant) or array (items-variant)\n actions:\n addCard(columnValue: string) \u2192 string # returns new card id\n removeCard(card: object)\n moveCard(card: object, toColumn: string, toIndex: number)\n deleteCardField(fieldId: string)\n layout: |\n \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 [toolbar slot] \u2502\n \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 Col A \u2502 Col B \u2502 Col C \u2502\n \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2026 \u2502\n \u2502 \u2502 card \u2502 \u2502 \u2502 card \u2502 \u2502 \u2502\n \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502\n \u2502 [+ Add card]\u2502 \u2502 \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```mdl\ncomponent KanbanSettings\n desc: Properties panel for a Kanban. View-variant shows a column-field picker plus common settings; items-variant shows only common settings.\n props:\n subject: Kanban\n state:\n selectFields: { value: string; label: string }[] # single-select fields available as pivot\n actions:\n changeColumnField(fieldId: string)\n toggleHideUncategorized(hidden: boolean)\n```\n\n## Operations\n\n```mdl\nop deleteCard\n desc: Removes a card object from the ECHO database.\n input:\n card: object # the card to remove\n output: DeleteCardOutput # { card } snapshot of the removed card\n effects: [echo:write]\n```\n\n```mdl\nop deleteCardField\n desc: Removes a field projection from the View's schema; returns enough data to undo.\n input:\n view: View\n fieldId: string\n output: DeleteCardFieldOutput # { field, props, index }\n effects: [echo:write]\n requires: [AtomRegistry, Database]\n```\n\n```mdl\nop restoreCard\n desc: Undo counterpart to deleteCard \u2014 re-adds a previously removed card to the database.\n input:\n card: object # the card snapshot to restore\n output: void\n effects: [echo:write]\n```\n\n```mdl\nop restoreCardField\n desc: Undo counterpart to deleteCardField \u2014 re-inserts a field projection at its original index.\n input:\n view: View\n field: FieldSchema\n props: object # field properties\n index: number # position to restore at\n output: void\n effects: [echo:write]\n requires: [AtomRegistry, Database]\n```\n\n## Features\n\n```mdl\nfeat F-1: Board Layout\n\n req F-1.1: Columns are ordered by Arrangement.order; each column contains its cards in Arrangement.columns[value].ids order.\n req F-1.2: Cards within a column are rendered in the stored id order.\n req F-1.3:\n when: settings.hideUncategorized is true\n then: the uncategorized column is not rendered\n```\n\n```mdl\nfeat F-2: Drag and Drop\n\n req F-2.1:\n when: user drags a card to a different column\n then: card's pivot field is updated to the target column value; Arrangement updated\n\n req F-2.2:\n when: user drags a card within the same column\n then: card ids are reordered in Arrangement.columns[value].ids\n\n req F-2.3:\n when: user drags a column header\n then: Arrangement.order is updated to reflect the new column order\n```\n\n```mdl\nfeat F-3: Card Management\n\n req F-3.1:\n when: user clicks Add Card in a column\n then: a new ECHO object of the board's card type is created with the pivot field set to that column's value\n\n req F-3.2:\n when: user removes a card\n then: op:deleteCard runs; card is removed from the ECHO database and from the board\n\n req F-3.3:\n when: user undoes a delete-card action\n then: op:restoreCard re-adds the card; board reflects restored state\n```\n\n```mdl\nfeat F-4: Column Configuration\n\n req F-4.1:\n when: user opens KanbanSettings for a view-variant board\n then: column-field picker shows all single-select fields from the card schema\n\n req F-4.2:\n when: user selects a different column field\n then: View.projection.pivotFieldId is updated; board re-renders with new columns\n\n req F-4.3:\n when: user removes a column field\n then: op:deleteCardField removes the projection; op:restoreCardField can reverse it\n```\n\n```mdl\nfeat F-5: Item Source Variants\n\n req F-5.1:\n when: spec.kind === \"view\"\n then: items come from running the View's typename query against the ECHO database\n\n req F-5.2:\n when: spec.kind === \"items\"\n then: items come from spec.items (explicit ref array); used by externally-synced boards (e.g. Linear, GitHub)\n\n req F-5.3: Both variants share the same Arrangement persistence and drag-and-drop logic.\n```\n\n```mdl\nfeat F-6: ECHO Persistence and Collaboration\n\n req F-6.1: All Kanban, Arrangement, and card mutations are written to ECHO and replicated to peers.\n req F-6.2:\n when: a peer updates a card or moves it\n then: KanbanArticle re-renders reactively via AtomQuery / AtomObj subscriptions\n\n req F-6.3: View-variant kanbans own an associated View object that is hidden from the space browser.\n```\n\n```mdl\nfeat F-7: AI Blueprint\n\n req F-7.1: Plugin contributes a Kanban blueprint that lets an AI agent create and update kanban boards.\n req F-7.2:\n when: an AI agent calls the blueprint\n then: agent can create boards, place cards in columns, and update card fields\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Create kanban board\n given: a space with a custom ECHO type that has a single-select field \"status\"\n when: user creates a new Kanban selecting that type and \"status\" as the pivot column\n then:\n - Kanban object written to ECHO with spec.kind === \"view\"\n - columns correspond to the \"status\" field's enum values\n - existing objects appear as cards in their respective columns\n```\n\n```mdl\ntest T-2: Drag card between columns\n given: a Kanban with columns \"todo\", \"in-progress\", \"done\" and a card in \"todo\"\n when: user drags the card to \"in-progress\"\n then:\n - card's \"status\" field updated to \"in-progress\"\n - Arrangement reflects card in \"in-progress\" column\n - change replicated to peers via ECHO\n```\n\n```mdl\ntest T-3: Reorder cards within a column\n given: a column with cards [A, B, C] in order\n when: user drags card C above card A\n then:\n - Arrangement.columns[\"col\"].ids === [C, A, B]\n - board renders in new order\n```\n\n```mdl\ntest T-4: Add card to column\n given: a board with a \"todo\" column\n when: user clicks Add Card in \"todo\"\n then:\n - new ECHO object created with pivot field set to \"todo\"\n - card appears at the bottom of the \"todo\" column\n```\n\n```mdl\ntest T-5: Delete and restore card\n given: a board with card X in column \"todo\"\n when: user deletes card X, then undoes\n then:\n - after delete: card X absent from board and ECHO database\n - after undo: card X restored to ECHO and reappears in \"todo\"\n```\n\n```mdl\ntest T-6: Hide uncategorized column\n given: a board with some cards that have no pivot value (uncategorized)\n when: user enables \"Hide uncategorized column\" in KanbanSettings\n then:\n - uncategorized column no longer rendered\n - Arrangement.columns[UNCATEGORIZED].hidden === true\n```\n\n```mdl\ntest T-7: Switch pivot column field\n given: a view-variant board currently pivoting on \"status\"\n when: user opens settings and selects \"priority\" as the column field\n then:\n - View.projection.pivotFieldId updated to \"priority\"\n - board re-renders with columns derived from \"priority\" enum values\n```\n\n---\n\n## Appendix: Extension Definitions\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next test\n uri: org.dxos.mdl.test@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n"],
5
- "mappings": ";;;AAIA,SAASA,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,qBAAqBC,cAAcC,kBAAkBC,cAAcC,oBAAoB;AAChG,SAASC,YAAY;AACrB,SAASC,oBAAoB;AAC7B,SAASC,cAAc;;;ACVvB;;;ADeO,IAAMC,eAAeC,OAAOC,OAAOC,IAAAA,EAAMC,KAC9CC,UAAUC,6BAA6B;EAAEC,UAAUC;AAAoB,CAAA,GACvEH,UAAUI,sBAAsB;EAAEF,UAAUG;AAAa,CAAA,GACzDL,UAAUM,0BAA0B;EAAEJ,UAAUK;AAAiB,CAAA,GACjEP,UAAUQ,sBAAsB;EAAEN,UAAUO;AAAa,CAAA,GACzDT,UAAUU,gBAAgB;EAAEC,QAAQ;IAACC,OAAOA;;AAAQ,CAAA,GACpDZ,UAAUa,iBAAiB;EAAEX,UAAUY;AAAa,CAAA,GACpDd,UAAUe,sBAAsB;EAAEC;AAAa,CAAA,GAC/ChB,UAAUiB,qBAAqB;EAC7BC,OAAO;IAAEC,UAAUrB,KAAKsB;IAAIC,MAAM;IAAcC,SAASC;IAAYC,UAAU;EAAoB;AACrG,CAAA,GACA5B,OAAO6B,IAAI;AAGb,IAAA,uBAAe9B;",
6
- "names": ["Plugin", "AppPlugin", "BlueprintDefinition", "CreateObject", "OperationHandler", "UndoMappings", "ReactSurface", "meta", "translations", "Kanban", "KanbanPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addBlueprintDefinitionModule", "activate", "BlueprintDefinition", "addCreateObjectModule", "CreateObject", "addOperationHandlerModule", "OperationHandler", "addUndoMappingsModule", "UndoMappings", "addSchemaModule", "schema", "Kanban", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "addPluginAssetModule", "asset", "pluginId", "id", "path", "content", "pluginSpec", "mimeType", "make"]
3
+ "sources": ["../../../src/KanbanPlugin.tsx", "raw-loader:/__w/dxos/dxos/packages/plugins/plugin-kanban/PLUGIN.mdl"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\nimport { AppPlugin } from '@dxos/app-toolkit';\n\nimport { BlueprintDefinition, CreateObject, OperationHandler, UndoMappings, ReactSurface } from '#capabilities';\nimport { meta } from '#meta';\nimport { translations } from '#translations';\nimport { Kanban } from '#types';\n\n// eslint-disable-next-line import/no-relative-packages\nimport pluginSpec from '../PLUGIN.mdl?raw';\n\nexport const KanbanPlugin = Plugin.define(meta).pipe(\n AppPlugin.addBlueprintDefinitionModule({ activate: BlueprintDefinition }),\n AppPlugin.addCreateObjectModule({ activate: CreateObject }),\n AppPlugin.addOperationHandlerModule({ activate: OperationHandler }),\n AppPlugin.addUndoMappingsModule({ activate: UndoMappings }),\n AppPlugin.addSchemaModule({ schema: [Kanban.Kanban] }),\n AppPlugin.addSurfaceModule({ activate: ReactSurface }),\n AppPlugin.addTranslationsModule({ translations }),\n AppPlugin.addPluginAssetModule({\n asset: { pluginId: meta.profile.key, path: 'PLUGIN.mdl', content: pluginSpec, mimeType: 'application/x-mdl' },\n }),\n Plugin.make,\n);\n\nexport default KanbanPlugin;\n", "---\nid: org.dxos.plugin.kanban\nname: KanbanPlugin\nversion: 0.1.0\n---\n\nVisual project management plugin for `DXOS` Composer \u2014 organise any ECHO type into drag-and-drop columns driven by a single-select field, with full local-first persistence and real-time peer replication.\n\n## Extensions\n\nThe following extension dialects are used in this document.\nEach extension is defined in the Appendix or resolved via its URI.\n\n| Term | URI |\n|-------------|--------------------------------|\n| `type` | `org.dxos.mdl.type@1.0` |\n| `feat` | `org.dxos.mdl.feat@1.0` |\n| `test` | `org.dxos.mdl.test@1.0` |\n| `component` | `org.dxos.mdl.component@1.0` |\n| `op` | `org.dxos.mdl.op@1.0` |\n\n## Types\n\n```mdl\ntype ArrangementColumnEntry\n fields:\n ids: string[] # ordered card ids within the column\n hidden?: boolean # when true the column is hidden from the board\n```\n\n```mdl\ntype Arrangement\n fields:\n order: string[] # ordered column values\n columns: Map<string, ArrangementColumnEntry>\n```\n\n```mdl\ntype KanbanViewSpec\n fields:\n kind: \"view\" # discriminator \u2014 items sourced from a View query\n view: Ref<View> # the View whose query drives card membership\n```\n\n```mdl\ntype KanbanItemsSpec\n fields:\n kind: \"items\" # discriminator \u2014 kanban owns items explicitly\n pivotField: string # property path that drives column membership\n items: Ref<object>[] # items owned directly by the kanban\n```\n\n```mdl\ntype KanbanSpec\n desc: Discriminated union of item-source strategies.\n literals: KanbanViewSpec | KanbanItemsSpec\n```\n\n```mdl\ntype Kanban\n desc: Root ECHO object for a kanban board. Stored with typename org.dxos.type.kanban v0.2.0.\n fields:\n name?: string\n arrangement: Arrangement\n spec: KanbanSpec # discriminated by spec.kind\n```\n\n```mdl\ntype KanbanSettings\n fields:\n hideUncategorized?: boolean # hides items with no pivot value\n```\n\n```mdl\ntype KanbanViewSettings\n fields:\n columnFieldId: string # id of the View field used as pivot column\n hideUncategorized?: boolean\n```\n\n```mdl\ntype CreateKanbanInput\n fields:\n name?: string\n typename?: string # ECHO typename of card objects\n initialPivotColumn?: string # initial single-select field to pivot on\n```\n\n## Components\n\n```mdl\ncomponent KanbanArticle\n desc: Main article surface for a Kanban. Branches internally on spec.kind \u2014 view-variant runs a typename query via the linked View; items-variant dereferences spec.items directly.\n props:\n subject: Kanban\n role: \"article\" | \"section\"\n state:\n projection: ProjectionModel # column/field projection derived from View + schema\n items: AtomQuery # reactive card query (view-variant) or array (items-variant)\n actions:\n addCard(columnValue: string) \u2192 string # returns new card id\n removeCard(card: object)\n moveCard(card: object, toColumn: string, toIndex: number)\n deleteCardField(fieldId: string)\n layout: |\n \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n \u2502 [toolbar slot] \u2502\n \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n \u2502 Col A \u2502 Col B \u2502 Col C \u2502\n \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2026 \u2502\n \u2502 \u2502 card \u2502 \u2502 \u2502 card \u2502 \u2502 \u2502\n \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502\n \u2502 [+ Add card]\u2502 \u2502 \u2502\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n```\n\n```mdl\ncomponent KanbanSettings\n desc: Properties panel for a Kanban. View-variant shows a column-field picker plus common settings; items-variant shows only common settings.\n props:\n subject: Kanban\n state:\n selectFields: { value: string; label: string }[] # single-select fields available as pivot\n actions:\n changeColumnField(fieldId: string)\n toggleHideUncategorized(hidden: boolean)\n```\n\n## Operations\n\n```mdl\nop deleteCard\n desc: Removes a card object from the ECHO database.\n input:\n card: object # the card to remove\n output: DeleteCardOutput # { card } snapshot of the removed card\n effects: [echo:write]\n```\n\n```mdl\nop deleteCardField\n desc: Removes a field projection from the View's schema; returns enough data to undo.\n input:\n view: View\n fieldId: string\n output: DeleteCardFieldOutput # { field, props, index }\n effects: [echo:write]\n requires: [AtomRegistry, Database]\n```\n\n```mdl\nop restoreCard\n desc: Undo counterpart to deleteCard \u2014 re-adds a previously removed card to the database.\n input:\n card: object # the card snapshot to restore\n output: void\n effects: [echo:write]\n```\n\n```mdl\nop restoreCardField\n desc: Undo counterpart to deleteCardField \u2014 re-inserts a field projection at its original index.\n input:\n view: View\n field: FieldSchema\n props: object # field properties\n index: number # position to restore at\n output: void\n effects: [echo:write]\n requires: [AtomRegistry, Database]\n```\n\n## Features\n\n```mdl\nfeat F-1: Board Layout\n\n req F-1.1: Columns are ordered by Arrangement.order; each column contains its cards in Arrangement.columns[value].ids order.\n req F-1.2: Cards within a column are rendered in the stored id order.\n req F-1.3:\n when: settings.hideUncategorized is true\n then: the uncategorized column is not rendered\n```\n\n```mdl\nfeat F-2: Drag and Drop\n\n req F-2.1:\n when: user drags a card to a different column\n then: card's pivot field is updated to the target column value; Arrangement updated\n\n req F-2.2:\n when: user drags a card within the same column\n then: card ids are reordered in Arrangement.columns[value].ids\n\n req F-2.3:\n when: user drags a column header\n then: Arrangement.order is updated to reflect the new column order\n```\n\n```mdl\nfeat F-3: Card Management\n\n req F-3.1:\n when: user clicks Add Card in a column\n then: a new ECHO object of the board's card type is created with the pivot field set to that column's value\n\n req F-3.2:\n when: user removes a card\n then: op:deleteCard runs; card is removed from the ECHO database and from the board\n\n req F-3.3:\n when: user undoes a delete-card action\n then: op:restoreCard re-adds the card; board reflects restored state\n```\n\n```mdl\nfeat F-4: Column Configuration\n\n req F-4.1:\n when: user opens KanbanSettings for a view-variant board\n then: column-field picker shows all single-select fields from the card schema\n\n req F-4.2:\n when: user selects a different column field\n then: View.projection.pivotFieldId is updated; board re-renders with new columns\n\n req F-4.3:\n when: user removes a column field\n then: op:deleteCardField removes the projection; op:restoreCardField can reverse it\n```\n\n```mdl\nfeat F-5: Item Source Variants\n\n req F-5.1:\n when: spec.kind === \"view\"\n then: items come from running the View's typename query against the ECHO database\n\n req F-5.2:\n when: spec.kind === \"items\"\n then: items come from spec.items (explicit ref array); used by externally-synced boards (e.g. Linear, GitHub)\n\n req F-5.3: Both variants share the same Arrangement persistence and drag-and-drop logic.\n```\n\n```mdl\nfeat F-6: ECHO Persistence and Collaboration\n\n req F-6.1: All Kanban, Arrangement, and card mutations are written to ECHO and replicated to peers.\n req F-6.2:\n when: a peer updates a card or moves it\n then: KanbanArticle re-renders reactively via AtomQuery / AtomObj subscriptions\n\n req F-6.3: View-variant kanbans own an associated View object that is hidden from the space browser.\n```\n\n```mdl\nfeat F-7: AI Blueprint\n\n req F-7.1: Plugin contributes a Kanban blueprint that lets an AI agent create and update kanban boards.\n req F-7.2:\n when: an AI agent calls the blueprint\n then: agent can create boards, place cards in columns, and update card fields\n```\n\n## Acceptance\n\n```mdl\ntest T-1: Create kanban board\n given: a space with a custom ECHO type that has a single-select field \"status\"\n when: user creates a new Kanban selecting that type and \"status\" as the pivot column\n then:\n - Kanban object written to ECHO with spec.kind === \"view\"\n - columns correspond to the \"status\" field's enum values\n - existing objects appear as cards in their respective columns\n```\n\n```mdl\ntest T-2: Drag card between columns\n given: a Kanban with columns \"todo\", \"in-progress\", \"done\" and a card in \"todo\"\n when: user drags the card to \"in-progress\"\n then:\n - card's \"status\" field updated to \"in-progress\"\n - Arrangement reflects card in \"in-progress\" column\n - change replicated to peers via ECHO\n```\n\n```mdl\ntest T-3: Reorder cards within a column\n given: a column with cards [A, B, C] in order\n when: user drags card C above card A\n then:\n - Arrangement.columns[\"col\"].ids === [C, A, B]\n - board renders in new order\n```\n\n```mdl\ntest T-4: Add card to column\n given: a board with a \"todo\" column\n when: user clicks Add Card in \"todo\"\n then:\n - new ECHO object created with pivot field set to \"todo\"\n - card appears at the bottom of the \"todo\" column\n```\n\n```mdl\ntest T-5: Delete and restore card\n given: a board with card X in column \"todo\"\n when: user deletes card X, then undoes\n then:\n - after delete: card X absent from board and ECHO database\n - after undo: card X restored to ECHO and reappears in \"todo\"\n```\n\n```mdl\ntest T-6: Hide uncategorized column\n given: a board with some cards that have no pivot value (uncategorized)\n when: user enables \"Hide uncategorized column\" in KanbanSettings\n then:\n - uncategorized column no longer rendered\n - Arrangement.columns[UNCATEGORIZED].hidden === true\n```\n\n```mdl\ntest T-7: Switch pivot column field\n given: a view-variant board currently pivoting on \"status\"\n when: user opens settings and selects \"priority\" as the column field\n then:\n - View.projection.pivotFieldId updated to \"priority\"\n - board re-renders with columns derived from \"priority\" enum values\n```\n\n---\n\n## Appendix: Extension Definitions\n\n```mdl\next type\n uri: org.dxos.mdl.type@1.0\n desc: A named data structure with typed fields and optional literals.\n fields:\n desc?: Prose\n fields?: FieldMap\n literals?: UnionList\n extends?: TypeRef[]\n```\n\n```mdl\next feat\n uri: org.dxos.mdl.feat@1.0\n desc: A named feature grouping one or more requirements.\n fields:\n desc?: Prose\n req: RequirementList\n nesting: self\n```\n\n```mdl\next test\n uri: org.dxos.mdl.test@1.0\n desc: An acceptance scenario expressed as given / when / then steps.\n fields:\n given?: Step | Step[]\n when?: Step | Step[]\n then: Step | Step[]\n tags?: TagList\n```\n\n```mdl\next component\n uri: org.dxos.mdl.component@1.0\n desc: A UI component with props, internal state, slots, actions, and events.\n fields:\n desc?: Prose\n props?: FieldMap\n state?: FieldMap\n slots?: FieldMap\n actions?: ActionMap\n emits?: EventMap\n layout?: CodeBlock\n```\n\n```mdl\next op\n uri: org.dxos.mdl.op@1.0\n desc: |\n A named operation with typed inputs, outputs, and declared errors.\n Pure ops have no effects or requires. Effectful ops declare both.\n fields:\n desc?: Prose\n input?: FieldMap\n output?: TypeExpr\n errors?: ErrorMap\n effects?: EffectList\n requires?: ServiceList\n note?: Prose\n```\n"],
5
+ "mappings": ";;;AAIA,SAASA,cAAc;AACvB,SAASC,iBAAiB;AAE1B,SAASC,qBAAqBC,cAAcC,kBAAkBC,cAAcC,oBAAoB;AAChG,SAASC,YAAY;AACrB,SAASC,oBAAoB;AAC7B,SAASC,cAAc;;;ACVvB;;;ADeO,IAAMC,eAAeC,OAAOC,OAAOC,IAAAA,EAAMC,KAC9CC,UAAUC,6BAA6B;EAAEC,UAAUC;AAAoB,CAAA,GACvEH,UAAUI,sBAAsB;EAAEF,UAAUG;AAAa,CAAA,GACzDL,UAAUM,0BAA0B;EAAEJ,UAAUK;AAAiB,CAAA,GACjEP,UAAUQ,sBAAsB;EAAEN,UAAUO;AAAa,CAAA,GACzDT,UAAUU,gBAAgB;EAAEC,QAAQ;IAACC,OAAOA;;AAAQ,CAAA,GACpDZ,UAAUa,iBAAiB;EAAEX,UAAUY;AAAa,CAAA,GACpDd,UAAUe,sBAAsB;EAAEC;AAAa,CAAA,GAC/ChB,UAAUiB,qBAAqB;EAC7BC,OAAO;IAAEC,UAAUrB,KAAKsB,QAAQC;IAAKC,MAAM;IAAcC,SAASC;IAAYC,UAAU;EAAoB;AAC9G,CAAA,GACA7B,OAAO8B,IAAI;AAGb,IAAA,uBAAe/B;",
6
+ "names": ["Plugin", "AppPlugin", "BlueprintDefinition", "CreateObject", "OperationHandler", "UndoMappings", "ReactSurface", "meta", "translations", "Kanban", "KanbanPlugin", "Plugin", "define", "meta", "pipe", "AppPlugin", "addBlueprintDefinitionModule", "activate", "BlueprintDefinition", "addCreateObjectModule", "CreateObject", "addOperationHandlerModule", "OperationHandler", "addUndoMappingsModule", "UndoMappings", "addSchemaModule", "schema", "Kanban", "addSurfaceModule", "ReactSurface", "addTranslationsModule", "translations", "addPluginAssetModule", "asset", "pluginId", "profile", "key", "path", "content", "pluginSpec", "mimeType", "make"]
7
7
  }
@@ -70,14 +70,14 @@ var KanbanSettings = ({ subject: object }) => {
70
70
  selectFields
71
71
  ]);
72
72
  const settingsSchema = isView ? KanbanViewSettingsSchema : KanbanSettingsSchema;
73
- return /* @__PURE__ */ React.createElement(Form.Root, {
73
+ return /* @__PURE__ */ React.createElement(Form.Section, null, /* @__PURE__ */ React.createElement(Form.Root, {
74
74
  schema: settingsSchema,
75
75
  values: initialValues,
76
76
  fieldMap,
77
77
  onValuesChanged: handleValuesChanged
78
- }, /* @__PURE__ */ React.createElement(Form.FieldSet, null));
78
+ }, /* @__PURE__ */ React.createElement(Form.FieldSet, null)));
79
79
  };
80
80
  export {
81
81
  KanbanSettings as default
82
82
  };
83
- //# sourceMappingURL=KanbanSettings-5WOS4CUE.mjs.map
83
+ //# sourceMappingURL=KanbanSettings-FTIIR6PR.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/containers/KanbanSettings/KanbanSettings.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Format } from '@dxos/echo/Format';\nimport { useObject, useType } from '@dxos/react-client/echo';\nimport { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';\nimport { getTypeURIFromQuery } from '@dxos/schema';\n\nimport { useProjectionModel } from '#hooks';\nimport { type Kanban, KanbanSettingsSchema, KanbanViewSettingsSchema, UNCATEGORIZED_VALUE } from '#types';\n\nexport type KanbanSettingsProps = AppSurface.ObjectPropertiesProps<Kanban.Kanban>;\n\n/**\n * Settings panel for a Kanban. Renders fields common to every kanban\n * (currently the \"Hide uncategorized column\" toggle); for view-variant\n * kanbans an additional \"Column field\" picker drives the View's pivot\n * field. Items-variant kanbans use a hardcoded `spec.pivotField`, so that\n * field is omitted there.\n */\nexport const KanbanSettings = ({ subject: object }: KanbanSettingsProps) => {\n const registry = useContext(RegistryContext);\n const db = Obj.getDatabase(object);\n const isView = object.spec.kind === 'view';\n const [view, updateView] = useObject(object.spec.kind === 'view' ? object.spec.view : undefined);\n const [, updateKanban] = useObject(object);\n const currentTypeUri = view?.query ? getTypeURIFromQuery(view.query.ast) : undefined;\n const schema = useType(db, currentTypeUri);\n const projection = useProjectionModel(schema, object, registry);\n\n const fieldProjections = projection?.getFieldProjections() ?? [];\n const selectFields = useMemo(\n () =>\n fieldProjections\n .filter((field) => field.props.format === Format.TypeFormat.SingleSelect)\n .map(({ field }) => ({ value: field.id, label: field.path })),\n [fieldProjections],\n );\n\n const hideUncategorized = object.arrangement.columns[UNCATEGORIZED_VALUE]?.hidden ?? false;\n\n const handleValuesChanged = useCallback(\n (values: Partial<{ columnFieldId: string; hideUncategorized: boolean }>) => {\n if (isView && values.columnFieldId != null) {\n updateView((view) => {\n view.projection.pivotFieldId = values.columnFieldId!;\n });\n }\n if (values.hideUncategorized !== undefined) {\n updateKanban((kanban) => {\n const existing = kanban.arrangement.columns[UNCATEGORIZED_VALUE];\n if (existing) {\n existing.hidden = values.hideUncategorized;\n } else {\n kanban.arrangement.columns[UNCATEGORIZED_VALUE] = {\n ids: [],\n hidden: values.hideUncategorized,\n };\n }\n });\n }\n },\n [isView, updateView, updateKanban],\n );\n\n const initialValues = useMemo(\n () => ({\n ...(isView ? { columnFieldId: view?.projection.pivotFieldId } : {}),\n hideUncategorized,\n }),\n [isView, view?.projection.pivotFieldId, hideUncategorized],\n );\n\n const fieldMap: FormFieldMap = useMemo(\n () => ({ columnFieldId: (props) => <SelectField {...props} options={selectFields} /> }),\n [selectFields],\n );\n\n // Schema is picked by `kanban.spec.kind` — they have different shapes,\n // so cast for `Form.Root`'s single-schema prop.\n const settingsSchema = (isView ? KanbanViewSettingsSchema : KanbanSettingsSchema) as any;\n\n return (\n <Form.Root schema={settingsSchema} values={initialValues} fieldMap={fieldMap} onValuesChanged={handleValuesChanged}>\n <Form.FieldSet />\n </Form.Root>\n );\n};\n"],
5
- "mappings": ";;;AAIA,SAASA,uBAAuB;AAChC,OAAOC,SAASC,aAAaC,YAAYC,eAAe;AAGxD,SAASC,WAAW;AACpB,SAASC,cAAc;AACvB,SAASC,WAAWC,eAAe;AACnC,SAASC,MAAyBC,mBAAmB;AACrD,SAASC,2BAA2B;AAEpC,SAASC,0BAA0B;AACnC,SAAsBC,sBAAsBC,0BAA0BC,2BAA2B;AAW1F,IAAMC,iBAAiB,CAAC,EAAEC,SAASC,OAAM,MAAuB;AACrE,QAAMC,WAAWhB,WAAWH,eAAAA;AAC5B,QAAMoB,KAAKf,IAAIgB,YAAYH,MAAAA;AAC3B,QAAMI,SAASJ,OAAOK,KAAKC,SAAS;AACpC,QAAM,CAACC,MAAMC,UAAAA,IAAcnB,UAAUW,OAAOK,KAAKC,SAAS,SAASN,OAAOK,KAAKE,OAAOE,MAAAA;AACtF,QAAM,CAAA,EAAGC,YAAAA,IAAgBrB,UAAUW,MAAAA;AACnC,QAAMW,iBAAiBJ,MAAMK,QAAQnB,oBAAoBc,KAAKK,MAAMC,GAAG,IAAIJ;AAC3E,QAAMK,SAASxB,QAAQY,IAAIS,cAAAA;AAC3B,QAAMI,aAAarB,mBAAmBoB,QAAQd,QAAQC,QAAAA;AAEtD,QAAMe,mBAAmBD,YAAYE,oBAAAA,KAAyB,CAAA;AAC9D,QAAMC,eAAehC,QACnB,MACE8B,iBACGG,OAAO,CAACC,UAAUA,MAAMC,MAAMC,WAAWlC,OAAOmC,WAAWC,YAAY,EACvEC,IAAI,CAAC,EAAEL,MAAK,OAAQ;IAAEM,OAAON,MAAMO;IAAIC,OAAOR,MAAMS;EAAK,EAAA,GAC9D;IAACb;GAAiB;AAGpB,QAAMc,oBAAoB9B,OAAO+B,YAAYC,QAAQnC,mBAAAA,GAAsBoC,UAAU;AAErF,QAAMC,sBAAsBlD,YAC1B,CAACmD,WAAAA;AACC,QAAI/B,UAAU+B,OAAOC,iBAAiB,MAAM;AAC1C5B,iBAAW,CAACD,UAAAA;AACVA,QAAAA,MAAKQ,WAAWsB,eAAeF,OAAOC;MACxC,CAAA;IACF;AACA,QAAID,OAAOL,sBAAsBrB,QAAW;AAC1CC,mBAAa,CAAC4B,WAAAA;AACZ,cAAMC,WAAWD,OAAOP,YAAYC,QAAQnC,mBAAAA;AAC5C,YAAI0C,UAAU;AACZA,mBAASN,SAASE,OAAOL;QAC3B,OAAO;AACLQ,iBAAOP,YAAYC,QAAQnC,mBAAAA,IAAuB;YAChD2C,KAAK,CAAA;YACLP,QAAQE,OAAOL;UACjB;QACF;MACF,CAAA;IACF;EACF,GACA;IAAC1B;IAAQI;IAAYE;GAAa;AAGpC,QAAM+B,gBAAgBvD,QACpB,OAAO;IACL,GAAIkB,SAAS;MAAEgC,eAAe7B,MAAMQ,WAAWsB;IAAa,IAAI,CAAC;IACjEP;EACF,IACA;IAAC1B;IAAQG,MAAMQ,WAAWsB;IAAcP;GAAkB;AAG5D,QAAMY,WAAyBxD,QAC7B,OAAO;IAAEkD,eAAe,CAACf,UAAU,sBAAA,cAAC7B,aAAAA;MAAa,GAAG6B;MAAOsB,SAASzB;;EAAiB,IACrF;IAACA;GAAa;AAKhB,QAAM0B,iBAAkBxC,SAASR,2BAA2BD;AAE5D,SACE,sBAAA,cAACJ,KAAKsD,MAAI;IAAC/B,QAAQ8B;IAAgBT,QAAQM;IAAeC;IAAoBI,iBAAiBZ;KAC7F,sBAAA,cAAC3C,KAAKwD,UAAQ,IAAA,CAAA;AAGpB;",
6
- "names": ["RegistryContext", "React", "useCallback", "useContext", "useMemo", "Obj", "Format", "useObject", "useType", "Form", "SelectField", "getTypeURIFromQuery", "useProjectionModel", "KanbanSettingsSchema", "KanbanViewSettingsSchema", "UNCATEGORIZED_VALUE", "KanbanSettings", "subject", "object", "registry", "db", "getDatabase", "isView", "spec", "kind", "view", "updateView", "undefined", "updateKanban", "currentTypeUri", "query", "ast", "schema", "projection", "fieldProjections", "getFieldProjections", "selectFields", "filter", "field", "props", "format", "TypeFormat", "SingleSelect", "map", "value", "id", "label", "path", "hideUncategorized", "arrangement", "columns", "hidden", "handleValuesChanged", "values", "columnFieldId", "pivotFieldId", "kanban", "existing", "ids", "initialValues", "fieldMap", "options", "settingsSchema", "Root", "onValuesChanged", "FieldSet"]
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport React, { useCallback, useContext, useMemo } from 'react';\n\nimport { type AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { Format } from '@dxos/echo/Format';\nimport { useObject, useType } from '@dxos/react-client/echo';\nimport { Form, type FormFieldMap, SelectField } from '@dxos/react-ui-form';\nimport { getTypeURIFromQuery } from '@dxos/schema';\n\nimport { useProjectionModel } from '#hooks';\nimport { type Kanban, KanbanSettingsSchema, KanbanViewSettingsSchema, UNCATEGORIZED_VALUE } from '#types';\n\nexport type KanbanSettingsProps = AppSurface.ObjectPropertiesProps<Kanban.Kanban>;\n\n/**\n * Settings panel for a Kanban. Renders fields common to every kanban\n * (currently the \"Hide uncategorized column\" toggle); for view-variant\n * kanbans an additional \"Column field\" picker drives the View's pivot\n * field. Items-variant kanbans use a hardcoded `spec.pivotField`, so that\n * field is omitted there.\n */\nexport const KanbanSettings = ({ subject: object }: KanbanSettingsProps) => {\n const registry = useContext(RegistryContext);\n const db = Obj.getDatabase(object);\n const isView = object.spec.kind === 'view';\n const [view, updateView] = useObject(object.spec.kind === 'view' ? object.spec.view : undefined);\n const [, updateKanban] = useObject(object);\n const currentTypeUri = view?.query ? getTypeURIFromQuery(view.query.ast) : undefined;\n const schema = useType(db, currentTypeUri);\n const projection = useProjectionModel(schema, object, registry);\n\n const fieldProjections = projection?.getFieldProjections() ?? [];\n const selectFields = useMemo(\n () =>\n fieldProjections\n .filter((field) => field.props.format === Format.TypeFormat.SingleSelect)\n .map(({ field }) => ({ value: field.id, label: field.path })),\n [fieldProjections],\n );\n\n const hideUncategorized = object.arrangement.columns[UNCATEGORIZED_VALUE]?.hidden ?? false;\n\n const handleValuesChanged = useCallback(\n (values: Partial<{ columnFieldId: string; hideUncategorized: boolean }>) => {\n if (isView && values.columnFieldId != null) {\n updateView((view) => {\n view.projection.pivotFieldId = values.columnFieldId!;\n });\n }\n if (values.hideUncategorized !== undefined) {\n updateKanban((kanban) => {\n const existing = kanban.arrangement.columns[UNCATEGORIZED_VALUE];\n if (existing) {\n existing.hidden = values.hideUncategorized;\n } else {\n kanban.arrangement.columns[UNCATEGORIZED_VALUE] = {\n ids: [],\n hidden: values.hideUncategorized,\n };\n }\n });\n }\n },\n [isView, updateView, updateKanban],\n );\n\n const initialValues = useMemo(\n () => ({\n ...(isView ? { columnFieldId: view?.projection.pivotFieldId } : {}),\n hideUncategorized,\n }),\n [isView, view?.projection.pivotFieldId, hideUncategorized],\n );\n\n const fieldMap: FormFieldMap = useMemo(\n () => ({ columnFieldId: (props) => <SelectField {...props} options={selectFields} /> }),\n [selectFields],\n );\n\n // Schema is picked by `kanban.spec.kind` — they have different shapes,\n // so cast for `Form.Root`'s single-schema prop.\n const settingsSchema = (isView ? KanbanViewSettingsSchema : KanbanSettingsSchema) as any;\n\n return (\n <Form.Section>\n <Form.Root\n schema={settingsSchema}\n values={initialValues}\n fieldMap={fieldMap}\n onValuesChanged={handleValuesChanged}\n >\n <Form.FieldSet />\n </Form.Root>\n </Form.Section>\n );\n};\n"],
5
+ "mappings": ";;;AAIA,SAASA,uBAAuB;AAChC,OAAOC,SAASC,aAAaC,YAAYC,eAAe;AAGxD,SAASC,WAAW;AACpB,SAASC,cAAc;AACvB,SAASC,WAAWC,eAAe;AACnC,SAASC,MAAyBC,mBAAmB;AACrD,SAASC,2BAA2B;AAEpC,SAASC,0BAA0B;AACnC,SAAsBC,sBAAsBC,0BAA0BC,2BAA2B;AAW1F,IAAMC,iBAAiB,CAAC,EAAEC,SAASC,OAAM,MAAuB;AACrE,QAAMC,WAAWhB,WAAWH,eAAAA;AAC5B,QAAMoB,KAAKf,IAAIgB,YAAYH,MAAAA;AAC3B,QAAMI,SAASJ,OAAOK,KAAKC,SAAS;AACpC,QAAM,CAACC,MAAMC,UAAAA,IAAcnB,UAAUW,OAAOK,KAAKC,SAAS,SAASN,OAAOK,KAAKE,OAAOE,MAAAA;AACtF,QAAM,CAAA,EAAGC,YAAAA,IAAgBrB,UAAUW,MAAAA;AACnC,QAAMW,iBAAiBJ,MAAMK,QAAQnB,oBAAoBc,KAAKK,MAAMC,GAAG,IAAIJ;AAC3E,QAAMK,SAASxB,QAAQY,IAAIS,cAAAA;AAC3B,QAAMI,aAAarB,mBAAmBoB,QAAQd,QAAQC,QAAAA;AAEtD,QAAMe,mBAAmBD,YAAYE,oBAAAA,KAAyB,CAAA;AAC9D,QAAMC,eAAehC,QACnB,MACE8B,iBACGG,OAAO,CAACC,UAAUA,MAAMC,MAAMC,WAAWlC,OAAOmC,WAAWC,YAAY,EACvEC,IAAI,CAAC,EAAEL,MAAK,OAAQ;IAAEM,OAAON,MAAMO;IAAIC,OAAOR,MAAMS;EAAK,EAAA,GAC9D;IAACb;GAAiB;AAGpB,QAAMc,oBAAoB9B,OAAO+B,YAAYC,QAAQnC,mBAAAA,GAAsBoC,UAAU;AAErF,QAAMC,sBAAsBlD,YAC1B,CAACmD,WAAAA;AACC,QAAI/B,UAAU+B,OAAOC,iBAAiB,MAAM;AAC1C5B,iBAAW,CAACD,UAAAA;AACVA,QAAAA,MAAKQ,WAAWsB,eAAeF,OAAOC;MACxC,CAAA;IACF;AACA,QAAID,OAAOL,sBAAsBrB,QAAW;AAC1CC,mBAAa,CAAC4B,WAAAA;AACZ,cAAMC,WAAWD,OAAOP,YAAYC,QAAQnC,mBAAAA;AAC5C,YAAI0C,UAAU;AACZA,mBAASN,SAASE,OAAOL;QAC3B,OAAO;AACLQ,iBAAOP,YAAYC,QAAQnC,mBAAAA,IAAuB;YAChD2C,KAAK,CAAA;YACLP,QAAQE,OAAOL;UACjB;QACF;MACF,CAAA;IACF;EACF,GACA;IAAC1B;IAAQI;IAAYE;GAAa;AAGpC,QAAM+B,gBAAgBvD,QACpB,OAAO;IACL,GAAIkB,SAAS;MAAEgC,eAAe7B,MAAMQ,WAAWsB;IAAa,IAAI,CAAC;IACjEP;EACF,IACA;IAAC1B;IAAQG,MAAMQ,WAAWsB;IAAcP;GAAkB;AAG5D,QAAMY,WAAyBxD,QAC7B,OAAO;IAAEkD,eAAe,CAACf,UAAU,sBAAA,cAAC7B,aAAAA;MAAa,GAAG6B;MAAOsB,SAASzB;;EAAiB,IACrF;IAACA;GAAa;AAKhB,QAAM0B,iBAAkBxC,SAASR,2BAA2BD;AAE5D,SACE,sBAAA,cAACJ,KAAKsD,SAAO,MACX,sBAAA,cAACtD,KAAKuD,MAAI;IACRhC,QAAQ8B;IACRT,QAAQM;IACRC;IACAK,iBAAiBb;KAEjB,sBAAA,cAAC3C,KAAKyD,UAAQ,IAAA,CAAA,CAAA;AAItB;",
6
+ "names": ["RegistryContext", "React", "useCallback", "useContext", "useMemo", "Obj", "Format", "useObject", "useType", "Form", "SelectField", "getTypeURIFromQuery", "useProjectionModel", "KanbanSettingsSchema", "KanbanViewSettingsSchema", "UNCATEGORIZED_VALUE", "KanbanSettings", "subject", "object", "registry", "db", "getDatabase", "isView", "spec", "kind", "view", "updateView", "undefined", "updateKanban", "currentTypeUri", "query", "ast", "schema", "projection", "fieldProjections", "getFieldProjections", "selectFields", "filter", "field", "props", "format", "TypeFormat", "SingleSelect", "map", "value", "id", "label", "path", "hideUncategorized", "arrangement", "columns", "hidden", "handleValuesChanged", "values", "columnFieldId", "pivotFieldId", "kanban", "existing", "ids", "initialValues", "fieldMap", "options", "settingsSchema", "Section", "Root", "onValuesChanged", "FieldSet"]
7
7
  }
@@ -5,8 +5,8 @@ import { Capability } from "@dxos/app-framework";
5
5
  var BlueprintDefinition = Capability.lazy("BlueprintDefinition", () => import("../blueprint-definition-6DV3Q5MC.mjs"));
6
6
  var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-DKBSI46K.mjs"));
7
7
  var OperationHandler = Capability.lazy("OperationHandler", () => import("../operation-handler-B7IW6MXU.mjs"));
8
- var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-VZEVEJL5.mjs"));
9
- var UndoMappings = Capability.lazy("UndoMappings", () => import("../undo-mappings-6CHW6BOF.mjs"));
8
+ var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-5Y6IHGKR.mjs"));
9
+ var UndoMappings = Capability.lazy("UndoMappings", () => import("../undo-mappings-EZTHO4UL.mjs"));
10
10
  export {
11
11
  BlueprintDefinition,
12
12
  CreateObject,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/capabilities/index.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\nimport { type AppCapabilities } from '@dxos/app-toolkit';\nimport type { OperationHandlerSet } from '@dxos/compute';\n\n// The contributed capability type references Blueprint types from @dxos/compute, so the lazy\n// wrapper needs an explicit annotation to keep the inferred type portable (TS2883).\nexport const BlueprintDefinition: Capability.LazyCapability<\n void,\n Capability.Capability<typeof AppCapabilities.BlueprintDefinition>[]\n> = Capability.lazy('BlueprintDefinition', () => import('./blueprint-definition'));\nexport const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));\nexport const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(\n 'OperationHandler',\n () => import('./operation-handler'),\n);\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\nexport const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));\n"],
5
- "mappings": ";;;AAIA,SAASA,kBAAkB;AAMpB,IAAMC,sBAGTD,WAAWE,KAAK,uBAAuB,MAAM,OAAO,sCAAA,CAAA;AACjD,IAAMC,eAAeH,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAME,mBAAmBJ,WAAWE,KACzC,oBACA,MAAM,OAAO,mCAAA,CAAA;AAER,IAAMG,eAAeL,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAMI,eAAeN,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;",
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\nimport type { OperationHandlerSet } from '@dxos/compute';\n\nexport const BlueprintDefinition = Capability.lazy('BlueprintDefinition', () => import('./blueprint-definition'));\nexport const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));\nexport const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(\n 'OperationHandler',\n () => import('./operation-handler'),\n);\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\nexport const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));\n"],
5
+ "mappings": ";;;AAIA,SAASA,kBAAkB;AAGpB,IAAMC,sBAAsBD,WAAWE,KAAK,uBAAuB,MAAM,OAAO,sCAAA,CAAA;AAChF,IAAMC,eAAeH,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAME,mBAAmBJ,WAAWE,KACzC,oBACA,MAAM,OAAO,mCAAA,CAAA;AAER,IAAMG,eAAeL,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAMI,eAAeN,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;",
6
6
  "names": ["Capability", "BlueprintDefinition", "lazy", "CreateObject", "OperationHandler", "ReactSurface", "UndoMappings"]
7
7
  }
@@ -0,0 +1,50 @@
1
+ // src/meta.ts
2
+ import { Plugin } from "@dxos/app-framework";
3
+
4
+ // dx.config.ts
5
+ import { Config2 } from "@dxos/app-framework/config";
6
+ import { trim } from "@dxos/util";
7
+ var dx_config_default = Config2.make({
8
+ plugin: {
9
+ key: "org.dxos.plugin.kanban",
10
+ name: "Kanban",
11
+ author: "DXOS",
12
+ description: trim`
13
+ Visual project management using customizable kanban boards to track workflow progress.
14
+ Organize any ECHO type into drag-and-drop columns defined by a single-select field, move cards
15
+ between stages, and reorder both columns and cards — all changes are persisted to ECHO and
16
+ replicated to collaborators in real time.
17
+
18
+ Kanban boards come in two variants: view-variant boards source their cards through a linked
19
+ View query (any ECHO type can be pivoted on a single-select field), while items-variant boards
20
+ own their cards explicitly and are used by external sync integrations such as Linear or GitHub.
21
+ Both variants share the same arrangement storage and drag-and-drop mechanics.
22
+
23
+ Board settings let users choose which single-select field drives the column layout and
24
+ optionally hide the uncategorized column for items that have no pivot value.
25
+ Field-level undo support allows deleted card fields to be restored without data loss.
26
+
27
+ The plugin contributes a Kanban blueprint that exposes board creation and card management
28
+ to AI agents, enabling automated project tracking workflows.
29
+ `,
30
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban",
31
+ icon: {
32
+ key: "ph--kanban--regular",
33
+ hue: "green"
34
+ },
35
+ spec: "PLUGIN.mdl",
36
+ screenshots: [
37
+ {
38
+ dark: "https://dxos.network/plugin-details-kanban-dark.png"
39
+ }
40
+ ]
41
+ }
42
+ });
43
+
44
+ // src/meta.ts
45
+ var meta = Plugin.getMetaFromConfig(dx_config_default);
46
+
47
+ export {
48
+ meta
49
+ };
50
+ //# sourceMappingURL=chunk-2IGEE5J5.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts", "../../../dx.config.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.kanban',\n name: 'Kanban',\n author: 'DXOS',\n description: trim`\n Visual project management using customizable kanban boards to track workflow progress.\n Organize any ECHO type into drag-and-drop columns defined by a single-select field, move cards\n between stages, and reorder both columns and cards — all changes are persisted to ECHO and\n replicated to collaborators in real time.\n\n Kanban boards come in two variants: view-variant boards source their cards through a linked\n View query (any ECHO type can be pivoted on a single-select field), while items-variant boards\n own their cards explicitly and are used by external sync integrations such as Linear or GitHub.\n Both variants share the same arrangement storage and drag-and-drop mechanics.\n\n Board settings let users choose which single-select field drives the column layout and\n optionally hide the uncategorized column for items that have no pivot value.\n Field-level undo support allows deleted card fields to be restored without data loss.\n\n The plugin contributes a Kanban blueprint that exposes board creation and card management\n to AI agents, enabling automated project tracking workflows.\n `,\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-kanban',\n icon: { key: 'ph--kanban--regular', hue: 'green' },\n spec: 'PLUGIN.mdl',\n screenshots: [{ dark: 'https://dxos.network/plugin-details-kanban-dark.png' }],\n },\n});\n"],
5
+ "mappings": ";AAIA,SAASA,cAAc;;;ACAvB,SAASC,eAAe;AACxB,SAASC,YAAY;AAErB,IAAA,oBAAeD,QAAQE,KAAK;EAC1BC,QAAQ;IACNC,KAAK;IACLC,MAAM;IACNC,QAAQ;IACRC,aAAaN;;;;;;;;;;;;;;;;;;IAkBbO,QAAQ;IACRC,MAAM;MAAEL,KAAK;MAAuBM,KAAK;IAAQ;IACjDC,MAAM;IACNC,aAAa;MAAC;QAAEC,MAAM;MAAsD;;EAC9E;AACF,CAAA;;;AD3BO,IAAMC,OAAOC,OAAOC,kBAAkBC,iBAAAA;",
6
+ "names": ["Plugin", "Config2", "trim", "make", "plugin", "key", "name", "author", "description", "source", "icon", "hue", "spec", "screenshots", "dark", "meta", "Plugin", "getMetaFromConfig", "config"]
7
+ }
@@ -0,0 +1,8 @@
1
+ // src/operations/index.ts
2
+ import { OperationHandlerSet } from "@dxos/compute";
3
+ var KanbanOperationHandlerSet = OperationHandlerSet.lazy(() => import("./delete-card-NMULYEXS.mjs"), () => import("./delete-card-field-NGYNI6GL.mjs"), () => import("./restore-card-JQ5N7G6G.mjs"), () => import("./restore-card-field-4SU6IR4V.mjs"));
4
+
5
+ export {
6
+ KanbanOperationHandlerSet
7
+ };
8
+ //# sourceMappingURL=chunk-NDJNHR4K.mjs.map
@@ -151,7 +151,7 @@ import { Capability } from "@dxos/app-framework";
151
151
  import { Operation } from "@dxos/compute";
152
152
  import { Type as Type2, View as View2, DXN as DXN2 } from "@dxos/echo";
153
153
  import { meta } from "#meta";
154
- var makeKey = (name) => DXN2.make(`${meta.id}.operation.${name}`);
154
+ var makeKey = (name) => DXN2.make(`${meta.profile.key}.operation.${name}`);
155
155
  var DeleteCardFieldOutput = Schema3.Struct({
156
156
  field: View2.FieldSchema.annotations({
157
157
  description: "The deleted field schema."
@@ -243,4 +243,4 @@ export {
243
243
  Kanban_exports,
244
244
  KanbanOperation_exports
245
245
  };
246
- //# sourceMappingURL=chunk-DAKIZO46.mjs.map
246
+ //# sourceMappingURL=chunk-Y2G24ZGD.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"]
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.profile.key}.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", "profile", "key", "DeleteCardFieldOutput", "Struct", "field", "FieldSchema", "annotations", "description", "props", "Any", "index", "Number", "DeleteCardField", "icon", "services", "Service", "input", "view", "getSchema", "fieldId", "String", "output", "DeleteCardOutput", "card", "DeleteCard", "RestoreCardField", "Void", "RestoreCard"]
7
7
  }
@@ -38,13 +38,13 @@ import React, { forwardRef, useCallback, useMemo, useState } from "react";
38
38
  import { Surface } from "@dxos/app-framework/ui";
39
39
  import { AppSurface, useObjectMenuItems } from "@dxos/app-toolkit/ui";
40
40
  import { Obj } from "@dxos/echo";
41
- import { Card, Toolbar, useTranslation } from "@dxos/react-ui";
41
+ import { Card, IconButton, useTranslation } from "@dxos/react-ui";
42
42
  import { Menu, createMenuAction } from "@dxos/react-ui-menu";
43
43
  import { Focus, Mosaic, useBoard } from "@dxos/react-ui-mosaic";
44
44
  import { meta } from "#meta";
45
45
  var KANBAN_CARD_TILE_NAME = "KanbanBoard.Card";
46
46
  var KanbanCard = /* @__PURE__ */ forwardRef(({ data, location, debug, draggable }, forwardedRef) => {
47
- const { t } = useTranslation(meta.id);
47
+ const { t } = useTranslation(meta.profile.key);
48
48
  const { model } = useBoard(KANBAN_CARD_TILE_NAME);
49
49
  const { projection, columnFieldPath, onCardRemove } = useKanbanBoard(KANBAN_CARD_TILE_NAME);
50
50
  const [dragHandle, setDragHandle] = useState(null);
@@ -82,18 +82,20 @@ var KanbanCard = /* @__PURE__ */ forwardRef(({ data, location, debug, draggable
82
82
  testId: "mosaicBoard.cardDragHandle"
83
83
  }), /* @__PURE__ */ React.createElement(Card.Title, {
84
84
  "data-testid": "mosaicBoard.cardTitle"
85
- }, Obj.getLabel(data)), /* @__PURE__ */ React.createElement(Menu.Trigger, {
85
+ }, Obj.getLabel(data)), /* @__PURE__ */ React.createElement(Card.Block, {
86
+ end: true
87
+ }, /* @__PURE__ */ React.createElement(Menu.Trigger, {
86
88
  asChild: true,
87
89
  disabled: !menuItems?.length
88
- }, /* @__PURE__ */ React.createElement(Toolbar.IconButton, {
90
+ }, /* @__PURE__ */ React.createElement(IconButton, {
89
91
  iconOnly: true,
90
92
  variant: "ghost",
91
93
  icon: "ph--dots-three-vertical--regular",
92
94
  label: t("action-menu.label")
93
95
  })), /* @__PURE__ */ React.createElement(Menu.Content, {
94
96
  items: menuItems
95
- })), /* @__PURE__ */ React.createElement(Card.Body, null, projection && /* @__PURE__ */ React.createElement(Surface.Surface, {
96
- type: AppSurface.Card,
97
+ }))), /* @__PURE__ */ React.createElement(Card.Body, null, projection && /* @__PURE__ */ React.createElement(Surface.Surface, {
98
+ type: AppSurface.CardContent,
97
99
  limit: 1,
98
100
  data: {
99
101
  subject: data,
@@ -156,7 +158,7 @@ KanbanColumn.displayName = KANBAN_COLUMN_NAME;
156
158
  var KANBAN_BOARD_ROOT = "KanbanBoard.Root";
157
159
  var KanbanBoardRoot = ({ children, kanban, projection, items, change, itemTile = KanbanCard, onCardAdd, onCardRemove }) => {
158
160
  const registry = useContext(RegistryContext);
159
- const { t } = useTranslation2(meta2.id);
161
+ const { t } = useTranslation2(meta2.profile.key);
160
162
  const model = useKanbanBoardModel(kanban, projection, items, registry);
161
163
  const columns = model?.getColumns?.() ?? [];
162
164
  const view = kanban?.spec.kind === "view" ? kanban.spec.view.target : void 0;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"]
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.profile.key);\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, IconButton, 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.profile.key);\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 <Card.Block end>\n <Menu.Trigger asChild disabled={!menuItems?.length}>\n <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.Block>\n </Card.Header>\n <Card.Body>\n {projection && (\n <Surface.Surface\n type={AppSurface.CardContent}\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", "IconButton", "useTranslation", "Menu", "createMenuAction", "Focus", "Mosaic", "useBoard", "meta", "KANBAN_CARD_TILE_NAME", "KanbanCard", "forwardRef", "data", "location", "debug", "draggable", "forwardedRef", "t", "useTranslation", "meta", "profile", "key", "model", "useBoard", "projection", "columnFieldPath", "onCardRemove", "useKanbanBoard", "dragHandle", "setDragHandle", "useState", "dragHandleRef", "useCallback", "el", "objectMenuItems", "useObjectMenuItems", "menuItems", "useMemo", "createMenuAction", "label", "icon", "Menu", "Root", "Mosaic", "Tile", "asChild", "id", "getItemId", "Focus", "Item", "Card", "ref", "data-testid", "Header", "DragHandle", "testId", "Title", "Obj", "getLabel", "Block", "end", "Trigger", "disabled", "length", "IconButton", "iconOnly", "variant", "Content", "items", "Body", "Surface", "type", "AppSurface", "CardContent", "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", "profile", "key", "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", "id", "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
7
  }