@pstdio/ui 0.18.0 → 0.19.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 (72) hide show
  1. package/dist/chat-ui.js +941 -899
  2. package/dist/chat-ui.js.map +1 -1
  3. package/dist/components/chat-ui/components/chat-message-list-items.d.ts +17 -0
  4. package/dist/components/chat-ui/components/message-types.d.ts +1 -0
  5. package/dist/components/chat-ui/components/timeline.d.ts +2 -0
  6. package/dist/components/chat-ui/tool-rendering/default-renderers.d.ts +1 -0
  7. package/dist/components/chat-ui/tool-rendering/shared.d.ts +3 -2
  8. package/dist/components/chat-ui/tool-rendering/standard-renderers.d.ts +1 -0
  9. package/dist/components/data-table/data-table-skeleton.d.ts +13 -0
  10. package/dist/components/data-table/index.d.ts +2 -0
  11. package/dist/components/overlays/dialog-accept-shortcut.d.ts +12 -0
  12. package/dist/components/overlays/index.d.ts +1 -0
  13. package/dist/components/param-editor/index.d.ts +3 -1
  14. package/dist/components/param-editor/inputs/selection-input.d.ts +5 -0
  15. package/dist/components/param-editor/inputs/selection-menu.d.ts +6 -0
  16. package/dist/components/param-editor/param-editor-row.d.ts +17 -0
  17. package/dist/components/param-editor/param-editor.types.d.ts +18 -0
  18. package/dist/components/primitives/glyph-icon.d.ts +16 -0
  19. package/dist/components/primitives/icon-color-picker.d.ts +3 -13
  20. package/dist/components/primitives/icon-options.d.ts +301 -0
  21. package/dist/components/primitives/index.d.ts +10 -3
  22. package/dist/components/primitives/segmented-control.d.ts +20 -0
  23. package/dist/components/primitives/tag-swatch.d.ts +10 -0
  24. package/dist/components/tag-editor/index.d.ts +4 -0
  25. package/dist/components/tag-editor/tag-editor-heading.d.ts +11 -0
  26. package/dist/components/tag-editor/tag-editor-row.d.ts +1 -1
  27. package/dist/components/tag-editor/tag-editor-save-bar.d.ts +13 -0
  28. package/dist/components/tag-editor/tag-editor.types.d.ts +11 -11
  29. package/dist/components/tag-editor/tag-settings-panel.d.ts +3 -1
  30. package/dist/data-table.js +564 -522
  31. package/dist/data-table.js.map +1 -1
  32. package/dist/dialog-accept-shortcut-DAEBsoWW.js +7 -0
  33. package/dist/dialog-accept-shortcut-DAEBsoWW.js.map +1 -0
  34. package/dist/diff.js +2 -2
  35. package/dist/font/css/prompt-studio-icons.css +36 -6
  36. package/dist/font/prompt-studio-icons.eot +0 -0
  37. package/dist/font/prompt-studio-icons.svg +1 -1
  38. package/dist/font/prompt-studio-icons.ttf +0 -0
  39. package/dist/font/prompt-studio-icons.woff +0 -0
  40. package/dist/font/prompt-studio-icons.woff2 +0 -0
  41. package/dist/index.d.ts +2 -2
  42. package/dist/index.js +1978 -1712
  43. package/dist/index.js.map +1 -1
  44. package/dist/{kanban-renderer-toolbar-Db1mIWWd.js → kanban-renderer-toolbar-Bcj_N1qr.js} +66 -66
  45. package/dist/kanban-renderer-toolbar-Bcj_N1qr.js.map +1 -0
  46. package/dist/kanban-renderer.js +138 -135
  47. package/dist/kanban-renderer.js.map +1 -1
  48. package/dist/list-row-BtoVJpFs.js +821 -0
  49. package/dist/list-row-BtoVJpFs.js.map +1 -0
  50. package/dist/param-editor-XRjSu6MT.js +161 -0
  51. package/dist/param-editor-XRjSu6MT.js.map +1 -0
  52. package/dist/param-editor-field-B9lEPq8c.js +3028 -0
  53. package/dist/param-editor-field-B9lEPq8c.js.map +1 -0
  54. package/dist/style.css +1 -1
  55. package/dist/theme/primitives/sizes.d.ts +59 -0
  56. package/dist/theme/recipes/segmented-control.d.ts +22 -0
  57. package/dist/theme/recipes/switch.d.ts +1 -0
  58. package/dist/theme/recipes/tabs.d.ts +11 -0
  59. package/dist/{theme-poQlUgt0.js → theme-7PDdD9OD.js} +200 -120
  60. package/dist/theme-7PDdD9OD.js.map +1 -0
  61. package/dist/theme.js +1 -1
  62. package/dist/{tree-list-BAja2eXU.js → tree-list-B2L0cTj2.js} +2 -2
  63. package/dist/{tree-list-BAja2eXU.js.map → tree-list-B2L0cTj2.js.map} +1 -1
  64. package/package.json +2 -2
  65. package/dist/kanban-renderer-toolbar-Db1mIWWd.js.map +0 -1
  66. package/dist/list-row-BYWwcbGK.js +0 -823
  67. package/dist/list-row-BYWwcbGK.js.map +0 -1
  68. package/dist/param-editor-BCZOw5Gt.js +0 -140
  69. package/dist/param-editor-BCZOw5Gt.js.map +0 -1
  70. package/dist/param-editor-field-ZzZwgjZ_.js +0 -2094
  71. package/dist/param-editor-field-ZzZwgjZ_.js.map +0 -1
  72. package/dist/theme-poQlUgt0.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pstdio/ui",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/pufflyai/prompt-studio"
@@ -102,7 +102,7 @@
102
102
  "katex": "^0.16.33",
103
103
  "lexical": "^0.40.0",
104
104
  "lucide-react": "^0.556.0",
105
- "mermaid": "11.15.0",
105
+ "mermaid": "11.16.1",
106
106
  "monaco-editor": "^0.55.1",
107
107
  "prismjs": "^1.30.0",
108
108
  "recharts": "^3.9.2",
