@astryxdesign/core 0.1.1 → 0.1.2-canary.04e71b2
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 +105 -0
- package/README.md +131 -13
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +11 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +4 -1
- package/dist/Banner/Banner.d.ts +7 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +9 -2
- 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 +12 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +53 -17
- 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/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.map +1 -1
- package/dist/Chat/useTriggerMenu.js +4 -1
- 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/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +49 -37
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +5 -5
- package/dist/ContextMenu/ContextMenu.d.ts +4 -5
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +93 -11
- package/dist/DateInput/DateInput.d.ts +23 -1
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -8
- 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/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +7 -1
- 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 +8 -0
- package/dist/HoverCard/HoverCard.d.ts +2 -2
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +18 -6
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -3
- package/dist/InputGroup/InputGroup.d.ts +2 -2
- package/dist/InputGroup/InputGroup.d.ts.map +1 -1
- package/dist/InputGroup/InputGroup.js +14 -5
- 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/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 +34 -2
- package/dist/Layer/anchorName.d.ts +20 -0
- package/dist/Layer/anchorName.d.ts.map +1 -0
- package/dist/Layer/anchorName.js +36 -0
- 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 +29 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +55 -11
- 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 +17 -2
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +20 -9
- package/dist/Link/LinkProvider.d.ts +1 -0
- package/dist/Link/LinkProvider.d.ts.map +1 -1
- package/dist/Link/LinkProvider.js +1 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +18 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +13 -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 +25 -2
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +103 -22
- 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 +46 -28
- package/dist/Popover/usePopover.d.ts +25 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +18 -6
- 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 +22 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +84 -23
- 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/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 +38 -11
- 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 +86 -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 +38 -16
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +36 -7
- package/dist/Table/TableCell.d.ts +8 -1
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +10 -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/TableRow.d.ts +6 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +15 -7
- 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/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +59 -3
- package/dist/Table/plugins/stickyColumns/index.d.ts +3 -0
- package/dist/Table/plugins/stickyColumns/index.d.ts.map +1 -0
- package/dist/Table/plugins/stickyColumns/index.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts +25 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +369 -0
- package/dist/Table/tableContextMenu.d.ts +33 -0
- package/dist/Table/tableContextMenu.d.ts.map +1 -0
- package/dist/Table/tableContextMenu.js +133 -0
- package/dist/Table/types.d.ts +161 -5
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +1 -1
- package/dist/Text/text.stylex.d.ts +2 -2
- package/dist/Text/text.stylex.js +2 -2
- 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 +53 -10
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +28 -3
- 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 +132 -3
- package/dist/ToggleButton/ToggleButton.d.ts +7 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +34 -57
- package/dist/Tokenizer/Tokenizer.d.ts +12 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +27 -5
- 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 +57 -9
- 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 +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +67 -6
- package/dist/Typeahead/Typeahead.d.ts +24 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +29 -5
- 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 +40 -1
- package/dist/astryx.umd.js +147 -0
- package/dist/astryx.umd.js.map +7 -0
- 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/theme/generateThemeRules.js +1 -1
- package/dist/theme/syntax/SyntaxTheme.d.ts +1 -1
- package/dist/theme/syntax/SyntaxTheme.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -2
- package/dist/theme/syntax/presets.d.ts +1 -1
- package/dist/theme/syntax/presets.d.ts.map +1 -1
- package/dist/theme/syntax/presets.js +1 -1
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.js +1 -1
- package/dist/theme/types.d.ts +1 -1
- 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/package.json +15 -5
- package/src/Avatar/Avatar.test.tsx +37 -0
- package/src/Avatar/Avatar.tsx +10 -5
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +3 -0
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +16 -7
- package/src/Banner/Banner.tsx +9 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +25 -7
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +31 -10
- package/src/Button/Button.doc.mjs +6 -0
- package/src/Button/Button.test.tsx +105 -11
- package/src/Button/Button.tsx +76 -21
- 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/ChatComposer.doc.mjs +3 -0
- package/src/Chat/ChatComposerDrawer.doc.mjs +12 -0
- 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 +3 -0
- package/src/CheckboxInput/CheckboxInput.doc.mjs +18 -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 +169 -16
- package/src/CheckboxList/CheckboxList.tsx +56 -3
- package/src/CheckboxList/CheckboxListContext.tsx +7 -0
- package/src/Citation/Citation.doc.mjs +10 -0
- package/src/Citation/Citation.test.tsx +117 -0
- package/src/Citation/Citation.tsx +9 -1
- package/src/ClickableCard/ClickableCard.doc.mjs +15 -0
- package/src/CodeBlock/CodeBlock.test.tsx +115 -0
- package/src/CodeBlock/CodeBlock.tsx +61 -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 +113 -16
- package/src/DateInput/DateInput.doc.mjs +281 -56
- package/src/DateInput/DateInput.test.tsx +188 -2
- package/src/DateInput/DateInput.tsx +89 -10
- 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/EmptyState/EmptyState.test.tsx +4 -2
- package/src/EmptyState/EmptyState.tsx +6 -2
- 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 +14 -4
- package/src/Grid/Grid.tsx +20 -0
- package/src/HoverCard/HoverCard.doc.mjs +3 -0
- package/src/HoverCard/HoverCard.test.tsx +189 -2
- package/src/HoverCard/HoverCard.tsx +20 -16
- package/src/HoverCard/useHoverCard.tsx +13 -10
- package/src/Icon/Icon.doc.mjs +8 -0
- package/src/InputGroup/InputGroup.doc.mjs +2 -2
- package/src/InputGroup/InputGroup.test.tsx +98 -60
- package/src/InputGroup/InputGroup.tsx +21 -4
- package/src/InputGroup/InputGroupContext.ts +9 -4
- package/src/InputGroup/index.ts +1 -0
- package/src/Kbd/Kbd.test.tsx +22 -4
- package/src/Kbd/Kbd.tsx +37 -12
- package/src/Layer/anchorName.test.ts +146 -0
- package/src/Layer/anchorName.ts +46 -0
- package/src/Layer/layerAnimations.stylex.ts +20 -4
- package/src/Layer/useLayer.doc.mjs +12 -2
- package/src/Layer/useLayer.tsx +100 -15
- package/src/Layout/Layout.doc.mjs +1 -1
- 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/padding.stylex.ts +52 -0
- package/src/Lightbox/Lightbox.doc.mjs +9 -2
- 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 +52 -2
- package/src/Link/Link.tsx +42 -7
- package/src/Link/LinkProvider.tsx +1 -0
- package/src/List/List.doc.mjs +7 -0
- package/src/Markdown/Markdown.doc.mjs +2 -0
- package/src/Markdown/Markdown.test.tsx +28 -26
- package/src/Markdown/Markdown.tsx +21 -6
- package/src/MetadataList/MetadataListItem.doc.mjs +4 -0
- package/src/MobileNav/MobileNav.doc.mjs +8 -8
- package/src/MobileNav/MobileNav.tsx +13 -0
- package/src/MobileNav/MobileNavReopen.test.tsx +118 -0
- package/src/MoreMenu/MoreMenu.doc.mjs +2 -17
- package/src/MoreMenu/MoreMenu.tsx +0 -9
- package/src/MultiSelector/MultiSelector.doc.mjs +25 -0
- package/src/MultiSelector/MultiSelector.test.tsx +375 -8
- package/src/MultiSelector/MultiSelector.tsx +145 -21
- 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/OverflowList/OverflowList.doc.mjs +17 -0
- package/src/Pagination/Pagination.doc.mjs +3 -3
- package/src/Pagination/Pagination.test.tsx +250 -14
- package/src/Pagination/Pagination.tsx +54 -29
- package/src/Popover/usePopover.doc.mjs +7 -3
- package/src/Popover/usePopover.tsx +49 -6
- 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 +45 -27
- 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/Resizable/Resizable.doc.mjs +1 -1
- package/src/Section/Section.doc.mjs +11 -0
- 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 +15 -0
- package/src/Selector/Selector.doc.mjs +25 -0
- package/src/Selector/Selector.test.tsx +322 -15
- package/src/Selector/Selector.tsx +126 -40
- package/src/Selector/hooks.ts +23 -0
- package/src/SideNav/SideNav.test.tsx +16 -0
- package/src/SideNav/SideNavItem.tsx +2 -4
- package/src/Skeleton/Skeleton.doc.mjs +11 -1
- package/src/Skeleton/Skeleton.test.tsx +25 -0
- package/src/Skeleton/Skeleton.tsx +11 -1
- package/src/Slider/Slider.doc.mjs +19 -0
- package/src/Slider/Slider.test.tsx +158 -18
- package/src/Slider/Slider.tsx +54 -6
- 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 +12 -0
- package/src/TabList/TabList.test.tsx +208 -0
- package/src/TabList/TabList.tsx +102 -12
- package/src/TabList/TabListContext.ts +7 -3
- package/src/TabList/TabMenu.tsx +6 -3
- package/src/Table/BaseTable.tsx +72 -41
- package/src/Table/Table.doc.mjs +14 -0
- package/src/Table/Table.test.tsx +39 -30
- package/src/Table/Table.tsx +27 -1
- package/src/Table/TableCell.tsx +25 -23
- package/src/Table/TableHeaderCell.tsx +28 -29
- package/src/Table/TableRow.tsx +37 -7
- package/src/Table/index.ts +6 -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/sortable/useTableSortable.test.tsx +91 -2
- package/src/Table/plugins/sortable/useTableSortable.tsx +53 -1
- package/src/Table/plugins/stickyColumns/index.ts +4 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.test.tsx +163 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +407 -0
- package/src/Table/tableContextMenu.test.tsx +157 -0
- package/src/Table/tableContextMenu.tsx +142 -0
- package/src/Table/types.ts +175 -4
- package/src/Table/useBaseTablePlugins.ts +1 -0
- package/src/Table/useTableColumnResize.doc.mjs +96 -0
- package/src/Table/useTableStickyColumns.doc.mjs +59 -0
- package/src/Text/Heading.doc.mjs +15 -2
- package/src/Text/Text.doc.mjs +7 -1
- package/src/Text/text.stylex.ts +2 -2
- 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/TimeInput/TimeInput.doc.mjs +335 -60
- package/src/TimeInput/TimeInput.test.tsx +144 -7
- package/src/TimeInput/TimeInput.tsx +74 -5
- package/src/Timestamp/Timestamp.doc.mjs +9 -0
- package/src/Timestamp/Timestamp.test.tsx +44 -18
- package/src/Timestamp/Timestamp.tsx +30 -10
- package/src/Toast/Toast.tsx +14 -0
- package/src/Toast/ToastViewport.test.tsx +204 -0
- package/src/Toast/ToastViewport.tsx +167 -21
- package/src/ToggleButton/ToggleButton.doc.mjs +9 -3
- package/src/ToggleButton/ToggleButton.test.tsx +39 -18
- package/src/ToggleButton/ToggleButton.tsx +46 -83
- package/src/Tokenizer/Tokenizer.doc.mjs +15 -0
- package/src/Tokenizer/Tokenizer.test.tsx +105 -1
- package/src/Tokenizer/Tokenizer.tsx +41 -2
- package/src/Toolbar/Toolbar.doc.mjs +65 -5
- package/src/Toolbar/Toolbar.test.tsx +109 -6
- package/src/Toolbar/Toolbar.tsx +59 -5
- package/src/Tooltip/Tooltip.test.tsx +81 -0
- package/src/Tooltip/useTooltip.tsx +57 -11
- 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 +86 -9
- package/src/Typeahead/Typeahead.doc.mjs +136 -30
- package/src/Typeahead/Typeahead.test.tsx +331 -1
- package/src/Typeahead/Typeahead.tsx +52 -1
- 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/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/useImageMode.test.ts +133 -0
- 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 +4 -0
- package/src/theme/generateThemeRules.test.ts +7 -8
- package/src/theme/generateThemeRules.ts +1 -1
- package/src/theme/syntax/SyntaxTheme.tsx +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +20 -11
- package/src/theme/syntax/presets.ts +5 -2
- package/src/theme/syntax/tokens.ts +1 -1
- package/src/theme/types.ts +1 -1
- 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
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* SYNC: When DateRangeInput.tsx changes, update tests to match new behavior
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {describe, it, expect, vi} from 'vitest';
|
|
13
|
-
import {render, screen, fireEvent} from '@testing-library/react';
|
|
12
|
+
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
13
|
+
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
14
|
+
import userEvent from '@testing-library/user-event';
|
|
14
15
|
import {DateRangeInput} from './DateRangeInput';
|
|
15
16
|
import type {DateRange} from './DateRangeInput';
|
|
16
17
|
|
|
@@ -23,9 +24,7 @@ describe('DateRangeInput', () => {
|
|
|
23
24
|
});
|
|
24
25
|
|
|
25
26
|
it('renders placeholder when value is null', () => {
|
|
26
|
-
render(
|
|
27
|
-
<DateRangeInput label="Range" value={null} onChange={() => {}} />,
|
|
28
|
-
);
|
|
27
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
29
28
|
expect(screen.getByText('Select date range')).toBeInTheDocument();
|
|
30
29
|
});
|
|
31
30
|
|
|
@@ -99,9 +98,7 @@ describe('DateRangeInput', () => {
|
|
|
99
98
|
});
|
|
100
99
|
|
|
101
100
|
it('does not set aria-required when isRequired is false', () => {
|
|
102
|
-
render(
|
|
103
|
-
<DateRangeInput label="Range" value={null} onChange={() => {}} />,
|
|
104
|
-
);
|
|
101
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
105
102
|
const trigger = screen.getByRole('button', {name: /Range/});
|
|
106
103
|
expect(trigger).not.toHaveAttribute('aria-required');
|
|
107
104
|
});
|
|
@@ -120,25 +117,19 @@ describe('DateRangeInput', () => {
|
|
|
120
117
|
});
|
|
121
118
|
|
|
122
119
|
it('is not disabled by default', () => {
|
|
123
|
-
render(
|
|
124
|
-
<DateRangeInput label="Range" value={null} onChange={() => {}} />,
|
|
125
|
-
);
|
|
120
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
126
121
|
const trigger = screen.getByRole('button', {name: /Range/});
|
|
127
122
|
expect(trigger).not.toBeDisabled();
|
|
128
123
|
});
|
|
129
124
|
|
|
130
125
|
it('trigger has aria-haspopup="dialog"', () => {
|
|
131
|
-
render(
|
|
132
|
-
<DateRangeInput label="Range" value={null} onChange={() => {}} />,
|
|
133
|
-
);
|
|
126
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
134
127
|
const trigger = screen.getByRole('button', {name: /Range/});
|
|
135
128
|
expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
|
|
136
129
|
});
|
|
137
130
|
|
|
138
131
|
it('trigger has aria-expanded=false by default', () => {
|
|
139
|
-
render(
|
|
140
|
-
<DateRangeInput label="Range" value={null} onChange={() => {}} />,
|
|
141
|
-
);
|
|
132
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
142
133
|
const trigger = screen.getByRole('button', {name: /Range/});
|
|
143
134
|
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
144
135
|
});
|
|
@@ -201,9 +192,7 @@ describe('DateRangeInput', () => {
|
|
|
201
192
|
});
|
|
202
193
|
|
|
203
194
|
it('calendar icon button is present', () => {
|
|
204
|
-
render(
|
|
205
|
-
<DateRangeInput label="Range" value={null} onChange={() => {}} />,
|
|
206
|
-
);
|
|
195
|
+
render(<DateRangeInput label="Range" value={null} onChange={() => {}} />);
|
|
207
196
|
expect(
|
|
208
197
|
screen.getByRole('button', {name: 'Open calendar'}),
|
|
209
198
|
).toBeInTheDocument();
|
|
@@ -321,4 +310,177 @@ describe('DateRangeInput', () => {
|
|
|
321
310
|
expect(onChange).toHaveBeenCalledWith(null);
|
|
322
311
|
});
|
|
323
312
|
});
|
|
313
|
+
|
|
314
|
+
describe('presets', () => {
|
|
315
|
+
const presets = [
|
|
316
|
+
{
|
|
317
|
+
label: 'Last 7 days',
|
|
318
|
+
getRange: (): DateRange => ({
|
|
319
|
+
start: '2026-03-01',
|
|
320
|
+
end: '2026-03-07',
|
|
321
|
+
}),
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
label: 'This month',
|
|
325
|
+
getRange: (): DateRange => ({
|
|
326
|
+
start: '2026-03-01',
|
|
327
|
+
end: '2026-03-31',
|
|
328
|
+
}),
|
|
329
|
+
},
|
|
330
|
+
];
|
|
331
|
+
|
|
332
|
+
it('renders presets as a labeled group of buttons, not a listbox (forms-5)', () => {
|
|
333
|
+
render(
|
|
334
|
+
<DateRangeInput
|
|
335
|
+
label="Range"
|
|
336
|
+
value={null}
|
|
337
|
+
onChange={() => {}}
|
|
338
|
+
presets={presets}
|
|
339
|
+
/>,
|
|
340
|
+
);
|
|
341
|
+
// The preset sidebar is a group of action buttons — not a listbox of
|
|
342
|
+
// options (which would announce a Tab-navigable listbox it isn't).
|
|
343
|
+
expect(
|
|
344
|
+
screen.queryByRole('listbox', {hidden: true}),
|
|
345
|
+
).not.toBeInTheDocument();
|
|
346
|
+
expect(
|
|
347
|
+
screen.getByRole('group', {name: 'Preset date ranges', hidden: true}),
|
|
348
|
+
).toBeInTheDocument();
|
|
349
|
+
expect(
|
|
350
|
+
screen.getByRole('button', {name: 'Last 7 days', hidden: true}),
|
|
351
|
+
).toBeInTheDocument();
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('marks the applied preset with aria-current, not aria-selected', () => {
|
|
355
|
+
render(
|
|
356
|
+
<DateRangeInput
|
|
357
|
+
label="Range"
|
|
358
|
+
value={{start: '2026-03-01', end: '2026-03-07'}}
|
|
359
|
+
onChange={() => {}}
|
|
360
|
+
presets={presets}
|
|
361
|
+
/>,
|
|
362
|
+
);
|
|
363
|
+
const active = screen.getByRole('button', {
|
|
364
|
+
name: 'Last 7 days',
|
|
365
|
+
hidden: true,
|
|
366
|
+
});
|
|
367
|
+
expect(active).toHaveAttribute('aria-current', 'true');
|
|
368
|
+
expect(active).not.toHaveAttribute('aria-selected');
|
|
369
|
+
const inactive = screen.getByRole('button', {
|
|
370
|
+
name: 'This month',
|
|
371
|
+
hidden: true,
|
|
372
|
+
});
|
|
373
|
+
expect(inactive).not.toHaveAttribute('aria-current');
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
describe('disabledMessage', () => {
|
|
377
|
+
// jsdom does not implement the Popover API used by the tooltip, so mock
|
|
378
|
+
// showPopover/hidePopover to toggle a `popover-open` attribute the tests
|
|
379
|
+
// can assert on.
|
|
380
|
+
beforeEach(() => {
|
|
381
|
+
HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
|
|
382
|
+
this.setAttribute('popover-open', '');
|
|
383
|
+
});
|
|
384
|
+
HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
|
|
385
|
+
this.removeAttribute('popover-open');
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
// jsdom popover content is in the DOM but not "visible" in the
|
|
390
|
+
// accessibility tree; use hidden: true to find it.
|
|
391
|
+
const h = {hidden: true} as const;
|
|
392
|
+
|
|
393
|
+
function renderDisabled(props?: {disabledMessage?: string}) {
|
|
394
|
+
return render(
|
|
395
|
+
<DateRangeInput
|
|
396
|
+
label="Range"
|
|
397
|
+
value={null}
|
|
398
|
+
onChange={() => {}}
|
|
399
|
+
isDisabled
|
|
400
|
+
{...props}
|
|
401
|
+
/>,
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
it('shows the reason tooltip on hover when disabled with a reason', async () => {
|
|
406
|
+
renderDisabled({disabledMessage: 'You need the Editor role'});
|
|
407
|
+
|
|
408
|
+
const trigger = screen.getByRole('button', {name: /Range:/, ...h});
|
|
409
|
+
const container = trigger.parentElement as HTMLElement;
|
|
410
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
411
|
+
expect(tooltip).toHaveTextContent('You need the Editor role');
|
|
412
|
+
|
|
413
|
+
fireEvent.mouseEnter(container);
|
|
414
|
+
await waitFor(() => {
|
|
415
|
+
expect(tooltip).toHaveAttribute('popover-open');
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
fireEvent.mouseLeave(container);
|
|
419
|
+
await waitFor(() => {
|
|
420
|
+
expect(tooltip).not.toHaveAttribute('popover-open');
|
|
421
|
+
});
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('shows the reason tooltip on keyboard focus', async () => {
|
|
425
|
+
const user = userEvent.setup();
|
|
426
|
+
renderDisabled({disabledMessage: 'You need the Editor role'});
|
|
427
|
+
|
|
428
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
429
|
+
await user.tab();
|
|
430
|
+
expect(screen.getByRole('button', {name: /Range:/, ...h})).toHaveFocus();
|
|
431
|
+
await waitFor(() => {
|
|
432
|
+
expect(tooltip).toHaveAttribute('popover-open');
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
it('does not render a tooltip when not disabled', () => {
|
|
437
|
+
render(
|
|
438
|
+
<DateRangeInput
|
|
439
|
+
label="Range"
|
|
440
|
+
value={null}
|
|
441
|
+
onChange={() => {}}
|
|
442
|
+
disabledMessage="You need the Editor role"
|
|
443
|
+
/>,
|
|
444
|
+
);
|
|
445
|
+
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
it('does not render a tooltip when disabled without a reason', () => {
|
|
449
|
+
renderDisabled();
|
|
450
|
+
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
it('keeps the trigger focusable via aria-disabled when a reason is provided', () => {
|
|
454
|
+
renderDisabled({disabledMessage: 'You need the Editor role'});
|
|
455
|
+
const trigger = screen.getByRole('button', {name: /Range:/, ...h});
|
|
456
|
+
expect(trigger).not.toBeDisabled();
|
|
457
|
+
expect(trigger).toHaveAttribute('aria-disabled', 'true');
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
it('links the reason tooltip from the trigger via aria-describedby', () => {
|
|
461
|
+
renderDisabled({disabledMessage: 'You need the Editor role'});
|
|
462
|
+
const trigger = screen.getByRole('button', {name: /Range:/, ...h});
|
|
463
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
464
|
+
expect(trigger.getAttribute('aria-describedby')).toContain(tooltip.id);
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
it('blocks activation while focusable-disabled', async () => {
|
|
468
|
+
const user = userEvent.setup();
|
|
469
|
+
renderDisabled({disabledMessage: 'You need the Editor role'});
|
|
470
|
+
|
|
471
|
+
const trigger = screen.getByRole('button', {name: /Range:/, ...h});
|
|
472
|
+
await user.click(trigger);
|
|
473
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
474
|
+
|
|
475
|
+
await user.keyboard('{Enter}');
|
|
476
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
it('remains natively disabled when disabled without a reason', () => {
|
|
480
|
+
renderDisabled();
|
|
481
|
+
const trigger = screen.getByRole('button', {name: /Range:/, ...h});
|
|
482
|
+
expect(trigger).toBeDisabled();
|
|
483
|
+
expect(trigger).not.toHaveAttribute('aria-disabled');
|
|
484
|
+
});
|
|
485
|
+
});
|
|
324
486
|
});
|
|
@@ -48,6 +48,7 @@ import {Icon} from '../Icon';
|
|
|
48
48
|
import {Spinner} from '../Spinner';
|
|
49
49
|
import {Calendar, type ISODateString, type DateRange} from '../Calendar';
|
|
50
50
|
import {usePopover} from '../Popover';
|
|
51
|
+
import {useTooltip} from '../Tooltip';
|
|
51
52
|
import {mergeProps} from '../utils';
|
|
52
53
|
import type {BaseProps} from '../BaseProps';
|
|
53
54
|
import type {SizeValue} from '../utils/types';
|
|
@@ -240,6 +241,29 @@ export interface DateRangeInputProps extends Omit<
|
|
|
240
241
|
*/
|
|
241
242
|
isDisabled?: boolean;
|
|
242
243
|
|
|
244
|
+
/**
|
|
245
|
+
* Explains why the input is disabled. When set together with
|
|
246
|
+
* `isDisabled`, the input shows a tooltip with this text on hover and
|
|
247
|
+
* keyboard focus, and the trigger stays focusable (via `aria-disabled`)
|
|
248
|
+
* so the reason is discoverable by keyboard and assistive technology.
|
|
249
|
+
* Activation stays blocked.
|
|
250
|
+
*
|
|
251
|
+
* Use this instead of wrapping a disabled input in `Tooltip` — disabled
|
|
252
|
+
* controls don't emit the pointer events an external tooltip needs.
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```
|
|
256
|
+
* <DateRangeInput
|
|
257
|
+
* label="Reporting period"
|
|
258
|
+
* value={range}
|
|
259
|
+
* onChange={setRange}
|
|
260
|
+
* isDisabled
|
|
261
|
+
* disabledMessage="You need the Editor role to change this"
|
|
262
|
+
* />
|
|
263
|
+
* ```
|
|
264
|
+
*/
|
|
265
|
+
disabledMessage?: string;
|
|
266
|
+
|
|
243
267
|
/**
|
|
244
268
|
* The selected date range, or null if no range is selected.
|
|
245
269
|
*/
|
|
@@ -347,6 +371,7 @@ export function DateRangeInput({
|
|
|
347
371
|
isOptional = false,
|
|
348
372
|
isRequired = false,
|
|
349
373
|
isDisabled = false,
|
|
374
|
+
disabledMessage,
|
|
350
375
|
value,
|
|
351
376
|
onChange,
|
|
352
377
|
changeAction,
|
|
@@ -378,6 +403,21 @@ export function DateRangeInput({
|
|
|
378
403
|
const isBusy = isLoading || optimisticValue !== value;
|
|
379
404
|
const isEffectivelyDisabled = isDisabled || isBusy;
|
|
380
405
|
|
|
406
|
+
// Disabled-reason tooltip. Disabled controls swallow pointer events, so the
|
|
407
|
+
// tooltip listeners attach to the trigger container (which already exists)
|
|
408
|
+
// and the trigger button stays perceivable via aria-disabled instead of the
|
|
409
|
+
// disabled attribute. Activation is blocked by the isEffectivelyDisabled
|
|
410
|
+
// guard in handleToggle. Only the persistent isDisabled state (not the
|
|
411
|
+
// transient busy state) surfaces a reason.
|
|
412
|
+
const showsDisabledMessage = isDisabled && !!disabledMessage;
|
|
413
|
+
const disabledMessageTooltip = useTooltip({
|
|
414
|
+
placement: 'above',
|
|
415
|
+
// The container div is not naturally focusable; focusin bubbles up from
|
|
416
|
+
// the trigger button, so always attach focus listeners.
|
|
417
|
+
focusTrigger: 'always',
|
|
418
|
+
isEnabled: showsDisabledMessage,
|
|
419
|
+
});
|
|
420
|
+
|
|
381
421
|
const statusIconMap: Record<InputStatusType, IconName> = {
|
|
382
422
|
warning: 'warning',
|
|
383
423
|
error: 'error',
|
|
@@ -397,6 +437,7 @@ export function DateRangeInput({
|
|
|
397
437
|
[
|
|
398
438
|
description ? descriptionID : null,
|
|
399
439
|
status?.message ? statusMessageID : null,
|
|
440
|
+
showsDisabledMessage ? disabledMessageTooltip.describedBy : null,
|
|
400
441
|
]
|
|
401
442
|
.filter(Boolean)
|
|
402
443
|
.join(' ') || undefined;
|
|
@@ -487,7 +528,13 @@ export function DateRangeInput({
|
|
|
487
528
|
labelTooltip={labelTooltip}
|
|
488
529
|
width={width}>
|
|
489
530
|
<div
|
|
490
|
-
ref={
|
|
531
|
+
ref={el => {
|
|
532
|
+
popover.triggerRef(el);
|
|
533
|
+
// Anchor + hover/focus listeners for the disabled-message tooltip.
|
|
534
|
+
// Handlers are gated internally by isEnabled, and anchor names
|
|
535
|
+
// compose, so attaching unconditionally is safe.
|
|
536
|
+
disabledMessageTooltip.ref(el);
|
|
537
|
+
}}
|
|
491
538
|
{...rest}
|
|
492
539
|
{...mergeProps(
|
|
493
540
|
themeProps('date-range-input', {
|
|
@@ -523,7 +570,11 @@ export function DateRangeInput({
|
|
|
523
570
|
id={id}
|
|
524
571
|
type="button"
|
|
525
572
|
onClick={handleToggle}
|
|
526
|
-
|
|
573
|
+
// With a disabledMessage the trigger keeps focusability via
|
|
574
|
+
// aria-disabled so the reason is focus-discoverable; activation is
|
|
575
|
+
// still blocked by the isEffectivelyDisabled guard in handleToggle.
|
|
576
|
+
disabled={isEffectivelyDisabled && !showsDisabledMessage}
|
|
577
|
+
aria-disabled={showsDisabledMessage ? 'true' : undefined}
|
|
527
578
|
aria-label={triggerAriaLabel}
|
|
528
579
|
aria-describedby={ariaDescribedBy}
|
|
529
580
|
aria-required={isRequired === true ? 'true' : undefined}
|
|
@@ -561,7 +612,7 @@ export function DateRangeInput({
|
|
|
561
612
|
<div {...stylex.props(styles.popoverLayout)}>
|
|
562
613
|
{presets && presets.length > 0 && (
|
|
563
614
|
<div
|
|
564
|
-
role="
|
|
615
|
+
role="group"
|
|
565
616
|
aria-label="Preset date ranges"
|
|
566
617
|
{...stylex.props(styles.presetSidebar)}>
|
|
567
618
|
{presets.map(preset => {
|
|
@@ -571,8 +622,12 @@ export function DateRangeInput({
|
|
|
571
622
|
<button
|
|
572
623
|
key={preset.label}
|
|
573
624
|
type="button"
|
|
574
|
-
|
|
575
|
-
|
|
625
|
+
// These presets are independent action buttons navigated by
|
|
626
|
+
// Tab, not a single-tab-stop listbox — so they are a labeled
|
|
627
|
+
// group of buttons, and the currently-applied preset is
|
|
628
|
+
// marked with aria-current (not aria-selected, a listbox
|
|
629
|
+
// concept that contradicted the Tab interaction) (forms-5).
|
|
630
|
+
aria-current={isActive ? 'true' : undefined}
|
|
576
631
|
onClick={() => handlePresetClick(preset)}
|
|
577
632
|
{...stylex.props(
|
|
578
633
|
styles.presetButton,
|
|
@@ -596,6 +651,9 @@ export function DateRangeInput({
|
|
|
596
651
|
</div>,
|
|
597
652
|
{placement: 'below', alignment: 'start'},
|
|
598
653
|
)}
|
|
654
|
+
|
|
655
|
+
{showsDisabledMessage &&
|
|
656
|
+
disabledMessageTooltip.renderTooltip(disabledMessage)}
|
|
599
657
|
</Field>
|
|
600
658
|
);
|
|
601
659
|
}
|