@qijenchen/design-system 0.1.0-beta.83 → 0.1.0-beta.84
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/CLAUDE.md +8 -8
- package/README.md +3 -2
- package/dist/components/Alert/alert.js.map +1 -1
- package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.d.ts +1 -1
- package/dist/components/AppShell/app-shell.d.ts.map +1 -1
- package/dist/components/AppShell/app-shell.js +22 -2
- package/dist/components/AppShell/app-shell.js.map +1 -1
- package/dist/components/Avatar/avatar.d.ts.map +1 -1
- package/dist/components/Avatar/avatar.js +4 -4
- package/dist/components/Avatar/avatar.js.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.js +1 -1
- package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/Button/button.d.ts +2 -2
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js +12 -3
- package/dist/components/Button/button.js.map +1 -1
- package/dist/components/Calendar/calendar.d.ts +13 -5
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +7 -1
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/Carousel/carousel.d.ts.map +1 -1
- package/dist/components/Carousel/carousel.js +8 -3
- package/dist/components/Carousel/carousel.js.map +1 -1
- package/dist/components/Chart/chart.d.ts.map +1 -1
- package/dist/components/Chart/chart.js +1 -0
- package/dist/components/Chart/chart.js.map +1 -1
- package/dist/components/Checkbox/checkbox.d.ts +1 -1
- package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/checkbox.js +8 -4
- package/dist/components/Checkbox/checkbox.js.map +1 -1
- package/dist/components/Chip/chip.d.ts +1 -1
- package/dist/components/Chip/chip.d.ts.map +1 -1
- package/dist/components/Chip/chip.js.map +1 -1
- package/dist/components/Coachmark/coachmark.d.ts +10 -3
- package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
- package/dist/components/Coachmark/coachmark.js.map +1 -1
- package/dist/components/Combobox/combobox.d.ts +5 -1
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +30 -13
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +53 -62
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/column-types.d.ts +10 -4
- package/dist/components/DataTable/column-types.d.ts.map +1 -1
- package/dist/components/DataTable/column-types.js.map +1 -1
- package/dist/components/DataTable/data-table-column-visibility-panel.d.ts +1 -1
- package/dist/components/DataTable/data-table-column-visibility-panel.js +183 -0
- package/dist/components/DataTable/data-table-column-visibility-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-filter-panel.js +607 -0
- package/dist/components/DataTable/data-table-filter-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-interaction-layer.d.ts +11 -15
- package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-interaction-layer.js +1 -3
- package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
- package/dist/components/DataTable/data-table-sort-manager.js +140 -0
- package/dist/components/DataTable/data-table-sort-manager.js.map +1 -0
- package/dist/components/DataTable/data-table.d.ts +5 -6
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +36 -15
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-operators.js +140 -0
- package/dist/components/DataTable/filter-operators.js.map +1 -0
- package/dist/components/DataTable/filter-tree.js +312 -0
- package/dist/components/DataTable/filter-tree.js.map +1 -0
- package/dist/components/DataTable/index.d.ts +3 -0
- package/dist/components/DataTable/index.d.ts.map +1 -1
- package/dist/components/DataTable/index.js +12 -1
- package/dist/components/DataTable/index.js.map +1 -1
- package/dist/components/DataTable/lib/column-meta.js +25 -0
- package/dist/components/DataTable/lib/column-meta.js.map +1 -0
- package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.js +3 -1
- package/dist/components/DateGrid/date-grid.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts +7 -1
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +105 -74
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/Dialog/dialog.d.ts +20 -3
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +38 -20
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.js +3 -1
- package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
- package/dist/components/Field/field-context.d.ts +45 -5
- package/dist/components/Field/field-context.d.ts.map +1 -1
- package/dist/components/Field/field-context.js +19 -0
- package/dist/components/Field/field-context.js.map +1 -1
- package/dist/components/Field/field-edit-keys.d.ts +21 -0
- package/dist/components/Field/field-edit-keys.d.ts.map +1 -0
- package/dist/components/Field/field-edit-keys.js +19 -0
- package/dist/components/Field/field-edit-keys.js.map +1 -0
- package/dist/components/Field/field-types.d.ts +20 -1
- package/dist/components/Field/field-types.d.ts.map +1 -1
- package/dist/components/Field/field-types.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts +3 -2
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +38 -39
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts +2 -1
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/FieldControlGroup/field-control-group.d.ts +1 -1
- package/dist/components/FieldControlGroup/field-control-group.js.map +1 -1
- package/dist/components/FileItem/file-item.d.ts.map +1 -1
- package/dist/components/FileItem/file-item.js +1 -1
- package/dist/components/FileItem/file-item.js.map +1 -1
- package/dist/components/FileUpload/file-upload.d.ts +1 -1
- package/dist/components/FileUpload/file-upload.js.map +1 -1
- package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
- package/dist/components/FileViewer/file-viewer.js +7 -2
- package/dist/components/FileViewer/file-viewer.js.map +1 -1
- package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
- package/dist/components/FileViewer/image-renderer.js +22 -1
- package/dist/components/FileViewer/image-renderer.js.map +1 -1
- package/dist/components/HoverCard/hover-card.d.ts.map +1 -1
- package/dist/components/HoverCard/hover-card.js +5 -3
- package/dist/components/HoverCard/hover-card.js.map +1 -1
- package/dist/components/InlineEdit/index.d.ts +2 -0
- package/dist/components/InlineEdit/index.d.ts.map +1 -0
- package/dist/components/InlineEdit/index.js +5 -0
- package/dist/components/InlineEdit/index.js.map +1 -0
- package/dist/components/InlineEdit/inline-edit.d.ts +59 -0
- package/dist/components/InlineEdit/inline-edit.d.ts.map +1 -0
- package/dist/components/InlineEdit/inline-edit.js +164 -0
- package/dist/components/InlineEdit/inline-edit.js.map +1 -0
- package/dist/components/Input/input.d.ts +6 -11
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +43 -13
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts +2 -2
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +6 -5
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Menu/menu-item.d.ts +14 -2
- package/dist/components/Menu/menu-item.d.ts.map +1 -1
- package/dist/components/Menu/menu-item.js +25 -3
- package/dist/components/Menu/menu-item.js.map +1 -1
- package/dist/components/NumberInput/number-input.d.ts +3 -3
- package/dist/components/NumberInput/number-input.d.ts.map +1 -1
- package/dist/components/NumberInput/number-input.js +6 -5
- package/dist/components/NumberInput/number-input.js.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.js +2 -6
- package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
- package/dist/components/Pagination/pagination.js +1 -1
- package/dist/components/Pagination/pagination.js.map +1 -1
- package/dist/components/PeoplePicker/index.js +7 -1
- package/dist/components/PeoplePicker/index.js.map +1 -1
- package/dist/components/PeoplePicker/people-picker.d.ts +9 -2
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +23 -10
- package/dist/components/PeoplePicker/people-picker.js.map +1 -1
- package/dist/components/PeoplePicker/person-display.d.ts +6 -3
- package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
- package/dist/components/PeoplePicker/person-display.js +19 -14
- package/dist/components/PeoplePicker/person-display.js.map +1 -1
- package/dist/components/Popover/popover.d.ts.map +1 -1
- package/dist/components/Popover/popover.js +3 -1
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/ProfileCard/profile-card.d.ts +2 -2
- package/dist/components/ProfileCard/profile-card.js +3 -3
- package/dist/components/ProfileCard/profile-card.js.map +1 -1
- package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
- package/dist/components/RadioGroup/radio-group.js +15 -9
- package/dist/components/RadioGroup/radio-group.js.map +1 -1
- package/dist/components/ScrollArea/scroll-area.d.ts +11 -1
- package/dist/components/ScrollArea/scroll-area.d.ts.map +1 -1
- package/dist/components/ScrollArea/scroll-area.js +6 -3
- package/dist/components/ScrollArea/scroll-area.js.map +1 -1
- package/dist/components/Select/select.d.ts +46 -5
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +109 -28
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/SelectMenu/select-menu.d.ts +3 -1
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
- package/dist/components/SelectMenu/select-menu.js +8 -1
- package/dist/components/SelectMenu/select-menu.js.map +1 -1
- package/dist/components/SelectionControl/boolean-value.d.ts +11 -0
- package/dist/components/SelectionControl/boolean-value.d.ts.map +1 -0
- package/dist/components/SelectionControl/boolean-value.js +23 -0
- package/dist/components/SelectionControl/boolean-value.js.map +1 -0
- package/dist/components/SelectionControl/index.d.ts +1 -0
- package/dist/components/SelectionControl/index.d.ts.map +1 -1
- package/dist/components/SelectionControl/index.js +2 -0
- package/dist/components/SelectionControl/index.js.map +1 -1
- package/dist/components/Sheet/index.js +2 -1
- package/dist/components/Sheet/sheet.d.ts +7 -1
- package/dist/components/Sheet/sheet.d.ts.map +1 -1
- package/dist/components/Sheet/sheet.js +5 -2
- package/dist/components/Sheet/sheet.js.map +1 -1
- package/dist/components/Sidebar/sidebar.d.ts +9 -4
- package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/Sidebar/sidebar.js +8 -10
- package/dist/components/Sidebar/sidebar.js.map +1 -1
- package/dist/components/Slider/slider.d.ts.map +1 -1
- package/dist/components/Slider/slider.js.map +1 -1
- package/dist/components/Switch/switch.d.ts +6 -6
- package/dist/components/Switch/switch.d.ts.map +1 -1
- package/dist/components/Switch/switch.js +3 -2
- package/dist/components/Switch/switch.js.map +1 -1
- package/dist/components/Tabs/tabs.d.ts.map +1 -1
- package/dist/components/Tabs/tabs.js +15 -1
- package/dist/components/Tabs/tabs.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +2 -2
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +50 -42
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-columns.d.ts.map +1 -1
- package/dist/components/TimePicker/time-columns.js +42 -38
- package/dist/components/TimePicker/time-columns.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +8 -6
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/Tooltip/tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/tooltip.js +7 -5
- package/dist/components/Tooltip/tooltip.js.map +1 -1
- package/dist/components/TreeView/tree-view.d.ts +56 -1
- package/dist/components/TreeView/tree-view.d.ts.map +1 -1
- package/dist/components/TreeView/tree-view.js +211 -12
- package/dist/components/TreeView/tree-view.js.map +1 -1
- package/dist/index.d.ts +115 -58
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +93 -108
- package/dist/index.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +7 -6
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/dist/tokens/categorical-color.js +15 -0
- package/dist/tokens/categorical-color.js.map +1 -1
- package/dist/tokens/motion/motion.d.ts +7 -6
- package/dist/tokens/motion/motion.d.ts.map +1 -1
- package/dist/tokens/motion/motion.js +6 -6
- package/dist/tokens/motion/motion.js.map +1 -1
- package/dist/tokens/motion/overlay-motion.d.ts +19 -0
- package/dist/tokens/motion/overlay-motion.d.ts.map +1 -0
- package/dist/tokens/motion/overlay-motion.js +9 -0
- package/dist/tokens/motion/overlay-motion.js.map +1 -0
- package/dist/tokens/uiSize/icon-size.js +5 -0
- package/dist/tokens/uiSize/icon-size.js.map +1 -0
- package/ds-canonical/fork/governance.lock +31 -19
- package/ds-canonical/fork/hooks/_log-fire.sh +46 -0
- package/ds-canonical/fork/hooks/block_prototype_imports.py +15 -4
- package/ds-canonical/fork/hooks/check_consumer_app_invariants.sh +145 -13
- package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +2 -1
- package/ds-canonical/fork/hooks/check_dynamic_tailwind_class.sh +47 -0
- package/ds-canonical/fork/hooks/check_escape_marker_abuse.sh +27 -0
- package/ds-canonical/fork/hooks/check_field_family_invariants.sh +61 -1
- package/ds-canonical/fork/hooks/check_layout_space_magic_numbers.sh +28 -4
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +28 -0
- package/ds-canonical/fork/hooks/check_story_determinism.sh +2 -0
- package/ds-canonical/fork/hooks/check_story_invariants.sh +119 -0
- package/ds-canonical/fork/hooks/check_tabs_content_chrome_body_double_gap.sh +29 -0
- package/ds-canonical/fork/manifest.json +15 -0
- package/ds-canonical/fork/preamble.md +20 -18
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +3 -3
- package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +3 -3
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +1 -1
- package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +3 -3
- package/ds-canonical/fork/skills/propose-options/SKILL.md +3 -3
- package/ds-canonical/fork/skills/prototype/SKILL.md +1 -1
- package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +2 -2
- package/ds-canonical/fork/skills/visual-audit/SKILL.md +2 -2
- package/ds-canonical/hooks/README.md +1 -1
- package/ds-canonical/hooks/block_prototype_imports.py +15 -4
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +65 -7
- package/ds-canonical/hooks/check_codex_brief_invariants.sh +28 -1
- package/ds-canonical/hooks/check_consumer_app_invariants.sh +145 -13
- package/ds-canonical/hooks/check_ds_anchor_preflight.sh +2 -1
- package/ds-canonical/hooks/check_dynamic_tailwind_class.sh +47 -0
- package/ds-canonical/hooks/check_escape_marker_abuse.sh +27 -0
- package/ds-canonical/hooks/check_field_family_invariants.sh +61 -1
- package/ds-canonical/hooks/check_layout_space_magic_numbers.sh +28 -4
- package/ds-canonical/hooks/check_naming_and_abstraction.sh +1 -1
- package/ds-canonical/hooks/check_opacity_token_usage.sh +28 -0
- package/ds-canonical/hooks/check_pixel_quantified_audit.sh +3 -2
- package/ds-canonical/hooks/check_post_main_ssot_propagate.sh +6 -1
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +3 -1
- package/ds-canonical/hooks/check_story_determinism.sh +2 -0
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +8 -7
- package/ds-canonical/hooks/check_tabs_content_chrome_body_double_gap.sh +29 -0
- package/ds-canonical/hooks/lib/_story_compile_drift.sh +1 -1
- package/ds-canonical/hooks/lib/_token_hygiene.sh +10 -1
- package/ds-canonical/hooks/stop_self_audit.sh +31 -0
- package/ds-canonical/hooks/tests/test_block_prototype_imports.sh +24 -0
- package/ds-canonical/hooks/tests/test_check_audit_post_report_validator.sh +44 -0
- package/ds-canonical/hooks/tests/test_check_codex_brief_invariants.sh +43 -2
- package/ds-canonical/hooks/tests/test_check_consumer_ds_primitive_misuse.sh +112 -0
- package/ds-canonical/hooks/tests/test_check_consumer_story_baseline.sh +9 -2
- package/ds-canonical/hooks/tests/test_check_dynamic_tailwind_class.sh +76 -0
- package/ds-canonical/hooks/tests/test_check_escape_marker_abuse.sh +24 -0
- package/ds-canonical/hooks/tests/test_check_field_family_invariants.sh +27 -2
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +39 -0
- package/ds-canonical/hooks/tests/test_check_tabs_content_chrome_body_double_gap.sh +76 -0
- package/ds-canonical/references/audit-coverage-vs-24-checklist.md +1 -1
- package/ds-canonical/references/build-ui-canonicals.md +2 -1
- package/ds-canonical/references/failure-class-registry.json +145 -0
- package/ds-canonical/references/governance-audit-coverage.md +33 -0
- package/ds-canonical/references/item-anatomy-recipe.md +2 -2
- package/ds-canonical/references/scenario-definition.md +6 -9
- package/ds-canonical/references/ssot-consultation.md +2 -2
- package/ds-canonical/references/ssot-index.md +5 -4
- package/ds-canonical/references/story-baseline-registry.json +8 -2
- package/ds-canonical/references/structural-token-retention.md +6 -9
- package/ds-canonical/rules/meta-patterns.md +8 -8
- package/ds-canonical/rules/self-verify.md +4 -3
- package/ds-canonical/rules/story-rules.md +2 -2
- package/ds-canonical/rules/ui-development.md +2 -2
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +3 -3
- package/ds-canonical/skills/code-quality-audit/SKILL.md +3 -3
- package/ds-canonical/skills/codex-collab/SKILL.md +9 -7
- package/ds-canonical/skills/codex-collab/references/brief-template.md +1 -1
- package/ds-canonical/skills/codify-principle/SKILL.md +2 -2
- package/ds-canonical/skills/component-quality-gate/SKILL.md +1 -1
- package/ds-canonical/skills/component-quality-gate/references/checklist.md +2 -2
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +51 -58
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-a-workflow.md +29 -0
- package/ds-canonical/skills/deep-audit-cross-codex/references/phase-b-codex-brief.md +29 -10
- package/ds-canonical/skills/deep-audit-cross-codex/references/triage-rubric.md +21 -0
- package/ds-canonical/skills/delivery-handoff/SKILL.md +1 -1
- package/ds-canonical/skills/design-system-audit/SKILL.md +26 -25
- package/ds-canonical/skills/design-system-audit/references/audit-prompts.md +13 -1
- package/ds-canonical/skills/design-system-audit/references/rule-placement.md +1 -1
- package/ds-canonical/skills/governance-health/SKILL.md +1 -1
- package/ds-canonical/skills/knowledge-prune/SKILL.md +3 -0
- package/ds-canonical/skills/knowledge-prune/references/prune-dimensions-d5-d10.md +1 -0
- package/ds-canonical/skills/new-component/SKILL.md +5 -5
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +1 -1
- package/ds-canonical/skills/product-ui-audit/SKILL.md +3 -3
- package/ds-canonical/skills/propose-options/SKILL.md +3 -3
- package/ds-canonical/skills/prototype/SKILL.md +1 -1
- package/ds-canonical/skills/scan-similar-bugs/SKILL.md +2 -2
- package/ds-canonical/skills/story-auto-compile-migrate/SKILL.md +3 -3
- package/ds-canonical/skills/story-writing/SKILL.md +3 -3
- package/ds-canonical/skills/visual-audit/SKILL.md +2 -2
- package/ds-story-manifest.json +29 -20
- package/llms-full.txt +22 -1
- package/llms.txt +5 -4
- package/package.json +7 -3
- package/src/components/Accordion/accordion.principles.stories.tsx +1 -1
- package/src/components/Accordion/accordion.stories.tsx +16 -1
- package/src/components/Alert/alert.principles.stories.tsx +1 -1
- package/src/components/Alert/alert.spec.md +8 -10
- package/src/components/Alert/alert.stories.tsx +28 -28
- package/src/components/Alert/alert.tsx +1 -1
- package/src/components/AppShell/_demo-helpers.tsx +6 -3
- package/src/components/AppShell/app-shell.spec.md +4 -4
- package/src/components/AppShell/app-shell.tsx +28 -2
- package/src/components/AspectRatio/aspect-ratio.spec.md +1 -1
- package/src/components/AspectRatio/aspect-ratio.stories.tsx +7 -89
- package/src/components/Avatar/avatar.anatomy.stories.tsx +7 -3
- package/src/components/Avatar/avatar.principles.stories.tsx +19 -15
- package/src/components/Avatar/avatar.spec.md +2 -2
- package/src/components/Avatar/avatar.stories.tsx +8 -6
- package/src/components/Avatar/avatar.tsx +13 -5
- package/src/components/Badge/badge.principles.stories.tsx +1 -1
- package/src/components/Badge/badge.spec.md +2 -0
- package/src/components/Badge/badge.stories.tsx +4 -2
- package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +6 -4
- package/src/components/Breadcrumb/breadcrumb.stories.tsx +6 -5
- package/src/components/Breadcrumb/breadcrumb.tsx +3 -2
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +4 -2
- package/src/components/Button/button.principles.stories.tsx +1 -1
- package/src/components/Button/button.spec.md +2 -2
- package/src/components/Button/button.tsx +18 -3
- package/src/components/Calendar/calendar.anatomy.stories.tsx +12 -10
- package/src/components/Calendar/calendar.principles.stories.tsx +14 -6
- package/src/components/Calendar/calendar.spec.md +5 -4
- package/src/components/Calendar/calendar.stories.tsx +7 -4
- package/src/components/Calendar/calendar.tsx +26 -7
- package/src/components/Carousel/carousel.anatomy.stories.tsx +5 -4
- package/src/components/Carousel/carousel.spec.md +2 -2
- package/src/components/Carousel/carousel.tsx +11 -3
- package/src/components/Chart/chart.anatomy.stories.tsx +7 -4
- package/src/components/Chart/chart.principles.stories.tsx +1 -1
- package/src/components/Chart/chart.stories.tsx +2 -8
- package/src/components/Chart/chart.tsx +3 -0
- package/src/components/Checkbox/checkbox.anatomy.stories.tsx +28 -49
- package/src/components/Checkbox/checkbox.principles.stories.tsx +1 -1
- package/src/components/Checkbox/checkbox.spec.md +11 -26
- package/src/components/Checkbox/checkbox.stories.tsx +11 -8
- package/src/components/Checkbox/checkbox.tsx +18 -13
- package/src/components/Chip/chip.anatomy.stories.tsx +44 -24
- package/src/components/Chip/chip.principles.stories.tsx +1 -1
- package/src/components/Chip/chip.spec.md +5 -4
- package/src/components/Chip/chip.tsx +5 -1
- package/src/components/CircularProgress/circular-progress.principles.stories.tsx +7 -4
- package/src/components/CircularProgress/circular-progress.spec.md +3 -3
- package/src/components/CircularProgress/circular-progress.stories.tsx +2 -2
- package/src/components/Coachmark/coachmark.anatomy.stories.tsx +2 -2
- package/src/components/Coachmark/coachmark.principles.stories.tsx +2 -1
- package/src/components/Coachmark/coachmark.spec.md +5 -5
- package/src/components/Coachmark/coachmark.stories.tsx +3 -1
- package/src/components/Coachmark/coachmark.tsx +10 -3
- package/src/components/Combobox/combobox.anatomy.stories.tsx +2 -2
- package/src/components/Combobox/combobox.tsx +53 -19
- package/src/components/Command/command.anatomy.stories.tsx +2 -2
- package/src/components/Command/command.principles.stories.tsx +1 -1
- package/src/components/Command/command.stories.tsx +42 -10
- package/src/components/DataTable/cell-registry.tsx +86 -63
- package/src/components/DataTable/column-types.ts +10 -1
- package/src/components/DataTable/data-table-column-visibility-panel.tsx +1 -1
- package/src/components/DataTable/data-table-filter-panel.tsx +4 -1
- package/src/components/DataTable/data-table-interaction-layer.tsx +15 -19
- package/src/components/DataTable/data-table.anatomy.stories.tsx +15 -13
- package/src/components/DataTable/data-table.principles.stories.tsx +9 -9
- package/src/components/DataTable/data-table.spec.md +32 -12
- package/src/components/DataTable/data-table.stories.tsx +16 -17
- package/src/components/DataTable/data-table.tsx +103 -60
- package/src/components/DataTable/index.ts +3 -0
- package/src/components/DateGrid/date-grid.anatomy.stories.tsx +4 -4
- package/src/components/DateGrid/date-grid.principles.stories.tsx +1 -1
- package/src/components/DateGrid/date-grid.spec.md +1 -1
- package/src/components/DateGrid/date-grid.tsx +3 -1
- package/src/components/DatePicker/date-picker.anatomy.stories.tsx +8 -8
- package/src/components/DatePicker/date-picker.principles.stories.tsx +3 -3
- package/src/components/DatePicker/date-picker.spec.md +3 -3
- package/src/components/DatePicker/date-picker.stories.tsx +4 -5
- package/src/components/DatePicker/date-picker.tsx +99 -45
- package/src/components/DescriptionList/description-list.anatomy.stories.tsx +12 -10
- package/src/components/DescriptionList/description-list.principles.stories.tsx +2 -2
- package/src/components/DescriptionList/description-list.spec.md +3 -3
- package/src/components/DescriptionList/description-list.stories.tsx +7 -6
- package/src/components/Dialog/dialog.anatomy.stories.tsx +1 -0
- package/src/components/Dialog/dialog.spec.md +9 -0
- package/src/components/Dialog/dialog.stories.tsx +66 -5
- package/src/components/Dialog/dialog.tsx +60 -25
- package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
- package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +8 -6
- package/src/components/DropdownMenu/dropdown-menu.spec.md +5 -5
- package/src/components/DropdownMenu/dropdown-menu.tsx +18 -9
- package/src/components/Empty/empty.anatomy.stories.tsx +1 -1
- package/src/components/Empty/empty.spec.md +2 -2
- package/src/components/Field/field-context.ts +69 -5
- package/src/components/Field/field-controls.spec.md +62 -8
- package/src/components/Field/field-edit-keys.ts +66 -0
- package/src/components/Field/field-types.ts +58 -9
- package/src/components/Field/field-wrapper.tsx +50 -42
- package/src/components/Field/field.anatomy.stories.tsx +9 -6
- package/src/components/Field/field.spec.md +1 -1
- package/src/components/Field/field.stories.tsx +1 -1
- package/src/components/Field/field.tsx +2 -1
- package/src/components/Field/form-validation.spec.md +3 -3
- package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +6 -6
- package/src/components/FieldControlGroup/field-control-group.spec.md +9 -4
- package/src/components/FieldControlGroup/field-control-group.tsx +1 -1
- package/src/components/FileItem/file-item.anatomy.stories.tsx +1 -1
- package/src/components/FileItem/file-item.spec.md +5 -8
- package/src/components/FileItem/file-item.stories.tsx +36 -25
- package/src/components/FileItem/file-item.tsx +8 -6
- package/src/components/FileUpload/file-upload.anatomy.stories.tsx +6 -6
- package/src/components/FileUpload/file-upload.principles.stories.tsx +5 -5
- package/src/components/FileUpload/file-upload.spec.md +1 -1
- package/src/components/FileUpload/file-upload.tsx +1 -1
- package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +4 -3
- package/src/components/FileViewer/file-viewer.principles.stories.tsx +3 -3
- package/src/components/FileViewer/file-viewer.spec.md +30 -12
- package/src/components/FileViewer/file-viewer.stories.tsx +1 -2
- package/src/components/FileViewer/file-viewer.tsx +12 -4
- package/src/components/FileViewer/image-renderer.tsx +35 -7
- package/src/components/HoverCard/hover-card.anatomy.stories.tsx +6 -2
- package/src/components/HoverCard/hover-card.principles.stories.tsx +6 -3
- package/src/components/HoverCard/hover-card.spec.md +5 -5
- package/src/components/HoverCard/hover-card.stories.tsx +16 -16
- package/src/components/HoverCard/hover-card.tsx +5 -3
- package/src/components/InlineEdit/index.ts +5 -0
- package/src/components/InlineEdit/inline-edit.spec.md +149 -0
- package/src/components/InlineEdit/inline-edit.stories.tsx +246 -0
- package/src/components/InlineEdit/inline-edit.tsx +287 -0
- package/src/components/Input/input.anatomy.stories.tsx +8 -7
- package/src/components/Input/input.principles.stories.tsx +2 -12
- package/src/components/Input/input.spec.md +13 -18
- package/src/components/Input/input.tsx +69 -22
- package/src/components/LinkInput/link-input.anatomy.stories.tsx +1 -1
- package/src/components/LinkInput/link-input.principles.stories.tsx +2 -2
- package/src/components/LinkInput/link-input.tsx +11 -10
- package/src/components/Menu/menu-item.anatomy.stories.tsx +3 -3
- package/src/components/Menu/menu-item.principles.stories.tsx +1 -1
- package/src/components/Menu/menu-item.spec.md +22 -15
- package/src/components/Menu/menu-item.stories.tsx +39 -11
- package/src/components/Menu/menu-item.tsx +38 -4
- package/src/components/Notice/notice.principles.stories.tsx +1 -1
- package/src/components/Notice/notice.spec.md +16 -3
- package/src/components/NumberInput/number-input.anatomy.stories.tsx +3 -3
- package/src/components/NumberInput/number-input.principles.stories.tsx +1 -1
- package/src/components/NumberInput/number-input.spec.md +4 -4
- package/src/components/NumberInput/number-input.tsx +19 -12
- package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +10 -8
- package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +3 -3
- package/src/components/OverflowIndicator/overflow-indicator.spec.md +4 -2
- package/src/components/OverflowIndicator/overflow-indicator.stories.tsx +71 -63
- package/src/components/OverflowIndicator/overflow-indicator.tsx +9 -8
- package/src/components/Pagination/pagination.spec.md +1 -1
- package/src/components/Pagination/pagination.stories.tsx +2 -6
- package/src/components/Pagination/pagination.tsx +1 -1
- package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +4 -4
- package/src/components/PeoplePicker/people-picker.principles.stories.tsx +2 -2
- package/src/components/PeoplePicker/people-picker.spec.md +6 -6
- package/src/components/PeoplePicker/people-picker.tsx +56 -16
- package/src/components/PeoplePicker/person-display.tsx +32 -16
- package/src/components/Popover/popover.anatomy.stories.tsx +2 -2
- package/src/components/Popover/popover.tsx +3 -1
- package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +12 -23
- package/src/components/ProfileCard/profile-card.spec.md +3 -3
- package/src/components/ProfileCard/profile-card.tsx +6 -6
- package/src/components/ProgressBar/progress-bar.anatomy.stories.tsx +3 -1
- package/src/components/ProgressBar/progress-bar.principles.stories.tsx +1 -1
- package/src/components/ProgressBar/progress-bar.stories.tsx +50 -42
- package/src/components/RadioGroup/radio-group.anatomy.stories.tsx +10 -28
- package/src/components/RadioGroup/radio-group.stories.tsx +29 -32
- package/src/components/RadioGroup/radio-group.tsx +41 -15
- package/src/components/Rating/rating.spec.md +11 -3
- package/src/components/ScrollArea/scroll-area.anatomy.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.principles.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.spec.md +7 -3
- package/src/components/ScrollArea/scroll-area.stories.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.tsx +17 -4
- package/src/components/Select/select.anatomy.stories.tsx +3 -3
- package/src/components/Select/select.spec.md +27 -17
- package/src/components/Select/select.stories.tsx +33 -0
- package/src/components/Select/select.tsx +190 -36
- package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +4 -4
- package/src/components/SelectMenu/select-menu.spec.md +15 -7
- package/src/components/SelectMenu/select-menu.tsx +16 -3
- package/src/components/SelectionControl/boolean-value.tsx +39 -0
- package/src/components/SelectionControl/index.ts +1 -0
- package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +2 -2
- package/src/components/SelectionControl/selection-item.principles.stories.tsx +2 -2
- package/src/components/SelectionControl/selection-item.spec.md +3 -3
- package/src/components/SelectionControl/selection-item.stories.tsx +3 -3
- package/src/components/Separator/separator.spec.md +2 -2
- package/src/components/Separator/separator.stories.tsx +6 -27
- package/src/components/Sheet/sheet.anatomy.stories.tsx +1 -1
- package/src/components/Sheet/sheet.principles.stories.tsx +1 -1
- package/src/components/Sheet/sheet.spec.md +2 -2
- package/src/components/Sheet/sheet.tsx +9 -5
- package/src/components/Sidebar/sidebar.anatomy.stories.tsx +16 -12
- package/src/components/Sidebar/sidebar.principles.stories.tsx +10 -8
- package/src/components/Sidebar/sidebar.spec.md +13 -15
- package/src/components/Sidebar/sidebar.stories.tsx +8 -7
- package/src/components/Sidebar/sidebar.tsx +37 -25
- package/src/components/Skeleton/skeleton.stories.tsx +4 -11
- package/src/components/Slider/slider.anatomy.stories.tsx +3 -3
- package/src/components/Slider/slider.principles.stories.tsx +2 -2
- package/src/components/Slider/slider.spec.md +5 -5
- package/src/components/Slider/slider.tsx +3 -1
- package/src/components/Steps/steps.anatomy.stories.tsx +4 -4
- package/src/components/Steps/steps.principles.stories.tsx +1 -1
- package/src/components/Steps/steps.spec.md +1 -1
- package/src/components/Switch/switch.anatomy.stories.tsx +7 -7
- package/src/components/Switch/switch.principles.stories.tsx +4 -4
- package/src/components/Switch/switch.spec.md +8 -8
- package/src/components/Switch/switch.stories.tsx +9 -24
- package/src/components/Switch/switch.tsx +17 -13
- package/src/components/Tabs/tabs.anatomy.stories.tsx +10 -7
- package/src/components/Tabs/tabs.spec.md +1 -1
- package/src/components/Tabs/tabs.tsx +21 -1
- package/src/components/Textarea/textarea.anatomy.stories.tsx +1 -1
- package/src/components/Textarea/textarea.principles.stories.tsx +1 -1
- package/src/components/Textarea/textarea.spec.md +4 -4
- package/src/components/Textarea/textarea.tsx +72 -46
- package/src/components/TimePicker/time-columns.tsx +6 -2
- package/src/components/TimePicker/time-picker.principles.stories.tsx +1 -1
- package/src/components/TimePicker/time-picker.spec.md +3 -3
- package/src/components/TimePicker/time-picker.tsx +16 -10
- package/src/components/Toast/toast.stories.tsx +7 -4
- package/src/components/Tooltip/tooltip.anatomy.stories.tsx +4 -4
- package/src/components/Tooltip/tooltip.principles.stories.tsx +3 -3
- package/src/components/Tooltip/tooltip.spec.md +1 -1
- package/src/components/Tooltip/tooltip.stories.tsx +4 -39
- package/src/components/Tooltip/tooltip.tsx +8 -6
- package/src/components/TreeView/tree-view.anatomy.stories.tsx +6 -3
- package/src/components/TreeView/tree-view.spec.md +42 -11
- package/src/components/TreeView/tree-view.stories.tsx +1 -0
- package/src/components/TreeView/tree-view.tsx +322 -17
- package/src/index.ts +584 -60
- package/src/patterns/action-bar/action-bar.spec.md +9 -0
- package/src/patterns/action-bar/action-bar.stories.tsx +6 -3
- package/src/patterns/element-anatomy/inline-action.spec.md +2 -0
- package/src/patterns/element-anatomy/item-anatomy.spec.md +14 -5
- package/src/patterns/element-anatomy/item-anatomy.stories.tsx +6 -4
- package/src/patterns/element-anatomy/item-anatomy.tsx +7 -6
- package/src/patterns/header-canonical/header-canonical.spec.md +5 -4
- package/src/patterns/overlay-surface/overlay-surface.spec.md +22 -1
- package/src/styles/tokens.css +3 -0
- package/src/tokens/README.md +1 -1
- package/src/tokens/color/color.spec.md +3 -3
- package/src/tokens/color/color.stories.tsx +3 -3
- package/src/tokens/density/density.stories.tsx +16 -3
- package/src/tokens/layoutSpace/layoutSpace.spec.md +3 -1
- package/src/tokens/motion/motion.css +33 -21
- package/src/tokens/motion/motion.spec.md +32 -15
- package/src/tokens/motion/motion.stories.tsx +58 -5
- package/src/tokens/motion/motion.ts +7 -6
- package/src/tokens/motion/overlay-motion.ts +26 -0
- package/src/tokens/orphan-tokens.spec.md +4 -4
- package/src/tokens/token-system.spec.md +1 -0
- package/src/tokens/uiSize/uiSize.spec.md +1 -1
- package/src/tokens/uiSize/uiSize.stories.tsx +4 -2
- package/src/tokens/utility-registry.json +160 -23
|
@@ -36,6 +36,42 @@ export interface TreeDragEndEvent {
|
|
|
36
36
|
/** 放置位置:before(同層上方)/ after(同層下方)/ inside(成為子 node) */
|
|
37
37
|
position: TreeDropPosition;
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* 鍵盤重排(`Cmd/Ctrl+Shift+方向鍵`,2026-07-14 v1)的 SR 播報文案 — zh-TW 預設,
|
|
41
|
+
* per-key merge 覆寫(i18n 覆寫點)。詳 tree-view.spec.md「鍵盤重排」。
|
|
42
|
+
* @public
|
|
43
|
+
*/
|
|
44
|
+
export interface TreeReorderAnnouncements {
|
|
45
|
+
/** 同層上/下移完成。`index` / `count` = 移動後在同層的 1-based 序數 / 同層總數 */
|
|
46
|
+
moved?: (args: {
|
|
47
|
+
label: string;
|
|
48
|
+
targetLabel: string;
|
|
49
|
+
position: 'before' | 'after';
|
|
50
|
+
index: number;
|
|
51
|
+
count: number;
|
|
52
|
+
}) => string;
|
|
53
|
+
/** 移入 folder 完成。folder 原本收合(children 尚未 mount)時序數不可知 → `index` / `count` 為 undefined */
|
|
54
|
+
movedInside?: (args: {
|
|
55
|
+
label: string;
|
|
56
|
+
folderLabel: string;
|
|
57
|
+
index?: number;
|
|
58
|
+
count?: number;
|
|
59
|
+
}) => string;
|
|
60
|
+
/** 移出到上層完成。`level` = 移動後所在層(1-based,同 aria-level 語意) */
|
|
61
|
+
movedOut?: (args: {
|
|
62
|
+
label: string;
|
|
63
|
+
parentLabel: string;
|
|
64
|
+
level: number;
|
|
65
|
+
}) => string;
|
|
66
|
+
/** 邊界 no-op:top(已在最上方)/ bottom(已在最下方)/ not-folder(無可移入的 folder)/ root(已在最外層) */
|
|
67
|
+
blocked?: (args: {
|
|
68
|
+
reason: 'top' | 'bottom' | 'not-folder' | 'root';
|
|
69
|
+
label: string;
|
|
70
|
+
targetLabel?: string;
|
|
71
|
+
}) => string;
|
|
72
|
+
/** sr-only 操作說明(tree 容器 `aria-describedby` 指向;僅 `draggable` 時渲染) */
|
|
73
|
+
instructions?: string;
|
|
74
|
+
}
|
|
39
75
|
export interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onDragEnd'> {
|
|
40
76
|
/** 元件尺寸,影響 node 高度、icon 大小、indent 寬度 */
|
|
41
77
|
size?: SizeKey;
|
|
@@ -70,6 +106,12 @@ export interface TreeViewProps extends Omit<React.HTMLAttributes<HTMLDivElement>
|
|
|
70
106
|
draggable?: boolean;
|
|
71
107
|
/** Drag 結束時觸發,提供 sourceId、targetId、position。Consumer 負責 reorder。 */
|
|
72
108
|
onDragEnd?: (event: TreeDragEndEvent) => void;
|
|
109
|
+
/**
|
|
110
|
+
* 鍵盤重排(`Cmd/Ctrl+Shift+方向鍵`)的 SR 播報文案覆寫(per-key merge;zh-TW 預設)。
|
|
111
|
+
* 僅在 `draggable` 時生效;含 `instructions`(sr-only 操作說明)。
|
|
112
|
+
* @public
|
|
113
|
+
*/
|
|
114
|
+
reorderAnnouncements?: TreeReorderAnnouncements;
|
|
73
115
|
/** ARIA label */
|
|
74
116
|
'aria-label'?: string;
|
|
75
117
|
}
|
|
@@ -153,7 +195,20 @@ export declare const treeViewMeta: {
|
|
|
153
195
|
readonly component: "TreeView";
|
|
154
196
|
readonly family: 1;
|
|
155
197
|
readonly variants: {};
|
|
156
|
-
readonly sizes: {
|
|
198
|
+
readonly sizes: {
|
|
199
|
+
readonly sm: {
|
|
200
|
+
readonly typography: "body";
|
|
201
|
+
readonly indent: 24;
|
|
202
|
+
};
|
|
203
|
+
readonly md: {
|
|
204
|
+
readonly typography: "body";
|
|
205
|
+
readonly indent: 24;
|
|
206
|
+
};
|
|
207
|
+
readonly lg: {
|
|
208
|
+
readonly typography: "body-lg";
|
|
209
|
+
readonly indent: 28;
|
|
210
|
+
};
|
|
211
|
+
};
|
|
157
212
|
readonly states: readonly ["default", "hover", "selected", "focus-visible", "disabled"];
|
|
158
213
|
readonly tokens: {
|
|
159
214
|
readonly bg: readonly ["bg-neutral-hover", "bg-neutral-selected", "bg-surface"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../../src/components/TreeView/tree-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAgB9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAK9C,OAAO,EAQL,KAAK,kBAAkB,EACxB,MAAM,uDAAuD,CAAA;AAE9D;;;;;;;;;;;;;;;GAeG;AAMH,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AACjC,KAAK,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;AACnD;;;;GAIG;AACH,KAAK,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AASrC,qCAAqC;AAErC,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE5D,6BAA6B;AAE7B,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,uDAAuD;IACvD,QAAQ,EAAE,gBAAgB,CAAA;CAC3B;
|
|
1
|
+
{"version":3,"file":"tree-view.d.ts","sourceRoot":"","sources":["../../../src/components/TreeView/tree-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
|
|
4
4
|
import { useDraggable, useDroppable, useSensors, useSensor, PointerSensor, DndContext, DragOverlay } from "@dnd-kit/core";
|
|
@@ -15,6 +15,25 @@ const CONTEXT_PX_VAR = {
|
|
|
15
15
|
// px-3,對齊 MenuItem / DropdownMenu
|
|
16
16
|
};
|
|
17
17
|
const INDENT_STEP = { sm: 24, md: 24, lg: 28 };
|
|
18
|
+
const REORDER_ARROW_KEYS = ["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"];
|
|
19
|
+
const DEFAULT_REORDER_ANNOUNCEMENTS = {
|
|
20
|
+
moved: ({ label, targetLabel, position, index, count }) => `已將『${label}』移到『${targetLabel}』${position === "before" ? "之前" : "之後"},第 ${index} 項,共 ${count} 項`,
|
|
21
|
+
movedInside: ({ label, folderLabel, index, count }) => index !== void 0 && count !== void 0 ? `已將『${label}』移入『${folderLabel}』,第 ${index} 項,共 ${count} 項` : `已將『${label}』移入『${folderLabel}』`,
|
|
22
|
+
movedOut: ({ label, parentLabel, level }) => `已將『${label}』移出到『${parentLabel}』之後,第 ${level} 層`,
|
|
23
|
+
blocked: ({ reason, targetLabel }) => {
|
|
24
|
+
switch (reason) {
|
|
25
|
+
case "top":
|
|
26
|
+
return "已在最上方";
|
|
27
|
+
case "bottom":
|
|
28
|
+
return "已在最下方";
|
|
29
|
+
case "not-folder":
|
|
30
|
+
return targetLabel ? `無法移入:『${targetLabel}』不是資料夾` : "無法移入";
|
|
31
|
+
case "root":
|
|
32
|
+
return "已在最外層";
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
instructions: "按 Cmd(Ctrl)+Shift+方向鍵可重新排列項目"
|
|
36
|
+
};
|
|
18
37
|
const TreeViewContext = React.createContext(null);
|
|
19
38
|
function useTreeView() {
|
|
20
39
|
const ctx = React.useContext(TreeViewContext);
|
|
@@ -44,6 +63,7 @@ const TreeView = React.forwardRef(
|
|
|
44
63
|
expandOnSelect = false,
|
|
45
64
|
draggable = false,
|
|
46
65
|
onDragEnd: onDragEndProp,
|
|
66
|
+
reorderAnnouncements: reorderAnnouncementsProp,
|
|
47
67
|
expandedIds: controlledExpanded,
|
|
48
68
|
onExpandedChange,
|
|
49
69
|
selectedIds: controlledSelected,
|
|
@@ -94,6 +114,12 @@ const TreeView = React.forwardRef(
|
|
|
94
114
|
);
|
|
95
115
|
const [focusedId, setFocusedId] = React.useState(null);
|
|
96
116
|
const activeDescendantPrefix = React.useId();
|
|
117
|
+
const [reorderAnnouncement, setReorderAnnouncement] = React.useState("");
|
|
118
|
+
const announcements = React.useMemo(
|
|
119
|
+
() => ({ ...DEFAULT_REORDER_ANNOUNCEMENTS, ...reorderAnnouncementsProp }),
|
|
120
|
+
[reorderAnnouncementsProp]
|
|
121
|
+
);
|
|
122
|
+
const reorderInstructionsId = `${activeDescendantPrefix}tree-reorder-instructions`;
|
|
97
123
|
const isKeyboardRef = React.useRef(false);
|
|
98
124
|
const [draggingId, setDraggingId] = React.useState(null);
|
|
99
125
|
const [dropTarget, setDropTarget] = React.useState(null);
|
|
@@ -103,6 +129,19 @@ const TreeView = React.forwardRef(
|
|
|
103
129
|
}, []);
|
|
104
130
|
const toggleExpandRef = React.useRef(() => {
|
|
105
131
|
});
|
|
132
|
+
const { registerNode, unregisterNode, getNodeInfo } = useNodeRegistry();
|
|
133
|
+
const isInSubtree = React.useCallback(
|
|
134
|
+
(candidateId, rootId) => {
|
|
135
|
+
var _a;
|
|
136
|
+
let cur = candidateId;
|
|
137
|
+
while (cur != null) {
|
|
138
|
+
if (cur === rootId) return true;
|
|
139
|
+
cur = ((_a = getNodeInfo(cur)) == null ? void 0 : _a.parentId) ?? null;
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
},
|
|
143
|
+
[getNodeInfo]
|
|
144
|
+
);
|
|
106
145
|
const sensors = useSensors(
|
|
107
146
|
useSensor(PointerSensor, { activationConstraint: { distance: 5 } })
|
|
108
147
|
);
|
|
@@ -112,7 +151,7 @@ const TreeView = React.forwardRef(
|
|
|
112
151
|
const handleDragOver = React.useCallback((event) => {
|
|
113
152
|
var _a, _b, _c, _d, _e;
|
|
114
153
|
const { over, active } = event;
|
|
115
|
-
if (!over || over.id
|
|
154
|
+
if (!over || isInSubtree(String(over.id), String(active.id))) {
|
|
116
155
|
if (autoExpandTimerRef.current) {
|
|
117
156
|
clearTimeout(autoExpandTimerRef.current);
|
|
118
157
|
autoExpandTimerRef.current = null;
|
|
@@ -183,7 +222,7 @@ const TreeView = React.forwardRef(
|
|
|
183
222
|
autoExpandTimerRef.current = null;
|
|
184
223
|
}
|
|
185
224
|
}
|
|
186
|
-
}, [expandedIds]);
|
|
225
|
+
}, [expandedIds, isInSubtree]);
|
|
187
226
|
const dropTargetRef = React.useRef(dropTarget);
|
|
188
227
|
dropTargetRef.current = dropTarget;
|
|
189
228
|
const handleDragEnd = React.useCallback((event) => {
|
|
@@ -193,7 +232,7 @@ const TreeView = React.forwardRef(
|
|
|
193
232
|
}
|
|
194
233
|
const { active, over } = event;
|
|
195
234
|
const dt = dropTargetRef.current;
|
|
196
|
-
if (over &&
|
|
235
|
+
if (over && !isInSubtree(String(over.id), String(active.id)) && dt) {
|
|
197
236
|
onDragEndProp == null ? void 0 : onDragEndProp({
|
|
198
237
|
sourceId: String(active.id),
|
|
199
238
|
targetId: String(over.id),
|
|
@@ -202,7 +241,7 @@ const TreeView = React.forwardRef(
|
|
|
202
241
|
}
|
|
203
242
|
setDraggingId(null);
|
|
204
243
|
setDropTarget(null);
|
|
205
|
-
}, [onDragEndProp]);
|
|
244
|
+
}, [onDragEndProp, isInSubtree]);
|
|
206
245
|
const handleDragCancel = React.useCallback(() => {
|
|
207
246
|
if (autoExpandTimerRef.current) {
|
|
208
247
|
clearTimeout(autoExpandTimerRef.current);
|
|
@@ -211,7 +250,6 @@ const TreeView = React.forwardRef(
|
|
|
211
250
|
setDraggingId(null);
|
|
212
251
|
setDropTarget(null);
|
|
213
252
|
}, []);
|
|
214
|
-
const { registerNode, unregisterNode, getNodeInfo } = useNodeRegistry();
|
|
215
253
|
const toggleExpand = React.useCallback(
|
|
216
254
|
(id) => {
|
|
217
255
|
setExpandedIds((prev) => {
|
|
@@ -239,6 +277,139 @@ const TreeView = React.forwardRef(
|
|
|
239
277
|
},
|
|
240
278
|
[selectionMode, setSelectedIds]
|
|
241
279
|
);
|
|
280
|
+
const getNodeLabelText = React.useCallback(
|
|
281
|
+
(id) => {
|
|
282
|
+
var _a, _b;
|
|
283
|
+
const info = getNodeInfo(id);
|
|
284
|
+
if (typeof (info == null ? void 0 : info.label) === "string") return info.label;
|
|
285
|
+
const rowEl = (_a = treeRef.current) == null ? void 0 : _a.querySelector(`[data-tree-row="${id}"]`);
|
|
286
|
+
return ((_b = rowEl == null ? void 0 : rowEl.textContent) == null ? void 0 : _b.trim()) || id;
|
|
287
|
+
},
|
|
288
|
+
[getNodeInfo]
|
|
289
|
+
);
|
|
290
|
+
const handleKeyboardReorder = React.useCallback(
|
|
291
|
+
(key) => {
|
|
292
|
+
const tree = treeRef.current;
|
|
293
|
+
if (!tree || !focusedId) return;
|
|
294
|
+
const sourceId = focusedId;
|
|
295
|
+
const sourceEl = tree.querySelector(`[data-tree-id="${sourceId}"]`);
|
|
296
|
+
if (!sourceEl || sourceEl.getAttribute("aria-disabled") === "true") return;
|
|
297
|
+
const label = getNodeLabelText(sourceId);
|
|
298
|
+
const parentId = sourceEl.dataset.treeParentId || null;
|
|
299
|
+
const visibleItems = Array.from(
|
|
300
|
+
tree.querySelectorAll('[role="treeitem"]:not([hidden])')
|
|
301
|
+
);
|
|
302
|
+
const siblings = visibleItems.filter((el) => (el.dataset.treeParentId || null) === parentId);
|
|
303
|
+
const sourceIndex = siblings.findIndex((el) => el.dataset.treeId === sourceId);
|
|
304
|
+
if (sourceIndex < 0) return;
|
|
305
|
+
const isEnabled = (el) => el.getAttribute("aria-disabled") !== "true";
|
|
306
|
+
const commit = (targetId, position) => {
|
|
307
|
+
if (targetId === sourceId || isInSubtree(targetId, sourceId)) return false;
|
|
308
|
+
onDragEndProp == null ? void 0 : onDragEndProp({ sourceId, targetId, position });
|
|
309
|
+
requestAnimationFrame(() => {
|
|
310
|
+
var _a, _b;
|
|
311
|
+
(_b = (_a = treeRef.current) == null ? void 0 : _a.querySelector(`[data-tree-id="${sourceId}"]`)) == null ? void 0 : _b.scrollIntoView({ block: "nearest" });
|
|
312
|
+
});
|
|
313
|
+
return true;
|
|
314
|
+
};
|
|
315
|
+
const movedIndex = (targetId, position) => {
|
|
316
|
+
const order = siblings.map((el) => el.dataset.treeId).filter((id) => id !== sourceId);
|
|
317
|
+
const tIdx = order.indexOf(targetId);
|
|
318
|
+
return (position === "before" ? tIdx : tIdx + 1) + 1;
|
|
319
|
+
};
|
|
320
|
+
switch (key) {
|
|
321
|
+
case "ArrowUp":
|
|
322
|
+
case "ArrowDown": {
|
|
323
|
+
const dir = key === "ArrowUp" ? -1 : 1;
|
|
324
|
+
const boundary = dir < 0 ? "top" : "bottom";
|
|
325
|
+
const adjacent = siblings[sourceIndex + dir];
|
|
326
|
+
if (!adjacent) {
|
|
327
|
+
setReorderAnnouncement(announcements.blocked({ reason: boundary, label }));
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
let target;
|
|
331
|
+
let position = dir < 0 ? "before" : "after";
|
|
332
|
+
if (isEnabled(adjacent)) {
|
|
333
|
+
target = adjacent;
|
|
334
|
+
} else {
|
|
335
|
+
for (let i = sourceIndex + dir; i >= 0 && i < siblings.length; i += dir) {
|
|
336
|
+
if (isEnabled(siblings[i])) {
|
|
337
|
+
target = siblings[i];
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
position = dir < 0 ? "after" : "before";
|
|
342
|
+
}
|
|
343
|
+
if (!target) {
|
|
344
|
+
setReorderAnnouncement(announcements.blocked({ reason: boundary, label }));
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
const targetId = target.dataset.treeId;
|
|
348
|
+
if (commit(targetId, position)) {
|
|
349
|
+
setReorderAnnouncement(
|
|
350
|
+
announcements.moved({
|
|
351
|
+
label,
|
|
352
|
+
targetLabel: getNodeLabelText(targetId),
|
|
353
|
+
position,
|
|
354
|
+
index: movedIndex(targetId, position),
|
|
355
|
+
count: siblings.length
|
|
356
|
+
})
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
case "ArrowRight": {
|
|
362
|
+
let target;
|
|
363
|
+
for (let i = sourceIndex - 1; i >= 0; i--) {
|
|
364
|
+
if (isEnabled(siblings[i])) {
|
|
365
|
+
target = siblings[i];
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (!target) {
|
|
370
|
+
setReorderAnnouncement(announcements.blocked({ reason: "not-folder", label }));
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const targetId = target.dataset.treeId;
|
|
374
|
+
if (target.dataset.treeHasChildren !== "true") {
|
|
375
|
+
setReorderAnnouncement(
|
|
376
|
+
announcements.blocked({ reason: "not-folder", label, targetLabel: getNodeLabelText(targetId) })
|
|
377
|
+
);
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
const wasExpanded = expandedIds.has(targetId);
|
|
381
|
+
if (commit(targetId, "inside")) {
|
|
382
|
+
if (!wasExpanded) toggleExpand(targetId);
|
|
383
|
+
const childCount = wasExpanded ? visibleItems.filter((el) => el.dataset.treeParentId === targetId).length : void 0;
|
|
384
|
+
setReorderAnnouncement(
|
|
385
|
+
announcements.movedInside({
|
|
386
|
+
label,
|
|
387
|
+
folderLabel: getNodeLabelText(targetId),
|
|
388
|
+
index: childCount !== void 0 ? childCount + 1 : void 0,
|
|
389
|
+
count: childCount !== void 0 ? childCount + 1 : void 0
|
|
390
|
+
})
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
case "ArrowLeft": {
|
|
396
|
+
if (!parentId) {
|
|
397
|
+
setReorderAnnouncement(announcements.blocked({ reason: "root", label }));
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const parentEl = tree.querySelector(`[data-tree-id="${parentId}"]`);
|
|
401
|
+
const level = Number((parentEl == null ? void 0 : parentEl.getAttribute("aria-level")) ?? "1");
|
|
402
|
+
if (commit(parentId, "after")) {
|
|
403
|
+
setReorderAnnouncement(
|
|
404
|
+
announcements.movedOut({ label, parentLabel: getNodeLabelText(parentId), level })
|
|
405
|
+
);
|
|
406
|
+
}
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
[focusedId, expandedIds, toggleExpand, onDragEndProp, getNodeLabelText, isInSubtree, announcements]
|
|
412
|
+
);
|
|
242
413
|
const contextValue = React.useMemo(
|
|
243
414
|
() => ({
|
|
244
415
|
size,
|
|
@@ -290,13 +461,21 @@ const TreeView = React.forwardRef(
|
|
|
290
461
|
(e) => {
|
|
291
462
|
isKeyboardRef.current = true;
|
|
292
463
|
if (!treeRef.current) return;
|
|
464
|
+
if ((e.metaKey || e.ctrlKey) && e.shiftKey && REORDER_ARROW_KEYS.includes(e.key)) {
|
|
465
|
+
if (!draggable) return;
|
|
466
|
+
e.preventDefault();
|
|
467
|
+
if (draggingId !== null) return;
|
|
468
|
+
handleKeyboardReorder(e.key);
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
293
471
|
const items = Array.from(
|
|
294
|
-
|
|
472
|
+
// a11y:排除 disabled 節點 → 鍵盤導覽/選取/展開全跳過(APG:disabled 不可鍵盤操作)
|
|
473
|
+
treeRef.current.querySelectorAll('[role="treeitem"]:not([hidden]):not([aria-disabled="true"])')
|
|
295
474
|
);
|
|
296
475
|
const currentIndex = items.findIndex(
|
|
297
476
|
(el) => el.dataset.treeId === focusedId
|
|
298
477
|
);
|
|
299
|
-
if (currentIndex < 0 && items.length > 0 && ["ArrowDown", "ArrowUp", "Home", "End"].includes(e.key)) {
|
|
478
|
+
if (currentIndex < 0 && items.length > 0 && ["ArrowDown", "ArrowUp", "ArrowLeft", "ArrowRight", "Home", "End"].includes(e.key)) {
|
|
300
479
|
setFocusedId(items[0].dataset.treeId ?? null);
|
|
301
480
|
e.preventDefault();
|
|
302
481
|
return;
|
|
@@ -363,15 +542,17 @@ const TreeView = React.forwardRef(
|
|
|
363
542
|
}
|
|
364
543
|
}
|
|
365
544
|
},
|
|
366
|
-
[focusedId, expandedIds, toggleExpand, select, setFocusedId]
|
|
545
|
+
[focusedId, expandedIds, toggleExpand, select, setFocusedId, draggable, draggingId, handleKeyboardReorder]
|
|
367
546
|
);
|
|
368
547
|
const treeEl = /* @__PURE__ */ jsx(
|
|
369
548
|
"div",
|
|
370
549
|
{
|
|
550
|
+
...props,
|
|
371
551
|
ref: treeRef,
|
|
372
552
|
role: "tree",
|
|
373
553
|
"aria-multiselectable": selectionMode === "multiple" || void 0,
|
|
374
554
|
"aria-activedescendant": focusedId ? `${activeDescendantPrefix}treeitem-${focusedId}` : void 0,
|
|
555
|
+
"aria-describedby": [props["aria-describedby"], draggable ? reorderInstructionsId : void 0].filter(Boolean).join(" ") || void 0,
|
|
375
556
|
className: cn(
|
|
376
557
|
// TreeView root 不加任何 py——呼吸空間由外層容器負責:
|
|
377
558
|
// - 在 SidebarGroup 內: SidebarGroup py-2 提供
|
|
@@ -387,8 +568,15 @@ const TreeView = React.forwardRef(
|
|
|
387
568
|
},
|
|
388
569
|
onKeyDown: handleKeyDown,
|
|
389
570
|
onMouseDown: handleMouseDown,
|
|
571
|
+
onFocus: (e) => {
|
|
572
|
+
var _a;
|
|
573
|
+
(_a = props.onFocus) == null ? void 0 : _a.call(props, e);
|
|
574
|
+
if (e.target === e.currentTarget && !focusedId && treeRef.current) {
|
|
575
|
+
const first = treeRef.current.querySelector('[role="treeitem"][aria-selected="true"]:not([hidden]):not([aria-disabled="true"])') ?? treeRef.current.querySelector('[role="treeitem"]:not([hidden]):not([aria-disabled="true"])');
|
|
576
|
+
if (first) setFocusedId(first.dataset.treeId ?? null);
|
|
577
|
+
}
|
|
578
|
+
},
|
|
390
579
|
tabIndex: 0,
|
|
391
|
-
...props,
|
|
392
580
|
children
|
|
393
581
|
}
|
|
394
582
|
);
|
|
@@ -402,6 +590,10 @@ const TreeView = React.forwardRef(
|
|
|
402
590
|
onDragCancel: handleDragCancel,
|
|
403
591
|
children: [
|
|
404
592
|
treeEl,
|
|
593
|
+
draggable && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
594
|
+
/* @__PURE__ */ jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: reorderAnnouncement }),
|
|
595
|
+
/* @__PURE__ */ jsx("div", { id: reorderInstructionsId, className: "sr-only", children: announcements.instructions })
|
|
596
|
+
] }),
|
|
405
597
|
draggable && /* @__PURE__ */ jsx(DragOverlay, { dropAnimation: null, children: draggingId ? (() => {
|
|
406
598
|
const info = getNodeInfo(draggingId);
|
|
407
599
|
const IconComp = info == null ? void 0 : info.icon;
|
|
@@ -579,7 +771,8 @@ const TreeItem = React.forwardRef(
|
|
|
579
771
|
// - default text 維持 fg-secondary muted(跟 single 對齊 hierarchy)
|
|
580
772
|
// - selected → 視覺信號只在 checkbox(auto-render below),text 不變、bg 不變
|
|
581
773
|
// - 對齊 SelectMenu multi pattern(menu-item.tsx:194-195 selected → bg only;multi → checkbox only)
|
|
582
|
-
|
|
774
|
+
// multi-selected 也維持 fg-secondary(上方註解「text 不變」;原 !isSelected 條件讓 multi-selected 掉到繼承色)
|
|
775
|
+
!disabled && (!isSelected || selectionMode === "multiple") && "text-fg-secondary",
|
|
583
776
|
!disabled && isSelected && selectionMode === "single" && "text-foreground",
|
|
584
777
|
isDropTarget && (dropTarget == null ? void 0 : dropTarget.position) === "inside" && dropIndicatorInside,
|
|
585
778
|
!disabled && "hover:bg-neutral-hover hover:text-foreground",
|
|
@@ -630,7 +823,13 @@ const treeViewMeta = {
|
|
|
630
823
|
family: 1,
|
|
631
824
|
// Family 1(Menu item layout)消費者 — 對齊 tree-view.spec.md frontmatter family: 1
|
|
632
825
|
variants: {},
|
|
633
|
-
sizes: {
|
|
826
|
+
sizes: {
|
|
827
|
+
// 對齊 tree-view.spec.md frontmatter(compile-stories --check 驗 key 一致)
|
|
828
|
+
sm: { typography: "body", indent: 24 },
|
|
829
|
+
md: { typography: "body", indent: 24 },
|
|
830
|
+
// default
|
|
831
|
+
lg: { typography: "body-lg", indent: 28 }
|
|
832
|
+
},
|
|
634
833
|
// 'selected' = single-selection 持續選中(bg-neutral-selected + aria-selected);'active' 移除 —
|
|
635
834
|
// 全檔無 Tailwind 按壓 utility,無按壓專屬視覺態(2026-07-07 詞彙統一對抗稽核補修)。
|
|
636
835
|
states: ["default", "hover", "selected", "focus-visible", "disabled"],
|