@@ -1 +0,0 @@
1
- {"version":3,"file":"kanban-renderer-toolbar-Db1mIWWd.js","sources":["../src/components/kanban-renderer/types.ts","../src/components/kanban-renderer/kanban-renderer-enum-helpers.ts","../src/components/kanban-renderer/kanban-renderer-badge-helpers.ts","../src/components/kanban-renderer/kanban-renderer-helpers.ts","../src/components/kanban-renderer/display-menu.tsx","../src/components/kanban-renderer/filter-menu.tsx","../src/components/kanban-renderer/kanban-renderer-grouping.ts","../src/components/kanban-renderer/kanban-renderer-views.ts","../src/components/kanban-renderer/use-kanban-renderer-store.ts","../src/components/kanban-renderer/kanban-renderer-view-bar.tsx","../src/components/kanban-renderer/use-resolved-attributes.ts","../src/components/kanban-renderer/kanban-renderer-toolbar.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: KanbanRendererRow) => 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 * kanban-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 KanbanRendererRow {\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 KanbanRendererOrdering {\n attributeId: string | typeof MANUAL_ORDERING;\n direction: SortDirection;\n}\n\nexport interface KanbanRendererSettings {\n viewMode: ViewMode;\n columnGrouping: string | typeof NO_GROUPING;\n rowGrouping: string | typeof NO_GROUPING;\n ordering: KanbanRendererOrdering;\n displayProperties: string[];\n}\n\nexport type KanbanRendererFilterState = Record<string, string[]>;\n\nexport interface KanbanRendererSavedView {\n id: string;\n title: string;\n settings: KanbanRendererSettings;\n filters: KanbanRendererFilterState;\n isDefault?: boolean;\n}\n\nexport type KanbanRendererCreateFieldType =\n | \"text\"\n | \"longtext\"\n | \"markdown\"\n | \"number\"\n | \"boolean\"\n | \"select\"\n | \"multi-select\"\n | \"files\";\n\nexport interface KanbanRendererCreateField {\n id: string;\n label: string;\n description?: string;\n placeholder?: string;\n type: KanbanRendererCreateFieldType;\n required?: boolean;\n defaultValue?: unknown;\n options?: EnumOption[];\n /** `files` fields only. */\n multiple?: boolean;\n accept?: string;\n}\n\n/** Chrome copy is supplied by the caller so the dialog ships no strings of its own. */\nexport interface KanbanRendererCreateLabels {\n cancel: string;\n properties: string;\n submitError: string;\n removeFile: string;\n}\n\nexport interface KanbanRendererCreateRowConfig {\n title: string;\n submitLabel: string;\n fields: KanbanRendererCreateField[];\n labels: KanbanRendererCreateLabels;\n}\n\nexport interface KanbanRendererCreateSubmission {\n columnId: string;\n columnAttributeId?: string;\n /** Declared field values, excluding `files` fields — those arrive as `files`. */\n values: Record<string, unknown>;\n /** Every editable attribute the user set, keyed by attribute id. */\n attributeValues: Record<string, unknown>;\n files: File[];\n}\n\nexport const DEFAULT_KANBAN_RENDERER_SETTINGS: KanbanRendererSettings = {\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 { 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 \"./kanban-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 \"./kanban-renderer-badge-helpers\";\nimport { renderEnumBadge, renderMultiEnumBadge } from \"./kanban-renderer-badge-helpers\";\nimport { getEnumOptions, toTitleCase } from \"./kanban-renderer-enum-helpers\";\nimport type {\n AttributeDescriptor,\n KanbanRendererFilterState,\n KanbanRendererRow,\n KanbanRendererSettings,\n} from \"./types\";\nimport { findAttribute, MANUAL_ORDERING, NO_GROUPING } from \"./types\";\n\nexport type { AttributeBadge } from \"./kanban-renderer-badge-helpers\";\nexport { getAttributeBadgeColorPalette } from \"./kanban-renderer-badge-helpers\";\nexport { enumOptionLabel, findEnumOption, getEnumOptions, toTitleCase } from \"./kanban-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: KanbanRendererRow, 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: KanbanRendererRow, 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: KanbanRendererRow,\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 = (\n descriptor: AttributeDescriptor,\n row: KanbanRendererRow,\n): 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: KanbanRendererRow,\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: KanbanRendererRow,\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: KanbanRendererRow[], 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: KanbanRendererRow[],\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?: KanbanRendererFilterState,\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: KanbanRendererFilterState, id: string): KanbanRendererFilterState => {\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: KanbanRendererSettings,\n attributes: AttributeDescriptor[],\n): KanbanRendererSettings => {\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: KanbanRendererFilterState, attributes: AttributeDescriptor[]) => {\n const attributesById = new Map(attributes.map((attribute) => [attribute.id, attribute]));\n const next: KanbanRendererFilterState = {};\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 { Button, HStack, Icon, IconButton, Menu, Popover, Portal, Text } from \"@chakra-ui/react\";\nimport { Check, ChevronDown, List, Settings2, SortAsc, SortDesc, SquareKanban } from \"lucide-react\";\nimport { Fragment, type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { type MenuOption, resolveSubGroupingOptions } from \"./kanban-renderer-helpers\";\nimport type { KanbanRendererSettings } from \"./types\";\n\ninterface DisplayMenuProps {\n settings: KanbanRendererSettings;\n groupingOptions: MenuOption[];\n orderingOptions: MenuOption[];\n displayPropertyOptions: MenuOption[];\n onViewModeChange: (value: KanbanRendererSettings[\"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 paddingX=\"xs\" paddingTop=\"xs\" paddingBottom=\"2xs\" textStyle=\"label/XS/medium\" color=\"fg.muted\">\n {props.children}\n </Text>\n);\n\nconst Dropdown = (props: {\n label: string;\n value: string;\n options: MenuOption[];\n onSelect: (value: string) => void;\n valueSuffix?: ReactNode;\n onSuffixAction?: () => void;\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 <Menu.Root>\n <Menu.Trigger asChild>\n <Button size=\"xs\" variant=\"ghost\" width=\"full\" justifyContent=\"flex-start\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\">{props.label}</Text>\n <HStack marginLeft=\"auto\" minW=\"0\" gap=\"2xs\" color=\"fg.muted\">\n <Text textStyle=\"label/S/regular\" truncate>\n {selectedLabel}\n </Text>\n {props.valueSuffix}\n </HStack>\n <ChevronDown size={12} />\n </Button>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content>\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 width=\"full\" gap=\"xs\">\n <Text textStyle=\"label/S/regular\">{option.label}</Text>\n {option.value === props.value ? <Icon as={Check} marginLeft=\"auto\" boxSize=\"0.875rem\" /> : null}\n </HStack>\n </Menu.Item>\n </Fragment>\n ))}\n {props.onSuffixAction ? (\n <>\n <Menu.Separator />\n <Menu.Item value=\"toggle-direction\" onClick={props.onSuffixAction}>\n Reverse order\n </Menu.Item>\n </>\n ) : null}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\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 useEffect(() => {\n if (!open) return;\n const closeOnOutsidePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return;\n setOpen(false);\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={{\n placement: \"bottom-end\",\n offset: { mainAxis: 8 },\n getAnchorElement: () => triggerRef.current,\n }}\n onOpenChange={(details) => setOpen(details.open)}\n >\n <Tooltip content=\"Display\">\n <Popover.Trigger asChild>\n <IconButton ref={triggerRef} aria-label=\"Display settings\" variant=\"ghost\" size=\"2xs\">\n <Icon as={Settings2} />\n </IconButton>\n </Popover.Trigger>\n </Tooltip>\n <Portal>\n <Popover.Positioner>\n <Popover.Content ref={contentRef} width=\"18.75rem\" padding=\"xs\" gap=\"1px\">\n <SectionLabel>DISPLAY</SectionLabel>\n <HStack borderRadius=\"sm\" bg=\"bg.subtle\" padding=\"2xs\" gap=\"2xs\">\n <Button\n flex=\"1\"\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={settings.viewMode === \"list\"}\n onClick={() => onViewModeChange(\"list\")}\n >\n <List />\n List\n </Button>\n <Button\n flex=\"1\"\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={settings.viewMode === \"board\"}\n onClick={() => onViewModeChange(\"board\")}\n >\n <SquareKanban />\n Board\n </Button>\n </HStack>\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 <Dropdown\n label=\"Ordering\"\n value={settings.ordering.attributeId}\n options={orderingOptions}\n valueSuffix={\n settings.ordering.attributeId === \"manual\" ? undefined : (\n <Icon\n as={settings.ordering.direction === \"asc\" ? SortAsc : SortDesc}\n aria-label={`${settings.ordering.direction === \"asc\" ? \"Ascending\" : \"Descending\"} order`}\n aria-hidden={false}\n role=\"img\"\n boxSize=\"0.875rem\"\n flexShrink={0}\n />\n )\n }\n onSelect={onOrderingAttributeIdChange}\n onSuffixAction={settings.ordering.attributeId === \"manual\" ? undefined : onSortDirectionToggle}\n />\n <Dropdown\n label=\"Sub-grouping\"\n value={settings.rowGrouping}\n options={resolveSubGroupingOptions(groupingOptions, settings.columnGrouping)}\n onSelect={onRowGroupingChange}\n />\n\n <SectionLabel>PROPERTIES</SectionLabel>\n <HStack paddingX=\"xs\" paddingBottom=\"xs\" flexWrap=\"wrap\" gap=\"2xs\">\n {displayPropertyOptions.map((option) => {\n const active = settings.displayProperties.includes(option.value);\n return (\n <Button\n key={option.value}\n size=\"2xs\"\n variant=\"ghost\"\n aria-pressed={active}\n onClick={() => onDisplayPropertyToggle(option.value)}\n >\n {option.label}\n </Button>\n );\n })}\n </HStack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { Badge, Button, HStack, Icon, IconButton, Input, Popover, Portal, Stack, Text } from \"@chakra-ui/react\";\nimport { Filter, Search } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { Checkbox } from \"@/components/primitives/checkbox\";\nimport { ScrollArea } from \"@/components/primitives/scroll-area\";\nimport { Tooltip } from \"@/components/primitives/tooltip\";\nimport { ListRow } from \"../list-row/list-row\";\nimport type { FilterCategoryView } from \"./kanban-renderer-helpers\";\nimport type { KanbanRendererFilterState } from \"./types\";\n\ninterface FilterMenuProps {\n categories: FilterCategoryView[];\n filters: KanbanRendererFilterState;\n countsByCategory: Record<string, Record<string, number>>;\n onToggleFilterValue: (attributeId: string, value: string) => void;\n onClearFilter: (attributeId: string) => void;\n onClearAll: () => void;\n}\n\nconst contentProps = {\n p: \"2xs\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"1px\",\n} as const;\n\nconst selectedValues = (filters: KanbanRendererFilterState, categoryId: string) =>\n filters[categoryId]?.filter(Boolean) ?? [];\n\nconst hasActiveFilters = (filters: KanbanRendererFilterState) =>\n Object.values(filters).some((values) => values.length > 0);\n\nconst selectedDescription = (category: FilterCategoryView, values: string[]) => {\n const labels = values.map((value) => category.options.find((option) => option.value === value)?.label ?? value);\n if (labels.length <= 2) return labels.join(\", \");\n return `${labels.slice(0, 2).join(\", \")} +${(labels.length - 2).toString()}`;\n};\n\nconst CategoryLabel = (props: { category: FilterCategoryView; values: string[] }) => {\n const { category, values } = props;\n\n return (\n <HStack minW=\"0\" width=\"full\" gap=\"2xs\">\n <Text textStyle=\"label/S/regular\" truncate>\n {category.label}\n </Text>\n {values.length > 0 ? (\n <Text textStyle=\"label/XS\" color=\"fg.menu-item.secondary\" truncate>\n {selectedDescription(category, values)}\n </Text>\n ) : null}\n </HStack>\n );\n};\n\nconst OptionLabel = (props: { checked: boolean; label: string }) => (\n <HStack minW=\"0\" gap=\"xs\">\n <Checkbox\n checked={props.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\" truncate>\n {props.label}\n </Text>\n </HStack>\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 [query, setQuery] = useState(\"\");\n const [activeCategoryId, setActiveCategoryId] = useState(categories[0]?.id ?? \"\");\n const activeCategory = categories.find((category) => category.id === activeCategoryId) ?? categories[0];\n const filtersApplied = hasActiveFilters(filters);\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const visibleCategories = categories.filter((category) =>\n category.label.toLocaleLowerCase().includes(normalizedQuery),\n );\n\n useEffect(() => {\n if (!open) return;\n const closeOnOutsidePointerDown = (event: PointerEvent) => {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) return;\n setOpen(false);\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={{\n placement: \"bottom-end\",\n offset: { mainAxis: 8 },\n getAnchorElement: () => triggerRef.current,\n }}\n onOpenChange={(details) => {\n setOpen(details.open);\n if (!details.open) setQuery(\"\");\n }}\n >\n <Tooltip content=\"Filter\">\n <Popover.Trigger asChild>\n <IconButton\n ref={triggerRef}\n aria-label=\"Filter rows\"\n aria-pressed={filtersApplied}\n variant={filtersApplied ? \"subtle\" : \"ghost\"}\n size=\"2xs\"\n >\n <Icon as={Filter} />\n </IconButton>\n </Popover.Trigger>\n </Tooltip>\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 padding=\"0\"\n gap=\"0\"\n overflow=\"hidden\"\n >\n <HStack height=\"2.25rem\" gap=\"xs\" paddingX=\"sm\" borderBottomWidth=\"1px\" borderColor=\"border.subtle\">\n <Icon as={Search} boxSize=\"0.875rem\" color=\"fg.muted\" />\n <Input\n aria-label=\"Filter properties\"\n value={query}\n placeholder=\"Filter by…\"\n variant=\"flushed\"\n border=\"0\"\n height=\"full\"\n padding=\"0\"\n onChange={(event) => setQuery(event.target.value)}\n />\n </HStack>\n <HStack alignItems=\"stretch\" gap=\"0\" flex=\"1\" minH=\"0\">\n <Stack\n data-testid=\"filter-property-column\"\n width=\"11.75rem\"\n flexShrink={0}\n borderRightWidth=\"1px\"\n borderColor=\"border.subtle\"\n gap=\"0\"\n minH=\"0\"\n >\n <HStack height=\"2rem\" paddingX=\"sm\">\n <Text textStyle=\"label/XS/medium\" color=\"fg.muted\">\n PROPERTY\n </Text>\n <Button marginLeft=\"auto\" size=\"2xs\" variant=\"ghost\" onClick={onClearAll}>\n Clear all\n </Button>\n </HStack>\n <ScrollArea\n flex=\"1\"\n minH=\"0\"\n viewportProps={{ overscrollBehavior: \"contain\" }}\n contentProps={contentProps}\n >\n {visibleCategories.map((category) => {\n const values = selectedValues(filters, category.id);\n return (\n <ListRow\n key={category.id}\n id={category.id}\n role=\"button\"\n variant=\"compact\"\n isSelected={activeCategory?.id === category.id}\n label={<CategoryLabel category={category} values={values} />}\n endContent={\n values.length > 0 ? (\n <Badge variant=\"number\" colorPalette=\"gray\">\n {values.length}\n </Badge>\n ) : undefined\n }\n onActivate={() => setActiveCategoryId(category.id)}\n />\n );\n })}\n </ScrollArea>\n </Stack>\n <Stack flex=\"1\" minW=\"0\" minH=\"0\" gap=\"0\">\n {activeCategory ? (\n <>\n <HStack height=\"2rem\" paddingX=\"sm\">\n <Text textStyle=\"label/S/medium\" truncate>\n {activeCategory.label}\n </Text>\n <Button\n marginLeft=\"auto\"\n size=\"2xs\"\n variant=\"ghost\"\n onClick={() => onClearFilter(activeCategory.id)}\n >\n Clear\n </Button>\n </HStack>\n <ScrollArea\n flex=\"1\"\n minH=\"0\"\n viewportProps={{ overscrollBehavior: \"contain\" }}\n contentProps={contentProps}\n >\n {activeCategory.options.map((option) => {\n const checked = selectedValues(filters, activeCategory.id).includes(option.value);\n return (\n <ListRow\n key={option.value}\n id={option.value}\n role=\"checkbox\"\n aria-label={option.label}\n aria-checked={checked}\n variant=\"compact\"\n label={<OptionLabel checked={checked} label={option.label} />}\n endContent={\n <Text textStyle=\"label/XS\" color=\"fg.muted\">\n {countsByCategory[activeCategory.id]?.[option.value] ?? 0}\n </Text>\n }\n onActivate={() => onToggleFilterValue(activeCategory.id, 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 {\n enumOptionLabel,\n getAttributeStringValues,\n getAttributeValue,\n getEnumOptions,\n normalizeFilterValues,\n toTitleCase,\n} from \"./kanban-renderer-helpers\";\nimport {\n type AttributeDescriptor,\n type AttributeType,\n findAttribute,\n type KanbanRendererFilterState,\n type KanbanRendererOrdering,\n type KanbanRendererRow,\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 KanbanRendererRowGroup {\n key: string;\n label: string;\n rows: KanbanRendererRow[];\n}\n\ninterface KanbanRendererColumnGroup {\n key: string;\n label: string;\n rows: KanbanRendererRow[];\n subgroups: KanbanRendererRowGroup[];\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: KanbanRendererRow, 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: KanbanRendererOrdering[\"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: KanbanRendererRow, b: KanbanRendererRow, 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: KanbanRendererRow[],\n ordering: KanbanRendererOrdering,\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: KanbanRendererRow[], options: GroupingOptions): KanbanRendererColumnGroup[] => {\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, KanbanRendererRow[]>();\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, KanbanRendererRow[]>();\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: KanbanRendererRow, 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: KanbanRendererRow[],\n filters: KanbanRendererFilterState,\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 = (\n rows: KanbanRendererRow[],\n attributeId: string,\n attributes: AttributeDescriptor[],\n) => {\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 { KanbanRendererColumnGroup, KanbanRendererRowGroup };\n","import type { KanbanRendererFilterState, KanbanRendererSavedView, KanbanRendererSettings } from \"./types\";\n\ninterface KanbanRendererViewState {\n settings: KanbanRendererSettings;\n filters: KanbanRendererFilterState;\n}\n\nconst cloneSettings = (settings: KanbanRendererSettings): KanbanRendererSettings => ({\n ...settings,\n ordering: { ...settings.ordering },\n displayProperties: [...settings.displayProperties],\n});\n\nconst cloneFilters = (filters: KanbanRendererFilterState): KanbanRendererFilterState =>\n Object.fromEntries(Object.entries(filters).map(([id, values]) => [id, [...values]]));\n\nexport const snapshotKanbanRendererView = (\n id: string,\n title: string,\n state: KanbanRendererViewState,\n isDefault = false,\n): KanbanRendererSavedView => ({\n id,\n title,\n settings: cloneSettings(state.settings),\n filters: cloneFilters(state.filters),\n ...(isDefault ? { isDefault: true } : {}),\n});\n\nexport const applyKanbanRendererView = (view: KanbanRendererSavedView) => ({\n settings: cloneSettings(view.settings),\n filters: cloneFilters(view.filters),\n});\n\nconst comparableSettings = (settings: KanbanRendererSettings) => ({\n viewMode: settings.viewMode,\n columnGrouping: settings.columnGrouping,\n rowGrouping: settings.rowGrouping,\n ordering: settings.ordering,\n displayProperties: [...settings.displayProperties].sort(),\n});\n\nconst comparableFilters = (filters: KanbanRendererFilterState) =>\n Object.fromEntries(\n Object.entries(filters)\n .filter(([, values]) => values.length > 0)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([id, values]) => [id, [...values].sort()]),\n );\n\nexport const isKanbanRendererViewDirty = (\n view: KanbanRendererSavedView | undefined,\n state: KanbanRendererViewState,\n) => {\n if (!view) return false;\n return (\n JSON.stringify(comparableSettings(view.settings)) !== JSON.stringify(comparableSettings(state.settings)) ||\n JSON.stringify(comparableFilters(view.filters)) !== JSON.stringify(comparableFilters(state.filters))\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 \"./kanban-renderer-helpers\";\nimport {\n applyKanbanRendererView,\n isKanbanRendererViewDirty,\n snapshotKanbanRendererView,\n} from \"./kanban-renderer-views\";\nimport {\n DEFAULT_KANBAN_RENDERER_SETTINGS,\n type KanbanRendererFilterState,\n type KanbanRendererSavedView,\n type KanbanRendererSettings,\n MANUAL_ORDERING,\n NO_GROUPING,\n} from \"./types\";\n\ninterface KanbanRendererSnapshot {\n settings: KanbanRendererSettings;\n filters: KanbanRendererFilterState;\n expandedGroups: Record<string, boolean>;\n views: KanbanRendererSavedView[];\n activeViewId: string;\n}\n\ninterface KanbanRendererStoreInitialState {\n settings?: Partial<KanbanRendererSettings>;\n filters?: KanbanRendererFilterState;\n expandedGroups?: Record<string, boolean>;\n views?: KanbanRendererSavedView[];\n activeViewId?: string;\n}\n\ninterface KanbanRendererState extends KanbanRendererSnapshot {\n setViewMode: (viewMode: KanbanRendererSettings[\"viewMode\"]) => void;\n setColumnGrouping: (columnGrouping: KanbanRendererSettings[\"columnGrouping\"]) => void;\n setRowGrouping: (rowGrouping: KanbanRendererSettings[\"rowGrouping\"]) => void;\n setOrdering: (ordering: KanbanRendererSettings[\"ordering\"]) => void;\n setOrderingAttributeId: (attributeId: KanbanRendererSettings[\"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 activateView: (viewId: string) => void;\n createView: (view: { id: string; title: string }) => void;\n saveActiveView: () => void;\n resetActiveView: () => void;\n renameView: (viewId: string, title: string) => void;\n duplicateView: (viewId: string, duplicate: { id: string; title: string }) => void;\n deleteView: (viewId: string) => void;\n setDefaultView: (viewId: string) => void;\n reset: () => void;\n}\n\ninterface CreateKanbanRendererStoreOptions {\n storageKey: string;\n initialState?: KanbanRendererStoreInitialState;\n}\n\nconst WORKSPACE_STORE_NAMESPACE = \"pstdio/ui/kanban-renderer\";\n\nconst toStorageName = (storageKey: string) => `${WORKSPACE_STORE_NAMESPACE}/${storageKey}`;\n\nconst DEFAULT_SNAPSHOT: KanbanRendererSnapshot = {\n settings: DEFAULT_KANBAN_RENDERER_SETTINGS,\n filters: {},\n expandedGroups: {},\n views: [],\n activeViewId: \"default\",\n};\n\nconst createSnapshot = (initialState?: KanbanRendererStoreInitialState): KanbanRendererSnapshot => {\n const initialSettings = { ...DEFAULT_SNAPSHOT.settings, ...(initialState?.settings ?? {}) };\n const initialFilters = initialState?.filters ?? DEFAULT_SNAPSHOT.filters;\n const suppliedViews = initialState?.views ?? [];\n const views =\n suppliedViews.length > 0\n ? suppliedViews\n : [snapshotKanbanRendererView(\"default\", \"All\", { settings: initialSettings, filters: initialFilters }, true)];\n const requestedView = views.find((view) => view.id === initialState?.activeViewId);\n const activeView = requestedView ?? views.find((view) => view.isDefault) ?? views[0]!;\n\n return {\n ...applyKanbanRendererView(activeView),\n expandedGroups: initialState?.expandedGroups ?? DEFAULT_SNAPSHOT.expandedGroups,\n views,\n activeViewId: activeView.id,\n };\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>): KanbanRendererSettings => {\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 KanbanRendererSettings[\"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>): KanbanRendererFilterState => {\n const next: KanbanRendererFilterState = {};\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 createKanbanRendererStore = (options: CreateKanbanRendererStoreOptions) => {\n const { storageKey, initialState } = options;\n const snapshot = createSnapshot(initialState);\n\n return createStore<KanbanRendererState>()(\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 activateView: (viewId) =>\n set((state) => {\n const view = state.views.find((entry) => entry.id === viewId);\n return view\n ? { ...state, ...applyKanbanRendererView(view), activeViewId: view.id, expandedGroups: {} }\n : state;\n }),\n createView: (view) =>\n set((state) => {\n const savedView = snapshotKanbanRendererView(view.id, view.title, state);\n return { ...state, views: [...state.views, savedView], activeViewId: savedView.id };\n }),\n saveActiveView: () =>\n set((state) => ({\n ...state,\n views: state.views.map((view) =>\n view.id === state.activeViewId\n ? snapshotKanbanRendererView(view.id, view.title, state, view.isDefault)\n : view,\n ),\n })),\n resetActiveView: () =>\n set((state) => {\n const view = state.views.find((entry) => entry.id === state.activeViewId);\n return view ? { ...state, ...applyKanbanRendererView(view) } : state;\n }),\n renameView: (viewId, title) =>\n set((state) => ({\n ...state,\n views: state.views.map((view) => (view.id === viewId ? { ...view, title } : view)),\n })),\n duplicateView: (viewId, duplicate) =>\n set((state) => {\n const source = state.views.find((view) => view.id === viewId);\n if (!source) return state;\n const copy = snapshotKanbanRendererView(duplicate.id, duplicate.title, source);\n return {\n ...state,\n ...applyKanbanRendererView(copy),\n views: [...state.views, copy],\n activeViewId: copy.id,\n expandedGroups: {},\n };\n }),\n deleteView: (viewId) =>\n set((state) => {\n if (state.views.length === 1) return state;\n const views = state.views.filter((view) => view.id !== viewId);\n if (views.length === state.views.length || state.activeViewId !== viewId) return { ...state, views };\n const activeView = views.find((view) => view.isDefault) ?? views[0]!;\n return {\n ...state,\n ...applyKanbanRendererView(activeView),\n views,\n activeViewId: activeView.id,\n expandedGroups: {},\n };\n }),\n setDefaultView: (viewId) =>\n set((state) => ({\n ...state,\n views: state.views.map((view) => ({ ...view, isDefault: view.id === viewId || undefined })),\n })),\n reset: () => set(snapshot),\n }),\n {\n name: toStorageName(storageKey),\n version: 3,\n migrate: (persisted, version) => {\n if (!persisted || typeof persisted !== \"object\") return persisted as KanbanRendererSnapshot;\n const state = persisted as {\n settings?: Record<string, unknown>;\n filters?: Record<string, unknown>;\n expandedGroups?: Record<string, boolean>;\n views?: KanbanRendererSavedView[];\n activeViewId?: string;\n };\n if (version >= 3) {\n const snapshot = state as unknown as KanbanRendererSnapshot;\n return { ...snapshot, expandedGroups: {} };\n }\n const settings = migrateSettings(state.settings ?? {});\n const filters = migrateFilters(state.filters ?? {});\n return createSnapshot({ settings, filters });\n },\n storage: createJSONStorage(createBrowserStorage),\n partialize: (state) => ({\n settings: state.settings,\n filters: state.filters,\n views: state.views,\n activeViewId: state.activeViewId,\n }),\n },\n ),\n );\n};\n\nconst workspaceStoreRegistry = new Map<string, ReturnType<typeof createKanbanRendererStore>>();\n\nexport const getKanbanRendererStore = (storageKey: string, initialState?: KanbanRendererStoreInitialState) => {\n const existingStore = workspaceStoreRegistry.get(storageKey);\n if (existingStore) return existingStore;\n\n const store = createKanbanRendererStore({ storageKey, initialState });\n workspaceStoreRegistry.set(storageKey, store);\n return store;\n};\n\nexport const useKanbanRendererStore = <T>(\n storageKey: string,\n selector: (state: KanbanRendererState) => T,\n initialState?: KanbanRendererStoreInitialState,\n) => {\n const store = getKanbanRendererStore(storageKey, initialState);\n return useStore(store, selector);\n};\n\nexport const isActiveKanbanRendererViewDirty = (\n state: Pick<KanbanRendererState, \"activeViewId\" | \"filters\" | \"settings\" | \"views\">,\n) =>\n isKanbanRendererViewDirty(\n state.views.find((view) => view.id === state.activeViewId),\n state,\n );\n\nexport type { KanbanRendererSnapshot, KanbanRendererState, KanbanRendererStoreInitialState };\n","import { Box, Button, chakra, Dialog, HStack, Icon, IconButton, Input, Stack, Tabs, Text } from \"@chakra-ui/react\";\nimport { Copy, Pencil, Plus, RotateCcw, Trash2, X } from \"lucide-react\";\nimport { type FormEvent, type ReactNode, useState } from \"react\";\nimport { type ResourceContextAction, ResourceContextMenu } from \"@/components/overlays/resource-context-menu\";\nimport type { FilterCategoryView } from \"./kanban-renderer-helpers\";\nimport type { KanbanRendererFilterState, KanbanRendererSavedView } from \"./types\";\nimport { isActiveKanbanRendererViewDirty, useKanbanRendererStore } from \"./use-kanban-renderer-store\";\n\ninterface KanbanRendererViewBarProps {\n storageKey: string;\n categories: FilterCategoryView[];\n filters: KanbanRendererFilterState;\n leading?: ReactNode;\n filterControl: ReactNode;\n displayControl: ReactNode;\n align?: \"split\" | \"end\";\n}\n\nconst nextViewIdentity = (views: KanbanRendererSavedView[]) => {\n let index = views.length + 1;\n while (views.some((view) => view.id === `view-${index.toString()}`)) index += 1;\n return { id: `view-${index.toString()}`, title: `View ${index.toString()}` };\n};\n\nconst duplicateIdentity = (view: KanbanRendererSavedView, views: KanbanRendererSavedView[]) => {\n const baseId = `${view.id}-copy`;\n let index = 1;\n let id = baseId;\n while (views.some((entry) => entry.id === id)) {\n index += 1;\n id = `${baseId}-${index.toString()}`;\n }\n return { id, title: `${view.title} copy` };\n};\n\nconst filterValueLabel = (category: FilterCategoryView | undefined, values: string[]) =>\n values.map((value) => category?.options.find((option) => option.value === value)?.label ?? value).join(\", \");\n\nconst FilterPill = (props: { category: FilterCategoryView | undefined; values: string[]; onRemove: () => void }) => {\n const { category, values, onRemove } = props;\n const label = category?.label ?? \"Filter\";\n\n return (\n <HStack\n height=\"filter-pill\"\n gap=\"2xs\"\n paddingLeft=\"xs\"\n paddingRight=\"2xs\"\n borderWidth=\"1px\"\n borderColor=\"border.subtle\"\n borderRadius=\"xs\"\n bg=\"bg.muted\"\n flexShrink={0}\n >\n <Text textStyle=\"label/XS\" color=\"fg.muted\">\n {label} {values.length > 1 ? \"is any of\" : \"is\"}\n </Text>\n <Text textStyle=\"label/XS/medium\" maxW=\"12rem\" truncate>\n {filterValueLabel(category, values)}\n </Text>\n <chakra.button\n type=\"button\"\n aria-label={`Remove ${label} filter`}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n width=\"1rem\"\n height=\"1rem\"\n color=\"fg.muted\"\n borderRadius=\"xs\"\n _hover={{ color: \"fg\", bg: \"bg.hover\" }}\n onClick={onRemove}\n >\n <Icon as={X} boxSize=\"0.75rem\" />\n </chakra.button>\n </HStack>\n );\n};\n\nconst RenameViewDialog = (props: {\n open: boolean;\n title: string;\n onOpenChange: (open: boolean) => void;\n onRename: (title: string) => void;\n}) => {\n const { open, title, onOpenChange, onRename } = props;\n const [value, setValue] = useState(title);\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const nextTitle = value.trim();\n if (!nextTitle) return;\n onRename(nextTitle);\n onOpenChange(false);\n };\n\n return (\n <Dialog.Root open={open} onOpenChange={(details) => onOpenChange(details.open)}>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content asChild>\n <form onSubmit={submit}>\n <Dialog.Header>\n <Dialog.Title>Rename view</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Input\n autoFocus\n aria-label=\"View name\"\n value={value}\n onChange={(event) => setValue(event.target.value)}\n />\n </Dialog.Body>\n <Dialog.Footer>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" disabled={!value.trim()}>\n Rename\n </Button>\n </Dialog.Footer>\n </form>\n </Dialog.Content>\n </Dialog.Positioner>\n </Dialog.Root>\n );\n};\n\nexport const KanbanRendererViewBar = (props: KanbanRendererViewBarProps) => {\n const { storageKey, categories, filters, leading, filterControl, displayControl, align = \"split\" } = props;\n const views = useKanbanRendererStore(storageKey, (state) => state.views);\n const activeViewId = useKanbanRendererStore(storageKey, (state) => state.activeViewId);\n const dirty = useKanbanRendererStore(storageKey, isActiveKanbanRendererViewDirty);\n const activateView = useKanbanRendererStore(storageKey, (state) => state.activateView);\n const createView = useKanbanRendererStore(storageKey, (state) => state.createView);\n const saveActiveView = useKanbanRendererStore(storageKey, (state) => state.saveActiveView);\n const resetActiveView = useKanbanRendererStore(storageKey, (state) => state.resetActiveView);\n const clearFilter = useKanbanRendererStore(storageKey, (state) => state.clearFilter);\n const renameView = useKanbanRendererStore(storageKey, (state) => state.renameView);\n const duplicateView = useKanbanRendererStore(storageKey, (state) => state.duplicateView);\n const deleteView = useKanbanRendererStore(storageKey, (state) => state.deleteView);\n const [renameTarget, setRenameTarget] = useState<KanbanRendererSavedView>();\n const activeFilters = Object.entries(filters).filter(([, values]) => values.length > 0);\n const showFilterRow = dirty || activeFilters.length > 0;\n\n const actionsFor = (view: KanbanRendererSavedView): ResourceContextAction[] => [\n {\n key: \"rename\",\n label: \"Rename\",\n icon: <Icon as={Pencil} boxSize=\"0.875rem\" />,\n onClick: () => setRenameTarget(view),\n },\n {\n key: \"duplicate\",\n label: \"Duplicate\",\n icon: <Icon as={Copy} boxSize=\"0.875rem\" />,\n onClick: () => duplicateView(view.id, duplicateIdentity(view, views)),\n },\n {\n key: \"delete\",\n label: \"Delete view\",\n icon: <Icon as={Trash2} boxSize=\"0.875rem\" />,\n isDisabled: views.length === 1,\n separatorBefore: true,\n onClick: () => deleteView(view.id),\n },\n ];\n\n return (\n <Stack\n data-testid=\"kanban-renderer-header\"\n gap=\"0\"\n flexShrink={0}\n borderBottomWidth=\"1px\"\n borderColor=\"border.subtle\"\n >\n <HStack height=\"view-bar\" minW=\"0\" gap=\"2xs\" paddingX=\"xs\">\n {leading}\n <Tabs.Root\n value={activeViewId}\n size=\"sm\"\n variant=\"subtle\"\n minW=\"0\"\n overflow=\"hidden\"\n onValueChange={(details) => activateView(details.value)}\n >\n <Tabs.List overflowX=\"auto\" overflowY=\"hidden\">\n {views.map((view) => (\n <ResourceContextMenu key={view.id} actions={actionsFor(view)} positioning={{ placement: \"bottom-start\" }}>\n <Tabs.Trigger value={view.id}>\n {view.title}\n {dirty && view.id === activeViewId ? (\n <Box\n aria-label=\"Unsaved view changes\"\n width=\"0.375rem\"\n height=\"0.375rem\"\n borderRadius=\"full\"\n bg=\"fg.warning\"\n />\n ) : null}\n </Tabs.Trigger>\n </ResourceContextMenu>\n ))}\n </Tabs.List>\n </Tabs.Root>\n <IconButton\n aria-label=\"New view\"\n size=\"2xs\"\n variant=\"ghost\"\n onClick={() => createView(nextViewIdentity(views))}\n >\n <Icon as={Plus} />\n </IconButton>\n {align === \"split\" ? <Box flex=\"1\" /> : null}\n {filterControl}\n {displayControl}\n </HStack>\n\n {showFilterRow ? (\n <HStack\n height=\"view-subheader\"\n minW=\"0\"\n gap=\"2xs\"\n paddingX=\"xs\"\n borderTopWidth=\"1px\"\n borderColor=\"border.subtle\"\n >\n <HStack minW=\"0\" gap=\"2xs\" overflowX=\"auto\">\n {activeFilters.map(([categoryId, values]) => (\n <FilterPill\n key={categoryId}\n category={categories.find((category) => category.id === categoryId)}\n values={values}\n onRemove={() => clearFilter(categoryId)}\n />\n ))}\n </HStack>\n <Box flex=\"1\" />\n {dirty ? (\n <>\n <Button size=\"2xs\" variant=\"outline\" onClick={resetActiveView}>\n <RotateCcw />\n Reset\n </Button>\n <Button size=\"2xs\" variant=\"primary\" onClick={saveActiveView}>\n Save view\n </Button>\n </>\n ) : null}\n </HStack>\n ) : null}\n\n {renameTarget ? (\n <RenameViewDialog\n key={renameTarget.id}\n open\n title={renameTarget.title}\n onOpenChange={(open) => !open && setRenameTarget(undefined)}\n onRename={(title) => renameView(renameTarget.id, title)}\n />\n ) : null}\n </Stack>\n );\n};\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 type { ReactNode } from \"react\";\nimport { DisplayMenu } from \"./display-menu\";\nimport { FilterMenu } from \"./filter-menu\";\nimport { countFilterValues } from \"./kanban-renderer-grouping\";\nimport {\n buildDisplayPropertyOptions,\n buildFilterCategories,\n buildGroupingOptions,\n buildOrderingOptions,\n} from \"./kanban-renderer-helpers\";\nimport { KanbanRendererViewBar } from \"./kanban-renderer-view-bar\";\nimport type {\n AttributeDescriptor,\n KanbanRendererFilterState,\n KanbanRendererRow,\n KanbanRendererSavedView,\n KanbanRendererSettings,\n} from \"./types\";\nimport { useKanbanRendererStore } from \"./use-kanban-renderer-store\";\nimport { useResolvedAttributes } from \"./use-resolved-attributes\";\n\nexport interface KanbanRendererToolbarProps<TRow extends KanbanRendererRow = KanbanRendererRow> {\n rows: TRow[];\n storageKey: string;\n attributes: AttributeDescriptor[];\n defaultSettings?: Partial<KanbanRendererSettings>;\n defaultFilters?: KanbanRendererFilterState;\n defaultViews?: KanbanRendererSavedView[];\n defaultActiveViewId?: string;\n leading?: ReactNode;\n displayControl?: ReactNode;\n align?: \"split\" | \"end\";\n}\n\nexport const KanbanRendererToolbar = <TRow extends KanbanRendererRow>(props: KanbanRendererToolbarProps<TRow>) => {\n const {\n rows,\n storageKey,\n attributes: rawAttributes,\n defaultSettings,\n defaultFilters,\n defaultViews,\n defaultActiveViewId,\n leading,\n displayControl,\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 = {\n settings: defaultSettings,\n filters: defaultFilters,\n views: defaultViews,\n activeViewId: defaultActiveViewId,\n };\n const settings = useKanbanRendererStore(storageKey, (state) => state.settings, initialState);\n const filters = useKanbanRendererStore(storageKey, (state) => state.filters, initialState);\n const setViewMode = useKanbanRendererStore(storageKey, (state) => state.setViewMode, initialState);\n const setColumnGrouping = useKanbanRendererStore(storageKey, (state) => state.setColumnGrouping, initialState);\n const setRowGrouping = useKanbanRendererStore(storageKey, (state) => state.setRowGrouping, initialState);\n const setOrderingAttributeId = useKanbanRendererStore(\n storageKey,\n (state) => state.setOrderingAttributeId,\n initialState,\n );\n const toggleSortDirection = useKanbanRendererStore(storageKey, (state) => state.toggleSortDirection, initialState);\n const toggleDisplayProperty = useKanbanRendererStore(\n storageKey,\n (state) => state.toggleDisplayProperty,\n initialState,\n );\n const toggleFilterValue = useKanbanRendererStore(storageKey, (state) => state.toggleFilterValue, initialState);\n const clearFilter = useKanbanRendererStore(storageKey, (state) => state.clearFilter, initialState);\n const clearAllFilters = useKanbanRendererStore(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 const filterControl = (\n <FilterMenu\n categories={categoryOptions}\n filters={filters}\n countsByCategory={countsByCategory}\n onToggleFilterValue={toggleFilterValue}\n onClearFilter={clearFilter}\n onClearAll={clearAllFilters}\n />\n );\n const resolvedDisplayControl =\n displayControl === undefined ? (\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 ) : (\n displayControl\n );\n\n return (\n <KanbanRendererViewBar\n storageKey={storageKey}\n categories={categoryOptions}\n filters={filters}\n leading={leading}\n filterControl={filterControl}\n displayControl={resolvedDisplayControl}\n align={align}\n />\n );\n};\n"],"names":["NO_GROUPING","MANUAL_ORDERING","isEnumOptionsSource","options","Array","isArray","isAttributesSource","attributes","DEFAULT_KANBAN_RENDERER_SETTINGS","viewMode","columnGrouping","rowGrouping","ordering","attributeId","direction","displayProperties","findAttribute","id","find","attribute","dedupeEnumOptions","seen","Set","filter","option","has","value","add","getEnumOptions","type","kind","getSnapshot","toTitleCase","replaceAll","split","chunk","length","map","toUpperCase","slice","join","findEnumOption","enumOptionLabel","label","summarizeMultiEnum","values","renderEnumBadge","descriptor","stringValue","editable","attributeLabel","undefined","isEditable","color","icon","renderMultiEnumBadge","entry","summary","firstOption","getAttributeValue","row","raw","getAttributeStringValues","String","formatDateValue","date","Date","Number","isNaN","getTime","toLocaleDateString","formatNumberValue","isFinite","formatStringValue","formatUserValue","isRenderableNode","isRecord","textValue","trim","workspaceTypeFrom","normalizeWorkspaceBadgeItems","flatMap","item","shorthand","name","renderWorkspaceBadgeDisplay","display","items","itemsAttributeId","selectedId","selectedItem","createElement","WorkspaceBadge","workspaceType","hasMultipleWorkspaces","showLeadingSessionIndicator","renderAttributeBadge","render","formatted","collectDisplayBadges","badges","displayable","badge","push","collectDisplayCustomSlots","slots","slot","collectValuesFromRows","rows","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","settings","knownIds","validGroupingId","validOrderingId","orderingId","sanitizeFilters","attributesById","Map","Object","entries","get","SectionLabel","props","$","_c","t0","children","jsx","Text","Dropdown","selectedLabel","hasNoneFirst","t1","t2","t3","valueSuffix","jsxs","HStack","t4","Symbol","for","ChevronDown","t5","Button","t6","option_0","index","Fragment","Menu","onSelect","Icon","Check","t7","onSuffixAction","t8","t9","DisplayMenu","groupingOptions","orderingOptions","displayPropertyOptions","onViewModeChange","onColumnGroupingChange","onRowGroupingChange","onOrderingAttributeIdChange","onSortDirectionToggle","onDisplayPropertyToggle","triggerRef","useRef","contentRef","open","setOpen","useState","closeOnOutsidePointerDown","event","target","Node","current","contains","document","addEventListener","removeEventListener","useEffect","offset","mainAxis","getAnchorElement","details","Tooltip","IconButton","Settings2","List","t10","t11","t12","SquareKanban","t13","t14","t15","t16","t17","SortAsc","SortDesc","t18","t19","t20","t21","t22","t23","t24","t25","includes","t26","Portal","Popover","t27","contentProps","p","flexDirection","gap","selectedValues","categoryId","Boolean","hasActiveFilters","some","selectedDescription","category","labels","toString","CategoryLabel","OptionLabel","tabIndex","checked","Checkbox","FilterMenu","countsByCategory","onToggleFilterValue","onClearFilter","onClearAll","query","setQuery","activeCategoryId","setActiveCategoryId","activeCategory","filtersApplied","normalizedQuery","toLocaleLowerCase","visibleCategories","category_0","Filter","T0","Search","event_0","Input","T1","T2","Stack","t28","t29","t30","t31","t32","t33","T3","ScrollArea","t34","t35","t36","overscrollBehavior","t38","category_1","ListRow","Badge","t39","t40","t37","t41","t42","t43","t44","t45","Content","t46","Positioner","t47","t48","Root","UNASSIGNED_LABEL","fallbackLabel","toLowerCase","labelForGroupKey","key","resolveGroupingValue","getGroupingKey","columnId","first","compareGroupKey","compareGroupKeyForDescriptor","ordered","compareEnumValues","orderByDirection","left","right","toIndex","findIndex","compareForDescriptor","compare","leftTime","rightTime","leftNum","rightNum","leftValue","rightValue","leftString","rightString","orderRows","title","groupRows","knownColumnKeys","columnDescriptor","rowDescriptor","groupedByColumn","set","columnRows","subgroups","groupedByRow","rowKey","rowRows","matchesFilter","rowValues","normalizedValues","filterRows","activeFilters","every","countFilterValues","counts","cloneSettings","cloneFilters","fromEntries","snapshotKanbanRendererView","state","isDefault","applyKanbanRendererView","view","comparableSettings","comparableFilters","isKanbanRendererViewDirty","JSON","stringify","WORKSPACE_STORE_NAMESPACE","toStorageName","storageKey","DEFAULT_SNAPSHOT","expandedGroups","createSnapshot","initialState","initialSettings","initialFilters","suppliedViews","views","activeView","activeViewId","toggleValue","stripTagPrefix","startsWith","migrateSettings","orderingRaw","field","orderingDirection","migrateFilters","stringValues","createKanbanRendererStore","snapshot","createStore","persist","setViewMode","setColumnGrouping","setRowGrouping","setOrdering","setOrderingAttributeId","setDisplayProperties","toggleSortDirection","toggleDisplayProperty","property","setFilter","toggleFilterValue","currentValues","nextValues","nextFilters","clearFilter","clearAllFilters","setExpandedGroup","groupId","isExpanded","activateView","viewId","createView","savedView","saveActiveView","resetActiveView","renameView","duplicateView","duplicate","source","copy","deleteView","setDefaultView","reset","version","migrate","persisted","storage","createJSONStorage","createBrowserStorage","partialize","workspaceStoreRegistry","getKanbanRendererStore","existingStore","store","useKanbanRendererStore","selector","useStore","isActiveKanbanRendererViewDirty","nextViewIdentity","duplicateIdentity","baseId","filterValueLabel","FilterPill","onRemove","bg","X","chakra","RenameViewDialog","onOpenChange","onRename","setValue","preventDefault","nextTitle","submit","Dialog","KanbanRendererViewBar","leading","filterControl","displayControl","align","_temp","_temp2","dirty","_temp3","_temp4","_temp5","_temp6","_temp7","_temp8","_temp9","_temp0","renameTarget","setRenameTarget","_temp1","showFilterRow","Pencil","onClick","Copy","Trash2","isDisabled","separatorBefore","actionsFor","view_0","ResourceContextMenu","Tabs","Box","Plus","values_0","RotateCcw","state_0","state_1","state_2","state_3","state_4","state_5","state_6","state_7","state_8","collectSources","sources","resolveAttributeOptions","useResolvedAttributes","forceRender","useReducer","refresh","unsubscribes","subscribe","dispose","tick","KanbanRendererToolbar","rawAttributes","defaultSettings","defaultFilters","defaultViews","defaultActiveViewId","categoryOptions","resolvedDisplayControl","state_9"],"mappings":"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"}