@qijenchen/design-system 0.1.0-beta.81 → 0.1.0-beta.83
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 +2 -3
- package/dist/components/Avatar/avatar.d.ts.map +1 -1
- package/dist/components/Avatar/avatar.js +1 -2
- package/dist/components/Avatar/avatar.js.map +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts +3 -0
- 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 +1 -1
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js +5 -2
- package/dist/components/Button/button.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/Checkbox/checkbox.d.ts +1 -1
- package/dist/components/Checkbox/checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/checkbox.js +2 -1
- package/dist/components/Checkbox/checkbox.js.map +1 -1
- package/dist/components/Chip/chip.d.ts +2 -2
- package/dist/components/Chip/chip.d.ts.map +1 -1
- package/dist/components/Chip/chip.js +41 -12
- package/dist/components/Chip/chip.js.map +1 -1
- package/dist/components/Coachmark/coachmark.d.ts.map +1 -1
- package/dist/components/Coachmark/coachmark.js +6 -6
- package/dist/components/Coachmark/coachmark.js.map +1 -1
- package/dist/components/Combobox/combobox.d.ts +1 -1
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +5 -2
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/Command/command.d.ts +1 -1
- package/dist/components/Command/command.d.ts.map +1 -1
- package/dist/components/Command/command.js +2 -1
- package/dist/components/Command/command.js.map +1 -1
- package/dist/components/DataTable/data-table.d.ts +29 -1
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +71 -13
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DataTable/filter-tree.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.d.ts +2 -2
- package/dist/components/DateGrid/date-grid.d.ts.map +1 -1
- package/dist/components/DateGrid/date-grid.js +54 -10
- 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 +15 -3
- 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/DropdownMenu/dropdown-menu.d.ts +3 -3
- package/dist/components/DropdownMenu/dropdown-menu.d.ts.map +1 -1
- package/dist/components/DropdownMenu/dropdown-menu.js +14 -4
- 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.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.map +1 -1
- package/dist/components/Field/use-form-validation.js +5 -7
- package/dist/components/Field/use-form-validation.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 +11 -5
- 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 +20 -13
- 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 +11 -3
- package/dist/components/Input/input.js.map +1 -1
- package/dist/components/LinkInput/link-input.d.ts +1 -1
- package/dist/components/LinkInput/link-input.d.ts.map +1 -1
- package/dist/components/LinkInput/link-input.js.map +1 -1
- package/dist/components/Menu/menu-item.d.ts.map +1 -1
- package/dist/components/Menu/menu-item.js +4 -3
- package/dist/components/Menu/menu-item.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 +2 -1
- package/dist/components/NumberInput/number-input.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 +1 -1
- package/dist/components/PeoplePicker/people-picker.d.ts.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +2 -1
- 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 +1 -1
- 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 +6 -1
- 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 +2 -1
- package/dist/components/RadioGroup/radio-group.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 +16 -8
- package/dist/components/SegmentedControl/segmented-control.js.map +1 -1
- package/dist/components/Select/select.d.ts +1 -1
- package/dist/components/Select/select.d.ts.map +1 -1
- package/dist/components/Select/select.js +13 -2
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/SelectMenu/index.js +3 -2
- package/dist/components/SelectMenu/select-menu.d.ts +15 -3
- package/dist/components/SelectMenu/select-menu.d.ts.map +1 -1
- package/dist/components/SelectMenu/select-menu.js +150 -99
- package/dist/components/SelectMenu/select-menu.js.map +1 -1
- package/dist/components/Sheet/sheet.d.ts.map +1 -1
- package/dist/components/Sheet/sheet.js +1 -1
- 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 +5 -2
- package/dist/components/Sidebar/sidebar.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/Switch/switch.d.ts +1 -1
- package/dist/components/Switch/switch.d.ts.map +1 -1
- package/dist/components/Switch/switch.js +10 -2
- package/dist/components/Switch/switch.js.map +1 -1
- package/dist/components/Tabs/tabs.d.ts +3 -3
- package/dist/components/Tabs/tabs.d.ts.map +1 -1
- package/dist/components/Tabs/tabs.js +29 -9
- 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 +13 -1
- package/dist/components/Tag/tag.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts.map +1 -1
- package/dist/components/Textarea/textarea.js +4 -1
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +20 -7
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/Toast/toast.d.ts.map +1 -1
- package/dist/components/Toast/toast.js +4 -1
- package/dist/components/Toast/toast.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 +8 -3
- 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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.d.ts.map +1 -1
- package/dist/patterns/element-anatomy/item-anatomy.js.map +1 -1
- package/ds-canonical/fork/governance.lock +14 -8
- package/ds-canonical/fork/hooks/check_ds_anchor_preflight.sh +15 -4
- package/ds-canonical/fork/hooks/check_opacity_token_usage.sh +8 -0
- package/ds-canonical/fork/hooks/check_story_determinism.sh +37 -0
- package/ds-canonical/fork/manifest.json +5 -0
- package/ds-canonical/fork/preamble.md +3 -1
- package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +6 -0
- package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +7 -0
- package/ds-canonical/fork/skills/performance-audit/SKILL.md +4 -2
- package/ds-canonical/fork/skills/visual-audit/SKILL.md +8 -0
- package/ds-canonical/hooks/check_benchmark_citation.sh +5 -3
- package/ds-canonical/hooks/check_ds_anchor_preflight.sh +15 -4
- package/ds-canonical/hooks/check_opacity_token_usage.sh +8 -0
- package/ds-canonical/hooks/check_propose_without_benchmark.sh +6 -2
- package/ds-canonical/hooks/check_ssot_header_declaration.sh +53 -0
- package/ds-canonical/hooks/check_story_determinism.sh +37 -0
- package/ds-canonical/hooks/tests/test_check_benchmark_citation.sh +3 -3
- package/ds-canonical/hooks/tests/test_check_fork_user_plugin_install.sh +3 -1
- package/ds-canonical/hooks/tests/test_check_opacity_token_usage.sh +2 -2
- package/ds-canonical/hooks/tests/test_check_ssot_header_declaration.sh +72 -0
- package/ds-canonical/rules/self-verify.md +1 -1
- package/ds-canonical/rules/spec-rules.md +1 -1
- package/ds-canonical/rules/ui-development.md +2 -0
- package/ds-canonical/skills/bug-fix-rhythm/SKILL.md +6 -0
- package/ds-canonical/skills/deep-audit-cross-codex/SKILL.md +11 -15
- package/ds-canonical/skills/delivery-handoff/SKILL.md +5 -0
- package/ds-canonical/skills/design-system-audit/SKILL.md +1 -1
- package/ds-canonical/skills/governance-health/SKILL.md +1 -0
- package/ds-canonical/skills/new-component/SKILL.md +2 -0
- package/ds-canonical/skills/performance-audit/SKILL.md +2 -2
- package/ds-canonical/skills/visual-audit/SKILL.md +8 -0
- package/ds-story-manifest.json +27 -4
- package/llms-full.txt +6 -1
- package/llms.txt +2 -1
- package/package.json +1 -1
- package/src/components/Avatar/avatar.spec.md +10 -30
- package/src/components/Avatar/avatar.tsx +13 -7
- package/src/components/Badge/badge.spec.md +1 -0
- package/src/components/Breadcrumb/breadcrumb.spec.md +1 -1
- package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +1 -1
- package/src/components/BulkActionBar/bulk-action-bar.tsx +8 -2
- package/src/components/Button/button.spec.md +1 -0
- package/src/components/Button/button.tsx +4 -1
- package/src/components/Calendar/calendar.anatomy.stories.tsx +3 -1
- package/src/components/Calendar/calendar.principles.stories.tsx +3 -1
- package/src/components/Calendar/calendar.spec.md +2 -1
- package/src/components/Calendar/calendar.stories.tsx +3 -1
- package/src/components/Calendar/calendar.tsx +53 -19
- package/src/components/Carousel/carousel.tsx +3 -1
- package/src/components/Checkbox/checkbox.tsx +2 -1
- package/src/components/Chip/chip.anatomy.stories.tsx +8 -8
- package/src/components/Chip/chip.principles.stories.tsx +3 -3
- package/src/components/Chip/chip.spec.md +6 -3
- package/src/components/Chip/chip.tsx +56 -11
- package/src/components/Coachmark/coachmark.tsx +10 -8
- package/src/components/Combobox/combobox.tsx +8 -2
- package/src/components/Command/command.tsx +2 -1
- package/src/components/DataTable/data-table.spec.md +52 -95
- package/src/components/DataTable/data-table.stories.tsx +47 -0
- package/src/components/DataTable/data-table.tsx +145 -11
- package/src/components/DataTable/filter-tree.ts +178 -51
- package/src/components/DateGrid/date-grid.spec.md +5 -4
- package/src/components/DateGrid/date-grid.tsx +64 -11
- package/src/components/DatePicker/date-picker.tsx +19 -3
- package/src/components/DescriptionList/description-list.tsx +3 -1
- package/src/components/DropdownMenu/dropdown-menu.spec.md +4 -3
- package/src/components/DropdownMenu/dropdown-menu.tsx +22 -4
- package/src/components/Empty/empty.spec.md +0 -1
- package/src/components/Empty/empty.tsx +4 -1
- package/src/components/Field/field-controls.spec.md +1 -1
- package/src/components/Field/field.tsx +2 -1
- package/src/components/Field/form-validation.spec.md +1 -1
- package/src/components/Field/use-form-validation.ts +11 -7
- package/src/components/FileItem/file-item.spec.md +9 -0
- package/src/components/FileUpload/file-upload.spec.md +1 -1
- package/src/components/FileUpload/file-upload.tsx +18 -7
- package/src/components/FileViewer/can-render-image.ts +15 -0
- package/src/components/FileViewer/file-viewer.tsx +43 -18
- 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.tsx +10 -4
- package/src/components/LinkInput/link-input.tsx +4 -1
- package/src/components/Menu/menu-item.anatomy.stories.tsx +1 -1
- package/src/components/Menu/menu-item.spec.md +2 -2
- package/src/components/Menu/menu-item.tsx +12 -3
- package/src/components/NumberInput/number-input.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.tsx +2 -1
- package/src/components/PeoplePicker/person-display.tsx +5 -1
- package/src/components/Popover/popover.anatomy.stories.tsx +1 -1
- package/src/components/Popover/popover.spec.md +2 -1
- package/src/components/Popover/popover.tsx +86 -37
- package/src/components/ProfileCard/profile-card.tsx +24 -6
- package/src/components/RadioGroup/radio-group.tsx +2 -1
- package/src/components/SegmentedControl/segmented-control.anatomy.stories.tsx +1 -1
- package/src/components/SegmentedControl/segmented-control.spec.md +6 -2
- package/src/components/SegmentedControl/segmented-control.tsx +15 -7
- package/src/components/Select/select.spec.md +1 -1
- package/src/components/Select/select.tsx +26 -4
- package/src/components/SelectMenu/select-menu.spec.md +2 -1
- package/src/components/SelectMenu/select-menu.tsx +86 -12
- package/src/components/Sheet/sheet.spec.md +1 -0
- package/src/components/Sheet/sheet.tsx +2 -1
- package/src/components/Sidebar/sidebar.tsx +5 -2
- 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.spec.md +1 -0
- package/src/components/Switch/switch.spec.md +1 -0
- package/src/components/Switch/switch.tsx +9 -1
- package/src/components/Tabs/tabs.anatomy.stories.tsx +4 -4
- package/src/components/Tabs/tabs.spec.md +13 -47
- package/src/components/Tabs/tabs.tsx +38 -9
- package/src/components/Tag/tag.principles.stories.tsx +1 -1
- package/src/components/Tag/tag.spec.md +11 -43
- package/src/components/Tag/tag.tsx +23 -1
- package/src/components/Textarea/textarea.principles.stories.tsx +2 -1
- package/src/components/Textarea/textarea.tsx +4 -1
- package/src/components/TimePicker/time-picker.tsx +31 -10
- package/src/components/Toast/toast.tsx +4 -1
- package/src/components/TreeView/tree-view.spec.md +1 -1
- package/src/components/TreeView/tree-view.tsx +10 -3
- package/src/hooks/use-controllable.ts +7 -2
- package/src/hooks/use-is-touch-device.ts +8 -1
- package/src/index.ts +1 -0
- package/src/patterns/element-anatomy/inline-action.spec.md +1 -1
- package/src/patterns/element-anatomy/item-anatomy.spec.md +1 -2
- package/src/patterns/element-anatomy/item-anatomy.tsx +4 -5
- package/src/patterns/horizontal-overflow/horizontal-overflow.stories.tsx +137 -0
- package/src/patterns/overlay-surface/overlay-surface.stories.tsx +116 -0
- package/src/tokens/color/color.spec.md +5 -7
- package/src/tokens/color/semantic.css +8 -2
- package/src/tokens/layoutSpace/layoutSpace.spec.md +1 -0
- package/src/tokens/motion/motion.stories.tsx +142 -0
- package/src/tokens/opacity/opacity.spec.md +1 -1
- package/src/tokens/uiSize/uiSize.stories.tsx +103 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-tree.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/filter-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoCH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAA;AAEtC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAA;IACd;;;0EAGsE;IACtE,aAAa,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,kDAAkD;IAClD,WAAW,EAAE,WAAW,CAAA;IACxB,kEAAkE;IAClE,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,WAAW,CAAA;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,EAAE,WAAW,CAAA;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAA;AAI1D,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAA;AACnE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAAA;AAMvE,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAK5D;
|
|
1
|
+
{"version":3,"file":"filter-tree.d.ts","sourceRoot":"","sources":["../../../src/components/DataTable/filter-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoCH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAA;AAEtC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAA;IACb,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAA;IACV,wBAAwB;IACxB,KAAK,EAAE,OAAO,CAAA;IACd;;;0EAGsE;IACtE,aAAa,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,kDAAkD;IAClD,WAAW,EAAE,WAAW,CAAA;IACxB,kEAAkE;IAClE,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,WAAW,CAAA;IACxB,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,EAAE,WAAW,CAAA;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAA;AAI1D,mDAAmD;AACnD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAAA;AACnE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,CAAA;AAMvE,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAK5D;AA8BD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAUvE;AA6ED;;;;;;;;;;;GAWG;AAEH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAuBhE;AAoMD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAMtF"}
|
|
@@ -30,7 +30,7 @@ import 'react-day-picker/style.css';
|
|
|
30
30
|
* | selected / range 端點 | 藍底白字圓 | [&>button]:bg-primary [&>button]:text-on-emphasis rounded-full |
|
|
31
31
|
* | range middle | 灰底矩形 track(bg-neutral-selected = neutral-2),**高度 = cell 高度**(28×28 @ md) | before pseudo: `inset-y-0 -inset-x-[2px]` |
|
|
32
32
|
* | range start/end 半圓 track | 左/右半圓 + selected 圓疊在上,**圓半徑 = button 半徑** | before pseudo: `rounded-l/r-full` + start `left-0 -right-[2px]` / end `-left-[2px] right-0`(向 middle 外擴 2px bridge gap)|
|
|
33
|
-
* | hover(未選中) | 藍圈 outline | hover:ring-[1.5px] hover:ring-primary |
|
|
33
|
+
* | hover(未選中) | 藍圈 outline | hover:ring-[1.5px] hover:ring-primary-hover(2026-07-07 統一:瞬時 hover = hover 階)|
|
|
34
34
|
*
|
|
35
35
|
* ── Range track 高度 canonical(2026-05-03 v6,M8 4 家對照)──
|
|
36
36
|
* Ant Design([picker source](https://github.com/ant-design/ant-design/blob/master/components/date-picker/style/panel.ts))/ Material X DateRangePicker([mui-x source](https://github.com/mui/mui-x/tree/master/packages/x-date-pickers-pro/src/DateRangeCalendar))/ Apple Calendar `@benchmark-unverified`(closed-source)/ Google Calendar `@benchmark-unverified`(closed-source)共識:
|
|
@@ -54,7 +54,7 @@ export declare const dateGridMeta: {
|
|
|
54
54
|
readonly family: null;
|
|
55
55
|
readonly variants: {};
|
|
56
56
|
readonly sizes: {};
|
|
57
|
-
readonly states: readonly ["default", "hover", "
|
|
57
|
+
readonly states: readonly ["default", "hover", "selected", "focus-visible", "disabled"];
|
|
58
58
|
readonly tokens: {
|
|
59
59
|
readonly bg: readonly ["bg-disabled", "bg-neutral-selected", "bg-on-emphasis", "bg-primary", "bg-primary-hover", "bg-transparent"];
|
|
60
60
|
readonly fg: readonly ["text-fg-disabled", "text-fg-muted", "text-foreground", "text-on-emphasis"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-grid.d.ts","sourceRoot":"","sources":["../../../src/components/DateGrid/date-grid.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,4BAA4B,CAAA;AAKnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"date-grid.d.ts","sourceRoot":"","sources":["../../../src/components/DateGrid/date-grid.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,OAAO,4BAA4B,CAAA;AAKnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,SAAS,CAAC,CAAA;AAUlE,QAAA,MAAM,QAAQ,kHAgLZ,CAAA;AAKF,eAAO,MAAM,YAAY;;;;;;;;;;;CAiBf,CAAA;AAEV,OAAO,EAAE,QAAQ,EAAE,CAAA"}
|
|
@@ -5,9 +5,13 @@ import { ChevronRight, ChevronLeft } from "lucide-react";
|
|
|
5
5
|
/* empty css */
|
|
6
6
|
import { cn } from "../../lib/utils.js";
|
|
7
7
|
import { Button } from "../Button/button.js";
|
|
8
|
+
const ZH_FULL_DATE = new Intl.DateTimeFormat("zh-TW", { dateStyle: "full" });
|
|
9
|
+
const ZH_MONTH_YEAR = new Intl.DateTimeFormat("zh-TW", { year: "numeric", month: "long" });
|
|
10
|
+
const ZH_WEEKDAY = new Intl.DateTimeFormat("zh-TW", { weekday: "long" });
|
|
8
11
|
const DateGrid = React.forwardRef(function DateGrid2({
|
|
9
12
|
className,
|
|
10
13
|
classNames,
|
|
14
|
+
labels,
|
|
11
15
|
showOutsideDays = true,
|
|
12
16
|
...props
|
|
13
17
|
}, _ref) {
|
|
@@ -56,7 +60,9 @@ const DateGrid = React.forwardRef(function DateGrid2({
|
|
|
56
60
|
"absolute inset-0 z-[1] flex items-center justify-center",
|
|
57
61
|
"font-normal text-body rounded-full transition-colors",
|
|
58
62
|
// Hover 藍圈 1.5px(對齊 Apple HIG / Ant `@benchmark-unverified` visual ring measurement)— ring 在 button 之上 + 透明 bg 不擋 range track
|
|
59
|
-
|
|
63
|
+
// 2026-07-07 user 拍板統一:瞬時 hover 進 primary 家族 = hover 階(FileUpload dropzone /
|
|
64
|
+
// Slider thumb hover 同族;base 專屬持續選中與 focus)——ring-primary → ring-primary-hover
|
|
65
|
+
"hover:ring-[1.5px] hover:ring-primary-hover hover:bg-transparent",
|
|
60
66
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
61
67
|
),
|
|
62
68
|
// today:藍色 underline bar 貼近數字
|
|
@@ -66,7 +72,8 @@ const DateGrid = React.forwardRef(function DateGrid2({
|
|
|
66
72
|
"[&>button]:after:bottom-[5px] [&>button]:after:left-1/2 [&>button]:after:-translate-x-1/2",
|
|
67
73
|
"[&>button]:after:w-[40%] [&>button]:after:h-[1.5px] [&>button]:after:rounded-full",
|
|
68
74
|
"[&>button]:after:bg-primary",
|
|
69
|
-
// today + selected:bar 切 on-emphasis(白)
|
|
75
|
+
// today + selected:bar 切 on-emphasis(白)— 只為「藍底白字圓」的選中日/端點設計;
|
|
76
|
+
// range 中段(淺灰底)由 range_middle 的 !bg-primary 覆寫回藍(2026-07-07 user 拍板)。
|
|
70
77
|
"[&[data-selected=true]>button]:after:bg-on-emphasis"
|
|
71
78
|
),
|
|
72
79
|
outside: "[&>button]:text-fg-muted",
|
|
@@ -105,12 +112,48 @@ const DateGrid = React.forwardRef(function DateGrid2({
|
|
|
105
112
|
range_middle: cn(
|
|
106
113
|
"before:content-[''] before:absolute before:inset-y-0 before:-inset-x-[2px]",
|
|
107
114
|
"before:bg-neutral-selected before:pointer-events-none",
|
|
108
|
-
//
|
|
115
|
+
// 2026-07-07 user 拍板:range 中段的 today bar 維持藍(切白只屬藍底選中日;白條在
|
|
116
|
+
// neutral-selected 淺灰底上近乎隱形 = today 標記消失)。!important 確定性壓過 today 的
|
|
117
|
+
// data-selected 切白規則(同權重靠 stylesheet 順序不可靠)。Ant 源碼實錘:cell-today
|
|
118
|
+
// 指示 = colorPrimary,in-range 只換底色、無規則隱藏/改色 today 指示(panel.ts)。
|
|
119
|
+
// 非 today 的中段日無 after content,本規則無作用 — 安全。
|
|
120
|
+
"[&>button]:after:!bg-primary",
|
|
121
|
+
// button 透明顯露 track。2026-07-05 對齊 RDP v9 真實行為(deep-audit A.1b):
|
|
122
|
+
// range 中段日同樣掛 selected modifier(useRange rangeIncludesDate 不排除中段)→
|
|
123
|
+
// 上方 selected 的 `[&>button]:hover:ring-0` 一併壓制 hover ring(與 selected 一致
|
|
124
|
+
// 的 hover 抑制),非原註解宣稱的「hover ring 仍顯示」;today bar 亦被 data-selected
|
|
125
|
+
// selector 切 on-emphasis(見 spec「組合狀態」段)。
|
|
109
126
|
"[&>button]:!bg-transparent [&>button]:!text-foreground"
|
|
110
127
|
),
|
|
111
128
|
hidden: "invisible",
|
|
112
129
|
...classNames
|
|
113
130
|
},
|
|
131
|
+
labels: {
|
|
132
|
+
labelPrevious: () => "上一個月",
|
|
133
|
+
labelNext: () => "下一個月",
|
|
134
|
+
// 鏡射 RDP default 結構(labels/labelDayButton.js:today 前綴 / selected 後綴),文案中文化
|
|
135
|
+
labelDayButton: (date, modifiers) => {
|
|
136
|
+
let label = ZH_FULL_DATE.format(date);
|
|
137
|
+
if (modifiers.today) label = `今天,${label}`;
|
|
138
|
+
if (modifiers.selected) label = `${label},已選取`;
|
|
139
|
+
return label;
|
|
140
|
+
},
|
|
141
|
+
// 未傳 mode 的非互動 grid(spec「mode 無預設值」段)day cell 走 labelGridcell
|
|
142
|
+
labelGridcell: (date, modifiers) => {
|
|
143
|
+
let label = ZH_FULL_DATE.format(date);
|
|
144
|
+
if (modifiers == null ? void 0 : modifiers.today) label = `今天,${label}`;
|
|
145
|
+
return label;
|
|
146
|
+
},
|
|
147
|
+
labelGrid: (date) => ZH_MONTH_YEAR.format(date),
|
|
148
|
+
labelWeekday: (date) => ZH_WEEKDAY.format(date),
|
|
149
|
+
// 以下非 default 渲染面(captionLayout dropdown / showWeekNumber 由 consumer 經
|
|
150
|
+
// {...props} 開啟)— 一併補齊,避免開啟後 SR 中英夾雜
|
|
151
|
+
labelMonthDropdown: () => "選擇月份",
|
|
152
|
+
labelYearDropdown: () => "選擇年份",
|
|
153
|
+
labelWeekNumber: (weekNumber) => `第 ${weekNumber} 週`,
|
|
154
|
+
labelWeekNumberHeader: () => "週數",
|
|
155
|
+
...labels
|
|
156
|
+
},
|
|
114
157
|
components: {
|
|
115
158
|
// ── Prev/Next nav(canonical 2026-05-03 v9,DS 一致設計語言)──
|
|
116
159
|
// User 2026-05-03 audit:「icon-only Button icon 都用 neutral-9,只有 dismiss 用 45%」
|
|
@@ -118,8 +161,9 @@ const DateGrid = React.forwardRef(function DateGrid2({
|
|
|
118
161
|
// 不開新 tier 自打嘴(撤銷 v6-v8 用 fg-muted override 的 mistake)。
|
|
119
162
|
// RDP v9 `PreviousMonthButton / NextMonthButton` override(node_modules/react-day-picker/dist/esm/components/Nav.js)
|
|
120
163
|
// ⚠️ children: _ 必丟棄(RDP 把 <Chevron> 當 children 傳 → 跟 Button startIcon 重疊變 double chevron)
|
|
121
|
-
// 2026-07-
|
|
122
|
-
//
|
|
164
|
+
// 2026-07-05 修:此處**不** hardcode aria-label — 中文走上方 labels API 正門,
|
|
165
|
+
// RDP 算好 labelPrevious()/labelNext() 後經 {...props} 流入 Button;
|
|
166
|
+
// spread 後 hardcode(07-04 舊修法)= 蓋死 consumer labels 覆寫通道。
|
|
123
167
|
PreviousMonthButton: ({ className: className2, children: _children, ...props2 }) => /* @__PURE__ */ jsx(
|
|
124
168
|
Button,
|
|
125
169
|
{
|
|
@@ -128,8 +172,7 @@ const DateGrid = React.forwardRef(function DateGrid2({
|
|
|
128
172
|
iconOnly: true,
|
|
129
173
|
startIcon: ChevronLeft,
|
|
130
174
|
className: className2,
|
|
131
|
-
...props2
|
|
132
|
-
"aria-label": "上一個月"
|
|
175
|
+
...props2
|
|
133
176
|
}
|
|
134
177
|
),
|
|
135
178
|
NextMonthButton: ({ className: className2, children: _children, ...props2 }) => /* @__PURE__ */ jsx(
|
|
@@ -140,8 +183,7 @@ const DateGrid = React.forwardRef(function DateGrid2({
|
|
|
140
183
|
iconOnly: true,
|
|
141
184
|
startIcon: ChevronRight,
|
|
142
185
|
className: className2,
|
|
143
|
-
...props2
|
|
144
|
-
"aria-label": "下一個月"
|
|
186
|
+
...props2
|
|
145
187
|
}
|
|
146
188
|
)
|
|
147
189
|
},
|
|
@@ -156,7 +198,9 @@ const dateGridMeta = {
|
|
|
156
198
|
// non-family composite / overlay / layout
|
|
157
199
|
variants: {},
|
|
158
200
|
sizes: {},
|
|
159
|
-
|
|
201
|
+
// 'selected' = 選中日期 / range 端點持續選中(藍底白字圓 bg-primary + range 帶 bg-neutral-selected);
|
|
202
|
+
// 'active' 移除 — 全檔無 Tailwind 按壓 utility,無按壓專屬視覺態(2026-07-07 詞彙統一對抗稽核補修)。
|
|
203
|
+
states: ["default", "hover", "selected", "focus-visible", "disabled"],
|
|
160
204
|
tokens: {
|
|
161
205
|
bg: ["bg-disabled", "bg-neutral-selected", "bg-on-emphasis", "bg-primary", "bg-primary-hover", "bg-transparent"],
|
|
162
206
|
fg: ["text-fg-disabled", "text-fg-muted", "text-foreground", "text-on-emphasis"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-grid.js","sources":["../../../src/components/DateGrid/date-grid.tsx"],"sourcesContent":["/**\n * @internal — DS-internal 單元(per `.claude/rules/ui-development.md` Public vs Internal canonical;spec frontmatter `isInternal`)。\n * 不進 root barrel front-door;由 DatePicker wrap 消費,end-user app 請用 wrapper 元件。\n */\n// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\n// M22 retrofit DONE 2026-05-03 v11(real source URLs added inline at lines 38 + 111)\nimport * as React from 'react'\nimport { DayPicker } from 'react-day-picker'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport 'react-day-picker/style.css'\n\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\n\n/**\n * DateGrid — DayPicker 包裝,用本 DS token 覆寫預設視覺。\n *\n * ── 視覺對照(ref/datepicker.png,2026-04-21 rewrite)──\n *\n * | 區塊 | 規格 |\n * |------|------|\n * | Outer padding | `p-3`(12px 四邊對稱) |\n * | Nav + Month caption row | h-field-xs(24px)單行,chevron(xs)分居左右 / 月份置中垂直對齊 |\n * | Nav → Weekday gap | 12px(month_caption mb-3) |\n * | Weekday | text-body(14px)text-foreground font-medium(neutral-9,同 caption 權重;撤銷 v3 fg-secondary) |\n * | Cell gap(水平 + 垂直)| 4px(table-native border-separate border-spacing-1;非 gap — grid 會 break,見下方 v7 註) |\n * | Day cell size | h-field-sm w-[var(--field-height-sm)](28×28 md / 32×32 lg) |\n * | Day button | rounded-full 填滿 cell |\n *\n * ── 五種 cell state canonical ──\n *\n * | State | 視覺 | Token |\n * |-------|------|-------|\n * | today | 數字下方藍色短桿 | `::after` pseudo bar(bg-primary,w-40% h-1.5px rounded-full,貼近數字底)|\n * | disabled | 灰底圓圈 + disabled 字色(跟 Button disabled 一致) | [&>button]:bg-disabled [&>button]:text-fg-disabled rounded-full |\n * | outside(非本月) | text-fg-muted(neutral-7) | [&>button]:text-fg-muted |\n * | selected / range 端點 | 藍底白字圓 | [&>button]:bg-primary [&>button]:text-on-emphasis rounded-full |\n * | range middle | 灰底矩形 track(bg-neutral-selected = neutral-2),**高度 = cell 高度**(28×28 @ md) | before pseudo: `inset-y-0 -inset-x-[2px]` |\n * | range start/end 半圓 track | 左/右半圓 + selected 圓疊在上,**圓半徑 = button 半徑** | before pseudo: `rounded-l/r-full` + start `left-0 -right-[2px]` / end `-left-[2px] right-0`(向 middle 外擴 2px bridge gap)|\n * | hover(未選中) | 藍圈 outline | hover:ring-[1.5px] hover:ring-primary |\n *\n * ── Range track 高度 canonical(2026-05-03 v6,M8 4 家對照)──\n * Ant Design([picker source](https://github.com/ant-design/ant-design/blob/master/components/date-picker/style/panel.ts))/ Material X DateRangePicker([mui-x source](https://github.com/mui/mui-x/tree/master/packages/x-date-pickers-pro/src/DateRangeCalendar))/ Apple Calendar `@benchmark-unverified`(closed-source)/ Google Calendar `@benchmark-unverified`(closed-source)共識:\n * **range track 為連續 stadium**,跟 selected 圓緊貼成連續 pill。\n * 實作:bg 走 `before:` pseudo 用 `inset-y-0`(滿 cell 高度)+ `-inset-x-[2px]`\n * (左右各外擴 2px bridge 相鄰 cell gap)→ 相鄰 cell 的 pseudo 連續銜接 = 橫向連貫;\n * day cell 本身就是 button 容器(L102-105 day = h-field-sm cell),故滿 cell 高 = 滿 button 高。\n *\n * ── Range track 色用 bg-neutral-selected(= neutral-2)──\n * 對齊 TimePicker 選中項目樣式(semantic `--neutral-selected` = neutral-2,semantic.css L84/L340)。\n * 同 DS 內「持續選中」語意 token,不自開 neutral-3 tier。\n *\n * ── 為什麼 nav 放頂部 + 年月垂直置中(不 separate 兩行)──\n * ref/datepicker.png:chevron prev / 月份 / chevron next 同一行,24px 高(xs field height)。\n * 省垂直空間,使用者視線不需上下跳。世界級(Google Calendar / Apple / iOS 日期輸入)皆此佈局。\n */\n\nexport type DateGridProps = React.ComponentProps<typeof DayPicker>\n\n// code-quality-allow: long-function — foundational composite main body — 拆 sub-fn 會複雜化 local state / ref / context binding\nconst DateGrid = React.forwardRef<HTMLDivElement, DateGridProps>(function DateGrid(\n {\n className,\n classNames,\n showOutsideDays = true,\n ...props\n },\n _ref,\n) {\n // Note: react-day-picker v9 DayPicker 未對外 forward ref 到單一 DOM 節點(內部有多 div),\n // 故 ref 簽名保留但不附著(符合 DS 統一 forwardRef 慣例;真要取 DOM 用 wrapper 包)。\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n // navLayout=\"around\" = prev 渲染在首月(displayIndex===0)caption 左、next 渲染在末月(displayIndex===numberOfMonths-1)caption 右;單月時兩鍵同 caption 兩側\n // 取代先前 absolute 定位覆蓋整個 months 容器導致箭頭垂直置中於中段的 bug\n navLayout=\"around\"\n // p-3 = 12px 四邊對稱(canonical 不可動)\n className={cn('p-3', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row gap-4',\n // Month:relative 讓 prev/next 按鈕 absolute 定位到 month 右上/左上(navLayout=\"around\")\n month: 'flex flex-col relative',\n // Month caption:單行置中 h-field-xs,prev/next 按鈕 absolute 從兩側貼齊\n month_caption: 'flex items-center justify-center h-field-xs mb-3',\n caption_label: 'text-body font-medium',\n // ── Prev/Next button(canonical 2026-05-03 v6,user audit fix)──\n // RDP 把這 className apply 到 <Button> 本身(不是 wrapper),所以用 className 直接套\n // 定位類(absolute top/left/right-0)。muted 色透過 Button override 內部加,不用 [&>button] 黑魔法。\n button_previous: 'absolute top-0 left-0 z-[1]',\n button_next: 'absolute top-0 right-0 z-[1]',\n // ── Grid layout(canonical 2026-05-03 v7,純 table-native)──\n // RDP v9 month_grid = <table>。v6 試 grid 在 tr 上但 break border-spacing(grid 蓋掉\n // table-row layout)。乾淨修:**純 table layout** + `border-spacing-1`(4px H+V,table-native)。\n // 所有 cells 自動同寬同高(td 的 w/h-field-sm),無 grid hack。\n month_grid: 'border-separate border-spacing-1',\n weekdays: '', // thead default\n weekday: cn(\n // text-foreground + font-medium 對齊 DS 一致設計語言(2026-05-03 user audit):\n // weekday 列標跟 caption「April 2026」同視覺權重(都屬 calendar header 區),\n // 不弱化(撤銷 v3 fg-secondary 的 mistake)。對齊 icon-only Button 預設 neutral-9 一致。\n 'text-foreground text-body font-medium',\n 'h-7 align-middle text-center',\n ),\n week: '', // tr default\n // Cell **就是** button 容器(28×28 @ md / 32×32 @ lg),`relative` 讓 before pseudo 定位\n // ── h-field-sm 對齊 user spec(28×28 @ md)— v3 用 h-field-md (32×32) 是錯的\n day: cn(\n 'h-field-sm w-[var(--field-height-sm)] p-0 text-center relative',\n ),\n day_button: cn(\n // absolute inset-0 = 完全填滿 cell(naked button,無 inset 4px 空隙)\n // z-[1] 讓 button 疊在 range track `before:` pseudo 之上\n 'absolute inset-0 z-[1] flex items-center justify-center',\n 'font-normal text-body rounded-full transition-colors',\n // Hover 藍圈 1.5px(對齊 Apple HIG / Ant `@benchmark-unverified` visual ring measurement)— ring 在 button 之上 + 透明 bg 不擋 range track\n 'hover:ring-[1.5px] hover:ring-primary hover:bg-transparent',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n ),\n // today:藍色 underline bar 貼近數字\n today: cn(\n \"[&>button]:after:content-['']\",\n '[&>button]:after:absolute',\n '[&>button]:after:bottom-[5px] [&>button]:after:left-1/2 [&>button]:after:-translate-x-1/2',\n '[&>button]:after:w-[40%] [&>button]:after:h-[1.5px] [&>button]:after:rounded-full',\n '[&>button]:after:bg-primary',\n // today + selected:bar 切 on-emphasis(白)\n '[&[data-selected=true]>button]:after:bg-on-emphasis',\n ),\n outside: '[&>button]:text-fg-muted',\n // Selected(single 或 range 端點):button 藍底白字圓\n selected: cn(\n '[&>button]:bg-primary [&>button]:text-on-emphasis',\n '[&>button]:hover:bg-primary-hover [&>button]:hover:ring-0',\n ),\n disabled: cn(\n '[&>button]:bg-disabled [&>button]:text-fg-disabled [&>button]:cursor-not-allowed',\n '[&>button]:hover:ring-0 [&>button]:hover:bg-disabled',\n ),\n // ── Range track(canonical 2026-05-03 v6,Ant stadium pattern)──\n // v5 用 pseudo 矩形蓋全 cell 修「白色破圖」,但新副作用:button 圓比矩形小,4 個\n // corner triangle 區域 pseudo grey 凸出圓外(user 2026-05-03 抓到「凸出去」)。\n // 對齊 Ant 實證(`cell-range-start::before { border-radius: 9999px 0 0 9999px }`):\n // rangeStart pseudo 加 `rounded-l-full` → pseudo 變「左半圓 + 右矩形」stadium\n // 左半圓 EXACTLY OVERLAY button 圓的左半圓(同 center,同 radius 14)→ 邊界無縫\n // 右側矩形 bridge 2px to middle → 跟 middle pseudo 連續\n // Cell 的 top-left + bottom-left corner triangle:pseudo 不蓋 + button 不蓋 →\n // popover white 顯露(乾淨 breathing,跟 outside-of-range cells 一致視覺)\n range_start: cn(\n \"before:content-[''] before:absolute before:inset-y-0\",\n 'before:left-0 before:-right-[2px]',\n 'before:bg-neutral-selected before:pointer-events-none',\n 'before:rounded-l-full', // ← stadium 左半圓 matches button 圓的左半弧\n ),\n range_end: cn(\n \"before:content-[''] before:absolute before:inset-y-0\",\n 'before:-left-[2px] before:right-0',\n 'before:bg-neutral-selected before:pointer-events-none',\n 'before:rounded-r-full', // ← 鏡像\n ),\n range_middle: cn(\n \"before:content-[''] before:absolute before:inset-y-0 before:-inset-x-[2px]\",\n 'before:bg-neutral-selected before:pointer-events-none',\n // button 透明顯露 track,但 hover ring 仍顯示\n '[&>button]:!bg-transparent [&>button]:!text-foreground',\n ),\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n // ── Prev/Next nav(canonical 2026-05-03 v9,DS 一致設計語言)──\n // User 2026-05-03 audit:「icon-only Button icon 都用 neutral-9,只有 dismiss 用 45%」\n // → chevron 不是 dismiss,**走 Button 預設 text-foreground**(neutral-9 85%),\n // 不開新 tier 自打嘴(撤銷 v6-v8 用 fg-muted override 的 mistake)。\n // RDP v9 `PreviousMonthButton / NextMonthButton` override(node_modules/react-day-picker/dist/esm/components/Nav.js)\n // ⚠️ children: _ 必丟棄(RDP 把 <Chevron> 當 children 傳 → 跟 Button startIcon 重疊變 double chevron)\n // 2026-07-04 修:aria-label 必在 {...props} 之後 — RDP 以 props 傳 labelPrevious() 英文\n // default(「Go to the Previous Month」),原寫在 spread 前 = 中文 label 永遠被蓋(dead code)。\n PreviousMonthButton: ({ className, children: _children, ...props }) => (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={ChevronLeft}\n className={className} {...props}\n aria-label=\"上一個月\" />\n ),\n NextMonthButton: ({ className, children: _children, ...props }) => (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={ChevronRight}\n className={className} {...props}\n aria-label=\"下一個月\" />\n ),\n }}\n {...props}\n />\n )\n})\nDateGrid.displayName = 'DateGrid'\n\n// Story auto-compile metadata — Phase 1 mechanical migration(2026-04-24)\n// Phase 2 fill needed: purpose descriptions + when rationale + world-class refs\nexport const dateGridMeta = {\n component: 'DateGrid',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],\n tokens: {\n bg: ['bg-disabled', 'bg-neutral-selected', 'bg-on-emphasis', 'bg-primary', 'bg-primary-hover', 'bg-transparent'],\n fg: ['text-fg-disabled', 'text-fg-muted', 'text-foreground', 'text-on-emphasis'],\n ring: ['ring-primary', 'ring-ring'],\n },\n} as const\n\nexport { DateGrid }\n"],"names":["DateGrid","className","props"],"mappings":";;;;;;;AA4DA,MAAM,WAAW,MAAM,WAA0C,SAASA,UACxE;AAAA,EACE;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,GAAG;AACL,GACA,MACA;AAGA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MAGA,WAAU;AAAA,MAEV,WAAW,GAAG,OAAO,SAAS;AAAA,MAC9B,YAAY;AAAA,QACV,QAAQ;AAAA;AAAA,QAER,OAAO;AAAA;AAAA,QAEP,eAAe;AAAA,QACf,eAAe;AAAA;AAAA;AAAA;AAAA,QAIf,iBAAiB;AAAA,QACjB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,QAKb,YAAY;AAAA,QACZ,UAAU;AAAA;AAAA,QACV,SAAS;AAAA;AAAA;AAAA;AAAA,UAIP;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,MAAM;AAAA;AAAA;AAAA;AAAA,QAGN,KAAK;AAAA,UACH;AAAA,QAAA;AAAA,QAEF,YAAY;AAAA;AAAA;AAAA,UAGV;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,QAAA;AAAA;AAAA,QAGF,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,QAAA;AAAA,QAEF,SAAS;AAAA;AAAA,QAET,UAAU;AAAA,UACR;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,UAAU;AAAA,UACR;AAAA,UACA;AAAA,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAWF,aAAa;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAAA;AAAA,QAEF,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,QAAA;AAAA,QAEF,cAAc;AAAA,UACZ;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,QAAA;AAAA,QAEF,QAAQ;AAAA,QACR,GAAG;AAAA,MAAA;AAAA,MAEL,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QASV,qBAAqB,CAAC,EAAE,WAAAC,YAAW,UAAU,WAAW,GAAGC,OAAAA,MACzD;AAAA,UAAC;AAAA,UAAA;AAAA,YAAO,SAAQ;AAAA,YAAO,MAAK;AAAA,YAAK,UAAQ;AAAA,YAAC,WAAW;AAAA,YACnD,WAAWD;AAAAA,YAAY,GAAGC;AAAAA,YAC1B,cAAW;AAAA,UAAA;AAAA,QAAA;AAAA,QAEf,iBAAiB,CAAC,EAAE,WAAAD,YAAW,UAAU,WAAW,GAAGC,OAAAA,MACrD;AAAA,UAAC;AAAA,UAAA;AAAA,YAAO,SAAQ;AAAA,YAAO,MAAK;AAAA,YAAK,UAAQ;AAAA,YAAC,WAAW;AAAA,YACnD,WAAWD;AAAAA,YAAY,GAAGC;AAAAA,YAC1B,cAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MAAO;AAAA,MAGvB,GAAG;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACD,SAAS,cAAc;AAIhB,MAAM,eAAe;AAAA,EAC1B,WAAW;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,UAAU,CAAA;AAAA,EAGV,OAAO,CAAA;AAAA,EAGP,QAAQ,CAAC,WAAW,SAAS,UAAU,iBAAiB,UAAU;AAAA,EAClE,QAAQ;AAAA,IACN,IAAI,CAAC,eAAe,uBAAuB,kBAAkB,cAAc,oBAAoB,gBAAgB;AAAA,IAC/G,IAAI,CAAC,oBAAoB,iBAAiB,mBAAmB,kBAAkB;AAAA,IAC/E,MAAM,CAAC,gBAAgB,WAAW;AAAA,EAAA;AAEtC;"}
|
|
1
|
+
{"version":3,"file":"date-grid.js","sources":["../../../src/components/DateGrid/date-grid.tsx"],"sourcesContent":["/**\n * @internal — DS-internal 單元(per `.claude/rules/ui-development.md` Public vs Internal canonical;spec frontmatter `isInternal`)。\n * 不進 root barrel front-door;由 DatePicker wrap 消費,end-user app 請用 wrapper 元件。\n */\n// @benchmark-unverified-blanket: file-level retraction per M22 (d) — claims herein not individually URL-cited; treat as unverified visual/usage rumor unless retrofit per-claim. Hook escape preserved.\n// M22 retrofit DONE 2026-05-03 v11(real source URLs added inline at lines 38 + 111)\nimport * as React from 'react'\nimport { DayPicker } from 'react-day-picker'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport 'react-day-picker/style.css'\n\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/design-system/components/Button/button'\n\n/**\n * DateGrid — DayPicker 包裝,用本 DS token 覆寫預設視覺。\n *\n * ── 視覺對照(ref/datepicker.png,2026-04-21 rewrite)──\n *\n * | 區塊 | 規格 |\n * |------|------|\n * | Outer padding | `p-3`(12px 四邊對稱) |\n * | Nav + Month caption row | h-field-xs(24px)單行,chevron(xs)分居左右 / 月份置中垂直對齊 |\n * | Nav → Weekday gap | 12px(month_caption mb-3) |\n * | Weekday | text-body(14px)text-foreground font-medium(neutral-9,同 caption 權重;撤銷 v3 fg-secondary) |\n * | Cell gap(水平 + 垂直)| 4px(table-native border-separate border-spacing-1;非 gap — grid 會 break,見下方 v7 註) |\n * | Day cell size | h-field-sm w-[var(--field-height-sm)](28×28 md / 32×32 lg) |\n * | Day button | rounded-full 填滿 cell |\n *\n * ── 五種 cell state canonical ──\n *\n * | State | 視覺 | Token |\n * |-------|------|-------|\n * | today | 數字下方藍色短桿 | `::after` pseudo bar(bg-primary,w-40% h-1.5px rounded-full,貼近數字底)|\n * | disabled | 灰底圓圈 + disabled 字色(跟 Button disabled 一致) | [&>button]:bg-disabled [&>button]:text-fg-disabled rounded-full |\n * | outside(非本月) | text-fg-muted(neutral-7) | [&>button]:text-fg-muted |\n * | selected / range 端點 | 藍底白字圓 | [&>button]:bg-primary [&>button]:text-on-emphasis rounded-full |\n * | range middle | 灰底矩形 track(bg-neutral-selected = neutral-2),**高度 = cell 高度**(28×28 @ md) | before pseudo: `inset-y-0 -inset-x-[2px]` |\n * | range start/end 半圓 track | 左/右半圓 + selected 圓疊在上,**圓半徑 = button 半徑** | before pseudo: `rounded-l/r-full` + start `left-0 -right-[2px]` / end `-left-[2px] right-0`(向 middle 外擴 2px bridge gap)|\n * | hover(未選中) | 藍圈 outline | hover:ring-[1.5px] hover:ring-primary-hover(2026-07-07 統一:瞬時 hover = hover 階)|\n *\n * ── Range track 高度 canonical(2026-05-03 v6,M8 4 家對照)──\n * Ant Design([picker source](https://github.com/ant-design/ant-design/blob/master/components/date-picker/style/panel.ts))/ Material X DateRangePicker([mui-x source](https://github.com/mui/mui-x/tree/master/packages/x-date-pickers-pro/src/DateRangeCalendar))/ Apple Calendar `@benchmark-unverified`(closed-source)/ Google Calendar `@benchmark-unverified`(closed-source)共識:\n * **range track 為連續 stadium**,跟 selected 圓緊貼成連續 pill。\n * 實作:bg 走 `before:` pseudo 用 `inset-y-0`(滿 cell 高度)+ `-inset-x-[2px]`\n * (左右各外擴 2px bridge 相鄰 cell gap)→ 相鄰 cell 的 pseudo 連續銜接 = 橫向連貫;\n * day cell 本身就是 button 容器(L102-105 day = h-field-sm cell),故滿 cell 高 = 滿 button 高。\n *\n * ── Range track 色用 bg-neutral-selected(= neutral-2)──\n * 對齊 TimePicker 選中項目樣式(semantic `--neutral-selected` = neutral-2,semantic.css L84/L340)。\n * 同 DS 內「持續選中」語意 token,不自開 neutral-3 tier。\n *\n * ── 為什麼 nav 放頂部 + 年月垂直置中(不 separate 兩行)──\n * ref/datepicker.png:chevron prev / 月份 / chevron next 同一行,24px 高(xs field height)。\n * 省垂直空間,使用者視線不需上下跳。世界級(Google Calendar / Apple / iOS 日期輸入)皆此佈局。\n */\n\nexport type DateGridProps = React.ComponentProps<typeof DayPicker>\n\n// ── SR label 中文 formatter(2026-07-05)──\n// 走 Intl.DateTimeFormat(對齊 TimePicker / Calendar 既有 canonical,不引第二套 date lib);\n// module-level 建一次 — label fn 每個 day cell 都會呼叫,避免 per-call new formatter。\nconst ZH_FULL_DATE = new Intl.DateTimeFormat('zh-TW', { dateStyle: 'full' })\nconst ZH_MONTH_YEAR = new Intl.DateTimeFormat('zh-TW', { year: 'numeric', month: 'long' })\nconst ZH_WEEKDAY = new Intl.DateTimeFormat('zh-TW', { weekday: 'long' })\n\n// code-quality-allow: long-function — foundational composite main body — 拆 sub-fn 會複雜化 local state / ref / context binding\nconst DateGrid = React.forwardRef<HTMLDivElement, DateGridProps>(function DateGrid(\n {\n className,\n classNames,\n labels,\n showOutsideDays = true,\n ...props\n },\n _ref,\n) {\n // Note: react-day-picker v9 DayPicker 未對外 forward ref 到單一 DOM 節點(內部有多 div),\n // 故 ref 簽名保留但不附著(符合 DS 統一 forwardRef 慣例;真要取 DOM 用 wrapper 包)。\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n // navLayout=\"around\" = prev 渲染在首月(displayIndex===0)caption 左、next 渲染在末月(displayIndex===numberOfMonths-1)caption 右;單月時兩鍵同 caption 兩側\n // 取代先前 absolute 定位覆蓋整個 months 容器導致箭頭垂直置中於中段的 bug\n navLayout=\"around\"\n // p-3 = 12px 四邊對稱(canonical 不可動)\n className={cn('p-3', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row gap-4',\n // Month:relative 讓 prev/next 按鈕 absolute 定位到 month 右上/左上(navLayout=\"around\")\n month: 'flex flex-col relative',\n // Month caption:單行置中 h-field-xs,prev/next 按鈕 absolute 從兩側貼齊\n month_caption: 'flex items-center justify-center h-field-xs mb-3',\n caption_label: 'text-body font-medium',\n // ── Prev/Next button(canonical 2026-05-03 v6,user audit fix)──\n // RDP 把這 className apply 到 <Button> 本身(不是 wrapper),所以用 className 直接套\n // 定位類(absolute top/left/right-0)。muted 色透過 Button override 內部加,不用 [&>button] 黑魔法。\n button_previous: 'absolute top-0 left-0 z-[1]',\n button_next: 'absolute top-0 right-0 z-[1]',\n // ── Grid layout(canonical 2026-05-03 v7,純 table-native)──\n // RDP v9 month_grid = <table>。v6 試 grid 在 tr 上但 break border-spacing(grid 蓋掉\n // table-row layout)。乾淨修:**純 table layout** + `border-spacing-1`(4px H+V,table-native)。\n // 所有 cells 自動同寬同高(td 的 w/h-field-sm),無 grid hack。\n month_grid: 'border-separate border-spacing-1',\n weekdays: '', // thead default\n weekday: cn(\n // text-foreground + font-medium 對齊 DS 一致設計語言(2026-05-03 user audit):\n // weekday 列標跟 caption「April 2026」同視覺權重(都屬 calendar header 區),\n // 不弱化(撤銷 v3 fg-secondary 的 mistake)。對齊 icon-only Button 預設 neutral-9 一致。\n 'text-foreground text-body font-medium',\n 'h-7 align-middle text-center',\n ),\n week: '', // tr default\n // Cell **就是** button 容器(28×28 @ md / 32×32 @ lg),`relative` 讓 before pseudo 定位\n // ── h-field-sm 對齊 user spec(28×28 @ md)— v3 用 h-field-md (32×32) 是錯的\n day: cn(\n 'h-field-sm w-[var(--field-height-sm)] p-0 text-center relative',\n ),\n day_button: cn(\n // absolute inset-0 = 完全填滿 cell(naked button,無 inset 4px 空隙)\n // z-[1] 讓 button 疊在 range track `before:` pseudo 之上\n 'absolute inset-0 z-[1] flex items-center justify-center',\n 'font-normal text-body rounded-full transition-colors',\n // Hover 藍圈 1.5px(對齊 Apple HIG / Ant `@benchmark-unverified` visual ring measurement)— ring 在 button 之上 + 透明 bg 不擋 range track\n // 2026-07-07 user 拍板統一:瞬時 hover 進 primary 家族 = hover 階(FileUpload dropzone /\n // Slider thumb hover 同族;base 專屬持續選中與 focus)——ring-primary → ring-primary-hover\n 'hover:ring-[1.5px] hover:ring-primary-hover hover:bg-transparent',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n ),\n // today:藍色 underline bar 貼近數字\n today: cn(\n \"[&>button]:after:content-['']\",\n '[&>button]:after:absolute',\n '[&>button]:after:bottom-[5px] [&>button]:after:left-1/2 [&>button]:after:-translate-x-1/2',\n '[&>button]:after:w-[40%] [&>button]:after:h-[1.5px] [&>button]:after:rounded-full',\n '[&>button]:after:bg-primary',\n // today + selected:bar 切 on-emphasis(白)— 只為「藍底白字圓」的選中日/端點設計;\n // range 中段(淺灰底)由 range_middle 的 !bg-primary 覆寫回藍(2026-07-07 user 拍板)。\n '[&[data-selected=true]>button]:after:bg-on-emphasis',\n ),\n outside: '[&>button]:text-fg-muted',\n // Selected(single 或 range 端點):button 藍底白字圓\n selected: cn(\n '[&>button]:bg-primary [&>button]:text-on-emphasis',\n '[&>button]:hover:bg-primary-hover [&>button]:hover:ring-0',\n ),\n disabled: cn(\n '[&>button]:bg-disabled [&>button]:text-fg-disabled [&>button]:cursor-not-allowed',\n '[&>button]:hover:ring-0 [&>button]:hover:bg-disabled',\n ),\n // ── Range track(canonical 2026-05-03 v6,Ant stadium pattern)──\n // v5 用 pseudo 矩形蓋全 cell 修「白色破圖」,但新副作用:button 圓比矩形小,4 個\n // corner triangle 區域 pseudo grey 凸出圓外(user 2026-05-03 抓到「凸出去」)。\n // 對齊 Ant 實證(`cell-range-start::before { border-radius: 9999px 0 0 9999px }`):\n // rangeStart pseudo 加 `rounded-l-full` → pseudo 變「左半圓 + 右矩形」stadium\n // 左半圓 EXACTLY OVERLAY button 圓的左半圓(同 center,同 radius 14)→ 邊界無縫\n // 右側矩形 bridge 2px to middle → 跟 middle pseudo 連續\n // Cell 的 top-left + bottom-left corner triangle:pseudo 不蓋 + button 不蓋 →\n // popover white 顯露(乾淨 breathing,跟 outside-of-range cells 一致視覺)\n range_start: cn(\n \"before:content-[''] before:absolute before:inset-y-0\",\n 'before:left-0 before:-right-[2px]',\n 'before:bg-neutral-selected before:pointer-events-none',\n 'before:rounded-l-full', // ← stadium 左半圓 matches button 圓的左半弧\n ),\n range_end: cn(\n \"before:content-[''] before:absolute before:inset-y-0\",\n 'before:-left-[2px] before:right-0',\n 'before:bg-neutral-selected before:pointer-events-none',\n 'before:rounded-r-full', // ← 鏡像\n ),\n range_middle: cn(\n \"before:content-[''] before:absolute before:inset-y-0 before:-inset-x-[2px]\",\n 'before:bg-neutral-selected before:pointer-events-none',\n // 2026-07-07 user 拍板:range 中段的 today bar 維持藍(切白只屬藍底選中日;白條在\n // neutral-selected 淺灰底上近乎隱形 = today 標記消失)。!important 確定性壓過 today 的\n // data-selected 切白規則(同權重靠 stylesheet 順序不可靠)。Ant 源碼實錘:cell-today\n // 指示 = colorPrimary,in-range 只換底色、無規則隱藏/改色 today 指示(panel.ts)。\n // 非 today 的中段日無 after content,本規則無作用 — 安全。\n '[&>button]:after:!bg-primary',\n // button 透明顯露 track。2026-07-05 對齊 RDP v9 真實行為(deep-audit A.1b):\n // range 中段日同樣掛 selected modifier(useRange rangeIncludesDate 不排除中段)→\n // 上方 selected 的 `[&>button]:hover:ring-0` 一併壓制 hover ring(與 selected 一致\n // 的 hover 抑制),非原註解宣稱的「hover ring 仍顯示」;today bar 亦被 data-selected\n // selector 切 on-emphasis(見 spec「組合狀態」段)。\n '[&>button]:!bg-transparent [&>button]:!text-foreground',\n ),\n hidden: 'invisible',\n ...classNames,\n }}\n // ── SR label 中文 defaults(2026-07-05,RDP labels API 正門)──\n // 對齊 MUI X localeText「預設可覆寫」idiom + 2026-07-04 全庫 SR label 中文\n // canonical(commit 241676c6):DS 給中文 default,consumer 傳 labels 逐鍵覆寫(i18n)。\n // 禁在 components override 內 spread 後 hardcode aria-label — 會蓋死此覆寫通道\n // (2026-07-05 修正 07-04 的錯誤修法:中文要走 labels 正門,不是蓋 RDP 算好的值)。\n labels={{\n labelPrevious: () => '上一個月',\n labelNext: () => '下一個月',\n // 鏡射 RDP default 結構(labels/labelDayButton.js:today 前綴 / selected 後綴),文案中文化\n labelDayButton: (date, modifiers) => {\n let label = ZH_FULL_DATE.format(date)\n if (modifiers.today) label = `今天,${label}`\n if (modifiers.selected) label = `${label},已選取`\n return label\n },\n // 未傳 mode 的非互動 grid(spec「mode 無預設值」段)day cell 走 labelGridcell\n labelGridcell: (date, modifiers) => {\n let label = ZH_FULL_DATE.format(date)\n if (modifiers?.today) label = `今天,${label}`\n return label\n },\n labelGrid: (date) => ZH_MONTH_YEAR.format(date),\n labelWeekday: (date) => ZH_WEEKDAY.format(date),\n // 以下非 default 渲染面(captionLayout dropdown / showWeekNumber 由 consumer 經\n // {...props} 開啟)— 一併補齊,避免開啟後 SR 中英夾雜\n labelMonthDropdown: () => '選擇月份',\n labelYearDropdown: () => '選擇年份',\n labelWeekNumber: (weekNumber) => `第 ${weekNumber} 週`,\n labelWeekNumberHeader: () => '週數',\n ...labels,\n }}\n components={{\n // ── Prev/Next nav(canonical 2026-05-03 v9,DS 一致設計語言)──\n // User 2026-05-03 audit:「icon-only Button icon 都用 neutral-9,只有 dismiss 用 45%」\n // → chevron 不是 dismiss,**走 Button 預設 text-foreground**(neutral-9 85%),\n // 不開新 tier 自打嘴(撤銷 v6-v8 用 fg-muted override 的 mistake)。\n // RDP v9 `PreviousMonthButton / NextMonthButton` override(node_modules/react-day-picker/dist/esm/components/Nav.js)\n // ⚠️ children: _ 必丟棄(RDP 把 <Chevron> 當 children 傳 → 跟 Button startIcon 重疊變 double chevron)\n // 2026-07-05 修:此處**不** hardcode aria-label — 中文走上方 labels API 正門,\n // RDP 算好 labelPrevious()/labelNext() 後經 {...props} 流入 Button;\n // spread 後 hardcode(07-04 舊修法)= 蓋死 consumer labels 覆寫通道。\n PreviousMonthButton: ({ className, children: _children, ...props }) => (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={ChevronLeft}\n className={className} {...props} />\n ),\n NextMonthButton: ({ className, children: _children, ...props }) => (\n <Button variant=\"text\" size=\"xs\" iconOnly startIcon={ChevronRight}\n className={className} {...props} />\n ),\n }}\n {...props}\n />\n )\n})\nDateGrid.displayName = 'DateGrid'\n\n// Story auto-compile metadata — Phase 1 mechanical migration(2026-04-24)\n// Phase 2 fill needed: purpose descriptions + when rationale + world-class refs\nexport const dateGridMeta = {\n component: 'DateGrid',\n family: null, // non-family composite / overlay / layout\n variants: {\n\n },\n sizes: {\n\n },\n // 'selected' = 選中日期 / range 端點持續選中(藍底白字圓 bg-primary + range 帶 bg-neutral-selected);\n // 'active' 移除 — 全檔無 Tailwind 按壓 utility,無按壓專屬視覺態(2026-07-07 詞彙統一對抗稽核補修)。\n states: ['default', 'hover', 'selected', 'focus-visible', 'disabled'],\n tokens: {\n bg: ['bg-disabled', 'bg-neutral-selected', 'bg-on-emphasis', 'bg-primary', 'bg-primary-hover', 'bg-transparent'],\n fg: ['text-fg-disabled', 'text-fg-muted', 'text-foreground', 'text-on-emphasis'],\n ring: ['ring-primary', 'ring-ring'],\n },\n} as const\n\nexport { DateGrid }\n"],"names":["DateGrid","className","props"],"mappings":"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"}
|
|
@@ -7,12 +7,6 @@ export interface DateFormatOptions {
|
|
|
7
7
|
/** locale(預設 'en-US') */
|
|
8
8
|
locale?: string;
|
|
9
9
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Default format:**YYYY/MM/DD**(對齊 Ant Design 順序,year-first ISO-like)。
|
|
12
|
-
* 棄 `en-US` `MM/DD/YYYY`(month-first 美式)— 美式順序在 international DS 反直覺
|
|
13
|
-
* (跟 ISO date 視覺對不上,跟 sort 順序也對不上)。Ant / Material X / Apple HIG
|
|
14
|
-
* 一致 year-first。Consumer 想自訂可傳 `formatOptions` + `locale`。
|
|
15
|
-
*/
|
|
16
10
|
declare function formatDate(value: string | number | Date, options?: DateFormatOptions): string;
|
|
17
11
|
export interface DatePickerProps extends DateFormatOptions, Omit<React.HTMLAttributes<HTMLDivElement>, 'value' | 'onChange' | 'placeholder' | 'defaultValue'> {
|
|
18
12
|
mode?: FieldMode;
|
|
@@ -108,9 +102,9 @@ export declare const datePickerMeta: {
|
|
|
108
102
|
readonly family: 4;
|
|
109
103
|
readonly variants: {};
|
|
110
104
|
readonly sizes: {};
|
|
111
|
-
readonly states: readonly ["default", "hover", "
|
|
105
|
+
readonly states: readonly ["default", "hover", "selected", "focus-visible", "disabled"];
|
|
112
106
|
readonly tokens: {
|
|
113
|
-
readonly bg: readonly [];
|
|
107
|
+
readonly bg: readonly ["bg-neutral-selected"];
|
|
114
108
|
readonly fg: readonly ["text-fg-disabled", "text-fg-muted"];
|
|
115
109
|
readonly ring: readonly [];
|
|
116
110
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DatePicker/date-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAA;AAQ3F,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,oDAAoD,CAAA;AAK3D,MAAM,WAAW,iBAAiB;IAChC,4FAA4F;IAC5F,aAAa,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAA;IAC1C,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;
|
|
1
|
+
{"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/DatePicker/date-picker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,21 @@ import { Button } from "../Button/button.js";
|
|
|
10
10
|
import { SurfaceFooter } from "../../patterns/overlay-surface/overlay-surface.js";
|
|
11
11
|
import { useFieldContext, useResolvedFieldSize, useResolvedFieldInvalid, useResolvedFieldDisabled, useResolvedFieldMode, useResolvedFieldVariant } from "../Field/field-context.js";
|
|
12
12
|
import { isoToTimeParts, timePartsToString, TimeColumns } from "../TimePicker/time-columns.js";
|
|
13
|
+
const dtfCache = /* @__PURE__ */ new Map();
|
|
14
|
+
function getDateTimeFormatter(locale, options) {
|
|
15
|
+
const key = locale + "|" + JSON.stringify(options);
|
|
16
|
+
let fmt = dtfCache.get(key);
|
|
17
|
+
if (!fmt) {
|
|
18
|
+
fmt = new Intl.DateTimeFormat(locale, options);
|
|
19
|
+
dtfCache.set(key, fmt);
|
|
20
|
+
}
|
|
21
|
+
return fmt;
|
|
22
|
+
}
|
|
13
23
|
function formatDate(value, options = {}) {
|
|
14
24
|
const date = value instanceof Date ? value : new Date(value);
|
|
15
25
|
if (Number.isNaN(date.getTime())) return String(value);
|
|
16
26
|
if (options.formatOptions || options.locale) {
|
|
17
|
-
return
|
|
27
|
+
return getDateTimeFormatter(options.locale ?? "en-US", options.formatOptions ?? { year: "numeric", month: "2-digit", day: "2-digit" }).format(date);
|
|
18
28
|
}
|
|
19
29
|
const y = date.getFullYear();
|
|
20
30
|
const m = String(date.getMonth() + 1).padStart(2, "0");
|
|
@@ -756,9 +766,11 @@ const datePickerMeta = {
|
|
|
756
766
|
family: 4,
|
|
757
767
|
variants: {},
|
|
758
768
|
sizes: {},
|
|
759
|
-
|
|
769
|
+
// 'selected' = range 帶持續選中(before:bg-neutral-selected,本檔自有);'active' 移除 — 全檔無按壓
|
|
770
|
+
// 視覺(data-active-end 是定位 attr 非按壓 token;2026-07-07 詞彙統一 DS-wide 交叉掃補修)。
|
|
771
|
+
states: ["default", "hover", "selected", "focus-visible", "disabled"],
|
|
760
772
|
tokens: {
|
|
761
|
-
bg: [],
|
|
773
|
+
bg: ["bg-neutral-selected"],
|
|
762
774
|
fg: ["text-fg-disabled", "text-fg-muted"],
|
|
763
775
|
ring: []
|
|
764
776
|
}
|