@astryxdesign/core 0.1.2 → 0.1.3-canary.1e94ba0
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/CHANGELOG.md +165 -0
- package/README.md +12 -12
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +11 -5
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +24 -5
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +31 -12
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +0 -1
- package/dist/Calendar/Calendar.d.ts +5 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +82 -43
- package/dist/Calendar/hooks/index.d.ts +0 -2
- package/dist/Calendar/hooks/index.d.ts.map +1 -1
- package/dist/Calendar/hooks/index.js +1 -2
- package/dist/Calendar/index.d.ts +3 -3
- package/dist/Calendar/index.d.ts.map +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/styles.d.ts +3 -9
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +3 -11
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +17 -3
- package/dist/Center/Center.d.ts +11 -1
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +9 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +0 -1
- package/dist/Chat/ChatMessageList.d.ts +14 -1
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +2 -0
- package/dist/Chat/useTriggerMenu.d.ts +8 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -3
- package/dist/CheckboxInput/CheckboxInput.d.ts +23 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +51 -9
- package/dist/CheckboxList/CheckboxList.d.ts +13 -1
- package/dist/CheckboxList/CheckboxList.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxList.js +39 -9
- package/dist/CheckboxList/CheckboxListContext.d.ts +7 -0
- package/dist/CheckboxList/CheckboxListContext.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +0 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +9 -5
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +51 -37
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +5 -5
- package/dist/ContextMenu/ContextMenu.d.ts +12 -5
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +96 -11
- package/dist/DateInput/DateInput.d.ts +23 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +167 -99
- package/dist/DateRangeInput/DateRangeInput.d.ts +23 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +42 -9
- package/dist/DateTimeInput/DateTimeInput.d.ts +35 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +78 -15
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +12 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +1 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +42 -14
- package/dist/Field/Field.d.ts +19 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +4 -0
- package/dist/Field/FieldLabel.d.ts +21 -2
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +41 -26
- package/dist/FileInput/FileInput.d.ts +22 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +56 -10
- package/dist/Grid/Grid.d.ts +11 -1
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +32 -6
- package/dist/InputGroup/InputGroup.d.ts +4 -3
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +16 -6
- package/dist/InputGroup/InputGroupContext.d.ts +4 -0
- package/dist/InputGroup/InputGroupContext.d.ts.map +1 -1
- package/dist/InputGroup/InputGroupContext.js +2 -2
- package/dist/InputGroup/groupStyles.d.ts +1 -1
- package/dist/InputGroup/groupStyles.d.ts.map +1 -1
- package/dist/InputGroup/groupStyles.js +3 -3
- package/dist/InputGroup/index.d.ts +1 -0
- package/dist/InputGroup/index.d.ts.map +1 -1
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +33 -1
- package/dist/Layer/layerAnimations.stylex.d.ts +4 -0
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +8 -4
- package/dist/Layer/useLayer.d.ts +10 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +64 -9
- package/dist/Layout/Layout.d.ts +4 -11
- package/dist/Layout/Layout.d.ts.map +1 -1
- package/dist/Layout/Layout.js +10 -11
- package/dist/Layout/LayoutFooter.d.ts +2 -2
- package/dist/Layout/LayoutFooter.d.ts.map +1 -1
- package/dist/Layout/LayoutHeader.d.ts +2 -2
- package/dist/Layout/LayoutHeader.d.ts.map +1 -1
- package/dist/Layout/LayoutPanel.d.ts +2 -2
- package/dist/Layout/LayoutPanel.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.d.ts +51 -0
- package/dist/Layout/padding.stylex.d.ts.map +1 -1
- package/dist/Layout/padding.stylex.js +63 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +4 -2
- package/dist/Link/Link.d.ts +16 -1
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +18 -7
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MoreMenu/MoreMenu.d.ts +1 -7
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +0 -2
- package/dist/MultiSelector/MultiSelector.d.ts +27 -2
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +141 -42
- package/dist/MultiSelector/hooks.d.ts +12 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +14 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +34 -3
- package/dist/NumberInput/NumberInput.d.ts +23 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +62 -12
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +15 -1
- package/dist/Popover/Popover.d.ts +18 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +5 -2
- package/dist/Popover/usePopover.d.ts +38 -3
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +24 -9
- package/dist/PowerSearch/PowerSearch.d.ts +11 -1
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +6 -1
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +3 -5
- package/dist/RadioList/RadioList.d.ts +20 -2
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +105 -9
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +13 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts +13 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +78 -44
- package/dist/SegmentedControl/SegmentedControlContext.d.ts +7 -0
- package/dist/SegmentedControl/SegmentedControlContext.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +13 -2
- package/dist/Selector/Selector.d.ts +24 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +122 -43
- package/dist/Selector/hooks.d.ts +8 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +14 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +2 -0
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +1 -1
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +8 -2
- package/dist/Slider/Slider.d.ts +21 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +36 -9
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +1 -1
- package/dist/Stack/Stack.d.ts +38 -23
- package/dist/Stack/Stack.d.ts.map +1 -1
- package/dist/Stack/Stack.js +25 -1
- package/dist/Stack/StackItem.d.ts +12 -23
- package/dist/Stack/StackItem.d.ts.map +1 -1
- package/dist/Stack/StackItem.js +8 -1
- package/dist/Switch/Switch.d.ts +23 -2
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -11
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +6 -0
- package/dist/TabList/TabList.d.ts +16 -4
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +87 -10
- package/dist/TabList/TabListContext.d.ts +5 -0
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +5 -0
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +6 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +13 -9
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +10 -1
- package/dist/Table/TableCell.d.ts +8 -1
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +79 -10
- package/dist/Table/TableHeaderCell.d.ts +8 -1
- package/dist/Table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Table/TableHeaderCell.js +16 -16
- package/dist/Table/index.d.ts +4 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +3 -2
- package/dist/Table/plugins/pagination/paginateData.d.ts +2 -1
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +8 -3
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +6 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
- package/dist/Table/tableContextMenu.d.ts +37 -0
- package/dist/Table/tableContextMenu.d.ts.map +1 -0
- package/dist/Table/tableContextMenu.js +140 -0
- package/dist/Table/types.d.ts +66 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +22 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +41 -9
- package/dist/TextInput/TextInput.d.ts +23 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +55 -10
- package/dist/TimeInput/TimeInput.d.ts +23 -1
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +147 -76
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +14 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +131 -3
- package/dist/Tokenizer/Tokenizer.d.ts +12 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +26 -4
- package/dist/Toolbar/Toolbar.d.ts +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +51 -7
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +56 -9
- package/dist/TopNav/TopNavHeading.d.ts +7 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +8 -0
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +72 -2
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +51 -12
- package/dist/TreeList/treeListItem.markers.stylex.d.ts +16 -0
- package/dist/TreeList/treeListItem.markers.stylex.d.ts.map +1 -0
- package/dist/TreeList/treeListItem.markers.stylex.js +22 -0
- package/dist/Typeahead/BaseTypeahead.d.ts +13 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +69 -6
- package/dist/Typeahead/Typeahead.d.ts +26 -3
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +65 -29
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +61 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
- package/dist/VisuallyHidden/VisuallyHidden.js +65 -0
- package/dist/VisuallyHidden/index.d.ts +11 -0
- package/dist/VisuallyHidden/index.d.ts.map +1 -0
- package/dist/VisuallyHidden/index.js +13 -0
- package/dist/astryx.css +22 -0
- package/dist/astryx.umd.js +54 -54
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/focusableSelector.d.ts +22 -0
- package/dist/hooks/focusableSelector.d.ts.map +1 -0
- package/dist/hooks/focusableSelector.js +24 -0
- package/dist/hooks/index.d.ts +12 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +7 -2
- package/dist/hooks/useAnnounce.d.ts +40 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -0
- package/dist/hooks/useAnnounce.js +142 -0
- package/dist/hooks/useClickableContainer.d.ts +16 -1
- package/dist/hooks/useClickableContainer.d.ts.map +1 -1
- package/dist/hooks/useClickableContainer.js +16 -4
- package/dist/hooks/useEntryAnimation.d.ts.map +1 -1
- package/dist/hooks/useEntryAnimation.js +4 -4
- package/dist/hooks/useFocusTrap.d.ts +18 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +87 -3
- package/dist/hooks/useGridFocus.d.ts +88 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +261 -62
- package/dist/hooks/useKeyboardHint.d.ts +82 -0
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -0
- package/dist/hooks/useKeyboardHint.js +220 -0
- package/dist/hooks/useListFocus.d.ts +78 -7
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +305 -52
- package/dist/hooks/useLongPress.d.ts +21 -0
- package/dist/hooks/useLongPress.d.ts.map +1 -0
- package/dist/hooks/useLongPress.js +89 -0
- package/dist/hooks/useTreeFocus.d.ts +157 -0
- package/dist/hooks/useTreeFocus.d.ts.map +1 -0
- package/dist/hooks/useTreeFocus.js +337 -0
- package/dist/hooks/useTypeahead.d.ts +63 -0
- package/dist/hooks/useTypeahead.d.ts.map +1 -0
- package/dist/hooks/useTypeahead.js +117 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/utils/dateTypes.d.ts +12 -0
- package/dist/utils/dateTypes.d.ts.map +1 -1
- package/dist/utils/dateTypes.js +41 -1
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/inputAria.d.ts +29 -0
- package/dist/utils/inputAria.d.ts.map +1 -0
- package/dist/utils/inputAria.js +30 -0
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +5 -2
- package/docs.mjs +2 -2
- package/package.json +12 -8
- package/src/Avatar/Avatar.doc.mjs +2 -2
- package/src/Avatar/Avatar.test.tsx +37 -0
- package/src/Avatar/Avatar.tsx +10 -5
- package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
- package/src/Button/Button.tsx +42 -22
- package/src/ButtonGroup/ButtonGroup.test.tsx +9 -9
- package/src/ButtonGroup/ButtonGroup.tsx +0 -1
- package/src/Calendar/Calendar.doc.mjs +4 -4
- package/src/Calendar/Calendar.test.tsx +168 -30
- package/src/Calendar/Calendar.tsx +121 -66
- package/src/Calendar/hooks/index.ts +0 -6
- package/src/Calendar/index.ts +1 -3
- package/src/Calendar/styles.ts +4 -9
- package/src/Carousel/Carousel.doc.mjs +7 -1
- package/src/Carousel/Carousel.test.tsx +20 -0
- package/src/Carousel/Carousel.tsx +16 -1
- package/src/Center/Center.doc.mjs +12 -2
- package/src/Center/Center.tsx +28 -3
- package/src/Chat/ChatComposerInput.test.tsx +26 -7
- package/src/Chat/ChatComposerInput.tsx +0 -1
- package/src/Chat/ChatDictationButton.doc.mjs +1 -1
- package/src/Chat/ChatMessageList.doc.mjs +8 -0
- package/src/Chat/ChatMessageList.test.tsx +18 -0
- package/src/Chat/ChatMessageList.tsx +16 -0
- package/src/Chat/useTriggerMenu.tsx +22 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +10 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +172 -27
- package/src/CheckboxInput/CheckboxInput.tsx +78 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +9 -0
- package/src/CheckboxList/CheckboxList.test.tsx +192 -26
- package/src/CheckboxList/CheckboxList.tsx +56 -3
- package/src/CheckboxList/CheckboxListContext.tsx +7 -0
- package/src/CheckboxList/CheckboxListItem.tsx +0 -3
- package/src/Citation/Citation.doc.mjs +10 -0
- package/src/Citation/Citation.test.tsx +121 -0
- package/src/Citation/Citation.tsx +15 -3
- package/src/CodeBlock/CodeBlock.test.tsx +115 -0
- package/src/CodeBlock/CodeBlock.tsx +63 -33
- package/src/CommandPalette/CommandPalette.test.tsx +47 -1
- package/src/CommandPalette/CommandPalette.tsx +9 -21
- package/src/ContextMenu/ContextMenu.doc.mjs +4 -4
- package/src/ContextMenu/ContextMenu.test.tsx +155 -1
- package/src/ContextMenu/ContextMenu.tsx +129 -16
- package/src/DateInput/DateInput.doc.mjs +286 -56
- package/src/DateInput/DateInput.test.tsx +248 -2
- package/src/DateInput/DateInput.tsx +196 -100
- package/src/DateRangeInput/DateRangeInput.doc.mjs +251 -46
- package/src/DateRangeInput/DateRangeInput.test.tsx +182 -20
- package/src/DateRangeInput/DateRangeInput.tsx +63 -5
- package/src/DateTimeInput/DateTimeInput.doc.mjs +368 -67
- package/src/DateTimeInput/DateTimeInput.test.tsx +279 -11
- package/src/DateTimeInput/DateTimeInput.tsx +125 -17
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.tsx +12 -0
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -8
- package/src/DropdownMenu/DropdownMenu.test.tsx +56 -42
- package/src/DropdownMenu/DropdownMenu.tsx +52 -18
- package/src/Field/Field.doc.mjs +59 -18
- package/src/Field/Field.test.tsx +32 -0
- package/src/Field/Field.tsx +23 -5
- package/src/Field/FieldLabel.tsx +55 -17
- package/src/FileInput/FileInput.doc.mjs +17 -0
- package/src/FileInput/FileInput.test.tsx +283 -49
- package/src/FileInput/FileInput.tsx +76 -4
- package/src/Grid/Grid.doc.mjs +17 -4
- package/src/Grid/Grid.test.tsx +43 -30
- package/src/Grid/Grid.tsx +38 -3
- package/src/Icon/Icon.doc.mjs +3 -3
- package/src/InputGroup/InputGroup.doc.mjs +111 -23
- package/src/InputGroup/InputGroup.test.tsx +257 -60
- package/src/InputGroup/InputGroup.tsx +23 -5
- package/src/InputGroup/InputGroupContext.ts +9 -4
- package/src/InputGroup/groupStyles.ts +7 -1
- package/src/InputGroup/index.ts +1 -0
- package/src/Kbd/Kbd.test.tsx +22 -4
- package/src/Kbd/Kbd.tsx +35 -3
- package/src/Layer/layerAnimations.stylex.ts +20 -4
- package/src/Layer/useLayer.doc.mjs +5 -0
- package/src/Layer/useLayer.test.tsx +111 -0
- package/src/Layer/useLayer.tsx +90 -9
- package/src/Layout/Layout.tsx +8 -16
- package/src/Layout/LayoutFooter.doc.mjs +4 -4
- package/src/Layout/LayoutFooter.tsx +3 -3
- package/src/Layout/LayoutHeader.doc.mjs +4 -4
- package/src/Layout/LayoutHeader.tsx +3 -3
- package/src/Layout/LayoutPanel.tsx +3 -3
- package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
- package/src/Layout/padding.stylex.ts +52 -0
- package/src/Lightbox/Lightbox.doc.mjs +9 -0
- package/src/Lightbox/Lightbox.test.tsx +53 -5
- package/src/Lightbox/Lightbox.tsx +9 -4
- package/src/Link/Link.doc.mjs +14 -0
- package/src/Link/Link.test.tsx +50 -0
- package/src/Link/Link.tsx +39 -4
- package/src/Markdown/Markdown.test.tsx +11 -0
- package/src/Markdown/Markdown.tsx +7 -0
- package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
- package/src/MoreMenu/MoreMenu.tsx +0 -9
- package/src/MultiSelector/MultiSelector.doc.mjs +30 -0
- package/src/MultiSelector/MultiSelector.test.tsx +375 -8
- package/src/MultiSelector/MultiSelector.tsx +194 -48
- package/src/MultiSelector/hooks.ts +27 -0
- package/src/NavMenu/NavHeadingMenu.test.tsx +77 -1
- package/src/NavMenu/NavHeadingMenu.tsx +50 -3
- package/src/NumberInput/NumberInput.doc.mjs +17 -0
- package/src/NumberInput/NumberInput.test.tsx +242 -40
- package/src/NumberInput/NumberInput.tsx +89 -11
- package/src/Pagination/Pagination.doc.mjs +3 -3
- package/src/Pagination/Pagination.test.tsx +117 -5
- package/src/Pagination/Pagination.tsx +21 -1
- package/src/Popover/Popover.doc.mjs +26 -0
- package/src/Popover/Popover.test.tsx +121 -0
- package/src/Popover/Popover.tsx +23 -2
- package/src/Popover/usePopover.doc.mjs +9 -3
- package/src/Popover/usePopover.tsx +70 -12
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +97 -1
- package/src/PowerSearch/PowerSearch.tsx +16 -3
- package/src/ProgressBar/ProgressBar.test.tsx +34 -26
- package/src/ProgressBar/ProgressBar.tsx +3 -4
- package/src/RadioList/RadioList.doc.mjs +9 -0
- package/src/RadioList/RadioList.test.tsx +252 -16
- package/src/RadioList/RadioList.tsx +166 -10
- package/src/RadioList/RadioListItem.tsx +14 -2
- package/src/SegmentedControl/SegmentedControl.doc.mjs +9 -0
- package/src/SegmentedControl/SegmentedControl.test.tsx +214 -42
- package/src/SegmentedControl/SegmentedControl.tsx +102 -54
- package/src/SegmentedControl/SegmentedControlContext.ts +7 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +14 -1
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +26 -0
- package/src/Selector/Selector.test.tsx +387 -15
- package/src/Selector/Selector.tsx +175 -67
- package/src/Selector/hooks.ts +23 -0
- package/src/SideNav/SideNav.test.tsx +48 -0
- package/src/SideNav/SideNavHeading.tsx +8 -2
- package/src/SideNav/SideNavItem.tsx +2 -4
- package/src/Skeleton/Skeleton.test.tsx +25 -0
- package/src/Skeleton/Skeleton.tsx +11 -1
- package/src/Slider/Slider.doc.mjs +15 -0
- package/src/Slider/Slider.test.tsx +155 -2
- package/src/Slider/Slider.tsx +53 -5
- package/src/Spinner/Spinner.tsx +7 -1
- package/src/Stack/Stack.doc.mjs +77 -0
- package/src/Stack/Stack.test.tsx +55 -5
- package/src/Stack/Stack.tsx +73 -24
- package/src/Stack/StackItem.test.tsx +23 -0
- package/src/Stack/StackItem.tsx +20 -23
- package/src/Switch/Switch.doc.mjs +15 -0
- package/src/Switch/Switch.test.tsx +162 -27
- package/src/Switch/Switch.tsx +61 -21
- package/src/TabList/Tab.tsx +6 -0
- package/src/TabList/TabList.doc.mjs +6 -0
- package/src/TabList/TabList.test.tsx +251 -0
- package/src/TabList/TabList.tsx +103 -12
- package/src/TabList/TabListContext.ts +7 -3
- package/src/TabList/TabMenu.tsx +6 -3
- package/src/Table/BaseTable.tsx +24 -18
- package/src/Table/Table.doc.mjs +2 -0
- package/src/Table/Table.test.tsx +10 -0
- package/src/Table/Table.tsx +8 -0
- package/src/Table/TableCell.tsx +105 -24
- package/src/Table/TableHeaderCell.tsx +28 -29
- package/src/Table/index.ts +8 -2
- package/src/Table/plugins/pagination/paginateData.ts +10 -3
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +16 -0
- package/src/Table/plugins/pagination/useTablePagination.tsx +8 -1
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- package/src/Table/plugins/sortable/useTableSortable.test.tsx +91 -2
- package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
- package/src/Table/tableContextMenu.test.tsx +181 -0
- package/src/Table/tableContextMenu.tsx +160 -0
- package/src/Table/types.ts +74 -0
- package/src/Table/useTableColumnResize.doc.mjs +3 -3
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +63 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Table/useTableStickyColumns.doc.mjs +2 -2
- package/src/Text/Text.doc.mjs +18 -18
- package/src/TextArea/TextArea.doc.mjs +17 -0
- package/src/TextArea/TextArea.test.tsx +167 -35
- package/src/TextArea/TextArea.tsx +62 -15
- package/src/TextInput/TextInput.doc.mjs +17 -0
- package/src/TextInput/TextInput.test.tsx +168 -34
- package/src/TextInput/TextInput.tsx +77 -9
- package/src/Thumbnail/Thumbnail.doc.mjs +4 -4
- package/src/TimeInput/TimeInput.doc.mjs +345 -60
- package/src/TimeInput/TimeInput.test.tsx +255 -7
- package/src/TimeInput/TimeInput.tsx +176 -70
- package/src/Timestamp/Timestamp.doc.mjs +19 -19
- package/src/Toast/Toast.tsx +14 -0
- package/src/Toast/ToastViewport.test.tsx +214 -0
- package/src/Toast/ToastViewport.tsx +167 -21
- package/src/Tokenizer/Tokenizer.doc.mjs +29 -14
- package/src/Tokenizer/Tokenizer.test.tsx +105 -1
- package/src/Tokenizer/Tokenizer.tsx +37 -1
- package/src/Toolbar/Toolbar.test.tsx +109 -6
- package/src/Toolbar/Toolbar.tsx +59 -5
- package/src/Tooltip/Tooltip.test.tsx +68 -0
- package/src/Tooltip/useTooltip.tsx +55 -8
- package/src/TopNav/TopNav.test.tsx +50 -0
- package/src/TopNav/TopNavHeading.tsx +17 -1
- package/src/TreeList/TreeList.test.tsx +295 -6
- package/src/TreeList/TreeList.tsx +73 -1
- package/src/TreeList/TreeListItem.tsx +51 -5
- package/src/TreeList/treeListItem.markers.stylex.ts +20 -0
- package/src/Typeahead/BaseTypeahead.tsx +93 -9
- package/src/Typeahead/Typeahead.doc.mjs +141 -30
- package/src/Typeahead/Typeahead.test.tsx +331 -1
- package/src/Typeahead/Typeahead.tsx +105 -33
- package/src/VisuallyHidden/VisuallyHidden.doc.mjs +80 -0
- package/src/VisuallyHidden/VisuallyHidden.test.tsx +76 -0
- package/src/VisuallyHidden/VisuallyHidden.tsx +113 -0
- package/src/VisuallyHidden/index.ts +15 -0
- package/src/docs-script.test.mjs +50 -0
- package/src/hooks/focusableSelector.ts +25 -0
- package/src/hooks/index.ts +28 -2
- package/src/hooks/useAnnounce.test.tsx +101 -0
- package/src/hooks/useAnnounce.ts +168 -0
- package/src/hooks/useClickableContainer.ts +16 -4
- package/src/hooks/useEntryAnimation.ts +16 -4
- package/src/hooks/useFocusTrap.test.tsx +132 -0
- package/src/hooks/useFocusTrap.ts +98 -4
- package/src/hooks/useGridFocus.doc.mjs +40 -2
- package/src/hooks/useGridFocus.test.tsx +132 -0
- package/src/hooks/useGridFocus.ts +343 -67
- package/src/hooks/useKeyboardHint.doc.mjs +101 -0
- package/src/hooks/useKeyboardHint.test.tsx +70 -0
- package/src/hooks/useKeyboardHint.tsx +332 -0
- package/src/hooks/useListFocus.doc.mjs +50 -10
- package/src/hooks/useListFocus.test.tsx +375 -0
- package/src/hooks/useListFocus.ts +395 -57
- package/src/hooks/useLongPress.test.tsx +134 -0
- package/src/hooks/useLongPress.ts +119 -0
- package/src/hooks/useTreeFocus.doc.mjs +140 -0
- package/src/hooks/useTreeFocus.test.tsx +214 -0
- package/src/hooks/useTreeFocus.ts +559 -0
- package/src/hooks/useTypeahead.test.tsx +109 -0
- package/src/hooks/useTypeahead.ts +183 -0
- package/src/index.ts +1 -0
- package/src/theme/derivedVarRegistry.test.ts +10 -5
- package/src/utils/dateTypes.test.ts +40 -0
- package/src/utils/dateTypes.ts +40 -0
- package/src/utils/index.ts +9 -0
- package/src/utils/inputAria.test.ts +39 -0
- package/src/utils/inputAria.ts +58 -0
- package/src/utils/timeParser.test.ts +10 -0
- package/src/utils/timeParser.ts +5 -2
- package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts +0 -57
- package/dist/Calendar/hooks/useCalendarRovingTabindex.d.ts.map +0 -1
- package/dist/Calendar/hooks/useCalendarRovingTabindex.js +0 -96
- package/src/Calendar/hooks/useCalendarRovingTabindex.ts +0 -118
package/src/Button/Button.tsx
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
import {useRef, useTransition, type ReactNode} from 'react';
|
|
22
22
|
import type {BaseProps} from '../BaseProps';
|
|
23
23
|
import * as stylex from '@stylexjs/stylex';
|
|
24
|
+
import {useTooltip} from '../Tooltip/useTooltip';
|
|
24
25
|
import {
|
|
25
26
|
colorVars,
|
|
26
27
|
sizeVars,
|
|
@@ -32,13 +33,13 @@ import {
|
|
|
32
33
|
fontWeightVars,
|
|
33
34
|
typeScaleVars,
|
|
34
35
|
} from '../theme/tokens.stylex';
|
|
35
|
-
import {Tooltip} from '../Tooltip/Tooltip';
|
|
36
36
|
import {Spinner} from '../Spinner';
|
|
37
|
+
import {VisuallyHidden} from '../VisuallyHidden';
|
|
37
38
|
|
|
38
39
|
import {EDGE_COMP_ATTR} from '../Layout/edgeCompensation.stylex';
|
|
39
40
|
import {useSize} from '../SizeContext/SizeContext';
|
|
40
41
|
import {useButtonGroup} from '../ButtonGroup/ButtonGroupContext';
|
|
41
|
-
import {mergeProps} from '../utils';
|
|
42
|
+
import {mergeProps, mergeRefs} from '../utils';
|
|
42
43
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
43
44
|
import type {LinkComponentType} from '../Link/types';
|
|
44
45
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -124,17 +125,6 @@ const styles = stylex.create({
|
|
|
124
125
|
textOverflow: 'ellipsis',
|
|
125
126
|
minWidth: 0,
|
|
126
127
|
},
|
|
127
|
-
visuallyHidden: {
|
|
128
|
-
position: 'absolute',
|
|
129
|
-
width: '1px',
|
|
130
|
-
height: '1px',
|
|
131
|
-
padding: 0,
|
|
132
|
-
margin: '-1px',
|
|
133
|
-
overflow: 'hidden',
|
|
134
|
-
clip: 'rect(0, 0, 0, 0)',
|
|
135
|
-
whiteSpace: 'nowrap',
|
|
136
|
-
borderWidth: 0,
|
|
137
|
-
},
|
|
138
128
|
link: {
|
|
139
129
|
textDecoration: 'none',
|
|
140
130
|
},
|
|
@@ -590,6 +580,16 @@ export function Button({
|
|
|
590
580
|
// for keyboard users to reach the tooltip. Otherwise use native disabled.
|
|
591
581
|
const useAriaDisabled = tooltip != null && buttonDisabled;
|
|
592
582
|
|
|
583
|
+
// Attach tooltip behavior via the hook rather than wrapping the button in a
|
|
584
|
+
// <Tooltip> element. The hook adds hover/focus triggers to the button itself,
|
|
585
|
+
// so no extra DOM node is inserted — the button stays a direct child of its
|
|
586
|
+
// container (no layout shift, and edge-compensation markers remain
|
|
587
|
+
// discoverable through the container's direct-child `:has()` selector).
|
|
588
|
+
const tooltipHook = useTooltip({
|
|
589
|
+
placement: 'above',
|
|
590
|
+
isEnabled: tooltip != null,
|
|
591
|
+
});
|
|
592
|
+
|
|
593
593
|
const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
|
|
594
594
|
// The ref guard dedupes fire-once actions. Interruptible callers skip it so
|
|
595
595
|
// a re-click while pending starts a fresh action that interrupts the prior.
|
|
@@ -690,12 +690,9 @@ export function Button({
|
|
|
690
690
|
)}
|
|
691
691
|
</span>
|
|
692
692
|
{/* Live region for loading state announcements */}
|
|
693
|
-
<
|
|
694
|
-
{...stylex.props(styles.visuallyHidden)}
|
|
695
|
-
role="status"
|
|
696
|
-
aria-live="polite">
|
|
693
|
+
<VisuallyHidden role="status" aria-live="polite">
|
|
697
694
|
{isLoadingState ? 'Loading' : ''}
|
|
698
|
-
</
|
|
695
|
+
</VisuallyHidden>
|
|
699
696
|
</>
|
|
700
697
|
);
|
|
701
698
|
|
|
@@ -709,18 +706,39 @@ export function Button({
|
|
|
709
706
|
(children != null && children !== label);
|
|
710
707
|
const ariaLabelProp = needsAriaLabel ? {'aria-label': label} : null;
|
|
711
708
|
|
|
709
|
+
// When a tooltip is attached via the hook, point aria-describedby at the
|
|
710
|
+
// tooltip content (composing with any consumer-provided value).
|
|
711
|
+
const describedByProp =
|
|
712
|
+
tooltip != null
|
|
713
|
+
? {
|
|
714
|
+
'aria-describedby':
|
|
715
|
+
[props['aria-describedby'], tooltipHook.describedBy]
|
|
716
|
+
.filter(Boolean)
|
|
717
|
+
.join(' ') || undefined,
|
|
718
|
+
}
|
|
719
|
+
: null;
|
|
720
|
+
|
|
721
|
+
// Merge the consumer ref with the tooltip hook's trigger ref so both point at
|
|
722
|
+
// the same element. mergeRefs tolerates undefined, so this is a no-op for the
|
|
723
|
+
// tooltip side when no tooltip is set.
|
|
724
|
+
const mergedButtonRef = mergeRefs(
|
|
725
|
+
ref,
|
|
726
|
+
tooltip != null ? tooltipHook.ref : undefined,
|
|
727
|
+
);
|
|
728
|
+
|
|
712
729
|
let element: ReactNode;
|
|
713
730
|
|
|
714
731
|
if (renderAsLink) {
|
|
715
732
|
element = (
|
|
716
733
|
<LinkComponent
|
|
717
|
-
ref={
|
|
734
|
+
ref={mergedButtonRef as React.Ref<HTMLAnchorElement>}
|
|
718
735
|
href={href}
|
|
719
736
|
target={target}
|
|
720
737
|
rel={rel}
|
|
721
738
|
{...sharedMergedProps}
|
|
722
739
|
{...props}
|
|
723
740
|
{...ariaLabelProp}
|
|
741
|
+
{...describedByProp}
|
|
724
742
|
{...edgeCompAttr}
|
|
725
743
|
onClick={handleClick}>
|
|
726
744
|
{buttonContent}
|
|
@@ -729,12 +747,13 @@ export function Button({
|
|
|
729
747
|
} else {
|
|
730
748
|
element = (
|
|
731
749
|
<button
|
|
732
|
-
ref={
|
|
750
|
+
ref={mergedButtonRef}
|
|
733
751
|
type={type}
|
|
734
752
|
disabled={useAriaDisabled ? undefined : buttonDisabled}
|
|
735
753
|
{...sharedMergedProps}
|
|
736
754
|
{...props}
|
|
737
755
|
{...ariaLabelProp}
|
|
756
|
+
{...describedByProp}
|
|
738
757
|
{...edgeCompAttr}
|
|
739
758
|
aria-busy={isLoadingState || undefined}
|
|
740
759
|
aria-disabled={useAriaDisabled || undefined}
|
|
@@ -747,9 +766,10 @@ export function Button({
|
|
|
747
766
|
|
|
748
767
|
if (tooltip) {
|
|
749
768
|
return (
|
|
750
|
-
|
|
769
|
+
<>
|
|
751
770
|
{element}
|
|
752
|
-
|
|
771
|
+
{tooltipHook.renderTooltip(tooltip)}
|
|
772
|
+
</>
|
|
753
773
|
);
|
|
754
774
|
}
|
|
755
775
|
|
|
@@ -88,17 +88,18 @@ describe('ButtonGroup', () => {
|
|
|
88
88
|
expect(refValue).toBe(screen.getByRole('group'));
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
it('
|
|
91
|
+
it('reflects orientation via data-orientation, not aria-orientation', () => {
|
|
92
|
+
// aria-orientation is not a valid ARIA attribute on role="group"; the
|
|
93
|
+
// orientation is exposed through data-orientation instead.
|
|
92
94
|
const {rerender} = render(
|
|
93
95
|
<ButtonGroup label="Actions">
|
|
94
96
|
<Button label="Copy" />
|
|
95
97
|
</ButtonGroup>,
|
|
96
98
|
);
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
);
|
|
100
|
+
let group = screen.getByRole('group');
|
|
101
|
+
expect(group).not.toHaveAttribute('aria-orientation');
|
|
102
|
+
expect(group).toHaveAttribute('data-orientation', 'horizontal');
|
|
102
103
|
|
|
103
104
|
rerender(
|
|
104
105
|
<ButtonGroup label="Actions" orientation="vertical">
|
|
@@ -106,10 +107,9 @@ describe('ButtonGroup', () => {
|
|
|
106
107
|
</ButtonGroup>,
|
|
107
108
|
);
|
|
108
109
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
);
|
|
110
|
+
group = screen.getByRole('group');
|
|
111
|
+
expect(group).not.toHaveAttribute('aria-orientation');
|
|
112
|
+
expect(group).toHaveAttribute('data-orientation', 'vertical');
|
|
113
113
|
});
|
|
114
114
|
|
|
115
115
|
it('renders with vertical orientation', () => {
|
|
@@ -103,8 +103,8 @@ export const docs = {
|
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
105
|
name: 'weekStartsOn',
|
|
106
|
-
type:
|
|
107
|
-
description: 'First day of week (0=Sunday).',
|
|
106
|
+
type: "0 | 1 | 2 | 3 | 4 | 5 | 6 | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'",
|
|
107
|
+
description: 'First day of week. Accepts a number (0=Sunday) or a three-letter day name (e.g. "mon").',
|
|
108
108
|
default: '0',
|
|
109
109
|
},
|
|
110
110
|
],
|
|
@@ -147,7 +147,7 @@ export const docsZh = {
|
|
|
147
147
|
{name: 'hasOutsideDays', type: 'boolean', description: '显示相邻月份的日期。', default: 'true'},
|
|
148
148
|
{name: 'hasWeekNumbers', type: 'boolean', description: '显示 ISO 周数。', default: 'false'},
|
|
149
149
|
{name: 'hasVariableRowCount', type: 'boolean', description: '可变行数与固定 6 行网格。', default: 'false'},
|
|
150
|
-
{name: 'weekStartsOn', type:
|
|
150
|
+
{name: 'weekStartsOn', type: "0 | 1 | 2 | 3 | 4 | 5 | 6 | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' | 'sat'", description: '每周起始日。可为数字(0=周日)或三字母星期缩写(如 "mon")。', default: '0'},
|
|
151
151
|
],
|
|
152
152
|
theming: {
|
|
153
153
|
targets: [
|
|
@@ -200,6 +200,6 @@ export const docsDense = {
|
|
|
200
200
|
hasOutsideDays: 'show days from adjacent months',
|
|
201
201
|
hasWeekNumbers: 'show ISO week numbers',
|
|
202
202
|
hasVariableRowCount: 'variable vs fixed 6-row grid',
|
|
203
|
-
weekStartsOn: 'first day of week (0=Sunday)',
|
|
203
|
+
weekStartsOn: 'first day of week (0=Sunday, or name e.g. "mon")',
|
|
204
204
|
},
|
|
205
205
|
};
|
|
@@ -10,19 +10,21 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import {describe, it, expect, vi} from 'vitest';
|
|
13
|
-
import {act, render, screen} from '@testing-library/react';
|
|
13
|
+
import {act, render, screen, within} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {Calendar} from './Calendar';
|
|
16
16
|
import type {CalendarHandle} from './Calendar';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Helper to find a day button by its day number.
|
|
20
|
-
* Day buttons
|
|
20
|
+
* Day buttons are native <button> elements with aria-labels like
|
|
21
|
+
* "Thursday, January 15, 2026". Each button is the sole child of a
|
|
22
|
+
* role="gridcell" wrapper.
|
|
21
23
|
*/
|
|
22
24
|
function getDayButton(day: number, month = 'January', year = 2026) {
|
|
23
25
|
// Match the full date pattern with the day number
|
|
24
26
|
const pattern = new RegExp(`${month}\\s+${day},\\s+${year}`);
|
|
25
|
-
return screen.getByRole('
|
|
27
|
+
return screen.getByRole('button', {name: pattern});
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
describe('Calendar', () => {
|
|
@@ -146,10 +148,7 @@ describe('Calendar', () => {
|
|
|
146
148
|
const handleFocusChange = vi.fn();
|
|
147
149
|
|
|
148
150
|
render(
|
|
149
|
-
<Calendar
|
|
150
|
-
focusDate="2026-01-01"
|
|
151
|
-
onFocusDateChange={handleFocusChange}
|
|
152
|
-
/>,
|
|
151
|
+
<Calendar focusDate="2026-01-01" onFocusDateChange={handleFocusChange} />,
|
|
153
152
|
);
|
|
154
153
|
|
|
155
154
|
const nextButton = screen.getByRole('button', {name: 'Next month'});
|
|
@@ -189,9 +188,7 @@ describe('Calendar', () => {
|
|
|
189
188
|
return day !== 0 && day !== 6;
|
|
190
189
|
};
|
|
191
190
|
|
|
192
|
-
render(
|
|
193
|
-
<Calendar focusDate="2026-01-01" dateConstraints={[isWeekday]} />,
|
|
194
|
-
);
|
|
191
|
+
render(<Calendar focusDate="2026-01-01" dateConstraints={[isWeekday]} />);
|
|
195
192
|
|
|
196
193
|
// January 4, 2026 is a Sunday - should be disabled
|
|
197
194
|
const sunday = getDayButton(4);
|
|
@@ -238,6 +235,21 @@ describe('Calendar', () => {
|
|
|
238
235
|
expect(dayNames[0]).toHaveTextContent('Mo');
|
|
239
236
|
});
|
|
240
237
|
|
|
238
|
+
it('accepts a three-letter day name for weekStartsOn', () => {
|
|
239
|
+
render(<Calendar weekStartsOn="mon" />);
|
|
240
|
+
|
|
241
|
+
// "mon" should behave exactly like the numeric 1 (Monday first).
|
|
242
|
+
const dayNames = screen.getAllByText(/^(Mo|Tu|We|Th|Fr|Sa|Su)$/);
|
|
243
|
+
expect(dayNames[0]).toHaveTextContent('Mo');
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('treats weekStartsOn day names case-insensitively', () => {
|
|
247
|
+
render(<Calendar weekStartsOn={'WED' as 'wed'} />);
|
|
248
|
+
|
|
249
|
+
const dayNames = screen.getAllByText(/^(Mo|Tu|We|Th|Fr|Sa|Su)$/);
|
|
250
|
+
expect(dayNames[0]).toHaveTextContent('We');
|
|
251
|
+
});
|
|
252
|
+
|
|
241
253
|
// ─── Range Mode ──────────────────────────────────────────────
|
|
242
254
|
|
|
243
255
|
it('supports range selection mode', async () => {
|
|
@@ -245,11 +257,7 @@ describe('Calendar', () => {
|
|
|
245
257
|
const handleChange = vi.fn();
|
|
246
258
|
|
|
247
259
|
render(
|
|
248
|
-
<Calendar
|
|
249
|
-
mode="range"
|
|
250
|
-
onChange={handleChange}
|
|
251
|
-
focusDate="2026-01-01"
|
|
252
|
-
/>,
|
|
260
|
+
<Calendar mode="range" onChange={handleChange} focusDate="2026-01-01" />,
|
|
253
261
|
);
|
|
254
262
|
|
|
255
263
|
// Click start date
|
|
@@ -271,11 +279,7 @@ describe('Calendar', () => {
|
|
|
271
279
|
const handleChange = vi.fn();
|
|
272
280
|
|
|
273
281
|
render(
|
|
274
|
-
<Calendar
|
|
275
|
-
mode="range"
|
|
276
|
-
onChange={handleChange}
|
|
277
|
-
focusDate="2026-01-01"
|
|
278
|
-
/>,
|
|
282
|
+
<Calendar mode="range" onChange={handleChange} focusDate="2026-01-01" />,
|
|
279
283
|
);
|
|
280
284
|
|
|
281
285
|
// Click later date first
|
|
@@ -321,6 +325,75 @@ describe('Calendar', () => {
|
|
|
321
325
|
expect(screen.getAllByRole('gridcell').length).toBeGreaterThan(0);
|
|
322
326
|
});
|
|
323
327
|
|
|
328
|
+
it('renders a valid APG grid: one grid, header row of columnheaders inside it, week rows of gridcells', () => {
|
|
329
|
+
render(<Calendar focusDate="2026-01-01" />);
|
|
330
|
+
|
|
331
|
+
const grids = screen.getAllByRole('grid');
|
|
332
|
+
expect(grids.length).toBe(1);
|
|
333
|
+
const grid = grids[0];
|
|
334
|
+
|
|
335
|
+
// The columnheaders live INSIDE the grid.
|
|
336
|
+
const columnHeaders = screen.getAllByRole('columnheader');
|
|
337
|
+
expect(columnHeaders.length).toBe(7);
|
|
338
|
+
for (const header of columnHeaders) {
|
|
339
|
+
expect(grid.contains(header)).toBe(true);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// The grid's rows: first is the header row of columnheaders, the rest are
|
|
343
|
+
// week rows whose direct children are gridcells.
|
|
344
|
+
const rows = within(grid).getAllByRole('row');
|
|
345
|
+
// 1 header row + 6 week rows (fixed 6-row grid).
|
|
346
|
+
expect(rows.length).toBe(7);
|
|
347
|
+
|
|
348
|
+
const [headerRow, ...weekRows] = rows;
|
|
349
|
+
|
|
350
|
+
// Header row's direct children are the 7 columnheaders.
|
|
351
|
+
const headerChildren = Array.from(headerRow.children);
|
|
352
|
+
const headerColHeaders = headerChildren.filter(
|
|
353
|
+
child => child.getAttribute('role') === 'columnheader',
|
|
354
|
+
);
|
|
355
|
+
expect(headerColHeaders.length).toBe(7);
|
|
356
|
+
|
|
357
|
+
// Each week row's direct children are gridcells (7 per row).
|
|
358
|
+
for (const row of weekRows) {
|
|
359
|
+
const gridcellChildren = Array.from(row.children).filter(
|
|
360
|
+
child => child.getAttribute('role') === 'gridcell',
|
|
361
|
+
);
|
|
362
|
+
expect(gridcellChildren.length).toBe(7);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
it('renders week-number cells as rowheader when hasWeekNumbers is set', () => {
|
|
367
|
+
render(<Calendar hasWeekNumbers focusDate="2026-01-01" />);
|
|
368
|
+
|
|
369
|
+
const grid = screen.getByRole('grid');
|
|
370
|
+
const rowHeaders = within(grid).getAllByRole('rowheader');
|
|
371
|
+
// One rowheader (week number) per week row.
|
|
372
|
+
expect(rowHeaders.length).toBeGreaterThanOrEqual(5);
|
|
373
|
+
// Week numbers are numeric.
|
|
374
|
+
for (const header of rowHeaders) {
|
|
375
|
+
expect(header.textContent).toMatch(/^\d+$/);
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it('gridcell wrappers are direct children of week rows, and the button is inside the gridcell', () => {
|
|
380
|
+
render(<Calendar focusDate="2026-01-01" />);
|
|
381
|
+
|
|
382
|
+
const grid = screen.getByRole('grid');
|
|
383
|
+
const gridcells = within(grid).getAllByRole('gridcell');
|
|
384
|
+
for (const cell of gridcells) {
|
|
385
|
+
// The gridcell's parent is a role="row".
|
|
386
|
+
const parent = cell.parentElement;
|
|
387
|
+
expect(parent?.getAttribute('role')).toBe('row');
|
|
388
|
+
// The day button (if present) is a descendant of the gridcell.
|
|
389
|
+
const button = cell.querySelector('button');
|
|
390
|
+
if (button) {
|
|
391
|
+
expect(cell.contains(button)).toBe(true);
|
|
392
|
+
expect(button).not.toHaveAttribute('role', 'gridcell');
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
324
397
|
it('has navigation buttons with accessible labels', () => {
|
|
325
398
|
render(<Calendar />);
|
|
326
399
|
|
|
@@ -346,16 +419,13 @@ describe('Calendar', () => {
|
|
|
346
419
|
const handleFocusChange = vi.fn();
|
|
347
420
|
|
|
348
421
|
render(
|
|
349
|
-
<Calendar
|
|
350
|
-
focusDate="2026-01-01"
|
|
351
|
-
onFocusDateChange={handleFocusChange}
|
|
352
|
-
/>,
|
|
422
|
+
<Calendar focusDate="2026-01-01" onFocusDateChange={handleFocusChange} />,
|
|
353
423
|
);
|
|
354
424
|
|
|
355
425
|
// Focus Jan 28
|
|
356
426
|
const day28 = getDayButton(28);
|
|
357
427
|
await user.click(day28);
|
|
358
|
-
day28.
|
|
428
|
+
day28.focus();
|
|
359
429
|
|
|
360
430
|
// Press ArrowDown — should move to Feb 4 (+7 days), not Feb 28
|
|
361
431
|
await user.keyboard('{ArrowDown}');
|
|
@@ -365,6 +435,78 @@ describe('Calendar', () => {
|
|
|
365
435
|
expect(focusedElement).toHaveAttribute('data-date', '2026-02-04');
|
|
366
436
|
});
|
|
367
437
|
|
|
438
|
+
it('ArrowDown lands on the same weekday +7 days even when earlier days are disabled (complex-2)', async () => {
|
|
439
|
+
const user = userEvent.setup();
|
|
440
|
+
|
|
441
|
+
// min disables Jan 1–4 (HTML-disabled). Jan 8 is a Thursday; ArrowDown must
|
|
442
|
+
// land on Jan 15 (the same weekday, +7 days), not a shifted date caused by
|
|
443
|
+
// the removed enabled cells.
|
|
444
|
+
render(<Calendar focusDate="2026-01-01" min="2026-01-05" />);
|
|
445
|
+
|
|
446
|
+
const day1 = getDayButton(1);
|
|
447
|
+
expect(day1).toBeDisabled();
|
|
448
|
+
|
|
449
|
+
const day8 = getDayButton(8);
|
|
450
|
+
day8.focus();
|
|
451
|
+
|
|
452
|
+
await user.keyboard('{ArrowDown}');
|
|
453
|
+
expect(document.activeElement).toHaveAttribute('data-date', '2026-01-15');
|
|
454
|
+
|
|
455
|
+
await user.keyboard('{ArrowDown}');
|
|
456
|
+
expect(document.activeElement).toHaveAttribute('data-date', '2026-01-22');
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it('ArrowUp skips a disabled cell in the same column to the next enabled row (complex-2)', async () => {
|
|
460
|
+
const user = userEvent.setup();
|
|
461
|
+
|
|
462
|
+
// max disables Jan 22 onward. Focus Feb 5 handling is out of scope; instead
|
|
463
|
+
// use dateConstraints to disable a single mid-grid day and verify column
|
|
464
|
+
// geometry is preserved (ArrowUp from Jan 15 skips disabled Jan 8 → Jan 1).
|
|
465
|
+
const disableJan8 = (date: Date) =>
|
|
466
|
+
!(
|
|
467
|
+
date.getFullYear() === 2026 &&
|
|
468
|
+
date.getMonth() === 0 &&
|
|
469
|
+
date.getDate() === 8
|
|
470
|
+
);
|
|
471
|
+
|
|
472
|
+
render(<Calendar focusDate="2026-01-01" dateConstraints={[disableJan8]} />);
|
|
473
|
+
|
|
474
|
+
const day8 = getDayButton(8);
|
|
475
|
+
expect(day8).toBeDisabled();
|
|
476
|
+
|
|
477
|
+
const day15 = getDayButton(15);
|
|
478
|
+
day15.focus();
|
|
479
|
+
|
|
480
|
+
// ArrowUp: same column one row up is Jan 8 (disabled) → skip to Jan 1.
|
|
481
|
+
await user.keyboard('{ArrowUp}');
|
|
482
|
+
expect(document.activeElement).toHaveAttribute('data-date', '2026-01-01');
|
|
483
|
+
});
|
|
484
|
+
|
|
485
|
+
it('cross-month arrow nav resolves the focused date from data-date (locale-safe)', async () => {
|
|
486
|
+
// Regression for complex-4: getFocusedDate must read the machine-readable
|
|
487
|
+
// data-date attribute, not parse the human-readable aria-label with
|
|
488
|
+
// new Date() (which is locale-dependent). We prove the resolution path by
|
|
489
|
+
// corrupting the aria-label to something new Date() cannot parse — cross-
|
|
490
|
+
// month navigation must still report the correct ISO date.
|
|
491
|
+
const user = userEvent.setup();
|
|
492
|
+
const handleFocusChange = vi.fn();
|
|
493
|
+
|
|
494
|
+
render(
|
|
495
|
+
<Calendar focusDate="2026-01-01" onFocusDateChange={handleFocusChange} />,
|
|
496
|
+
);
|
|
497
|
+
|
|
498
|
+
const day28 = getDayButton(28);
|
|
499
|
+
await user.click(day28);
|
|
500
|
+
day28.focus();
|
|
501
|
+
// Simulate a non-English/unparseable aria-label while keeping data-date.
|
|
502
|
+
day28.setAttribute('aria-label', '2026年1月28日 水曜日');
|
|
503
|
+
|
|
504
|
+
await user.keyboard('{ArrowDown}');
|
|
505
|
+
|
|
506
|
+
// Feb 4 (+7 days) — resolved via data-date despite the unparseable label.
|
|
507
|
+
expect(document.activeElement).toHaveAttribute('data-date', '2026-02-04');
|
|
508
|
+
});
|
|
509
|
+
|
|
368
510
|
it('prev button is disabled when focusDate month contains min', () => {
|
|
369
511
|
render(<Calendar focusDate="2026-01-01" min="2026-01-15" />);
|
|
370
512
|
|
|
@@ -414,11 +556,7 @@ describe('Calendar', () => {
|
|
|
414
556
|
const handleChange = vi.fn();
|
|
415
557
|
|
|
416
558
|
render(
|
|
417
|
-
<Calendar
|
|
418
|
-
mode="range"
|
|
419
|
-
onChange={handleChange}
|
|
420
|
-
focusDate="2026-01-01"
|
|
421
|
-
/>,
|
|
559
|
+
<Calendar mode="range" onChange={handleChange} focusDate="2026-01-01" />,
|
|
422
560
|
);
|
|
423
561
|
|
|
424
562
|
// Click start date to begin range selection
|