@astryxdesign/core 0.1.2 → 0.1.3
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 +2 -4
- 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 +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 +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 +11 -8
- 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 +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/index.d.ts +2 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +2 -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/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 +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 +18 -0
- package/dist/astryx.umd.js +55 -55
- 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.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 +3 -16
- 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 +113 -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/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 +21 -17
- 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 +25 -23
- package/src/Table/TableHeaderCell.tsx +28 -29
- package/src/Table/index.ts +3 -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/tableContextMenu.test.tsx +157 -0
- package/src/Table/tableContextMenu.tsx +142 -0
- package/src/Table/types.ts +74 -0
- package/src/Table/useTableColumnResize.doc.mjs +3 -3
- 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 +340 -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
|
@@ -71,6 +71,12 @@ export const docs = {
|
|
|
71
71
|
description: 'Disables the entire component.',
|
|
72
72
|
default: 'false',
|
|
73
73
|
},
|
|
74
|
+
{
|
|
75
|
+
name: 'disabledMessage',
|
|
76
|
+
type: 'string',
|
|
77
|
+
description:
|
|
78
|
+
'Explains why the search is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the input focusable via aria-disabled (input stays blocked). Use this instead of wrapping a disabled PowerSearch in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
|
|
79
|
+
},
|
|
74
80
|
{
|
|
75
81
|
name: 'status',
|
|
76
82
|
type: 'InputStatus',
|
|
@@ -136,6 +142,7 @@ export const docs = {
|
|
|
136
142
|
{ guidance: true, description: 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.' },
|
|
137
143
|
{ guidance: true, description: 'Provide a result count to give users feedback on how their filters affect the data set.' },
|
|
138
144
|
{ guidance: false, description: 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.' },
|
|
145
|
+
{ guidance: false, description: 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
139
146
|
],
|
|
140
147
|
},
|
|
141
148
|
};
|
|
@@ -212,6 +219,12 @@ export const docsZh = {
|
|
|
212
219
|
description: '禁用整个组件。',
|
|
213
220
|
default: 'false',
|
|
214
221
|
},
|
|
222
|
+
{
|
|
223
|
+
name: 'disabledMessage',
|
|
224
|
+
type: 'string',
|
|
225
|
+
description:
|
|
226
|
+
'Explains why the search is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the input focusable via aria-disabled (input stays blocked). Use this instead of wrapping a disabled PowerSearch in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
|
|
227
|
+
},
|
|
215
228
|
{
|
|
216
229
|
name: 'status',
|
|
217
230
|
type: 'InputStatus',
|
|
@@ -269,6 +282,7 @@ export const docsZh = {
|
|
|
269
282
|
{ guidance: true, description: 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.' },
|
|
270
283
|
{ guidance: true, description: 'Provide a result count to give users feedback on how their filters affect the data set.' },
|
|
271
284
|
{ guidance: false, description: 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.' },
|
|
285
|
+
{ guidance: false, description: 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
272
286
|
],
|
|
273
287
|
},
|
|
274
288
|
};
|
|
@@ -284,6 +298,7 @@ export const docsDense = {
|
|
|
284
298
|
{ guidance: true, description: 'Define clear, descriptive field names and aliases so users can quickly find the filter they need.' },
|
|
285
299
|
{ guidance: true, description: 'Provide a result count to give users feedback on how their filters affect the data set.' },
|
|
286
300
|
{ guidance: false, description: 'Use PowerSearch for simple keyword searches; a standard text input is more appropriate for single-field lookups.' },
|
|
301
|
+
{ guidance: false, description: 'Wrap a disabled PowerSearch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
287
302
|
],
|
|
288
303
|
},
|
|
289
304
|
propDescriptions: {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import {useState} from 'react';
|
|
13
13
|
import {describe, it, expect, vi, beforeAll, afterAll} from 'vitest';
|
|
14
|
-
import {render, screen, act} from '@testing-library/react';
|
|
14
|
+
import {render, screen, act, fireEvent, waitFor} from '@testing-library/react';
|
|
15
15
|
import userEvent from '@testing-library/user-event';
|
|
16
16
|
import {PowerSearch} from './PowerSearch';
|
|
17
17
|
import type {PowerSearchConfig, PowerSearchFilter} from './types';
|
|
@@ -199,4 +199,100 @@ describe('PowerSearch', () => {
|
|
|
199
199
|
expect(pasteResults).toEqual(typeResults);
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
|
+
|
|
203
|
+
describe('disabledMessage', () => {
|
|
204
|
+
const h = {hidden: true} as const;
|
|
205
|
+
const isOpen = (el: Element) => el.matches(':popover-open');
|
|
206
|
+
|
|
207
|
+
function renderSearch(props?: {onChange?: () => void}) {
|
|
208
|
+
return render(
|
|
209
|
+
<PowerSearch
|
|
210
|
+
config={config}
|
|
211
|
+
filters={[]}
|
|
212
|
+
onChange={props?.onChange ?? (() => {})}
|
|
213
|
+
isDisabled
|
|
214
|
+
disabledMessage="You need edit access to search"
|
|
215
|
+
/>,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
it('shows the reason tooltip on hover when disabled with a reason', async () => {
|
|
220
|
+
renderSearch();
|
|
221
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
222
|
+
expect(tooltip).toHaveTextContent('You need edit access to search');
|
|
223
|
+
const wrapper = screen.getByRole('group');
|
|
224
|
+
fireEvent.mouseEnter(wrapper);
|
|
225
|
+
await waitFor(() => expect(isOpen(tooltip)).toBe(true));
|
|
226
|
+
fireEvent.mouseLeave(wrapper);
|
|
227
|
+
await waitFor(() => expect(isOpen(tooltip)).toBe(false));
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('shows the reason tooltip on keyboard focus', async () => {
|
|
231
|
+
const user = userEvent.setup();
|
|
232
|
+
renderSearch();
|
|
233
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
234
|
+
await user.tab();
|
|
235
|
+
expect(screen.getByRole('combobox')).toHaveFocus();
|
|
236
|
+
await waitFor(() => expect(isOpen(tooltip)).toBe(true));
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('does not render a tooltip when not disabled', () => {
|
|
240
|
+
render(
|
|
241
|
+
<PowerSearch
|
|
242
|
+
config={config}
|
|
243
|
+
filters={[]}
|
|
244
|
+
onChange={() => {}}
|
|
245
|
+
disabledMessage="You need edit access to search"
|
|
246
|
+
/>,
|
|
247
|
+
);
|
|
248
|
+
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('does not render a tooltip when disabled without a reason', () => {
|
|
252
|
+
render(
|
|
253
|
+
<PowerSearch
|
|
254
|
+
config={config}
|
|
255
|
+
filters={[]}
|
|
256
|
+
onChange={() => {}}
|
|
257
|
+
isDisabled
|
|
258
|
+
/>,
|
|
259
|
+
);
|
|
260
|
+
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('keeps the input focusable via aria-disabled when a reason is provided', () => {
|
|
264
|
+
renderSearch();
|
|
265
|
+
const input = screen.getByRole('combobox');
|
|
266
|
+
expect(input).not.toBeDisabled();
|
|
267
|
+
expect(input).toHaveAttribute('aria-disabled', 'true');
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('links the reason tooltip via aria-describedby', () => {
|
|
271
|
+
renderSearch();
|
|
272
|
+
const input = screen.getByRole('combobox');
|
|
273
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
274
|
+
expect(input.getAttribute('aria-describedby')).toContain(tooltip.id);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it('blocks input while focusable-disabled', async () => {
|
|
278
|
+
const user = userEvent.setup();
|
|
279
|
+
renderSearch();
|
|
280
|
+
const input = screen.getByRole('combobox');
|
|
281
|
+
input.focus();
|
|
282
|
+
await user.keyboard('open');
|
|
283
|
+
expect((input as HTMLInputElement).value).toBe('');
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it('keeps the input natively disabled when disabled without a reason', () => {
|
|
287
|
+
render(
|
|
288
|
+
<PowerSearch
|
|
289
|
+
config={config}
|
|
290
|
+
filters={[]}
|
|
291
|
+
onChange={() => {}}
|
|
292
|
+
isDisabled
|
|
293
|
+
/>,
|
|
294
|
+
);
|
|
295
|
+
expect(screen.getByRole('combobox')).toBeDisabled();
|
|
296
|
+
});
|
|
297
|
+
});
|
|
202
298
|
});
|
|
@@ -358,6 +358,16 @@ export interface PowerSearchProps extends Omit<
|
|
|
358
358
|
isReadOnly?: boolean;
|
|
359
359
|
/** Whether the input is disabled. @default false */
|
|
360
360
|
isDisabled?: boolean;
|
|
361
|
+
/**
|
|
362
|
+
* Explains why the search is disabled. When set together with `isDisabled`,
|
|
363
|
+
* the search shows a tooltip with this text on hover and keyboard focus, and
|
|
364
|
+
* the input stays focusable (via `aria-disabled`) so the reason is
|
|
365
|
+
* discoverable by keyboard and assistive technology. Input stays blocked.
|
|
366
|
+
*
|
|
367
|
+
* Use this instead of wrapping a disabled PowerSearch in `Tooltip` — disabled
|
|
368
|
+
* controls don't emit the pointer events an external tooltip needs.
|
|
369
|
+
*/
|
|
370
|
+
disabledMessage?: string;
|
|
361
371
|
/**
|
|
362
372
|
* Icon to display at the start of the input.
|
|
363
373
|
* Accepts a ReactNode (e.g. `<Icon icon={SearchIcon} />`) or an SVG icon component directly.
|
|
@@ -508,6 +518,7 @@ export function PowerSearch({
|
|
|
508
518
|
hasClear = true,
|
|
509
519
|
isReadOnly = false,
|
|
510
520
|
isDisabled = false,
|
|
521
|
+
disabledMessage,
|
|
511
522
|
startIcon,
|
|
512
523
|
onFocus,
|
|
513
524
|
onBlur,
|
|
@@ -546,6 +557,9 @@ export function PowerSearch({
|
|
|
546
557
|
hasLightDismiss: true,
|
|
547
558
|
hasCloseButton: false,
|
|
548
559
|
hasAutoFocus: false,
|
|
560
|
+
// The popup's own listbox/menu content is the exposed semantics; focus
|
|
561
|
+
// stays on the tokenizer input, so a modal dialog wrapper is incorrect.
|
|
562
|
+
role: 'none',
|
|
549
563
|
});
|
|
550
564
|
|
|
551
565
|
// Wrapper that manages layer visibility and tokenizer focus alongside state
|
|
@@ -795,9 +809,7 @@ export function PowerSearch({
|
|
|
795
809
|
filter.value.value[0].photo
|
|
796
810
|
) {
|
|
797
811
|
const entity = filter.value.value[0];
|
|
798
|
-
tokenIcon =
|
|
799
|
-
<Avatar src={entity.photo} name={entity.label} size={16} />
|
|
800
|
-
);
|
|
812
|
+
tokenIcon = <Avatar src={entity.photo} name={entity.label} size={16} />;
|
|
801
813
|
}
|
|
802
814
|
|
|
803
815
|
return (
|
|
@@ -982,6 +994,7 @@ export function PowerSearch({
|
|
|
982
994
|
startIcon={startIcon}
|
|
983
995
|
endContent={combinedEndContent}
|
|
984
996
|
isDisabled={isDisabled}
|
|
997
|
+
disabledMessage={disabledMessage}
|
|
985
998
|
size={size}
|
|
986
999
|
tokenOverflowBehavior={tokenOverflowBehavior}
|
|
987
1000
|
hasEntriesOnFocus
|
|
@@ -7,11 +7,19 @@ import {ProgressBar} from './ProgressBar';
|
|
|
7
7
|
describe('ProgressBar', () => {
|
|
8
8
|
it('renders with default props', () => {
|
|
9
9
|
render(<ProgressBar value={50} label="Progress" />);
|
|
10
|
-
const
|
|
11
|
-
expect(
|
|
12
|
-
expect(
|
|
13
|
-
expect(
|
|
14
|
-
expect(
|
|
10
|
+
const progressbar = screen.getByRole('progressbar');
|
|
11
|
+
expect(progressbar).toBeInTheDocument();
|
|
12
|
+
expect(progressbar).toHaveAttribute('aria-valuenow', '50');
|
|
13
|
+
expect(progressbar).toHaveAttribute('aria-valuemin', '0');
|
|
14
|
+
expect(progressbar).toHaveAttribute('aria-valuemax', '100');
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('uses role="progressbar" (not "meter") for determinate progress', () => {
|
|
18
|
+
// A determinate ProgressBar conveys task completion, so it must be a
|
|
19
|
+
// progressbar (announced on update), not a meter (a static gauge).
|
|
20
|
+
render(<ProgressBar value={50} label="Progress" />);
|
|
21
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
|
22
|
+
expect(screen.queryByRole('meter')).not.toBeInTheDocument();
|
|
15
23
|
});
|
|
16
24
|
|
|
17
25
|
it('renders visible label by default', () => {
|
|
@@ -23,8 +31,8 @@ describe('ProgressBar', () => {
|
|
|
23
31
|
render(<ProgressBar value={50} label="Hidden label" isLabelHidden />);
|
|
24
32
|
const label = screen.getByText('Hidden label');
|
|
25
33
|
expect(label).toBeInTheDocument();
|
|
26
|
-
const
|
|
27
|
-
expect(
|
|
34
|
+
const progressbar = screen.getByRole('progressbar');
|
|
35
|
+
expect(progressbar).toHaveAttribute('aria-labelledby');
|
|
28
36
|
});
|
|
29
37
|
|
|
30
38
|
it('shows value label when hasValueLabel is true', () => {
|
|
@@ -43,33 +51,33 @@ describe('ProgressBar', () => {
|
|
|
43
51
|
/>,
|
|
44
52
|
);
|
|
45
53
|
expect(screen.getByText('3 GB / 5 GB')).toBeInTheDocument();
|
|
46
|
-
const
|
|
47
|
-
expect(
|
|
54
|
+
const progressbar = screen.getByRole('progressbar');
|
|
55
|
+
expect(progressbar).toHaveAttribute('aria-valuetext', '3 GB / 5 GB');
|
|
48
56
|
});
|
|
49
57
|
|
|
50
58
|
it('sets aria-valuetext from formatValueLabel', () => {
|
|
51
59
|
render(<ProgressBar value={50} label="Progress" />);
|
|
52
|
-
const
|
|
53
|
-
expect(
|
|
60
|
+
const progressbar = screen.getByRole('progressbar');
|
|
61
|
+
expect(progressbar).toHaveAttribute('aria-valuetext', '50%');
|
|
54
62
|
});
|
|
55
63
|
|
|
56
64
|
it('respects custom max', () => {
|
|
57
65
|
render(<ProgressBar value={3} max={10} label="Steps" />);
|
|
58
|
-
const
|
|
59
|
-
expect(
|
|
60
|
-
expect(
|
|
66
|
+
const progressbar = screen.getByRole('progressbar');
|
|
67
|
+
expect(progressbar).toHaveAttribute('aria-valuenow', '3');
|
|
68
|
+
expect(progressbar).toHaveAttribute('aria-valuemax', '10');
|
|
61
69
|
});
|
|
62
70
|
|
|
63
71
|
it('clamps value to [0, max]', () => {
|
|
64
72
|
const {rerender} = render(
|
|
65
73
|
<ProgressBar value={150} max={100} label="Over" />,
|
|
66
74
|
);
|
|
67
|
-
let
|
|
68
|
-
expect(
|
|
75
|
+
let progressbar = screen.getByRole('progressbar');
|
|
76
|
+
expect(progressbar).toHaveAttribute('aria-valuenow', '100');
|
|
69
77
|
|
|
70
78
|
rerender(<ProgressBar value={-10} max={100} label="Under" />);
|
|
71
|
-
|
|
72
|
-
expect(
|
|
79
|
+
progressbar = screen.getByRole('progressbar');
|
|
80
|
+
expect(progressbar).toHaveAttribute('aria-valuenow', '0');
|
|
73
81
|
});
|
|
74
82
|
|
|
75
83
|
it('forwards ref to outer container', () => {
|
|
@@ -95,14 +103,14 @@ describe('ProgressBar', () => {
|
|
|
95
103
|
const {unmount} = render(
|
|
96
104
|
<ProgressBar value={50} label={variant} variant={variant} />,
|
|
97
105
|
);
|
|
98
|
-
expect(screen.getByRole('
|
|
106
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
|
99
107
|
unmount();
|
|
100
108
|
}
|
|
101
109
|
});
|
|
102
110
|
|
|
103
111
|
it('renders at fixed 8px track height', () => {
|
|
104
112
|
render(<ProgressBar value={50} label="Progress" />);
|
|
105
|
-
expect(screen.getByRole('
|
|
113
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
|
106
114
|
});
|
|
107
115
|
|
|
108
116
|
it('shows value label with hidden label', () => {
|
|
@@ -121,15 +129,15 @@ describe('ProgressBar', () => {
|
|
|
121
129
|
expect(screen.queryByText('42%')).not.toBeInTheDocument();
|
|
122
130
|
const label = screen.getByText('Context usage');
|
|
123
131
|
expect(label).toBeInTheDocument();
|
|
124
|
-
const
|
|
125
|
-
expect(
|
|
132
|
+
const progressbar = screen.getByRole('progressbar');
|
|
133
|
+
expect(progressbar).toHaveAttribute('aria-labelledby', label.id);
|
|
126
134
|
});
|
|
127
135
|
|
|
128
136
|
it('handles zero max gracefully', () => {
|
|
129
137
|
render(<ProgressBar value={0} max={0} label="Empty" />);
|
|
130
|
-
const
|
|
131
|
-
expect(
|
|
132
|
-
expect(
|
|
138
|
+
const progressbar = screen.getByRole('progressbar');
|
|
139
|
+
expect(progressbar).toHaveAttribute('aria-valuenow', '0');
|
|
140
|
+
expect(progressbar).toHaveAttribute('aria-valuemax', '0');
|
|
133
141
|
});
|
|
134
142
|
|
|
135
143
|
// Disabled state
|
|
@@ -138,7 +146,7 @@ describe('ProgressBar', () => {
|
|
|
138
146
|
render(
|
|
139
147
|
<ProgressBar value={50} label="Canceled" isDisabled hasValueLabel />,
|
|
140
148
|
);
|
|
141
|
-
expect(screen.getByRole('
|
|
149
|
+
expect(screen.getByRole('progressbar')).toBeInTheDocument();
|
|
142
150
|
expect(screen.getByText('50%')).toBeInTheDocument();
|
|
143
151
|
});
|
|
144
152
|
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
import {mergeProps} from '../utils';
|
|
32
32
|
import type {BaseProps} from '../BaseProps';
|
|
33
33
|
import {themeProps} from '../utils/themeProps';
|
|
34
|
+
import {VisuallyHidden} from '../VisuallyHidden';
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
37
|
* Extensible variant map for ProgressBar.
|
|
@@ -313,14 +314,12 @@ export function ProgressBar({
|
|
|
313
314
|
)}
|
|
314
315
|
</div>
|
|
315
316
|
) : (
|
|
316
|
-
<
|
|
317
|
-
{label}
|
|
318
|
-
</span>
|
|
317
|
+
<VisuallyHidden id={labelId}>{label}</VisuallyHidden>
|
|
319
318
|
)}
|
|
320
319
|
|
|
321
320
|
{/* Progress track */}
|
|
322
321
|
<div
|
|
323
|
-
role=
|
|
322
|
+
role="progressbar"
|
|
324
323
|
aria-valuenow={isIndeterminate ? undefined : clampedValue}
|
|
325
324
|
aria-valuemin={isIndeterminate ? undefined : 0}
|
|
326
325
|
aria-valuemax={isIndeterminate ? undefined : max}
|
|
@@ -74,6 +74,12 @@ export const docs = {
|
|
|
74
74
|
description: 'Whether all radio items are disabled.',
|
|
75
75
|
default: 'false',
|
|
76
76
|
},
|
|
77
|
+
{
|
|
78
|
+
name: 'disabledMessage',
|
|
79
|
+
type: 'string',
|
|
80
|
+
description:
|
|
81
|
+
'Explains why the group is disabled. Applies to the whole-group disabled state (isDisabled), not per item. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the radios focusable via aria-disabled (selection stays blocked). Use this instead of wrapping a disabled RadioList in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
|
|
82
|
+
},
|
|
77
83
|
{
|
|
78
84
|
name: 'isRequired',
|
|
79
85
|
type: 'boolean',
|
|
@@ -121,6 +127,7 @@ export const docs = {
|
|
|
121
127
|
{ guidance: false, description: 'Use when multiple selections are needed; use CheckboxList instead.' },
|
|
122
128
|
{ guidance: false, description: 'Use for long lists; use Selector for better discoverability.' },
|
|
123
129
|
{ guidance: false, description: 'Use horizontal layout with more than 4 options; it wraps awkwardly.' },
|
|
130
|
+
{ guidance: false, description: 'Wrap a disabled RadioList in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
124
131
|
],
|
|
125
132
|
anatomy: [
|
|
126
133
|
{name: 'Header', required: false, description: 'Optional heading above the radio list.'},
|
|
@@ -142,6 +149,7 @@ export const docsZh = {
|
|
|
142
149
|
{ guidance: false, description: 'Use when multiple selections are needed; use CheckboxList instead.' },
|
|
143
150
|
{ guidance: false, description: 'Use for long lists; use Selector for better discoverability.' },
|
|
144
151
|
{ guidance: false, description: 'Use horizontal layout with more than 4 options; it wraps awkwardly.' },
|
|
152
|
+
{ guidance: false, description: 'Wrap a disabled RadioList in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
145
153
|
],
|
|
146
154
|
anatomy: [
|
|
147
155
|
{name: 'Header', required: false, description: 'Optional heading above the radio list.'},
|
|
@@ -165,6 +173,7 @@ export const docsDense = {
|
|
|
165
173
|
{ guidance: false, description: 'Use when multiple selections are needed; use CheckboxList instead.' },
|
|
166
174
|
{ guidance: false, description: 'Use for long lists; use Selector for better discoverability.' },
|
|
167
175
|
{ guidance: false, description: 'Use horizontal layout with more than 4 options; it wraps awkwardly.' },
|
|
176
|
+
{ guidance: false, description: 'Wrap a disabled RadioList in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
168
177
|
],
|
|
169
178
|
anatomy: [
|
|
170
179
|
{name: 'Header', required: false, description: 'Optional heading above the radio list.'},
|