@qijenchen/design-system 0.1.0-beta.83 → 0.1.0-beta.85
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-group.d.ts +47 -0
- package/dist/components/DataTable/data-table-filter-group.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-group.js +154 -0
- package/dist/components/DataTable/data-table-filter-group.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 +285 -0
- package/dist/components/DataTable/data-table-filter-panel.js.map +1 -0
- package/dist/components/DataTable/data-table-filter-value-picker.d.ts +29 -0
- package/dist/components/DataTable/data-table-filter-value-picker.d.ts.map +1 -0
- package/dist/components/DataTable/data-table-filter-value-picker.js +187 -0
- package/dist/components/DataTable/data-table-filter-value-picker.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/Field/index.d.ts +1 -0
- package/dist/components/Field/index.d.ts.map +1 -1
- package/dist/components/Field/index.js +2 -0
- package/dist/components/Field/index.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 +95 -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_datatable_invariants.sh +6 -3
- 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 +13 -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-group.tsx +231 -0
- package/src/components/DataTable/data-table-filter-panel.tsx +16 -430
- package/src/components/DataTable/data-table-filter-value-picker.tsx +237 -0
- 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 +33 -13
- package/src/components/DataTable/data-table.stories.tsx +16 -17
- package/src/components/DataTable/data-table.tsx +107 -61
- package/src/components/DataTable/filter-operators.spec.md +3 -3
- 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/Field/index.ts +1 -0
- 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 +29 -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 +588 -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 +4 -4
- 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.css +1 -1
- 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
|
@@ -18,8 +18,11 @@ export default meta
|
|
|
18
18
|
|
|
19
19
|
type Story = StoryObj<typeof Calendar>
|
|
20
20
|
|
|
21
|
-
// 釘固定日期(2026-07-07 修 VR flake
|
|
22
|
-
//
|
|
21
|
+
// 釘固定日期(2026-07-07 修 VR flake;2026-07-13 補傳 defaultReferenceDate 使 pin 真正生效):
|
|
22
|
+
// 只把 now 用來組事件日期字串「不會」pin 顯示月 —— Calendar 顯示月預設取即時 new Date()(tsx),
|
|
23
|
+
// 故必須把 now 傳給 defaultReferenceDate 才真正釘住顯示月(下方各 instance 已補),否則當前月非
|
|
24
|
+
// 7 月時 7 月事件根本不顯示。註:today 標記仍取真實日期(tsx 內 new Date(),無 today override prop)
|
|
25
|
+
// → 落在被釘的 7 月內時仍隨換日移格,屬已知殘留(需新增 today prop 才能完全釘死,SSOT 待拍板)。
|
|
23
26
|
const now = new Date(2026, 6, 15)
|
|
24
27
|
const thisMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0')
|
|
25
28
|
|
|
@@ -36,7 +39,7 @@ export const Overview: Story = {
|
|
|
36
39
|
name: '元件總覽',
|
|
37
40
|
render: () => (
|
|
38
41
|
<div className="h-screen p-4 bg-canvas">
|
|
39
|
-
<Calendar events={sampleEvents} />
|
|
42
|
+
<Calendar events={sampleEvents} defaultReferenceDate={now} />
|
|
40
43
|
</div>
|
|
41
44
|
),
|
|
42
45
|
}
|
|
@@ -63,13 +66,13 @@ export const Inspector: Story = {
|
|
|
63
66
|
},
|
|
64
67
|
render: (args) => (
|
|
65
68
|
<div className="h-screen p-4 bg-canvas">
|
|
66
|
-
<Calendar {...args} />
|
|
69
|
+
<Calendar defaultReferenceDate={now} {...args} />
|
|
67
70
|
</div>
|
|
68
71
|
),
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
// ── 3. 色彩對照表(事件 color 類別 + Cell / Event tile token)─────────────────────
|
|
72
|
-
// 跳過 4. SizeMatrix(rationale 見 calendar.spec.md「MVP vs 後續增量」,
|
|
75
|
+
// 跳過 4. SizeMatrix(rationale 見 calendar.spec.md「MVP vs 後續增量」,roadmap:lg 尚未實作、視覺同 md)
|
|
73
76
|
export const ColorMatrix: Story = {
|
|
74
77
|
name: '色彩對照表',
|
|
75
78
|
render: () => {
|
|
@@ -85,13 +88,12 @@ export const ColorMatrix: Story = {
|
|
|
85
88
|
<div>
|
|
86
89
|
<H3>事件類別色</H3>
|
|
87
90
|
<Desc>
|
|
88
|
-
|
|
91
|
+
事件顏色用 12 種類別色,和 Tag / Avatar 共用同一套色盤
|
|
89
92
|
(blue / green / deep-orange / yellow / red / orange / amber / lime / turquoise / indigo / purple / magenta)。
|
|
90
|
-
|
|
91
|
-
2026-06-04 修正前 red 與 orange 都誤接 deep-orange,現各自獨立可區分。
|
|
93
|
+
顏色代表「這是哪一類事件」(同一個團隊 / 同一個專案),不是嚴重程度。每個色名對應一個色相,紅與橘各自獨立、可清楚區分。
|
|
92
94
|
</Desc>
|
|
93
95
|
<div className="h-[560px]">
|
|
94
|
-
<Calendar events={colorEvents} />
|
|
96
|
+
<Calendar events={colorEvents} defaultReferenceDate={now} />
|
|
95
97
|
</div>
|
|
96
98
|
</div>
|
|
97
99
|
|
|
@@ -202,7 +204,7 @@ export const StateBehavior: Story = {
|
|
|
202
204
|
<div>• <b>event hover</b>:tile 切同色深一階 `hover:bg-{`{color}`}-2`(如 blue → `--color-blue-2`)+ `cursor-pointer`</div>
|
|
203
205
|
<div>• <b>empty cell</b>:無事件保持純底色,點擊觸發 onDateClick</div>
|
|
204
206
|
</div>
|
|
205
|
-
<Calendar events={sampleEvents} />
|
|
207
|
+
<Calendar events={sampleEvents} defaultReferenceDate={now} />
|
|
206
208
|
</div>
|
|
207
209
|
),
|
|
208
210
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @principles-rationale: Merged WhenToUse + WhenNotToUse + VsDatePicker into a single
|
|
2
2
|
// `UsageGuidance` story (3 sections) per 2026-04-26 user mandate to consolidate
|
|
3
|
-
// decision-related stories. ColorSemantic +
|
|
3
|
+
// decision-related stories. ColorSemantic + MonthViewOnlyRule kept as separate principles.
|
|
4
4
|
import type { Meta, StoryObj } from '@storybook/react'
|
|
5
5
|
import LinkTo from '@storybook/addon-links/react'
|
|
6
6
|
import { Calendar, type CalendarEvent } from './calendar'
|
|
@@ -14,8 +14,11 @@ const meta: Meta = {
|
|
|
14
14
|
export default meta
|
|
15
15
|
type Story = StoryObj
|
|
16
16
|
|
|
17
|
-
// 釘固定日期(2026-07-07 修 VR flake
|
|
18
|
-
//
|
|
17
|
+
// 釘固定日期(2026-07-07 修 VR flake;2026-07-13 補傳 defaultReferenceDate 使 pin 真正生效):
|
|
18
|
+
// 只把 now 用來組事件日期字串「不會」pin 顯示月 —— Calendar 顯示月預設取即時 new Date()(tsx),
|
|
19
|
+
// 故必須把 now 傳給 defaultReferenceDate 才真正釘住顯示月(下方各 instance 已補),否則當前月非
|
|
20
|
+
// 7 月時 7 月事件根本不顯示。註:today 標記仍取真實日期(tsx 內 new Date(),無 today override prop)
|
|
21
|
+
// → 落在被釘的 7 月內時仍隨換日移格,屬已知殘留(需新增 today prop 才能完全釘死,SSOT 待拍板)。
|
|
19
22
|
const now = new Date(2026, 6, 15)
|
|
20
23
|
const thisMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0')
|
|
21
24
|
|
|
@@ -85,6 +88,7 @@ export const UsageGuidance: Story = {
|
|
|
85
88
|
<div className="text-body font-medium mb-2">Calendar(event canvas)</div>
|
|
86
89
|
<div className="h-80 border border-divider rounded-md overflow-hidden">
|
|
87
90
|
<Calendar
|
|
91
|
+
defaultReferenceDate={now}
|
|
88
92
|
events={[
|
|
89
93
|
{ id: 'a', title: 'Design review', start: `${thisMonth}-05`, end: `${thisMonth}-05`, color: 'blue' },
|
|
90
94
|
] as CalendarEvent[]}
|
|
@@ -109,6 +113,7 @@ export const ColorSemantic: Story = {
|
|
|
109
113
|
>
|
|
110
114
|
<div className="h-80 border border-divider rounded-md overflow-hidden">
|
|
111
115
|
<Calendar
|
|
116
|
+
defaultReferenceDate={now}
|
|
112
117
|
events={[
|
|
113
118
|
{ id: '1', title: 'Design review', start: `${thisMonth}-05`, end: `${thisMonth}-05`, color: 'blue' },
|
|
114
119
|
{ id: '2', title: 'Sprint planning', start: `${thisMonth}-08`, end: `${thisMonth}-08`, color: 'blue' },
|
|
@@ -123,9 +128,11 @@ export const ColorSemantic: Story = {
|
|
|
123
128
|
),
|
|
124
129
|
}
|
|
125
130
|
|
|
126
|
-
// ── 原則 —
|
|
127
|
-
|
|
128
|
-
|
|
131
|
+
// ── 原則 — 支援範圍:月 view only(2026-07-14 rename MvpScope → MonthViewOnlyRule
|
|
132
|
+
// per audit Dim 14 + category-templates.md「Canonical naming」:「MVP」為開發 roadmap
|
|
133
|
+
// 內部用語,reader-facing name 必人話;component-specific {Topic}Rule idiom 保留)──────
|
|
134
|
+
export const MonthViewOnlyRule: Story = {
|
|
135
|
+
name: '僅支援月檢視',
|
|
129
136
|
render: () => (
|
|
130
137
|
<div className="space-y-6">
|
|
131
138
|
<Rule
|
|
@@ -134,6 +141,7 @@ export const MvpScope: Story = {
|
|
|
134
141
|
>
|
|
135
142
|
<div className="h-80 border border-divider rounded-md overflow-hidden">
|
|
136
143
|
<Calendar
|
|
144
|
+
defaultReferenceDate={now}
|
|
137
145
|
events={[
|
|
138
146
|
{ id: '1', title: 'Sprint planning', start: `${thisMonth}-08`, end: `${thisMonth}-08`, color: 'blue' },
|
|
139
147
|
] as CalendarEvent[]}
|
|
@@ -80,7 +80,7 @@ Calendar 是**事件檢視 canvas**,讓 user 以**月 / 週 / 日** 三種 view
|
|
|
80
80
|
|
|
81
81
|
```tsx
|
|
82
82
|
<Calendar
|
|
83
|
-
view="month" | "week" | "day" //
|
|
83
|
+
view="month" | "week" | "day" // roadmap:week / day 尚未實作,目前只渲染月檢視(誠實 API,傳入不報錯,見「狀態 > 邊界案例」)
|
|
84
84
|
defaultView="month"
|
|
85
85
|
referenceDate={Date} // 當前聚焦日期(月檢視的那個月)
|
|
86
86
|
onViewChange={(view) => ...}
|
|
@@ -91,7 +91,7 @@ Calendar 是**事件檢視 canvas**,讓 user 以**月 / 週 / 日** 三種 view
|
|
|
91
91
|
onCreateEvent={() => ...} // 點「新事件」CTA 回調
|
|
92
92
|
weekStartsOn={0 | 1} // 0=Sun, 1=Mon
|
|
93
93
|
renderEventTile={(event) => ReactNode} // 自訂 event tile 視覺
|
|
94
|
-
size="md" | "lg" // cell 大小(
|
|
94
|
+
size="md" | "lg" // cell 大小(roadmap:lg 尚未實作,視覺同 md——僅設 data-size,無 CSS 消費)
|
|
95
95
|
locale="en-US" // Intl 語系(月份標題 / 星期名;預設 'en-US')
|
|
96
96
|
prevAriaLabel="上個月" // i18n override:prev 導覽鈕 aria-label
|
|
97
97
|
nextAriaLabel="下個月" // i18n override:next 導覽鈕 aria-label
|
|
@@ -208,7 +208,7 @@ MVP 無內建 error 狀態(無 `error` / `onRetry` prop)——載入失敗由 co
|
|
|
208
208
|
- ❌ 不硬寫 month grid 為 `<table>`——用 CSS grid(月 view 為 per-cell 模型不跨欄 span,見「Event tile 規則」;後續週 / 日 view 的 timeline / 拖拉增量需 grid 自由佈局,table 結構難擴充)
|
|
209
209
|
- ❌ 不把 event 資料存在元件內部 state——event 是 consumer 責任,本元件是純 view
|
|
210
210
|
- ❌ 不自動打開「新事件」表單——`onDateClick` / `onCreateEvent` 回調給 consumer 決定(避免強制開 Dialog UX)
|
|
211
|
-
- ❌ 不重造 date math
|
|
211
|
+
- ❌ 不重造 date math——月 / 週 grid 邊界運算(`startOfMonth` / `eachDayOfInterval` / `isSameMonth` 等)一律用 `date-fns`。**唯一例外(D3 perf,tsx `eventsByDate` memo 有註解)**:每 render 對 42 cells 分桶事件的 hot path 用原生 timestamp 迭代(`new Date(y, m, d).getTime()` + `setDate(+1)`)—— 避免 per-cell `isWithinInterval` 的 O(42×N) 重複掃描;此 raw-Date 迭代**限縮在** bucketing memo 內,不外溢為通則
|
|
212
212
|
|
|
213
213
|
---
|
|
214
214
|
|
|
@@ -222,9 +222,10 @@ MVP 無內建 error 狀態(無 `error` / `onRetry` prop)——載入失敗由 co
|
|
|
222
222
|
- Outside days visual
|
|
223
223
|
- Empty 為常態空白(無內建 empty/loading/error UI)
|
|
224
224
|
|
|
225
|
-
### 後續(
|
|
225
|
+
### 後續 roadmap(尚未實作;2026-07-14 user 拍板 props 保留——`view="week"/"day"` + `size="lg"` 傳入不報錯,目前只渲染月檢視,誠實 API 明標於 tsx JSDoc)
|
|
226
226
|
- 週 view(timeline 24 小時縱軸)
|
|
227
227
|
- 日 view(single-day timeline)
|
|
228
|
+
- `size="lg"` cell 密度(prop 已保留,目前視覺同 md)
|
|
228
229
|
- 拖拉新增 event(from 月 cell → range select)
|
|
229
230
|
- 拖拉移動 event(cross-day drag)
|
|
230
231
|
- 「+N more」展開 popover
|
|
@@ -21,8 +21,10 @@ type Story = StoryObj<typeof Calendar>
|
|
|
21
21
|
|
|
22
22
|
// ── 真實業務情境 ─────────────────────────────────────────────────────
|
|
23
23
|
|
|
24
|
-
// 釘固定日期(2026-07-07 修 VR flake
|
|
25
|
-
//
|
|
24
|
+
// 釘固定日期(2026-07-07 修 VR flake;2026-07-13 補傳 defaultReferenceDate 使 pin 真正生效):
|
|
25
|
+
// 只把 now 用來組事件日期字串「不會」pin 顯示月 —— Calendar 顯示月預設取即時 new Date()(tsx),
|
|
26
|
+
// 故必須把 now 傳給 defaultReferenceDate 才真正釘住顯示月(下方各 instance 已補)。
|
|
27
|
+
// 註:today 標記仍取真實日期(tsx 內 new Date(),無 today override prop)→ 落在被釘 7 月內時仍隨換日移格,屬已知殘留。
|
|
26
28
|
const now = new Date(2026, 6, 15)
|
|
27
29
|
const thisMonth = now.getFullYear() + '-' + String(now.getMonth() + 1).padStart(2, '0')
|
|
28
30
|
|
|
@@ -46,6 +48,7 @@ export const TeamCalendar: Story = {
|
|
|
46
48
|
return (
|
|
47
49
|
<div className="h-screen p-4 bg-canvas">
|
|
48
50
|
<Calendar
|
|
51
|
+
defaultReferenceDate={now}
|
|
49
52
|
events={events}
|
|
50
53
|
onEventClick={(e) => alert(`點了事件:${e.title}`)}
|
|
51
54
|
onDateClick={(d) => console.log('點 date cell:', d)}
|
|
@@ -71,7 +74,7 @@ export const ContentPublishingSchedule: Story = {
|
|
|
71
74
|
]
|
|
72
75
|
return (
|
|
73
76
|
<div className="h-screen p-4 bg-canvas">
|
|
74
|
-
<Calendar events={events} onCreateEvent={() => alert('排內容')} />
|
|
77
|
+
<Calendar events={events} defaultReferenceDate={now} onCreateEvent={() => alert('排內容')} />
|
|
75
78
|
</div>
|
|
76
79
|
)
|
|
77
80
|
},
|
|
@@ -84,7 +87,7 @@ export const EmptyCalendar: Story = {
|
|
|
84
87
|
name: '空行事曆',
|
|
85
88
|
render: () => (
|
|
86
89
|
<div className="h-screen p-4 bg-canvas">
|
|
87
|
-
<Calendar events={[]} onCreateEvent={() => alert('加第一個事件')} />
|
|
90
|
+
<Calendar events={[]} defaultReferenceDate={now} onCreateEvent={() => alert('加第一個事件')} />
|
|
88
91
|
</div>
|
|
89
92
|
),
|
|
90
93
|
}
|
|
@@ -27,10 +27,11 @@ import { SegmentedControl, SegmentedControlItem } from '@/design-system/componen
|
|
|
27
27
|
* ── Layout Family ──
|
|
28
28
|
* 非 4-Family,屬 page-composite(多區塊 Toolbar + Grid + EventTile)。
|
|
29
29
|
*
|
|
30
|
-
* ── MVP scope
|
|
30
|
+
* ── MVP scope ──
|
|
31
31
|
* - 月 view 完整(toolbar / grid / event tile / today highlight / outside days)
|
|
32
|
-
* - 週 / 日 view
|
|
33
|
-
* -
|
|
32
|
+
* - 週 / 日 view + size lg = **roadmap:尚未實作,目前只渲染月檢視**(誠實 API,
|
|
33
|
+
* props 保留給未來增量,2026-07-14 user 拍板;行為明細見 spec「狀態 > 邊界案例」)
|
|
34
|
+
* - 拖拉增刪 event 是 roadmap(見 spec「MVP vs 後續增量」)
|
|
34
35
|
*
|
|
35
36
|
* ── 與 DatePicker 的區分 ──
|
|
36
37
|
* DatePicker 是「選日期」form control;Calendar 是「看事件」page canvas。
|
|
@@ -58,7 +59,11 @@ export interface CalendarEvent {
|
|
|
58
59
|
export type CalendarView = 'month' | 'week' | 'day'
|
|
59
60
|
|
|
60
61
|
export interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {
|
|
61
|
-
/**
|
|
62
|
+
/**
|
|
63
|
+
* 當前 view。**roadmap:`'week'` / `'day'` 尚未實作,目前只渲染月檢視**——
|
|
64
|
+
* 傳入不報錯:grid 仍為月檢視,僅 `data-view` 同步 + SegmentedControl 週/日項 disabled
|
|
65
|
+
* (誠實 API;見 calendar.spec.md「狀態 > 邊界案例」+「MVP vs 後續增量」)。
|
|
66
|
+
*/
|
|
62
67
|
view?: CalendarView
|
|
63
68
|
defaultView?: CalendarView
|
|
64
69
|
onViewChange?: (view: CalendarView) => void
|
|
@@ -84,7 +89,10 @@ export interface CalendarProps extends Omit<React.HTMLAttributes<HTMLDivElement>
|
|
|
84
89
|
/** 自訂 event tile 渲染 */
|
|
85
90
|
renderEventTile?: (event: CalendarEvent) => React.ReactNode
|
|
86
91
|
|
|
87
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* size。**roadmap:`'lg'` 尚未實作,視覺與 `'md'` 相同**——傳入不報錯,
|
|
94
|
+
* 僅設 `data-size` attribute,無任何 CSS 消費(誠實 API;prop 保留給未來 cell 密度增量)。
|
|
95
|
+
*/
|
|
88
96
|
size?: 'md' | 'lg'
|
|
89
97
|
className?: string
|
|
90
98
|
|
|
@@ -113,7 +121,18 @@ const EVENT_ALLDAY_ACCENT = CAT_ACCENT
|
|
|
113
121
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
114
122
|
|
|
115
123
|
function coerceDate(value: string | Date): Date {
|
|
116
|
-
|
|
124
|
+
if (value instanceof Date) return value
|
|
125
|
+
// date-only ISO("YYYY-MM-DD")用本地午夜建構,不走 new Date(str)。
|
|
126
|
+
// 原因:`new Date('2026-06-15')` 按 UTC 午夜解析,而 eventsByDate 分桶以本地
|
|
127
|
+
// getFullYear/Month/Date 讀取 → 負 UTC 時區(西半球)的 all-day 事件被移到前一天
|
|
128
|
+
// (真實 timezone bug)。手動 split 建本地 Date,與分桶的本地讀取一致。
|
|
129
|
+
// 含時間的字串(YYYY-MM-DDTHH:mm,無 offset)ES 規範本就以本地解析,走原生 new Date()。
|
|
130
|
+
const dateOnly = /^\d{4}-\d{2}-\d{2}$/.exec(value)
|
|
131
|
+
if (dateOnly) {
|
|
132
|
+
const [y, m, d] = value.split('-').map(Number)
|
|
133
|
+
return new Date(y, m - 1, d)
|
|
134
|
+
}
|
|
135
|
+
return new Date(value)
|
|
117
136
|
}
|
|
118
137
|
|
|
119
138
|
// eventsOnDate(per-cell 全 events 掃描)已由 eventsByDate bucketing memo 取代並移除
|
|
@@ -160,7 +179,7 @@ const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>(function Calend
|
|
|
160
179
|
[referenceDateProp, onReferenceDateChange],
|
|
161
180
|
)
|
|
162
181
|
|
|
163
|
-
// View state(
|
|
182
|
+
// View state(roadmap:week/day 尚未實作,受控值照收但 grid 恆為月檢視)
|
|
164
183
|
const [internalView, setInternalView] = React.useState<CalendarView>(defaultView)
|
|
165
184
|
const currentView = viewProp ?? internalView
|
|
166
185
|
const setView = React.useCallback(
|
|
@@ -18,9 +18,10 @@ export default meta
|
|
|
18
18
|
type Story = StoryObj
|
|
19
19
|
|
|
20
20
|
// ── Sample slides ────────────────────────────────────────────────────────────
|
|
21
|
-
// 2026-05-16 audit Round 6
|
|
21
|
+
// 2026-05-16 audit Round 6:展示 + 設計規格 兩層用真實 picsum seeded photo
|
|
22
22
|
// 取代 gradient 色塊 — gradient 抽象 block 教不到真實裁切 / 內容裁切 / 視覺層次,
|
|
23
|
-
//
|
|
23
|
+
// 且與主展示頁(carousel.stories.tsx)同源。設計原則(principles)層刻意用輕量 gradient
|
|
24
|
+
// placeholder(聚焦「何時用 / 何時不用」決策規則,不搶真實照片視覺),故 media 來源與此二層不同。
|
|
24
25
|
// Picsum.photos 提供 stable seeded photos(免登入 / 免 API key / 跨環境一致)。
|
|
25
26
|
// 註:ColorMatrix「視覺樣本」cell 刻意保留純色 swatch(bg-foreground)——那是 token 色票
|
|
26
27
|
// 非 slide 內容,用純色才能精準標 dot 的 bg-on-emphasis/60 · /80 · 全(--on-emphasis = white)token。
|
|
@@ -185,7 +186,7 @@ const InspectorInner = () => {
|
|
|
185
186
|
</div>
|
|
186
187
|
</div>
|
|
187
188
|
<p className="text-[10px] text-fg-muted font-mono">
|
|
188
|
-
Arrow:size="md"(h-field-md,default 32px /
|
|
189
|
+
Arrow:size="md"(h-field-md,default/md 32px / lg 36px,iconOnly 方形)· left/right-3 · top-1/2 · opacity 0 → hover/focus-within 100%<br />
|
|
189
190
|
Dots:bottom-3 · gap-1.5 · inactive 6px × 6px / active 24px × 6px
|
|
190
191
|
</p>
|
|
191
192
|
</div>
|
|
@@ -374,7 +375,7 @@ export const SizeMatrix: Story = {
|
|
|
374
375
|
<tbody>
|
|
375
376
|
<tr>
|
|
376
377
|
<Td mono>Arrow button</Td>
|
|
377
|
-
<Td mono>size="md"(h-field-md,default 32px /
|
|
378
|
+
<Td mono>size="md"(h-field-md,default/md 32px / lg 36px)</Td>
|
|
378
379
|
<Td>iconOnly 方形,繼承 Button md 尺寸;rounded-full 圓形於照片 overlay 上的世界級慣例(Airbnb / Instagram / Netflix)</Td>
|
|
379
380
|
</tr>
|
|
380
381
|
<tr>
|
|
@@ -128,9 +128,9 @@ Tabs 和 Carousel 都能「按順序切換下方內容」,但**語意與視覺
|
|
|
128
128
|
|
|
129
129
|
### 視覺規格
|
|
130
130
|
|
|
131
|
-
- **基於 DS Button**:`<Button variant="tertiary" size="md" iconOnly
|
|
131
|
+
- **基於 DS Button**:`<Button variant="tertiary" size="md" iconOnly />`——對齊 DS 規則,唯 shape 覆寫 `rounded-full`(media carousel documented 例外,見下一條「形狀 documented 例外」);其餘視覺全繼承 Button tertiary,不另自訂
|
|
132
132
|
- **形狀 documented 例外**:override `rounded-md` → **`rounded-full`**(圓形)。理由:media carousel 視覺取向,圓形箭頭減少方塊感、不壓迫媒體內容(對齊 **Instagram / Airbnb / Notion Gallery / Apple Photos / Google Photos lightbox 世界級慣例** — 媒體 overlay 控制器圓形)。本 DS 內 Button default 是 `rounded-md`,這裡是唯一文明 override,documented 例外記錄即為本段(同步 `carousel.tsx` Button `className="rounded-full"` 旁 inline 註解)。**不傳染**:其他元件的 Button 仍走 rounded-md <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
|
|
133
|
-
- 尺寸:`size="md"` 對應 `--field-height-md`(default 32px /
|
|
133
|
+
- 尺寸:`size="md"` 對應 `--field-height-md`(default/md 32px / lg 36px),iconOnly 正方形;形狀 **`rounded-full`**(documented 例外,見上一條)
|
|
134
134
|
- 為什麼 tertiary:`bg-surface` + `border-border`,hover 僅改 text/border 為 `primary-hover`——無 bg-hover tint,視覺最輕,不搶 media 權重;secondary 有 neutral 邊框+hover 較重,primary 有底色更搶焦點,均不合適
|
|
135
135
|
- 背景 / 邊框 / hover / focus-visible:全部繼承 Button tertiary variant 的 token,不自訂
|
|
136
136
|
- 圖標:`startIcon={ChevronLeft}` / `startIcon={ChevronRight}`,尺寸由 Button 內部程式化決定
|
|
@@ -97,6 +97,14 @@ const Carousel = React.forwardRef<
|
|
|
97
97
|
setSelectedIndex(a.selectedScrollSnap())
|
|
98
98
|
}, [])
|
|
99
99
|
|
|
100
|
+
// reInit(動態 slide 增減 / options 變更)必刷新 scrollSnaps —— onSelect 只讀 select
|
|
101
|
+
// 狀態不含 scrollSnapList;若不在此補,dots 數量 stale(舊 dots 殘留 / 縮減不更新)。
|
|
102
|
+
const onReInit = React.useCallback((a: CarouselApi) => {
|
|
103
|
+
if (!a) return
|
|
104
|
+
setScrollSnaps(a.scrollSnapList())
|
|
105
|
+
onSelect(a)
|
|
106
|
+
}, [onSelect])
|
|
107
|
+
|
|
100
108
|
const scrollPrev = React.useCallback(() => api?.scrollPrev(), [api])
|
|
101
109
|
const scrollNext = React.useCallback(() => api?.scrollNext(), [api])
|
|
102
110
|
const scrollTo = React.useCallback((i: number) => api?.scrollTo(i), [api])
|
|
@@ -110,13 +118,13 @@ const Carousel = React.forwardRef<
|
|
|
110
118
|
if (!api) return
|
|
111
119
|
setScrollSnaps(api.scrollSnapList())
|
|
112
120
|
onSelect(api)
|
|
113
|
-
api.on('reInit',
|
|
121
|
+
api.on('reInit', onReInit)
|
|
114
122
|
api.on('select', onSelect)
|
|
115
123
|
return () => {
|
|
116
124
|
api?.off('select', onSelect)
|
|
117
|
-
api?.off('reInit',
|
|
125
|
+
api?.off('reInit', onReInit) // D3 fix: previously leaked — stale closure on remount
|
|
118
126
|
}
|
|
119
|
-
}, [api, onSelect])
|
|
127
|
+
}, [api, onSelect, onReInit])
|
|
120
128
|
|
|
121
129
|
const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {
|
|
122
130
|
// 鍵盤方向對齊內容捲動方向(APG 建議):horizontal → ←/→;vertical → ↑/↓
|
|
@@ -56,10 +56,13 @@ const visitorConfig = {
|
|
|
56
56
|
|
|
57
57
|
// 訂閱方案分布(對標 Stripe dashboard)
|
|
58
58
|
const subscriptionData = [
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{ tier: '
|
|
59
|
+
// nameKey='tier' 的值必須等於 subscriptionConfig 的 key(小寫);顯示標籤由 config.label 提供
|
|
60
|
+
// (shadcn pie canonical:data 的 nameKey 欄位 = 小寫 config key,如 { browser: 'chrome' })。
|
|
61
|
+
// 曾用大寫 'Free' → getPayloadConfig 以 'Free' 查 config 落空 → 圖例標籤全空(2026-07-13 修)。
|
|
62
|
+
{ tier: 'free', users: 820, fill: 'var(--color-free)' },
|
|
63
|
+
{ tier: 'pro', users: 340, fill: 'var(--color-pro)' },
|
|
64
|
+
{ tier: 'team', users: 180, fill: 'var(--color-team)' },
|
|
65
|
+
{ tier: 'enterprise', users: 42, fill: 'var(--color-enterprise)' },
|
|
63
66
|
]
|
|
64
67
|
|
|
65
68
|
const subscriptionConfig = {
|
|
@@ -256,7 +256,7 @@ export const ChartTypeRule: Story = {
|
|
|
256
256
|
|
|
257
257
|
<Rule
|
|
258
258
|
title="Pie / Donut — 整體的組成比例"
|
|
259
|
-
note="呈現『誰佔了整體的多少
|
|
259
|
+
note="呈現『誰佔了整體的多少 %』,最多 5 類(類別配色上限,見「最多 5 類別」)。超過先合併「其他」;仍不夠改用 Bar(類別對比時比例已暗含在柱高裡)。Google Analytics 的流量來源、App Store 的 OS 分布。"
|
|
260
260
|
>
|
|
261
261
|
<div className="w-full max-w-sm">
|
|
262
262
|
<ChartContainer config={osShareConfig}>
|
|
@@ -124,10 +124,7 @@ export const BarChartRevenue: Story = {
|
|
|
124
124
|
/>
|
|
125
125
|
<ChartTooltip
|
|
126
126
|
content={
|
|
127
|
-
<ChartTooltipContent
|
|
128
|
-
indicator="dashed"
|
|
129
|
-
formatter={(value) => `$${Number(value).toLocaleString()}`}
|
|
130
|
-
/>
|
|
127
|
+
<ChartTooltipContent indicator="dashed" />
|
|
131
128
|
}
|
|
132
129
|
/>
|
|
133
130
|
<Bar dataKey="revenue" fill="var(--color-revenue)" radius={4} />
|
|
@@ -159,10 +156,7 @@ export const LineChartResponseTime: Story = {
|
|
|
159
156
|
/>
|
|
160
157
|
<ChartTooltip
|
|
161
158
|
content={
|
|
162
|
-
<ChartTooltipContent
|
|
163
|
-
indicator="line"
|
|
164
|
-
formatter={(value) => `${Number(value)}ms`}
|
|
165
|
-
/>
|
|
159
|
+
<ChartTooltipContent indicator="line" />
|
|
166
160
|
}
|
|
167
161
|
/>
|
|
168
162
|
<ChartLegend content={<ChartLegendContent />} />
|
|
@@ -59,6 +59,9 @@ const ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(
|
|
|
59
59
|
<ChartContext.Provider value={ctxValue}>
|
|
60
60
|
<div
|
|
61
61
|
ref={ref}
|
|
62
|
+
// 2026-07-14 audit Dim 9(passthrough 完整度):id 原被 destructure 只拿去組 data-chart,
|
|
63
|
+
// native id attr 靜默吞掉 —— consumer 傳 id 期待 DOM id(anchor / aria 參照)必須落地。
|
|
64
|
+
id={id}
|
|
62
65
|
data-chart={chartId}
|
|
63
66
|
className={cn(
|
|
64
67
|
// 整體視覺套用本 DS typography + token
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Meta } from '@storybook/react'
|
|
2
2
|
import { useState } from 'react'
|
|
3
3
|
import { Checkbox } from './checkbox'
|
|
4
|
-
import {
|
|
4
|
+
import { CheckboxGroup } from './checkbox-group'
|
|
5
5
|
|
|
6
6
|
const meta: Meta = {
|
|
7
7
|
title: 'Design System/Components/Checkbox/設計規格',
|
|
@@ -159,7 +159,7 @@ export const Overview = {
|
|
|
159
159
|
<div className="flex flex-col gap-4">
|
|
160
160
|
<div className="flex flex-col gap-1">
|
|
161
161
|
<H3>結構(Anatomy)</H3>
|
|
162
|
-
<Desc>Checkbox 由兩層組成:indicator(方框 + check icon)和 label
|
|
162
|
+
<Desc>Checkbox 由兩層組成:indicator(方框 + check icon)和 label(`label` prop 提供,內部自動透過 SelectionItem 組合)。</Desc>
|
|
163
163
|
</div>
|
|
164
164
|
<div className="flex gap-8">
|
|
165
165
|
{/* Standalone checkbox */}
|
|
@@ -173,16 +173,16 @@ export const Overview = {
|
|
|
173
173
|
</div>
|
|
174
174
|
</div>
|
|
175
175
|
</div>
|
|
176
|
-
{/* With
|
|
176
|
+
{/* With label prop */}
|
|
177
177
|
<div className="flex flex-col gap-2 items-start">
|
|
178
|
-
<span className="text-[11px] text-fg-muted font-medium"
|
|
178
|
+
<span className="text-[11px] text-fg-muted font-medium">傳 label prop</span>
|
|
179
179
|
<div className="inline-flex items-center border-2 border-dashed border-primary/30 rounded-md p-3 gap-2">
|
|
180
|
-
{[{ name: 'control (Checkbox)', color: 'info' }, { name: '
|
|
180
|
+
{[{ name: 'control (Checkbox)', color: 'info' }, { name: 'label / content', color: 'success' }].map((s) => (
|
|
181
181
|
<span key={s.name} className="rounded px-2 py-1 text-[11px] font-mono border border-dashed"
|
|
182
182
|
style={{ borderColor: `var(--${s.color})`, backgroundColor: `var(--${s.color}-subtle)`, color: `var(--${s.color})` }}>{s.name}</span>
|
|
183
183
|
))}
|
|
184
184
|
</div>
|
|
185
|
-
<span className="text-[10px] text-fg-muted font-mono"
|
|
185
|
+
<span className="text-[10px] text-fg-muted font-mono">內部 SelectionItem 處理 label 對齊與 padding</span>
|
|
186
186
|
</div>
|
|
187
187
|
</div>
|
|
188
188
|
</div>
|
|
@@ -272,7 +272,7 @@ const InspectorInner = () => {
|
|
|
272
272
|
<Tab active={!withLabel} onClick={() => setWithLabel(false)}>off</Tab>
|
|
273
273
|
<Tab active={withLabel} onClick={() => setWithLabel(true)}>on</Tab>
|
|
274
274
|
</div>
|
|
275
|
-
<span className="text-[11px] text-fg-muted"
|
|
275
|
+
<span className="text-[11px] text-fg-muted">label prop(內部 SelectionItem 組合)</span>
|
|
276
276
|
</div>
|
|
277
277
|
{withLabel && (
|
|
278
278
|
<div className="flex items-center gap-2">
|
|
@@ -292,20 +292,13 @@ const InspectorInner = () => {
|
|
|
292
292
|
<div className="flex flex-col gap-5 min-w-[340px]">
|
|
293
293
|
<div className="px-10 py-8 rounded-lg bg-canvas border border-divider flex items-center justify-center">
|
|
294
294
|
{withLabel ? (
|
|
295
|
-
|
|
295
|
+
/* 公開 API:`<Checkbox label>` 內部自動包 SelectionItem + wire id/htmlFor(selection-item.spec.md 禁裸用) */
|
|
296
|
+
<Checkbox
|
|
296
297
|
size={size}
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
id="inspector-cb"
|
|
300
|
-
size={size}
|
|
301
|
-
checked={checkedState === 'checked' ? true : checkedState === 'indeterminate' ? 'indeterminate' : false}
|
|
302
|
-
disabled={interaction === 'disabled'}
|
|
303
|
-
/>
|
|
304
|
-
}
|
|
298
|
+
checked={checkedState === 'checked' ? true : checkedState === 'indeterminate' ? 'indeterminate' : false}
|
|
299
|
+
disabled={interaction === 'disabled'}
|
|
305
300
|
label="Label text"
|
|
306
301
|
description={withDescription ? '次要說明文字,給使用者更多 context' : undefined}
|
|
307
|
-
htmlFor="inspector-cb"
|
|
308
|
-
disabled={interaction === 'disabled'}
|
|
309
302
|
/>
|
|
310
303
|
) : (
|
|
311
304
|
<Checkbox
|
|
@@ -493,7 +486,7 @@ export const SizeMatrix = {
|
|
|
493
486
|
<Th>Size</Th>
|
|
494
487
|
<Th>Unchecked</Th>
|
|
495
488
|
<Th>Checked</Th>
|
|
496
|
-
<Th
|
|
489
|
+
<Th>label prop</Th>
|
|
497
490
|
</tr></thead>
|
|
498
491
|
<tbody>
|
|
499
492
|
{SIZES.map((sz) => (
|
|
@@ -502,12 +495,8 @@ export const SizeMatrix = {
|
|
|
502
495
|
<Td><Checkbox size={sz} /></Td>
|
|
503
496
|
<Td><Checkbox size={sz} defaultChecked /></Td>
|
|
504
497
|
<Td>
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
control={<Checkbox id={`sz-${sz}`} size={sz} defaultChecked />}
|
|
508
|
-
label="Label text"
|
|
509
|
-
htmlFor={`sz-${sz}`}
|
|
510
|
-
/>
|
|
498
|
+
{/* 公開 API:`<Checkbox label>` 內部自動包 SelectionItem + wire id/htmlFor(selection-item.spec.md 禁裸用) */}
|
|
499
|
+
<Checkbox size={sz} defaultChecked label="Label text" />
|
|
511
500
|
</Td>
|
|
512
501
|
</tr>
|
|
513
502
|
))}
|
|
@@ -561,16 +550,16 @@ export const StateBehavior = {
|
|
|
561
550
|
{/* Vertical Group */}
|
|
562
551
|
<div className="flex flex-col gap-3">
|
|
563
552
|
<span className="text-caption font-medium text-fg-secondary">垂直排列 — Item 間距由 padding 處理,不加 gap</span>
|
|
564
|
-
<Desc>每個 SelectionItem
|
|
553
|
+
<Desc>每個 item(內部 SelectionItem)的 py = (field-height − 一行文字高度) / 2,單行高度剛好等於同 size 的 Input,多行時 padding 不變自然撐高。</Desc>
|
|
565
554
|
<div className="flex gap-8">
|
|
566
555
|
{(['md', 'lg'] as const).map((sz) => (
|
|
567
556
|
<div key={sz} className="flex flex-col gap-1">
|
|
568
557
|
<span className="text-[11px] text-fg-muted font-medium">size="{sz}"</span>
|
|
569
|
-
<
|
|
570
|
-
<
|
|
571
|
-
<
|
|
572
|
-
<
|
|
573
|
-
</
|
|
558
|
+
<CheckboxGroup className="border border-dashed border-divider rounded-md p-2">
|
|
559
|
+
<Checkbox size={sz} label="Email 通知" />
|
|
560
|
+
<Checkbox size={sz} label="SMS 通知" description="每則訊息可能有費用" />
|
|
561
|
+
<Checkbox size={sz} label="Push 通知" />
|
|
562
|
+
</CheckboxGroup>
|
|
574
563
|
</div>
|
|
575
564
|
))}
|
|
576
565
|
</div>
|
|
@@ -580,9 +569,9 @@ export const StateBehavior = {
|
|
|
580
569
|
<div className="flex flex-col gap-3">
|
|
581
570
|
<span className="text-caption font-medium text-fg-secondary">水平排列 — Item 之間 gap-4(16px)</span>
|
|
582
571
|
<div className="flex gap-4 border border-dashed border-divider rounded-md p-2">
|
|
583
|
-
<
|
|
584
|
-
<
|
|
585
|
-
<
|
|
572
|
+
<Checkbox label="Email" />
|
|
573
|
+
<Checkbox label="SMS" />
|
|
574
|
+
<Checkbox label="Push" />
|
|
586
575
|
</div>
|
|
587
576
|
</div>
|
|
588
577
|
|
|
@@ -590,24 +579,14 @@ export const StateBehavior = {
|
|
|
590
579
|
<div className="flex flex-col gap-3">
|
|
591
580
|
<span className="text-caption font-medium text-fg-secondary">多行對齊 — 控件對齊第一行文字中心</span>
|
|
592
581
|
<Desc>控件包在一行文字高度的容器內,外層 flex items-start 確保多行時控件對齊第一行。字體改變時高度自動重算。</Desc>
|
|
593
|
-
<
|
|
594
|
-
<
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
htmlFor="ml-a"
|
|
598
|
-
/>
|
|
599
|
-
<SelectionItem
|
|
600
|
-
control={<Checkbox id="ml-b" />}
|
|
601
|
-
label="這是一個比較長的標籤文字,會自動換行到第二行,控件始終對齊第一行的垂直中心"
|
|
602
|
-
htmlFor="ml-b"
|
|
603
|
-
/>
|
|
604
|
-
<SelectionItem
|
|
605
|
-
control={<Checkbox id="ml-c" />}
|
|
582
|
+
<CheckboxGroup className="max-w-sm border border-dashed border-divider rounded-md">
|
|
583
|
+
<Checkbox label="短標籤" />
|
|
584
|
+
<Checkbox label="這是一個比較長的標籤文字,會自動換行到第二行,控件始終對齊第一行的垂直中心" />
|
|
585
|
+
<Checkbox
|
|
606
586
|
label="附帶說明"
|
|
607
587
|
description="說明文字用 fg-secondary 色彩,排在 label 下方"
|
|
608
|
-
htmlFor="ml-c"
|
|
609
588
|
/>
|
|
610
|
-
</
|
|
589
|
+
</CheckboxGroup>
|
|
611
590
|
</div>
|
|
612
591
|
</div>
|
|
613
592
|
),
|
|
@@ -147,7 +147,7 @@ export const UsageGuidance: Story = {
|
|
|
147
147
|
|
|
148
148
|
<Rule
|
|
149
149
|
title="Radio — 互斥單選(必須在 RadioGroup 內)"
|
|
150
|
-
note="N 個選項中只能選一個,其他自動變 unchecked
|
|
150
|
+
note="N 個選項中只能選一個,其他自動變 unchecked。通常可預選常用項;需要使用者主動表態(如付款方式)時可從未選開始(radio-group.spec.md:value=null 為合法初始態),配 required 驗證兜底"
|
|
151
151
|
>
|
|
152
152
|
<RadioGroup value={selected} onValueChange={setSelected}>
|
|
153
153
|
<RadioGroupItem value="credit" label="信用卡" description="手續費 2.5%,即時" />
|