@qijenchen/design-system 0.1.0-beta.95 → 0.1.0-beta.99
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/README.md +1 -0
- package/dist/components/AccountMenu/account-menu.d.ts +86 -0
- package/dist/components/AccountMenu/account-menu.d.ts.map +1 -0
- package/dist/components/AccountMenu/account-menu.js +64 -0
- package/dist/components/AccountMenu/account-menu.js.map +1 -0
- package/dist/components/AccountMenu/index.d.ts +2 -0
- package/dist/components/AccountMenu/index.d.ts.map +1 -0
- package/dist/components/AccountMenu/index.js +6 -0
- package/dist/components/AccountMenu/index.js.map +1 -0
- package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.js +2 -2
- package/dist/components/AppShell/app-shell.js.map +1 -1
- package/dist/components/Badge/badge.d.ts +1 -1
- package/dist/components/Button/button.d.ts +3 -3
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js +3 -2
- package/dist/components/Button/button.js.map +1 -1
- package/dist/components/Calendar/calendar.d.ts +10 -21
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +52 -59
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +1 -0
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/Command/command.d.ts.map +1 -1
- package/dist/components/Command/command.js +3 -1
- package/dist/components/Command/command.js.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +1 -5
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/data-table-filter-group.d.ts +6 -2
- package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-filter-group.js +32 -27
- package/dist/components/DataTable/data-table-filter-group.js.map +1 -1
- package/dist/components/DataTable/data-table-filter-labels.d.ts +44 -0
- package/dist/components/DataTable/data-table-filter-labels.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-labels.js +55 -0
- package/dist/components/DataTable/data-table-filter-labels.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts +11 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-filter-panel.js +33 -10
- package/dist/components/DataTable/data-table-filter-panel.js.map +1 -1
- package/dist/components/DataTable/data-table-filter-value-picker.d.ts +4 -1
- package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-filter-value-picker.js +22 -8
- package/dist/components/DataTable/data-table-filter-value-picker.js.map +1 -1
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +5 -4
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/index.js +2 -0
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +187 -156
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/Dialog/dialog.d.ts +1 -1
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +4 -2
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.d.ts +4 -1
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.js +46 -14
- package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
- package/dist/components/Field/field-context.d.ts +12 -0
- package/dist/components/Field/field-context.d.ts.map +1 -1
- package/dist/components/Field/field-context.js +10 -1
- package/dist/components/Field/field-context.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +7 -1
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js +11 -2
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/FieldControlGroup/field-control-group.d.ts +2 -5
- package/dist/components/FieldControlGroup/field-control-group.d.ts.map +1 -1
- package/dist/components/FieldControlGroup/field-control-group.js +2 -2
- package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
- package/dist/components/FileUpload/file-upload.js +1 -1
- package/dist/components/FileUpload/file-upload.js.map +1 -1
- package/dist/components/FileViewer/file-viewer.d.ts +1 -1
- package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
- package/dist/components/FileViewer/file-viewer.js +20 -3
- package/dist/components/FileViewer/file-viewer.js.map +1 -1
- package/dist/components/InlineEdit/inline-edit.d.ts +5 -0
- package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -1
- package/dist/components/InlineEdit/inline-edit.js +65 -33
- package/dist/components/InlineEdit/inline-edit.js.map +1 -1
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +3 -2
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +2 -1
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Menu/menu-item.d.ts.map +1 -1
- package/dist/components/Menu/menu-item.js +4 -2
- package/dist/components/Menu/menu-item.js.map +1 -1
- package/dist/components/PeoplePicker/people-picker.d.ts +2 -0
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +4 -0
- package/dist/components/PeoplePicker/people-picker.js.map +1 -1
- package/dist/components/Popover/popover.d.ts.map +1 -1
- package/dist/components/Popover/popover.js +4 -2
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/ScrollArea/scroll-area.d.ts +4 -3
- package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
- package/dist/components/ScrollArea/scroll-area.js +1 -1
- package/dist/components/ScrollArea/scroll-area.js.map +1 -1
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +59 -37
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/SelectMenu/select-menu.d.ts +2 -0
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
- package/dist/components/SelectMenu/select-menu.js +3 -1
- package/dist/components/SelectMenu/select-menu.js.map +1 -1
- package/dist/components/Sheet/sheet.d.ts +1 -1
- package/dist/components/Sidebar/sidebar.js +2 -2
- package/dist/components/Sidebar/sidebar.js.map +1 -1
- package/dist/components/Tabs/tabs.d.ts.map +1 -1
- package/dist/components/Tabs/tabs.js +3 -0
- package/dist/components/Tabs/tabs.js.map +1 -1
- package/dist/components/Tag/tag.d.ts +1 -1
- package/dist/components/Tag/tag.d.ts.map +1 -1
- package/dist/components/Tag/tag.js +4 -3
- package/dist/components/Tag/tag.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +11 -0
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +22 -5
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +4 -3
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/Tooltip/tooltip.d.ts +1 -1
- package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/tooltip.js +26 -1
- package/dist/components/Tooltip/tooltip.js.map +1 -1
- package/dist/components/TreeView/tree-view.d.ts +2 -0
- package/dist/components/TreeView/tree-view.d.ts.map +1 -1
- package/dist/components/TreeView/tree-view.js +3 -2
- package/dist/components/TreeView/tree-view.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +10 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js +77 -29
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/dist/patterns/header-canonical/chrome-header.d.ts +11 -4
- package/dist/patterns/header-canonical/chrome-header.d.ts.map +1 -1
- package/dist/patterns/header-canonical/chrome-header.js +1 -1
- package/dist/patterns/header-canonical/chrome-header.js.map +1 -1
- package/dist/patterns/overlay-surface/overlay-surface.d.ts +4 -3
- package/dist/patterns/overlay-surface/overlay-surface.d.ts.map +1 -1
- package/dist/patterns/overlay-surface/overlay-surface.js +1 -0
- package/dist/patterns/overlay-surface/overlay-surface.js.map +1 -1
- package/dist/patterns/resize-handle/resize-handle.d.ts +9 -11
- package/dist/patterns/resize-handle/resize-handle.d.ts.map +1 -1
- package/dist/patterns/resize-handle/resize-handle.js +3 -6
- package/dist/patterns/resize-handle/resize-handle.js.map +1 -1
- package/ds-canonical/adapters/claude/agents/canonical-reviewer.md +1 -1
- package/ds-canonical/adapters/claude-root-instructions.md +1 -1
- package/ds-canonical/adapters/claude-settings-base.json +2 -5
- package/ds-canonical/fork/AGENTS.md +21 -10
- package/ds-canonical/fork/codex/hooks.json +1 -1
- package/ds-canonical/fork/common/instruction.md +21 -10
- package/ds-canonical/fork/consumer/governance-check.mjs +101 -13
- package/ds-canonical/fork/consumer/lock.json +14 -15
- package/ds-canonical/fork/consumer/managed-files/46f10bc55cdfdf834d0749eebff42ea0bb8576f361b36d2b6ba1851354c50150.blob +26 -3
- package/ds-canonical/fork/consumer/managed-files/63061e05969667005020166ea2ae7df3c96663f7a928e7dd3eebc1471022df56.blob +61 -5
- package/ds-canonical/fork/consumer/managed-files/93a89f16f6717d1e4e4e27ec20ef916e3355c7aa890ca74cd9b12db30d8a899f.blob +3 -10
- package/ds-canonical/fork/consumer/managed-files/bc44cabad181f766611dab6a8f52d81100afadd50ac59799015e8ba7bf46d9eb.blob +3 -2
- package/ds-canonical/fork/governance.lock +17 -33
- package/ds-canonical/fork/hooks/check_consumer_code_quality.sh +33 -0
- package/ds-canonical/fork/hooks/check_pattern_invariants.sh +39 -0
- package/ds-canonical/fork/hooks/check_sidebar_menu_button_implicit_wrap.sh +6 -4
- package/ds-canonical/fork/launchers/provider-hook-normalization.mjs +5 -11
- package/ds-canonical/fork/launchers/settings-hooks.json +2 -2
- package/ds-canonical/fork/manifest.json +11 -13
- package/ds-canonical/fork/providers/claude/hook-config.json +1 -7
- package/ds-canonical/fork/providers/codex/hook-config.json +1 -1
- package/ds-canonical/fork/references/story-baseline-registry.json +7 -1
- package/ds-canonical/hooks/check_consumer_code_quality.sh +33 -0
- package/ds-canonical/hooks/check_pattern_invariants.sh +39 -0
- package/ds-canonical/hooks/check_sidebar_menu_button_implicit_wrap.sh +6 -4
- package/ds-canonical/hooks/session_start_governance_check.sh +5 -6
- package/ds-canonical/hooks/tests/test_check_consumer_code_quality.sh +23 -1
- package/ds-canonical/hooks/tests/test_check_pattern_invariants.sh +36 -2
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +1 -1
- package/ds-canonical/references/failure-class-registry.json +151 -144
- package/ds-canonical/references/preflight-gate-baseline.json +16 -12
- package/ds-canonical/references/story-baseline-registry.json +7 -1
- package/ds-canonical/rules/meta-patterns.md +3 -3
- package/ds-canonical/skills/design-system-audit/SKILL.md +1 -1
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +1 -1
- package/ds-canonical/templates/dashboard-app.tsx +31 -8
- package/llms-full.txt +6 -1
- package/llms.txt +2 -1
- package/package.json +1 -1
- package/src/components/Accordion/accordion.principles.stories.tsx +16 -26
- package/src/components/Accordion/accordion.stories.tsx +22 -40
- package/src/components/AccountMenu/account-menu.anatomy.stories.tsx +115 -0
- package/src/components/AccountMenu/account-menu.principles.stories.tsx +99 -0
- package/src/components/AccountMenu/account-menu.spec.md +101 -0
- package/src/components/AccountMenu/account-menu.stories.tsx +61 -0
- package/src/components/AccountMenu/account-menu.tsx +170 -0
- package/src/components/AccountMenu/index.ts +5 -0
- package/src/components/AppShell/_demo-helpers.tsx +53 -53
- package/src/components/AppShell/app-shell.spec.md +5 -1
- package/src/components/AppShell/app-shell.tsx +14 -12
- package/src/components/Avatar/avatar.principles.stories.tsx +4 -4
- package/src/components/Avatar/avatar.stories.tsx +20 -5
- package/src/components/Breadcrumb/breadcrumb.spec.md +1 -1
- package/src/components/Button/button.spec.md +1 -1
- package/src/components/Button/button.stories.tsx +21 -9
- package/src/components/Button/button.tsx +5 -4
- package/src/components/Calendar/calendar.anatomy.stories.tsx +19 -17
- package/src/components/Calendar/calendar.principles.stories.tsx +5 -6
- package/src/components/Calendar/calendar.spec.md +25 -29
- package/src/components/Calendar/calendar.stories.tsx +5 -7
- package/src/components/Calendar/calendar.tsx +75 -87
- package/src/components/Carousel/carousel.principles.stories.tsx +5 -1
- package/src/components/Chart/chart.spec.md +1 -1
- package/src/components/Checkbox/checkbox.anatomy.stories.tsx +14 -5
- package/src/components/Chip/chip.spec.md +1 -1
- package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +7 -6
- package/src/components/CircularProgress/circular-progress.principles.stories.tsx +8 -6
- package/src/components/CircularProgress/circular-progress.stories.tsx +3 -3
- package/src/components/Combobox/combobox.tsx +1 -0
- package/src/components/Command/command.spec.md +1 -0
- package/src/components/Command/command.tsx +4 -1
- package/src/components/DataTable/cell-registry.tsx +3 -7
- package/src/components/DataTable/data-table-filter-group.tsx +44 -27
- package/src/components/DataTable/data-table-filter-labels.ts +100 -0
- package/src/components/DataTable/data-table-filter-panel.tsx +48 -8
- package/src/components/DataTable/data-table-filter-value-picker.tsx +25 -8
- package/src/components/DataTable/data-table.spec.md +18 -1
- package/src/components/DataTable/data-table.stories.tsx +346 -33
- package/src/components/DataTable/data-table.tsx +11 -4
- package/src/components/DataTable/filter-operators.spec.md +2 -2
- package/src/components/DateGrid/date-grid.anatomy.stories.tsx +24 -20
- package/src/components/DateGrid/date-grid.principles.stories.tsx +27 -21
- package/src/components/DateGrid/date-grid.stories.tsx +22 -13
- package/src/components/DatePicker/date-picker.anatomy.stories.tsx +3 -3
- package/src/components/DatePicker/date-picker.spec.md +4 -4
- package/src/components/DatePicker/date-picker.stories.tsx +33 -9
- package/src/components/DatePicker/date-picker.tsx +210 -147
- package/src/components/Dialog/dialog.spec.md +1 -1
- package/src/components/Dialog/dialog.tsx +8 -2
- package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
- package/src/components/DropdownMenu/dropdown-menu.spec.md +5 -0
- package/src/components/DropdownMenu/dropdown-menu.stories.tsx +3 -17
- package/src/components/DropdownMenu/dropdown-menu.tsx +58 -16
- package/src/components/Field/field-context.ts +25 -1
- package/src/components/Field/field-wrapper.tsx +7 -1
- package/src/components/Field/field.spec.md +8 -1
- package/src/components/Field/field.tsx +14 -2
- package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +3 -3
- package/src/components/FieldControlGroup/field-control-group.spec.md +2 -3
- package/src/components/FieldControlGroup/field-control-group.stories.tsx +2 -1
- package/src/components/FieldControlGroup/field-control-group.tsx +6 -9
- package/src/components/FileItem/file-item.spec.md +1 -1
- package/src/components/FileItem/file-item.stories.tsx +1 -1
- package/src/components/FileUpload/file-upload.stories.tsx +32 -0
- package/src/components/FileUpload/file-upload.tsx +1 -1
- package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +1 -1
- package/src/components/FileViewer/file-viewer.spec.md +1 -1
- package/src/components/FileViewer/file-viewer.stories.tsx +7 -0
- package/src/components/FileViewer/file-viewer.tsx +23 -5
- package/src/components/InlineEdit/inline-edit.spec.md +12 -0
- package/src/components/InlineEdit/inline-edit.stories.tsx +30 -19
- package/src/components/InlineEdit/inline-edit.tsx +94 -31
- package/src/components/Input/input.anatomy.stories.tsx +28 -12
- package/src/components/Input/input.principles.stories.tsx +23 -18
- package/src/components/Input/input.stories.tsx +9 -1
- package/src/components/Input/input.tsx +7 -2
- package/src/components/LinkInput/link-input.principles.stories.tsx +7 -7
- package/src/components/LinkInput/link-input.spec.md +1 -1
- package/src/components/LinkInput/link-input.tsx +5 -1
- package/src/components/Menu/menu-item.anatomy.stories.tsx +1 -1
- package/src/components/Menu/menu-item.tsx +9 -2
- package/src/components/NumberInput/number-input.anatomy.stories.tsx +44 -10
- package/src/components/NumberInput/number-input.principles.stories.tsx +20 -14
- package/src/components/NumberInput/number-input.spec.md +1 -1
- package/src/components/NumberInput/number-input.stories.tsx +12 -5
- package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +7 -0
- package/src/components/PeoplePicker/people-picker.spec.md +3 -1
- package/src/components/PeoplePicker/people-picker.tsx +5 -0
- package/src/components/Popover/popover.tsx +7 -2
- package/src/components/ProgressBar/progress-bar.principles.stories.tsx +14 -12
- package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +5 -1
- package/src/components/RadioGroup/radio-group.spec.md +1 -1
- package/src/components/Rating/rating.principles.stories.tsx +2 -2
- package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.spec.md +3 -3
- package/src/components/ScrollArea/scroll-area.tsx +5 -4
- package/src/components/Select/select.principles.stories.tsx +4 -3
- package/src/components/Select/select.stories.tsx +7 -6
- package/src/components/Select/select.tsx +61 -29
- package/src/components/SelectMenu/select-menu.spec.md +1 -1
- package/src/components/SelectMenu/select-menu.tsx +4 -1
- package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +19 -8
- package/src/components/SelectionControl/selection-item.stories.tsx +7 -7
- package/src/components/Sheet/sheet.spec.md +1 -1
- package/src/components/Sidebar/sidebar.spec.md +3 -2
- package/src/components/Sidebar/sidebar.stories.tsx +67 -37
- package/src/components/Sidebar/sidebar.tsx +3 -3
- package/src/components/Slider/slider.principles.stories.tsx +9 -9
- package/src/components/Steps/steps.spec.md +1 -0
- package/src/components/Steps/steps.stories.tsx +18 -1
- package/src/components/Switch/switch.anatomy.stories.tsx +11 -11
- package/src/components/Switch/switch.principles.stories.tsx +11 -8
- package/src/components/Tabs/tabs.principles.stories.tsx +24 -0
- package/src/components/Tabs/tabs.spec.md +6 -4
- package/src/components/Tabs/tabs.tsx +11 -0
- package/src/components/Tag/tag.anatomy.stories.tsx +5 -2
- package/src/components/Tag/tag.spec.md +4 -3
- package/src/components/Tag/tag.stories.tsx +19 -0
- package/src/components/Tag/tag.tsx +14 -5
- package/src/components/Textarea/textarea.anatomy.stories.tsx +15 -9
- package/src/components/Textarea/textarea.principles.stories.tsx +21 -5
- package/src/components/Textarea/textarea.spec.md +10 -1
- package/src/components/Textarea/textarea.tsx +38 -5
- package/src/components/TimePicker/time-picker.tsx +11 -5
- package/src/components/Tooltip/tooltip.spec.md +10 -0
- package/src/components/Tooltip/tooltip.tsx +34 -3
- package/src/components/TreeView/tree-view.spec.md +3 -3
- package/src/components/TreeView/tree-view.stories.tsx +68 -9
- package/src/components/TreeView/tree-view.tsx +7 -2
- package/src/index.ts +9 -1
- package/src/patterns/element-anatomy/inline-action.spec.md +12 -8
- package/src/patterns/element-anatomy/item-anatomy.spec.md +8 -1
- package/src/patterns/element-anatomy/item-anatomy.stories.tsx +24 -5
- package/src/patterns/element-anatomy/item-anatomy.tsx +120 -35
- package/src/patterns/element-anatomy/truncated-text.spec.md +13 -2
- package/src/patterns/header-canonical/chrome-header.tsx +14 -5
- package/src/patterns/header-canonical/header-canonical.spec.md +10 -7
- package/src/patterns/header-canonical/header-canonical.stories.tsx +77 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +2 -0
- package/src/patterns/overlay-surface/overlay-surface.spec.md +1 -0
- package/src/patterns/overlay-surface/overlay-surface.stories.tsx +17 -1
- package/src/patterns/overlay-surface/overlay-surface.tsx +8 -4
- package/src/patterns/resize-handle/resize-handle.spec.md +11 -13
- package/src/patterns/resize-handle/resize-handle.stories.tsx +1 -3
- package/src/patterns/resize-handle/resize-handle.tsx +13 -18
- package/src/tokens/color/semantic.css +3 -1
- package/src/tokens/layoutSpace/layoutSpace.stories.tsx +1 -1
- package/src/tokens/opacity/opacity.stories.tsx +1 -1
- package/src/tokens/radius/radius.stories.tsx +3 -3
- package/src/tokens/uiSize/uiSize.css +11 -0
- package/src/tokens/uiSize/uiSize.spec.md +1 -0
- package/ds-canonical/commands/gov-status.md +0 -9
- package/ds-canonical/fork/consumer/managed-files/77e06f62670dfee01e9b5e8b0f8dad085ce711d75538c1fb0679d9818acaca82.blob +0 -424
- package/ds-canonical/fork/preamble.md +0 -500
- package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +0 -8
- package/ds-canonical/hooks/tests/test_check_post_main_ssot_propagate.sh +0 -37
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-filter-panel.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgBtD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAElB,YAAY,EACZ,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"data-table-filter-panel.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAgBtD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAElB,YAAY,EACZ,oBAAoB,EACpB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,sCAAsC,EAEtC,KAAK,0BAA0B,EAChC,MAAM,4BAA4B,CAAA;AAGnC,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,oBAAoB,GACrB,CAAA;AACD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,CAAA;AACvG,OAAO,EAAE,sCAAsC,EAAE,CAAA;AACjD,YAAY,EAAE,0BAA0B,EAAE,CAAA;AAiG1C,MAAM,WAAW,yBAAyB,CAAC,KAAK;IAI9C,0BAA0B;IAC1B,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAA;IAChC,gCAAgC;IAChC,KAAK,EAAE,UAAU,CAAA;IACjB,wBAAwB;IACxB,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC;;;;OAIG;IACH,YAAY,CAAC,EAAE,UAAU,CAAA;IACzB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAA;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AA2QD,eAAO,MAAM,oBAAoB,EAAkD,CAAC,KAAK,EACvF,KAAK,EAAE,yBAAyB,CAAC,KAAK,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;CAAE,KACnF,KAAK,CAAC,YAAY,CACtB"}
|
|
@@ -10,6 +10,8 @@ import { getColumnId, getColumnMeta, getColumnLabel } from "./lib/column-meta.js
|
|
|
10
10
|
import { datePrecisionOf, getDefaultOperator, FilterRow, GroupBlock } from "./data-table-filter-group.js";
|
|
11
11
|
import { isFilterTreeEqual } from "./filter-tree.js";
|
|
12
12
|
import { createEmptyFilterTree, dataTableFilterMatch, evaluateTree, isFilterTreeActive } from "./filter-tree.js";
|
|
13
|
+
import { resolveDataTableFilterPanelLabels } from "./data-table-filter-labels.js";
|
|
14
|
+
import { DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS } from "./data-table-filter-labels.js";
|
|
13
15
|
let _idSeed = 0;
|
|
14
16
|
const newId = () => `f${++_idSeed}-${Date.now().toString(36)}`;
|
|
15
17
|
function extractColumns(columns) {
|
|
@@ -60,6 +62,12 @@ const newEmptyGroup = () => ({
|
|
|
60
62
|
conjunction: "or",
|
|
61
63
|
children: [newEmptyCondition()]
|
|
62
64
|
});
|
|
65
|
+
const countFilterConditions = (tree) => tree.mode === "flat" ? tree.children.length : tree.children.reduce((total, group) => total + group.children.length, 0);
|
|
66
|
+
const normalizeMaxConditions = (maxConditions) => {
|
|
67
|
+
if (maxConditions === void 0 || maxConditions === Number.POSITIVE_INFINITY) return Number.POSITIVE_INFINITY;
|
|
68
|
+
if (!Number.isFinite(maxConditions)) return 0;
|
|
69
|
+
return Math.max(0, Math.floor(maxConditions));
|
|
70
|
+
};
|
|
63
71
|
function DataTableFilterPanelInner({
|
|
64
72
|
columns,
|
|
65
73
|
value,
|
|
@@ -67,6 +75,8 @@ function DataTableFilterPanelInner({
|
|
|
67
75
|
defaultValue,
|
|
68
76
|
prefilledColumnId,
|
|
69
77
|
onPrefillConsumed,
|
|
78
|
+
maxConditions,
|
|
79
|
+
labels: labelsOverride,
|
|
70
80
|
onClose,
|
|
71
81
|
className
|
|
72
82
|
}, ref) {
|
|
@@ -75,12 +85,20 @@ function DataTableFilterPanelInner({
|
|
|
75
85
|
() => filterableColumns.map((c) => ({ value: c.id, label: c.label })),
|
|
76
86
|
[filterableColumns]
|
|
77
87
|
);
|
|
88
|
+
const labels = React.useMemo(
|
|
89
|
+
() => resolveDataTableFilterPanelLabels(labelsOverride),
|
|
90
|
+
[labelsOverride]
|
|
91
|
+
);
|
|
92
|
+
const conditionCount = countFilterConditions(value);
|
|
93
|
+
const normalizedMaxConditions = normalizeMaxConditions(maxConditions);
|
|
94
|
+
const canAddCondition = conditionCount < normalizedMaxConditions;
|
|
78
95
|
const initialMountDoneRef = React.useRef(false);
|
|
79
96
|
React.useEffect(() => {
|
|
80
97
|
if (initialMountDoneRef.current) return;
|
|
81
98
|
initialMountDoneRef.current = true;
|
|
82
99
|
if (filterableColumns.length === 0) return;
|
|
83
100
|
if (value.children.length > 0) return;
|
|
101
|
+
if (!canAddCondition) return;
|
|
84
102
|
if (value.mode === "flat") {
|
|
85
103
|
onChange({ ...value, children: [newEmptyCondition()] });
|
|
86
104
|
} else {
|
|
@@ -90,7 +108,7 @@ function DataTableFilterPanelInner({
|
|
|
90
108
|
React.useEffect(() => {
|
|
91
109
|
if (!prefilledColumnId) return;
|
|
92
110
|
const colInfo = filterableColumns.find((c) => c.id === prefilledColumnId);
|
|
93
|
-
if (colInfo) {
|
|
111
|
+
if (colInfo && canAddCondition) {
|
|
94
112
|
const cond = {
|
|
95
113
|
kind: "cond",
|
|
96
114
|
id: newId(),
|
|
@@ -129,7 +147,7 @@ function DataTableFilterPanelInner({
|
|
|
129
147
|
onChange({ ...flatTree, children: flatTree.children.filter((c) => c.id !== id) });
|
|
130
148
|
};
|
|
131
149
|
const addFlatCondition = () => {
|
|
132
|
-
if (!flatTree) return;
|
|
150
|
+
if (!flatTree || !canAddCondition) return;
|
|
133
151
|
onChange({ ...flatTree, children: [...flatTree.children, newEmptyCondition()] });
|
|
134
152
|
};
|
|
135
153
|
const setFlatConjunction = (conj) => {
|
|
@@ -163,7 +181,7 @@ function DataTableFilterPanelInner({
|
|
|
163
181
|
});
|
|
164
182
|
};
|
|
165
183
|
const addConditionToGroup = (groupId) => {
|
|
166
|
-
if (!nestedTree) return;
|
|
184
|
+
if (!nestedTree || !canAddCondition) return;
|
|
167
185
|
onChange({
|
|
168
186
|
...nestedTree,
|
|
169
187
|
children: nestedTree.children.map(
|
|
@@ -176,7 +194,7 @@ function DataTableFilterPanelInner({
|
|
|
176
194
|
onChange({ ...nestedTree, children: nestedTree.children.filter((g) => g.id !== groupId) });
|
|
177
195
|
};
|
|
178
196
|
const addGroup = () => {
|
|
179
|
-
if (!nestedTree) return;
|
|
197
|
+
if (!nestedTree || !canAddCondition) return;
|
|
180
198
|
onChange({ ...nestedTree, children: [...nestedTree.children, newEmptyGroup()] });
|
|
181
199
|
};
|
|
182
200
|
const setRootConjunction = (conj) => {
|
|
@@ -204,7 +222,7 @@ function DataTableFilterPanelInner({
|
|
|
204
222
|
className
|
|
205
223
|
), children: [
|
|
206
224
|
/* @__PURE__ */ jsxs(SurfaceHeader, { className: COMPACT_HEADER_SLOT, children: [
|
|
207
|
-
/* @__PURE__ */ jsx(PopoverTitle, { className: "flex-1", children:
|
|
225
|
+
/* @__PURE__ */ jsx(PopoverTitle, { className: "flex-1", children: labels.title }),
|
|
208
226
|
defaultValue && !isFilterTreeEqual(value, defaultValue) && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
209
227
|
/* @__PURE__ */ jsx(
|
|
210
228
|
Button,
|
|
@@ -213,13 +231,13 @@ function DataTableFilterPanelInner({
|
|
|
213
231
|
size: "sm",
|
|
214
232
|
iconOnly: true,
|
|
215
233
|
startIcon: RotateCcw,
|
|
216
|
-
"aria-label":
|
|
234
|
+
"aria-label": labels.resetToDefault,
|
|
217
235
|
onClick: () => onChange(defaultValue)
|
|
218
236
|
}
|
|
219
237
|
),
|
|
220
238
|
onClose && /* @__PURE__ */ jsx(ButtonDivider, {})
|
|
221
239
|
] }),
|
|
222
|
-
onClose && /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { "data-dismiss": true, iconOnly: true, dismiss: true, size: "sm", startIcon: X, "aria-label":
|
|
240
|
+
onClose && /* @__PURE__ */ jsx(PopoverClose, { asChild: true, children: /* @__PURE__ */ jsx(Button, { "data-dismiss": true, iconOnly: true, dismiss: true, size: "sm", startIcon: X, "aria-label": labels.close, onClick: onClose }) })
|
|
223
241
|
] }),
|
|
224
242
|
/* @__PURE__ */ jsxs(SurfaceBody, { className: "flex flex-col gap-[var(--layout-space-tight)]", children: [
|
|
225
243
|
flatTree && flatTree.children.map((cond, idx) => /* @__PURE__ */ jsx(
|
|
@@ -237,7 +255,8 @@ function DataTableFilterPanelInner({
|
|
|
237
255
|
},
|
|
238
256
|
onChangeOp: (v) => updateFlatCondition(cond.id, { op: v, value: "" }),
|
|
239
257
|
onChangeValue: (v) => updateFlatCondition(cond.id, { value: v }),
|
|
240
|
-
onRemove: () => removeFlatCondition(cond.id)
|
|
258
|
+
onRemove: () => removeFlatCondition(cond.id),
|
|
259
|
+
labels
|
|
241
260
|
},
|
|
242
261
|
cond.id
|
|
243
262
|
)),
|
|
@@ -254,7 +273,9 @@ function DataTableFilterPanelInner({
|
|
|
254
273
|
onChangeCondition: (condId, patch) => updateGroupCondition(group.id, condId, patch),
|
|
255
274
|
onRemoveCondition: (condId) => removeGroupCondition(group.id, condId),
|
|
256
275
|
onAddCondition: () => addConditionToGroup(group.id),
|
|
257
|
-
onRemoveGroup: () => removeGroup(group.id)
|
|
276
|
+
onRemoveGroup: () => removeGroup(group.id),
|
|
277
|
+
canAddCondition,
|
|
278
|
+
labels
|
|
258
279
|
},
|
|
259
280
|
group.id
|
|
260
281
|
)),
|
|
@@ -265,7 +286,8 @@ function DataTableFilterPanelInner({
|
|
|
265
286
|
size: "sm",
|
|
266
287
|
startIcon: Plus,
|
|
267
288
|
onClick: value.mode === "flat" ? addFlatCondition : addGroup,
|
|
268
|
-
|
|
289
|
+
disabled: !canAddCondition,
|
|
290
|
+
children: value.mode === "nested" ? labels.addGroup : labels.addFilter
|
|
269
291
|
}
|
|
270
292
|
) })
|
|
271
293
|
] })
|
|
@@ -275,6 +297,7 @@ function DataTableFilterPanelInner({
|
|
|
275
297
|
const DataTableFilterPanel = React.forwardRef(DataTableFilterPanelInner);
|
|
276
298
|
DataTableFilterPanel.displayName = "DataTableFilterPanel";
|
|
277
299
|
export {
|
|
300
|
+
DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS,
|
|
278
301
|
DataTableFilterPanel,
|
|
279
302
|
createEmptyFilterTree,
|
|
280
303
|
dataTableFilterMatch,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-filter-panel.js","sources":["../../../src/components/DataTable/data-table-filter-panel.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\n// same-row-mixed-allow: header chrome corner buttons(close)跟 row inline actions(trash)不在同 row\nimport * as React from 'react'\nimport { Plus, X as XIcon, RotateCcw } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\nimport type { SelectOption } from '@/design-system/components/Select/select'\nimport { SurfaceHeader, SurfaceBody, COMPACT_HEADER_SLOT } from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport { PopoverTitle, PopoverClose } from '@/design-system/components/Popover/popover'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport type { ColumnType } from './column-types'\nimport { getColumnId, getColumnLabel, getColumnMeta } from './lib/column-meta'\nimport {\n FilterRow,\n GroupBlock,\n getDefaultOperator,\n datePrecisionOf,\n type FilterColumn,\n} from './data-table-filter-group'\nimport {\n createEmptyFilterTree,\n isFilterTreeActive,\n isFilterTreeEqual,\n evaluateTree,\n dataTableFilterMatch,\n type Conjunction,\n type FilterCondition,\n type FilterGroup,\n type FilterTree,\n type FilterTreeFlat,\n type FilterTreeNested,\n} from './filter-tree'\n\n// Re-export public API from filter-tree(consumer 既有 import path 不變)\nexport {\n createEmptyFilterTree,\n isFilterTreeActive,\n evaluateTree,\n dataTableFilterMatch,\n}\nexport type { Conjunction, FilterCondition, FilterGroup, FilterTree, FilterTreeFlat, FilterTreeNested }\n\n/**\n * DataTableFilterPanel — ClickUp-style 進階篩選 panel\n *\n * 對齊 ClickUp / Airtable / Notion / Coda / Linear advanced-filter 派 —\n * parenthesized boolean expression builder。\n *\n * 兩種 mode 由 consumer 拍板:\n * - `flat`:root 下只能裝 condition,無 group\n * - `nested`:root 下裝 1+ group(灰底框),每個 group 內裝 1+ condition,**剛好 1 層**\n *\n * Source-of-truth:\n * - Operator definitions:`./filter-operators.ts` `OPERATOR_REGISTRY`(SSOT,禁 hardcode op 字串)\n * - Filter state:**FilterTree**(本檔自管;搭配 TanStack `globalFilter` 求值)\n * - Row / nested-group renderer:`./data-table-filter-group.tsx`;value picker:\n * `./data-table-filter-value-picker.tsx`(皆 @internal — 2026-07-14 file-size 拆檔,\n * 本檔只留 orchestration:columns 抽取 / FilterTree mutators / panel chrome)\n *\n * 詳:`./filter-operators.spec.md`\n */\n\n// ── Internal — id seed ──────────────────────────────────────────────────\n\nlet _idSeed = 0\nconst newId = () => `f${++_idSeed}-${Date.now().toString(36)}`\n\n// ── Helpers — column extraction + condition factories ──────────────────\n// (FilterColumn type + operator helpers 住 ./data-table-filter-group.tsx)\n\nfunction extractColumns<TData>(columns: ColumnDef<TData, any>[]): FilterColumn[] {\n const out: FilterColumn[] = []\n for (const col of columns) {\n const id = getColumnId(col)\n if (!id || id === '__select__') continue\n const meta = getColumnMeta(col)\n const type: ColumnType | undefined = meta?.type\n if (!type) continue\n if (meta?.filterable === false) continue\n out.push({\n id,\n label: getColumnLabel(col, id),\n type,\n options: meta?.options,\n people: meta?.people,\n includeTime: meta?.includeTime,\n })\n }\n return out\n}\n\nconst newCondition = (firstCol: FilterColumn | undefined): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: firstCol?.id ?? '',\n op: firstCol ? getDefaultOperator(firstCol.type) : '',\n value: '',\n datePrecision: datePrecisionOf(firstCol),\n})\n\n// **G fix(2026-05-04)**:initial-mount 用 — field 不預選,user 自選後 op/value 才 enable\n// Disabled state(field='')→ op + value 在 FilterRow 內走 `disabled={!hasField}` 自動連動\nconst newEmptyCondition = (): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: '',\n op: '',\n value: '',\n})\n\nconst newGroup = (firstCol: FilterColumn | undefined): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or', // group 內 default OR(對齊 ref 圖)\n children: [newCondition(firstCol)],\n})\n\nconst newEmptyGroup = (): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or',\n children: [newEmptyCondition()],\n})\n\n// ── Component Props ─────────────────────────────────────────────────────\n\nexport interface DataTableFilterPanelProps<TData> {\n // 2026-07-18 決策17:移除獨立 `mode` prop(單一真相源 = `value.mode` discriminant)——\n // 舊設計 mode + value.mode 兩來源型別允許矛盾(mode='nested' 配 flat value → CTA 錯文案 + 死操作);\n // 無外部消費者傳 mode(grep 0),全由 value.mode 推導。對齊 MUI X GridFilterModel / AG Grid 單一 model。\n /** 可被 filter 的 columns */\n columns: ColumnDef<TData, any>[]\n /** 當前 FilterTree(controlled) */\n value: FilterTree\n /** state 變更 callback */\n onChange: (next: FilterTree) => void\n /**\n * 管理員 set-as-default 的 baseline(refresh icon 顯示判定用)。\n * 當 `value` ≠ `defaultValue`(deep equal)→ panel header 顯示 refresh icon,\n * click → reset 回 defaultValue。對齊 sort 邏輯(相同 modified-from-default UX)。\n */\n defaultValue?: FilterTree\n /** Cell ⌄ menu「Filter by this」帶入的 column id(自動 add 一條 condition) */\n prefilledColumnId?: string\n onPrefillConsumed?: () => void\n onClose?: () => void\n className?: string\n}\n\n// ── Main Component ──────────────────────────────────────────────────────\n\n// 內部 fn — generic + ref 轉發。export 走 cast(對齊 DataTable 同 pattern)\nfunction DataTableFilterPanelInner<TData>({\n columns,\n value,\n onChange,\n defaultValue,\n prefilledColumnId,\n onPrefillConsumed,\n onClose,\n className,\n}: DataTableFilterPanelProps<TData>, ref: React.ForwardedRef<HTMLDivElement>): React.ReactElement {\n const filterableColumns = React.useMemo(() => extractColumns(columns), [columns])\n const fieldOptions: SelectOption[] = React.useMemo(\n () => filterableColumns.map((c) => ({ value: c.id, label: c.label })),\n [filterableColumns],\n )\n // K13 後 firstCol 不再被 add* 消費(改用 newEmpty*),這裡只留 prefill effect 用(已直接讀 prefilledColumnId)。\n\n // **G fix(2026-05-04 v2)**:initial-mount 預設 1 empty row(field 未選 → op+value 自動 disabled)\n // useRef gate → 只 mount 一次;user 後續手動刪光 → 不 re-add → 維持「全清 = empty CTA only」UX\n // Two states clearly separated:\n // (a) Initial mount with empty value → auto-add 1 empty row(讓 user 看到 row shape,不必先點 CTA)\n // (b) User explicitly deletes all → empty CTA only(無 row,respect user intent)\n const initialMountDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (initialMountDoneRef.current) return\n initialMountDoneRef.current = true\n if (filterableColumns.length === 0) return\n if (value.children.length > 0) return\n if (value.mode === 'flat') {\n onChange({ ...value, children: [newEmptyCondition()] } as FilterTreeFlat)\n } else {\n onChange({ ...value, children: [newEmptyGroup()] } as FilterTreeNested)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterableColumns.length])\n\n // Prefill from cell ⌄ menu「Filter by this」\n React.useEffect(() => {\n if (!prefilledColumnId) return\n const colInfo = filterableColumns.find((c) => c.id === prefilledColumnId)\n if (colInfo) {\n const cond: FilterCondition = {\n kind: 'cond',\n id: newId(),\n field: prefilledColumnId,\n op: getDefaultOperator(colInfo.type),\n value: '',\n // 2026-07-14 deep-audit fix:補 datePrecision(原漏 → datetime(includeTime=true)欄\n // prefill 掉到 undefined=day 精度忽略 ms;對齊初始 add / changeField 路徑的 datePrecisionOf)\n datePrecision: datePrecisionOf(colInfo),\n }\n if (value.mode === 'flat') {\n onChange({ ...value, children: [...value.children, cond] })\n } else {\n // nested mode:add 到第 1 個 group(若無則新建)\n if (value.children.length === 0) {\n onChange({ ...value, children: [{ ...newGroup(colInfo), children: [cond] }] })\n } else {\n const updatedGroups = value.children.map((g, i) =>\n i === 0 ? { ...g, children: [...g.children, cond] } : g\n )\n onChange({ ...value, children: updatedGroups })\n }\n }\n }\n onPrefillConsumed?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prefilledColumnId])\n\n // ── flat-mode mutators ──\n const flatTree = value.mode === 'flat' ? value : null\n const updateFlatCondition = (id: string, patch: Partial<FilterCondition>) => {\n if (!flatTree) return\n onChange({\n ...flatTree,\n children: flatTree.children.map((c) => (c.id === id ? { ...c, ...patch } : c)),\n })\n }\n const removeFlatCondition = (id: string) => {\n if (!flatTree) return\n onChange({ ...flatTree, children: flatTree.children.filter((c) => c.id !== id) })\n }\n const addFlatCondition = () => {\n if (!flatTree) return\n // K13 fix(2026-05-04):加篩選 → empty row(field 未選 → op+value disabled)\n // World-class:Notion / Coda / ClickUp 不 auto-select;對齊 initial mount canonical\n onChange({ ...flatTree, children: [...flatTree.children, newEmptyCondition()] })\n }\n const setFlatConjunction = (conj: Conjunction) => {\n if (!flatTree) return\n onChange({ ...flatTree, conjunction: conj })\n }\n\n // ── nested-mode mutators ──\n const nestedTree = value.mode === 'nested' ? value : null\n const updateGroup = (groupId: string, patch: Partial<FilterGroup>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) => (g.id === groupId ? { ...g, ...patch } : g)),\n })\n }\n const updateGroupCondition = (groupId: string, condId: string, patch: Partial<FilterCondition>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId\n ? { ...g, children: g.children.map((c) => (c.id === condId ? { ...c, ...patch } : c)) }\n : g\n ),\n })\n }\n const removeGroupCondition = (groupId: string, condId: string) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: g.children.filter((c) => c.id !== condId) } : g\n ),\n })\n }\n // K13 fix(2026-05-04):同 addFlatCondition,巢狀內加條件也 empty row\n const addConditionToGroup = (groupId: string) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: [...g.children, newEmptyCondition()] } : g\n ),\n })\n }\n const removeGroup = (groupId: string) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, children: nestedTree.children.filter((g) => g.id !== groupId) })\n }\n const addGroup = () => {\n if (!nestedTree) return\n // K13:加群組也用 empty group\n onChange({ ...nestedTree, children: [...nestedTree.children, newEmptyGroup()] })\n }\n const setRootConjunction = (conj: Conjunction) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, conjunction: conj })\n }\n\n return (\n // 寬度策略:desktop 680px;mobile 縮到 viewport 內留 32px 邊(避溢出 popover 切右半)。\n // 對齊 Notion / Airtable 的 advanced filter 在 mobile 走 full-width 邊處理。\n // **#8 fix(2026-05-04)**:popover width by mode(由 cell min-w 與 group nested chrome 反推)\n // flat:cell ConjunctionLabel(80) + gap-2(8) + FCG(field-min 160 + op-min 120 + value 200) +\n // gap-2(8) + trash(28) + 2×loose padding(32) = ~636 → 640px\n // nested:再加 group p-2 (16) + outer ConjunctionLabel (80) + outer gap (8) → ~740 → 760px\n // 對齊 Airtable / Notion / Linear filter row 視覺密度 @benchmark-unverified(non-OSS)\n // **K11 fix(2026-05-04)**:viewport-aware scroll chain invariant\n // parent PopoverContent 是 flex flex-col + max-h + overflow-hidden,\n // panel root 必 forward `flex flex-col h-full` 才能讓 SurfaceBody flex-1 min-h-0 overflow-y-auto 生效\n // 無此 forward → 中間 wrapper 斷鏈 → body 不 scroll(ProfileCard 因為自身設 max-h flex-col 才繞過)\n // 詳 overlay-surface.spec.md「viewport-aware scroll chain invariant」段\n // K11 v2 fix(2026-05-04):flex item 預設 min-h:auto 讓 content 撐 height,h-full 失效。\n // 必加 `min-h-0` 才能讓 panel 在 PopoverContent max-h cap 下正確 shrink + body scroll。\n <div ref={ref} className={cn(\n 'flex flex-col h-full min-h-0',\n value.mode === 'nested'\n ? 'w-[min(760px,calc(100vw-2rem))]'\n : 'w-[min(640px,calc(100vw-2rem))]',\n className,\n )}>\n {/* Popover 派輕量 chrome — slot 走 COMPACT_HEADER_SLOT(=21,衍生自 PopoverTitle text-body line-box),header 自然 ~45px */}\n <SurfaceHeader className={COMPACT_HEADER_SLOT}>\n <PopoverTitle className=\"flex-1\">篩選</PopoverTitle>\n {/* Refresh icon — 只在 value ≠ defaultValue 時顯示(對齊 sort modified-from-default UX)\n 含 ButtonDivider 對齊「欄位顯示」+「排序」chrome corner action canonical(2026-05-04) */}\n {defaultValue && !isFilterTreeEqual(value, defaultValue) && (\n <>\n <Button\n variant=\"text\" size=\"sm\" iconOnly startIcon={RotateCcw}\n aria-label=\"恢復預設\"\n onClick={() => onChange(defaultValue)}\n />\n {onClose && <ButtonDivider />}\n </>\n )}\n {onClose && (\n <PopoverClose asChild>\n <Button data-dismiss iconOnly dismiss size=\"sm\" startIcon={XIcon} aria-label=\"關閉\" onClick={onClose} />\n </PopoverClose>\n )}\n </SurfaceHeader>\n\n {/* Body — flat / nested 條件;空條件 → 直接顯 + 加篩選 CTA(對齊 Notion / Airtable / Linear inline 派,\n 無條件時不需要 Empty 元件大區塊,單顆 CTA 引導即可。SurfaceFooter 整層拔除,\n + Add filter / + 加篩選器 inline 緊貼最後一條 row,讓 user 感受到「條件」與「加入」屬同一語境)*/}\n <SurfaceBody className=\"flex flex-col gap-[var(--layout-space-tight)]\">\n {flatTree && flatTree.children.map((cond, idx) => (\n <FilterRow\n key={cond.id}\n index={idx}\n condition={cond}\n conjunction={flatTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeConjunction={setFlatConjunction}\n onChangeField={(v) => {\n const newCol = filterableColumns.find((c) => c.id === v)\n updateFlatCondition(cond.id, { field: v, op: getDefaultOperator(newCol?.type), value: '', datePrecision: datePrecisionOf(newCol) })\n }}\n onChangeOp={(v) => updateFlatCondition(cond.id, { op: v, value: '' })}\n onChangeValue={(v) => updateFlatCondition(cond.id, { value: v })}\n onRemove={() => removeFlatCondition(cond.id)}\n />\n ))}\n\n {nestedTree && nestedTree.children.map((group, gIdx) => (\n <GroupBlock\n key={group.id}\n index={gIdx}\n group={group}\n rootConjunction={nestedTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeRootConjunction={setRootConjunction}\n onChangeGroupConjunction={(c) => updateGroup(group.id, { conjunction: c })}\n onChangeCondition={(condId, patch) => updateGroupCondition(group.id, condId, patch)}\n onRemoveCondition={(condId) => removeGroupCondition(group.id, condId)}\n onAddCondition={() => addConditionToGroup(group.id)}\n onRemoveGroup={() => removeGroup(group.id)}\n />\n ))}\n\n {/* Inline CTA(2026-05-04 A1)— root-level「加篩選」用 tertiary(視覺輕量但有邊界,\n 符合 root-CTA 視覺重量);nested 內「加入巢狀篩選」走 text variant(更輕,在 group 內 inline)\n 不放 SurfaceFooter:條件與「加入」屬同一語義群,中間插 footer 切斷敘事 */}\n <div>\n <Button\n variant=\"tertiary\" size=\"sm\" startIcon={Plus}\n onClick={value.mode === 'flat' ? addFlatCondition : addGroup}\n >\n {value.mode === 'nested' ? '加入篩選器' : '加篩選'}\n </Button>\n </div>\n </SurfaceBody>\n </div>\n )\n}\n\n// Generic + ref forward 套 cast 的 idiom — 對齊 DataTable(同檔家)。\n// React.forwardRef 對 generic component 會丟掉 type param,改 cast 成 generic-preserving signature。\nexport const DataTableFilterPanel = React.forwardRef(DataTableFilterPanelInner) as <TData>(\n props: DataTableFilterPanelProps<TData> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n;(DataTableFilterPanel as { displayName?: string }).displayName = 'DataTableFilterPanel'\n"],"names":["XIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table-filter-panel.js","sources":["../../../src/components/DataTable/data-table-filter-panel.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\n// same-row-mixed-allow: header chrome corner buttons(close)跟 row inline actions(trash)不在同 row\nimport * as React from 'react'\nimport { Plus, X as XIcon, RotateCcw } from 'lucide-react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\nimport type { SelectOption } from '@/design-system/components/Select/select'\nimport { SurfaceHeader, SurfaceBody, COMPACT_HEADER_SLOT } from '@/design-system/patterns/overlay-surface/overlay-surface'\nimport { PopoverTitle, PopoverClose } from '@/design-system/components/Popover/popover'\nimport { ButtonDivider } from '@/design-system/components/Button/button-group'\nimport type { ColumnType } from './column-types'\nimport { getColumnId, getColumnLabel, getColumnMeta } from './lib/column-meta'\nimport {\n FilterRow,\n GroupBlock,\n getDefaultOperator,\n datePrecisionOf,\n type FilterColumn,\n} from './data-table-filter-group'\nimport {\n createEmptyFilterTree,\n isFilterTreeActive,\n isFilterTreeEqual,\n evaluateTree,\n dataTableFilterMatch,\n type Conjunction,\n type FilterCondition,\n type FilterGroup,\n type FilterTree,\n type FilterTreeFlat,\n type FilterTreeNested,\n} from './filter-tree'\nimport {\n DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS,\n resolveDataTableFilterPanelLabels,\n type DataTableFilterPanelLabels,\n} from './data-table-filter-labels'\n\n// Re-export public API from filter-tree(consumer 既有 import path 不變)\nexport {\n createEmptyFilterTree,\n isFilterTreeActive,\n evaluateTree,\n dataTableFilterMatch,\n}\nexport type { Conjunction, FilterCondition, FilterGroup, FilterTree, FilterTreeFlat, FilterTreeNested }\nexport { DATA_TABLE_FILTER_PANEL_DEFAULT_LABELS }\nexport type { DataTableFilterPanelLabels }\n\n/**\n * DataTableFilterPanel — ClickUp-style 進階篩選 panel\n *\n * 對齊 ClickUp / Airtable / Notion / Coda / Linear advanced-filter 派 —\n * parenthesized boolean expression builder。\n *\n * 兩種 mode 由 consumer 拍板:\n * - `flat`:root 下只能裝 condition,無 group\n * - `nested`:root 下裝 1+ group(灰底框),每個 group 內裝 1+ condition,**剛好 1 層**\n *\n * Source-of-truth:\n * - Operator definitions:`./filter-operators.ts` `OPERATOR_REGISTRY`(SSOT,禁 hardcode op 字串)\n * - Filter state:**FilterTree**(本檔自管;搭配 TanStack `globalFilter` 求值)\n * - Row / nested-group renderer:`./data-table-filter-group.tsx`;value picker:\n * `./data-table-filter-value-picker.tsx`(皆 @internal — 2026-07-14 file-size 拆檔,\n * 本檔只留 orchestration:columns 抽取 / FilterTree mutators / panel chrome)\n *\n * 詳:`./filter-operators.spec.md`\n */\n\n// ── Internal — id seed ──────────────────────────────────────────────────\n\nlet _idSeed = 0\nconst newId = () => `f${++_idSeed}-${Date.now().toString(36)}`\n\n// ── Helpers — column extraction + condition factories ──────────────────\n// (FilterColumn type + operator helpers 住 ./data-table-filter-group.tsx)\n\nfunction extractColumns<TData>(columns: ColumnDef<TData, any>[]): FilterColumn[] {\n const out: FilterColumn[] = []\n for (const col of columns) {\n const id = getColumnId(col)\n if (!id || id === '__select__') continue\n const meta = getColumnMeta(col)\n const type: ColumnType | undefined = meta?.type\n if (!type) continue\n if (meta?.filterable === false) continue\n out.push({\n id,\n label: getColumnLabel(col, id),\n type,\n options: meta?.options,\n people: meta?.people,\n includeTime: meta?.includeTime,\n })\n }\n return out\n}\n\nconst newCondition = (firstCol: FilterColumn | undefined): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: firstCol?.id ?? '',\n op: firstCol ? getDefaultOperator(firstCol.type) : '',\n value: '',\n datePrecision: datePrecisionOf(firstCol),\n})\n\n// **G fix(2026-05-04)**:initial-mount 用 — field 不預選,user 自選後 op/value 才 enable\n// Disabled state(field='')→ op + value 在 FilterRow 內走 `disabled={!hasField}` 自動連動\nconst newEmptyCondition = (): FilterCondition => ({\n kind: 'cond',\n id: newId(),\n field: '',\n op: '',\n value: '',\n})\n\nconst newGroup = (firstCol: FilterColumn | undefined): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or', // group 內 default OR(對齊 ref 圖)\n children: [newCondition(firstCol)],\n})\n\nconst newEmptyGroup = (): FilterGroup => ({\n kind: 'group',\n id: newId(),\n conjunction: 'or',\n children: [newEmptyCondition()],\n})\n\nconst countFilterConditions = (tree: FilterTree): number =>\n tree.mode === 'flat'\n ? tree.children.length\n : tree.children.reduce((total, group) => total + group.children.length, 0)\n\nconst normalizeMaxConditions = (maxConditions: number | undefined): number => {\n if (maxConditions === undefined || maxConditions === Number.POSITIVE_INFINITY) return Number.POSITIVE_INFINITY\n if (!Number.isFinite(maxConditions)) return 0\n return Math.max(0, Math.floor(maxConditions))\n}\n\n// ── Component Props ─────────────────────────────────────────────────────\n\nexport interface DataTableFilterPanelProps<TData> {\n // 2026-07-18 決策17:移除獨立 `mode` prop(單一真相源 = `value.mode` discriminant)——\n // 舊設計 mode + value.mode 兩來源型別允許矛盾(mode='nested' 配 flat value → CTA 錯文案 + 死操作);\n // 無外部消費者傳 mode(grep 0),全由 value.mode 推導。對齊 MUI X GridFilterModel / AG Grid 單一 model。\n /** 可被 filter 的 columns */\n columns: ColumnDef<TData, any>[]\n /** 當前 FilterTree(controlled) */\n value: FilterTree\n /** state 變更 callback */\n onChange: (next: FilterTree) => void\n /**\n * 管理員 set-as-default 的 baseline(refresh icon 顯示判定用)。\n * 當 `value` ≠ `defaultValue`(deep equal)→ panel header 顯示 refresh icon,\n * click → reset 回 defaultValue。對齊 sort 邏輯(相同 modified-from-default UX)。\n */\n defaultValue?: FilterTree\n /** Cell ⌄ menu「Filter by this」帶入的 column id(自動 add 一條 condition) */\n prefilledColumnId?: string\n onPrefillConsumed?: () => void\n /**\n * Condition leaf 上限(flat children 或 nested 所有 group.children 的總和)。\n * 預設不限。到上限後所有 add 路徑與 prefill 都 fail closed;controlled value\n * 已超過上限時保留原資料、不裁切,只停用後續新增。\n */\n maxConditions?: number\n /** Panel chrome/operator/value-picker labels. Nested maps are deep-merged with defaults. */\n labels?: Partial<DataTableFilterPanelLabels>\n onClose?: () => void\n className?: string\n}\n\n// ── Main Component ──────────────────────────────────────────────────────\n\n// 內部 fn — generic + ref 轉發。export 走 cast(對齊 DataTable 同 pattern)\nfunction DataTableFilterPanelInner<TData>({\n columns,\n value,\n onChange,\n defaultValue,\n prefilledColumnId,\n onPrefillConsumed,\n maxConditions,\n labels: labelsOverride,\n onClose,\n className,\n}: DataTableFilterPanelProps<TData>, ref: React.ForwardedRef<HTMLDivElement>): React.ReactElement {\n const filterableColumns = React.useMemo(() => extractColumns(columns), [columns])\n const fieldOptions: SelectOption[] = React.useMemo(\n () => filterableColumns.map((c) => ({ value: c.id, label: c.label })),\n [filterableColumns],\n )\n const labels = React.useMemo(\n () => resolveDataTableFilterPanelLabels(labelsOverride),\n [labelsOverride],\n )\n const conditionCount = countFilterConditions(value)\n const normalizedMaxConditions = normalizeMaxConditions(maxConditions)\n const canAddCondition = conditionCount < normalizedMaxConditions\n // K13 後 firstCol 不再被 add* 消費(改用 newEmpty*),這裡只留 prefill effect 用(已直接讀 prefilledColumnId)。\n\n // **G fix(2026-05-04 v2)**:initial-mount 預設 1 empty row(field 未選 → op+value 自動 disabled)\n // useRef gate → 只 mount 一次;user 後續手動刪光 → 不 re-add → 維持「全清 = empty CTA only」UX\n // Two states clearly separated:\n // (a) Initial mount with empty value → auto-add 1 empty row(讓 user 看到 row shape,不必先點 CTA)\n // (b) User explicitly deletes all → empty CTA only(無 row,respect user intent)\n const initialMountDoneRef = React.useRef(false)\n React.useEffect(() => {\n if (initialMountDoneRef.current) return\n initialMountDoneRef.current = true\n if (filterableColumns.length === 0) return\n if (value.children.length > 0) return\n if (!canAddCondition) return\n if (value.mode === 'flat') {\n onChange({ ...value, children: [newEmptyCondition()] } as FilterTreeFlat)\n } else {\n onChange({ ...value, children: [newEmptyGroup()] } as FilterTreeNested)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterableColumns.length])\n\n // Prefill from cell ⌄ menu「Filter by this」\n React.useEffect(() => {\n if (!prefilledColumnId) return\n const colInfo = filterableColumns.find((c) => c.id === prefilledColumnId)\n if (colInfo && canAddCondition) {\n const cond: FilterCondition = {\n kind: 'cond',\n id: newId(),\n field: prefilledColumnId,\n op: getDefaultOperator(colInfo.type),\n value: '',\n // 2026-07-14 deep-audit fix:補 datePrecision(原漏 → datetime(includeTime=true)欄\n // prefill 掉到 undefined=day 精度忽略 ms;對齊初始 add / changeField 路徑的 datePrecisionOf)\n datePrecision: datePrecisionOf(colInfo),\n }\n if (value.mode === 'flat') {\n onChange({ ...value, children: [...value.children, cond] })\n } else {\n // nested mode:add 到第 1 個 group(若無則新建)\n if (value.children.length === 0) {\n onChange({ ...value, children: [{ ...newGroup(colInfo), children: [cond] }] })\n } else {\n const updatedGroups = value.children.map((g, i) =>\n i === 0 ? { ...g, children: [...g.children, cond] } : g\n )\n onChange({ ...value, children: updatedGroups })\n }\n }\n }\n onPrefillConsumed?.()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [prefilledColumnId])\n\n // ── flat-mode mutators ──\n const flatTree = value.mode === 'flat' ? value : null\n const updateFlatCondition = (id: string, patch: Partial<FilterCondition>) => {\n if (!flatTree) return\n onChange({\n ...flatTree,\n children: flatTree.children.map((c) => (c.id === id ? { ...c, ...patch } : c)),\n })\n }\n const removeFlatCondition = (id: string) => {\n if (!flatTree) return\n onChange({ ...flatTree, children: flatTree.children.filter((c) => c.id !== id) })\n }\n const addFlatCondition = () => {\n if (!flatTree || !canAddCondition) return\n // K13 fix(2026-05-04):加篩選 → empty row(field 未選 → op+value disabled)\n // World-class:Notion / Coda / ClickUp 不 auto-select;對齊 initial mount canonical\n onChange({ ...flatTree, children: [...flatTree.children, newEmptyCondition()] })\n }\n const setFlatConjunction = (conj: Conjunction) => {\n if (!flatTree) return\n onChange({ ...flatTree, conjunction: conj })\n }\n\n // ── nested-mode mutators ──\n const nestedTree = value.mode === 'nested' ? value : null\n const updateGroup = (groupId: string, patch: Partial<FilterGroup>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) => (g.id === groupId ? { ...g, ...patch } : g)),\n })\n }\n const updateGroupCondition = (groupId: string, condId: string, patch: Partial<FilterCondition>) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId\n ? { ...g, children: g.children.map((c) => (c.id === condId ? { ...c, ...patch } : c)) }\n : g\n ),\n })\n }\n const removeGroupCondition = (groupId: string, condId: string) => {\n if (!nestedTree) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: g.children.filter((c) => c.id !== condId) } : g\n ),\n })\n }\n // K13 fix(2026-05-04):同 addFlatCondition,巢狀內加條件也 empty row\n const addConditionToGroup = (groupId: string) => {\n if (!nestedTree || !canAddCondition) return\n onChange({\n ...nestedTree,\n children: nestedTree.children.map((g) =>\n g.id === groupId ? { ...g, children: [...g.children, newEmptyCondition()] } : g\n ),\n })\n }\n const removeGroup = (groupId: string) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, children: nestedTree.children.filter((g) => g.id !== groupId) })\n }\n const addGroup = () => {\n if (!nestedTree || !canAddCondition) return\n // K13:加群組也用 empty group\n onChange({ ...nestedTree, children: [...nestedTree.children, newEmptyGroup()] })\n }\n const setRootConjunction = (conj: Conjunction) => {\n if (!nestedTree) return\n onChange({ ...nestedTree, conjunction: conj })\n }\n\n return (\n // 寬度策略:desktop 680px;mobile 縮到 viewport 內留 32px 邊(避溢出 popover 切右半)。\n // 對齊 Notion / Airtable 的 advanced filter 在 mobile 走 full-width 邊處理。\n // **#8 fix(2026-05-04)**:popover width by mode(由 cell min-w 與 group nested chrome 反推)\n // flat:cell ConjunctionLabel(80) + gap-2(8) + FCG(field-min 160 + op-min 120 + value 200) +\n // gap-2(8) + trash(28) + 2×loose padding(32) = ~636 → 640px\n // nested:再加 group p-2 (16) + outer ConjunctionLabel (80) + outer gap (8) → ~740 → 760px\n // 對齊 Airtable / Notion / Linear filter row 視覺密度 @benchmark-unverified(non-OSS)\n // **K11 fix(2026-05-04)**:viewport-aware scroll chain invariant\n // parent PopoverContent 是 flex flex-col + max-h + overflow-hidden,\n // panel root 必 forward `flex flex-col h-full` 才能讓 SurfaceBody flex-1 min-h-0 overflow-y-auto 生效\n // 無此 forward → 中間 wrapper 斷鏈 → body 不 scroll(ProfileCard 因為自身設 max-h flex-col 才繞過)\n // 詳 overlay-surface.spec.md「viewport-aware scroll chain invariant」段\n // K11 v2 fix(2026-05-04):flex item 預設 min-h:auto 讓 content 撐 height,h-full 失效。\n // 必加 `min-h-0` 才能讓 panel 在 PopoverContent max-h cap 下正確 shrink + body scroll。\n <div ref={ref} className={cn(\n 'flex flex-col h-full min-h-0',\n value.mode === 'nested'\n ? 'w-[min(760px,calc(100vw-2rem))]'\n : 'w-[min(640px,calc(100vw-2rem))]',\n className,\n )}>\n {/* Popover 派輕量 chrome — slot 走 COMPACT_HEADER_SLOT(=21,衍生自 PopoverTitle text-body line-box),header 自然 ~45px */}\n <SurfaceHeader className={COMPACT_HEADER_SLOT}>\n <PopoverTitle className=\"flex-1\">{labels.title}</PopoverTitle>\n {/* Refresh icon — 只在 value ≠ defaultValue 時顯示(對齊 sort modified-from-default UX)\n 含 ButtonDivider 對齊「欄位顯示」+「排序」chrome corner action canonical(2026-05-04) */}\n {defaultValue && !isFilterTreeEqual(value, defaultValue) && (\n <>\n <Button\n variant=\"text\" size=\"sm\" iconOnly startIcon={RotateCcw}\n aria-label={labels.resetToDefault}\n onClick={() => onChange(defaultValue)}\n />\n {onClose && <ButtonDivider />}\n </>\n )}\n {onClose && (\n <PopoverClose asChild>\n <Button data-dismiss iconOnly dismiss size=\"sm\" startIcon={XIcon} aria-label={labels.close} onClick={onClose} />\n </PopoverClose>\n )}\n </SurfaceHeader>\n\n {/* Body — flat / nested 條件;空條件 → 直接顯 + 加篩選 CTA(對齊 Notion / Airtable / Linear inline 派,\n 無條件時不需要 Empty 元件大區塊,單顆 CTA 引導即可。SurfaceFooter 整層拔除,\n + Add filter / + 加篩選器 inline 緊貼最後一條 row,讓 user 感受到「條件」與「加入」屬同一語境)*/}\n <SurfaceBody className=\"flex flex-col gap-[var(--layout-space-tight)]\">\n {flatTree && flatTree.children.map((cond, idx) => (\n <FilterRow\n key={cond.id}\n index={idx}\n condition={cond}\n conjunction={flatTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeConjunction={setFlatConjunction}\n onChangeField={(v) => {\n const newCol = filterableColumns.find((c) => c.id === v)\n updateFlatCondition(cond.id, { field: v, op: getDefaultOperator(newCol?.type), value: '', datePrecision: datePrecisionOf(newCol) })\n }}\n onChangeOp={(v) => updateFlatCondition(cond.id, { op: v, value: '' })}\n onChangeValue={(v) => updateFlatCondition(cond.id, { value: v })}\n onRemove={() => removeFlatCondition(cond.id)}\n labels={labels}\n />\n ))}\n\n {nestedTree && nestedTree.children.map((group, gIdx) => (\n <GroupBlock\n key={group.id}\n index={gIdx}\n group={group}\n rootConjunction={nestedTree.conjunction}\n filterableColumns={filterableColumns}\n fieldOptions={fieldOptions}\n onChangeRootConjunction={setRootConjunction}\n onChangeGroupConjunction={(c) => updateGroup(group.id, { conjunction: c })}\n onChangeCondition={(condId, patch) => updateGroupCondition(group.id, condId, patch)}\n onRemoveCondition={(condId) => removeGroupCondition(group.id, condId)}\n onAddCondition={() => addConditionToGroup(group.id)}\n onRemoveGroup={() => removeGroup(group.id)}\n canAddCondition={canAddCondition}\n labels={labels}\n />\n ))}\n\n {/* Inline CTA(2026-05-04 A1)— root-level「加篩選」用 tertiary(視覺輕量但有邊界,\n 符合 root-CTA 視覺重量);nested 內「加入巢狀篩選」走 text variant(更輕,在 group 內 inline)\n 不放 SurfaceFooter:條件與「加入」屬同一語義群,中間插 footer 切斷敘事 */}\n <div>\n <Button\n variant=\"tertiary\" size=\"sm\" startIcon={Plus}\n onClick={value.mode === 'flat' ? addFlatCondition : addGroup}\n disabled={!canAddCondition}\n >\n {value.mode === 'nested' ? labels.addGroup : labels.addFilter}\n </Button>\n </div>\n </SurfaceBody>\n </div>\n )\n}\n\n// Generic + ref forward 套 cast 的 idiom — 對齊 DataTable(同檔家)。\n// React.forwardRef 對 generic component 會丟掉 type param,改 cast 成 generic-preserving signature。\nexport const DataTableFilterPanel = React.forwardRef(DataTableFilterPanelInner) as <TData>(\n props: DataTableFilterPanelProps<TData> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n;(DataTableFilterPanel as { displayName?: string }).displayName = 'DataTableFilterPanel'\n"],"names":["XIcon"],"mappings":";;;;;;;;;;;;;;AAwEA,IAAI,UAAU;AACd,MAAM,QAAQ,MAAM,IAAI,EAAE,OAAO,IAAI,KAAK,IAAA,EAAM,SAAS,EAAE,CAAC;AAK5D,SAAS,eAAsB,SAAkD;AAC/E,QAAM,MAAsB,CAAA;AAC5B,aAAW,OAAO,SAAS;AACzB,UAAM,KAAK,YAAY,GAAG;AAC1B,QAAI,CAAC,MAAM,OAAO,aAAc;AAChC,UAAM,OAAO,cAAc,GAAG;AAC9B,UAAM,OAA+B,6BAAM;AAC3C,QAAI,CAAC,KAAM;AACX,SAAI,6BAAM,gBAAe,MAAO;AAChC,QAAI,KAAK;AAAA,MACP;AAAA,MACA,OAAO,eAAe,KAAK,EAAE;AAAA,MAC7B;AAAA,MACA,SAAS,6BAAM;AAAA,MACf,QAAQ,6BAAM;AAAA,MACd,aAAa,6BAAM;AAAA,IAAA,CACpB;AAAA,EACH;AACA,SAAO;AACT;AAEA,MAAM,eAAe,CAAC,cAAyD;AAAA,EAC7E,MAAM;AAAA,EACN,IAAI,MAAA;AAAA,EACJ,QAAO,qCAAU,OAAM;AAAA,EACvB,IAAI,WAAW,mBAAmB,SAAS,IAAI,IAAI;AAAA,EACnD,OAAO;AAAA,EACP,eAAe,gBAAgB,QAAQ;AACzC;AAIA,MAAM,oBAAoB,OAAwB;AAAA,EAChD,MAAM;AAAA,EACN,IAAI,MAAA;AAAA,EACJ,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AACT;AAEA,MAAM,WAAW,CAAC,cAAqD;AAAA,EACrE,MAAM;AAAA,EACN,IAAI,MAAA;AAAA,EACJ,aAAa;AAAA;AAAA,EACb,UAAU,CAAC,aAAa,QAAQ,CAAC;AACnC;AAEA,MAAM,gBAAgB,OAAoB;AAAA,EACxC,MAAM;AAAA,EACN,IAAI,MAAA;AAAA,EACJ,aAAa;AAAA,EACb,UAAU,CAAC,kBAAA,CAAmB;AAChC;AAEA,MAAM,wBAAwB,CAAC,SAC7B,KAAK,SAAS,SACV,KAAK,SAAS,SACd,KAAK,SAAS,OAAO,CAAC,OAAO,UAAU,QAAQ,MAAM,SAAS,QAAQ,CAAC;AAE7E,MAAM,yBAAyB,CAAC,kBAA8C;AAC5E,MAAI,kBAAkB,UAAa,kBAAkB,OAAO,0BAA0B,OAAO;AAC7F,MAAI,CAAC,OAAO,SAAS,aAAa,EAAG,QAAO;AAC5C,SAAO,KAAK,IAAI,GAAG,KAAK,MAAM,aAAa,CAAC;AAC9C;AAsCA,SAAS,0BAAiC;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA;AACF,GAAqC,KAA6D;AAChG,QAAM,oBAAoB,MAAM,QAAQ,MAAM,eAAe,OAAO,GAAG,CAAC,OAAO,CAAC;AAChF,QAAM,eAA+B,MAAM;AAAA,IACzC,MAAM,kBAAkB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,MAAA,EAAQ;AAAA,IACpE,CAAC,iBAAiB;AAAA,EAAA;AAEpB,QAAM,SAAS,MAAM;AAAA,IACnB,MAAM,kCAAkC,cAAc;AAAA,IACtD,CAAC,cAAc;AAAA,EAAA;AAEjB,QAAM,iBAAiB,sBAAsB,KAAK;AAClD,QAAM,0BAA0B,uBAAuB,aAAa;AACpE,QAAM,kBAAkB,iBAAiB;AAQzC,QAAM,sBAAsB,MAAM,OAAO,KAAK;AAC9C,QAAM,UAAU,MAAM;AACpB,QAAI,oBAAoB,QAAS;AACjC,wBAAoB,UAAU;AAC9B,QAAI,kBAAkB,WAAW,EAAG;AACpC,QAAI,MAAM,SAAS,SAAS,EAAG;AAC/B,QAAI,CAAC,gBAAiB;AACtB,QAAI,MAAM,SAAS,QAAQ;AACzB,eAAS,EAAE,GAAG,OAAO,UAAU,CAAC,kBAAA,CAAmB,GAAqB;AAAA,IAC1E,OAAO;AACL,eAAS,EAAE,GAAG,OAAO,UAAU,CAAC,cAAA,CAAe,GAAuB;AAAA,IACxE;AAAA,EAEF,GAAG,CAAC,kBAAkB,MAAM,CAAC;AAG7B,QAAM,UAAU,MAAM;AACpB,QAAI,CAAC,kBAAmB;AACxB,UAAM,UAAU,kBAAkB,KAAK,CAAC,MAAM,EAAE,OAAO,iBAAiB;AACxE,QAAI,WAAW,iBAAiB;AAC9B,YAAM,OAAwB;AAAA,QAC5B,MAAM;AAAA,QACN,IAAI,MAAA;AAAA,QACJ,OAAO;AAAA,QACP,IAAI,mBAAmB,QAAQ,IAAI;AAAA,QACnC,OAAO;AAAA;AAAA;AAAA,QAGP,eAAe,gBAAgB,OAAO;AAAA,MAAA;AAExC,UAAI,MAAM,SAAS,QAAQ;AACzB,iBAAS,EAAE,GAAG,OAAO,UAAU,CAAC,GAAG,MAAM,UAAU,IAAI,GAAG;AAAA,MAC5D,OAAO;AAEL,YAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,mBAAS,EAAE,GAAG,OAAO,UAAU,CAAC,EAAE,GAAG,SAAS,OAAO,GAAG,UAAU,CAAC,IAAI,EAAA,CAAG,GAAG;AAAA,QAC/E,OAAO;AACL,gBAAM,gBAAgB,MAAM,SAAS;AAAA,YAAI,CAAC,GAAG,MAC3C,MAAM,IAAI,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,UAAU,IAAI,MAAM;AAAA,UAAA;AAExD,mBAAS,EAAE,GAAG,OAAO,UAAU,eAAe;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AACA;AAAA,EAEF,GAAG,CAAC,iBAAiB,CAAC;AAGtB,QAAM,WAAW,MAAM,SAAS,SAAS,QAAQ;AACjD,QAAM,sBAAsB,CAAC,IAAY,UAAoC;AAC3E,QAAI,CAAC,SAAU;AACf,aAAS;AAAA,MACP,GAAG;AAAA,MACH,UAAU,SAAS,SAAS,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,GAAG,MAAA,IAAU,CAAE;AAAA,IAAA,CAC9E;AAAA,EACH;AACA,QAAM,sBAAsB,CAAC,OAAe;AAC1C,QAAI,CAAC,SAAU;AACf,aAAS,EAAE,GAAG,UAAU,UAAU,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG;AAAA,EAClF;AACA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,YAAY,CAAC,gBAAiB;AAGnC,aAAS,EAAE,GAAG,UAAU,UAAU,CAAC,GAAG,SAAS,UAAU,kBAAA,CAAmB,GAAG;AAAA,EACjF;AACA,QAAM,qBAAqB,CAAC,SAAsB;AAChD,QAAI,CAAC,SAAU;AACf,aAAS,EAAE,GAAG,UAAU,aAAa,MAAM;AAAA,EAC7C;AAGA,QAAM,aAAa,MAAM,SAAS,WAAW,QAAQ;AACrD,QAAM,cAAc,CAAC,SAAiB,UAAgC;AACpE,QAAI,CAAC,WAAY;AACjB,aAAS;AAAA,MACP,GAAG;AAAA,MACH,UAAU,WAAW,SAAS,IAAI,CAAC,MAAO,EAAE,OAAO,UAAU,EAAE,GAAG,GAAG,GAAG,MAAA,IAAU,CAAE;AAAA,IAAA,CACrF;AAAA,EACH;AACA,QAAM,uBAAuB,CAAC,SAAiB,QAAgB,UAAoC;AACjG,QAAI,CAAC,WAAY;AACjB,aAAS;AAAA,MACP,GAAG;AAAA,MACH,UAAU,WAAW,SAAS;AAAA,QAAI,CAAC,MACjC,EAAE,OAAO,UACL,EAAE,GAAG,GAAG,UAAU,EAAE,SAAS,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,GAAG,MAAA,IAAU,CAAE,MAClF;AAAA,MAAA;AAAA,IACN,CACD;AAAA,EACH;AACA,QAAM,uBAAuB,CAAC,SAAiB,WAAmB;AAChE,QAAI,CAAC,WAAY;AACjB,aAAS;AAAA,MACP,GAAG;AAAA,MACH,UAAU,WAAW,SAAS;AAAA,QAAI,CAAC,MACjC,EAAE,OAAO,UAAU,EAAE,GAAG,GAAG,UAAU,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,MAAM;AAAA,MAAA;AAAA,IACrF,CACD;AAAA,EACH;AAEA,QAAM,sBAAsB,CAAC,YAAoB;AAC/C,QAAI,CAAC,cAAc,CAAC,gBAAiB;AACrC,aAAS;AAAA,MACP,GAAG;AAAA,MACH,UAAU,WAAW,SAAS;AAAA,QAAI,CAAC,MACjC,EAAE,OAAO,UAAU,EAAE,GAAG,GAAG,UAAU,CAAC,GAAG,EAAE,UAAU,kBAAA,CAAmB,MAAM;AAAA,MAAA;AAAA,IAChF,CACD;AAAA,EACH;AACA,QAAM,cAAc,CAAC,YAAoB;AACvC,QAAI,CAAC,WAAY;AACjB,aAAS,EAAE,GAAG,YAAY,UAAU,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,OAAO,GAAG;AAAA,EAC3F;AACA,QAAM,WAAW,MAAM;AACrB,QAAI,CAAC,cAAc,CAAC,gBAAiB;AAErC,aAAS,EAAE,GAAG,YAAY,UAAU,CAAC,GAAG,WAAW,UAAU,cAAA,CAAe,GAAG;AAAA,EACjF;AACA,QAAM,qBAAqB,CAAC,SAAsB;AAChD,QAAI,CAAC,WAAY;AACjB,aAAS,EAAE,GAAG,YAAY,aAAa,MAAM;AAAA,EAC/C;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAeE,qBAAC,OAAA,EAAI,KAAU,WAAW;AAAA,MACxB;AAAA,MACA,MAAM,SAAS,WACX,oCACA;AAAA,MACJ;AAAA,IAAA,GAGA,UAAA;AAAA,MAAA,qBAAC,eAAA,EAAc,WAAW,qBACxB,UAAA;AAAA,QAAA,oBAAC,cAAA,EAAa,WAAU,UAAU,UAAA,OAAO,OAAM;AAAA,QAG9C,gBAAgB,CAAC,kBAAkB,OAAO,YAAY,KACrD,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cAAO,MAAK;AAAA,cAAK,UAAQ;AAAA,cAAC,WAAW;AAAA,cAC7C,cAAY,OAAO;AAAA,cACnB,SAAS,MAAM,SAAS,YAAY;AAAA,YAAA;AAAA,UAAA;AAAA,UAErC,+BAAY,eAAA,CAAA,CAAc;AAAA,QAAA,GAC7B;AAAA,QAED,+BACE,cAAA,EAAa,SAAO,MACnB,UAAA,oBAAC,QAAA,EAAO,gBAAY,MAAC,UAAQ,MAAC,SAAO,MAAC,MAAK,MAAK,WAAWA,GAAO,cAAY,OAAO,OAAO,SAAS,QAAA,CAAS,EAAA,CAChH;AAAA,MAAA,GAEJ;AAAA,MAKA,qBAAC,aAAA,EAAY,WAAU,iDACpB,UAAA;AAAA,QAAA,YAAY,SAAS,SAAS,IAAI,CAAC,MAAM,QACxC;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO;AAAA,YACP,WAAW;AAAA,YACX,aAAa,SAAS;AAAA,YACtB;AAAA,YACA;AAAA,YACA,qBAAqB;AAAA,YACrB,eAAe,CAAC,MAAM;AACpB,oBAAM,SAAS,kBAAkB,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;AACvD,kCAAoB,KAAK,IAAI,EAAE,OAAO,GAAG,IAAI,mBAAmB,iCAAQ,IAAI,GAAG,OAAO,IAAI,eAAe,gBAAgB,MAAM,GAAG;AAAA,YACpI;AAAA,YACA,YAAY,CAAC,MAAM,oBAAoB,KAAK,IAAI,EAAE,IAAI,GAAG,OAAO,IAAI;AAAA,YACpE,eAAe,CAAC,MAAM,oBAAoB,KAAK,IAAI,EAAE,OAAO,GAAG;AAAA,YAC/D,UAAU,MAAM,oBAAoB,KAAK,EAAE;AAAA,YAC3C;AAAA,UAAA;AAAA,UAdK,KAAK;AAAA,QAAA,CAgBb;AAAA,QAEA,cAAc,WAAW,SAAS,IAAI,CAAC,OAAO,SAC7C;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO;AAAA,YACP;AAAA,YACA,iBAAiB,WAAW;AAAA,YAC5B;AAAA,YACA;AAAA,YACA,yBAAyB;AAAA,YACzB,0BAA0B,CAAC,MAAM,YAAY,MAAM,IAAI,EAAE,aAAa,GAAG;AAAA,YACzE,mBAAmB,CAAC,QAAQ,UAAU,qBAAqB,MAAM,IAAI,QAAQ,KAAK;AAAA,YAClF,mBAAmB,CAAC,WAAW,qBAAqB,MAAM,IAAI,MAAM;AAAA,YACpE,gBAAgB,MAAM,oBAAoB,MAAM,EAAE;AAAA,YAClD,eAAe,MAAM,YAAY,MAAM,EAAE;AAAA,YACzC;AAAA,YACA;AAAA,UAAA;AAAA,UAbK,MAAM;AAAA,QAAA,CAed;AAAA,4BAKA,OAAA,EACC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YAAW,MAAK;AAAA,YAAK,WAAW;AAAA,YACxC,SAAS,MAAM,SAAS,SAAS,mBAAmB;AAAA,YACpD,UAAU,CAAC;AAAA,YAEV,UAAA,MAAM,SAAS,WAAW,OAAO,WAAW,OAAO;AAAA,UAAA;AAAA,QAAA,EACtD,CACF;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA;AAEJ;AAIO,MAAM,uBAAuB,MAAM,WAAW,yBAAyB;AAG5E,qBAAkD,cAAc;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ValueShape } from './filter-operators';
|
|
2
|
+
import type { DataTableFilterPanelLabels } from './data-table-filter-labels';
|
|
2
3
|
export interface FilterValuePickerColInfo {
|
|
3
4
|
id: string;
|
|
4
5
|
label: string;
|
|
@@ -21,9 +22,11 @@ export interface FilterValuePickerProps {
|
|
|
21
22
|
disabled?: boolean;
|
|
22
23
|
/** 用 column.label 組「{label} 篩選值」(panel 每 row 不顯式 label,a11y 必填) */
|
|
23
24
|
ariaLabel?: string;
|
|
25
|
+
/** Resolved panel labels; placeholders and relative-date labels share one SSOT. */
|
|
26
|
+
labels: DataTableFilterPanelLabels;
|
|
24
27
|
/** Forward 給內部 Field control 的 className(2026-05-04 #2 fix)
|
|
25
28
|
* 避免外層包 wrapper div 破壞 FieldControlGroup CSS variants(rounded radii / margin overlap) */
|
|
26
29
|
className?: string;
|
|
27
30
|
}
|
|
28
|
-
export declare function FilterValuePicker({ shape, value, onChange, colInfo, disabled, ariaLabel, className, }: FilterValuePickerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
31
|
+
export declare function FilterValuePicker({ shape, value, onChange, colInfo, disabled, ariaLabel, labels, className, }: FilterValuePickerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
29
32
|
//# sourceMappingURL=data-table-filter-value-picker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-filter-value-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-value-picker.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"data-table-filter-value-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table-filter-value-picker.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAS5E,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,4FAA4F;IAC5F,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC3E;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9B,OAAO,CAAC,EAAE,wBAAwB,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,MAAM,EAAE,0BAA0B,CAAA;IAClC;8FAC0F;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE,sBAAsB,kDA2LxB"}
|
|
@@ -13,11 +13,12 @@ function FilterValuePicker({
|
|
|
13
13
|
colInfo,
|
|
14
14
|
disabled,
|
|
15
15
|
ariaLabel,
|
|
16
|
+
labels,
|
|
16
17
|
className
|
|
17
18
|
}) {
|
|
18
19
|
if (!shape || disabled) {
|
|
19
20
|
return /* @__PURE__ */ jsx(Input, { size: "sm", value: "", onChange: () => {
|
|
20
|
-
}, placeholder:
|
|
21
|
+
}, placeholder: labels.valuePlaceholder, disabled: true, "aria-label": ariaLabel, className });
|
|
21
22
|
}
|
|
22
23
|
switch (shape) {
|
|
23
24
|
case "none":
|
|
@@ -29,7 +30,7 @@ function FilterValuePicker({
|
|
|
29
30
|
size: "sm",
|
|
30
31
|
value: String(value ?? ""),
|
|
31
32
|
onChange: (e) => onChange(e.target.value),
|
|
32
|
-
placeholder:
|
|
33
|
+
placeholder: labels.valuePlaceholder,
|
|
33
34
|
"aria-label": ariaLabel,
|
|
34
35
|
className
|
|
35
36
|
}
|
|
@@ -41,7 +42,7 @@ function FilterValuePicker({
|
|
|
41
42
|
size: "sm",
|
|
42
43
|
value: typeof value === "number" ? value : null,
|
|
43
44
|
onChange: (v) => onChange(v ?? ""),
|
|
44
|
-
placeholder:
|
|
45
|
+
placeholder: labels.numberPlaceholder,
|
|
45
46
|
"aria-label": ariaLabel,
|
|
46
47
|
className
|
|
47
48
|
}
|
|
@@ -71,18 +72,22 @@ function FilterValuePicker({
|
|
|
71
72
|
case "date_relative": {
|
|
72
73
|
const opts = DATE_RELATIVE_OPTIONS.map((o) => ({
|
|
73
74
|
value: o.value,
|
|
74
|
-
label: o.label,
|
|
75
|
+
label: labels.relativeDateOptionLabels[o.value] ?? o.label,
|
|
75
76
|
group: o.group
|
|
76
77
|
}));
|
|
78
|
+
const groups = DATE_RELATIVE_GROUPS.map((group) => ({
|
|
79
|
+
key: group.key,
|
|
80
|
+
label: labels.relativeDateGroupLabels[group.key] ?? group.label
|
|
81
|
+
}));
|
|
77
82
|
return /* @__PURE__ */ jsx(
|
|
78
83
|
Select,
|
|
79
84
|
{
|
|
80
85
|
size: "sm",
|
|
81
86
|
options: opts,
|
|
82
|
-
groups
|
|
87
|
+
groups,
|
|
83
88
|
value: String(value ?? ""),
|
|
84
89
|
onChange: (v) => onChange(v),
|
|
85
|
-
placeholder:
|
|
90
|
+
placeholder: labels.relativeDatePlaceholder,
|
|
86
91
|
"aria-label": ariaLabel,
|
|
87
92
|
className
|
|
88
93
|
}
|
|
@@ -100,7 +105,7 @@ function FilterValuePicker({
|
|
|
100
105
|
options: opts,
|
|
101
106
|
value: String(value ?? ""),
|
|
102
107
|
onChange: (v) => onChange(v),
|
|
103
|
-
placeholder:
|
|
108
|
+
placeholder: labels.singleSelectPlaceholder,
|
|
104
109
|
"aria-label": ariaLabel,
|
|
105
110
|
className
|
|
106
111
|
}
|
|
@@ -119,7 +124,8 @@ function FilterValuePicker({
|
|
|
119
124
|
options: opts,
|
|
120
125
|
value: arr,
|
|
121
126
|
onChange: (v) => onChange(v),
|
|
122
|
-
placeholder:
|
|
127
|
+
placeholder: labels.multiSelectPlaceholder,
|
|
128
|
+
emptyText: labels.multiSelectEmptyText,
|
|
123
129
|
"aria-label": ariaLabel,
|
|
124
130
|
className
|
|
125
131
|
}
|
|
@@ -162,6 +168,10 @@ function FilterValuePicker({
|
|
|
162
168
|
value: v ?? null,
|
|
163
169
|
people: (colInfo == null ? void 0 : colInfo.people) ?? [],
|
|
164
170
|
onChange: (next) => onChange(next[0] ?? null),
|
|
171
|
+
placeholder: labels.peoplePlaceholder,
|
|
172
|
+
searchPlaceholder: labels.peopleSearchPlaceholder,
|
|
173
|
+
searchAriaLabel: labels.peopleSearchAriaLabel,
|
|
174
|
+
emptyText: labels.peopleEmptyText,
|
|
165
175
|
"aria-label": ariaLabel,
|
|
166
176
|
className
|
|
167
177
|
}
|
|
@@ -176,6 +186,10 @@ function FilterValuePicker({
|
|
|
176
186
|
value: v,
|
|
177
187
|
people: (colInfo == null ? void 0 : colInfo.people) ?? [],
|
|
178
188
|
onChange: (next) => onChange(next),
|
|
189
|
+
placeholder: labels.peoplePlaceholder,
|
|
190
|
+
searchPlaceholder: labels.peopleSearchPlaceholder,
|
|
191
|
+
searchAriaLabel: labels.peopleSearchAriaLabel,
|
|
192
|
+
emptyText: labels.peopleEmptyText,
|
|
179
193
|
"aria-label": ariaLabel,
|
|
180
194
|
className
|
|
181
195
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table-filter-value-picker.js","sources":["../../../src/components/DataTable/data-table-filter-value-picker.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved(2026-07-14 自 data-table-filter-panel.tsx 拆檔搬移,原檔級 escape 隨段落帶入)。\n// @internal — DS-internal 單元(FilterValuePicker value-picker switcher,只被\n// data-table-filter-group.tsx FilterRow 消費);不隨 index.ts re-export 進 npm public surface。\n// ────────────────────────────── 消費的 SSOT ──────────────────────────────\n// - Field controls(Family 4,統一 size=\"sm\"):Input / NumberInput / Select / Combobox /\n// DatePicker + DatePickerRange(showTime)/ PeoplePicker — 按 ValueShape dispatch\n// (ValueShape ↔ picker 對照 canonical:./data-table.spec.md「三、Operator × ValueShape SSOT」)\n// - className 直接 forward 給 inner Field control(不另開 wrapper div)—\n// field-control-group.spec.md「forward className」canonical(2026-05-04 #2 fix)\n// - Operator / ValueShape SSOT:./filter-operators.ts(DATE_RELATIVE_OPTIONS / DATE_RELATIVE_GROUPS)\n// - Person pool:PeoplePicker PersonValue(對齊 cell-registry meta.people SSOT)\n// 設計規則:./filter-operators.spec.md「ValueShape canonical」+ ./data-table.spec.md「進階篩選」段\n\nimport { Select, type SelectOption } from '@/design-system/components/Select/select'\nimport { Combobox } from '@/design-system/components/Combobox/combobox'\nimport { Input } from '@/design-system/components/Input/input'\nimport { NumberInput } from '@/design-system/components/NumberInput/number-input'\nimport { DatePicker, DatePickerRange } from '@/design-system/components/DatePicker/date-picker'\nimport { PeoplePicker } from '@/design-system/components/PeoplePicker/people-picker'\nimport type { PersonValue } from '@/design-system/components/PeoplePicker/person-display'\nimport {\n DATE_RELATIVE_OPTIONS,\n DATE_RELATIVE_GROUPS,\n type ValueShape,\n} from './filter-operators'\n\n// ── FilterValuePicker(value-picker switcher per ValueShape)────────────────\n//\n// 2026-05-03 M21 retract:本 helper 原獨立檔 filter-value-picker.tsx(187 行 / 1 consumer),\n// claim「未來 inline filter UI 共用」= premature abstraction → inline 回 panel。\n// 2026-07-14 拆檔 refactor:panel 822 行過 800 hard cap(file-size escalation)→ 重新抽出為\n// @internal 私有模組(非 public API 抽象,與 M21 不衝突;consumer 仍只見 DataTableFilterPanel)。\n\nexport interface FilterValuePickerColInfo {\n id: string\n label: string\n options?: Array<{ value: string; label: string }>\n /** Person pool — person/multiPerson filter picker 用(2026-05-07 升級,SSOT 對齊 cell-registry) */\n people?: Array<{ name: string; avatarUrl?: string; description?: string }>\n}\n\nexport interface FilterValuePickerProps {\n shape: ValueShape | null\n value: unknown\n onChange: (v: unknown) => void\n colInfo?: FilterValuePickerColInfo\n disabled?: boolean\n /** 用 column.label 組「{label} 篩選值」(panel 每 row 不顯式 label,a11y 必填) */\n ariaLabel?: string\n /** Forward 給內部 Field control 的 className(2026-05-04 #2 fix)\n * 避免外層包 wrapper div 破壞 FieldControlGroup CSS variants(rounded radii / margin overlap) */\n className?: string\n}\n\nexport function FilterValuePicker({\n shape,\n value,\n onChange,\n colInfo,\n disabled,\n ariaLabel,\n className,\n}: FilterValuePickerProps) {\n if (!shape || disabled) {\n return <Input size=\"sm\" value=\"\" onChange={() => {}} placeholder=\"輸入值…\" disabled aria-label={ariaLabel} className={className} />\n }\n\n switch (shape) {\n case 'none':\n return null\n\n case 'text':\n return (\n <Input\n size=\"sm\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"輸入值…\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'number':\n return (\n <NumberInput\n size=\"sm\"\n value={typeof value === 'number' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n placeholder=\"輸入數字…\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_single':\n return (\n <DatePicker\n size=\"sm\"\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_range':\n return (\n <DatePickerRange\n size=\"sm\"\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_relative': {\n // 群組分類:Past / Current / Future(對齊 Linear / Notion idiom),走 Select.groups → SelectMenu\n const opts: SelectOption[] = DATE_RELATIVE_OPTIONS.map((o) => ({\n value: o.value,\n label: o.label,\n group: o.group,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n groups={DATE_RELATIVE_GROUPS as unknown as Array<{ key: string; label: string }>}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder=\"選擇相對日期\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_single': {\n const opts: SelectOption[] = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder=\"選擇值\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_multi': {\n const opts = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n const arr = Array.isArray(value) ? (value as string[]) : []\n return (\n <Combobox\n size=\"sm\"\n options={opts}\n value={arr}\n onChange={(v) => onChange(v)}\n placeholder=\"選擇值…\"\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'datetime_single':\n return (\n <DatePicker\n size=\"sm\"\n showTime\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'datetime_range':\n return (\n <DatePickerRange\n size=\"sm\"\n showTime\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n // person_single / person_multi — 走 PeoplePicker(2026-05-07 升級,對齊 cell-registry SSOT)。\n // colInfo.people 來自 column meta.people。Filter value:\n // - person_single:存 PersonValue | null(picker emit array,我們取 [0])\n // - person_multi:存 PersonValue[]\n case 'person_single': {\n const v = value as PersonValue | null | undefined\n return (\n <PeoplePicker\n size=\"sm\"\n value={v ?? null}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next[0] ?? null)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n case 'person_multi': {\n const v = Array.isArray(value) ? (value as PersonValue[]) : []\n return (\n <PeoplePicker\n size=\"sm\"\n value={v}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n default:\n return null\n }\n}\n"],"names":["DatePicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table-filter-value-picker.js","sources":["../../../src/components/DataTable/data-table-filter-value-picker.tsx"],"sourcesContent":["// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved(2026-07-14 自 data-table-filter-panel.tsx 拆檔搬移,原檔級 escape 隨段落帶入)。\n// @internal — DS-internal 單元(FilterValuePicker value-picker switcher,只被\n// data-table-filter-group.tsx FilterRow 消費);不隨 index.ts re-export 進 npm public surface。\n// ────────────────────────────── 消費的 SSOT ──────────────────────────────\n// - Field controls(Family 4,統一 size=\"sm\"):Input / NumberInput / Select / Combobox /\n// DatePicker + DatePickerRange(showTime)/ PeoplePicker — 按 ValueShape dispatch\n// (ValueShape ↔ picker 對照 canonical:./data-table.spec.md「三、Operator × ValueShape SSOT」)\n// - className 直接 forward 給 inner Field control(不另開 wrapper div)—\n// field-control-group.spec.md「forward className」canonical(2026-05-04 #2 fix)\n// - Operator / ValueShape SSOT:./filter-operators.ts(DATE_RELATIVE_OPTIONS / DATE_RELATIVE_GROUPS)\n// - Person pool:PeoplePicker PersonValue(對齊 cell-registry meta.people SSOT)\n// 設計規則:./filter-operators.spec.md「ValueShape canonical」+ ./data-table.spec.md「進階篩選」段\n\nimport { Select, type SelectOption } from '@/design-system/components/Select/select'\nimport { Combobox } from '@/design-system/components/Combobox/combobox'\nimport { Input } from '@/design-system/components/Input/input'\nimport { NumberInput } from '@/design-system/components/NumberInput/number-input'\nimport { DatePicker, DatePickerRange } from '@/design-system/components/DatePicker/date-picker'\nimport { PeoplePicker } from '@/design-system/components/PeoplePicker/people-picker'\nimport type { PersonValue } from '@/design-system/components/PeoplePicker/person-display'\nimport {\n DATE_RELATIVE_OPTIONS,\n DATE_RELATIVE_GROUPS,\n type ValueShape,\n} from './filter-operators'\nimport type { DataTableFilterPanelLabels } from './data-table-filter-labels'\n\n// ── FilterValuePicker(value-picker switcher per ValueShape)────────────────\n//\n// 2026-05-03 M21 retract:本 helper 原獨立檔 filter-value-picker.tsx(187 行 / 1 consumer),\n// claim「未來 inline filter UI 共用」= premature abstraction → inline 回 panel。\n// 2026-07-14 拆檔 refactor:panel 822 行過 800 hard cap(file-size escalation)→ 重新抽出為\n// @internal 私有模組(非 public API 抽象,與 M21 不衝突;consumer 仍只見 DataTableFilterPanel)。\n\nexport interface FilterValuePickerColInfo {\n id: string\n label: string\n options?: Array<{ value: string; label: string }>\n /** Person pool — person/multiPerson filter picker 用(2026-05-07 升級,SSOT 對齊 cell-registry) */\n people?: Array<{ name: string; avatarUrl?: string; description?: string }>\n}\n\nexport interface FilterValuePickerProps {\n shape: ValueShape | null\n value: unknown\n onChange: (v: unknown) => void\n colInfo?: FilterValuePickerColInfo\n disabled?: boolean\n /** 用 column.label 組「{label} 篩選值」(panel 每 row 不顯式 label,a11y 必填) */\n ariaLabel?: string\n /** Resolved panel labels; placeholders and relative-date labels share one SSOT. */\n labels: DataTableFilterPanelLabels\n /** Forward 給內部 Field control 的 className(2026-05-04 #2 fix)\n * 避免外層包 wrapper div 破壞 FieldControlGroup CSS variants(rounded radii / margin overlap) */\n className?: string\n}\n\nexport function FilterValuePicker({\n shape,\n value,\n onChange,\n colInfo,\n disabled,\n ariaLabel,\n labels,\n className,\n}: FilterValuePickerProps) {\n if (!shape || disabled) {\n return <Input size=\"sm\" value=\"\" onChange={() => {}} placeholder={labels.valuePlaceholder} disabled aria-label={ariaLabel} className={className} />\n }\n\n switch (shape) {\n case 'none':\n return null\n\n case 'text':\n return (\n <Input\n size=\"sm\"\n value={String(value ?? '')}\n onChange={(e) => onChange(e.target.value)}\n placeholder={labels.valuePlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'number':\n return (\n <NumberInput\n size=\"sm\"\n value={typeof value === 'number' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n placeholder={labels.numberPlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_single':\n return (\n <DatePicker\n size=\"sm\"\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_range':\n return (\n <DatePickerRange\n size=\"sm\"\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'date_relative': {\n // 群組分類:Past / Current / Future(對齊 Linear / Notion idiom),走 Select.groups → SelectMenu\n const opts: SelectOption[] = DATE_RELATIVE_OPTIONS.map((o) => ({\n value: o.value,\n label: labels.relativeDateOptionLabels[o.value] ?? o.label,\n group: o.group,\n }))\n const groups = DATE_RELATIVE_GROUPS.map((group) => ({\n key: group.key,\n label: labels.relativeDateGroupLabels[group.key] ?? group.label,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n groups={groups}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder={labels.relativeDatePlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_single': {\n const opts: SelectOption[] = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n return (\n <Select\n size=\"sm\"\n options={opts}\n value={String(value ?? '')}\n onChange={(v) => onChange(v)}\n placeholder={labels.singleSelectPlaceholder}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'select_multi': {\n const opts = (colInfo?.options ?? []).map((o) => ({\n value: o.value,\n label: o.label,\n }))\n const arr = Array.isArray(value) ? (value as string[]) : []\n return (\n <Combobox\n size=\"sm\"\n options={opts}\n value={arr}\n onChange={(v) => onChange(v)}\n placeholder={labels.multiSelectPlaceholder}\n emptyText={labels.multiSelectEmptyText}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n\n case 'datetime_single':\n return (\n <DatePicker\n size=\"sm\"\n showTime\n value={typeof value === 'string' ? value : null}\n onChange={(v) => onChange(v ?? '')}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n case 'datetime_range':\n return (\n <DatePickerRange\n size=\"sm\"\n showTime\n value={Array.isArray(value) && value.length === 2\n ? (value as [string | null, string | null])\n : null}\n onChange={(v) => onChange(v)}\n aria-label={ariaLabel}\n className={className}\n />\n )\n\n // person_single / person_multi — 走 PeoplePicker(2026-05-07 升級,對齊 cell-registry SSOT)。\n // colInfo.people 來自 column meta.people。Filter value:\n // - person_single:存 PersonValue | null(picker emit array,我們取 [0])\n // - person_multi:存 PersonValue[]\n case 'person_single': {\n const v = value as PersonValue | null | undefined\n return (\n <PeoplePicker\n size=\"sm\"\n value={v ?? null}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next[0] ?? null)}\n placeholder={labels.peoplePlaceholder}\n searchPlaceholder={labels.peopleSearchPlaceholder}\n searchAriaLabel={labels.peopleSearchAriaLabel}\n emptyText={labels.peopleEmptyText}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n case 'person_multi': {\n const v = Array.isArray(value) ? (value as PersonValue[]) : []\n return (\n <PeoplePicker\n size=\"sm\"\n value={v}\n people={colInfo?.people ?? []}\n onChange={(next) => onChange(next)}\n placeholder={labels.peoplePlaceholder}\n searchPlaceholder={labels.peopleSearchPlaceholder}\n searchAriaLabel={labels.peopleSearchAriaLabel}\n emptyText={labels.peopleEmptyText}\n aria-label={ariaLabel}\n className={className}\n />\n )\n }\n default:\n return null\n }\n}\n"],"names":["DatePicker"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/data-table.tsx"],"names":[],"mappings":"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"}
|
|
@@ -984,7 +984,7 @@ function DataTableInner({
|
|
|
984
984
|
type: "button",
|
|
985
985
|
"aria-label": isExpanded ? "收合" : "展開",
|
|
986
986
|
"aria-expanded": isExpanded,
|
|
987
|
-
className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-
|
|
987
|
+
className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-fg-secondary rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-transform",
|
|
988
988
|
style: { transform: isExpanded ? "rotate(90deg)" : void 0 },
|
|
989
989
|
onClick: (e) => {
|
|
990
990
|
e.stopPropagation();
|
|
@@ -1017,7 +1017,7 @@ function DataTableInner({
|
|
|
1017
1017
|
type: "button",
|
|
1018
1018
|
"aria-label": isExpanded ? "收合" : "展開",
|
|
1019
1019
|
"aria-expanded": isExpanded,
|
|
1020
|
-
className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-
|
|
1020
|
+
className: "inline-flex items-center justify-center shrink-0 w-4 h-4 mr-2 text-fg-muted hover:text-fg-secondary rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring transition-transform",
|
|
1021
1021
|
style: { transform: isExpanded ? "rotate(90deg)" : void 0 },
|
|
1022
1022
|
onClick: (e) => {
|
|
1023
1023
|
e.stopPropagation();
|
|
@@ -1600,8 +1600,9 @@ function DataTableInner({
|
|
|
1600
1600
|
ref: centerBodyRef,
|
|
1601
1601
|
"data-datatable-hscroll": true,
|
|
1602
1602
|
"data-datatable-panel": "center",
|
|
1603
|
-
|
|
1604
|
-
|
|
1603
|
+
role: isEmpty ? void 0 : "rowgroup",
|
|
1604
|
+
tabIndex: enabled || spreadsheetMode || isEmpty ? void 0 : 0,
|
|
1605
|
+
"aria-label": enabled || spreadsheetMode || isEmpty ? void 0 : "表格內容,可捲動",
|
|
1605
1606
|
className: "flex-1 min-w-0 overflow-x-auto overflow-y-auto focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring",
|
|
1606
1607
|
style: isFillHeight && bodyMaxHeight != null ? { maxHeight: bodyMaxHeight } : hasHeightConstraint ? { maxHeight: height } : void 0,
|
|
1607
1608
|
onScroll: onCenterBodyScroll,
|