@qijenchen/design-system 0.1.0-beta.80 → 0.1.0-beta.82
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 +1 -1
- package/dist/components/Alert/alert.d.ts +5 -0
- package/dist/components/Alert/alert.d.ts.map +1 -1
- package/dist/components/Alert/alert.js +4 -1
- package/dist/components/Alert/alert.js.map +1 -1
- package/dist/components/AppShell/app-shell.d.ts +1 -1
- package/dist/components/AppShell/app-shell.js.map +1 -1
- package/dist/components/AspectRatio/aspect-ratio.d.ts +2 -1
- package/dist/components/AspectRatio/aspect-ratio.d.ts.map +1 -1
- package/dist/components/AspectRatio/aspect-ratio.js +1 -1
- package/dist/components/AspectRatio/aspect-ratio.js.map +1 -1
- package/dist/components/Avatar/avatar.d.ts +3 -2
- package/dist/components/Avatar/avatar.d.ts.map +1 -1
- package/dist/components/Avatar/avatar.js +8 -3
- package/dist/components/Avatar/avatar.js.map +1 -1
- package/dist/components/Badge/badge.d.ts.map +1 -1
- package/dist/components/Badge/badge.js +2 -1
- package/dist/components/Badge/badge.js.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.d.ts +14 -1
- package/dist/components/Breadcrumb/breadcrumb.d.ts.map +1 -1
- package/dist/components/Breadcrumb/breadcrumb.js +9 -3
- package/dist/components/Breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts +4 -1
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.js +2 -2
- package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
- package/dist/components/Button/button.d.ts +4 -4
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js +73 -44
- package/dist/components/Button/button.js.map +1 -1
- package/dist/components/Button/index.d.ts +1 -0
- package/dist/components/Button/index.d.ts.map +1 -1
- package/dist/components/Button/index.js +3 -0
- package/dist/components/Button/index.js.map +1 -1
- package/dist/components/Calendar/calendar.d.ts +3 -1
- package/dist/components/Calendar/calendar.d.ts.map +1 -1
- package/dist/components/Calendar/calendar.js +40 -17
- package/dist/components/Calendar/calendar.js.map +1 -1
- package/dist/components/Carousel/carousel.d.ts +1 -1
- package/dist/components/Carousel/carousel.d.ts.map +1 -1
- package/dist/components/Carousel/carousel.js +3 -1
- 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 -1
- package/dist/components/Chart/chart.js.map +1 -1
- package/dist/components/Checkbox/checkbox.d.ts +6 -3
- package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/checkbox.js +26 -4
- package/dist/components/Checkbox/checkbox.js.map +1 -1
- package/dist/components/Checkbox/index.d.ts +1 -0
- package/dist/components/Checkbox/index.d.ts.map +1 -1
- package/dist/components/Checkbox/index.js +3 -0
- package/dist/components/Checkbox/index.js.map +1 -1
- package/dist/components/Chip/chip.d.ts +9 -3
- package/dist/components/Chip/chip.d.ts.map +1 -1
- package/dist/components/Chip/chip.js +46 -13
- package/dist/components/Chip/chip.js.map +1 -1
- package/dist/components/Coachmark/coachmark.d.ts +5 -3
- package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
- package/dist/components/Coachmark/coachmark.js +10 -7
- package/dist/components/Coachmark/coachmark.js.map +1 -1
- package/dist/components/Combobox/combobox.d.ts +3 -1
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +11 -7
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/Command/command.d.ts +2 -2
- package/dist/components/Command/command.d.ts.map +1 -1
- package/dist/components/Command/command.js +4 -2
- package/dist/components/Command/command.js.map +1 -1
- package/dist/components/DataTable/active-editor-controller.d.ts +4 -3
- package/dist/components/DataTable/active-editor-controller.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +3 -0
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/data-table-filter-panel.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-interaction-layer.d.ts +4 -3
- package/dist/components/DataTable/data-table-interaction-layer.d.ts.map +1 -1
- package/dist/components/DataTable/data-table-interaction-layer.js.map +1 -1
- package/dist/components/DataTable/data-table.d.ts +38 -7
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +213 -63
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-tree.d.ts +5 -0
- package/dist/components/DataTable/filter-tree.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.d.ts +3 -3
- package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.js +52 -6
- package/dist/components/DateGrid/date-grid.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts +2 -8
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +139 -109
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/DescriptionList/description-list.d.ts.map +1 -1
- package/dist/components/DescriptionList/description-list.js +1 -1
- package/dist/components/DescriptionList/description-list.js.map +1 -1
- package/dist/components/Dialog/dialog.d.ts +1 -1
- package/dist/components/Dialog/dialog.d.ts.map +1 -1
- package/dist/components/Dialog/dialog.js +2 -1
- package/dist/components/Dialog/dialog.js.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.d.ts +4 -4
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.js +25 -8
- package/dist/components/DropdownMenu/dropdown-menu.js.map +1 -1
- package/dist/components/Empty/empty.d.ts.map +1 -1
- package/dist/components/Empty/empty.js +1 -1
- package/dist/components/Empty/empty.js.map +1 -1
- package/dist/components/Field/field-wrapper.d.ts +1 -0
- package/dist/components/Field/field-wrapper.d.ts.map +1 -1
- package/dist/components/Field/field-wrapper.js +27 -7
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/Field/field.d.ts +1 -1
- package/dist/components/Field/field.d.ts.map +1 -1
- package/dist/components/Field/field.js +2 -1
- package/dist/components/Field/field.js.map +1 -1
- package/dist/components/Field/use-form-validation.d.ts +5 -1
- package/dist/components/Field/use-form-validation.d.ts.map +1 -1
- package/dist/components/Field/use-form-validation.js +31 -21
- package/dist/components/Field/use-form-validation.js.map +1 -1
- package/dist/components/FieldControlGroup/field-control-group.d.ts +3 -3
- 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 +3 -2
- 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.d.ts.map +1 -1
- package/dist/components/FileUpload/file-upload.js +22 -10
- package/dist/components/FileUpload/file-upload.js.map +1 -1
- package/dist/components/FileViewer/can-render-image.d.ts +6 -0
- package/dist/components/FileViewer/can-render-image.d.ts.map +1 -0
- package/dist/components/FileViewer/can-render-image.js +11 -0
- package/dist/components/FileViewer/can-render-image.js.map +1 -0
- package/dist/components/FileViewer/file-viewer.d.ts +2 -2
- package/dist/components/FileViewer/file-viewer.d.ts.map +1 -1
- package/dist/components/FileViewer/file-viewer.js +24 -16
- package/dist/components/FileViewer/file-viewer.js.map +1 -1
- package/dist/components/FileViewer/image-renderer.d.ts +0 -5
- package/dist/components/FileViewer/image-renderer.d.ts.map +1 -1
- package/dist/components/FileViewer/image-renderer.js +1 -9
- 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 +3 -1
- package/dist/components/HoverCard/hover-card.js.map +1 -1
- package/dist/components/Input/input.d.ts +26 -3
- package/dist/components/Input/input.d.ts.map +1 -1
- package/dist/components/Input/input.js +12 -8
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts +3 -3
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js +29 -28
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Menu/menu-item.d.ts.map +1 -1
- package/dist/components/Menu/menu-item.js +5 -4
- package/dist/components/Menu/menu-item.js.map +1 -1
- package/dist/components/Notice/notice.d.ts +5 -0
- package/dist/components/Notice/notice.d.ts.map +1 -1
- package/dist/components/Notice/notice.js +11 -5
- package/dist/components/Notice/notice.js.map +1 -1
- package/dist/components/NumberInput/number-input.d.ts +1 -1
- package/dist/components/NumberInput/number-input.d.ts.map +1 -1
- package/dist/components/NumberInput/number-input.js +17 -8
- package/dist/components/NumberInput/number-input.js.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.js +2 -1
- package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
- package/dist/components/Pagination/index.d.ts +2 -0
- package/dist/components/Pagination/index.d.ts.map +1 -0
- package/dist/components/Pagination/index.js +6 -0
- package/dist/components/Pagination/index.js.map +1 -0
- package/dist/components/Pagination/pagination.d.ts +49 -0
- package/dist/components/Pagination/pagination.d.ts.map +1 -0
- package/dist/components/Pagination/pagination.js +182 -0
- package/dist/components/Pagination/pagination.js.map +1 -0
- package/dist/components/PeoplePicker/people-picker.d.ts +3 -3
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +38 -36
- package/dist/components/PeoplePicker/people-picker.js.map +1 -1
- package/dist/components/PeoplePicker/person-display.d.ts +4 -0
- package/dist/components/PeoplePicker/person-display.d.ts.map +1 -1
- package/dist/components/PeoplePicker/person-display.js +3 -3
- 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 +58 -32
- package/dist/components/Popover/popover.js.map +1 -1
- package/dist/components/ProfileCard/profile-card.d.ts +11 -3
- package/dist/components/ProfileCard/profile-card.d.ts.map +1 -1
- package/dist/components/ProfileCard/profile-card.js +14 -4
- package/dist/components/ProfileCard/profile-card.js.map +1 -1
- package/dist/components/RadioGroup/radio-group.d.ts +1 -1
- package/dist/components/RadioGroup/radio-group.d.ts.map +1 -1
- package/dist/components/RadioGroup/radio-group.js +28 -3
- package/dist/components/RadioGroup/radio-group.js.map +1 -1
- package/dist/components/Rating/rating.js +3 -3
- package/dist/components/Rating/rating.js.map +1 -1
- package/dist/components/ScrollArea/scroll-area.d.ts +1 -1
- package/dist/components/ScrollArea/scroll-area.js +2 -2
- package/dist/components/ScrollArea/scroll-area.js.map +1 -1
- package/dist/components/SegmentedControl/segmented-control.d.ts +2 -2
- package/dist/components/SegmentedControl/segmented-control.d.ts.map +1 -1
- package/dist/components/SegmentedControl/segmented-control.js +23 -10
- package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
- package/dist/components/Select/select.d.ts +10 -4
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +57 -14
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/SelectMenu/index.js +4 -2
- package/dist/components/SelectMenu/select-menu.d.ts +31 -6
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
- package/dist/components/SelectMenu/select-menu.js +169 -85
- package/dist/components/SelectMenu/select-menu.js.map +1 -1
- package/dist/components/Separator/separator.js +1 -1
- package/dist/components/Separator/separator.js.map +1 -1
- package/dist/components/Sheet/sheet.d.ts +1 -1
- package/dist/components/Sheet/sheet.d.ts.map +1 -1
- package/dist/components/Sheet/sheet.js +3 -2
- package/dist/components/Sheet/sheet.js.map +1 -1
- package/dist/components/Sidebar/sidebar.d.ts +2 -2
- package/dist/components/Sidebar/sidebar.d.ts.map +1 -1
- package/dist/components/Sidebar/sidebar.js +28 -10
- package/dist/components/Sidebar/sidebar.js.map +1 -1
- package/dist/components/Skeleton/skeleton.d.ts +1 -1
- package/dist/components/Skeleton/skeleton.js +2 -2
- package/dist/components/Skeleton/skeleton.js.map +1 -1
- package/dist/components/Slider/slider.d.ts +1 -1
- package/dist/components/Slider/slider.d.ts.map +1 -1
- package/dist/components/Slider/slider.js +7 -3
- package/dist/components/Slider/slider.js.map +1 -1
- package/dist/components/Steps/steps.d.ts.map +1 -1
- package/dist/components/Steps/steps.js +6 -3
- package/dist/components/Steps/steps.js.map +1 -1
- package/dist/components/Switch/switch.d.ts +2 -2
- package/dist/components/Switch/switch.d.ts.map +1 -1
- package/dist/components/Switch/switch.js +47 -9
- package/dist/components/Switch/switch.js.map +1 -1
- package/dist/components/Tabs/tabs.d.ts +8 -5
- package/dist/components/Tabs/tabs.d.ts.map +1 -1
- package/dist/components/Tabs/tabs.js +45 -33
- package/dist/components/Tabs/tabs.js.map +1 -1
- package/dist/components/Tag/tag.d.ts.map +1 -1
- package/dist/components/Tag/tag.js +20 -4
- package/dist/components/Tag/tag.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +2 -1
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +24 -13
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts +2 -2
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +23 -12
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/Toast/toast.d.ts +1 -1
- package/dist/components/Toast/toast.d.ts.map +1 -1
- package/dist/components/Toast/toast.js +7 -3
- package/dist/components/Toast/toast.js.map +1 -1
- package/dist/components/Tooltip/tooltip.js +1 -1
- package/dist/components/Tooltip/tooltip.js.map +1 -1
- package/dist/components/TreeView/tree-view.d.ts +1 -1
- package/dist/components/TreeView/tree-view.d.ts.map +1 -1
- package/dist/components/TreeView/tree-view.js +11 -5
- package/dist/components/TreeView/tree-view.js.map +1 -1
- package/dist/hooks/use-controllable.d.ts.map +1 -1
- package/dist/hooks/use-controllable.js +4 -2
- package/dist/hooks/use-controllable.js.map +1 -1
- package/dist/hooks/use-is-touch-device.d.ts.map +1 -1
- package/dist/hooks/use-is-touch-device.js +3 -1
- package/dist/hooks/use-is-touch-device.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +2 -2
- 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/patterns/overlay-surface/overlay-surface.js.map +1 -1
- package/dist/tokens/categorical-color.d.ts +1 -1
- package/dist/tokens/categorical-color.js.map +1 -1
- package/dist/tokens/uiSize/icon-size.d.ts +2 -2
- package/ds-canonical/fork/governance.lock +1 -1
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +10 -1
- package/ds-canonical/hooks/check_audit_post_report_validator.sh +13 -0
- package/ds-canonical/hooks/check_full_story_visual_interaction_sweep.sh +4 -3
- package/ds-canonical/hooks/check_opacity_token_usage.sh +10 -1
- package/ds-canonical/hooks/check_plugin_fork_health.sh +30 -22
- package/ds-canonical/hooks/check_story_invariants.sh +17 -5
- package/ds-canonical/hooks/check_substantive_edit_approval_preflight.sh +5 -2
- package/ds-canonical/references/principle-dim-map.json +100 -0
- package/ds-canonical/references/story-baseline-registry.json +4 -3
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +1 -1
- package/ds-canonical/skills/design-system-audit/SKILL.md +2 -2
- package/ds-story-manifest.json +41 -18
- package/llms-full.txt +11 -1
- package/llms.txt +3 -1
- package/package.json +1 -1
- package/src/components/Alert/alert.anatomy.stories.tsx +9 -6
- package/src/components/Alert/alert.spec.md +3 -3
- package/src/components/Alert/alert.tsx +9 -1
- package/src/components/AppShell/app-shell.anatomy.stories.tsx +3 -0
- package/src/components/AppShell/app-shell.spec.md +3 -2
- package/src/components/AppShell/app-shell.tsx +1 -1
- package/src/components/AspectRatio/aspect-ratio.spec.md +1 -2
- package/src/components/AspectRatio/aspect-ratio.tsx +3 -2
- package/src/components/Avatar/avatar.principles.stories.tsx +1 -1
- package/src/components/Avatar/avatar.spec.md +10 -30
- package/src/components/Avatar/avatar.stories.tsx +1 -1
- package/src/components/Avatar/avatar.tsx +30 -16
- package/src/components/Badge/badge.anatomy.stories.tsx +2 -2
- package/src/components/Badge/badge.spec.md +5 -4
- package/src/components/Badge/badge.tsx +4 -1
- package/src/components/Breadcrumb/breadcrumb.anatomy.stories.tsx +2 -2
- package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +15 -10
- package/src/components/Breadcrumb/breadcrumb.spec.md +5 -3
- package/src/components/Breadcrumb/breadcrumb.tsx +10 -4
- package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +3 -2
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +15 -14
- package/src/components/BulkActionBar/bulk-action-bar.tsx +10 -4
- package/src/components/Button/button.anatomy.stories.tsx +6 -6
- package/src/components/Button/button.spec.md +3 -2
- package/src/components/Button/button.tsx +67 -27
- package/src/components/Button/index.ts +1 -0
- package/src/components/Calendar/calendar.anatomy.stories.tsx +5 -3
- package/src/components/Calendar/calendar.principles.stories.tsx +3 -1
- package/src/components/Calendar/calendar.spec.md +9 -2
- package/src/components/Calendar/calendar.stories.tsx +3 -1
- package/src/components/Calendar/calendar.tsx +53 -19
- package/src/components/Carousel/carousel.principles.stories.tsx +1 -1
- package/src/components/Carousel/carousel.tsx +4 -1
- package/src/components/Chart/chart.spec.md +1 -1
- package/src/components/Chart/chart.tsx +2 -1
- package/src/components/Checkbox/checkbox.principles.stories.tsx +1 -1
- package/src/components/Checkbox/checkbox.spec.md +1 -1
- package/src/components/Checkbox/checkbox.tsx +41 -7
- package/src/components/Checkbox/index.ts +1 -0
- package/src/components/Chip/chip.anatomy.stories.tsx +9 -9
- package/src/components/Chip/chip.principles.stories.tsx +3 -3
- package/src/components/Chip/chip.spec.md +7 -4
- package/src/components/Chip/chip.tsx +60 -15
- package/src/components/CircularProgress/circular-progress.anatomy.stories.tsx +1 -1
- package/src/components/CircularProgress/circular-progress.principles.stories.tsx +7 -5
- package/src/components/CircularProgress/circular-progress.spec.md +2 -0
- package/src/components/CircularProgress/circular-progress.stories.tsx +3 -11
- package/src/components/Coachmark/coachmark.anatomy.stories.tsx +2 -2
- package/src/components/Coachmark/coachmark.principles.stories.tsx +1 -1
- package/src/components/Coachmark/coachmark.spec.md +3 -3
- package/src/components/Coachmark/coachmark.tsx +23 -13
- package/src/components/Combobox/combobox.anatomy.stories.tsx +4 -4
- package/src/components/Combobox/combobox.spec.md +1 -1
- package/src/components/Combobox/combobox.tsx +30 -17
- package/src/components/Command/command.principles.stories.tsx +10 -12
- package/src/components/Command/command.spec.md +5 -5
- package/src/components/Command/command.stories.tsx +4 -4
- package/src/components/Command/command.tsx +3 -2
- package/src/components/DataTable/active-editor-controller.ts +4 -3
- package/src/components/DataTable/cell-registry.tsx +8 -0
- package/src/components/DataTable/data-table-filter-panel.tsx +8 -2
- package/src/components/DataTable/data-table-interaction-layer.tsx +8 -7
- package/src/components/DataTable/data-table.anatomy.stories.tsx +4 -4
- package/src/components/DataTable/data-table.css +2 -2
- package/src/components/DataTable/data-table.spec.md +72 -115
- package/src/components/DataTable/data-table.stories.tsx +51 -3
- package/src/components/DataTable/data-table.tsx +348 -63
- package/src/components/DataTable/filter-operators.spec.md +4 -4
- package/src/components/DataTable/filter-tree.ts +192 -42
- package/src/components/DateGrid/date-grid.anatomy.stories.tsx +1 -1
- package/src/components/DateGrid/date-grid.spec.md +11 -8
- package/src/components/DateGrid/date-grid.tsx +63 -8
- package/src/components/DatePicker/date-picker.principles.stories.tsx +1 -1
- package/src/components/DatePicker/date-picker.spec.md +1 -0
- package/src/components/DatePicker/date-picker.stories.tsx +19 -0
- package/src/components/DatePicker/date-picker.tsx +52 -15
- package/src/components/DescriptionList/description-list.spec.md +1 -1
- package/src/components/DescriptionList/description-list.tsx +3 -1
- package/src/components/Dialog/dialog.spec.md +1 -1
- package/src/components/Dialog/dialog.tsx +2 -1
- package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +3 -1
- package/src/components/DropdownMenu/dropdown-menu.spec.md +8 -5
- package/src/components/DropdownMenu/dropdown-menu.tsx +33 -7
- package/src/components/Empty/empty.anatomy.stories.tsx +1 -1
- package/src/components/Empty/empty.spec.md +2 -2
- package/src/components/Empty/empty.stories.tsx +4 -15
- package/src/components/Empty/empty.tsx +4 -1
- package/src/components/Field/field-controls.spec.md +2 -1
- package/src/components/Field/field-wrapper.tsx +28 -8
- package/src/components/Field/field.anatomy.stories.tsx +7 -7
- package/src/components/Field/field.principles.stories.tsx +1 -1
- package/src/components/Field/field.spec.md +9 -7
- package/src/components/Field/field.tsx +2 -1
- package/src/components/Field/form-validation.spec.md +6 -3
- package/src/components/Field/use-form-validation.ts +49 -21
- package/src/components/FieldControlGroup/field-control-group.anatomy.stories.tsx +11 -10
- package/src/components/FieldControlGroup/field-control-group.principles.stories.tsx +3 -3
- package/src/components/FieldControlGroup/field-control-group.spec.md +3 -3
- package/src/components/FieldControlGroup/field-control-group.tsx +3 -3
- package/src/components/FileItem/file-item.anatomy.stories.tsx +6 -4
- package/src/components/FileItem/file-item.tsx +3 -2
- package/src/components/FileUpload/file-upload.anatomy.stories.tsx +1 -1
- package/src/components/FileUpload/file-upload.spec.md +4 -1
- package/src/components/FileUpload/file-upload.tsx +36 -10
- package/src/components/FileViewer/can-render-image.ts +15 -0
- package/src/components/FileViewer/file-viewer.anatomy.stories.tsx +6 -4
- package/src/components/FileViewer/file-viewer.spec.md +2 -2
- package/src/components/FileViewer/file-viewer.tsx +47 -21
- package/src/components/FileViewer/image-renderer.tsx +3 -8
- package/src/components/HoverCard/hover-card.spec.md +1 -1
- package/src/components/HoverCard/hover-card.tsx +3 -1
- package/src/components/Input/input.anatomy.stories.tsx +4 -4
- package/src/components/Input/input.principles.stories.tsx +1 -1
- package/src/components/Input/input.spec.md +1 -1
- package/src/components/Input/input.stories.tsx +11 -5
- package/src/components/Input/input.tsx +11 -9
- package/src/components/LinkInput/link-input.anatomy.stories.tsx +2 -0
- package/src/components/LinkInput/link-input.tsx +49 -34
- package/src/components/Menu/menu-item.anatomy.stories.tsx +1 -1
- package/src/components/Menu/menu-item.spec.md +4 -3
- package/src/components/Menu/menu-item.tsx +15 -4
- package/src/components/Notice/notice.anatomy.stories.tsx +10 -5
- package/src/components/Notice/notice.spec.md +4 -3
- package/src/components/Notice/notice.tsx +22 -5
- package/src/components/NumberInput/number-input.anatomy.stories.tsx +5 -4
- package/src/components/NumberInput/number-input.principles.stories.tsx +2 -1
- package/src/components/NumberInput/number-input.spec.md +2 -1
- package/src/components/NumberInput/number-input.tsx +25 -9
- package/src/components/OverflowIndicator/overflow-indicator.anatomy.stories.tsx +3 -3
- package/src/components/OverflowIndicator/overflow-indicator.spec.md +1 -1
- package/src/components/OverflowIndicator/overflow-indicator.tsx +2 -1
- package/src/components/Pagination/index.ts +5 -0
- package/src/components/Pagination/pagination.anatomy.stories.tsx +143 -0
- package/src/components/Pagination/pagination.principles.stories.tsx +81 -0
- package/src/components/Pagination/pagination.spec.md +150 -0
- package/src/components/Pagination/pagination.stories.tsx +98 -0
- package/src/components/Pagination/pagination.tsx +263 -0
- package/src/components/PeoplePicker/people-picker.anatomy.stories.tsx +1 -1
- package/src/components/PeoplePicker/people-picker.spec.md +4 -4
- package/src/components/PeoplePicker/people-picker.stories.tsx +1 -1
- package/src/components/PeoplePicker/people-picker.tsx +65 -55
- package/src/components/PeoplePicker/person-display.tsx +10 -4
- package/src/components/Popover/popover.anatomy.stories.tsx +2 -2
- package/src/components/Popover/popover.spec.md +13 -14
- package/src/components/Popover/popover.tsx +88 -39
- package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +4 -4
- package/src/components/ProfileCard/profile-card.principles.stories.tsx +2 -2
- package/src/components/ProfileCard/profile-card.spec.md +1 -2
- package/src/components/ProfileCard/profile-card.stories.tsx +1 -1
- package/src/components/ProfileCard/profile-card.tsx +29 -8
- package/src/components/RadioGroup/radio-group.principles.stories.tsx +1 -1
- package/src/components/RadioGroup/radio-group.spec.md +2 -2
- package/src/components/RadioGroup/radio-group.stories.tsx +3 -1
- package/src/components/RadioGroup/radio-group.tsx +37 -3
- package/src/components/Rating/rating.anatomy.stories.tsx +11 -8
- package/src/components/Rating/rating.principles.stories.tsx +1 -1
- package/src/components/Rating/rating.spec.md +2 -2
- package/src/components/Rating/rating.stories.tsx +1 -1
- package/src/components/Rating/rating.tsx +3 -3
- package/src/components/ScrollArea/scroll-area.spec.md +1 -0
- package/src/components/ScrollArea/scroll-area.tsx +1 -1
- package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +3 -3
- package/src/components/SegmentedControl/segmented-control.spec.md +7 -3
- package/src/components/SegmentedControl/segmented-control.tsx +29 -11
- package/src/components/Select/select.anatomy.stories.tsx +2 -2
- package/src/components/Select/select.spec.md +3 -2
- package/src/components/Select/select.tsx +62 -19
- package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +1 -1
- package/src/components/SelectMenu/select-menu.principles.stories.tsx +1 -1
- package/src/components/SelectMenu/select-menu.spec.md +12 -8
- package/src/components/SelectMenu/select-menu.tsx +176 -20
- package/src/components/SelectionControl/selection-item.anatomy.stories.tsx +1 -1
- package/src/components/SelectionControl/selection-item.principles.stories.tsx +2 -2
- package/src/components/SelectionControl/selection-item.spec.md +2 -1
- package/src/components/SelectionControl/selection-item.stories.tsx +1 -1
- package/src/components/Separator/separator.anatomy.stories.tsx +2 -2
- package/src/components/Separator/separator.tsx +1 -1
- package/src/components/Sheet/sheet.spec.md +2 -1
- package/src/components/Sheet/sheet.tsx +4 -2
- package/src/components/Sidebar/sidebar.anatomy.stories.tsx +1 -1
- package/src/components/Sidebar/sidebar.spec.md +2 -1
- package/src/components/Sidebar/sidebar.stories.tsx +6 -4
- package/src/components/Sidebar/sidebar.tsx +41 -13
- package/src/components/Skeleton/skeleton.principles.stories.tsx +1 -1
- package/src/components/Skeleton/skeleton.spec.md +1 -2
- package/src/components/Skeleton/skeleton.tsx +1 -1
- package/src/components/Slider/slider.anatomy.stories.tsx +4 -4
- package/src/components/Slider/slider.spec.md +19 -85
- package/src/components/Slider/slider.tsx +13 -5
- package/src/components/Steps/steps.anatomy.stories.tsx +1 -1
- package/src/components/Steps/steps.spec.md +6 -4
- package/src/components/Steps/steps.tsx +11 -3
- package/src/components/Switch/switch.spec.md +4 -3
- package/src/components/Switch/switch.tsx +59 -10
- package/src/components/Tabs/tabs.anatomy.stories.tsx +7 -6
- package/src/components/Tabs/tabs.principles.stories.tsx +5 -3
- package/src/components/Tabs/tabs.spec.md +15 -48
- package/src/components/Tabs/tabs.tsx +70 -34
- package/src/components/Tag/tag.principles.stories.tsx +2 -2
- package/src/components/Tag/tag.spec.md +11 -43
- package/src/components/Tag/tag.tsx +30 -4
- package/src/components/Textarea/textarea.principles.stories.tsx +2 -1
- package/src/components/Textarea/textarea.spec.md +2 -1
- package/src/components/Textarea/textarea.tsx +20 -10
- package/src/components/TimePicker/time-picker.anatomy.stories.tsx +2 -1
- package/src/components/TimePicker/time-picker.spec.md +2 -2
- package/src/components/TimePicker/time-picker.tsx +35 -16
- package/src/components/Toast/toast.anatomy.stories.tsx +5 -6
- package/src/components/Toast/toast.principles.stories.tsx +10 -11
- package/src/components/Toast/toast.spec.md +5 -5
- package/src/components/Toast/toast.stories.tsx +5 -1
- package/src/components/Toast/toast.tsx +13 -7
- package/src/components/Tooltip/tooltip.spec.md +3 -3
- package/src/components/Tooltip/tooltip.tsx +1 -1
- package/src/components/TreeView/tree-view.anatomy.stories.tsx +6 -1
- package/src/components/TreeView/tree-view.principles.stories.tsx +2 -2
- package/src/components/TreeView/tree-view.spec.md +2 -2
- package/src/components/TreeView/tree-view.tsx +27 -5
- package/src/hooks/use-controllable.ts +7 -2
- package/src/hooks/use-is-touch-device.ts +8 -1
- package/src/index.ts +2 -1
- package/src/patterns/element-anatomy/element-anatomy.spec.md +3 -3
- package/src/patterns/element-anatomy/inline-action.spec.md +1 -1
- package/src/patterns/element-anatomy/item-anatomy.spec.md +5 -14
- package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1 -0
- package/src/patterns/element-anatomy/item-anatomy.tsx +5 -6
- package/src/patterns/header-canonical/header-canonical.css +1 -2
- package/src/patterns/header-canonical/header-canonical.spec.md +5 -5
- package/src/patterns/horizontal-overflow/horizontal-overflow.spec.md +5 -4
- package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +137 -0
- package/src/patterns/overlay-surface/overlay-surface.spec.md +8 -7
- package/src/patterns/overlay-surface/overlay-surface.stories.tsx +116 -0
- package/src/patterns/overlay-surface/overlay-surface.tsx +5 -5
- package/src/patterns/resize-handle/resize-handle.spec.md +1 -1
- package/src/tokens/categorical-color.ts +1 -1
- package/src/tokens/color/color.spec.md +11 -13
- package/src/tokens/color/color.stories.tsx +1 -1
- package/src/tokens/color/primitives.css +7 -5
- package/src/tokens/color/semantic.css +8 -2
- package/src/tokens/density/density.spec.md +2 -0
- package/src/tokens/elevation/elevation.spec.md +1 -1
- package/src/tokens/layoutSpace/layoutSpace.spec.md +2 -1
- package/src/tokens/layoutSpace/layoutSpace.stories.tsx +3 -3
- package/src/tokens/motion/motion.spec.md +1 -1
- package/src/tokens/motion/motion.stories.tsx +142 -0
- package/src/tokens/opacity/opacity.spec.md +1 -1
- package/src/tokens/opacity/opacity.stories.tsx +7 -11
- package/src/tokens/radius/radius.spec.md +1 -1
- package/src/tokens/typography/typography.css +1 -1
- package/src/tokens/typography/typography.spec.md +1 -1
- package/src/tokens/uiSize/icon-size.ts +2 -2
- package/src/tokens/uiSize/uiSize.spec.md +12 -11
- package/src/tokens/uiSize/uiSize.stories.tsx +103 -0
- package/src/tokens/utility-registry.json +5 -4
- package/dist/node_modules/react-hook-form/dist/index.esm.js +0 -1950
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +0 -1
|
@@ -639,9 +639,12 @@ rule_story_archetype_registry() {
|
|
|
639
639
|
continue
|
|
640
640
|
fi
|
|
641
641
|
|
|
642
|
-
# Read antiPatterns
|
|
642
|
+
# Read antiPatterns(block + warn 皆載;2026-07-04 dim 54 修:原只載 block → warn 條目=從未執行的紙防線)
|
|
643
|
+
# 每條三行一組:severity / regex / unlessRegex(jq -r 原始輸出零跳脫;**禁 @tsv/插值** —
|
|
644
|
+
# @tsv 把 regex 反斜線雙跳脫、插值 nested-quote 踩 jq lexer,2026-07-04 smoke 連抓兩雷)。
|
|
645
|
+
# unlessRegex 選填 — ERE 不支援 negative lookahead,兩段式替代:match 且 unless 不 match 才 fire。
|
|
643
646
|
local PATTERNS
|
|
644
|
-
PATTERNS=$(jq -r --arg c "$COMP" '.components[$c].antiPatterns[]? |
|
|
647
|
+
PATTERNS=$(jq -r --arg c "$COMP" '.components[$c].antiPatterns[]? | .severity, .regex, (.unlessRegex // "")' "$REGISTRY" 2>/dev/null)
|
|
645
648
|
[ -z "$PATTERNS" ] && continue
|
|
646
649
|
|
|
647
650
|
# 2026-06-03 修:CONTENT 換行 → 空格再 grep。真實 JSX 是多行(<ChromeHeader> 與 <span> 分行),
|
|
@@ -649,10 +652,18 @@ rule_story_archetype_registry() {
|
|
|
649
652
|
# 靜默漏 = 假 P0(對抗稽核抓到)。tr 後整段成單行,[[:space:]]* / .* 才能跨原換行匹配。
|
|
650
653
|
local CONTENT_FLAT
|
|
651
654
|
CONTENT_FLAT=$(echo "$CONTENT" | tr '\n' ' ')
|
|
652
|
-
while
|
|
655
|
+
while read -r SEV && read -r PATTERN && { read -r UNLESS || true; }; do
|
|
653
656
|
[ -z "$PATTERN" ] && continue
|
|
657
|
+
# regex self-test(2026-07-04 dim 54:PCRE lookahead 混入曾致 grep exit 2 靜默永不 fire;fail-loud)
|
|
658
|
+
echo x | grep -qE "$PATTERN" 2>/dev/null
|
|
659
|
+
if [ $? -eq 2 ]; then
|
|
660
|
+
echo "⚠️ R8 registry regex 不可執行(ERE invalid,此條防線失效,修 registry):$PATTERN" >&2
|
|
661
|
+
continue
|
|
662
|
+
fi
|
|
654
663
|
if echo "$CONTENT_FLAT" | grep -qE "$PATTERN"; then
|
|
655
|
-
|
|
664
|
+
# unlessRegex 存在且 match → 豁免(兩段式 negative)
|
|
665
|
+
if [ -n "$UNLESS" ] && echo "$CONTENT_FLAT" | grep -qE "$UNLESS" 2>/dev/null; then continue; fi
|
|
666
|
+
echo "⚠️ R8 story_archetype_registry violation(severity: $SEV):" >&2
|
|
656
667
|
echo " $FILE_PATH wrap <$COMP> matches anti-pattern:" >&2
|
|
657
668
|
echo " regex: $PATTERN" >&2
|
|
658
669
|
echo " per registry: .claude/references/story-baseline-registry.json#components.$COMP.antiPatterns" >&2
|
|
@@ -660,7 +671,8 @@ rule_story_archetype_registry() {
|
|
|
660
671
|
echo " 修法:Read baseline story + helpers,抄 production archetype。" >&2
|
|
661
672
|
echo " 或加 \`// @story-baseline-allow: <reason>\` 檔頭豁免(audit-logged)。" >&2
|
|
662
673
|
echo " 詳 .claude/rules/meta-patterns.md M35 + memory/feedback_nearest_same_purpose_canonical.md" >&2
|
|
663
|
-
|
|
674
|
+
# 2026-06-02 升 P0 BLOCKER(block-severity record_worst);warn-severity stderr-only(2026-07-04 補實作)
|
|
675
|
+
[ "$SEV" = "block" ] && record_worst 2
|
|
664
676
|
fi
|
|
665
677
|
done <<< "$PATTERNS"
|
|
666
678
|
done
|
|
@@ -43,8 +43,9 @@ case "$FILE_PATH" in
|
|
|
43
43
|
esac
|
|
44
44
|
|
|
45
45
|
# Allowlist:storybook config / scripts / tests 等非 production code
|
|
46
|
+
# (dim 59 2026-07-04:*.test.ts → *.test.* 補 .test.tsx;第一道 case 已限 tsx/ts/css,不會誤放 .md)
|
|
46
47
|
case "$FILE_PATH" in
|
|
47
|
-
*.stories.tsx|*.test
|
|
48
|
+
*.stories.tsx|*.test.*|*.spec.ts|*/scripts/*) exit 0 ;;
|
|
48
49
|
esac
|
|
49
50
|
|
|
50
51
|
[ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ] && exit 0
|
|
@@ -63,7 +64,9 @@ RECENT_USER_MSGS=$(tail -200 "$TRANSCRIPT_PATH" 2>/dev/null | \
|
|
|
63
64
|
# (a) 加「妳」變體(`照妳`= `照你` 文書通用 variant)
|
|
64
65
|
# (b) 加「決策[一二三四五六七八九十1-9]」numbered directive(eg.「決策一改…」「決策3做」)
|
|
65
66
|
# (c) 加「做到好」/「都做」/「全做」auto-approve 變體
|
|
66
|
-
|
|
67
|
+
# 2026-07-04 M7 detection-breadth fix(user verbatim「同意補詞」拍板):「核可修 production 佇列」曾被判
|
|
68
|
+
# 0 approval — 20+ 口語變體卻漏最標準的「核可 / 批准」,補上。
|
|
69
|
+
APPROVAL_RE='(同意|採用|採納|拍板|拍\s*[A-Z0-9]|核可|批准|可以|改成|改為|執行|上吧|push|implement|go ahead|approved|OK|好|沒問題|做一做|就做|做吧|做完|全部做完|做到完|做到好|都做|全做|馬不停蹄|建議做|ship|合 main|^#[0-9]+|照你|照妳|照建議|照共識|照我的|按照|決策[一二三四五六七八九十1-9]|[A-Z][0-9]+\s*(做|改|修)|先\s*[A-Z][0-9]+)'
|
|
67
70
|
HAS_APPROVAL=$(echo "$RECENT_USER_MSGS" | grep -cE "$APPROVAL_RE" 2>/dev/null)
|
|
68
71
|
HAS_APPROVAL=${HAS_APPROVAL:-0}
|
|
69
72
|
|
|
@@ -436,6 +436,106 @@
|
|
|
436
436
|
"propose_pre_grep_verify": {
|
|
437
437
|
"dims": [],
|
|
438
438
|
"note": "2026-05-18 ship(M18 Q0 Pre-ASK self-verify governance infra):PreToolUse Edit/Write planning/reports/handoff *.md 偵測 propose keyword(請拍板 / 等你拍板 / 決策 N / 我推 A/B/C / 選項)但 content 無 file:line cite 證據 → P1 stderr warn。Escape:檔頭 <!-- @propose-pre-verified --> 含 rationale。起因 2026-05-18 Sheet/inline-action/SurfaceBody 三題 propose 給 user 拍板,grep 後 0 個真 gap;user verbatim「不是老早就跟你說過要我決策前請先基於我們所有的檔案包括設計原則包括 ssot 包括所有實作代碼,自主自動驗證這些問題是否真的是問題」"
|
|
439
|
+
},
|
|
440
|
+
"tabs_content_chrome_body_double_gap": {
|
|
441
|
+
"dims": [
|
|
442
|
+
89,
|
|
443
|
+
90
|
|
444
|
+
],
|
|
445
|
+
"note": "2026-07-03 entry add per audit-preflight gap:write-time P0(Check1 tabs double-gap + Check2 overlay-body fixed macro gap);audit-time dim 89 sweep + dim 90 judgment"
|
|
446
|
+
},
|
|
447
|
+
"storybook_addon_packaging": {
|
|
448
|
+
"dims": [
|
|
449
|
+
87
|
|
450
|
+
],
|
|
451
|
+
"note": "2026-07-03 entry add:packaging 事故家族(beta.27-31)write-time P0;audit-time 由 dim 87 dogfood prepublish(npm install + build-storybook consumer view)deterministic cover"
|
|
452
|
+
},
|
|
453
|
+
"tailwind_wildcard_in_docs": {
|
|
454
|
+
"dims": [],
|
|
455
|
+
"note": "2026-07-03 entry add:beta.27 release-fail anchor write-time P0;audit-time 由 release preflight build gate(build:lib + build-storybook)deterministic cover,無獨立 dim"
|
|
456
|
+
},
|
|
457
|
+
"chrome_header_avatar_canonical": {
|
|
458
|
+
"dims": [],
|
|
459
|
+
"note": "2026-07-03 entry add per audit-preflight gap:write-time P0 攔 chrome header 內 ItemAvatar 誤用(header-canonical 消費紀律);audit-time 由 dim 1 design-language + A.1b per-component cover,無獨立 dim"
|
|
460
|
+
},
|
|
461
|
+
"codex_brief_invariants": {
|
|
462
|
+
"dims": [],
|
|
463
|
+
"note": "2026-07-03 entry add per audit-preflight gap:codex-collab runtime 紀律(brief 三 invariant);governance-only,solo mode 不涉"
|
|
464
|
+
},
|
|
465
|
+
"consumer_app_invariants": {
|
|
466
|
+
"dims": [
|
|
467
|
+
69,
|
|
468
|
+
70,
|
|
469
|
+
71,
|
|
470
|
+
82
|
|
471
|
+
],
|
|
472
|
+
"note": "2026-07-03 entry add per audit-preflight gap:consumer app DS 使用紀律 write-time ×4;audit-time dim 69-71(no-catalog/@story-baseline/primitive misuse)+ 82(app story title)"
|
|
473
|
+
},
|
|
474
|
+
"ds_anchor_preflight": {
|
|
475
|
+
"dims": [
|
|
476
|
+
57
|
|
477
|
+
],
|
|
478
|
+
"note": "2026-07-03 entry add per audit-preflight gap:M29 anchor preflight;dim 57 直接對應(enforcement coverage)"
|
|
479
|
+
},
|
|
480
|
+
"escape_marker_abuse": {
|
|
481
|
+
"dims": [
|
|
482
|
+
76
|
|
483
|
+
],
|
|
484
|
+
"note": "2026-07-03 entry add per audit-preflight gap:dim 76 escape marker abuse 直接對應"
|
|
485
|
+
},
|
|
486
|
+
"full_story_visual_interaction_sweep": {
|
|
487
|
+
"dims": [
|
|
488
|
+
73
|
|
489
|
+
],
|
|
490
|
+
"note": "2026-07-03 entry add per audit-preflight gap:dim 73 full-story sweep 直接對應"
|
|
491
|
+
},
|
|
492
|
+
"item_list_gap": {
|
|
493
|
+
"dims": [
|
|
494
|
+
21
|
|
495
|
+
],
|
|
496
|
+
"note": "2026-07-03 entry add per audit-preflight gap:M16 standalone gap;dim 21 直接對應"
|
|
497
|
+
},
|
|
498
|
+
"layout_space_magic_numbers": {
|
|
499
|
+
"dims": [
|
|
500
|
+
90
|
|
501
|
+
],
|
|
502
|
+
"note": "2026-07-03 entry add per audit-preflight gap:app-code write-time P0(skip DS-src by design);DS-src 由 dim 90 judgment sweep cover"
|
|
503
|
+
},
|
|
504
|
+
"orphan_ds_css": {
|
|
505
|
+
"dims": [],
|
|
506
|
+
"note": "2026-07-03 entry add per audit-preflight gap:write-time P0(css 不在 aggregator 也沒被 import = orphan;失敗記憶索引條目);audit-time 由 build + visual 間接,無獨立 dim"
|
|
507
|
+
},
|
|
508
|
+
"overlay_open_focus_escape_probe": {
|
|
509
|
+
"dims": [
|
|
510
|
+
74
|
|
511
|
+
],
|
|
512
|
+
"note": "2026-07-03 entry add per audit-preflight gap:dim 74 overlay probe 直接對應"
|
|
513
|
+
},
|
|
514
|
+
"plugin_fork_health": {
|
|
515
|
+
"dims": [
|
|
516
|
+
58
|
|
517
|
+
],
|
|
518
|
+
"note": "2026-07-03 entry add per audit-preflight gap:dim 58 plugin install enforcement 直接對應"
|
|
519
|
+
},
|
|
520
|
+
"post_main_ssot_propagate": {
|
|
521
|
+
"dims": [
|
|
522
|
+
64
|
|
523
|
+
],
|
|
524
|
+
"note": "2026-07-03 entry add per audit-preflight gap:dim 64 post-main-push SSOT propagation 直接對應"
|
|
525
|
+
},
|
|
526
|
+
"propose_discipline": {
|
|
527
|
+
"dims": [],
|
|
528
|
+
"note": "2026-07-03 entry add per audit-preflight gap:Stop hook runtime 紀律(中文人話 + cite);governance-only"
|
|
529
|
+
},
|
|
530
|
+
"propose_without_benchmark": {
|
|
531
|
+
"dims": [],
|
|
532
|
+
"note": "2026-07-03 entry add per audit-preflight gap:M26 runtime 紀律(propose 前 WebFetch);governance-only"
|
|
533
|
+
},
|
|
534
|
+
"sidebar_menu_button_implicit_wrap": {
|
|
535
|
+
"dims": [
|
|
536
|
+
71
|
|
537
|
+
],
|
|
538
|
+
"note": "2026-07-03 entry add per audit-preflight gap:write-time 攔隱式 wrap;audit-time dim 71 primitive misuse + A.1b composition cover"
|
|
439
539
|
}
|
|
440
540
|
},
|
|
441
541
|
"newDims_2026_05_17": {
|
|
@@ -79,9 +79,10 @@
|
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"id": "datatable-toolbar-no-popover-wrap",
|
|
82
|
-
"regex": "startIcon=\\{(Filter|ArrowUpDown)\\}
|
|
82
|
+
"regex": "startIcon=\\{(Filter|ArrowUpDown)\\}",
|
|
83
83
|
"severity": "warn",
|
|
84
|
-
"rationale": "DataTable toolbar filter/sort button 必包在 Popover 內,內含真 DataTableFilterPanel / DataTableSortManager primitive"
|
|
84
|
+
"rationale": "DataTable toolbar filter/sort button 必包在 Popover 內,內含真 DataTableFilterPanel / DataTableSortManager primitive(2026-07-04 dim 54:原 PCRE lookahead 在 ERE grep exit 2 永不 fire → 改兩段式 regex+unlessRegex)",
|
|
85
|
+
"unlessRegex": "DataTableFilterPanel|DataTableSortManager"
|
|
85
86
|
}
|
|
86
87
|
]
|
|
87
88
|
},
|
|
@@ -104,4 +105,4 @@
|
|
|
104
105
|
]
|
|
105
106
|
}
|
|
106
107
|
}
|
|
107
|
-
}
|
|
108
|
+
}
|
|
@@ -42,7 +42,7 @@ detect_mode() {
|
|
|
42
42
|
| Mode | A.0 全盤閱讀 scope | A.1 audit dim scope | Phase B codex scope |
|
|
43
43
|
|---|---|---|---|
|
|
44
44
|
| **ds-repo**(DS owner workflow,含 template SSOT 編輯)| full DS canonical + spec + token + pattern + memory + `template/ds-product-template/` scaffold | 全 dim per `/design-system-audit --deep` SSOT(含 dim 83 cross-3-repo runtime audit)**+ chain `/product-ui-audit` 對 `apps/template`**(DS owner dogfood 自家消費端 surface,用 fork user 同等產品標準把關)| 全 dim parallel verify |
|
|
45
|
-
| **fork-user-repo**(published template repo / fork user product repo)| `node_modules/@qijenchen/design-system/CLAUDE.md` + `ds-canonical/rules/meta-patterns.md` + `apps/**` + 本 repo `CLAUDE.md` | dim 83 fork-side runtime checks(
|
|
45
|
+
| **fork-user-repo**(published template repo / fork user product repo)| `node_modules/@qijenchen/design-system/CLAUDE.md` + `ds-canonical/rules/meta-patterns.md` + `apps/**` + 本 repo `CLAUDE.md` | dim 83 fork-side runtime checks(**C-prime committed 治理鏈 fire〔fork-governance-dispatcher.sh Pre/Post/UserPromptSubmit 讀 ds-canonical/fork/manifest.json + inject_fork_governance_preamble.sh SessionStart;免 plugin,2026-06-17 改版〕** / cross-load / setup-netlify smoke / **deploy URL hook 每次 push 吐 URL live** / **環境建置斷點清單通暢 + 無法自動的斷點有 plain-中文引導**)+ **完整 consumer/fork enforcement dim 集(2026-05-30 補,原僅 62-67 漏掉 bootstrap 等)**:58(plugin install + bootstrap chicken-egg gate)/ 59(approval-preflight `apps/**`)/ 62(Netlify onboarding + 斷點清單 + ≥6 條中文引導話術)/ 63(deploy URL auto-reply 每次必吐)/ 64(post-main-push SSOT propagation)/ 69-71(consumer no-catalog / @story-baseline / DS primitive misuse)/ 73-74(full-story sweep / overlay probe)/ 75(plugin freshness)/ 76(escape marker abuse)/ 82(consumer app story title)| 同 dim,fork-side verify;**禁** propose DS source change |
|
|
46
46
|
|
|
47
47
|
### Fork-mode safety invariants(2026-05-29 加)
|
|
48
48
|
|
|
@@ -175,7 +175,7 @@ User 2026-05-15 verbatim 抓「DS 深度稽核漏 storybook content quality」+
|
|
|
175
175
|
| 55 | **Token cross-namespace mapping integrity**(2026-05-20 codify per user 抓 red→deep-orange bug 100+ audit 沒發現)| `tokens/color/semantic.css` 每 hue interaction token(`--blue-hover` / `--red-hover` / ...)必指向**同名**primitive(`--red-hover: var(--color-red-N)`),**禁**跨 hue 混(`--red-hover: var(--color-deep-orange-N)` 違反)。Primitive 12 hue 全該有對應 interaction(blue/red/deep-orange/orange/amber/yellow/lime/green/turquoise/indigo/purple/magenta)。Status semantic(`--error-hover` 等)直指 primitive,**不**透過 hue layer。錨例:2026-05-20 semantic.css:246 `--red-hover: var(--color-deep-orange-5)` cross-namespace bug,100+ audit 沒發現 = audit 沒檢 token mapping integrity |
|
|
176
176
|
| 56 | **AppShell primary-header consistency**(2026-05-21 codify;2026-06-18 beta.74 擴 V3 + responsive 豁免)| 對每 consumer `.tsx`(stories / app code)grep `layout="primary-header"`(三種 JSX 引號形式 `layout="x"` / `{"x"}` / `{'x'}` 皆偵測,grep -E 字面引號),verify 3 條:(V1) 同 file 含 `globalHeader=` prop(否則邏輯矛盾)/(V2) 不含裸 `<SidebarHeader>`(WorkspaceBrand 該在 globalHeader,不重複;**例外**:同 file 用 `useSidebar`/`isMobile` = mobile-only Sheet 補品牌的 responsive fork → 豁免)/(V3) 不含 `<SidebarFooter>`(帳號入口家在 globalHeader 右、收成 Sheet 鏡像到 Sheet header 右,**不該**用 sidebar footer〔那是 primary-sidebar 慣例〕;**無** isMobile 豁免)。trigger 用 tag-boundary `([^A-Za-z]|$)` 避 prefix-extended 名誤觸。World-class cite:GitHub repo sidebar 無 header + Gmail / Figma brand 在 global top bar + Material modal nav drawer「account switcher 放 drawer header」。Hook `check_app_shell_primary_header_consistency.sh`(V1-V3)write-time exit 2 BLOCKER(via chrome_header_dispatcher,可 escape `// @app-shell-primary-header-allow:`)。對應 `app-shell.spec.md`「WorkspaceBrand 放置 SSOT」+「帳號入口(Account entry)放置 SSOT」段(均含 Responsive 精修子句)|
|
|
177
177
|
| 57 | **M29 DS Anchor Preflight enforcement coverage**(2026-05-26 codify per user verbatim「該程式化的都沒程式化」)| 對每 `*.tsx`(production code,非 stories / test)grep wrap DS primitive(`<Sidebar>` / `<AppShell>` / `<DataTable>` 等)→ verify 過去 30 turns transcript 含 `Grep`/`Read` tool call hit `packages/design-system/src/**/*.spec.md` 或 `*.stories.tsx`,OR 檔頭含 `@story-baseline:` marker 或 inline 3-column owner table。Hook `check_ds_anchor_preflight.sh` write-time soft BLOCKER。對應 meta-patterns.md M29 + self-verify.md Pre-edit phase。錨例:2026-05-26 App.tsx 漏 SidebarTrigger / collapsible / startIcon mock-drift = M29 hook 不存在使 infra 沒攔 |
|
|
178
|
-
| 58 | **Fork-user
|
|
178
|
+
| 58 | **Fork-user 治理鏈 enforcement**(2026-05-26 codify per user「我們做那麼多 plugin 不就是要避免這件事?」;**2026-06-17 C-prime 改版:主路徑 = committed-config + npm,免 plugin**〔beta.70 真機蓋章;plugin 路線不可靠 per memory `reference_cloud_governance_loading`〕)| SessionStart hook `check_plugin_fork_health.sh` 偵測 fork repo(cwd 非 DS repo + `package.json` 含 `@qijenchen/design-system` dep)治理鏈缺失 → 印 npm 修法提示(r1)+ local vs published 版本 stale 比對提示 `npm run sync-all`(r2)。**Chicken-egg 層(C-prime,取代 2026-05-30 bootstrap hooks — `check_plugin_bootstrap.sh` / `block_production_edit_without_plugin.sh` 已 retired,`refresh-fork-launchers.mjs` OBSOLETE_HOOKS 主動移除避免 brick)**:fork 自帶 committed 啟動器 `fork-governance-dispatcher.sh`(Pre/Post/UserPromptSubmit 讀 `node_modules/@qijenchen/design-system/ds-canonical/fork/manifest.json` 跑官方 fork hooks;任一 exit 2 轉發 BLOCK;manifest 缺 → exit 0 永不 brick)+ `inject_fork_governance_preamble.sh`(SessionStart install-if-missing + 設計紀律 preamble)+ `.claude/settings.json` 註冊;**治理本體在 node_modules = npm install 覆蓋官方控管**,`build-fork-governance.mjs` 從 DS repo hooks 生 manifest,`test-fork-governance.mjs` 回歸鎖。Audit verify:dispatcher 轉發 exit 2 / manifest event 覆蓋 / obsolete hook 移除。對應 template CLAUDE.md「🚀 Onboarding(C-prime)」段 |
|
|
179
179
|
| 59 | **Approval preflight scope coverage**(2026-05-26 extend per user「未來其他人 fork 用其他元件也偏移」)| `check_substantive_edit_approval_preflight.sh` scope 從 `packages/design-system/src/**` 擴大到 `apps/**.{tsx,ts,css}` + `node_modules/@qijenchen/design-system/**`。Audit verify hook regex 涵蓋三 scope + allowlist `*.stories.tsx`/`*.test.*`/`scripts/*`。對應 memory/feedback_ship_then_revert_anti_pattern.md SSOT |
|
|
180
180
|
| 60 | **M26 propose-without-benchmark enforcement**(2026-05-26 backfill)| UserPromptSubmit hook `check_propose_without_benchmark.sh` 偵測 user prompt 含 propose / 建議 / 方案 / 看法 / visual / behavior keyword + 過去 20 turns transcript 中 `WebFetch`/`WebSearch` tool_use count < 2 → soft inject 提醒「propose 前必跑 ≥3 source benchmark」。對應 meta-patterns.md M26 + propose-options/SKILL.md。錨例:2026-05-05 user 反覆糾「為什麼每次都沒 webfetch 只憑印象」 |
|
|
181
181
|
| 61 | **M16 item-list gap + M23(c) DataTable framework prop conflict enforcement**(2026-05-26 backfill)| PreToolUse hooks 兩 invariant:(a) `check_item_list_gap.sh` — 2+ `<FileItem>` / `<MenuItem variant="rich">` 在同 NEW content 且無 `gap-N` / `space-y-N` parent → warn(M16);(b) `check_datatable_invariants.sh(r2 folded,2026-06-11)` — `ColumnDef` 上下文出現 `size: <number>` 但無 `meta: { width: ... }` → warn TanStack `size:px` vs DS `size:density` 框架 prop 衝突(M23(c))。對應 meta-patterns.md M16 + M23(c) + item-anatomy.spec.md + data-table.spec.md |
|
|
@@ -190,7 +190,7 @@ User 2026-05-15 verbatim 抓「DS 深度稽核漏 storybook content quality」+
|
|
|
190
190
|
| 70 | **Consumer @story-baseline enforcement**(2026-05-27 M31 codex synthesis)| 對 consumer `apps/**/*.stories.tsx` grep:用高風險 DS primitive(DataTable / Dialog / Sheet / Popover / DropdownMenu / Tooltip / HoverCard / LinkInput / RadioGroup / CircularProgress / AppShell / Sidebar)但無 `// @story-baseline: <DS-story-path>#<exportName>` marker → 違反(consumer 必 reference DS canonical story 才 enable visual diff CI)。Hook `check_consumer_app_invariants.sh(r2,2026-06-11 merge)` PostToolUse BLOCKER,escape `// @story-baseline-allow:`。SSOT mapping → `ds-story-manifest.json`(DS package ship)|
|
|
191
191
|
| 71 | **Consumer DS primitive misuse anti-pattern**(2026-05-27 per user「做產品真的要能使用跟 ds repo 一模一樣的元件」)| 對 consumer `apps/**/*.{tsx,ts}` production + stories grep:`<CircularProgress size={N}>` literal number 覆蓋 default 24 / `<RadioGroupItem>` 無 `<SelectionItem control={...}>` wrap / `<DataTable columns={[single-col]}>` minimal / `<LinkInput placeholder=...>` 無 `value` prop / `<Empty title=...>` 無 icon AND 無 description / Overlay story 無 `defaultOpen` 視覺 snapshot 看不到 content / **硬寫色值-字級-shadow 繞 token(`bg-[#hex]` / `text-[14px]` / `shadow-md`,2026-06-02 Pattern 8,CF conformance-model 主防線)** / **AppShell slot 餵 raw element(`sidebar={<div>}` 等,2026-06-12 Pattern 9,app-shell.spec:296-299)** / **手刻 RAW primitive 取代 DS 元件(raw `<table>`+`<thead>`/`<th>`→`<DataTable>` / `<img rounded-full>`→`<Avatar>` / native `<select>`→`<Select>` / `<hr>`→`<Separator>`,2026-06-16 Pattern 10,user 抓 fork prototype 手刻 table 不用 DataTable;反 pattern 由 `build-ui-canonicals.md` ❌→✅ 對照表 SSOT 驅動;落實「優先消費既有元件」大原則機械閘 — 補 Pattern 1-9 只抓「DS 元件用錯」、漏「根本沒用 DS 元件亂刻 raw HTML」之洞;`@ds-misuse-allow:` 有理由可豁免)**。**判斷層補掃(2026-06-12 fork 四不像 + 先驗滲漏 anchor;hook 零誤判原則不上 regex)**:(a) page-level entry 手拼 raw 殼而無 `<DS.AppShell>`(對照 app-shell.spec「何時用/不用」表;愈不用 DS 愈不觸 hook = 反直覺洞)(b) 手刻 right panel(`w-[Npx] border-l` div,該走 `aside={<AppShellAside>}`)(c) ChromeHeader/頁頂 tabs 沒走 `withTabs` lockstep(header-canonical.spec「withTabs 連動」段)(d) BulkActionBar 內 primary 鈕 / 浮層 shadow(bulk-action-bar.spec 禁止事項 — regex 無法 bound 到 actions slot,判斷層接)(e) FileViewer toolbar 加鈕不走 `onCapabilitiesChange`(file-viewer.spec:183-194;R9 skip-list 豁免該家族故無寫入網)(f) chrome 面(ChromeHeader/SidebarFooter)title 下第二行(registry 簽名涵蓋 stories;fork production code 由本 dim 接)。Hook `check_consumer_app_invariants.sh(r3,2026-06-11 merge)` BLOCKER。Per-violation cite spec.md file:line。Escape `// @ds-misuse-allow:` |
|
|
192
192
|
| 72 | **DS API surface tightening**(2026-05-27 — 治標 vs 治本)| Hook 71 偵測 anti-pattern 是 lint 層攔截;治本要 DS API design 強到 misuse 即 fail tsc。Audit:逐 component review API surface — `size?: number` 該改 `'sm'\|'md'\|'lg'` enum / `columns: Column[]` 該加 min length runtime check / `title` + `description` 該有 type-level XOR / Overlay primitive `defaultOpen` 該 require explicit。配套 codify in `tightening-roadmap.md`(若存在;不存在則以 `props-naming.md` + 各 spec API 段為準,對齊 audit-prompts.md dim 72),分 quarter ship。對應 Dim 71 是攔當前 misuse,本 dim 是消除未來 misuse 可能 |
|
|
193
|
-
| 73 | **Full-story visual+interaction sweep enforce**(2026-05-27 codex M31 P0 finding)| Audit report JSON `storyResults.length === manifest.totalStories`(916)。Sample <
|
|
193
|
+
| 73 | **Full-story visual+interaction sweep enforce**(2026-05-27 codex M31 P0 finding)| Audit report JSON `storyResults.length === manifest.totalStories`(動態讀 `ds-story-manifest.json`,禁 hardcode 數字 — 2026-07-04 dim 73 修 stale 916)。Sample < totalStories = reject(per user「不准抽樣」)。Hook `check_full_story_visual_interaction_sweep.sh` PostToolUse audit-report.json BLOCKER。Escape `"_sampling_allowed": "<rationale>"`(極罕見)|
|
|
194
194
|
| 74 | **Overlay open/focus/Escape probe**(2026-05-27 codex M31 P0 finding + user 7-bug 錨點「overlay 沒彈出」)| Consumer story 用 Tooltip / Popover / Dialog / Sheet / DropdownMenu / HoverCard Trigger 必含 `defaultOpen` OR `open={true}` OR `play()` interaction click。Trigger-only catalog = reject(visual snapshot 看不到 content)。Hook `check_overlay_open_focus_escape_probe.sh` BLOCKER。HoverCard exception via `@story-trait-allow: missing-opensnapshot` per codex |
|
|
195
195
|
| 75 | **Plugin freshness session-start prompt**(2026-05-27 chain-C ship + user「主動引導」directive)| Fork user session_start hook `check_plugin_fork_health.sh(r2,2026-06-11 merge)` reads local installed plugin.json version → fetch GitHub raw marketplace.json → diff version → if stale prompt run `npm run sync-all`. Sync-all 1-command(2026-06-17 起 npm-only,不再跑 `claude plugin`):npm update 治理本體 + idempotent 刷新接線骨架 + skills;生效分軌(機械即時 / settings 自動 hot-reload / 指引 `/clear` 或下個 session)|
|
|
196
196
|
| 76 | **Escape marker abuse cap**(2026-05-27 per user「不亂加 escape markers」)| Consumer file 10 escape markers 累計 ≥3 distinct types OR ≥5 total → BLOCK。修法 3 選 1:重構走 DS canonical / 拆 file / env override `CLAUDE_BYPASS_ESCAPE_MARKER_AUDIT`。Hook `check_escape_marker_abuse.sh` enforces escape philosophy「rare per-line documented exception,非 daily tool」|
|
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-06T11:37:10.794Z"
|
|
11
11
|
},
|
|
12
12
|
"components": {
|
|
13
13
|
"accordion": {
|
|
@@ -375,7 +375,6 @@
|
|
|
375
375
|
"tiers": {
|
|
376
376
|
"展示": [
|
|
377
377
|
"design-system-components-circularprogress-展示--default",
|
|
378
|
-
"design-system-components-circularprogress-展示--button-loading",
|
|
379
378
|
"design-system-components-circularprogress-展示--inline-action",
|
|
380
379
|
"design-system-components-circularprogress-展示--inline-cell-loading",
|
|
381
380
|
"design-system-components-circularprogress-展示--full-screen-overlay"
|
|
@@ -499,7 +498,8 @@
|
|
|
499
498
|
"design-system-components-datatable-展示--row-drag-interactive",
|
|
500
499
|
"design-system-components-datatable-展示--row-drag-with-virtualization",
|
|
501
500
|
"design-system-components-datatable-展示--roadmap-all-in-one",
|
|
502
|
-
"design-system-components-datatable-展示--roadmap-perf-budget"
|
|
501
|
+
"design-system-components-datatable-展示--roadmap-perf-budget",
|
|
502
|
+
"design-system-components-datatable-展示--with-pagination"
|
|
503
503
|
],
|
|
504
504
|
"設計規格": [
|
|
505
505
|
"design-system-components-datatable-設計規格--overview",
|
|
@@ -563,6 +563,7 @@
|
|
|
563
563
|
"design-system-components-datepicker-展示--show-time",
|
|
564
564
|
"design-system-components-datepicker-展示--range-popover-open",
|
|
565
565
|
"design-system-components-datepicker-展示--show-time-popover-open",
|
|
566
|
+
"design-system-components-datepicker-展示--need-confirm-date-only-open",
|
|
566
567
|
"design-system-components-datepicker-展示--show-time-range-popover-open",
|
|
567
568
|
"design-system-components-datepicker-展示--range-middle-hover-state",
|
|
568
569
|
"design-system-components-datepicker-展示--show-time-range",
|
|
@@ -587,6 +588,7 @@
|
|
|
587
588
|
"openSnapshotIds": [
|
|
588
589
|
"design-system-components-datepicker-展示--range-popover-open",
|
|
589
590
|
"design-system-components-datepicker-展示--show-time-popover-open",
|
|
591
|
+
"design-system-components-datepicker-展示--need-confirm-date-only-open",
|
|
590
592
|
"design-system-components-datepicker-展示--show-time-range-popover-open"
|
|
591
593
|
],
|
|
592
594
|
"exception": null
|
|
@@ -686,7 +688,6 @@
|
|
|
686
688
|
"展示": [
|
|
687
689
|
"design-system-components-empty-展示--search-no-results",
|
|
688
690
|
"design-system-components-empty-展示--no-tasks",
|
|
689
|
-
"design-system-components-empty-展示--load-failure",
|
|
690
691
|
"design-system-components-empty-展示--no-permission"
|
|
691
692
|
],
|
|
692
693
|
"設計規格": [
|
|
@@ -1033,6 +1034,28 @@
|
|
|
1033
1034
|
"openSnapshotIds": [],
|
|
1034
1035
|
"exception": null
|
|
1035
1036
|
},
|
|
1037
|
+
"pagination": {
|
|
1038
|
+
"tiers": {
|
|
1039
|
+
"展示": [
|
|
1040
|
+
"design-system-components-pagination-展示--default",
|
|
1041
|
+
"design-system-components-pagination-展示--full-bar",
|
|
1042
|
+
"design-system-components-pagination-展示--many-pages",
|
|
1043
|
+
"design-system-components-pagination-展示--states"
|
|
1044
|
+
],
|
|
1045
|
+
"設計規格": [
|
|
1046
|
+
"design-system-components-pagination-設計規格--overview",
|
|
1047
|
+
"design-system-components-pagination-設計規格--inspector",
|
|
1048
|
+
"design-system-components-pagination-設計規格--color-matrix",
|
|
1049
|
+
"design-system-components-pagination-設計規格--state-behavior",
|
|
1050
|
+
"design-system-components-pagination-設計規格--accessibility"
|
|
1051
|
+
],
|
|
1052
|
+
"設計原則": [
|
|
1053
|
+
"design-system-components-pagination-設計原則--usage-guidance"
|
|
1054
|
+
]
|
|
1055
|
+
},
|
|
1056
|
+
"openSnapshotIds": [],
|
|
1057
|
+
"exception": null
|
|
1058
|
+
},
|
|
1036
1059
|
"peoplepicker": {
|
|
1037
1060
|
"tiers": {
|
|
1038
1061
|
"展示": [
|
|
@@ -1088,22 +1111,22 @@
|
|
|
1088
1111
|
"profilecard": {
|
|
1089
1112
|
"tiers": {
|
|
1090
1113
|
"展示": [
|
|
1091
|
-
"design-system-
|
|
1114
|
+
"design-system-components-profilecard-展示--default"
|
|
1092
1115
|
],
|
|
1093
1116
|
"設計規格": [
|
|
1094
|
-
"design-system-
|
|
1095
|
-
"design-system-
|
|
1096
|
-
"design-system-
|
|
1097
|
-
"design-system-
|
|
1098
|
-
"design-system-
|
|
1099
|
-
"design-system-
|
|
1100
|
-
"design-system-
|
|
1117
|
+
"design-system-components-profilecard-設計規格--overview",
|
|
1118
|
+
"design-system-components-profilecard-設計規格--inspector",
|
|
1119
|
+
"design-system-components-profilecard-設計規格--section-matrix",
|
|
1120
|
+
"design-system-components-profilecard-設計規格--color-matrix",
|
|
1121
|
+
"design-system-components-profilecard-設計規格--hover-card-integration",
|
|
1122
|
+
"design-system-components-profilecard-設計規格--state-behavior",
|
|
1123
|
+
"design-system-components-profilecard-設計規格--accessibility"
|
|
1101
1124
|
],
|
|
1102
1125
|
"設計原則": [
|
|
1103
|
-
"design-system-
|
|
1104
|
-
"design-system-
|
|
1105
|
-
"design-system-
|
|
1106
|
-
"design-system-
|
|
1126
|
+
"design-system-components-profilecard-設計原則--usage-guidance",
|
|
1127
|
+
"design-system-components-profilecard-設計原則--trigger-context-rule",
|
|
1128
|
+
"design-system-components-profilecard-設計原則--fixed-width-rule",
|
|
1129
|
+
"design-system-components-profilecard-設計原則--section-rule"
|
|
1107
1130
|
]
|
|
1108
1131
|
},
|
|
1109
1132
|
"openSnapshotIds": [],
|
|
@@ -1679,6 +1702,6 @@
|
|
|
1679
1702
|
"exception": null
|
|
1680
1703
|
}
|
|
1681
1704
|
},
|
|
1682
|
-
"totalComponents":
|
|
1683
|
-
"totalStories":
|
|
1705
|
+
"totalComponents": 63,
|
|
1706
|
+
"totalStories": 920
|
|
1684
1707
|
}
|
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.82。
|
|
4
4
|
|
|
5
5
|
# Components
|
|
6
6
|
|
|
@@ -209,6 +209,11 @@ Source(AI 讀此看官方範例): src/components/LinkInput/
|
|
|
209
209
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
210
210
|
Source(AI 讀此看官方範例): src/components/NumberInput/
|
|
211
211
|
|
|
212
|
+
## Pagination(family composite)
|
|
213
|
+
|
|
214
|
+
Storybook: https://ajenchen-design-system.netlify.app
|
|
215
|
+
Source(AI 讀此看官方範例): src/components/Pagination/
|
|
216
|
+
|
|
212
217
|
## PeoplePicker(family 4)
|
|
213
218
|
|
|
214
219
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
@@ -219,6 +224,11 @@ Source(AI 讀此看官方範例): src/components/PeoplePicker/
|
|
|
219
224
|
Storybook: https://ajenchen-design-system.netlify.app
|
|
220
225
|
Source(AI 讀此看官方範例): src/components/Popover/
|
|
221
226
|
|
|
227
|
+
## ProfileCard(family composite)
|
|
228
|
+
|
|
229
|
+
Storybook: https://ajenchen-design-system.netlify.app
|
|
230
|
+
Source(AI 讀此看官方範例): src/components/ProfileCard/
|
|
231
|
+
|
|
222
232
|
## ProgressBar(family self-contained)
|
|
223
233
|
|
|
224
234
|
Storybook: https://ajenchen-design-system.netlify.app
|
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
|
+
> 56 components + 4 public patterns + design tokens。v0.1.0-beta.82。
|
|
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)。
|
|
@@ -40,8 +40,10 @@
|
|
|
40
40
|
- [Input](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Input
|
|
41
41
|
- [LinkInput](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/LinkInput
|
|
42
42
|
- [NumberInput](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/NumberInput
|
|
43
|
+
- [Pagination](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Pagination
|
|
43
44
|
- [PeoplePicker](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/PeoplePicker
|
|
44
45
|
- [Popover](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Popover
|
|
46
|
+
- [ProfileCard](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/ProfileCard
|
|
45
47
|
- [ProgressBar](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/ProgressBar
|
|
46
48
|
- [RadioGroup](https://ajenchen-design-system.netlify.app): sizes:sm/md/lg — src:components/RadioGroup
|
|
47
49
|
- [Rating](https://ajenchen-design-system.netlify.app): 見 Storybook / spec — src:components/Rating
|
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.82",
|
|
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",
|
|
@@ -21,11 +21,12 @@ export const Overview: Story = {
|
|
|
21
21
|
<div className="flex flex-col gap-10">
|
|
22
22
|
<div>
|
|
23
23
|
<H3>Anatomy</H3>
|
|
24
|
-
<Desc>Alert 跟 Toast 共用同一套排版、圖示與主題策略。結構:圖示 + 標題 + 說明文字 + 右側操作區(endContent)+
|
|
24
|
+
<Desc>Alert 跟 Toast 共用同一套排版、圖示與主題策略。結構:圖示 + 標題 + 說明文字 + 右側操作區(endContent)+ 右上角關閉鈕(需傳 onDismiss 才渲染)。</Desc>
|
|
25
25
|
<Alert
|
|
26
26
|
variant="warning"
|
|
27
27
|
title="方案即將到期"
|
|
28
28
|
description="您的 Pro 方案將在 3 天後到期,請及時續訂以維持服務"
|
|
29
|
+
onDismiss={() => {}} // anatomy 展示含 dismiss X slot(2026-07-05 D4:X 僅在傳 onDismiss 時渲染)
|
|
29
30
|
/>
|
|
30
31
|
</div>
|
|
31
32
|
|
|
@@ -42,8 +43,8 @@ export const Overview: Story = {
|
|
|
42
43
|
['title', 'ReactNode', '必填', '主要訊息'],
|
|
43
44
|
['description', 'ReactNode', '—', '補充說明'],
|
|
44
45
|
['endContent', 'ReactNode', '—', '右側操作區(CTA 按鈕等)'],
|
|
45
|
-
['dismissible', 'boolean', 'true', '
|
|
46
|
-
['onDismiss', '() => void', '—', '
|
|
46
|
+
['dismissible', 'boolean', 'true', '搭配 onDismiss 顯示右上角關閉按鈕(兩者同時成立才渲染 X)'],
|
|
47
|
+
['onDismiss', '() => void', '—', '按下關閉按鈕時觸發;未傳則不渲染 X(2026-07-05 D4)'],
|
|
47
48
|
].map(([p, t, d, desc]) => (
|
|
48
49
|
<tr key={p}><Td mono>{p}</Td><Td mono>{t}</Td><Td mono>{d}</Td><Td>{desc}</Td></tr>
|
|
49
50
|
))}
|
|
@@ -71,6 +72,7 @@ export const Inspector: InspectorStory = {
|
|
|
71
72
|
title: '方案即將到期',
|
|
72
73
|
description: '您的 Pro 方案將在 3 天後到期,請及時續訂以維持服務',
|
|
73
74
|
dismissible: true,
|
|
75
|
+
onDismiss: () => {}, // 2026-07-05 D4:X 僅在傳 onDismiss 時渲染,Inspector 切 dismissible 才看得到 X
|
|
74
76
|
},
|
|
75
77
|
argTypes: {
|
|
76
78
|
variant: {
|
|
@@ -90,7 +92,7 @@ export const Inspector: InspectorStory = {
|
|
|
90
92
|
},
|
|
91
93
|
title: { control: 'text', description: '主要訊息' },
|
|
92
94
|
description: { control: 'text', description: '補充說明' },
|
|
93
|
-
dismissible: { control: 'boolean', description: '是否顯示關閉按鈕' },
|
|
95
|
+
dismissible: { control: 'boolean', description: '是否顯示關閉按鈕(需同時傳 onDismiss 才渲染 X)' },
|
|
94
96
|
},
|
|
95
97
|
render: (args) => <Alert {...args} />,
|
|
96
98
|
}
|
|
@@ -189,11 +191,12 @@ export const StateBehavior: Story = {
|
|
|
189
191
|
<div>
|
|
190
192
|
<H3>Dismissible(右側 close icon)</H3>
|
|
191
193
|
<Desc>
|
|
192
|
-
Alert 預設 `dismissible=true
|
|
194
|
+
Alert 預設 `dismissible=true`,**傳入 `onDismiss` 時**右上角顯示 close button(未傳 handler 不渲染 X——controlled-only,無 handler 的 X 是死按鈕;2026-07-05 D4)。按 close 觸發 `onDismiss` 由 consumer 控制移除(Alert 本身不 own unmount 狀態——inline 通知通常需要 consumer 記住「使用者已關閉」狀態)。
|
|
193
195
|
</Desc>
|
|
194
196
|
<div className="flex flex-col gap-3 max-w-xl">
|
|
195
|
-
<Alert variant="info" title="可關閉" description="右上角有 close icon,按下觸發 onDismiss" />
|
|
197
|
+
<Alert variant="info" title="可關閉" description="右上角有 close icon,按下觸發 onDismiss" onDismiss={() => {}} />
|
|
196
198
|
<Alert variant="warning" title="不可關閉" description="永久性警告,設 dismissible={false} 隱藏 close icon" dismissible={false} />
|
|
199
|
+
<Alert variant="neutral" title="靜態通知" description="沒傳 onDismiss 時同樣不渲染 close icon(避免按了沒反應的假 affordance)" />
|
|
197
200
|
</div>
|
|
198
201
|
</div>
|
|
199
202
|
|
|
@@ -134,7 +134,7 @@ Alert chrome corner 可承載多個 action(close 左側並排):
|
|
|
134
134
|
|
|
135
135
|
### Multi corner action 場景
|
|
136
136
|
|
|
137
|
-
目前 Alert API 只透過 `dismissible` 渲染單一 close X。多 corner action 場景目前不支援;若未來 consumer 有需求,走 Checkpoint 3 決策(M8 benchmark + consumer survey),不預先投機擴 API。
|
|
137
|
+
目前 Alert API 只透過 `dismissible` + `onDismiss` 渲染單一 close X(X 僅在傳 `onDismiss` 時渲染——controlled-only,無 handler 的 X 是死按鈕;對齊 Polaris Banner `onDismiss`-driven,2026-07-05 D4,詳 `../Notice/notice.spec.md`「邊界案例」)。多 corner action 場景目前不支援;若未來 consumer 有需求,走 Checkpoint 3 決策(M8 benchmark + consumer survey),不預先投機擴 API。
|
|
138
138
|
|
|
139
139
|
---
|
|
140
140
|
|
|
@@ -155,7 +155,7 @@ Subtle vs Solid 的完整 variant × theme class 對照見 anatomy `ColorMatrix`
|
|
|
155
155
|
- **`inline`(預設)**:頁面內嵌,圓角 + 邊框,像一張 card 嵌在內容區塊裡
|
|
156
156
|
- **`fixed`**:頂部全域警告,無圓角無邊框,橫跨頁面寬度
|
|
157
157
|
|
|
158
|
-
**為什麼兩種 placement 的圓角不同**:inline 是 content-level card(rounded-md = 4px,對齊 Alert 的 inline 容器身份,與
|
|
158
|
+
**為什麼兩種 placement 的圓角不同**:inline 是 content-level card(rounded-md = 4px,對齊 Alert 的 inline 容器身份,與 Card 同 tier — 見 `tokens/radius/radius.spec.md`「一般元件」;Dialog 屬浮層走 rounded-lg);fixed 是 page-level bar(無 radius,橫跨畫面形成整條)。Toast 是浮層用 `rounded-lg`(8px,浮層慣例),跟 Alert 區分。
|
|
159
159
|
|
|
160
160
|
完整 placement 對照見 anatomy `PlacementMatrix` story。
|
|
161
161
|
|
|
@@ -180,7 +180,7 @@ Subtle vs Solid 的完整 variant × theme class 對照見 anatomy `ColorMatrix`
|
|
|
180
180
|
|
|
181
181
|
## 邊界案例
|
|
182
182
|
|
|
183
|
-
- **Disabled(dismiss button)**:Alert **不提供 dismiss 停用 API**——banner dismiss 恆可用(對齊 Polaris / Material Banner:通知關閉鈕應永遠可按)。Alert 本身亦無 `disabled` prop(持久通知不該被禁用)。若需防止 close action(API in-flight)被雙擊,consumer 在 `onDismiss` 內自行 debounce / 加上層鎖,不在 UI 層加 disable(Alert 不提供 dismiss 停用 API、也不把 disabled 轉傳給內部 dismiss Button;Button primitive 本身支援 disabled,但 Alert 刻意不開洞)。
|
|
183
|
+
- **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
184
|
- **Loading**:Alert 本身不需 loading state(非 async surface);若 Alert body action row 內 CTA 在 async 動作中,該 Button 自己處理 `loading` prop。
|
|
185
185
|
- **Empty / icon-only**:Alert 必有 `title`(API contract),無 empty 場景;若無 description 則僅顯示 title + icon,layout 自動收斂。
|
|
186
186
|
- **極長字串**:title 單行 truncate、description 自由換行不截斷(皆繼承 ItemContent 預設);description 超過 2–3 行屬誤用,改 Dialog(見禁止事項)。
|
|
@@ -66,6 +66,11 @@ export interface AlertProps
|
|
|
66
66
|
title: React.ReactNode
|
|
67
67
|
description?: React.ReactNode
|
|
68
68
|
endContent?: React.ReactNode
|
|
69
|
+
/**
|
|
70
|
+
* 顯示關閉鈕(預設 true)。**需同時傳 `onDismiss` 才會渲染 X** — Alert 是 controlled-only
|
|
71
|
+
* (不自我移除),無 handler 的 X 是死按鈕(2026-07-05 D4;對齊 Polaris Banner / Ant Alert)。
|
|
72
|
+
* 條件判斷 SSOT 在 Notice(notice.tsx `showDismiss`),Alert 原樣 forward。
|
|
73
|
+
*/
|
|
69
74
|
dismissible?: boolean
|
|
70
75
|
onDismiss?: () => void
|
|
71
76
|
}
|
|
@@ -80,7 +85,10 @@ const Alert = React.forwardRef<HTMLDivElement, AlertProps>(
|
|
|
80
85
|
title,
|
|
81
86
|
description,
|
|
82
87
|
endContent,
|
|
83
|
-
|
|
88
|
+
// 2026-07-05 D4:不 destructure-default(原 `= true` 會把「consumer 沒傳」materialize 成顯式
|
|
89
|
+
// true,讓 Notice 的 dev-warn 無法分辨消費端矛盾)。等效預設 true 由 Notice showDismiss
|
|
90
|
+
// `!== false` 承擔,行為不變;X 僅在同時傳 onDismiss 時渲染(SSOT 在 notice.tsx)。
|
|
91
|
+
dismissible,
|
|
84
92
|
onDismiss,
|
|
85
93
|
className,
|
|
86
94
|
...props
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// @anatomy-rationale: Inspector + ColorMatrix N/A — AppShell 是 page-level layout composite
|
|
2
|
+
// (sidebar+header+main+aside 組合),無 cva color variant → ColorMatrix N/A;
|
|
3
|
+
// 無 interactive prop control(slots 全 ReactNode 組合)→ Inspector N/A(Dim 13 例外 marker)。
|
|
1
4
|
// @benchmark-cited: anatomy 6-canonical 對齊 Polaris / Material anatomy spec
|
|
2
5
|
// @story-baseline: packages/design-system/src/components/Sidebar/sidebar.stories.tsx#IconCollapse
|
|
3
6
|
// (透過 ./_demo-helpers AcmeSidebar / PageHeader / WorkspaceBrand / UserFooter 共用 baseline,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
component: AppShell
|
|
3
3
|
family: composite # 組合 sidebar+header+main+aside,非 Family 1-4 row element
|
|
4
|
+
traits: [] # page-level layout composite,slots 全 ReactNode 組合,無 trait variants(R3 trait enforce 無適用項;2026-07-04 dim 29 補宣告)
|
|
4
5
|
scope: web service page-level layout primitive (sidebar + header + main + aside composition)
|
|
5
6
|
benchmark:
|
|
6
7
|
- Mantine AppShell: https://mantine.dev/core/app-shell/ — 6-slot (Header/Navbar/Aside/Footer/Main) + layout="default|alt" mode
|
|
@@ -201,7 +202,7 @@ function CustomAside() {
|
|
|
201
202
|
- `primary-header` mode:右側 fix 在 **Header 下方**(不 underlap header,跟 sidebar 同高 — 都從 header 底邊起)
|
|
202
203
|
- Width consumer 自傳 `width` prop(`number` 或 `{ md, xl }` breakpoint-keyed),DS 不發明 width token,**clamp `min-width: 240` / `max-width: 640`** 避免過窄無法閱讀 / 過寬擠 main
|
|
203
204
|
- 跟 main 共享 layout space(main width = viewport - sidebar - aside)
|
|
204
|
-
- **Scroll ownership**:Aside 自帶 scroll(
|
|
205
|
+
- **Scroll ownership**:Aside 自帶 scroll(body 包 `<ScrollArea>` primitive + `min-h-0`,per Atlassian Layout 慣例),main 自帶 scroll,**禁止** body-level scroll
|
|
205
206
|
|
|
206
207
|
**Modal overlay** 行為:
|
|
207
208
|
- 消費既有 `sheet.spec.md` canonical(從右滑出 + Esc 關 + click-outside 關 + focus trap + restore focus)
|
|
@@ -262,7 +263,7 @@ Main 內塞什麼(table / field / card / page header / list)的 layout + spacing
|
|
|
262
263
|
| **`⌘.`(macOS)/ `Ctrl+.`(Windows)** | Toggle aside | Linear convention(新加) |
|
|
263
264
|
| **Skip-to-main link** | `Tab` 第一站 focus 「Skip to content」link → `main` | A11y WCAG 2.4.1 bypass blocks;對齊 Atlassian Layout skip-link |
|
|
264
265
|
|
|
265
|
-
兩者消費既有 Sidebar keyboard shortcut 機制(`useEffect` + `
|
|
266
|
+
兩者消費既有 Sidebar keyboard shortcut 機制(`useEffect` + `window.addEventListener('keydown')`),AppShell 不發明新機制。
|
|
266
267
|
|
|
267
268
|
---
|
|
268
269
|
|
|
@@ -282,7 +282,7 @@ AppShell.displayName = 'AppShell'
|
|
|
282
282
|
* AppShellAside — right panel:standard inline(desktop) vs modal overlay(mobile)。
|
|
283
283
|
*
|
|
284
284
|
* Desktop(viewport ≥ 768px):
|
|
285
|
-
* - Render 直接放 layout grid 右側(asideOpen
|
|
285
|
+
* - Render 直接放 layout grid 右側(AppShell 恆 render {aside};AppShellAside 於 !asideOpen 自行 return null — 內部自決,非 via parent)
|
|
286
286
|
* - 不蓋 mask / background 可操作 / 佔 layout 寬
|
|
287
287
|
* - Vertical extent:primary-sidebar → 頂天立地 / primary-header → header 下方
|
|
288
288
|
*
|
|
@@ -3,8 +3,7 @@ component: AspectRatio
|
|
|
3
3
|
family: self-contained
|
|
4
4
|
variants: {}
|
|
5
5
|
sizes: {}
|
|
6
|
-
traits:
|
|
7
|
-
- isMatrixHeavy
|
|
6
|
+
traits: [] # 2026-07-04 audit:移除幻影 isMatrixHeavy(spec body「為何無 Matrix」明文 rationale + 0 matrix stories,trait 與自家宣告矛盾)
|
|
8
7
|
benchmark:
|
|
9
8
|
- Radix AspectRatio primitive: github.com/radix-ui/primitives/tree/main/packages/react/aspect-ratio
|
|
10
9
|
---
|