@pstdio/ui 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/dist/{MermaidComponent-DBJsTOmj.js → MermaidComponent-BCMQqPqu.js} +11 -11
  2. package/dist/{MermaidComponent-DBJsTOmj.js.map → MermaidComponent-BCMQqPqu.js.map} +1 -1
  3. package/dist/browser-storage-BinyFNJX.js +40 -0
  4. package/dist/browser-storage-BinyFNJX.js.map +1 -0
  5. package/dist/chat-ui.js +1188 -1147
  6. package/dist/chat-ui.js.map +1 -1
  7. package/dist/checkbox-D5AzFRlb.js +70 -0
  8. package/dist/checkbox-D5AzFRlb.js.map +1 -0
  9. package/dist/components/chat-ui/components/ai-conversation.d.ts +1 -1
  10. package/dist/components/chat-ui/components/ai-message.d.ts +1 -1
  11. package/dist/components/chat-ui/components/ai-response.d.ts +0 -1
  12. package/dist/components/chat-ui/components/attachment-list.d.ts +1 -1
  13. package/dist/components/chat-ui/components/auto-scroll.d.ts +27 -0
  14. package/dist/components/chat-ui/components/chat-message-animation.d.ts +22 -0
  15. package/dist/components/chat-ui/components/timeline.d.ts +0 -2
  16. package/dist/components/chat-ui/performance/chat-performance-fixtures.d.ts +0 -1
  17. package/dist/components/chat-ui/tool-rendering/build-timeline.d.ts +2 -12
  18. package/dist/components/chat-ui/tool-rendering/shared.d.ts +1 -1
  19. package/dist/components/chat-ui/tool-rendering/types.d.ts +1 -2
  20. package/dist/components/command-palette/index.d.ts +4 -0
  21. package/dist/components/data-renderer/data-renderer-board.d.ts +1 -1
  22. package/dist/components/data-renderer/data-renderer-card.d.ts +1 -1
  23. package/dist/components/data-renderer/data-renderer-list.d.ts +1 -1
  24. package/dist/components/data-renderer/data-renderer.d.ts +1 -1
  25. package/dist/components/data-renderer/index.d.ts +18 -0
  26. package/dist/components/data-renderer/types.d.ts +0 -6
  27. package/dist/components/diff-viewer/diff-card.d.ts +1 -0
  28. package/dist/components/diff-viewer/diff-drawer-scroll.d.ts +0 -19
  29. package/dist/components/diff-viewer/diff-drawer.d.ts +1 -0
  30. package/dist/components/diff-viewer/index.d.ts +2 -0
  31. package/dist/components/diff-viewer/use-selected-diff-scroll.d.ts +7 -3
  32. package/dist/components/internal/style-guide.d.ts +14 -0
  33. package/dist/components/internal/token-editor-controls.d.ts +8 -0
  34. package/dist/components/internal/token-editor-data.d.ts +40 -0
  35. package/dist/components/internal/token-editor-state.d.ts +22 -0
  36. package/dist/components/layout/index.d.ts +6 -0
  37. package/dist/components/list-row/list-row.types.d.ts +1 -1
  38. package/dist/components/overlays/index.d.ts +12 -0
  39. package/dist/components/{search-modal-content.d.ts → overlays/search-modal-content.d.ts} +1 -1
  40. package/dist/components/{searchable-menu.d.ts → overlays/searchable-menu.d.ts} +1 -1
  41. package/dist/components/param-editor/index.d.ts +23 -0
  42. package/dist/components/param-editor/inputs/action-input.d.ts +13 -0
  43. package/dist/components/param-editor/inputs/anchor-grid-input.d.ts +12 -0
  44. package/dist/components/param-editor/inputs/anchor-grid.d.ts +4 -0
  45. package/dist/components/param-editor/inputs/file-accept.d.ts +22 -0
  46. package/dist/components/param-editor/inputs/file-drop-input.d.ts +14 -0
  47. package/dist/components/param-editor/inputs/numeric-value.d.ts +6 -0
  48. package/dist/components/param-editor/inputs/range-input.d.ts +17 -0
  49. package/dist/components/param-editor/inputs/range-value.d.ts +5 -0
  50. package/dist/components/param-editor/inputs/resource-input-chips.d.ts +15 -0
  51. package/dist/components/param-editor/inputs/resource-input.d.ts +18 -0
  52. package/dist/components/param-editor/inputs/segmented-input.d.ts +14 -0
  53. package/dist/components/param-editor/inputs/slider-marks.d.ts +5 -0
  54. package/dist/components/param-editor/inputs/vector-input.d.ts +17 -0
  55. package/dist/components/param-editor/inputs/vector-value.d.ts +7 -0
  56. package/dist/components/param-editor/param-editor-control-item.d.ts +15 -0
  57. package/dist/components/param-editor/param-editor-control-list.d.ts +5 -0
  58. package/dist/components/param-editor/param-editor-field-label.d.ts +1 -0
  59. package/dist/components/param-editor/param-editor-field.d.ts +11 -0
  60. package/dist/components/param-editor/param-editor-inline-group.d.ts +5 -0
  61. package/dist/components/param-editor/param-editor-section.d.ts +16 -0
  62. package/dist/components/param-editor/param-editor.d.ts +2 -1
  63. package/dist/components/param-editor/param-editor.types.d.ts +101 -19
  64. package/dist/components/{breadcrumb.d.ts → primitives/breadcrumb.d.ts} +1 -1
  65. package/dist/components/primitives/index.d.ts +28 -0
  66. package/dist/components/{number-input.d.ts → primitives/number-input.d.ts} +0 -2
  67. package/dist/components/{session-indicator.d.ts → primitives/session-indicator.d.ts} +2 -1
  68. package/dist/components/{tooltip.d.ts → primitives/tooltip.d.ts} +0 -1
  69. package/dist/components/rich-text/prompt-input/commands.d.ts +0 -17
  70. package/dist/components/rich-text/prompt-input/events.d.ts +0 -13
  71. package/dist/components/rich-text/prompt-input/plugins/CommentPlugin/nodes/CommentNode/CommentNode.d.ts +1 -2
  72. package/dist/components/rich-text/prompt-input/plugins/ReferencePlugin/nodes/ReferenceNode/ReferenceNode.d.ts +1 -2
  73. package/dist/components/rich-text/prompt-input/utils.d.ts +1 -2
  74. package/dist/components/rich-text/shared/plugins/MermaidPlugin/MermaidNode.d.ts +0 -1
  75. package/dist/components/rich-text/utils/inferResourceType.d.ts +1 -1
  76. package/dist/components/sidebar/sidebar.types.d.ts +1 -1
  77. package/dist/components/tab-strip/tab-visibility-filter.d.ts +1 -1
  78. package/dist/components/tag-editor/tag-editor-row.d.ts +1 -1
  79. package/dist/components/tag-editor/tag-editor.types.d.ts +1 -1
  80. package/dist/components/terminal/bind-session.d.ts +33 -0
  81. package/dist/components/terminal/index.d.ts +6 -0
  82. package/dist/components/terminal/scripted-bridge.d.ts +35 -0
  83. package/dist/components/terminal/terminal-contract.d.ts +22 -0
  84. package/dist/components/terminal/terminal-theme.d.ts +12 -0
  85. package/dist/components/terminal/terminal.d.ts +45 -0
  86. package/dist/components/terminal/types.d.ts +35 -0
  87. package/dist/components/terminal/use-terminal-session.d.ts +21 -0
  88. package/dist/components/tree-list/tree-list-order-filter.d.ts +1 -2
  89. package/dist/components/tree-list/tree-list-visibility-filter.d.ts +1 -1
  90. package/dist/components/tree-list/tree-list.d.ts +1 -1
  91. package/dist/data-renderer.js +1669 -0
  92. package/dist/data-renderer.js.map +1 -0
  93. package/dist/diff-editor-BnfV8cYB.js +182 -0
  94. package/dist/diff-editor-BnfV8cYB.js.map +1 -0
  95. package/dist/diff.js +1313 -0
  96. package/dist/diff.js.map +1 -0
  97. package/dist/empty-state-Bo4HVrgr.js +34 -0
  98. package/dist/empty-state-Bo4HVrgr.js.map +1 -0
  99. package/dist/foundations/gallery/gallery-frame.d.ts +21 -0
  100. package/dist/foundations/gallery/sections/badges-section.d.ts +1 -0
  101. package/dist/foundations/gallery/sections/buttons-section.d.ts +1 -0
  102. package/dist/foundations/gallery/sections/composite-chat-section.d.ts +1 -0
  103. package/dist/foundations/gallery/sections/composites-section.d.ts +1 -0
  104. package/dist/foundations/gallery/sections/feedback-section.d.ts +1 -0
  105. package/dist/foundations/gallery/sections/input-authoring-card.d.ts +1 -0
  106. package/dist/foundations/gallery/sections/inputs-section.d.ts +1 -0
  107. package/dist/foundations/gallery/sections/layout-section.d.ts +1 -0
  108. package/dist/foundations/gallery/sections/navigation-identity-section.d.ts +1 -0
  109. package/dist/foundations/gallery/sections/overlays-section.d.ts +1 -0
  110. package/dist/foundations/gallery/sections/panels-section.d.ts +1 -0
  111. package/dist/foundations/gallery/sections/param-editor-composite-card.d.ts +1 -0
  112. package/dist/foundations/gallery/sections/settings-composite-cards.d.ts +1 -0
  113. package/dist/index.d.ts +11 -84
  114. package/dist/index.js +3570 -7569
  115. package/dist/index.js.map +1 -1
  116. package/dist/list-row-mi3Hn-Um.js +740 -0
  117. package/dist/list-row-mi3Hn-Um.js.map +1 -0
  118. package/dist/mermaid-renderer-DZo3qj6D.js +425 -0
  119. package/dist/mermaid-renderer-DZo3qj6D.js.map +1 -0
  120. package/dist/mermaid.js +5 -0
  121. package/dist/mermaid.js.map +1 -0
  122. package/dist/radio-cLMEBBZk.js +76 -0
  123. package/dist/radio-cLMEBBZk.js.map +1 -0
  124. package/dist/resource-badge-qCWHP-wQ.js +99 -0
  125. package/dist/resource-badge-qCWHP-wQ.js.map +1 -0
  126. package/dist/{rich-message-DNSEhxXh.js → rich-message-DBf_5YlW.js} +462 -481
  127. package/dist/rich-message-DBf_5YlW.js.map +1 -0
  128. package/dist/rich-text.js +300 -299
  129. package/dist/rich-text.js.map +1 -1
  130. package/dist/scroll-area-BMbg1WcD.js +91 -0
  131. package/dist/scroll-area-BMbg1WcD.js.map +1 -0
  132. package/dist/style.css +1 -1
  133. package/dist/terminal.js +339 -0
  134. package/dist/terminal.js.map +1 -0
  135. package/dist/theme/global.d.ts +3 -0
  136. package/dist/theme/recipes/badge.d.ts +50 -0
  137. package/dist/theme/recipes/button.d.ts +24 -19
  138. package/dist/theme/recipes/color-picker.d.ts +1 -0
  139. package/dist/theme/recipes/dialog.d.ts +1 -1
  140. package/dist/theme/recipes/drawer.d.ts +1 -1
  141. package/dist/theme/recipes/input.d.ts +55 -0
  142. package/dist/theme/recipes/number-input.d.ts +98 -0
  143. package/dist/theme/recipes/tabs.d.ts +49 -28
  144. package/dist/theme/recipes/textarea.d.ts +62 -1
  145. package/dist/theme/recipes/timeline.d.ts +74 -0
  146. package/dist/theme/tokens/borders.d.ts +0 -3
  147. package/dist/theme/tokens/colors.d.ts +100 -70
  148. package/dist/{theme-25P7ij4C.js → theme-CJBYBJaA.js} +1194 -315
  149. package/dist/theme-CJBYBJaA.js.map +1 -0
  150. package/dist/theme-preference-DOzHx64J.js +123 -0
  151. package/dist/theme-preference-DOzHx64J.js.map +1 -0
  152. package/dist/theme.js +1 -1
  153. package/dist/tree-list-CcuZMLS5.js +930 -0
  154. package/dist/tree-list-CcuZMLS5.js.map +1 -0
  155. package/dist/workspace-badge-Fuo-1zPj.js +314 -0
  156. package/dist/workspace-badge-Fuo-1zPj.js.map +1 -0
  157. package/package.json +23 -3
  158. package/dist/components/file-tree-helpers.d.ts +0 -8
  159. package/dist/components/open-source-notices-screen.d.ts +0 -20
  160. package/dist/components/param-editor/input-group.d.ts +0 -10
  161. package/dist/components/rich-text/shared/plugins/MermaidPlugin/index.d.ts +0 -1
  162. package/dist/components/rich-text/shared/plugins/TableActionMenuPlugin/TableActionMenuPlugin.d.ts +0 -5
  163. package/dist/components/rich-text/shared/plugins/TableCellResizerPlugin/TableCellResizerPlugin.d.ts +0 -2
  164. package/dist/components/rich-text/theme/report-theme.d.ts +0 -3
  165. package/dist/components/style-guide-data.d.ts +0 -40
  166. package/dist/components/style-guide.d.ts +0 -1
  167. package/dist/mermaid-renderer-CPGj6vsb.js +0 -570
  168. package/dist/mermaid-renderer-CPGj6vsb.js.map +0 -1
  169. package/dist/radio-DJtQY9po.js +0 -286
  170. package/dist/radio-DJtQY9po.js.map +0 -1
  171. package/dist/resource-badge-CeJTOn8F.js +0 -188
  172. package/dist/resource-badge-CeJTOn8F.js.map +0 -1
  173. package/dist/rich-message-DNSEhxXh.js.map +0 -1
  174. package/dist/theme-25P7ij4C.js.map +0 -1
  175. package/dist/utils/formats.d.ts +0 -7
  176. /package/dist/components/{palette-filter.d.ts → command-palette/palette-filter.d.ts} +0 -0
  177. /package/dist/components/{palette-list.d.ts → command-palette/palette-list.d.ts} +0 -0
  178. /package/dist/components/{palette-shortcut.d.ts → command-palette/palette-shortcut.d.ts} +0 -0
  179. /package/dist/components/{palette.d.ts → command-palette/palette.d.ts} +0 -0
  180. /package/dist/components/{code-editor.d.ts → diff-viewer/code-editor.d.ts} +0 -0
  181. /package/dist/components/{column-file-browser.d.ts → file-browser/column-file-browser.d.ts} +0 -0
  182. /package/dist/components/{performance-panel.d.ts → internal/performance-panel.d.ts} +0 -0
  183. /package/dist/components/{header.d.ts → layout/header.d.ts} +0 -0
  184. /package/dist/components/{horizontal-menu-stack.d.ts → layout/horizontal-menu-stack.d.ts} +0 -0
  185. /package/dist/components/{item-section.d.ts → layout/item-section.d.ts} +0 -0
  186. /package/dist/components/{panel-header.constants.d.ts → layout/panel-header.constants.d.ts} +0 -0
  187. /package/dist/components/{resizable-split-layout.d.ts → layout/resizable-split-layout.d.ts} +0 -0
  188. /package/dist/components/{resizable-split-layout.handle.d.ts → layout/resizable-split-layout.handle.d.ts} +0 -0
  189. /package/dist/components/{attached-panel.d.ts → overlays/attached-panel.d.ts} +0 -0
  190. /package/dist/components/{bubble-button.d.ts → overlays/bubble-button.d.ts} +0 -0
  191. /package/dist/components/{bubble-panel.d.ts → overlays/bubble-panel.d.ts} +0 -0
  192. /package/dist/components/{delete-confirmation-modal.d.ts → overlays/delete-confirmation-modal.d.ts} +0 -0
  193. /package/dist/components/{repo-picker-dialog.d.ts → overlays/repo-picker-dialog.d.ts} +0 -0
  194. /package/dist/components/{resource-context-menu.d.ts → overlays/resource-context-menu.d.ts} +0 -0
  195. /package/dist/components/param-editor/{color-input.d.ts → inputs/color-input.d.ts} +0 -0
  196. /package/dist/components/param-editor/{date-input.d.ts → inputs/date-input.d.ts} +0 -0
  197. /package/dist/components/param-editor/{horizontal-text-input.d.ts → inputs/horizontal-text-input.d.ts} +0 -0
  198. /package/dist/components/param-editor/{number-input.d.ts → inputs/number-input.d.ts} +0 -0
  199. /package/dist/components/param-editor/{selection-input.d.ts → inputs/selection-input.d.ts} +0 -0
  200. /package/dist/components/param-editor/{text-input.d.ts → inputs/text-input.d.ts} +0 -0
  201. /package/dist/components/{alert.d.ts → primitives/alert.d.ts} +0 -0
  202. /package/dist/components/{checkbox.d.ts → primitives/checkbox.d.ts} +0 -0
  203. /package/dist/components/{content-placeholder.d.ts → primitives/content-placeholder.d.ts} +0 -0
  204. /package/dist/components/{empty-state.d.ts → primitives/empty-state.d.ts} +0 -0
  205. /package/dist/components/{error-boundary.d.ts → primitives/error-boundary.d.ts} +0 -0
  206. /package/dist/components/{icon-color-picker.d.ts → primitives/icon-color-picker.d.ts} +0 -0
  207. /package/dist/components/{info-card.d.ts → primitives/info-card.d.ts} +0 -0
  208. /package/dist/components/{integration-card.d.ts → primitives/integration-card.d.ts} +0 -0
  209. /package/dist/components/{radio.d.ts → primitives/radio.d.ts} +0 -0
  210. /package/dist/components/{resource-badge.d.ts → primitives/resource-badge.d.ts} +0 -0
  211. /package/dist/components/{scroll-area.d.ts → primitives/scroll-area.d.ts} +0 -0
  212. /package/dist/components/{simple-card.d.ts → primitives/simple-card.d.ts} +0 -0
  213. /package/dist/components/{slider.d.ts → primitives/slider.d.ts} +0 -0
  214. /package/dist/components/{switch.d.ts → primitives/switch.d.ts} +0 -0
  215. /package/dist/components/{toaster.d.ts → primitives/toaster.d.ts} +0 -0
  216. /package/dist/components/{workspace-badge.d.ts → primitives/workspace-badge.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-renderer.js","sources":["../src/components/data-renderer/types.ts","../src/components/data-renderer/data-renderer-board-move.ts","../src/components/data-renderer/data-renderer-board-column-header.tsx","../src/components/data-renderer/card-interaction-guard.ts","../src/components/data-renderer/data-renderer-attribute-badge.tsx","../src/components/data-renderer/data-renderer-card.tsx","../src/components/data-renderer/data-renderer-board-group-section.tsx","../src/components/data-renderer/data-renderer-board.tsx","../src/components/data-renderer/data-renderer-list.tsx","../src/components/data-renderer/data-renderer-content.tsx","../src/components/data-renderer/data-renderer-enum-helpers.ts","../src/components/data-renderer/data-renderer-badge-helpers.ts","../src/components/data-renderer/data-renderer-helpers.ts","../src/components/data-renderer/data-renderer-grouping.ts","../src/components/data-renderer/display-menu.tsx","../src/components/data-renderer/filter-menu.tsx","../src/components/data-renderer/use-data-renderer-store.ts","../src/components/data-renderer/use-resolved-attributes.ts","../src/components/data-renderer/data-renderer-toolbar.tsx","../src/components/data-renderer/data-renderer.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nexport type ViewMode = \"board\" | \"list\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nexport const NO_GROUPING = \"none\";\nexport const MANUAL_ORDERING = \"manual\";\n\nexport interface EnumOption {\n value: string;\n label: string;\n color?: string;\n icon?: string | null;\n}\n\n/**\n * Reactive options source for enum / enum-multi attributes. Mirrors React's\n * useSyncExternalStore contract so a contribution can hand its options off as\n * a live collection (e.g. a project-scoped resource) instead of a frozen\n * array, and the renderer subscribes to it the same way it subscribes to rows.\n */\nexport interface EnumOptionsSource {\n subscribe: (listener: () => void) => () => void;\n getSnapshot: () => EnumOption[];\n}\n\nexport type EnumOptions = EnumOption[] | EnumOptionsSource;\n\nexport type AttributeType =\n | { kind: \"enum\"; options: EnumOptions }\n | { kind: \"enum-multi\"; options: EnumOptions }\n | { kind: \"string\" }\n | { kind: \"date\" }\n | { kind: \"number\" }\n | { kind: \"user\" };\n\nexport const isEnumOptionsSource = (options: EnumOptions): options is EnumOptionsSource => !Array.isArray(options);\n\nexport type AttributeKind = AttributeType[\"kind\"];\n\nexport type AttributeDisplayDescriptor = { kind: \"workspace-badge\"; itemsAttributeId: string };\n\nexport interface AttributeDescriptor {\n id: string;\n label: string;\n type: AttributeType;\n filterable?: boolean;\n groupable?: boolean;\n sortable?: boolean;\n displayable?: boolean;\n editable?: boolean;\n display?: AttributeDisplayDescriptor;\n render?: (value: unknown, row: DataRendererRow) => ReactNode;\n compare?: (a: unknown, b: unknown) => number;\n}\n\n/**\n * Reactive source for an entire attribute schema. Mirrors React's\n * useSyncExternalStore contract so consumers (e.g. the workbench's\n * data-renderer bridge) can subscribe and re-resolve when the schema changes\n * — letting a contribution add/remove/edit attributes at runtime without\n * re-registering.\n */\nexport interface AttributesSource {\n subscribe: (listener: () => void) => () => void;\n getSnapshot: () => AttributeDescriptor[];\n}\n\nexport const isAttributesSource = (\n attributes: AttributeDescriptor[] | AttributesSource,\n): attributes is AttributesSource => !Array.isArray(attributes);\n\nexport interface DataRendererRow {\n id: string;\n title: string;\n /**\n * Optional navigation handle. When set, the renderer's default click handler\n * routes through the contribution's onRowClick (which typically opens the\n * resource via the workbench).\n */\n resource?: unknown;\n attributes: Record<string, unknown>;\n}\n\nexport interface DataRendererOrdering {\n attributeId: string | typeof MANUAL_ORDERING;\n direction: SortDirection;\n}\n\nexport interface DataRendererSettings {\n viewMode: ViewMode;\n columnGrouping: string | typeof NO_GROUPING;\n rowGrouping: string | typeof NO_GROUPING;\n ordering: DataRendererOrdering;\n displayProperties: string[];\n}\n\nexport type DataRendererFilterState = Record<string, string[]>;\n\nexport const DEFAULT_DATA_RENDERER_SETTINGS: DataRendererSettings = {\n viewMode: \"board\",\n columnGrouping: NO_GROUPING,\n rowGrouping: NO_GROUPING,\n ordering: { attributeId: MANUAL_ORDERING, direction: \"asc\" },\n displayProperties: [],\n};\n\n/**\n * Look up an attribute by id from a contribution-provided descriptor list.\n * Returns undefined for sentinels (\"none\", \"manual\") or unknown ids.\n */\nexport const findAttribute = (attributes: AttributeDescriptor[], id: string | undefined) => {\n if (!id || id === NO_GROUPING || id === MANUAL_ORDERING) return undefined;\n return attributes.find((attribute) => attribute.id === id);\n};\n","import type { DataRendererSettings } from \"./types\";\nimport { MANUAL_ORDERING, NO_GROUPING } from \"./types\";\n\ninterface ApplyBoardMoveItemInput {\n settings: Pick<DataRendererSettings, \"columnGrouping\" | \"ordering\" | \"rowGrouping\">;\n rowId: string;\n targetColumnId: string;\n targetGroupKey?: string;\n beforeItemId?: string;\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n}\n\ninterface ApplyBoardMoveToGroupInput {\n settings: Pick<DataRendererSettings, \"ordering\" | \"rowGrouping\">;\n rowId: string;\n targetGroupKey: string;\n beforeItemId?: string;\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n}\n\nexport const applyBoardMoveItem = async (input: ApplyBoardMoveItemInput) => {\n const { settings, rowId, targetColumnId, targetGroupKey, beforeItemId, onAttributeChange, onReorder } = input;\n\n if (settings.columnGrouping !== NO_GROUPING && onAttributeChange) {\n await onAttributeChange(rowId, settings.columnGrouping, targetColumnId);\n }\n if (settings.rowGrouping !== NO_GROUPING && targetGroupKey && onAttributeChange) {\n await onAttributeChange(rowId, settings.rowGrouping, targetGroupKey);\n }\n if (settings.ordering.attributeId === MANUAL_ORDERING) {\n await onReorder?.(rowId, beforeItemId);\n }\n};\n\nexport const applyBoardMoveToGroup = async (input: ApplyBoardMoveToGroupInput) => {\n const { settings, rowId, targetGroupKey, beforeItemId, onAttributeChange, onReorder } = input;\n\n if (settings.rowGrouping === NO_GROUPING || !onAttributeChange) return;\n await onAttributeChange(rowId, settings.rowGrouping, targetGroupKey);\n if (settings.ordering.attributeId === MANUAL_ORDERING) {\n await onReorder?.(rowId, beforeItemId);\n }\n};\n","import { Badge, HStack, Icon, IconButton, Menu, Spacer, Text } from \"@chakra-ui/react\";\nimport { MoreHorizontal, Plus } from \"lucide-react\";\n\nimport { ListRow } from \"@/components/list-row/list-row\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport type { DataRendererBoardColumn } from \"./data-renderer-board\";\n\ninterface ColumnHeaderProps {\n column: DataRendererBoardColumn;\n onCreateStart?: (columnId: string) => void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n}\n\nexport const ColumnHeader = (props: ColumnHeaderProps) => {\n const { column, onCreateStart, onColumnAction } = props;\n\n return (\n <HStack minH=\"2.5rem\" padding=\"xs\" gap=\"xs\" alignItems=\"center\">\n <Text textStyle=\"label/S/medium\">{column.label}</Text>\n\n <Badge variant=\"number\" colorPalette={column.color ?? \"gray\"}>\n {column.items.length}\n </Badge>\n\n <Spacer />\n\n {column.canCreate && onCreateStart && (\n <Tooltip content={column.createLabel ?? \"Create new row\"}>\n <IconButton\n size=\"2xs\"\n variant=\"outline\"\n onClick={() => onCreateStart(column.id)}\n aria-label={column.createLabel ?? \"Create row\"}\n >\n <Icon as={Plus} boxSize=\"12px\" />\n </IconButton>\n </Tooltip>\n )}\n\n {column.actions.length > 0 && (\n <Menu.Root>\n <Menu.Trigger asChild>\n <IconButton size=\"2xs\" variant=\"ghost\" aria-label={`Column actions for ${column.label}`}>\n <Icon as={MoreHorizontal} boxSize=\"12px\" />\n </IconButton>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"180px\" bg=\"bg\">\n {column.actions.map((action) => (\n <Menu.Item key={action.id} value={action.id} asChild>\n <ListRow\n asChild\n variant=\"full-width\"\n label={action.label}\n icon={<Icon as={action.icon} boxSize=\"16px\" />}\n onActivate={() => onColumnAction?.(column.id, action.id)}\n />\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n )}\n </HStack>\n );\n};\n","const suppressionKey = \"__pstdioDataRendererCardClickSuppressionUntil\";\n\ntype DataRendererCardInteractionGlobal = typeof globalThis & {\n [suppressionKey]?: number;\n};\n\nconst getInteractionGlobal = () => globalThis as DataRendererCardInteractionGlobal;\n\nexport const suppressNextDataRendererCardClick = () => {\n getInteractionGlobal()[suppressionKey] = Date.now() + 1500;\n};\n\nexport const isDataRendererCardClickSuppressed = () => Date.now() <= (getInteractionGlobal()[suppressionKey] ?? 0);\n","import { Badge, Icon, Menu, Portal } from \"@chakra-ui/react\";\nimport { Check, ChevronDown, Square, SquareCheck, X } from \"lucide-react\";\nimport { ListRow } from \"@/components/list-row/list-row\";\nimport { getIconComponent } from \"@/components/primitives/icon-color-picker\";\nimport { suppressNextDataRendererCardClick } from \"./card-interaction-guard\";\nimport type { AttributeBadge } from \"./data-renderer-helpers\";\n\ninterface DataRendererAttributeBadgeProps {\n badge: AttributeBadge;\n onChange?: (attributeId: string, value: unknown) => void;\n}\n\nconst stopRowActivation = (event: { stopPropagation: () => void }) => event.stopPropagation();\nconst markRowActivationSuppression = () => suppressNextDataRendererCardClick();\nconst suppressRowActivation = (event: { stopPropagation: () => void }) => {\n markRowActivationSuppression();\n event.stopPropagation();\n};\n\nconst getSelectedValues = (badge: AttributeBadge) => {\n if (Array.isArray(badge.value)) return badge.value;\n return badge.value ? [badge.value] : [];\n};\n\nconst toggleMultiValue = (values: string[], optionValue: string) =>\n values.includes(optionValue) ? values.filter((value) => value !== optionValue) : [...values, optionValue];\n\nconst badgeStyleProps = {\n bg: { _light: \"bg.muted\", _dark: \"bg.subtle\" },\n color: \"fg.muted\",\n _hover: { bg: { _light: \"bg.subtle\", _dark: \"bg.hover\" } },\n} as const;\n\nconst getBadgeIconColor = (badge: AttributeBadge) => (badge.color ? `${badge.color}.fg` : \"fg.muted\");\n\nconst selectionIcon = (input: { isMultiValue: boolean; isSelected: boolean }) => {\n if (input.isMultiValue) return input.isSelected ? <SquareCheck size={14} /> : <Square size={14} />;\n return input.isSelected ? <Check size={14} /> : null;\n};\n\nexport const DataRendererAttributeBadge = (props: DataRendererAttributeBadgeProps) => {\n const { badge, onChange } = props;\n const options = badge.options ?? [];\n const canEdit = Boolean(onChange && badge.isEditable && options.length > 0);\n const isMultiValue = Array.isArray(badge.value);\n const selectedValues = getSelectedValues(badge);\n const attributeLabel = badge.attributeLabel ?? badge.label;\n const rowInteractionProps = {\n onClickCapture: markRowActivationSuppression,\n onPointerDownCapture: markRowActivationSuppression,\n onKeyDown: stopRowActivation,\n };\n\n const handleOptionChange = (optionValue: string) => {\n const nextValue = isMultiValue ? toggleMultiValue(selectedValues, optionValue) : optionValue;\n onChange?.(badge.attributeId, nextValue);\n };\n\n const handleClearSelection = () => onChange?.(badge.attributeId, isMultiValue ? [] : \"\");\n\n const badgeContent = (\n <>\n {badge.icon ? <Icon as={getIconComponent(badge.icon)} boxSize=\"3.5\" color={getBadgeIconColor(badge)} /> : null}\n {badge.label}\n {canEdit ? <Icon as={ChevronDown} boxSize=\"3\" color=\"fg.muted\" /> : null}\n </>\n );\n\n if (!canEdit) {\n return (\n <Badge variant=\"subtle\" gap=\"2xs\" textStyle=\"label/XS/medium\" {...badgeStyleProps}>\n {badgeContent}\n </Badge>\n );\n }\n\n return (\n <Menu.Root closeOnSelect={!isMultiValue}>\n <Menu.Trigger asChild>\n <Badge\n as=\"span\"\n role=\"button\"\n tabIndex={0}\n variant=\"subtle\"\n gap=\"2xs\"\n textStyle=\"label/XS/medium\"\n cursor=\"pointer\"\n {...badgeStyleProps}\n onClickCapture={markRowActivationSuppression}\n onClick={stopRowActivation}\n onPointerDownCapture={markRowActivationSuppression}\n onPointerDown={suppressRowActivation}\n onKeyDown={stopRowActivation}\n >\n {badgeContent}\n </Badge>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content\n minW=\"180px\"\n bg=\"bg\"\n p=\"0\"\n gap=\"0\"\n onClickCapture={markRowActivationSuppression}\n onClick={stopRowActivation}\n onPointerDownCapture={markRowActivationSuppression}\n onPointerDown={suppressRowActivation}\n onKeyDown={stopRowActivation}\n >\n {!isMultiValue ? (\n <>\n <Menu.Item value=\"__clear\" asChild>\n <ListRow\n asChild\n role=\"menuitemradio\"\n aria-checked={selectedValues.length === 0}\n variant=\"full-width\"\n id=\"__clear\"\n label={`No ${attributeLabel}`}\n icon={<X size={16} />}\n iconColor=\"gray.500\"\n isSelected={selectedValues.length === 0}\n endContent={selectionIcon({ isMultiValue: false, isSelected: selectedValues.length === 0 })}\n onActivate={handleClearSelection}\n {...rowInteractionProps}\n />\n </Menu.Item>\n <Menu.Separator margin=\"0\" />\n </>\n ) : null}\n {options.map((option) => {\n const isSelected = selectedValues.includes(option.value);\n return (\n <Menu.Item key={option.value} value={option.value} asChild>\n <ListRow\n asChild\n role={isMultiValue ? \"menuitemcheckbox\" : \"menuitemradio\"}\n aria-checked={isSelected}\n variant=\"full-width\"\n id={option.value}\n label={option.label}\n icon={<Icon as={getIconComponent(option.icon)} boxSize=\"16px\" />}\n iconColor={`${option.color ?? \"gray\"}.500`}\n isSelected={isSelected}\n endContent={selectionIcon({ isMultiValue, isSelected })}\n onActivate={() => handleOptionChange(option.value)}\n {...rowInteractionProps}\n />\n </Menu.Item>\n );\n })}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { HStack, Stack, Text, Wrap } from \"@chakra-ui/react\";\nimport type { DragEventHandler, MouseEvent, ReactNode } from \"react\";\nimport type { WorkspaceBadgeProps } from \"@/components/primitives/workspace-badge\";\nimport { WorkspaceBadge } from \"@/components/primitives/workspace-badge\";\nimport { isDataRendererCardClickSuppressed } from \"./card-interaction-guard\";\nimport { DataRendererAttributeBadge } from \"./data-renderer-attribute-badge\";\nimport type { AttributeBadge } from \"./data-renderer-helpers\";\n\nexport interface DataRendererCardProps {\n title: string;\n badges?: AttributeBadge[];\n customSlots?: ReactNode[];\n workspaceBadge?: WorkspaceBadgeProps;\n isSelected?: boolean;\n draggable?: boolean;\n onBadgeChange?: (attributeId: string, value: unknown) => void;\n onDragStart?: DragEventHandler<HTMLDivElement>;\n onDragEnd?: DragEventHandler<HTMLDivElement>;\n onClick?: () => void;\n}\n\nexport const DataRendererCard = (props: DataRendererCardProps) => {\n const {\n title,\n badges = [],\n customSlots = [],\n workspaceBadge,\n isSelected = false,\n draggable,\n onBadgeChange,\n onDragStart,\n onDragEnd,\n onClick,\n } = props;\n\n const hasBadges = badges.length > 0 || customSlots.length > 0;\n const cursor = draggable ? \"grab\" : onClick ? \"pointer\" : \"default\";\n const handleClick = (event: MouseEvent<HTMLDivElement>) => {\n if (isDataRendererCardClickSuppressed()) return;\n if (event.defaultPrevented) return;\n if (!(event.target instanceof Node) || !event.currentTarget.contains(event.target)) return;\n onClick?.();\n };\n\n return (\n <Stack\n gap=\"xs\"\n padding=\"sm\"\n borderRadius=\"xs\"\n borderWidth=\"1px\"\n borderColor={isSelected ? \"border.accent\" : \"border.subtle\"}\n width=\"100%\"\n background=\"bg\"\n transition=\"border-color 0.2s ease-in-out, background 0.2s ease-in-out\"\n _hover={{ borderColor: isSelected ? \"border.accent\" : \"border.accent-light\" }}\n cursor={cursor}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onClick={onClick ? handleClick : undefined}\n data-selected={isSelected ? \"true\" : undefined}\n data-testid=\"renderer-card\"\n >\n <HStack align=\"start\" gap=\"2xs\" flexWrap=\"wrap\" minW=\"0\">\n <Text textStyle=\"label/S/regular\" flex=\"1\" minW=\"0\" overflowWrap=\"anywhere\">\n {title}\n </Text>\n {workspaceBadge ? <WorkspaceBadge {...workspaceBadge} /> : null}\n </HStack>\n\n {hasBadges && (\n <Wrap gap=\"2xs\">\n {badges.map((badge) => (\n <DataRendererAttributeBadge key={badge.attributeId} badge={badge} onChange={onBadgeChange} />\n ))}\n {customSlots}\n </Wrap>\n )}\n </Stack>\n );\n};\n","import { Badge, Box, HStack, Icon, Stack, Text } from \"@chakra-ui/react\";\nimport { ChevronRight } from \"lucide-react\";\nimport { type DragEvent, useState } from \"react\";\n\nimport { ResourceContextMenu } from \"@/components/overlays/resource-context-menu\";\nimport type { DataRendererBoardGroup } from \"./data-renderer-board\";\nimport { DataRendererCard } from \"./data-renderer-card\";\n\ninterface GroupSectionProps {\n columnId: string;\n group: DataRendererBoardGroup;\n selectedItemId: string | null;\n canDragIn: boolean;\n canDragOut: boolean;\n isDropTarget: boolean;\n onDragStart: (itemId: string) => (event: DragEvent<HTMLDivElement>) => void;\n onDragEnd: () => void;\n onGroupDragOver: (event: DragEvent<HTMLDivElement>) => void;\n onGroupDragLeave: (event: DragEvent<HTMLDivElement>) => void;\n onGroupDrop: (event: DragEvent<HTMLDivElement>, beforeItemId?: string) => void;\n}\n\nexport const GroupSection = (props: GroupSectionProps) => {\n const {\n columnId,\n group,\n selectedItemId,\n canDragIn,\n canDragOut,\n isDropTarget,\n onDragStart,\n onDragEnd,\n onGroupDragOver,\n onGroupDragLeave,\n onGroupDrop,\n } = props;\n const [expanded, setExpanded] = useState(true);\n\n return (\n <Stack\n data-column-id={columnId}\n data-group-key={group.key}\n gap=\"0\"\n borderRadius=\"sm\"\n background={isDropTarget ? \"bg.subtle\" : \"transparent\"}\n transition=\"background 150ms ease\"\n onDragOver={canDragIn ? onGroupDragOver : undefined}\n onDragLeave={canDragIn ? onGroupDragLeave : undefined}\n onDrop={canDragIn ? onGroupDrop : undefined}\n >\n <HStack\n px=\"xs\"\n py=\"2xs\"\n gap=\"2xs\"\n cursor=\"pointer\"\n _hover={{ bg: \"bg.hover\" }}\n borderRadius=\"sm\"\n onClick={() => setExpanded((value) => !value)}\n >\n <Box display=\"flex\" alignItems=\"center\" flexShrink={0}>\n <Icon\n as={ChevronRight}\n boxSize=\"14px\"\n color=\"fg.muted\"\n transform={expanded ? \"rotate(90deg)\" : \"rotate(0deg)\"}\n transition=\"transform 0.15s ease\"\n />\n </Box>\n <Text textStyle=\"label/S/medium\" color=\"fg.muted\">\n {group.label}\n </Text>\n <Badge variant=\"number\" colorPalette=\"gray\" size=\"sm\">\n {group.items.length}\n </Badge>\n </HStack>\n {expanded && (\n <Stack gap=\"sm\" pt=\"xs\">\n {group.items.map((item) => (\n <ResourceContextMenu key={item.id} actions={item.contextMenuActions ?? []}>\n <Box\n onDragOver={\n canDragIn\n ? (event) => {\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = \"move\";\n }\n : undefined\n }\n onDrop={\n canDragIn\n ? (event) => {\n event.preventDefault();\n event.stopPropagation();\n const itemId = event.dataTransfer.getData(\"text/plain\");\n if (!itemId || itemId === item.id) return;\n onGroupDrop(event, item.id);\n }\n : undefined\n }\n >\n <DataRendererCard\n {...item.cardProps}\n isSelected={item.id === selectedItemId}\n draggable={canDragOut}\n onDragStart={canDragOut ? onDragStart(item.id) : undefined}\n onDragEnd={canDragOut ? onDragEnd : undefined}\n />\n </Box>\n </ResourceContextMenu>\n ))}\n </Stack>\n )}\n </Stack>\n );\n};\n","import { Box, Stack } from \"@chakra-ui/react\";\nimport { type ComponentProps, type ComponentType, type DragEvent, useState } from \"react\";\n\nimport type { ResourceContextAction } from \"@/components/overlays/resource-context-menu\";\nimport { ResourceContextMenu } from \"@/components/overlays/resource-context-menu\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport { ColumnHeader } from \"./data-renderer-board-column-header\";\nimport { GroupSection } from \"./data-renderer-board-group-section\";\nimport { DataRendererCard } from \"./data-renderer-card\";\n\ntype DataRendererCardProps = ComponentProps<typeof DataRendererCard>;\n\nexport interface DataRendererBoardItem {\n id: string;\n cardProps: Omit<DataRendererCardProps, \"draggable\" | \"onDragStart\" | \"onDragEnd\" | \"isSelected\">;\n contextMenuActions?: ResourceContextAction[];\n}\n\nexport interface DataRendererBoardColumnAction {\n id: string;\n label: string;\n icon: ComponentType<{ size?: number | string }>;\n}\n\nexport interface DataRendererBoardGroup {\n key: string;\n label: string;\n items: DataRendererBoardItem[];\n}\n\nexport interface DataRendererBoardColumn {\n id: string;\n label: string;\n createLabel?: string;\n color?: string;\n items: DataRendererBoardItem[];\n groups?: DataRendererBoardGroup[];\n canDragIn: boolean;\n canDragOut: boolean;\n canCreate: boolean;\n actions: DataRendererBoardColumnAction[];\n}\n\ninterface DataRendererBoardProps {\n columns: DataRendererBoardColumn[];\n selectedItemId?: string | null;\n onMoveItem?: (\n itemId: string,\n targetColumnId: string,\n context?: { beforeItemId?: string; targetGroupKey?: string },\n ) => Promise<void> | void;\n onMoveToGroup?: (itemId: string, targetGroupKey: string, context?: { beforeItemId?: string }) => Promise<void> | void;\n onCreateStart?: (columnId: string) => void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n}\n\nexport const DataRendererBoard = (props: DataRendererBoardProps) => {\n const { columns, selectedItemId = null, onMoveItem, onMoveToGroup, onCreateStart, onColumnAction } = props;\n\n const [activeColumn, setActiveColumn] = useState<string | null>(null);\n const [activeGroup, setActiveGroup] = useState<string | null>(null);\n\n const handleDragStart = (itemId: string) => (event: DragEvent<HTMLDivElement>) => {\n event.dataTransfer.setData(\"text/plain\", itemId);\n event.dataTransfer.effectAllowed = \"move\";\n };\n\n const handleDragEnd = () => {\n setActiveColumn(null);\n setActiveGroup(null);\n };\n\n const handleDragOver = (columnId: string) => (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n setActiveColumn(columnId);\n };\n\n const handleDragLeave = (event: DragEvent<HTMLDivElement>) => {\n if (event.currentTarget.contains(event.relatedTarget as Node)) return;\n setActiveColumn(null);\n };\n\n const handleDrop = (columnId: string) => (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setActiveColumn(null);\n\n const itemId = event.dataTransfer.getData(\"text/plain\");\n if (!itemId) return;\n\n onMoveItem?.(itemId, columnId);\n };\n\n return (\n <ScrollArea\n height=\"100%\"\n size=\"xs\"\n showHorizontalScrollbar\n showVerticalScrollbar={false}\n contentProps={{ display: \"flex\", alignItems: \"stretch\", gap: \"0\", pb: \"2xs\", minH: \"100%\" }}\n >\n {columns.map((column) => (\n <Stack\n key={column.id}\n data-testid={`board-column-${column.id}`}\n gap=\"0\"\n _notFirst={{ borderLeft: \"1px solid\", borderColor: \"border.subtle\" }}\n background={activeColumn === column.id ? \"bg.subtle\" : \"bg\"}\n transition=\"background 150ms ease\"\n height=\"100%\"\n minH=\"240px\"\n overflow=\"hidden\"\n minW=\"260px\"\n flex=\"1 0 260px\"\n onDragOver={column.canDragIn ? handleDragOver(column.id) : undefined}\n onDragLeave={column.canDragIn ? handleDragLeave : undefined}\n onDrop={column.canDragIn ? handleDrop(column.id) : undefined}\n >\n <ColumnHeader column={column} onCreateStart={onCreateStart} onColumnAction={onColumnAction} />\n\n <ScrollArea\n flex=\"1\"\n minH=\"0\"\n size=\"xs\"\n verticalScrollbarProps={{ margin: \"0\" }}\n contentProps={{\n spaceY: \"sm\",\n ps: \"xs\",\n pe: \"xs\",\n }}\n >\n {column.groups && column.groups.length > 0\n ? column.groups.map((group) => {\n const groupId = `${column.id}::${group.key}`;\n return (\n <GroupSection\n key={group.key}\n columnId={column.id}\n group={group}\n selectedItemId={selectedItemId}\n canDragIn={column.canDragIn}\n canDragOut={column.canDragOut}\n isDropTarget={activeGroup === groupId}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onGroupDragOver={(event) => {\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = \"move\";\n setActiveGroup(groupId);\n setActiveColumn(null);\n }}\n onGroupDragLeave={(event) => {\n if (event.currentTarget.contains(event.relatedTarget as Node)) return;\n setActiveGroup(null);\n }}\n onGroupDrop={(event, beforeItemId) => {\n event.preventDefault();\n event.stopPropagation();\n setActiveGroup(null);\n setActiveColumn(null);\n const itemId = event.dataTransfer.getData(\"text/plain\");\n if (!itemId) return;\n if (onMoveItem) {\n onMoveItem(itemId, column.id, { beforeItemId, targetGroupKey: group.key });\n return;\n }\n onMoveToGroup?.(itemId, group.key, { beforeItemId });\n }}\n />\n );\n })\n : column.items.map((item) => (\n <ResourceContextMenu key={item.id} actions={item.contextMenuActions ?? []}>\n <Box\n onDragOver={\n column.canDragIn\n ? (event) => {\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = \"move\";\n setActiveColumn(column.id);\n }\n : undefined\n }\n onDrop={\n column.canDragIn\n ? (event) => {\n event.preventDefault();\n event.stopPropagation();\n setActiveColumn(null);\n const itemId = event.dataTransfer.getData(\"text/plain\");\n if (!itemId || itemId === item.id) return;\n onMoveItem?.(itemId, column.id, { beforeItemId: item.id });\n }\n : undefined\n }\n >\n <DataRendererCard\n {...item.cardProps}\n isSelected={item.id === selectedItemId}\n draggable={column.canDragOut}\n onDragStart={column.canDragOut ? handleDragStart(item.id) : undefined}\n onDragEnd={column.canDragOut ? handleDragEnd : undefined}\n />\n </Box>\n </ResourceContextMenu>\n ))}\n </ScrollArea>\n </Stack>\n ))}\n </ScrollArea>\n );\n};\n","import { Badge, Box, HStack, Icon, Text, Wrap } from \"@chakra-ui/react\";\nimport { type ComponentType, type DragEvent, type ReactNode, useState } from \"react\";\nimport type { ResourceContextAction } from \"@/components/overlays/resource-context-menu\";\nimport { ListRow } from \"../list-row/list-row\";\nimport type { ListRowItem } from \"../list-row/list-row.types\";\nimport { DataRendererAttributeBadge } from \"./data-renderer-attribute-badge\";\nimport type { AttributeBadge } from \"./data-renderer-helpers\";\n\nexport interface DataRendererListItem {\n id: string;\n title: string;\n countBadge?: number;\n countColorPalette?: string;\n statusIcon?: ComponentType<{ size?: number | string }>;\n statusColor?: string;\n badges?: AttributeBadge[];\n customSlots?: ReactNode[];\n children?: DataRendererListItem[];\n onClick?: () => void;\n onBadgeChange?: (attributeId: string, value: unknown) => void;\n contextMenuActions?: ResourceContextAction[];\n draggable?: boolean;\n onDropRow?: (rowId: string) => void;\n}\n\nexport type DataRendererListExpandedState = Record<string, boolean>;\n\nexport interface DataRendererListProps {\n items: DataRendererListItem[];\n selectedItemId?: string | null;\n expandedGroups?: DataRendererListExpandedState;\n onItemClick?: (item: DataRendererListItem) => void;\n onExpandedGroupChange?: (rowId: string, isExpanded: boolean) => void;\n}\n\nconst INDENT_STEP_PX = 12;\n\ninterface FlattenedDataRendererListItem {\n id: string;\n item: DataRendererListItem;\n depth: number;\n canExpand: boolean;\n}\n\nexport const getDataRendererListIndentation = (depth: number) => {\n if (depth <= 0) return undefined;\n return `${depth * INDENT_STEP_PX}px`;\n};\n\nexport const flattenDataRendererListItems = (\n items: DataRendererListItem[],\n expanded: DataRendererListExpandedState,\n depth = 0,\n) => {\n const rows: FlattenedDataRendererListItem[] = [];\n\n for (const item of items) {\n const canExpand = (item.children?.length ?? 0) > 0;\n rows.push({ id: item.id, item, depth, canExpand });\n\n if (canExpand && getRowIsExpanded(expanded, item.id)) {\n rows.push(...flattenDataRendererListItems(item.children ?? [], expanded, depth + 1));\n }\n }\n\n return rows;\n};\n\nconst getDropTargetIndicatorProps = (isDropTarget: boolean, isGroup: boolean) => {\n if (!isDropTarget) return undefined;\n\n return {\n _before: {\n content: '\"\"',\n position: \"absolute\",\n bg: \"border.accent\",\n left: \"0\",\n top: \"0\",\n width: isGroup ? \"3px\" : \"100%\",\n height: isGroup ? \"100%\" : \"2px\",\n },\n } as const;\n};\n\nconst getRowIsExpanded = (expandedState: DataRendererListExpandedState, rowId: string) => {\n return expandedState[rowId] !== false;\n};\n\nconst updateExpandedState = (expandedState: DataRendererListExpandedState, rowId: string, isExpanded: boolean) => {\n return { ...expandedState, [rowId]: isExpanded };\n};\n\nconst renderLabel = (item: DataRendererListItem) => (\n <HStack gap=\"xs\" minW=\"0\" maxW=\"full\" flex=\"1\">\n <Text textStyle=\"label/S/regular\" minW=\"0\" truncate>\n {item.title}\n </Text>\n {typeof item.countBadge === \"number\" ? (\n <Badge variant=\"number\" size=\"sm\" flexShrink={0} colorPalette={item.countColorPalette ?? \"gray\"}>\n {item.countBadge}\n </Badge>\n ) : null}\n </HStack>\n);\n\nconst renderEndContent = (item: DataRendererListItem) => {\n const hasBadges = (item.badges?.length ?? 0) > 0 || (item.customSlots?.length ?? 0) > 0;\n\n if (!hasBadges) return null;\n\n return (\n <HStack gap=\"xs\" flexShrink={0}>\n <Wrap gap=\"2xs\" flexShrink={0}>\n {item.badges?.map((badge) => (\n <DataRendererAttributeBadge key={badge.attributeId} badge={badge} onChange={item.onBadgeChange} />\n ))}\n {item.customSlots}\n </Wrap>\n </HStack>\n );\n};\n\nconst buildListRowItem = (item: DataRendererListItem, hasChildren: boolean): ListRowItem => ({\n id: item.id,\n label: renderLabel(item),\n icon: item.statusIcon ? <Icon as={item.statusIcon} boxSize=\"16px\" /> : undefined,\n iconColor: item.statusColor ?? \"fg.muted\",\n endContent: renderEndContent(item),\n isContainer: hasChildren,\n contextMenuItems: item.contextMenuActions?.map((action) => ({\n id: action.key,\n label: action.label,\n icon: action.icon ?? undefined,\n disabled: action.isDisabled,\n separatorBefore: action.separatorBefore,\n endContent: action.endContent,\n onAction: action.onClick,\n })),\n});\n\nexport const DataRendererList = (props: DataRendererListProps) => {\n const { items, selectedItemId = null, expandedGroups, onItemClick, onExpandedGroupChange } = props;\n const [localExpandedGroups, setLocalExpandedGroups] = useState<DataRendererListExpandedState>({});\n const [activeDropTargetId, setActiveDropTargetId] = useState<string | null>(null);\n const [draggedItemId, setDraggedItemId] = useState<string | null>(null);\n const expanded = expandedGroups ?? localExpandedGroups;\n const rows = flattenDataRendererListItems(items, expanded);\n\n const handleExpandedChange = (rowId: string, isExpanded: boolean) => {\n onExpandedGroupChange?.(rowId, isExpanded);\n if (expandedGroups === undefined) {\n setLocalExpandedGroups((current) => updateExpandedState(current, rowId, isExpanded));\n }\n };\n\n return (\n <Box>\n {rows.map((row) => (\n <DataRendererListRow\n key={row.id}\n row={row}\n isExpanded={getRowIsExpanded(expanded, row.id)}\n selectedItemId={selectedItemId}\n activeDropTargetId={activeDropTargetId}\n draggedItemId={draggedItemId}\n onDraggedItemChange={setDraggedItemId}\n onDropTargetChange={setActiveDropTargetId}\n onItemClick={onItemClick}\n onExpandedChange={handleExpandedChange}\n />\n ))}\n </Box>\n );\n};\n\ninterface DataRendererListRowProps {\n row: FlattenedDataRendererListItem;\n isExpanded: boolean;\n selectedItemId: string | null;\n activeDropTargetId: string | null;\n draggedItemId: string | null;\n onDraggedItemChange: (itemId: string | null) => void;\n onDropTargetChange: (itemId: string | null) => void;\n onExpandedChange: (rowId: string, isExpanded: boolean) => void;\n onItemClick?: (item: DataRendererListItem) => void;\n}\n\nconst DataRendererListRow = (props: DataRendererListRowProps) => {\n const {\n row,\n isExpanded,\n selectedItemId,\n activeDropTargetId,\n draggedItemId,\n onDraggedItemChange,\n onDropTargetChange,\n onItemClick,\n onExpandedChange,\n } = props;\n const { item, canExpand } = row;\n const isSelected = item.id === selectedItemId;\n const canDropHere = Boolean(item.onDropRow) && item.id !== draggedItemId;\n const isDropTarget = canDropHere && item.id === activeDropTargetId;\n const rowItem = buildListRowItem(item, canExpand);\n const toggleExpanded = () => onExpandedChange(row.id, !isExpanded);\n\n const handleActivate = () => {\n if (canExpand) {\n toggleExpanded();\n return;\n }\n item.onClick?.();\n onItemClick?.(item);\n };\n\n const handleDragStart = (event: DragEvent<HTMLDivElement>) => {\n if (!item.draggable) return;\n event.stopPropagation();\n event.dataTransfer.setData(\"text/plain\", item.id);\n event.dataTransfer.effectAllowed = \"move\";\n onDraggedItemChange(item.id);\n onDropTargetChange(null);\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (!canDropHere) return;\n event.preventDefault();\n event.stopPropagation();\n event.dataTransfer.dropEffect = \"move\";\n onDropTargetChange(item.id);\n };\n\n const handleDragLeave = (event: DragEvent<HTMLDivElement>) => {\n if (event.currentTarget.contains(event.relatedTarget as Node)) return;\n onDropTargetChange(null);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n if (!canDropHere || !item.onDropRow) return;\n event.preventDefault();\n event.stopPropagation();\n onDropTargetChange(null);\n onDraggedItemChange(null);\n const draggedId = event.dataTransfer.getData(\"text/plain\");\n if (!draggedId || draggedId === item.id) return;\n item.onDropRow(draggedId);\n };\n\n const handleDragEnd = () => {\n onDropTargetChange(null);\n onDraggedItemChange(null);\n };\n\n return (\n <Box\n data-drop-target={isDropTarget ? \"true\" : undefined}\n position=\"relative\"\n borderBottomWidth=\"1px\"\n borderBottomColor=\"border.subtle\"\n bg={isDropTarget ? \"bg.subtle\" : \"transparent\"}\n draggable={item.draggable}\n transition=\"background 120ms ease\"\n {...getDropTargetIndicatorProps(isDropTarget, canExpand)}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDragLeave={item.onDropRow ? handleDragLeave : undefined}\n onDragEnd={handleDragEnd}\n onDrop={handleDrop}\n >\n <ListRow\n {...rowItem}\n variant=\"tree\"\n depth={row.depth}\n isSelected={isSelected}\n isExpanded={isExpanded}\n showExpandToggle={canExpand}\n onActivate={handleActivate}\n onToggleExpand={toggleExpanded}\n />\n </Box>\n );\n};\n","import { Box } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\n\nimport { EmptyState } from \"@/components/primitives/empty-state\";\nimport { DataRendererBoard, type DataRendererBoardColumn } from \"./data-renderer-board\";\nimport { DataRendererList, type DataRendererListItem } from \"./data-renderer-list\";\nimport type { DataRendererSettings } from \"./types\";\n\ninterface DataRendererEmptyStateProps {\n emptyState?: ReactNode;\n title: string;\n description?: string;\n height?: string;\n}\n\ninterface DataRendererContentProps {\n viewMode: DataRendererSettings[\"viewMode\"];\n boardColumns: DataRendererBoardColumn[];\n listItems: DataRendererListItem[];\n listExpandedGroups: Record<string, boolean>;\n selectedRowId: string | null;\n emptyState?: ReactNode;\n emptyTitle: string;\n emptyDescription?: string;\n onBoardMoveItem: (\n rowId: string,\n targetColumnId: string,\n context?: { beforeItemId?: string; targetGroupKey?: string },\n ) => Promise<void> | void;\n onBoardMoveToGroup: (\n rowId: string,\n targetGroupKey: string,\n context?: { beforeItemId?: string },\n ) => Promise<void> | void;\n onCreateRow?: (columnId: string) => void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n onListExpandedGroupChange: (rowId: string, isExpanded: boolean) => void;\n listKey: string;\n}\n\nconst DataRendererEmptyState = (props: DataRendererEmptyStateProps) => {\n const { emptyState, title, description, height } = props;\n\n if (emptyState !== undefined) {\n return height ? <Box height={height}>{emptyState}</Box> : emptyState;\n }\n\n return <EmptyState title={title} description={description} height={height} />;\n};\n\nexport const DataRendererContent = (props: DataRendererContentProps) => {\n const {\n viewMode,\n boardColumns,\n listItems,\n listExpandedGroups,\n selectedRowId,\n emptyState,\n emptyTitle,\n emptyDescription,\n onBoardMoveItem,\n onBoardMoveToGroup,\n onCreateRow,\n onColumnAction,\n onListExpandedGroupChange,\n listKey,\n } = props;\n\n if (viewMode === \"board\") {\n return (\n <Box flex=\"1\" minH=\"0\">\n {boardColumns.length > 0 ? (\n <DataRendererBoard\n columns={boardColumns}\n selectedItemId={selectedRowId}\n onMoveItem={onBoardMoveItem}\n onMoveToGroup={onBoardMoveToGroup}\n onCreateStart={onCreateRow}\n onColumnAction={onColumnAction}\n />\n ) : (\n <DataRendererEmptyState\n emptyState={emptyState}\n title={emptyTitle}\n description={emptyDescription}\n height=\"100%\"\n />\n )}\n </Box>\n );\n }\n\n if (listItems.length > 0) {\n return (\n <DataRendererList\n key={listKey}\n items={listItems}\n selectedItemId={selectedRowId}\n expandedGroups={listExpandedGroups}\n onExpandedGroupChange={onListExpandedGroupChange}\n />\n );\n }\n\n return <DataRendererEmptyState emptyState={emptyState} title={emptyTitle} description={emptyDescription} />;\n};\n","import type { AttributeType, EnumOption } from \"./types\";\nimport { isEnumOptionsSource } from \"./types\";\n\nconst dedupeEnumOptions = (options: EnumOption[]) => {\n const seen = new Set<string>();\n return options.filter((option) => {\n if (seen.has(option.value)) return false;\n seen.add(option.value);\n return true;\n });\n};\n\n/**\n * Normalize an enum / enum-multi attribute's `options` to a plain option list.\n * Sources resolve via `getSnapshot()` on every call, so callers naturally see\n * the latest values.\n */\nexport const getEnumOptions = (type: AttributeType) => {\n if (type.kind !== \"enum\" && type.kind !== \"enum-multi\") return [];\n const options = isEnumOptionsSource(type.options) ? type.options.getSnapshot() : type.options;\n return dedupeEnumOptions(options);\n};\n\nexport const toTitleCase = (value: string) =>\n value\n .replaceAll(\"_\", \" \")\n .split(\" \")\n .filter((chunk) => chunk.length > 0)\n .map((chunk) => chunk[0]!.toUpperCase() + chunk.slice(1))\n .join(\" \");\n\nexport const findEnumOption = (type: AttributeType, value: string) => {\n if (type.kind !== \"enum\" && type.kind !== \"enum-multi\") return undefined;\n return getEnumOptions(type).find((option) => option.value === value);\n};\n\nexport const enumOptionLabel = (type: AttributeType, value: string) => {\n const option = findEnumOption(type, value);\n return option?.label ?? toTitleCase(value);\n};\n","import { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./data-renderer-enum-helpers\";\nimport type { AttributeDescriptor, AttributeType, EnumOption } from \"./types\";\n\nconst summarizeMultiEnum = (values: string[], type: AttributeType) => {\n if (values.length === 0) return null;\n if (values.length <= 2) return values.map((value) => enumOptionLabel(type, value)).join(\", \");\n return `${enumOptionLabel(type, values[0]!)}, ${enumOptionLabel(type, values[1]!)} +${values.length - 2}`;\n};\n\nexport interface AttributeBadge {\n attributeId: string;\n attributeLabel?: string;\n label: string;\n color?: string;\n icon?: string | null;\n value?: string | string[];\n options?: EnumOption[];\n isEditable?: boolean;\n}\n\nexport const getAttributeBadgeColorPalette = (_badge: AttributeBadge) => \"gray\";\n\nexport const renderEnumBadge = (descriptor: AttributeDescriptor, type: AttributeType, value: unknown) => {\n if (type.kind !== \"enum\") return null;\n const stringValue = typeof value === \"string\" ? value : null;\n const editable = descriptor.editable === true;\n if (!stringValue) {\n return editable\n ? {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: descriptor.label,\n value: stringValue ?? undefined,\n options: getEnumOptions(type),\n isEditable: true,\n }\n : null;\n }\n const option = findEnumOption(type, stringValue);\n return {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: option?.label ?? toTitleCase(stringValue),\n color: option?.color,\n icon: option?.icon,\n ...(editable ? { value: stringValue, options: getEnumOptions(type), isEditable: true } : {}),\n };\n};\n\nexport const renderMultiEnumBadge = (descriptor: AttributeDescriptor, type: AttributeType, value: unknown) => {\n if (type.kind !== \"enum-multi\") return null;\n const values = Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\") : [];\n const summary = summarizeMultiEnum(values, type);\n const editable = descriptor.editable === true;\n if (!summary) {\n return editable\n ? {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: descriptor.label,\n value: values,\n options: getEnumOptions(type),\n isEditable: true,\n }\n : null;\n }\n const firstOption = values[0] ? findEnumOption(type, values[0]) : undefined;\n return {\n attributeId: descriptor.id,\n attributeLabel: descriptor.label,\n label: summary,\n color: firstOption?.color,\n icon: firstOption?.icon,\n ...(editable ? { value: values, options: getEnumOptions(type), isEditable: true } : {}),\n };\n};\n","import { createElement, type ReactNode } from \"react\";\nimport { WorkspaceBadge, type WorkspaceBadgeProps } from \"@/components/primitives/workspace-badge\";\nimport type { AttributeBadge } from \"./data-renderer-badge-helpers\";\nimport { renderEnumBadge, renderMultiEnumBadge } from \"./data-renderer-badge-helpers\";\nimport { getEnumOptions, toTitleCase } from \"./data-renderer-enum-helpers\";\nimport type { AttributeDescriptor, DataRendererFilterState, DataRendererRow, DataRendererSettings } from \"./types\";\nimport { findAttribute, MANUAL_ORDERING, NO_GROUPING } from \"./types\";\n\nexport type { AttributeBadge } from \"./data-renderer-badge-helpers\";\nexport { getAttributeBadgeColorPalette } from \"./data-renderer-badge-helpers\";\nexport { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./data-renderer-enum-helpers\";\n\n/**\n * Read a typed attribute value out of a row. enum-multi normalizes to an array;\n * single-valued kinds normalize to undefined when missing.\n */\nexport const getAttributeValue = (row: DataRendererRow, descriptor: AttributeDescriptor) => {\n const raw = row.attributes[descriptor.id];\n if (descriptor.type.kind === \"enum-multi\") {\n if (Array.isArray(raw)) return raw.filter((entry): entry is string => typeof entry === \"string\");\n return [] as string[];\n }\n return raw;\n};\n\nexport const getAttributeStringValues = (row: DataRendererRow, descriptor: AttributeDescriptor): string[] => {\n const value = getAttributeValue(row, descriptor);\n if (descriptor.type.kind === \"enum-multi\") return value as string[];\n if (value === null || value === undefined) return [];\n if (typeof value === \"string\") return value === \"\" ? [] : [value];\n if (typeof value === \"number\") return [String(value)];\n return [];\n};\n\nconst formatDateValue = (value: unknown) => {\n if (typeof value !== \"string\" || value === \"\") return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleDateString();\n};\n\nconst formatNumberValue = (value: unknown) => {\n if (typeof value === \"number\" && Number.isFinite(value)) return String(value);\n if (typeof value === \"string\" && value !== \"\" && !Number.isNaN(Number(value))) return value;\n return null;\n};\n\nconst formatStringValue = (value: unknown) => {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value === \"\" ? null : value;\n return String(value);\n};\n\nconst formatUserValue = (value: unknown) => formatStringValue(value);\n\nconst isRenderableNode = (value: unknown) => value !== null && value !== undefined && value !== false;\n\ninterface WorkspaceBadgeItem {\n id: string;\n name: string;\n shorthand?: string;\n type: WorkspaceBadgeProps[\"workspaceType\"];\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst textValue = (value: unknown) => (typeof value === \"string\" && value.trim() ? value.trim() : undefined);\n\nconst workspaceTypeFrom = (value: unknown): WorkspaceBadgeProps[\"workspaceType\"] =>\n value === \"current_branch\" ? \"current_branch\" : \"worktree\";\n\nconst normalizeWorkspaceBadgeItems = (value: unknown): WorkspaceBadgeItem[] => {\n if (!Array.isArray(value)) return [];\n\n return value.flatMap((item) => {\n if (!isRecord(item)) return [];\n const id = textValue(item.id);\n if (!id) return [];\n const shorthand = textValue(item.shorthand);\n const name = textValue(item.name) ?? shorthand ?? id;\n return [{ id, name, ...(shorthand ? { shorthand } : {}), type: workspaceTypeFrom(item.type) }];\n });\n};\n\nconst renderWorkspaceBadgeDisplay = (\n descriptor: AttributeDescriptor,\n value: unknown,\n row: DataRendererRow,\n): ReactNode => {\n if (descriptor.display?.kind !== \"workspace-badge\") return null;\n const items = normalizeWorkspaceBadgeItems(row.attributes[descriptor.display.itemsAttributeId]);\n if (items.length === 0) return null;\n\n const selectedId = typeof value === \"string\" ? value : undefined;\n const selectedItem = items.find((item) => item.id === selectedId) ?? items[0];\n if (!selectedItem) return null;\n\n return createElement(WorkspaceBadge, {\n workspaceType: selectedItem.type,\n shorthand: selectedItem.shorthand ?? selectedItem.name,\n hasMultipleWorkspaces: items.length > 1,\n showLeadingSessionIndicator: false,\n });\n};\n\n/**\n * Per-type default cell summary used by the card / list end-content. Returns\n * null when the attribute has no displayable value.\n */\nexport const renderAttributeBadge = (descriptor: AttributeDescriptor, row: DataRendererRow): AttributeBadge | null => {\n const type = descriptor.type;\n const value = getAttributeValue(row, descriptor);\n\n if (descriptor.render || descriptor.display) return null;\n\n if (type.kind === \"enum\") return renderEnumBadge(descriptor, type, value);\n if (type.kind === \"enum-multi\") return renderMultiEnumBadge(descriptor, type, value);\n\n if (type.kind === \"date\") {\n const formatted = formatDateValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n }\n\n if (type.kind === \"number\") {\n const formatted = formatNumberValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n }\n\n if (type.kind === \"user\") {\n const formatted = formatUserValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted, color: \"blue\" } : null;\n }\n\n const formatted = formatStringValue(value);\n return formatted ? { attributeId: descriptor.id, label: formatted } : null;\n};\n\nexport const collectDisplayBadges = (\n row: DataRendererRow,\n attributes: AttributeDescriptor[],\n displayProperties: string[],\n): AttributeBadge[] => {\n const badges: AttributeBadge[] = [];\n for (const id of displayProperties) {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor || descriptor.displayable === false) continue;\n const badge = renderAttributeBadge(descriptor, row);\n if (badge) badges.push(badge);\n }\n return badges;\n};\n\nexport const collectDisplayCustomSlots = (\n row: DataRendererRow,\n attributes: AttributeDescriptor[],\n displayProperties: string[],\n): ReactNode[] => {\n const slots: ReactNode[] = [];\n for (const id of displayProperties) {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor || descriptor.displayable === false) continue;\n\n const value = getAttributeValue(row, descriptor);\n const slot = descriptor.render\n ? descriptor.render(value, row)\n : renderWorkspaceBadgeDisplay(descriptor, value, row);\n if (isRenderableNode(slot)) slots.push(slot);\n }\n return slots;\n};\n\nconst collectValuesFromRows = (rows: DataRendererRow[], descriptor: AttributeDescriptor) => {\n const values = new Set<string>();\n for (const row of rows) {\n for (const value of getAttributeStringValues(row, descriptor)) values.add(value);\n }\n return values;\n};\n\nexport interface FilterCategoryView {\n id: string;\n label: string;\n selectionMode: \"multiple\";\n options: { value: string; label: string; color?: string }[];\n}\n\n/**\n * Build the filter menu's category list from the declared attributes. Enum\n * descriptors expose their declared options first; auto-derived values from\n * the data fill in the gaps for string / date / number / user attributes (so\n * filter chips for free-form fields don't require declaring every option).\n */\nexport const buildFilterCategories = (\n attributes: AttributeDescriptor[],\n rows: DataRendererRow[],\n): FilterCategoryView[] => {\n const categories: FilterCategoryView[] = [];\n for (const descriptor of attributes) {\n if (!descriptor.filterable) continue;\n\n if (descriptor.type.kind === \"enum\" || descriptor.type.kind === \"enum-multi\") {\n const declared = getEnumOptions(descriptor.type);\n const auto = collectValuesFromRows(rows, descriptor);\n const declaredValues = new Set(declared.map((option) => option.value));\n const undeclared = [...auto]\n .filter((value) => !declaredValues.has(value))\n .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n .map((value) => ({ value, label: toTitleCase(value) }));\n\n categories.push({\n id: descriptor.id,\n label: descriptor.label,\n selectionMode: \"multiple\",\n options: [\n ...declared.map((option) => ({ value: option.value, label: option.label, color: option.color })),\n ...undeclared,\n ],\n });\n continue;\n }\n\n const auto = [...collectValuesFromRows(rows, descriptor)]\n .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))\n .map((value) => ({ value, label: toTitleCase(value) }));\n categories.push({ id: descriptor.id, label: descriptor.label, selectionMode: \"multiple\", options: auto });\n }\n return categories;\n};\n\nexport interface MenuOption {\n value: string;\n label: string;\n}\n\nexport const buildGroupingOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [{ value: NO_GROUPING, label: \"None\" }];\n for (const descriptor of attributes) {\n if (!descriptor.groupable) continue;\n // enum-multi is intentionally not offered for grouping (one row can hold\n // multiple values; we don't double-render).\n if (descriptor.type.kind === \"enum-multi\") continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const buildOrderingOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [{ value: MANUAL_ORDERING, label: \"Manual\" }];\n options.push({ value: \"title\", label: \"Title\" });\n for (const descriptor of attributes) {\n if (!descriptor.sortable) continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const buildDisplayPropertyOptions = (attributes: AttributeDescriptor[]): MenuOption[] => {\n const options: MenuOption[] = [];\n for (const descriptor of attributes) {\n if (!descriptor.displayable) continue;\n options.push({ value: descriptor.id, label: descriptor.label });\n }\n return options;\n};\n\nexport const resolveSubGroupingOptions = (options: MenuOption[], columnGrouping: string) => {\n if (columnGrouping === NO_GROUPING) return options.filter((option) => option.value === NO_GROUPING);\n return options.filter((option) => option.value === NO_GROUPING || option.value !== columnGrouping);\n};\n\nexport const resolveListDropTargetColumnKey = (columnGrouping: string, placement?: { columnKey?: string }) => {\n if (columnGrouping === NO_GROUPING) return \"all\";\n return placement?.columnKey;\n};\n\nexport const resolveKnownColumnKeys = (\n columnGrouping: string,\n attributes: AttributeDescriptor[],\n filters?: DataRendererFilterState,\n) => {\n if (columnGrouping === NO_GROUPING) return undefined;\n const descriptor = findAttribute(attributes, columnGrouping);\n const active = filters?.[columnGrouping];\n if (descriptor && active && active.length > 0) return normalizeFilterValues(descriptor, active);\n if (!descriptor) return undefined;\n if (descriptor.type.kind === \"enum\") return getEnumOptions(descriptor.type).map((option) => option.value);\n return undefined;\n};\n\nexport const normalizeFilterValues = (_descriptor: AttributeDescriptor, values: string[]) => values;\n\nexport const omitFilterCategory = (filters: DataRendererFilterState, id: string): DataRendererFilterState => {\n const next = { ...filters };\n delete next[id];\n return next;\n};\n\n/**\n * Drop persisted settings entries that reference attribute ids no longer\n * declared by the contribution. Falls back to defaults for missing grouping\n * and ordering attributes so a stale saved view still loads cleanly.\n */\nexport const sanitizeSettings = (\n settings: DataRendererSettings,\n attributes: AttributeDescriptor[],\n): DataRendererSettings => {\n const knownIds = new Set(attributes.map((attribute) => attribute.id));\n const validGroupingId = (id: string) => id === NO_GROUPING || knownIds.has(id);\n const validOrderingId = (id: string) => id === MANUAL_ORDERING || id === \"title\" || knownIds.has(id);\n\n const columnGrouping = validGroupingId(settings.columnGrouping) ? settings.columnGrouping : NO_GROUPING;\n const rowGrouping = validGroupingId(settings.rowGrouping) ? settings.rowGrouping : NO_GROUPING;\n const orderingId = validOrderingId(settings.ordering.attributeId) ? settings.ordering.attributeId : MANUAL_ORDERING;\n const displayProperties = settings.displayProperties.filter(validGroupingId);\n\n return {\n viewMode: settings.viewMode,\n columnGrouping,\n rowGrouping,\n ordering: { attributeId: orderingId, direction: settings.ordering.direction },\n displayProperties,\n };\n};\n\nexport const sanitizeFilters = (filters: DataRendererFilterState, attributes: AttributeDescriptor[]) => {\n const attributesById = new Map(attributes.map((attribute) => [attribute.id, attribute]));\n const next: DataRendererFilterState = {};\n for (const [id, values] of Object.entries(filters)) {\n const descriptor = attributesById.get(id);\n if (!descriptor) continue;\n if (!values || values.length === 0) continue;\n next[id] = normalizeFilterValues(descriptor, values);\n }\n return next;\n};\n","import {\n enumOptionLabel,\n getAttributeStringValues,\n getAttributeValue,\n getEnumOptions,\n normalizeFilterValues,\n toTitleCase,\n} from \"./data-renderer-helpers\";\nimport {\n type AttributeDescriptor,\n type AttributeType,\n type DataRendererFilterState,\n type DataRendererOrdering,\n type DataRendererRow,\n findAttribute,\n MANUAL_ORDERING,\n NO_GROUPING,\n} from \"./types\";\n\ninterface GroupingOptions {\n attributes: AttributeDescriptor[];\n columnGrouping: string;\n rowGrouping: string;\n knownColumnKeys?: string[];\n}\n\ninterface DataRendererRowGroup {\n key: string;\n label: string;\n rows: DataRendererRow[];\n}\n\ninterface DataRendererColumnGroup {\n key: string;\n label: string;\n rows: DataRendererRow[];\n subgroups: DataRendererRowGroup[];\n}\n\nconst UNASSIGNED_LABEL = \"Unassigned\";\n\nconst fallbackLabel = (descriptor: AttributeDescriptor) => `No ${descriptor.label.toLowerCase()}`;\n\nconst labelForGroupKey = (key: string, descriptor: AttributeDescriptor | undefined) => {\n if (!descriptor) return key === NO_GROUPING ? \"All\" : key;\n if (descriptor.type.kind === \"enum\" || descriptor.type.kind === \"enum-multi\")\n return enumOptionLabel(descriptor.type, key);\n return key;\n};\n\n// Drops values that are no longer a declared enum option so rows pointing at a\n// removed status collapse into the \"No <attribute>\" column instead of stranding\n// an orphaned column keyed by the deleted value.\nconst resolveGroupingValue = (value: string | undefined, descriptor: AttributeDescriptor) => {\n if (value === undefined) return undefined;\n if (descriptor.type.kind !== \"enum\" && descriptor.type.kind !== \"enum-multi\") return value;\n return getEnumOptions(descriptor.type).some((option) => option.value === value) ? value : undefined;\n};\n\nconst getGroupingKey = (row: DataRendererRow, descriptor: AttributeDescriptor | undefined, columnId: string) => {\n if (columnId === NO_GROUPING) return \"all\";\n if (!descriptor) return \"all\";\n // Grouping by an enum-multi is intentionally rejected at the renderer level\n // (the contribution lists it as non-groupable). Defensive fallback: treat\n // each row as a single bucket using its first value, else fallback.\n if (descriptor.type.kind === \"enum-multi\") {\n const [first] = getAttributeStringValues(row, descriptor);\n return resolveGroupingValue(first, descriptor) ?? fallbackLabel(descriptor);\n }\n const [value] = getAttributeStringValues(row, descriptor);\n return resolveGroupingValue(value, descriptor) ?? fallbackLabel(descriptor);\n};\n\nconst compareGroupKey = (a: string, b: string) => a.localeCompare(b, undefined, { numeric: true });\n\nconst compareGroupKeyForDescriptor = (a: string, b: string, descriptor: AttributeDescriptor | undefined) => {\n if (descriptor && (descriptor.type.kind === \"enum\" || descriptor.type.kind === \"enum-multi\")) {\n const ordered = compareEnumValues(a, b, descriptor.type);\n if (ordered !== 0) return ordered;\n }\n return compareGroupKey(a, b);\n};\n\nconst orderByDirection = (value: number, direction: DataRendererOrdering[\"direction\"]) =>\n direction === \"asc\" ? value : value * -1;\n\nconst compareEnumValues = (left: string | undefined, right: string | undefined, type: AttributeType) => {\n if (type.kind !== \"enum\" && type.kind !== \"enum-multi\") return 0;\n const options = getEnumOptions(type);\n const toIndex = (value: string | undefined) => {\n if (value === undefined) return options.length;\n const index = options.findIndex((option) => option.value === value);\n return index === -1 ? options.length + 1 : index;\n };\n return toIndex(left) - toIndex(right);\n};\n\nconst compareForDescriptor = (a: DataRendererRow, b: DataRendererRow, descriptor: AttributeDescriptor) => {\n if (descriptor.compare) return descriptor.compare(getAttributeValue(a, descriptor), getAttributeValue(b, descriptor));\n\n const left = getAttributeValue(a, descriptor);\n const right = getAttributeValue(b, descriptor);\n\n if (descriptor.type.kind === \"date\") {\n const leftTime = typeof left === \"string\" ? new Date(left).getTime() : 0;\n const rightTime = typeof right === \"string\" ? new Date(right).getTime() : 0;\n return leftTime - rightTime;\n }\n\n if (descriptor.type.kind === \"number\") {\n const leftNum = typeof left === \"number\" ? left : Number(left ?? 0);\n const rightNum = typeof right === \"number\" ? right : Number(right ?? 0);\n return leftNum - rightNum;\n }\n\n if (descriptor.type.kind === \"enum\" || descriptor.type.kind === \"enum-multi\") {\n const [leftValue] = getAttributeStringValues(a, descriptor);\n const [rightValue] = getAttributeStringValues(b, descriptor);\n return compareEnumValues(leftValue, rightValue, descriptor.type);\n }\n\n const leftString = typeof left === \"string\" ? left : String(left ?? \"\");\n const rightString = typeof right === \"string\" ? right : String(right ?? \"\");\n return leftString.localeCompare(rightString, undefined, { numeric: true });\n};\n\nexport const orderRows = (\n rows: DataRendererRow[],\n ordering: DataRendererOrdering,\n attributes: AttributeDescriptor[],\n) => {\n if (ordering.attributeId === MANUAL_ORDERING) return rows;\n\n if (ordering.attributeId === \"title\") {\n return [...rows].sort((a, b) => orderByDirection(a.title.localeCompare(b.title), ordering.direction));\n }\n\n const descriptor = findAttribute(attributes, ordering.attributeId);\n if (!descriptor) return rows;\n\n return [...rows].sort((a, b) => orderByDirection(compareForDescriptor(a, b, descriptor), ordering.direction));\n};\n\nexport const groupRows = (rows: DataRendererRow[], options: GroupingOptions): DataRendererColumnGroup[] => {\n const { attributes, columnGrouping, rowGrouping, knownColumnKeys } = options;\n const columnDescriptor = findAttribute(attributes, columnGrouping);\n const rowDescriptor = findAttribute(attributes, rowGrouping);\n const groupedByColumn = new Map<string, DataRendererRow[]>();\n\n if (knownColumnKeys) {\n for (const key of knownColumnKeys) groupedByColumn.set(key, []);\n }\n\n for (const row of rows) {\n const key = getGroupingKey(row, columnDescriptor, columnGrouping);\n groupedByColumn.set(key, [...(groupedByColumn.get(key) ?? []), row]);\n }\n\n const columnEntries = [...groupedByColumn.entries()].sort(([left], [right]) =>\n compareGroupKeyForDescriptor(left, right, columnDescriptor),\n );\n\n return columnEntries.map(([columnKey, columnRows]) => {\n const label = labelForGroupKey(columnKey, columnDescriptor);\n\n if (rowGrouping === NO_GROUPING) {\n return { key: columnKey, label, rows: columnRows, subgroups: [] };\n }\n\n const groupedByRow = new Map<string, DataRendererRow[]>();\n for (const row of columnRows) {\n const rowKey = getGroupingKey(row, rowDescriptor, rowGrouping);\n groupedByRow.set(rowKey, [...(groupedByRow.get(rowKey) ?? []), row]);\n }\n\n const subgroups = [...groupedByRow.entries()]\n .sort(([left], [right]) => compareGroupKeyForDescriptor(left, right, rowDescriptor))\n .map(([rowKey, rowRows]) => ({\n key: rowKey,\n label: labelForGroupKey(rowKey, rowDescriptor) || toTitleCase(rowKey || UNASSIGNED_LABEL),\n rows: rowRows,\n }));\n\n return { key: columnKey, label, rows: columnRows, subgroups };\n });\n};\n\nconst matchesFilter = (row: DataRendererRow, descriptor: AttributeDescriptor, values: string[]) => {\n const rowValues = getAttributeStringValues(row, descriptor);\n const normalizedValues = normalizeFilterValues(descriptor, values);\n return rowValues.some((value) => normalizedValues.includes(value));\n};\n\nexport const filterRows = (\n rows: DataRendererRow[],\n filters: DataRendererFilterState,\n attributes: AttributeDescriptor[],\n) => {\n const activeFilters = Object.entries(filters).filter(\n (entry): entry is [string, string[]] => Array.isArray(entry[1]) && entry[1].length > 0,\n );\n if (activeFilters.length === 0) return rows;\n\n return rows.filter((row) =>\n activeFilters.every(([id, values]) => {\n const descriptor = findAttribute(attributes, id);\n if (!descriptor) return true;\n return matchesFilter(row, descriptor, values);\n }),\n );\n};\n\nexport const countFilterValues = (rows: DataRendererRow[], attributeId: string, attributes: AttributeDescriptor[]) => {\n const counts: Record<string, number> = {};\n const descriptor = findAttribute(attributes, attributeId);\n if (!descriptor) return counts;\n for (const row of rows) {\n for (const value of getAttributeStringValues(row, descriptor)) {\n counts[value] = (counts[value] ?? 0) + 1;\n }\n }\n return counts;\n};\n\nexport type { DataRendererColumnGroup, DataRendererRowGroup };\n","import { Button, HStack, Icon, IconButton, Menu, Popover, Portal, Separator, Stack, Text } from \"@chakra-ui/react\";\nimport { ArrowDownAZ, ArrowDownZA, Check, ChevronDown, KanbanSquare, List, Settings2 } from \"lucide-react\";\nimport { Fragment, useEffect, useRef, useState } from \"react\";\nimport { type MenuOption, resolveSubGroupingOptions } from \"./data-renderer-helpers\";\nimport type { DataRendererSettings } from \"./types\";\n\ninterface DisplayMenuProps {\n settings: DataRendererSettings;\n groupingOptions: MenuOption[];\n orderingOptions: MenuOption[];\n displayPropertyOptions: MenuOption[];\n onViewModeChange: (value: DataRendererSettings[\"viewMode\"]) => void;\n onColumnGroupingChange: (value: string) => void;\n onRowGroupingChange: (value: string) => void;\n onOrderingAttributeIdChange: (value: string) => void;\n onSortDirectionToggle: () => void;\n onDisplayPropertyToggle: (property: string) => void;\n}\n\nconst SectionLabel = (props: { children: string }) => (\n <Text textStyle=\"label/XS/medium\" color=\"fg.muted\">\n {props.children}\n </Text>\n);\n\nconst viewModeOptions = [\n { value: \"list\", label: \"List\", icon: List },\n { value: \"board\", label: \"Board\", icon: KanbanSquare },\n] as const;\n\nconst Dropdown = (props: {\n label: string;\n value: string;\n options: MenuOption[];\n onSelect: (value: string) => void;\n flex?: string | number;\n}) => {\n const selectedLabel = props.options.find((option) => option.value === props.value)?.label ?? props.label;\n const hasNoneFirst = props.options[0]?.value === \"none\";\n\n return (\n <Stack gap=\"2xs\" flex={props.flex}>\n <SectionLabel>{props.label}</SectionLabel>\n <Menu.Root>\n <Menu.Trigger asChild>\n <Button size=\"sm\" variant=\"outline\" width=\"full\" justifyContent=\"space-between\">\n {selectedLabel}\n <Icon as={ChevronDown} color=\"fg.muted\" />\n </Button>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"260px\" bg=\"bg\">\n {props.options.map((option, index) => (\n <Fragment key={option.value}>\n {hasNoneFirst && index === 1 ? <Menu.Separator /> : null}\n <Menu.Item value={option.value} onClick={() => props.onSelect(option.value)}>\n <HStack gap=\"2\" justifyContent=\"space-between\" width=\"full\">\n <Text textStyle=\"label/S/regular\">{option.label}</Text>\n {option.value === props.value ? <Icon as={Check} boxSize=\"14px\" color=\"fg.muted\" /> : null}\n </HStack>\n </Menu.Item>\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n </Stack>\n );\n};\n\nexport const DisplayMenu = (props: DisplayMenuProps) => {\n const {\n settings,\n groupingOptions,\n orderingOptions,\n displayPropertyOptions,\n onViewModeChange,\n onColumnGroupingChange,\n onRowGroupingChange,\n onOrderingAttributeIdChange,\n onSortDirectionToggle,\n onDisplayPropertyToggle,\n } = props;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const SortDirectionIcon = settings.ordering.direction === \"asc\" ? ArrowDownAZ : ArrowDownZA;\n\n useEffect(() => {\n if (!open) return;\n\n const closeOnOutsidePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (contentRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n setOpen(false);\n };\n\n document.addEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n return () => document.removeEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n }, [open]);\n\n return (\n <Popover.Root\n open={open}\n closeOnInteractOutside={false}\n positioning={{ placement: \"bottom-end\", offset: { mainAxis: 8 } }}\n onOpenChange={(event) => setOpen(event.open)}\n >\n <Popover.Trigger asChild>\n <IconButton ref={triggerRef} aria-label=\"Display settings\" variant=\"ghost\" size=\"sm\">\n <Icon as={Settings2} boxSize=\"14px\" />\n </IconButton>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content ref={contentRef} width=\"320px\" p=\"sm\" bg=\"bg\">\n <Stack gap=\"sm\">\n <SectionLabel>View</SectionLabel>\n <HStack gap=\"2xs\">\n {viewModeOptions.map((option) => {\n const ViewModeIcon = option.icon;\n const active = settings.viewMode === option.value;\n\n return (\n <Button\n key={option.value}\n flex=\"1\"\n size=\"sm\"\n variant={active ? \"primary\" : \"outline\"}\n aria-pressed={active}\n onClick={() => onViewModeChange(option.value)}\n >\n <ViewModeIcon size={14} />\n {option.label}\n </Button>\n );\n })}\n </HStack>\n\n <Separator />\n\n <Dropdown\n label=\"Grouping\"\n value={settings.columnGrouping}\n options={groupingOptions}\n onSelect={(value) => {\n onColumnGroupingChange(value);\n if (value === \"none\" || value === settings.rowGrouping) onRowGroupingChange(\"none\");\n }}\n />\n\n <Dropdown\n label=\"Sub-grouping\"\n value={settings.rowGrouping}\n options={resolveSubGroupingOptions(groupingOptions, settings.columnGrouping)}\n onSelect={onRowGroupingChange}\n />\n\n <HStack gap=\"2xs\" alignItems=\"end\">\n <Dropdown\n label=\"Sort by\"\n value={settings.ordering.attributeId}\n options={orderingOptions}\n onSelect={onOrderingAttributeIdChange}\n flex=\"1\"\n />\n <IconButton\n aria-label=\"Toggle sort direction\"\n size=\"sm\"\n variant=\"outline\"\n onClick={onSortDirectionToggle}\n data-direction={settings.ordering.direction}\n >\n <Icon as={SortDirectionIcon} />\n </IconButton>\n </HStack>\n\n <Separator />\n <Stack gap=\"2xs\">\n <SectionLabel>Display properties</SectionLabel>\n <HStack flexWrap=\"wrap\" gap=\"2xs\">\n {displayPropertyOptions.map((option) => {\n const isActive = settings.displayProperties.includes(option.value);\n\n return (\n <Button\n key={option.value}\n size=\"2xs\"\n variant={isActive ? \"primary\" : \"outline\"}\n onClick={() => onDisplayPropertyToggle(option.value)}\n >\n {option.label}\n </Button>\n );\n })}\n </HStack>\n </Stack>\n </Stack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { Badge, Button, HStack, Icon, IconButton, Popover, Portal, Stack, Text } from \"@chakra-ui/react\";\nimport { Filter } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Header } from \"@/components/layout/header\";\nimport { Checkbox } from \"@/components/primitives/checkbox\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport { ListRow } from \"../list-row/list-row\";\nimport type { FilterCategoryView } from \"./data-renderer-helpers\";\nimport type { DataRendererFilterState } from \"./types\";\n\ninterface FilterMenuProps {\n categories: FilterCategoryView[];\n filters: DataRendererFilterState;\n countsByCategory: Record<string, Record<string, number>>;\n onToggleFilterValue: (attributeId: string, value: string) => void;\n onClearFilter: (attributeId: string) => void;\n onClearAll: () => void;\n}\n\ninterface FilterOptionRowProps {\n option: FilterCategoryView[\"options\"][number];\n checked: boolean;\n count: number;\n onSelect: () => void;\n}\n\nconst filterGroupContentProps = {\n p: \"xs\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1px\",\n} as const;\n\nconst normalizeSelectedValues = (selected: string[] | undefined) => {\n if (!selected || selected.length === 0) return [];\n return selected;\n};\n\nconst buildNormalizedFilters = (categories: FilterCategoryView[], filters: DataRendererFilterState) => {\n const normalized: DataRendererFilterState = {};\n for (const category of categories) {\n const values = normalizeSelectedValues(filters[category.id]);\n if (values.length > 0) normalized[category.id] = values;\n }\n return normalized;\n};\n\nconst getActiveFilterCount = (filters: DataRendererFilterState) =>\n Object.values(filters).reduce((sum, values) => sum + (values?.length ?? 0), 0);\n\nconst getSelectedFilterDescription = (category: FilterCategoryView, selectedValues: string[]) => {\n if (selectedValues.length === 0) return undefined;\n\n const labels = selectedValues.map(\n (value) => category.options.find((option) => option.value === value)?.label ?? value,\n );\n\n if (labels.length <= 2) return labels.join(\", \");\n\n return `${labels.slice(0, 2).join(\", \")} +${labels.length - 2}`;\n};\n\nconst FilterCategoryLabel = (props: { label: string; selectedDescription?: string }) => {\n const { label, selectedDescription } = props;\n\n return (\n <HStack gap=\"2xs\" minW=\"0\" width=\"full\">\n <Text as=\"span\" textStyle=\"label/S/regular\" color=\"inherit\" flexShrink={0} truncate>\n {label}\n </Text>\n {selectedDescription ? (\n <Text as=\"span\" textStyle=\"label/XS\" color=\"fg.menu-item.secondary\" minW=\"0\" truncate>\n {selectedDescription}\n </Text>\n ) : null}\n </HStack>\n );\n};\n\nconst FilterOptionLabel = (props: { label: string; checked: boolean }) => {\n const { label, checked } = props;\n\n return (\n <HStack gap=\"2\" minW=\"0\">\n <Checkbox\n checked={checked}\n readOnly\n aria-readonly=\"true\"\n inputProps={{ tabIndex: -1, \"aria-hidden\": true }}\n pointerEvents=\"none\"\n size=\"sm\"\n />\n <Text textStyle=\"label/S/regular\" color=\"inherit\" truncate>\n {label}\n </Text>\n </HStack>\n );\n};\n\nconst FilterOptionRow = (props: FilterOptionRowProps) => {\n const { option, checked, count, onSelect } = props;\n\n return (\n <ListRow\n id={option.value}\n role=\"checkbox\"\n aria-label={option.label}\n aria-checked={checked}\n variant=\"compact\"\n label={<FilterOptionLabel label={option.label} checked={checked} />}\n endContent={\n <Text textStyle=\"label/XS/regular\" color=\"fg.muted\">\n {count}\n </Text>\n }\n onActivate={onSelect}\n />\n );\n};\n\nexport const FilterMenu = (props: FilterMenuProps) => {\n const { categories, filters, countsByCategory, onToggleFilterValue, onClearFilter, onClearAll } = props;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const [activeCategoryId, setActiveCategoryId] = useState<string>(categories[0]?.id ?? \"\");\n\n const activeCategory = categories.find((category) => category.id === activeCategoryId) ?? categories[0];\n\n const normalizedFilters = buildNormalizedFilters(categories, filters);\n const activeFilterCount = getActiveFilterCount(normalizedFilters);\n\n const handleOptionSelect = (category: FilterCategoryView, value: string) => {\n onToggleFilterValue(category.id, value);\n };\n\n useEffect(() => {\n if (!open) return;\n\n const closeOnOutsidePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (contentRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n setOpen(false);\n };\n\n document.addEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n return () => document.removeEventListener(\"pointerdown\", closeOnOutsidePointerDown);\n }, [open]);\n\n return (\n <Popover.Root\n open={open}\n closeOnInteractOutside={false}\n positioning={{ placement: \"bottom-end\", offset: { mainAxis: 8 } }}\n onOpenChange={(event) => setOpen(event.open)}\n >\n <Popover.Trigger asChild>\n <IconButton ref={triggerRef} aria-label=\"Filter rows\" variant=\"ghost\" size=\"sm\">\n <HStack gap=\"2xs\">\n <Icon as={Filter} boxSize=\"14px\" />\n {activeFilterCount > 0 ? (\n <Badge variant=\"number\" colorPalette=\"blue\">\n {activeFilterCount}\n </Badge>\n ) : null}\n </HStack>\n </IconButton>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n ref={contentRef}\n width=\"min(440px, calc(100vw - 32px))\"\n height=\"min(320px, calc(100vh - 32px))\"\n p=\"0\"\n bg=\"bg\"\n gap=\"0\"\n overflow=\"hidden\"\n >\n <HStack align=\"stretch\" gap=\"0\" minH=\"0\" height=\"full\">\n <Stack minWidth=\"188px\" borderRightWidth=\"1px\" borderColor=\"border.subtle\" gap=\"0\" minH=\"0\">\n <Header\n variant=\"narrow\"\n justifyContent=\"space-between\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.subtle\"\n >\n <Text textStyle=\"label/XS/medium\" color=\"fg.muted\">\n Filters\n </Text>\n <Button size=\"2xs\" variant=\"ghost\" onClick={onClearAll}>\n Clear all\n </Button>\n </Header>\n <ScrollArea\n flex=\"1\"\n minH=\"0\"\n viewportProps={{ overscrollBehavior: \"contain\" }}\n contentProps={filterGroupContentProps}\n >\n {categories.map((category) => {\n const selectedValues = normalizedFilters[category.id] ?? [];\n const selectedDescription = getSelectedFilterDescription(category, selectedValues);\n\n return (\n <ListRow\n key={category.id}\n id={category.id}\n label={<FilterCategoryLabel label={category.label} selectedDescription={selectedDescription} />}\n role=\"button\"\n variant=\"compact\"\n isSelected={activeCategory?.id === category.id}\n endContent={\n selectedValues.length > 0 ? (\n <Badge variant=\"number\" colorPalette=\"gray\">\n {selectedValues.length}\n </Badge>\n ) : undefined\n }\n onActivate={() => setActiveCategoryId(category.id)}\n />\n );\n })}\n </ScrollArea>\n </Stack>\n\n <Stack flex=\"1\" gap=\"0\" minW=\"0\" minH=\"0\">\n {activeCategory ? (\n <>\n <Header\n variant=\"narrow\"\n justifyContent=\"space-between\"\n borderBottomWidth=\"1px\"\n borderColor=\"border.subtle\"\n >\n <Text textStyle=\"label/S/medium\">{activeCategory.label}</Text>\n <Button size=\"2xs\" variant=\"ghost\" onClick={() => onClearFilter(activeCategory.id)}>\n Clear\n </Button>\n </Header>\n <ScrollArea\n flex=\"1\"\n minH=\"0\"\n viewportProps={{ overscrollBehavior: \"contain\" }}\n contentProps={filterGroupContentProps}\n >\n {activeCategory.options.map((option) => {\n const checked = (normalizedFilters[activeCategory.id] ?? []).includes(option.value);\n const count = countsByCategory[activeCategory.id]?.[option.value] ?? 0;\n\n return (\n <FilterOptionRow\n key={option.value}\n option={option}\n checked={checked}\n count={count}\n onSelect={() => handleOptionSelect(activeCategory, option.value)}\n />\n );\n })}\n </ScrollArea>\n </>\n ) : null}\n </Stack>\n </HStack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { useStore } from \"zustand\";\nimport { createJSONStorage, persist } from \"zustand/middleware\";\nimport { createStore } from \"zustand/vanilla\";\nimport { createBrowserStorage } from \"../../utils/browser-storage\";\nimport { omitFilterCategory } from \"./data-renderer-helpers\";\nimport {\n type DataRendererFilterState,\n type DataRendererSettings,\n DEFAULT_DATA_RENDERER_SETTINGS,\n MANUAL_ORDERING,\n NO_GROUPING,\n} from \"./types\";\n\ninterface DataRendererSnapshot {\n settings: DataRendererSettings;\n filters: DataRendererFilterState;\n expandedGroups: Record<string, boolean>;\n}\n\ninterface DataRendererStoreInitialState {\n settings?: Partial<DataRendererSettings>;\n filters?: DataRendererFilterState;\n expandedGroups?: Record<string, boolean>;\n}\n\ninterface DataRendererState extends DataRendererSnapshot {\n setViewMode: (viewMode: DataRendererSettings[\"viewMode\"]) => void;\n setColumnGrouping: (columnGrouping: DataRendererSettings[\"columnGrouping\"]) => void;\n setRowGrouping: (rowGrouping: DataRendererSettings[\"rowGrouping\"]) => void;\n setOrdering: (ordering: DataRendererSettings[\"ordering\"]) => void;\n setOrderingAttributeId: (attributeId: DataRendererSettings[\"ordering\"][\"attributeId\"]) => void;\n setDisplayProperties: (displayProperties: string[]) => void;\n toggleSortDirection: () => void;\n toggleDisplayProperty: (property: string) => void;\n setFilter: (attributeId: string, values: string[]) => void;\n toggleFilterValue: (attributeId: string, value: string) => void;\n clearFilter: (attributeId: string) => void;\n clearAllFilters: () => void;\n setExpandedGroup: (groupId: string, isExpanded: boolean) => void;\n reset: () => void;\n}\n\ninterface CreateDataRendererStoreOptions {\n storageKey: string;\n initialState?: DataRendererStoreInitialState;\n}\n\nconst WORKSPACE_STORE_NAMESPACE = \"pstdio/ui/data-renderer\";\n\nconst toStorageName = (storageKey: string) => `${WORKSPACE_STORE_NAMESPACE}/${storageKey}`;\n\nconst DEFAULT_SNAPSHOT: DataRendererSnapshot = {\n settings: DEFAULT_DATA_RENDERER_SETTINGS,\n filters: {},\n expandedGroups: {},\n};\n\nconst createSnapshot = (initialState?: DataRendererStoreInitialState): DataRendererSnapshot => ({\n settings: { ...DEFAULT_SNAPSHOT.settings, ...(initialState?.settings ?? {}) },\n filters: initialState?.filters ?? DEFAULT_SNAPSHOT.filters,\n expandedGroups: initialState?.expandedGroups ?? DEFAULT_SNAPSHOT.expandedGroups,\n});\n\nconst toggleValue = (values: string[], value: string) =>\n values.includes(value) ? values.filter((entry) => entry !== value) : [...values, value];\n\n// Strip the legacy \"tag:\" prefix used before attributes became first-class.\nconst stripTagPrefix = (id: string) => (id.startsWith(\"tag:\") ? id.slice(4) : id);\n\nconst migrateSettings = (settings: Record<string, unknown>): DataRendererSettings => {\n const orderingRaw = settings.ordering as Record<string, unknown> | undefined;\n const orderingId =\n typeof orderingRaw?.attributeId === \"string\"\n ? (orderingRaw.attributeId as string)\n : typeof orderingRaw?.field === \"string\"\n ? stripTagPrefix(orderingRaw.field as string)\n : MANUAL_ORDERING;\n const orderingDirection = (\n orderingRaw?.direction === \"desc\" ? \"desc\" : \"asc\"\n ) as DataRendererSettings[\"ordering\"][\"direction\"];\n\n const columnGrouping =\n typeof settings.columnGrouping === \"string\" ? stripTagPrefix(settings.columnGrouping) : NO_GROUPING;\n const rowGrouping = typeof settings.rowGrouping === \"string\" ? stripTagPrefix(settings.rowGrouping) : NO_GROUPING;\n const displayProperties = Array.isArray(settings.displayProperties)\n ? (settings.displayProperties as unknown[])\n .filter((entry): entry is string => typeof entry === \"string\")\n .map(stripTagPrefix)\n : [];\n\n return {\n viewMode: settings.viewMode === \"list\" ? \"list\" : \"board\",\n columnGrouping,\n rowGrouping,\n ordering: { attributeId: orderingId === \"manual\" ? MANUAL_ORDERING : orderingId, direction: orderingDirection },\n displayProperties,\n };\n};\n\nconst migrateFilters = (filters: Record<string, unknown>): DataRendererFilterState => {\n const next: DataRendererFilterState = {};\n for (const [id, values] of Object.entries(filters)) {\n if (!Array.isArray(values)) continue;\n const stringValues = values.filter((value): value is string => typeof value === \"string\");\n if (stringValues.length === 0) continue;\n next[stripTagPrefix(id)] = stringValues;\n }\n return next;\n};\n\nexport const createDataRendererStore = (options: CreateDataRendererStoreOptions) => {\n const { storageKey, initialState } = options;\n const snapshot = createSnapshot(initialState);\n\n return createStore<DataRendererState>()(\n persist(\n (set) => ({\n ...snapshot,\n setViewMode: (viewMode) => set((state) => ({ ...state, settings: { ...state.settings, viewMode } })),\n setColumnGrouping: (columnGrouping) =>\n set((state) => ({ ...state, settings: { ...state.settings, columnGrouping } })),\n setRowGrouping: (rowGrouping) => set((state) => ({ ...state, settings: { ...state.settings, rowGrouping } })),\n setOrdering: (ordering) => set((state) => ({ ...state, settings: { ...state.settings, ordering } })),\n setOrderingAttributeId: (attributeId) =>\n set((state) => ({\n ...state,\n settings: { ...state.settings, ordering: { ...state.settings.ordering, attributeId } },\n })),\n setDisplayProperties: (displayProperties) =>\n set((state) => ({ ...state, settings: { ...state.settings, displayProperties } })),\n toggleSortDirection: () =>\n set((state) => ({\n ...state,\n settings: {\n ...state.settings,\n ordering: {\n ...state.settings.ordering,\n direction: state.settings.ordering.direction === \"asc\" ? \"desc\" : \"asc\",\n },\n },\n })),\n toggleDisplayProperty: (property) =>\n set((state) => {\n const displayProperties = state.settings.displayProperties.includes(property)\n ? state.settings.displayProperties.filter((value) => value !== property)\n : [...state.settings.displayProperties, property];\n return { ...state, settings: { ...state.settings, displayProperties } };\n }),\n setFilter: (attributeId, values) =>\n set((state) => ({ ...state, filters: { ...state.filters, [attributeId]: values } })),\n toggleFilterValue: (attributeId, value) =>\n set((state) => {\n const currentValues = state.filters[attributeId] ?? [];\n const nextValues = toggleValue(currentValues, value);\n const nextFilters =\n nextValues.length === 0\n ? omitFilterCategory(state.filters, attributeId)\n : { ...state.filters, [attributeId]: nextValues };\n return { ...state, filters: nextFilters };\n }),\n clearFilter: (attributeId) =>\n set((state) => ({ ...state, filters: omitFilterCategory(state.filters, attributeId) })),\n clearAllFilters: () => set((state) => ({ ...state, filters: {} })),\n setExpandedGroup: (groupId, isExpanded) =>\n set((state) => ({ ...state, expandedGroups: { ...state.expandedGroups, [groupId]: isExpanded } })),\n reset: () => set(snapshot),\n }),\n {\n name: toStorageName(storageKey),\n version: 2,\n migrate: (persisted, version) => {\n if (!persisted || typeof persisted !== \"object\") return persisted as DataRendererSnapshot;\n const state = persisted as {\n settings?: Record<string, unknown>;\n filters?: Record<string, unknown>;\n expandedGroups?: Record<string, boolean>;\n };\n if (version >= 2) {\n const snapshot = state as unknown as DataRendererSnapshot;\n return { ...snapshot, expandedGroups: snapshot.expandedGroups ?? {} };\n }\n return {\n settings: migrateSettings(state.settings ?? {}),\n filters: migrateFilters(state.filters ?? {}),\n expandedGroups: {},\n };\n },\n storage: createJSONStorage(createBrowserStorage),\n partialize: (state) => ({\n settings: state.settings,\n filters: state.filters,\n expandedGroups: state.expandedGroups,\n }),\n },\n ),\n );\n};\n\nconst workspaceStoreRegistry = new Map<string, ReturnType<typeof createDataRendererStore>>();\n\nexport const getDataRendererStore = (storageKey: string, initialState?: DataRendererStoreInitialState) => {\n const existingStore = workspaceStoreRegistry.get(storageKey);\n if (existingStore) return existingStore;\n\n const store = createDataRendererStore({ storageKey, initialState });\n workspaceStoreRegistry.set(storageKey, store);\n return store;\n};\n\nexport const useDataRendererStore = <T>(\n storageKey: string,\n selector: (state: DataRendererState) => T,\n initialState?: DataRendererStoreInitialState,\n) => {\n const store = getDataRendererStore(storageKey, initialState);\n return useStore(store, selector);\n};\n\nexport type { DataRendererSnapshot, DataRendererState, DataRendererStoreInitialState };\n","import { useEffect, useReducer } from \"react\";\n\nimport type { AttributeDescriptor, EnumOptionsSource } from \"./types\";\nimport { isEnumOptionsSource } from \"./types\";\n\nconst collectSources = (attributes: AttributeDescriptor[]): EnumOptionsSource[] => {\n const sources: EnumOptionsSource[] = [];\n for (const attribute of attributes) {\n if (attribute.type.kind !== \"enum\" && attribute.type.kind !== \"enum-multi\") continue;\n if (isEnumOptionsSource(attribute.type.options)) sources.push(attribute.type.options);\n }\n return sources;\n};\n\n/**\n * Returns the same descriptors with every source-backed enum's options\n * replaced by a fresh `getSnapshot()` array. Pure — call from anywhere that\n * needs a normalized view of the schema.\n */\nexport const resolveAttributeOptions = (attributes: AttributeDescriptor[]): AttributeDescriptor[] =>\n attributes.map((attribute) => {\n if (attribute.type.kind !== \"enum\" && attribute.type.kind !== \"enum-multi\") return attribute;\n if (!isEnumOptionsSource(attribute.type.options)) return attribute;\n return { ...attribute, type: { ...attribute.type, options: attribute.type.options.getSnapshot() } };\n });\n\n/**\n * Subscribes to every source-backed enum in `attributes` and returns the\n * resolved descriptors (options materialized to plain arrays). When any\n * source's listener fires the component rerenders, so downstream renders see\n * the new snapshot automatically.\n */\nexport const useResolvedAttributes = (attributes: AttributeDescriptor[]) => {\n const [, forceRender] = useReducer((tick: number) => tick + 1, 0);\n\n useEffect(() => {\n const sources = collectSources(attributes);\n if (sources.length === 0) return;\n const refresh = () => forceRender();\n const unsubscribes = sources.map((source) => source.subscribe(refresh));\n return () => {\n for (const dispose of unsubscribes) dispose();\n };\n }, [attributes]);\n\n return resolveAttributeOptions(attributes);\n};\n","import { Box, HStack } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\n\nimport { countFilterValues } from \"./data-renderer-grouping\";\nimport {\n buildDisplayPropertyOptions,\n buildFilterCategories,\n buildGroupingOptions,\n buildOrderingOptions,\n} from \"./data-renderer-helpers\";\nimport { DisplayMenu } from \"./display-menu\";\nimport { FilterMenu } from \"./filter-menu\";\nimport type { AttributeDescriptor, DataRendererFilterState, DataRendererRow, DataRendererSettings } from \"./types\";\nimport { useDataRendererStore } from \"./use-data-renderer-store\";\nimport { useResolvedAttributes } from \"./use-resolved-attributes\";\n\nexport interface DataRendererToolbarProps<TRow extends DataRendererRow = DataRendererRow> {\n rows: TRow[];\n storageKey: string;\n attributes: AttributeDescriptor[];\n defaultSettings?: Partial<DataRendererSettings>;\n defaultFilters?: DataRendererFilterState;\n leading?: ReactNode;\n align?: \"split\" | \"end\";\n}\n\nexport const DataRendererToolbar = <TRow extends DataRendererRow>(props: DataRendererToolbarProps<TRow>) => {\n const {\n rows,\n storageKey,\n attributes: rawAttributes,\n defaultSettings,\n defaultFilters,\n leading,\n align = \"split\",\n } = props;\n\n const attributes = useResolvedAttributes(rawAttributes);\n const groupingOptions = buildGroupingOptions(attributes);\n const orderingOptions = buildOrderingOptions(attributes);\n const displayPropertyOptions = buildDisplayPropertyOptions(attributes);\n\n const initialState = { settings: defaultSettings, filters: defaultFilters };\n const settings = useDataRendererStore(storageKey, (state) => state.settings, initialState);\n const filters = useDataRendererStore(storageKey, (state) => state.filters, initialState);\n const setViewMode = useDataRendererStore(storageKey, (state) => state.setViewMode, initialState);\n const setColumnGrouping = useDataRendererStore(storageKey, (state) => state.setColumnGrouping, initialState);\n const setRowGrouping = useDataRendererStore(storageKey, (state) => state.setRowGrouping, initialState);\n const setOrderingAttributeId = useDataRendererStore(\n storageKey,\n (state) => state.setOrderingAttributeId,\n initialState,\n );\n const toggleSortDirection = useDataRendererStore(storageKey, (state) => state.toggleSortDirection, initialState);\n const toggleDisplayProperty = useDataRendererStore(storageKey, (state) => state.toggleDisplayProperty, initialState);\n const toggleFilterValue = useDataRendererStore(storageKey, (state) => state.toggleFilterValue, initialState);\n const clearFilter = useDataRendererStore(storageKey, (state) => state.clearFilter, initialState);\n const clearAllFilters = useDataRendererStore(storageKey, (state) => state.clearAllFilters, initialState);\n\n const categoryOptions = buildFilterCategories(attributes, rows);\n const countsByCategory = Object.fromEntries(\n categoryOptions.map((category) => [category.id, countFilterValues(rows, category.id, attributes)]),\n );\n\n return (\n <HStack\n gap=\"2xs\"\n minW=\"0\"\n w={align === \"split\" ? \"full\" : undefined}\n flexShrink={0}\n borderBottomWidth=\"1px\"\n borderColor=\"border.subtle\"\n padding=\"2xs\"\n >\n {leading}\n {align === \"split\" ? <Box flex=\"1\" /> : null}\n <FilterMenu\n categories={categoryOptions}\n filters={filters}\n countsByCategory={countsByCategory}\n onToggleFilterValue={toggleFilterValue}\n onClearFilter={clearFilter}\n onClearAll={clearAllFilters}\n />\n <DisplayMenu\n settings={settings}\n groupingOptions={groupingOptions}\n orderingOptions={orderingOptions}\n displayPropertyOptions={displayPropertyOptions}\n onViewModeChange={setViewMode}\n onColumnGroupingChange={setColumnGrouping}\n onRowGroupingChange={setRowGrouping}\n onOrderingAttributeIdChange={setOrderingAttributeId}\n onSortDirectionToggle={toggleSortDirection}\n onDisplayPropertyToggle={toggleDisplayProperty}\n />\n </HStack>\n );\n};\n","import { Stack } from \"@chakra-ui/react\";\nimport type { ReactNode } from \"react\";\n\nimport type { ResourceContextAction } from \"@/components/overlays/resource-context-menu\";\nimport type {\n DataRendererBoardColumn,\n DataRendererBoardColumnAction,\n DataRendererBoardGroup,\n} from \"./data-renderer-board\";\nimport { applyBoardMoveItem, applyBoardMoveToGroup } from \"./data-renderer-board-move\";\nimport { DataRendererContent } from \"./data-renderer-content\";\nimport { type DataRendererColumnGroup, filterRows, groupRows, orderRows } from \"./data-renderer-grouping\";\nimport {\n collectDisplayBadges,\n collectDisplayCustomSlots,\n findEnumOption,\n resolveKnownColumnKeys,\n resolveListDropTargetColumnKey,\n} from \"./data-renderer-helpers\";\nimport type { DataRendererListItem } from \"./data-renderer-list\";\nimport { DataRendererToolbar } from \"./data-renderer-toolbar\";\nimport type { AttributeDescriptor, DataRendererFilterState, DataRendererRow, DataRendererSettings } from \"./types\";\nimport { findAttribute, MANUAL_ORDERING, NO_GROUPING } from \"./types\";\nimport { useDataRendererStore } from \"./use-data-renderer-store\";\nimport { useResolvedAttributes } from \"./use-resolved-attributes\";\n\n/** Board-column behavior and menu configuration for a resolved column group. */\nexport interface BoardColumnConfig {\n /** Chakra color palette used for the column header and group badges. */\n color?: string;\n canDragIn?: boolean;\n canDragOut?: boolean;\n canCreate?: boolean;\n actions?: DataRendererBoardColumnAction[];\n}\n\n/** Switchable list/board renderer for rows with typed attributes, filtering, grouping, and ordering. */\nexport interface DataRendererProps<TRow extends DataRendererRow = DataRendererRow> {\n /** Stable rows to render. Each row must have an id, title, and attributes map. */\n rows: TRow[];\n /** Persistent key used by the renderer store for view, filter, grouping, ordering, and list expansion settings. */\n storageKey: string;\n /** Attribute descriptors that define display, filtering, grouping, ordering, and board columns. */\n attributes: AttributeDescriptor[];\n selectedRowId?: string | null;\n emptyState?: ReactNode;\n emptyTitle?: string;\n emptyDescription?: string;\n defaultSettings?: Partial<DataRendererSettings>;\n defaultFilters?: DataRendererFilterState;\n hideToolbar?: boolean;\n toolbarLeading?: ReactNode;\n onRowClick?: (row: TRow) => void;\n /** Called when a row attribute changes through drag/drop, board movement, or inline controls. */\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n /** Called for manual row ordering when a dragged row is dropped before another row. */\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n onCreateRow?: (columnId: string) => void;\n onColumnAction?: (columnId: string, actionId: string) => Promise<void> | void;\n getBoardColumnConfig?: (groupKey: string) => BoardColumnConfig;\n getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];\n}\n\ninterface BuildListItemsInput<TRow extends DataRendererRow> {\n settings: DataRendererSettings;\n visibleRows: TRow[];\n grouped: DataRendererColumnGroup[];\n attributes: AttributeDescriptor[];\n onRowClick?: (row: TRow) => void;\n onAttributeChange?: (rowId: string, attributeId: string, value: unknown) => Promise<void> | void;\n onReorder?: (rowId: string, beforeRowId?: string) => Promise<void> | void;\n getRowContextMenuActions?: (row: TRow) => ResourceContextAction[];\n}\n\nconst buildListItems = <TRow extends DataRendererRow>(input: BuildListItemsInput<TRow>): DataRendererListItem[] => {\n const {\n settings,\n visibleRows,\n grouped,\n attributes,\n onRowClick,\n onAttributeChange,\n onReorder,\n getRowContextMenuActions,\n } = input;\n\n const supportsManualReorder = settings.ordering.attributeId === MANUAL_ORDERING;\n const getGroupColorPalette = (attributeId: string, key: string) => {\n const descriptor = findAttribute(attributes, attributeId);\n return descriptor ? findEnumOption(descriptor.type, key)?.color : undefined;\n };\n\n const toListItem = (row: TRow, placement?: { columnKey?: string; rowKey?: string }): DataRendererListItem => ({\n id: row.id,\n title: row.title,\n badges: collectDisplayBadges(row, attributes, settings.displayProperties),\n customSlots: collectDisplayCustomSlots(row, attributes, settings.displayProperties),\n contextMenuActions: getRowContextMenuActions?.(row),\n onClick: () => onRowClick?.(row),\n onBadgeChange: onAttributeChange\n ? (attributeId: string, value: unknown) => onAttributeChange(row.id, attributeId, value)\n : undefined,\n draggable: Boolean(onAttributeChange || onReorder),\n onDropRow:\n supportsManualReorder && (onAttributeChange || onReorder)\n ? (draggedId) => {\n const targetColumnKey = resolveListDropTargetColumnKey(settings.columnGrouping, placement);\n if (targetColumnKey && settings.columnGrouping !== NO_GROUPING && onAttributeChange) {\n onAttributeChange(draggedId, settings.columnGrouping, targetColumnKey);\n }\n if (settings.rowGrouping !== NO_GROUPING && placement?.rowKey && onAttributeChange) {\n onAttributeChange(draggedId, settings.rowGrouping, placement.rowKey);\n }\n onReorder?.(draggedId, row.id);\n }\n : undefined,\n });\n\n const toSubgroupListItem = (\n subgroup: { key: string; label: string; rows: DataRendererRow[] },\n parent?: { columnKey: string },\n ): DataRendererListItem => ({\n id: parent ? `group::${parent.columnKey}::${subgroup.key}` : `group::${subgroup.key}`,\n title: subgroup.label,\n countBadge: subgroup.rows.length,\n countColorPalette: getGroupColorPalette(parent ? settings.rowGrouping : settings.columnGrouping, subgroup.key),\n onDropRow:\n onAttributeChange && settings.columnGrouping !== NO_GROUPING\n ? (draggedId) => {\n const columnKey = parent?.columnKey ?? subgroup.key;\n onAttributeChange(draggedId, settings.columnGrouping, columnKey);\n if (settings.rowGrouping !== NO_GROUPING && parent) {\n onAttributeChange(draggedId, settings.rowGrouping, subgroup.key);\n }\n }\n : undefined,\n children: orderRows(subgroup.rows, settings.ordering, attributes).map((row) =>\n toListItem(row as TRow, {\n columnKey: parent?.columnKey ?? subgroup.key,\n rowKey: parent ? subgroup.key : undefined,\n }),\n ),\n });\n\n if (settings.columnGrouping === NO_GROUPING) {\n return orderRows(visibleRows, settings.ordering, attributes).map((row) => toListItem(row as TRow));\n }\n\n return grouped.map((column) => {\n if (column.subgroups.length > 0) {\n return {\n id: `group::${column.key}`,\n title: column.label,\n countBadge: column.rows.length,\n countColorPalette: getGroupColorPalette(settings.columnGrouping, column.key),\n onDropRow: onAttributeChange\n ? (draggedId: string) => onAttributeChange(draggedId, settings.columnGrouping, column.key)\n : undefined,\n children: column.subgroups.map((subgroup) => toSubgroupListItem(subgroup, { columnKey: column.key })),\n } satisfies DataRendererListItem;\n }\n\n return toSubgroupListItem(column);\n });\n};\n\nexport const DataRenderer = <TRow extends DataRendererRow>(props: DataRendererProps<TRow>) => {\n const {\n rows,\n storageKey,\n attributes: rawAttributes,\n selectedRowId = null,\n emptyState,\n emptyTitle = \"No rows found\",\n emptyDescription = \"Try changing filters or display settings.\",\n defaultSettings,\n defaultFilters,\n onRowClick,\n onAttributeChange,\n onReorder,\n onCreateRow,\n onColumnAction,\n getBoardColumnConfig,\n getRowContextMenuActions,\n hideToolbar = false,\n toolbarLeading,\n } = props;\n\n const attributes = useResolvedAttributes(rawAttributes);\n const initialState = { settings: defaultSettings, filters: defaultFilters };\n const settings = useDataRendererStore(storageKey, (state) => state.settings, initialState);\n const filters = useDataRendererStore(storageKey, (state) => state.filters, initialState);\n const expandedGroups = useDataRendererStore(storageKey, (state) => state.expandedGroups, initialState);\n const setExpandedGroup = useDataRendererStore(storageKey, (state) => state.setExpandedGroup, initialState);\n\n const visibleRows = filterRows(rows, filters, attributes) as TRow[];\n\n const knownColumnKeys = resolveKnownColumnKeys(settings.columnGrouping, attributes, filters);\n\n const grouped = groupRows(visibleRows, {\n attributes,\n columnGrouping: settings.columnGrouping,\n rowGrouping: settings.rowGrouping,\n knownColumnKeys,\n });\n\n const listItems = buildListItems({\n settings,\n visibleRows,\n grouped,\n attributes,\n onRowClick,\n onAttributeChange,\n onReorder,\n getRowContextMenuActions,\n });\n\n const toBoardItems = (boardRows: DataRendererRow[]) =>\n boardRows.map((row) => ({\n id: row.id,\n contextMenuActions: getRowContextMenuActions?.(row as TRow),\n cardProps: {\n title: row.title,\n badges: collectDisplayBadges(row, attributes, settings.displayProperties),\n customSlots: collectDisplayCustomSlots(row, attributes, settings.displayProperties),\n onBadgeChange: onAttributeChange\n ? (attributeId: string, value: unknown) => onAttributeChange(row.id, attributeId, value)\n : undefined,\n onClick: () => onRowClick?.(row as TRow),\n },\n }));\n\n const columnGroupingDescriptor = findAttribute(attributes, settings.columnGrouping);\n\n const boardColumns: DataRendererBoardColumn[] = grouped.map((column) => {\n const columnConfig = getBoardColumnConfig?.(column.key) ?? {};\n const orderedRows = orderRows(column.rows, settings.ordering, attributes);\n // Column color follows the enum option when the contribution does not\n // provide one, while row display badges stay visually neutral.\n const enumColor = columnGroupingDescriptor\n ? findEnumOption(columnGroupingDescriptor.type, column.key)?.color\n : undefined;\n\n const groups: DataRendererBoardGroup[] | undefined =\n column.subgroups.length > 0\n ? column.subgroups.map((subgroup) => ({\n key: subgroup.key,\n label: subgroup.label,\n items: toBoardItems(orderRows(subgroup.rows, settings.ordering, attributes)),\n }))\n : undefined;\n\n return {\n id: column.key,\n label: column.label,\n color: columnConfig.color ?? enumColor,\n canDragIn: columnConfig.canDragIn ?? false,\n canDragOut: columnConfig.canDragOut ?? false,\n canCreate: columnConfig.canCreate ?? false,\n actions: columnConfig.actions ?? [],\n items: toBoardItems(orderedRows),\n groups,\n } satisfies DataRendererBoardColumn;\n });\n\n const handleBoardMoveItem = async (\n rowId: string,\n targetColumnId: string,\n context?: { beforeItemId?: string; targetGroupKey?: string },\n ) => {\n await applyBoardMoveItem({\n settings,\n rowId,\n targetColumnId,\n targetGroupKey: context?.targetGroupKey,\n beforeItemId: context?.beforeItemId,\n onAttributeChange,\n onReorder,\n });\n };\n\n const handleBoardMoveToGroup = async (rowId: string, targetGroupKey: string, context?: { beforeItemId?: string }) => {\n await applyBoardMoveToGroup({\n settings,\n rowId,\n targetGroupKey,\n beforeItemId: context?.beforeItemId,\n onAttributeChange,\n onReorder,\n });\n };\n\n return (\n <Stack height=\"100%\" minH=\"0\" gap=\"0\">\n {hideToolbar ? null : (\n <DataRendererToolbar\n rows={rows}\n storageKey={storageKey}\n attributes={attributes}\n defaultSettings={defaultSettings}\n defaultFilters={defaultFilters}\n leading={toolbarLeading}\n />\n )}\n\n <DataRendererContent\n viewMode={settings.viewMode}\n boardColumns={boardColumns}\n listItems={listItems}\n listExpandedGroups={expandedGroups}\n selectedRowId={selectedRowId}\n emptyState={emptyState}\n emptyTitle={emptyTitle}\n emptyDescription={emptyDescription}\n onBoardMoveItem={handleBoardMoveItem}\n onBoardMoveToGroup={handleBoardMoveToGroup}\n onCreateRow={onCreateRow}\n onColumnAction={onColumnAction}\n onListExpandedGroupChange={setExpandedGroup}\n listKey={`${settings.columnGrouping}:${settings.rowGrouping}`}\n />\n </Stack>\n );\n};\n"],"names":["NO_GROUPING","MANUAL_ORDERING","isEnumOptionsSource","options","Array","isArray","isAttributesSource","attributes","DEFAULT_DATA_RENDERER_SETTINGS","viewMode","columnGrouping","rowGrouping","ordering","attributeId","direction","displayProperties","findAttribute","id","find","attribute","applyBoardMoveItem","input","settings","rowId","targetColumnId","targetGroupKey","beforeItemId","onAttributeChange","onReorder","applyBoardMoveToGroup","ColumnHeader","props","$","_c","column","onCreateStart","onColumnAction","t0","label","jsx","Text","t1","color","t2","items","length","Badge","t3","Symbol","for","Spacer","t4","canCreate","createLabel","Tooltip","IconButton","Icon","Plus","t5","actions","jsxs","Menu","MoreHorizontal","map","action","ListRow","icon","t6","HStack","suppressionKey","getInteractionGlobal","globalThis","suppressNextDataRendererCardClick","Date","now","isDataRendererCardClickSuppressed","stopRowActivation","event","stopPropagation","markRowActivationSuppression","suppressRowActivation","getSelectedValues","badge","value","toggleMultiValue","values","optionValue","includes","filter","badgeStyleProps","bg","_light","_dark","_hover","getBadgeIconColor","selectionIcon","isMultiValue","isSelected","SquareCheck","Square","Check","DataRendererAttributeBadge","onChange","T0","T1","T2","T3","t10","t11","t12","t13","t7","t8","t9","bb0","canEdit","Boolean","isEditable","selectedValues","attributeLabel","t14","onClickCapture","onPointerDownCapture","onKeyDown","rowInteractionProps","handleOptionChange","nextValue","t15","handleClearSelection","t16","getIconComponent","t17","ChevronDown","t18","Fragment","badgeContent","t19","Root","Portal","Positioner","Content","X","option","DataRendererCard","title","badges","customSlots","workspaceBadge","draggable","onBadgeChange","onDragStart","onDragEnd","onClick","undefined","hasBadges","cursor","defaultPrevented","target","Node","currentTarget","contains","handleClick","borderColor","WorkspaceBadge","Wrap","Stack","GroupSection","columnId","group","selectedItemId","canDragIn","canDragOut","isDropTarget","onGroupDragOver","onGroupDragLeave","onGroupDrop","expanded","setExpanded","useState","_temp","Box","ChevronRight","item","ResourceContextMenu","contextMenuActions","_temp2","event_0","preventDefault","itemId","dataTransfer","getData","cardProps","key","dropEffect","DataRendererBoard","columns","onMoveItem","onMoveToGroup","activeColumn","setActiveColumn","activeGroup","setActiveGroup","handleDragStart","handleDragEnd","handleDragOver","event_1","relatedTarget","handleDragLeave","columnId_0","event_2","itemId_0","handleDrop","display","alignItems","gap","pb","minH","borderLeft","ScrollArea","margin","spaceY","ps","pe","groups","groupId","event_3","event_4","event_5","itemId_1","event_6","event_7","itemId_2","setData","effectAllowed","flattenDataRendererListItems","depth","rows","canExpand","children","push","getRowIsExpanded","getDropTargetIndicatorProps","isGroup","_before","content","position","left","top","width","height","expandedState","updateExpandedState","isExpanded","renderLabel","countBadge","countColorPalette","renderEndContent","buildListRowItem","hasChildren","statusIcon","iconColor","statusColor","endContent","isContainer","contextMenuItems","disabled","isDisabled","separatorBefore","onAction","DataRendererList","expandedGroups","onItemClick","onExpandedGroupChange","localExpandedGroups","setLocalExpandedGroups","activeDropTargetId","setActiveDropTargetId","draggedItemId","setDraggedItemId","current","handleExpandedChange","row","DataRendererListRow","onDraggedItemChange","onDropTargetChange","onExpandedChange","canDropHere","onDropRow","rowItem","toggleExpanded","handleActivate","draggedId","DataRendererEmptyState","emptyState","description","EmptyState","DataRendererContent","boardColumns","listItems","listExpandedGroups","selectedRowId","emptyTitle","emptyDescription","onBoardMoveItem","onBoardMoveToGroup","onCreateRow","onListExpandedGroupChange","listKey","dedupeEnumOptions","seen","Set","has","add","getEnumOptions","type","kind","getSnapshot","toTitleCase","replaceAll","split","chunk","toUpperCase","slice","join","findEnumOption","enumOptionLabel","summarizeMultiEnum","renderEnumBadge","descriptor","stringValue","editable","renderMultiEnumBadge","entry","summary","firstOption","getAttributeValue","raw","getAttributeStringValues","String","formatDateValue","date","Number","isNaN","getTime","toLocaleDateString","formatNumberValue","isFinite","formatStringValue","formatUserValue","isRenderableNode","isRecord","textValue","trim","workspaceTypeFrom","normalizeWorkspaceBadgeItems","flatMap","shorthand","name","renderWorkspaceBadgeDisplay","itemsAttributeId","selectedId","selectedItem","createElement","workspaceType","hasMultipleWorkspaces","showLeadingSessionIndicator","renderAttributeBadge","render","formatted","collectDisplayBadges","displayable","collectDisplayCustomSlots","slots","slot","collectValuesFromRows","buildFilterCategories","categories","filterable","declared","auto","declaredValues","undeclared","sort","a","b","localeCompare","numeric","selectionMode","buildGroupingOptions","groupable","buildOrderingOptions","sortable","buildDisplayPropertyOptions","resolveSubGroupingOptions","resolveListDropTargetColumnKey","placement","columnKey","resolveKnownColumnKeys","filters","active","normalizeFilterValues","_descriptor","omitFilterCategory","next","sanitizeSettings","knownIds","validGroupingId","validOrderingId","orderingId","sanitizeFilters","attributesById","Map","Object","entries","get","UNASSIGNED_LABEL","fallbackLabel","toLowerCase","labelForGroupKey","resolveGroupingValue","some","getGroupingKey","first","compareGroupKey","compareGroupKeyForDescriptor","ordered","compareEnumValues","orderByDirection","right","toIndex","index","findIndex","compareForDescriptor","compare","leftTime","rightTime","leftNum","rightNum","leftValue","rightValue","leftString","rightString","orderRows","groupRows","knownColumnKeys","columnDescriptor","rowDescriptor","groupedByColumn","set","columnRows","subgroups","groupedByRow","rowKey","rowRows","matchesFilter","rowValues","normalizedValues","filterRows","activeFilters","every","countFilterValues","counts","SectionLabel","viewModeOptions","List","KanbanSquare","Dropdown","selectedLabel","hasNoneFirst","flex","Button","option_0","onSelect","DisplayMenu","groupingOptions","orderingOptions","displayPropertyOptions","onViewModeChange","onColumnGroupingChange","onRowGroupingChange","onOrderingAttributeIdChange","onSortDirectionToggle","onDisplayPropertyToggle","triggerRef","useRef","contentRef","open","setOpen","SortDirectionIcon","ArrowDownAZ","ArrowDownZA","closeOnOutsidePointerDown","document","addEventListener","removeEventListener","useEffect","offset","mainAxis","Settings2","ViewModeIcon","Separator","t20","t21","isActive","t22","Popover","t23","filterGroupContentProps","p","flexDirection","normalizeSelectedValues","selected","buildNormalizedFilters","normalized","category","getActiveFilterCount","reduce","sum","getSelectedFilterDescription","labels","FilterCategoryLabel","selectedDescription","FilterOptionLabel","checked","tabIndex","Checkbox","FilterOptionRow","count","FilterMenu","countsByCategory","onToggleFilterValue","onClearFilter","onClearAll","activeCategoryId","setActiveCategoryId","activeCategory","normalizedFilters","activeFilterCount","category_0","handleOptionSelect","Filter","Header","overscrollBehavior","category_1","WORKSPACE_STORE_NAMESPACE","toStorageName","storageKey","DEFAULT_SNAPSHOT","createSnapshot","initialState","toggleValue","stripTagPrefix","startsWith","migrateSettings","orderingRaw","field","orderingDirection","migrateFilters","stringValues","createDataRendererStore","snapshot","createStore","persist","setViewMode","state","setColumnGrouping","setRowGrouping","setOrdering","setOrderingAttributeId","setDisplayProperties","toggleSortDirection","toggleDisplayProperty","property","setFilter","toggleFilterValue","currentValues","nextValues","nextFilters","clearFilter","clearAllFilters","setExpandedGroup","reset","version","migrate","persisted","storage","createJSONStorage","createBrowserStorage","partialize","workspaceStoreRegistry","getDataRendererStore","existingStore","store","useDataRendererStore","selector","useStore","collectSources","sources","resolveAttributeOptions","useResolvedAttributes","forceRender","useReducer","refresh","unsubscribes","source","subscribe","dispose","tick","DataRendererToolbar","rawAttributes","defaultSettings","defaultFilters","leading","align","_temp3","_temp4","_temp5","_temp6","_temp7","_temp8","_temp9","_temp0","_temp1","categoryOptions","fromEntries","state_0","state_1","state_2","state_3","state_4","state_5","state_6","state_7","state_8","state_9","buildListItems","visibleRows","grouped","onRowClick","getRowContextMenuActions","supportsManualReorder","getGroupColorPalette","toListItem","targetColumnKey","toSubgroupListItem","subgroup","parent","DataRenderer","getBoardColumnConfig","hideToolbar","toolbarLeading","boardRows","toBoardItems","columnGroupingDescriptor","columnConfig","orderedRows","enumColor","context","handleBoardMoveItem","rowId_0","context_0","handleBoardMoveToGroup"],"mappings":"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"}