@qijenchen/design-system 0.1.0-beta.82 → 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 +37 -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 +17 -5
- 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 +36 -0
- package/ds-canonical/fork/hooks/check_story_determinism.sh +39 -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 +20 -0
- package/ds-canonical/fork/preamble.md +22 -18
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +9 -3
- package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +3 -3
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +7 -0
- package/ds-canonical/fork/skills/performance-audit/SKILL.md +4 -2
- 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 +10 -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_benchmark_citation.sh +5 -3
- 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 +17 -5
- 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 +36 -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_propose_without_benchmark.sh +6 -2
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +55 -0
- package/ds-canonical/hooks/check_story_determinism.sh +39 -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_benchmark_citation.sh +3 -3
- 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_fork_user_plugin_install.sh +3 -1
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +41 -2
- package/ds-canonical/hooks/tests/test_check_ssot_header_declaration.sh +72 -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/spec-rules.md +1 -1
- package/ds-canonical/rules/story-rules.md +2 -2
- package/ds-canonical/rules/ui-development.md +4 -2
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +9 -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 +57 -68
- 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 +5 -0
- package/ds-canonical/skills/design-system-audit/SKILL.md +27 -26
- 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 +2 -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 +7 -5
- package/ds-canonical/skills/new-component/references/new-component-checklist.md +1 -1
- package/ds-canonical/skills/performance-audit/SKILL.md +2 -2
- 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 +10 -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 +14 -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
package/ds-story-manifest.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"scripts/composition-fidelity-visual-diff.mjs",
|
|
8
8
|
"product-workspace apps/template/src/AllDsComponents.stories.tsx (ImportSmoke portal → DS Storybook link)"
|
|
9
9
|
],
|
|
10
|
-
"generatedAt": "2026-07-
|
|
10
|
+
"generatedAt": "2026-07-14T14:23:30.051Z"
|
|
11
11
|
},
|
|
12
12
|
"components": {
|
|
13
13
|
"accordion": {
|
|
@@ -40,10 +40,8 @@
|
|
|
40
40
|
"alert": {
|
|
41
41
|
"tiers": {
|
|
42
42
|
"展示": [
|
|
43
|
-
"design-system-components-alert-展示--
|
|
44
|
-
"design-system-components-alert-展示--
|
|
45
|
-
"design-system-components-alert-展示--subtle-with-description",
|
|
46
|
-
"design-system-components-alert-展示--solid-with-description",
|
|
43
|
+
"design-system-components-alert-展示--single-line",
|
|
44
|
+
"design-system-components-alert-展示--with-description",
|
|
47
45
|
"design-system-components-alert-展示--corner-action-group",
|
|
48
46
|
"design-system-components-alert-展示--fixed"
|
|
49
47
|
],
|
|
@@ -90,11 +88,8 @@
|
|
|
90
88
|
"aspectratio": {
|
|
91
89
|
"tiers": {
|
|
92
90
|
"展示": [
|
|
93
|
-
"design-system-components-aspectratio-展示--hero-banner-16-x-9",
|
|
94
91
|
"design-system-components-aspectratio-展示--product-photo-4-x-3",
|
|
95
|
-
"design-system-components-aspectratio-展示--
|
|
96
|
-
"design-system-components-aspectratio-展示--ultrawide-21-x-9",
|
|
97
|
-
"design-system-components-aspectratio-展示--common-ratios"
|
|
92
|
+
"design-system-components-aspectratio-展示--ultrawide-21-x-9"
|
|
98
93
|
],
|
|
99
94
|
"設計規格": [
|
|
100
95
|
"design-system-components-aspectratio-設計規格--overview",
|
|
@@ -265,7 +260,7 @@
|
|
|
265
260
|
"設計原則": [
|
|
266
261
|
"design-system-components-calendar-設計原則--usage-guidance",
|
|
267
262
|
"design-system-components-calendar-設計原則--color-semantic",
|
|
268
|
-
"design-system-components-calendar-設計原則--
|
|
263
|
+
"design-system-components-calendar-設計原則--month-view-only-rule"
|
|
269
264
|
]
|
|
270
265
|
},
|
|
271
266
|
"openSnapshotIds": [],
|
|
@@ -388,7 +383,7 @@
|
|
|
388
383
|
"設計原則": [
|
|
389
384
|
"design-system-components-circularprogress-設計原則--usage-guidance",
|
|
390
385
|
"design-system-components-circularprogress-設計原則--indeterminate-vs-determinate-rule",
|
|
391
|
-
"design-system-components-circularprogress-設計原則--
|
|
386
|
+
"design-system-components-circularprogress-設計原則--consumption-scenario-rule",
|
|
392
387
|
"design-system-components-circularprogress-設計原則--size-match-context-rule"
|
|
393
388
|
]
|
|
394
389
|
},
|
|
@@ -451,7 +446,7 @@
|
|
|
451
446
|
"展示": [
|
|
452
447
|
"design-system-internal-command-展示--command-palette",
|
|
453
448
|
"design-system-internal-command-展示--inline-command",
|
|
454
|
-
"design-system-internal-command-展示--
|
|
449
|
+
"design-system-internal-command-展示--action-command",
|
|
455
450
|
"design-system-internal-command-展示--empty-state"
|
|
456
451
|
],
|
|
457
452
|
"設計規格": [
|
|
@@ -469,7 +464,6 @@
|
|
|
469
464
|
"datatable": {
|
|
470
465
|
"tiers": {
|
|
471
466
|
"展示": [
|
|
472
|
-
"design-system-components-datatable-展示--number-alignment",
|
|
473
467
|
"design-system-components-datatable-展示--column-resize",
|
|
474
468
|
"design-system-components-datatable-展示--column-reorder",
|
|
475
469
|
"design-system-components-datatable-展示--row-auto-height-inline-edit",
|
|
@@ -627,6 +621,7 @@
|
|
|
627
621
|
"design-system-components-dialog-展示--long-content",
|
|
628
622
|
"design-system-components-dialog-展示--destructive",
|
|
629
623
|
"design-system-components-dialog-展示--list-body",
|
|
624
|
+
"design-system-components-dialog-展示--header-actions",
|
|
630
625
|
"design-system-components-dialog-展示--with-tabs-in-header",
|
|
631
626
|
"design-system-components-dialog-展示--open-snapshot"
|
|
632
627
|
],
|
|
@@ -880,6 +875,22 @@
|
|
|
880
875
|
"openSnapshotIds": [],
|
|
881
876
|
"exception": null
|
|
882
877
|
},
|
|
878
|
+
"inlineedit": {
|
|
879
|
+
"tiers": {
|
|
880
|
+
"展示": [
|
|
881
|
+
"design-system-components-inlineedit-展示--task-title",
|
|
882
|
+
"design-system-components-inlineedit-展示--metadata-fields",
|
|
883
|
+
"design-system-components-inlineedit-展示--states",
|
|
884
|
+
"design-system-components-inlineedit-展示--select-tag-field",
|
|
885
|
+
"design-system-components-inlineedit-展示--multiline-description",
|
|
886
|
+
"design-system-components-inlineedit-展示--vertical-field-form"
|
|
887
|
+
],
|
|
888
|
+
"設計規格": [],
|
|
889
|
+
"設計原則": []
|
|
890
|
+
},
|
|
891
|
+
"openSnapshotIds": [],
|
|
892
|
+
"exception": null
|
|
893
|
+
},
|
|
883
894
|
"input": {
|
|
884
895
|
"tiers": {
|
|
885
896
|
"展示": [
|
|
@@ -941,6 +952,7 @@
|
|
|
941
952
|
"design-system-internal-menu-展示--with-description",
|
|
942
953
|
"design-system-internal-menu-展示--avatar-inline",
|
|
943
954
|
"design-system-internal-menu-展示--avatar-block",
|
|
955
|
+
"design-system-internal-menu-展示--with-start-content",
|
|
944
956
|
"design-system-internal-menu-展示--states",
|
|
945
957
|
"design-system-internal-menu-展示--multi-select",
|
|
946
958
|
"design-system-internal-menu-展示--groups",
|
|
@@ -1160,8 +1172,7 @@
|
|
|
1160
1172
|
"展示": [
|
|
1161
1173
|
"design-system-components-radiogroup-展示--modes",
|
|
1162
1174
|
"design-system-components-radiogroup-展示--vertical-group",
|
|
1163
|
-
"design-system-components-radiogroup-展示--horizontal"
|
|
1164
|
-
"design-system-components-radiogroup-展示--disabled"
|
|
1175
|
+
"design-system-components-radiogroup-展示--horizontal"
|
|
1165
1176
|
],
|
|
1166
1177
|
"設計規格": [
|
|
1167
1178
|
"design-system-components-radiogroup-設計規格--overview",
|
|
@@ -1259,6 +1270,7 @@
|
|
|
1259
1270
|
"tiers": {
|
|
1260
1271
|
"展示": [
|
|
1261
1272
|
"design-system-components-select-展示--modes",
|
|
1273
|
+
"design-system-components-select-展示--hug-width",
|
|
1262
1274
|
"design-system-components-select-展示--display-mode",
|
|
1263
1275
|
"design-system-components-select-展示--size-alignment",
|
|
1264
1276
|
"design-system-components-select-展示--clearable",
|
|
@@ -1337,7 +1349,6 @@
|
|
|
1337
1349
|
"展示": [
|
|
1338
1350
|
"design-system-components-separator-展示--horizontal",
|
|
1339
1351
|
"design-system-components-separator-展示--vertical",
|
|
1340
|
-
"design-system-components-separator-展示--in-dropdown-menu",
|
|
1341
1352
|
"design-system-components-separator-展示--between-sections"
|
|
1342
1353
|
],
|
|
1343
1354
|
"設計規格": [
|
|
@@ -1413,7 +1424,6 @@
|
|
|
1413
1424
|
"skeleton": {
|
|
1414
1425
|
"tiers": {
|
|
1415
1426
|
"展示": [
|
|
1416
|
-
"design-system-components-skeleton-展示--default",
|
|
1417
1427
|
"design-system-components-skeleton-展示--user-profile-card",
|
|
1418
1428
|
"design-system-components-skeleton-展示--task-list-loading",
|
|
1419
1429
|
"design-system-components-skeleton-展示--table-row-loading",
|
|
@@ -1655,7 +1665,6 @@
|
|
|
1655
1665
|
"展示": [
|
|
1656
1666
|
"design-system-components-tooltip-展示--default",
|
|
1657
1667
|
"design-system-components-tooltip-展示--non-button-trigger",
|
|
1658
|
-
"design-system-components-tooltip-展示--placement",
|
|
1659
1668
|
"design-system-components-tooltip-展示--long-text"
|
|
1660
1669
|
],
|
|
1661
1670
|
"設計規格": [
|
|
@@ -1702,6 +1711,6 @@
|
|
|
1702
1711
|
"exception": null
|
|
1703
1712
|
}
|
|
1704
1713
|
},
|
|
1705
|
-
"totalComponents":
|
|
1706
|
-
"totalStories":
|
|
1714
|
+
"totalComponents": 64,
|
|
1715
|
+
"totalStories": 919
|
|
1707
1716
|
}
|
package/llms-full.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @qijenchen/design-system — 完整設計參考(llms-full)
|
|
2
2
|
|
|
3
|
-
> 全 component / pattern 的 variants / sizes / 禁止事項。build-time 從 spec.md frontmatter 生成,禁手改。v0.1.0-beta.
|
|
3
|
+
> 全 component / pattern 的 variants / sizes / 禁止事項。build-time 從 spec.md frontmatter 生成,禁手改。v0.1.0-beta.84。
|
|
4
4
|
|
|
5
5
|
# Components
|
|
6
6
|
|
|
@@ -115,6 +115,9 @@ Source(AI 讀此看官方範例): src/components/Checkbox/
|
|
|
115
115
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
116
116
|
Source(AI 讀此看官方範例): src/components/Chip/
|
|
117
117
|
|
|
118
|
+
### Sizes
|
|
119
|
+
- **sm**: 單一尺寸(h-field-sm 28/32 依 density、icon 16、text-body)— 對齊 chip.tsx componentMeta
|
|
120
|
+
|
|
118
121
|
## CircularProgress(family self-contained)
|
|
119
122
|
|
|
120
123
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
@@ -194,11 +197,24 @@ Source(AI 讀此看官方範例): src/components/FileUpload/
|
|
|
194
197
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
195
198
|
Source(AI 讀此看官方範例): src/components/FileViewer/
|
|
196
199
|
|
|
200
|
+
## InlineEdit(family composite)
|
|
201
|
+
|
|
202
|
+
Storybook: https://ajenchen-design-system.netlify.app
|
|
203
|
+
Source(AI 讀此看官方範例): src/components/InlineEdit/
|
|
204
|
+
|
|
197
205
|
## Input(family 4)
|
|
198
206
|
|
|
199
207
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
200
208
|
Source(AI 讀此看官方範例): src/components/Input/
|
|
201
209
|
|
|
210
|
+
### Variants
|
|
211
|
+
- **default**: Field wrapper 完整 chrome(bg-surface + border + hover/focus 回饋)— 表單 / Field 內嵌
|
|
212
|
+
|
|
213
|
+
### Sizes
|
|
214
|
+
- **sm**: field-height 28、icon 16、text-body
|
|
215
|
+
- **md**: default 一般表單(field-height 32、icon 16)
|
|
216
|
+
- **lg**: touch / 大字級(field-height 36、icon 20、text-body-lg)
|
|
217
|
+
|
|
202
218
|
## LinkInput(family 4)
|
|
203
219
|
|
|
204
220
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
@@ -401,6 +417,11 @@ Source(AI 讀此看官方範例): src/components/Tooltip/
|
|
|
401
417
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
402
418
|
Source(AI 讀此看官方範例): src/components/TreeView/
|
|
403
419
|
|
|
420
|
+
### Sizes
|
|
421
|
+
- **sm**: 緊湊清單(與 md 同視覺:text-body、indent 24;保留供密度語意)
|
|
422
|
+
- **md**: default 一般導覽樹
|
|
423
|
+
- **lg**: touch / 大字級(text-body-lg、px-4 py-2、indent 28)
|
|
424
|
+
|
|
404
425
|
# Patterns
|
|
405
426
|
|
|
406
427
|
## action-bar
|
package/llms.txt
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @qijenchen/design-system
|
|
2
2
|
|
|
3
3
|
> World-class React design system(Radix/shadcn + Tailwind v4 + 自訂 design token)。
|
|
4
|
-
>
|
|
4
|
+
> 57 components + 4 public patterns + design tokens。v0.1.0-beta.84。
|
|
5
5
|
|
|
6
6
|
本檔由 source(spec.md frontmatter + Storybook index)build-time 自動生成,**禁手改**(CI --check drift gate 守)。
|
|
7
7
|
每元件 / pattern 的完整 variants / sizes / 禁止事項 全文見 [llms-full.txt](./llms-full.txt)。
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
- [Carousel](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Carousel
|
|
22
22
|
- [Chart](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Chart
|
|
23
23
|
- [Checkbox](https://ajenchen-design-system.netlify.app): sizes:sm/md/lg — src:components/Checkbox
|
|
24
|
-
- [Chip](https://ajenchen-design-system.netlify.app):
|
|
24
|
+
- [Chip](https://ajenchen-design-system.netlify.app): sizes:sm — src:components/Chip
|
|
25
25
|
- [CircularProgress](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/CircularProgress
|
|
26
26
|
- [Coachmark](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Coachmark
|
|
27
27
|
- [Combobox](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Combobox
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
- [FileItem](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/FileItem
|
|
38
38
|
- [FileUpload](https://ajenchen-design-system.netlify.app): variants:dropzone/button — src:components/FileUpload
|
|
39
39
|
- [FileViewer](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/FileViewer
|
|
40
|
-
- [
|
|
40
|
+
- [InlineEdit](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/InlineEdit
|
|
41
|
+
- [Input](https://ajenchen-design-system.netlify.app): variants:default;sizes:sm/md/lg — src:components/Input
|
|
41
42
|
- [LinkInput](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/LinkInput
|
|
42
43
|
- [NumberInput](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/NumberInput
|
|
43
44
|
- [Pagination](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Pagination
|
|
@@ -63,7 +64,7 @@
|
|
|
63
64
|
- [TimePicker](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/TimePicker
|
|
64
65
|
- [Toast](https://ajenchen-design-system.netlify.app): variants:neutral/info/success/warning/error — src:components/Toast
|
|
65
66
|
- [Tooltip](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Tooltip
|
|
66
|
-
- [TreeView](https://ajenchen-design-system.netlify.app):
|
|
67
|
+
- [TreeView](https://ajenchen-design-system.netlify.app): sizes:sm/md/lg — src:components/TreeView
|
|
67
68
|
|
|
68
69
|
## Patterns
|
|
69
70
|
- [action-bar](https://ajenchen-design-system.netlify.app): 跨元件 anatomy / 設計參照 pattern — src:patterns/action-bar
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qijenchen/design-system",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.84",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "World-class design system — components, patterns, tokens, hooks (single source of truth for team distribution).",
|
|
6
6
|
"type": "module",
|
|
@@ -36,7 +36,10 @@
|
|
|
36
36
|
"types": "./dist/patterns/*/index.d.ts",
|
|
37
37
|
"import": "./dist/patterns/*/index.js"
|
|
38
38
|
},
|
|
39
|
-
"./tokens/*":
|
|
39
|
+
"./tokens/*": {
|
|
40
|
+
"types": "./dist/tokens/*.d.ts",
|
|
41
|
+
"import": "./dist/tokens/*.js"
|
|
42
|
+
},
|
|
40
43
|
"./hooks/*": {
|
|
41
44
|
"types": "./dist/hooks/*.d.ts",
|
|
42
45
|
"import": "./dist/hooks/*.js"
|
|
@@ -100,7 +103,8 @@
|
|
|
100
103
|
"react-zoom-pan-pinch": "^4.0.3",
|
|
101
104
|
"recharts": "^3.8.1",
|
|
102
105
|
"sonner": "^2.0.7",
|
|
103
|
-
"tailwind-merge": "^3.5.0"
|
|
106
|
+
"tailwind-merge": "^3.5.0",
|
|
107
|
+
"tw-animate-css": "^1.4.0"
|
|
104
108
|
},
|
|
105
109
|
"peerDependencies": {
|
|
106
110
|
"react": ">=18.0.0",
|
|
@@ -109,7 +109,7 @@ export const UsageGuidance: Story = {
|
|
|
109
109
|
title='Accordion — 獨立收合多段(每段各自是否展開)'
|
|
110
110
|
note='每個 item 是獨立主題,使用者依興趣選擇展開。不是互斥,而是「多段內容,多數時間只想看其中一段」。'
|
|
111
111
|
>
|
|
112
|
-
<Accordion type='
|
|
112
|
+
<Accordion type='multiple'>
|
|
113
113
|
<AccordionItem value='pricing'>
|
|
114
114
|
<AccordionTrigger>付款週期與折扣</AccordionTrigger>
|
|
115
115
|
<AccordionContent>年付享 20% 折扣。</AccordionContent>
|
|
@@ -162,7 +162,10 @@ export const AdvancedOptions: Story = {
|
|
|
162
162
|
placeholder="一句話描述此專案"
|
|
163
163
|
/>
|
|
164
164
|
</div>
|
|
165
|
-
|
|
165
|
+
{/* 2026-07-14 Dim 68 修:原單一 AccordionItem 違反 accordion.spec.md「❌ 單一 item 不用
|
|
166
|
+
Accordion」(單區塊該用 <details>,見 principles「單一項目不用 Accordion」)。補第二個
|
|
167
|
+
可獨立收合的低頻設定段(type="multiple" 非互斥),成為合法多段收合場景。 */}
|
|
168
|
+
<Accordion type="multiple">
|
|
166
169
|
<AccordionItem value="advanced">
|
|
167
170
|
<AccordionTrigger>進階選項</AccordionTrigger>
|
|
168
171
|
<AccordionContent>
|
|
@@ -184,6 +187,18 @@ export const AdvancedOptions: Story = {
|
|
|
184
187
|
</div>
|
|
185
188
|
</AccordionContent>
|
|
186
189
|
</AccordionItem>
|
|
190
|
+
<AccordionItem value="notifications">
|
|
191
|
+
<AccordionTrigger>通知設定</AccordionTrigger>
|
|
192
|
+
<AccordionContent>
|
|
193
|
+
<div className="flex flex-col gap-1">
|
|
194
|
+
<label className="text-body text-foreground">狀態變更通知對象</label>
|
|
195
|
+
<input
|
|
196
|
+
className="h-field-md border border-border rounded-md px-3 text-body"
|
|
197
|
+
placeholder="例:專案成員 + 關注者"
|
|
198
|
+
/>
|
|
199
|
+
</div>
|
|
200
|
+
</AccordionContent>
|
|
201
|
+
</AccordionItem>
|
|
187
202
|
</Accordion>
|
|
188
203
|
</div>
|
|
189
204
|
),
|
|
@@ -56,7 +56,7 @@ export const UsageGuidance: Story = {
|
|
|
56
56
|
<LinkTo kind="Design System/Components/Alert/展示" name="右上角操作群組"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">右上角操作群組</span></LinkTo>
|
|
57
57
|
</li>
|
|
58
58
|
</ul>
|
|
59
|
-
<p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(
|
|
59
|
+
<p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見本頁下方「vs 近親」段)。</p>
|
|
60
60
|
</div>
|
|
61
61
|
|
|
62
62
|
{/* vs 近親 — VsToastVsDialogRule — 原 VsToastVsDialogRule */}
|
|
@@ -83,7 +83,7 @@ Alert 是**持久性通知**,嵌入在頁面中。用於系統狀態提示、
|
|
|
83
83
|
- ❌ **不把 error form validation 做成 Alert**:欄位級錯誤必須貼近發生位置(FieldError),使用者才能快速定位;頁面級 Alert 只放非欄位的整體錯誤(如提交失敗、權限不足)
|
|
84
84
|
- ❌ **Alert 不疊 Alert**:同區出現多個 Alert 視覺雜訊重,整理成一組 messages 或合併為單一 Alert with list
|
|
85
85
|
- ❌ **destructive 操作確認不用 Alert**:刪除 / 離開等需要明確確認的動作用 Dialog,Alert 無法承載 confirm / cancel 雙按鈕的阻斷流程
|
|
86
|
-
- ❌
|
|
86
|
+
- ❌ **右側操作區(endContent + close X)內不混不同分量的 action**:endContent(CTA / refresh 等)與 close X 同渲染進單一右上 suffix(對齊第一行、靠右);close X 必用 `<Button iconOnly dismiss size="xs" />`(不是 Inline Action、不是自刻 `<button><X /></button>`,見下方 Chrome corner close X canonical);同一 suffix 內所有 action 必同分量(統一 Button iconOnly xs),不可混 Inline Action + Button iconOnly,否則違反 same-row consistency(box size 與視覺分量不同,造成 gap / 對齊錯亂),完整規則見 `patterns/element-anatomy/inline-action.spec.md`「Same-row consistency rule(防混用)」節
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -92,7 +92,7 @@ Alert 是**持久性通知**,嵌入在頁面中。用於系統狀態提示、
|
|
|
92
92
|
- **一般提示(neutral / info / success)**:`role="status"` + `aria-live="polite"`——screen reader 在空閒時讀出 Alert 內容,不中斷使用者目前動作
|
|
93
93
|
- **緊急提示(warning / error)**:`role="alert"` + `aria-live="assertive"`——立即中斷 screen reader 目前朗讀讀出內容。「緊急與否」的界線即 variant 選擇本身:選 warning / error 即 assertive,依 variant 自動套用,無 per-instance 切換 API
|
|
94
94
|
- **Close X 按鈕**:必須有 `aria-label`(如「關閉通知」),實作見下方「Chrome corner close X canonical」
|
|
95
|
-
- **CTA
|
|
95
|
+
- **CTA 按鈕**:透過 `endContent` 放進右側操作區(與 close X 同列,靠右上)size 固定為 `xs` tertiary,文字描述動作(「前往設定」「立即更新」)
|
|
96
96
|
|
|
97
97
|
---
|
|
98
98
|
|
|
@@ -111,13 +111,12 @@ SSOT 詳見 `patterns/element-anatomy/inline-action.spec.md`「Predicate:Inline
|
|
|
111
111
|
|
|
112
112
|
### Corner action group 佈局 canonical
|
|
113
113
|
|
|
114
|
-
Alert
|
|
114
|
+
Alert 右側操作區(單一 suffix,對齊第一行靠右)可承載多個 action —— endContent 內容 + close X 並排:
|
|
115
115
|
|
|
116
116
|
```
|
|
117
|
-
┌─ Alert ────────────────── [⟲] │ [X] ┐ ←
|
|
118
|
-
│ [icon] Title │
|
|
117
|
+
┌─ Alert ────────────────── [⟲] │ [X] ┐ ← 右側操作區 action group(endContent + close X,Button xs)
|
|
118
|
+
│ [icon] Title │ endContent(CTA / refresh / share 等)+ ButtonDivider + close X
|
|
119
119
|
│ Description │
|
|
120
|
-
│ [CTA1] [CTA2] │ ← body action row(Button xs tertiary)
|
|
121
120
|
└──────────────────────────────────────┘
|
|
122
121
|
```
|
|
123
122
|
|
|
@@ -159,12 +158,11 @@ Subtle vs Solid 的完整 variant × theme class 對照見 anatomy `ColorMatrix`
|
|
|
159
158
|
|
|
160
159
|
完整 placement 對照見 anatomy `PlacementMatrix` story。
|
|
161
160
|
|
|
162
|
-
## 為何無
|
|
161
|
+
## 為何無 SizeMatrix
|
|
163
162
|
|
|
164
|
-
- **無 Inspector**:Alert 的關鍵決策維度是 `variant`(5 色)× `appearance`(subtle / solid)× `placement`(inline / fixed),已在 `ColorMatrix` 完整呈現 variant × appearance 矩陣,再加 `PlacementMatrix` 呈現 placement——互動切換式 Inspector 不會比這兩張矩陣更能傳達 Alert 的設計規格。
|
|
165
163
|
- **無 SizeMatrix**:Alert 無 `size` prop,其視覺尺寸繼承自 Notice primitive(14px body / 16px icon / 固定 py),字級與垂直 padding 不隨 density 變動;僅 `placement="fixed"` 的水平 px 走 `--layout-space-loose`(density-aware,跟周圍 loose-padding 佈局對齊,見 alert.tsx)。尺寸規格由 `Notice` spec own。改 Notice 時 Alert 自動跟進,不需要 Alert 有獨立 SizeMatrix。
|
|
166
164
|
|
|
167
|
-
對應 anatomy story
|
|
165
|
+
對應 anatomy story:`Overview` + `Inspector` + `ColorMatrix` + `PlacementMatrix` + `StateBehavior` + `Accessibility`(6-canonical;Alert 的 `Inspector` 互動切換 variant × appearance × placement × dismissible,SizeMatrix N/A 見上)。
|
|
168
166
|
|
|
169
167
|
---
|
|
170
168
|
|
|
@@ -181,7 +179,7 @@ Subtle vs Solid 的完整 variant × theme class 對照見 anatomy `ColorMatrix`
|
|
|
181
179
|
## 邊界案例
|
|
182
180
|
|
|
183
181
|
- **Disabled(dismiss button)**:Alert **不提供 dismiss 停用 API**——banner dismiss 恆可用(對齊 Polaris / Material Banner:通知關閉鈕應永遠可按)。「恆可用」指**已渲染的 X 永遠可按**;X 本身僅在傳 `onDismiss` 時渲染(否則是死按鈕假 affordance,2026-07-05 D4,見「Multi corner action 場景」段 + `../Notice/notice.spec.md`「邊界案例」)。Alert 本身亦無 `disabled` prop(持久通知不該被禁用)。若需防止 close action(API in-flight)被雙擊,consumer 在 `onDismiss` 內自行 debounce / 加上層鎖,不在 UI 層加 disable(Alert 不提供 dismiss 停用 API、也不把 disabled 轉傳給內部 dismiss Button;Button primitive 本身支援 disabled,但 Alert 刻意不開洞)。
|
|
184
|
-
- **Loading**:Alert 本身不需 loading state(非 async surface);若
|
|
182
|
+
- **Loading**:Alert 本身不需 loading state(非 async surface);若 `endContent` 內的 CTA 在 async 動作中,該 Button 自己處理 `loading` prop。
|
|
185
183
|
- **Empty / icon-only**:Alert 必有 `title`(API contract),無 empty 場景;若無 description 則僅顯示 title + icon,layout 自動收斂。
|
|
186
184
|
- **極長字串**:title 單行 truncate、description 自由換行不截斷(皆繼承 ItemContent 預設);description 超過 2–3 行屬誤用,改 Dialog(見禁止事項)。
|
|
187
185
|
|
|
@@ -34,38 +34,38 @@ const D: Record<string, string> = {
|
|
|
34
34
|
|
|
35
35
|
const actionBtn = <Button variant="tertiary" size="xs">查看詳情</Button>
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
// 2026-07-14 audit Dim 28(story 拆分原則):原 Subtle/Solid × SingleLine/WithDescription
|
|
38
|
+
// 四 story 依 appearance variant 拆細 = 「≥2 variants 拆細」反 pattern(該合對照 grid);
|
|
39
|
+
// 合併為單行 / 含說明兩 story,各以 subtle vs solid 並排對照(appearance trait grid 本體
|
|
40
|
+
// 由 anatomy ColorMatrix owns)。
|
|
41
|
+
export const SingleLine = {
|
|
42
|
+
name: '單行(低調 vs 實心對照)',
|
|
39
43
|
render: () => (
|
|
40
|
-
<div className="
|
|
41
|
-
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
<div className="flex flex-col gap-3 max-w-lg">
|
|
50
|
-
{ALL.map((v) => <Alert key={v} variant={v} appearance="solid" title={L[v]} endContent={actionBtn} />)}
|
|
51
|
-
</div>
|
|
52
|
-
),
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export const SubtleWithDescription = {
|
|
56
|
-
name: '低調含說明文字',
|
|
57
|
-
render: () => (
|
|
58
|
-
<div className="flex flex-col gap-3 max-w-lg">
|
|
59
|
-
{ALL.map((v) => <Alert key={v} variant={v} appearance="subtle" title={L[v]} description={D[v]} endContent={actionBtn} />)}
|
|
44
|
+
<div className="grid grid-cols-2 gap-6 max-w-5xl">
|
|
45
|
+
{(['subtle', 'solid'] as const).map((appearance) => (
|
|
46
|
+
<div key={appearance} className="flex flex-col gap-3">
|
|
47
|
+
<span className="text-caption text-fg-muted font-medium">
|
|
48
|
+
{appearance === 'subtle' ? 'Subtle — 頁面內嵌預設(淺底 + 邊框)' : 'Solid — 高強調(飽和底色)'}
|
|
49
|
+
</span>
|
|
50
|
+
{ALL.map((v) => <Alert key={v} variant={v} appearance={appearance} title={L[v]} endContent={actionBtn} />)}
|
|
51
|
+
</div>
|
|
52
|
+
))}
|
|
60
53
|
</div>
|
|
61
54
|
),
|
|
62
55
|
}
|
|
63
56
|
|
|
64
|
-
export const
|
|
65
|
-
name: '
|
|
57
|
+
export const WithDescription = {
|
|
58
|
+
name: '含說明文字(低調 vs 實心對照)',
|
|
66
59
|
render: () => (
|
|
67
|
-
<div className="
|
|
68
|
-
{
|
|
60
|
+
<div className="grid grid-cols-2 gap-6 max-w-5xl">
|
|
61
|
+
{(['subtle', 'solid'] as const).map((appearance) => (
|
|
62
|
+
<div key={appearance} className="flex flex-col gap-3">
|
|
63
|
+
<span className="text-caption text-fg-muted font-medium">
|
|
64
|
+
{appearance === 'subtle' ? 'Subtle — 頁面內嵌預設(淺底 + 邊框)' : 'Solid — 高強調(飽和底色)'}
|
|
65
|
+
</span>
|
|
66
|
+
{ALL.map((v) => <Alert key={v} variant={v} appearance={appearance} title={L[v]} description={D[v]} endContent={actionBtn} />)}
|
|
67
|
+
</div>
|
|
68
|
+
))}
|
|
69
69
|
</div>
|
|
70
70
|
),
|
|
71
71
|
}
|
|
@@ -99,8 +99,8 @@ export const CornerActionGroup = {
|
|
|
99
99
|
</div>
|
|
100
100
|
|
|
101
101
|
<span className="text-caption text-fg-muted">
|
|
102
|
-
✅
|
|
103
|
-
❌
|
|
102
|
+
✅ 右上角這排(重新整理、分享、關閉)全用同一種最小尺寸的純圖示按鈕,並用分隔線分成兩群,保持同一列視覺一致。
|
|
103
|
+
❌ 不要一群用純圖示按鈕、另一群用列內動作,會不整齊。
|
|
104
104
|
</span>
|
|
105
105
|
</div>
|
|
106
106
|
),
|
|
@@ -12,7 +12,7 @@ import { Notice, useInverseTheme, SUBTLE_ICON_COLOR, type NoticeVariant } from '
|
|
|
12
12
|
* 在 theme boundary 設 text-foreground 強制 re-resolve。
|
|
13
13
|
*
|
|
14
14
|
* ── Appearance ──
|
|
15
|
-
* subtle: 淺底色 + 四邊 1px border(色相
|
|
15
|
+
* subtle: 淺底色 + 四邊 1px border(色相 text 色 = icon 同色,見下方 SUBTLE_CONTAINER 註)。不設 data-theme,跟隨頁面。
|
|
16
16
|
* solid: 跟 Toast 對齊:
|
|
17
17
|
* neutral → data-theme={inverse} + bg-surface-raised(同層翻轉)
|
|
18
18
|
* info/success/error → bg on outer, data-theme="dark" on inner
|
|
@@ -80,6 +80,8 @@ export const MAIN_NAV = [
|
|
|
80
80
|
export const WorkspaceBrand = () => (
|
|
81
81
|
<div className="flex items-center gap-2 min-w-0">
|
|
82
82
|
{/* 24 per header-canonical.spec.md 4.5 chrome header avatar canonical; sync with `--chrome-header-avatar-size` */}
|
|
83
|
+
{/* Workspace brand = 組織識別(非人)→ 首字 letter mark;2026-07-08 人像真實化 sweep 刻意保留,
|
|
84
|
+
真實人像僅套用於 person avatar(組織用人臉照片會誤導身份) */}
|
|
83
85
|
<Avatar size={24} shape="square" color="blue" solid alt="Acme Inc" />
|
|
84
86
|
<span className="text-body-lg font-medium truncate group-data-[collapsible=icon]:hidden">Acme Inc</span>
|
|
85
87
|
</div>
|
|
@@ -93,13 +95,14 @@ export const UserFooter = () => (
|
|
|
93
95
|
<SidebarMenuButton asChild>
|
|
94
96
|
<div role="group" aria-label="當前使用者">
|
|
95
97
|
<ItemAvatar
|
|
98
|
+
src="https://i.pravatar.cc/48?u=EMP-1001"
|
|
96
99
|
alt="Alan Chen"
|
|
97
100
|
color="blue"
|
|
98
101
|
hoverCard={
|
|
99
102
|
<ProfileCard
|
|
100
103
|
name="Alan Chen"
|
|
101
104
|
subtitle="Design|D-0042"
|
|
102
|
-
avatar={{ alt: 'Alan Chen', color: 'blue' }}
|
|
105
|
+
avatar={{ src: 'https://i.pravatar.cc/80?u=EMP-1001', alt: 'Alan Chen', color: 'blue' }}
|
|
103
106
|
status="online"
|
|
104
107
|
actions={<ProfileCardDefaultActions />}
|
|
105
108
|
/>
|
|
@@ -190,7 +193,7 @@ export function AcmeSidebar({
|
|
|
190
193
|
// (非 ProfileCard——ProfileCard 是看「別人」的人員卡,預設動作 Chat/通話用在自己身上不對)。
|
|
191
194
|
// 消費 SSOT:
|
|
192
195
|
// - <Avatar size={24}>(header-canonical.spec.md 4.5 chrome header avatar:brand + account 同 24px;
|
|
193
|
-
// sync with --chrome-header-avatar-size)。互動感由 focus ring
|
|
196
|
+
// sync with --chrome-header-avatar-size)。互動感由 focus-visible ring 提供(無 hover bg,chrome 輕量 entry),不放大到 field height。
|
|
194
197
|
// - <DropdownMenu>(個人資料 / 設定 / 登出;baseline = dropdown-menu.stories.tsx Groups)
|
|
195
198
|
// - 放置 / 邊距對稱 canonical → app-shell.spec.md「帳號入口(Account entry)放置 SSOT」段
|
|
196
199
|
export function AccountMenu() {
|
|
@@ -203,7 +206,7 @@ export function AccountMenu() {
|
|
|
203
206
|
className="flex items-center justify-center rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1"
|
|
204
207
|
>
|
|
205
208
|
{/* 24 per header-canonical.spec.md 4.5 chrome header avatar canonical(brand + account 同尺寸); sync with --chrome-header-avatar-size */}
|
|
206
|
-
<Avatar size={24} alt="Alan Chen" color="blue" />
|
|
209
|
+
<Avatar size={24} src="https://i.pravatar.cc/48?u=EMP-1001" alt="Alan Chen" color="blue" />
|
|
207
210
|
</button>
|
|
208
211
|
</DropdownMenuTrigger>
|
|
209
212
|
<DropdownMenuContent align="end">
|
|
@@ -205,7 +205,7 @@ function CustomAside() {
|
|
|
205
205
|
- **Scroll ownership**:Aside 自帶 scroll(body 包 `<ScrollArea>` primitive + `min-h-0`,per Atlassian Layout 慣例),main 自帶 scroll,**禁止** body-level scroll
|
|
206
206
|
|
|
207
207
|
**Modal overlay** 行為:
|
|
208
|
-
- 消費既有 `sheet.spec.md` canonical(從右滑出 + Esc 關 + click-outside 關 + focus trap
|
|
208
|
+
- 消費既有 `sheet.spec.md` canonical(從右滑出 + Esc 關 + click-outside 關 + focus trap);**restore focus 由 AppShellAside 自建**(controlled Sheet 無 SheetTrigger → Radix 內建回焦失效;開啟時 snapshot opener、關閉還原、opener 已卸載 fallback `#app-shell-main`,WCAG 2.4.3,2026-07-14)
|
|
209
209
|
- **title prop required**(per `sheet.spec.md`「禁止事項」禁無 title — `aria-labelledby` 強制)
|
|
210
210
|
- 跟 Sidebar mobile fallback 同 SSOT
|
|
211
211
|
|
|
@@ -263,7 +263,7 @@ Main 內塞什麼(table / field / card / page header / list)的 layout + spacing
|
|
|
263
263
|
| **`⌘.`(macOS)/ `Ctrl+.`(Windows)** | Toggle aside | Linear convention(新加) |
|
|
264
264
|
| **Skip-to-main link** | `Tab` 第一站 focus 「Skip to content」link → `main` | A11y WCAG 2.4.1 bypass blocks;對齊 Atlassian Layout skip-link |
|
|
265
265
|
|
|
266
|
-
|
|
266
|
+
**`⌘B`** 消費既有 Sidebar SSOT 機制(Sidebar 內建 `useEffect` + `window.addEventListener('keydown')`,AppShell **不重複 register**)。**`⌘.`** 為 AppShell **自有** `window` keydown listener(`app-shell.tsx:179-188`,沿用相同 pattern 形態,但屬**新註冊**、非消費 Sidebar — 對齊上表「新加」標記)。此 AppShell 自有 listener 目前**未含** Sidebar handler 的 IME composition / input-textarea guard(打字時 `⌘.` 仍會觸發 — 已知 gap)。
|
|
267
267
|
|
|
268
268
|
---
|
|
269
269
|
|
|
@@ -321,8 +321,8 @@ Main 內塞什麼(table / field / card / page header / list)的 layout + spacing
|
|
|
321
321
|
## Consumer 紀律
|
|
322
322
|
|
|
323
323
|
- ❌ 禁:`<AppShell>` 內 wrap 第二個 `<AppShell>`(nested shell 違反「整頁框架」單例性)
|
|
324
|
-
- ❌ 禁:`sidebar={<div>...</div>}`(應傳 `<Sidebar>` primitive,確保視覺 SSOT
|
|
325
|
-
- ❌ 禁:`header={<header>...</header>}`(應傳 `<ChromeHeader>` 或消費 `header-canonical` 派生 header
|
|
324
|
+
- ❌ 禁:`sidebar={<div>...</div>}`(應傳 `<Sidebar>` primitive,確保視覺 SSOT。raw-element slot 簽名(`sidebar={<div>}` / `header={<header>}` 等)由 `check_consumer_app_invariants.sh` Pattern 9 機械攔(P0,2026-06-12 加);TS 型別層仍收 ReactNode 不強制 — React 型別強制易被 wrapper 包一層繞過,世界級 shell 元件皆收 ReactNode;wrapper 包一層繞過的殘餘 case 靠 story 示範 + audit 把關。2026-06-10 user 拍板 2a:措辭「必」→「應」對齊 code 真實)
|
|
325
|
+
- ❌ 禁:`header={<header>...</header>}`(應傳 `<ChromeHeader>` 或消費 `header-canonical` 派生 header;同上 — Pattern 9 同攔 header raw-element,TS 型別層不強制)
|
|
326
326
|
- ❌ 禁:AppShell.Main 自加 padding(違反 layoutSpace 規則 1B)
|
|
327
327
|
- ❌ 禁:AppShellAside header 加第二行 / actions(header = 單行 title + close X,API typed `title: string` 結構鎖;說明文字歸 aside body — 2026-06-12 fork-drift 防線)
|
|
328
328
|
- ✅ 必:`layout` mode 在 product 啟動時固定,**不在 runtime 切換**(切換 = product 角色變動 = 應該重 mount app)
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
Sheet,
|
|
19
19
|
SheetContent,
|
|
20
20
|
SheetTitle,
|
|
21
|
+
handleSheetOpenAutoFocus,
|
|
21
22
|
} from '@/design-system/components/Sheet/sheet'
|
|
22
23
|
import { Button } from '@/design-system/components/Button/button'
|
|
23
24
|
import { ScrollArea } from '@/design-system/components/ScrollArea/scroll-area'
|
|
@@ -32,7 +33,7 @@ type AppShellLayout = 'primary-sidebar' | 'primary-header'
|
|
|
32
33
|
export interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
33
34
|
/** primary-sidebar (Linear/Notion 派) | primary-header (GitHub/Slack 派);預設 primary-sidebar */
|
|
34
35
|
layout?: AppShellLayout
|
|
35
|
-
/** Sidebar 元素(
|
|
36
|
+
/** Sidebar 元素(應傳 Sidebar primitive,per Consumer 紀律;型別 optional 不機械強制,對齊 spec「應」措辭)*/
|
|
36
37
|
sidebar?: React.ReactNode
|
|
37
38
|
/**
|
|
38
39
|
* Local page header(永遠 render 在 main column 頂部,當前頁 actions / breadcrumb / page-level filter)。
|
|
@@ -307,6 +308,9 @@ const AppShellAside = React.forwardRef<HTMLElement, AppShellAsideProps>(
|
|
|
307
308
|
// SheetContent 的 aria-labelledby 指向不存在的 id → SR 念「unnamed dialog」+ Radix
|
|
308
309
|
// TitleWarning console.error(違 sheet.spec.md:98「Sheet content 必有可見 title」)。
|
|
309
310
|
// inline(aside)用純 <h2>:aside 自身已 aria-label={title},且無 Dialog context 不可用 SheetTitle。
|
|
311
|
+
// R1:mobile Sheet 關閉後焦點還原目標(open 時 snapshot)
|
|
312
|
+
const asideOpenerRef = React.useRef<HTMLElement | null>(null)
|
|
313
|
+
|
|
310
314
|
const renderFrame = (titleNode: React.ReactNode) => (
|
|
311
315
|
<>
|
|
312
316
|
<ChromeHeader>
|
|
@@ -327,12 +331,34 @@ const AppShellAside = React.forwardRef<HTMLElement, AppShellAsideProps>(
|
|
|
327
331
|
)
|
|
328
332
|
|
|
329
333
|
// Modal mode(mobile)— Sheet from right
|
|
334
|
+
// 2026-07-14 dim-9 修:同步轉交 forwarded ref + 合併 consumer className —— 原 mobile 分支
|
|
335
|
+
// 兩者皆遺失,同一 API(ref / className)隨 breakpoint 靜默失效(desktop 有效、mobile 無效)。
|
|
330
336
|
if (isMobile) {
|
|
331
337
|
return (
|
|
332
338
|
<Sheet open={asideOpen} onOpenChange={setAsideOpen}>
|
|
333
339
|
<SheetContent
|
|
340
|
+
ref={ref as React.Ref<HTMLDivElement>}
|
|
334
341
|
side="right"
|
|
335
|
-
|
|
342
|
+
// R1 WCAG 2.4.3(2026-07-14,Claude+codex A′ 共識):controlled Sheet 無 SheetTrigger →
|
|
343
|
+
// Radix onCloseAutoFocus triggerRef=null + preventDefault 吃掉 fallback → 焦點掉 <body>。
|
|
344
|
+
// 解:開啟時 snapshot opener(事件 dispatch 時 Radix 尚未移焦;MUI/React Aria/Ant snapshot
|
|
345
|
+
// 共識 + DatePicker Range 先例 date-picker.tsx:1061),關閉手動還原;opener 已 unmount →
|
|
346
|
+
// fallback skip-link main(#app-shell-main tabIndex=-1)。
|
|
347
|
+
onOpenAutoFocus={(e) => {
|
|
348
|
+
asideOpenerRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null
|
|
349
|
+
handleSheetOpenAutoFocus(e) // 接力 DS 預設 body-focus(自訂 handler 覆寫預設,故顯式呼叫)
|
|
350
|
+
}}
|
|
351
|
+
onCloseAutoFocus={(e) => {
|
|
352
|
+
e.preventDefault()
|
|
353
|
+
const opener = asideOpenerRef.current
|
|
354
|
+
asideOpenerRef.current = null
|
|
355
|
+
if (opener?.isConnected) { opener.focus({ preventScroll: true }); return }
|
|
356
|
+
document.getElementById('app-shell-main')?.focus({ preventScroll: true })
|
|
357
|
+
}}
|
|
358
|
+
className={cn(
|
|
359
|
+
'w-[min(90vw,var(--app-shell-aside-modal-width))] flex flex-col p-0 [&>button]:hidden',
|
|
360
|
+
className
|
|
361
|
+
)}
|
|
336
362
|
style={{ ['--app-shell-aside-modal-width' as string]: `${resolvedWidth}px` }}
|
|
337
363
|
>
|
|
338
364
|
{renderFrame(<SheetTitle className="flex-1">{title}</SheetTitle>)}
|
|
@@ -93,7 +93,7 @@ children 通常要 `className="w-full h-full object-cover"` 讓圖填滿容器;
|
|
|
93
93
|
|
|
94
94
|
## 邊界案例
|
|
95
95
|
|
|
96
|
-
- **極端 ratio**:`ratio` 接受任意正數,元件不驗證、不設上下限(`1/10`
|
|
96
|
+
- **極端 ratio**:`ratio` 接受任意正數,元件不驗證、不設上下限(`1/10` 極窄高 / `10/1` 極扁都照算);是否合理由 consumer 把關
|
|
97
97
|
- **容器 resize**:高度恆 = 寬度 ÷ ratio(padding-bottom 百分比機制),父層寬度變化時高度自動跟隨,無需 JS
|
|
98
98
|
- **children 超出**:元件不自動裁切 — 超出 ratio 容器的內容會溢出;裁切由 consumer 加 `overflow-hidden`(見 Consumer 範例)
|
|
99
99
|
- **媒體原始比例 ≠ 容器 ratio**:呈現由 children 的 `object-cover`(裁滿)/ `object-contain`(留白)決定,元件不介入
|