@pstdio/ui 0.17.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.
- package/dist/{MermaidComponent-BCMQqPqu.js → MermaidComponent-BPiVFNYK.js} +2 -2
- package/dist/{MermaidComponent-BCMQqPqu.js.map → MermaidComponent-BPiVFNYK.js.map} +1 -1
- package/dist/chat-ui.js +941 -899
- package/dist/chat-ui.js.map +1 -1
- package/dist/components/chat-ui/components/chat-message-list-items.d.ts +17 -0
- package/dist/components/chat-ui/components/message-types.d.ts +1 -0
- package/dist/components/chat-ui/components/timeline.d.ts +2 -0
- package/dist/components/chat-ui/tool-rendering/default-renderers.d.ts +1 -0
- package/dist/components/chat-ui/tool-rendering/shared.d.ts +3 -2
- package/dist/components/chat-ui/tool-rendering/standard-renderers.d.ts +1 -0
- package/dist/components/data-table/data-table-column-menu.d.ts +4 -1
- package/dist/components/data-table/data-table-header.d.ts +0 -8
- package/dist/components/data-table/data-table-skeleton.d.ts +13 -0
- package/dist/components/data-table/editable-cells-story.d.ts +9 -0
- package/dist/components/data-table/index.d.ts +2 -0
- package/dist/components/diff-viewer/code-editor.d.ts +2 -0
- package/dist/components/diff-viewer/index.d.ts +1 -1
- package/dist/components/diff-viewer/monaco-browser.d.ts +1 -0
- package/dist/components/overlays/dialog-accept-shortcut.d.ts +12 -0
- package/dist/components/overlays/index.d.ts +1 -0
- package/dist/components/overlays/searchable-menu-input.d.ts +9 -0
- package/dist/components/param-editor/index.d.ts +7 -2
- package/dist/components/param-editor/inputs/action-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/boolean-input.d.ts +13 -0
- package/dist/components/param-editor/inputs/color-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/date-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/file-upload-input.d.ts +15 -0
- package/dist/components/param-editor/inputs/file-upload-value.d.ts +7 -0
- package/dist/components/param-editor/inputs/horizontal-text-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/markdown-input.d.ts +13 -0
- package/dist/components/param-editor/inputs/number-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/range-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/resource-input.d.ts +2 -0
- package/dist/components/param-editor/inputs/segmented-input.d.ts +1 -0
- package/dist/components/param-editor/inputs/selection-input.d.ts +6 -0
- package/dist/components/param-editor/inputs/selection-menu.d.ts +10 -0
- package/dist/components/param-editor/inputs/text-input.d.ts +1 -0
- package/dist/components/param-editor/param-editor-advanced-field.d.ts +14 -0
- package/dist/components/param-editor/param-editor-control-fixtures.d.ts +24 -0
- package/dist/components/param-editor/param-editor-field.d.ts +2 -0
- package/dist/components/param-editor/param-editor-horizontal.d.ts +2 -2
- package/dist/components/param-editor/param-editor-label.d.ts +1 -0
- package/dist/components/param-editor/param-editor-presentation.d.ts +3 -0
- package/dist/components/param-editor/param-editor-row.d.ts +17 -0
- package/dist/components/param-editor/param-editor.types.d.ts +43 -13
- package/dist/components/param-editor/resolve-param-value.d.ts +2 -0
- package/dist/components/primitives/chip.d.ts +4 -0
- package/dist/components/primitives/glyph-icon.d.ts +16 -0
- package/dist/components/primitives/icon-color-picker.d.ts +3 -13
- package/dist/components/primitives/icon-options.d.ts +301 -0
- package/dist/components/primitives/index.d.ts +12 -3
- package/dist/components/primitives/resource-badge.d.ts +12 -10
- package/dist/components/primitives/segmented-control.d.ts +20 -0
- package/dist/components/primitives/tag-swatch.d.ts +10 -0
- package/dist/components/rich-text/index.d.ts +1 -0
- package/dist/components/rich-text/lazy-markdown-editor.d.ts +2 -0
- package/dist/components/rich-text/utils/inferResourceType.d.ts +1 -1
- package/dist/components/tag-editor/index.d.ts +4 -0
- package/dist/components/tag-editor/tag-editor-heading.d.ts +11 -0
- package/dist/components/tag-editor/tag-editor-row.d.ts +1 -1
- package/dist/components/tag-editor/tag-editor-save-bar.d.ts +13 -0
- package/dist/components/tag-editor/tag-editor.types.d.ts +11 -11
- package/dist/components/tag-editor/tag-settings-panel.d.ts +3 -1
- package/dist/data-table.js +1018 -926
- package/dist/data-table.js.map +1 -1
- package/dist/dialog-accept-shortcut-DAEBsoWW.js +7 -0
- package/dist/dialog-accept-shortcut-DAEBsoWW.js.map +1 -0
- package/dist/diff.js +370 -366
- package/dist/diff.js.map +1 -1
- package/dist/font/css/prompt-studio-icons.css +720 -0
- package/dist/font/prompt-studio-icons.eot +0 -0
- package/dist/font/prompt-studio-icons.svg +1 -0
- package/dist/font/prompt-studio-icons.ttf +0 -0
- package/dist/font/prompt-studio-icons.woff +0 -0
- package/dist/font/prompt-studio-icons.woff2 +0 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1958 -1744
- package/dist/index.js.map +1 -1
- package/dist/{kanban-renderer-toolbar-B9ro-9z1.js → kanban-renderer-toolbar-Bcj_N1qr.js} +66 -66
- package/dist/kanban-renderer-toolbar-Bcj_N1qr.js.map +1 -0
- package/dist/kanban-renderer.js +834 -817
- package/dist/kanban-renderer.js.map +1 -1
- package/dist/lazy-markdown-editor-DwhqQ-NN.js +26 -0
- package/dist/lazy-markdown-editor-DwhqQ-NN.js.map +1 -0
- package/dist/list-row-BtoVJpFs.js +821 -0
- package/dist/list-row-BtoVJpFs.js.map +1 -0
- package/dist/markdown-DDd2ESoH.js +743 -0
- package/dist/markdown-DDd2ESoH.js.map +1 -0
- package/dist/markdown-editor-CYVkzt8t.js +741 -0
- package/dist/markdown-editor-CYVkzt8t.js.map +1 -0
- package/dist/monaco-browser-CO0NxK_Z.js +19 -0
- package/dist/monaco-browser-CO0NxK_Z.js.map +1 -0
- package/dist/param-editor-XRjSu6MT.js +161 -0
- package/dist/param-editor-XRjSu6MT.js.map +1 -0
- package/dist/param-editor-field-B9lEPq8c.js +3028 -0
- package/dist/param-editor-field-B9lEPq8c.js.map +1 -0
- package/dist/resource-badge-CuItchgL.js +98 -0
- package/dist/resource-badge-CuItchgL.js.map +1 -0
- package/dist/rich-message--eRzjWYK.js +730 -0
- package/dist/rich-message--eRzjWYK.js.map +1 -0
- package/dist/rich-text.js +114 -827
- package/dist/rich-text.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/primitives/fonts.d.ts +3 -0
- package/dist/theme/primitives/sizes.d.ts +59 -0
- package/dist/theme/recipes/badge.d.ts +8 -0
- package/dist/theme/recipes/color-picker.d.ts +18 -1
- package/dist/theme/recipes/segmented-control.d.ts +22 -0
- package/dist/theme/recipes/switch.d.ts +18 -0
- package/dist/theme/recipes/tabs.d.ts +11 -0
- package/dist/{theme-CNhnbvcE.js → theme-7PDdD9OD.js} +403 -195
- package/dist/theme-7PDdD9OD.js.map +1 -0
- package/dist/theme.js +1 -1
- package/dist/{tree-list-CZHLAURU.js → tree-list-B2L0cTj2.js} +2 -2
- package/dist/{tree-list-CZHLAURU.js.map → tree-list-B2L0cTj2.js.map} +1 -1
- package/package.json +3 -2
- package/dist/components/param-editor/inputs/file-accept.d.ts +0 -22
- package/dist/components/param-editor/inputs/file-drop-input.d.ts +0 -14
- package/dist/kanban-renderer-toolbar-B9ro-9z1.js.map +0 -1
- package/dist/list-row-YRUxEcy3.js +0 -808
- package/dist/list-row-YRUxEcy3.js.map +0 -1
- package/dist/param-editor-CYZJbmKu.js +0 -933
- package/dist/param-editor-CYZJbmKu.js.map +0 -1
- package/dist/param-editor-read-only-field-DgtLqcFa.js +0 -925
- package/dist/param-editor-read-only-field-DgtLqcFa.js.map +0 -1
- package/dist/prism-BXb57lxL.js +0 -125
- package/dist/prism-BXb57lxL.js.map +0 -1
- package/dist/resource-badge-qCWHP-wQ.js +0 -99
- package/dist/resource-badge-qCWHP-wQ.js.map +0 -1
- package/dist/rich-message-DBf_5YlW.js +0 -1450
- package/dist/rich-message-DBf_5YlW.js.map +0 -1
- package/dist/theme-CNhnbvcE.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-renderer-toolbar-Bcj_N1qr.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 { Tooltip } from \"@/components/primitives/tooltip\";\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 <Tooltip content=\"Add view\">\n <IconButton\n aria-label=\"Add view\"\n size=\"2xs\"\n variant=\"ghost\"\n onClick={() => createView(nextViewIdentity(views))}\n >\n <Icon as={Plus} />\n </IconButton>\n </Tooltip>\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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"}
|