@astryxdesign/core 0.1.2 → 0.1.3-canary.6d57c8d
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
package/src/Stack/Stack.tsx
CHANGED
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
import {createElement, type ElementType, type ReactNode, type Ref} from 'react';
|
|
16
16
|
import type {BaseProps} from '../BaseProps';
|
|
17
17
|
import * as stylex from '@stylexjs/stylex';
|
|
18
|
-
import type {StyleXStyles} from '@stylexjs/stylex';
|
|
19
18
|
import {
|
|
20
19
|
stack,
|
|
21
20
|
type StackCrossAlignment,
|
|
@@ -25,9 +24,19 @@ import {
|
|
|
25
24
|
type SpacingStep,
|
|
26
25
|
} from './stack.stylex';
|
|
27
26
|
import type {SizeValue} from '../utils/types';
|
|
27
|
+
import {
|
|
28
|
+
paddingInlineStyles,
|
|
29
|
+
paddingBlockStyles,
|
|
30
|
+
} from '../Layout/padding.stylex';
|
|
28
31
|
import {mergeProps} from '../utils';
|
|
29
32
|
import {themeProps} from '../utils/themeProps';
|
|
30
33
|
|
|
34
|
+
const overflowStyles = stylex.create({
|
|
35
|
+
scrollable: {
|
|
36
|
+
overflow: 'auto',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
31
40
|
/**
|
|
32
41
|
* Alignment values accepted by Stack.
|
|
33
42
|
*
|
|
@@ -40,7 +49,6 @@ import {themeProps} from '../utils/themeProps';
|
|
|
40
49
|
*/
|
|
41
50
|
export type StackAlignment = StackMainAlignment | StackCrossAlignment;
|
|
42
51
|
|
|
43
|
-
|
|
44
52
|
export interface StackProps extends BaseProps<HTMLElement> {
|
|
45
53
|
/** Ref forwarded to the root element */
|
|
46
54
|
ref?: React.Ref<HTMLElement>;
|
|
@@ -100,12 +108,55 @@ export interface StackProps extends BaseProps<HTMLElement> {
|
|
|
100
108
|
*/
|
|
101
109
|
height?: SizeValue;
|
|
102
110
|
|
|
111
|
+
/**
|
|
112
|
+
* Maximum width of the stack container.
|
|
113
|
+
* Numbers are treated as pixels, strings are used as-is (e.g., '100%').
|
|
114
|
+
*/
|
|
115
|
+
maxWidth?: SizeValue;
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Minimum height of the stack container.
|
|
119
|
+
* Numbers are treated as pixels, strings are used as-is (e.g., '100%').
|
|
120
|
+
*/
|
|
121
|
+
minHeight?: SizeValue;
|
|
122
|
+
|
|
103
123
|
/**
|
|
104
124
|
* Spacing between items.
|
|
105
125
|
* Accepts numeric spacing steps: 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10.
|
|
106
126
|
*/
|
|
107
127
|
gap?: SpacingStep;
|
|
108
128
|
|
|
129
|
+
/**
|
|
130
|
+
* Inner padding on all sides, using the spacing scale.
|
|
131
|
+
* Accepts numeric spacing steps: 0, 0.5, 1, 1.5, 2, 3, 4, 5, 6, 8, 10.
|
|
132
|
+
*
|
|
133
|
+
* Matches the `padding` prop on `Card`, `LayoutContent`, and `LayoutPanel`.
|
|
134
|
+
*/
|
|
135
|
+
padding?: SpacingStep;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Inline (horizontal) padding, using the spacing scale.
|
|
139
|
+
* Overrides `padding` on the inline axis when both are set.
|
|
140
|
+
*/
|
|
141
|
+
paddingInline?: SpacingStep;
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Block (vertical) padding, using the spacing scale.
|
|
145
|
+
* Overrides `padding` on the block axis when both are set.
|
|
146
|
+
*/
|
|
147
|
+
paddingBlock?: SpacingStep;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Enables scrollable overflow (`overflow: auto`) for the stack.
|
|
151
|
+
*
|
|
152
|
+
* Matches the `isScrollable` prop on `LayoutContent` and `LayoutPanel`.
|
|
153
|
+
* When the stack is itself a flex child that should scroll, pair it with
|
|
154
|
+
* a parent `StackItem size="fill" isScrollable` (StackItem applies the
|
|
155
|
+
* `min-height: 0` reset that flex scroll regions require).
|
|
156
|
+
* @default false
|
|
157
|
+
*/
|
|
158
|
+
isScrollable?: boolean;
|
|
159
|
+
|
|
109
160
|
/**
|
|
110
161
|
* Whether items should wrap.
|
|
111
162
|
* - `nowrap`: Items stay on one line (default)
|
|
@@ -121,28 +172,6 @@ export interface StackProps extends BaseProps<HTMLElement> {
|
|
|
121
172
|
*/
|
|
122
173
|
as?: ElementType;
|
|
123
174
|
|
|
124
|
-
/**
|
|
125
|
-
* StyleX styles created via `stylex.create()`. Merged with the component's
|
|
126
|
-
* base styles inside a single `stylex.props()` call for optimal deduplication.
|
|
127
|
-
*
|
|
128
|
-
* @example
|
|
129
|
-
* ```
|
|
130
|
-
* const overrides = stylex.create({ root: { marginBottom: 8 } });
|
|
131
|
-
* <Component xstyle={overrides.root} />
|
|
132
|
-
* ```
|
|
133
|
-
*/
|
|
134
|
-
xstyle?: StyleXStyles;
|
|
135
|
-
/**
|
|
136
|
-
* CSS class name(s) appended to the root element.
|
|
137
|
-
* If you're using StyleX, prefer `xstyle` for optimal style deduplication.
|
|
138
|
-
*/
|
|
139
|
-
className?: string;
|
|
140
|
-
/**
|
|
141
|
-
* Inline styles to apply to the root element. Spread after StyleX
|
|
142
|
-
* inline styles, so these values take priority.
|
|
143
|
-
*/
|
|
144
|
-
style?: React.CSSProperties;
|
|
145
|
-
|
|
146
175
|
/**
|
|
147
176
|
* Content to render inside the stack.
|
|
148
177
|
*/
|
|
@@ -180,8 +209,14 @@ export function Stack({
|
|
|
180
209
|
justify,
|
|
181
210
|
align,
|
|
182
211
|
gap,
|
|
212
|
+
padding,
|
|
213
|
+
paddingInline,
|
|
214
|
+
paddingBlock,
|
|
215
|
+
isScrollable,
|
|
183
216
|
width,
|
|
184
217
|
height,
|
|
218
|
+
maxWidth,
|
|
219
|
+
minHeight,
|
|
185
220
|
wrap,
|
|
186
221
|
as: element = 'div',
|
|
187
222
|
xstyle,
|
|
@@ -207,6 +242,11 @@ export function Stack({
|
|
|
207
242
|
? (resolvedVAlign as StackCrossAlignment | undefined)
|
|
208
243
|
: (resolvedHAlign as StackCrossAlignment | undefined);
|
|
209
244
|
|
|
245
|
+
// Resolve padding to per-axis values: `padding` sets both axes; `paddingInline`
|
|
246
|
+
// / `paddingBlock` take precedence on their own axis when provided.
|
|
247
|
+
const resolvedPaddingInline = paddingInline ?? padding;
|
|
248
|
+
const resolvedPaddingBlock = paddingBlock ?? padding;
|
|
249
|
+
|
|
210
250
|
const stylexProps = stylex.props(
|
|
211
251
|
...stack({
|
|
212
252
|
direction,
|
|
@@ -215,6 +255,9 @@ export function Stack({
|
|
|
215
255
|
gap,
|
|
216
256
|
wrap,
|
|
217
257
|
}),
|
|
258
|
+
resolvedPaddingInline != null && paddingInlineStyles[resolvedPaddingInline],
|
|
259
|
+
resolvedPaddingBlock != null && paddingBlockStyles[resolvedPaddingBlock],
|
|
260
|
+
isScrollable && overflowStyles.scrollable,
|
|
218
261
|
xstyle,
|
|
219
262
|
);
|
|
220
263
|
|
|
@@ -226,6 +269,12 @@ export function Stack({
|
|
|
226
269
|
...(height != null && {
|
|
227
270
|
height: typeof height === 'number' ? `${height}px` : height,
|
|
228
271
|
}),
|
|
272
|
+
...(maxWidth != null && {
|
|
273
|
+
maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth,
|
|
274
|
+
}),
|
|
275
|
+
...(minHeight != null && {
|
|
276
|
+
minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight,
|
|
277
|
+
}),
|
|
229
278
|
};
|
|
230
279
|
|
|
231
280
|
return createElement(
|
|
@@ -79,4 +79,27 @@ describe('StackItem', () => {
|
|
|
79
79
|
const element = screen.getByTestId('stack-item');
|
|
80
80
|
expect(element).toHaveAttribute('aria-label', 'Stack item');
|
|
81
81
|
});
|
|
82
|
+
|
|
83
|
+
it('applies an overflow class when isScrollable is set', () => {
|
|
84
|
+
const {rerender} = render(
|
|
85
|
+
<StackItem data-testid="stack-item">Content</StackItem>,
|
|
86
|
+
);
|
|
87
|
+
const withoutScroll = screen.getByTestId('stack-item').className;
|
|
88
|
+
rerender(
|
|
89
|
+
<StackItem isScrollable data-testid="stack-item">
|
|
90
|
+
Content
|
|
91
|
+
</StackItem>,
|
|
92
|
+
);
|
|
93
|
+
const withScroll = screen.getByTestId('stack-item').className;
|
|
94
|
+
expect(withScroll).not.toBe(withoutScroll);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('composes isScrollable with size="fill"', () => {
|
|
98
|
+
render(
|
|
99
|
+
<StackItem size="fill" isScrollable data-testid="stack-item">
|
|
100
|
+
Content
|
|
101
|
+
</StackItem>,
|
|
102
|
+
);
|
|
103
|
+
expect(screen.getByTestId('stack-item').className).not.toBe('');
|
|
104
|
+
});
|
|
82
105
|
});
|
package/src/Stack/StackItem.tsx
CHANGED
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
import {createElement, type ElementType, type ReactNode, type Ref} from 'react';
|
|
15
15
|
import type {BaseProps} from '../BaseProps';
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
|
-
import type {StyleXStyles} from '@stylexjs/stylex';
|
|
18
17
|
import {
|
|
19
18
|
stackItem,
|
|
20
19
|
type StackItemCrossAlignSelf,
|
|
@@ -23,6 +22,12 @@ import {
|
|
|
23
22
|
import {mergeProps} from '../utils';
|
|
24
23
|
import {themeProps} from '../utils/themeProps';
|
|
25
24
|
|
|
25
|
+
const overflowStyles = stylex.create({
|
|
26
|
+
scrollable: {
|
|
27
|
+
overflow: 'auto',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
26
31
|
export interface StackItemProps extends BaseProps<HTMLElement> {
|
|
27
32
|
/** Ref forwarded to the root element */
|
|
28
33
|
ref?: React.Ref<HTMLElement>;
|
|
@@ -42,32 +47,22 @@ export interface StackItemProps extends BaseProps<HTMLElement> {
|
|
|
42
47
|
size?: StackItemSize;
|
|
43
48
|
|
|
44
49
|
/**
|
|
45
|
-
*
|
|
46
|
-
* @default 'div'
|
|
47
|
-
*/
|
|
48
|
-
as?: ElementType;
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* StyleX styles created via `stylex.create()`. Merged with the component's
|
|
52
|
-
* base styles inside a single `stylex.props()` call for optimal deduplication.
|
|
50
|
+
* Enables scrollable overflow (`overflow: auto`) for the item.
|
|
53
51
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
52
|
+
* StackItem already applies the flex `min-height: 0` / `min-width: 0`
|
|
53
|
+
* reset, so `<StackItem size="fill" isScrollable>` is a complete scroll
|
|
54
|
+
* region — it grows to fill the stack and scrolls its own overflow with
|
|
55
|
+
* no extra style plumbing. Matches `isScrollable` on `LayoutContent`
|
|
56
|
+
* and `LayoutPanel`.
|
|
57
|
+
* @default false
|
|
59
58
|
*/
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* CSS class name(s) appended to the root element.
|
|
63
|
-
* If you're using StyleX, prefer `xstyle` for optimal style deduplication.
|
|
64
|
-
*/
|
|
65
|
-
className?: string;
|
|
59
|
+
isScrollable?: boolean;
|
|
60
|
+
|
|
66
61
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
62
|
+
* The element type to render.
|
|
63
|
+
* @default 'div'
|
|
69
64
|
*/
|
|
70
|
-
|
|
65
|
+
as?: ElementType;
|
|
71
66
|
|
|
72
67
|
/**
|
|
73
68
|
* Content to render inside the stack item.
|
|
@@ -92,6 +87,7 @@ export interface StackItemProps extends BaseProps<HTMLElement> {
|
|
|
92
87
|
export function StackItem({
|
|
93
88
|
crossAlignSelf,
|
|
94
89
|
size,
|
|
90
|
+
isScrollable,
|
|
95
91
|
as: element = 'div',
|
|
96
92
|
xstyle,
|
|
97
93
|
className,
|
|
@@ -102,6 +98,7 @@ export function StackItem({
|
|
|
102
98
|
}: StackItemProps) {
|
|
103
99
|
const stylexProps = stylex.props(
|
|
104
100
|
...stackItem({crossAlignSelf, size}),
|
|
101
|
+
isScrollable && overflowStyles.scrollable,
|
|
105
102
|
xstyle,
|
|
106
103
|
);
|
|
107
104
|
|
|
@@ -62,6 +62,12 @@ export const docs = {
|
|
|
62
62
|
description: 'Whether the switch is disabled.',
|
|
63
63
|
default: 'false',
|
|
64
64
|
},
|
|
65
|
+
{
|
|
66
|
+
name: 'disabledMessage',
|
|
67
|
+
type: 'string',
|
|
68
|
+
description:
|
|
69
|
+
'Explains why the switch is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the switch focusable via aria-disabled (toggling stays blocked). Use this instead of wrapping a disabled Switch in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
|
|
70
|
+
},
|
|
65
71
|
{
|
|
66
72
|
name: 'isOptional',
|
|
67
73
|
type: 'boolean',
|
|
@@ -133,6 +139,7 @@ export const docs = {
|
|
|
133
139
|
{ guidance: true, description: 'Pair with a clear, concise label that describes the setting being controlled.' },
|
|
134
140
|
{ guidance: false, description: 'Use for options that require a form submission to take effect; use a checkbox instead.' },
|
|
135
141
|
{ guidance: false, description: 'Use a switch for multi-state values; it\'s strictly on/off.' },
|
|
142
|
+
{ guidance: false, description: 'Wrap a disabled switch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
136
143
|
],
|
|
137
144
|
},
|
|
138
145
|
};
|
|
@@ -196,6 +203,12 @@ export const docsZh = {
|
|
|
196
203
|
description: '开关是否被禁用。',
|
|
197
204
|
default: 'false',
|
|
198
205
|
},
|
|
206
|
+
{
|
|
207
|
+
name: 'disabledMessage',
|
|
208
|
+
type: 'string',
|
|
209
|
+
description:
|
|
210
|
+
'Explains why the switch is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the switch focusable via aria-disabled (toggling stays blocked). Use this instead of wrapping a disabled Switch in Tooltip — disabled controls swallow the hover events an external Tooltip needs.',
|
|
211
|
+
},
|
|
199
212
|
{
|
|
200
213
|
name: 'isOptional',
|
|
201
214
|
type: 'boolean',
|
|
@@ -267,6 +280,7 @@ export const docsZh = {
|
|
|
267
280
|
{ guidance: true, description: 'Pair with a clear, concise label that describes the setting being controlled.' },
|
|
268
281
|
{ guidance: false, description: 'Use for options that require a form submission to take effect; use a checkbox instead.' },
|
|
269
282
|
{ guidance: false, description: 'Use a switch for multi-state values; it\'s strictly on/off.' },
|
|
283
|
+
{ guidance: false, description: 'Wrap a disabled switch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
270
284
|
],
|
|
271
285
|
},
|
|
272
286
|
};
|
|
@@ -282,6 +296,7 @@ export const docsDense = {
|
|
|
282
296
|
{ guidance: true, description: 'Pair with a clear, concise label that describes the setting being controlled.' },
|
|
283
297
|
{ guidance: false, description: 'Use for options that require a form submission to take effect; use a checkbox instead.' },
|
|
284
298
|
{ guidance: false, description: 'Use a switch for multi-state values; it\'s strictly on/off.' },
|
|
299
|
+
{ guidance: false, description: 'Wrap a disabled switch in Tooltip to explain why it is disabled; disabled controls swallow the hover events the wrapper needs. Use the disabledMessage prop instead.' },
|
|
285
300
|
],
|
|
286
301
|
},
|
|
287
302
|
propDescriptions: {
|
|
@@ -9,41 +9,56 @@
|
|
|
9
9
|
* SYNC: When Switch.tsx changes, update tests to match new behavior
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {describe, it, expect, vi} from 'vitest';
|
|
13
|
-
import {render, screen} from '@testing-library/react';
|
|
12
|
+
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
13
|
+
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {Switch} from './Switch';
|
|
16
16
|
|
|
17
|
+
// Mock showPopover/hidePopover (not implemented in jsdom) so the tooltip layer
|
|
18
|
+
// reflects its open state via a `popover-open` attribute the tests can assert.
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
HTMLElement.prototype.showPopover = vi.fn(function (this: HTMLElement) {
|
|
21
|
+
this.setAttribute('popover-open', '');
|
|
22
|
+
const event = new Event('toggle', {bubbles: false});
|
|
23
|
+
Object.defineProperty(event, 'newState', {value: 'open'});
|
|
24
|
+
this.dispatchEvent(event);
|
|
25
|
+
});
|
|
26
|
+
HTMLElement.prototype.hidePopover = vi.fn(function (this: HTMLElement) {
|
|
27
|
+
this.removeAttribute('popover-open');
|
|
28
|
+
const event = new Event('toggle', {bubbles: false});
|
|
29
|
+
Object.defineProperty(event, 'newState', {value: 'closed'});
|
|
30
|
+
this.dispatchEvent(event);
|
|
31
|
+
});
|
|
32
|
+
const originalMatches = HTMLElement.prototype.matches;
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
(HTMLElement.prototype as any).matches = function (
|
|
35
|
+
selector: string,
|
|
36
|
+
): boolean {
|
|
37
|
+
if (selector === ':popover-open') {
|
|
38
|
+
return this.hasAttribute('popover-open');
|
|
39
|
+
}
|
|
40
|
+
return originalMatches.call(this, selector);
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
|
|
17
44
|
describe('Switch', () => {
|
|
18
45
|
it('renders with label', () => {
|
|
19
46
|
render(
|
|
20
|
-
<Switch
|
|
21
|
-
label="Enable notifications"
|
|
22
|
-
value={false}
|
|
23
|
-
onChange={() => {}}
|
|
24
|
-
/>,
|
|
47
|
+
<Switch label="Enable notifications" value={false} onChange={() => {}} />,
|
|
25
48
|
);
|
|
26
49
|
expect(screen.getByLabelText('Enable notifications')).toBeInTheDocument();
|
|
27
50
|
});
|
|
28
51
|
|
|
29
52
|
it('renders as off by default', () => {
|
|
30
53
|
render(
|
|
31
|
-
<Switch
|
|
32
|
-
label="Enable notifications"
|
|
33
|
-
value={false}
|
|
34
|
-
onChange={() => {}}
|
|
35
|
-
/>,
|
|
54
|
+
<Switch label="Enable notifications" value={false} onChange={() => {}} />,
|
|
36
55
|
);
|
|
37
56
|
expect(screen.getByRole('switch')).not.toBeChecked();
|
|
38
57
|
});
|
|
39
58
|
|
|
40
59
|
it('renders as on when value prop is true', () => {
|
|
41
60
|
render(
|
|
42
|
-
<Switch
|
|
43
|
-
label="Enable notifications"
|
|
44
|
-
value={true}
|
|
45
|
-
onChange={() => {}}
|
|
46
|
-
/>,
|
|
61
|
+
<Switch label="Enable notifications" value={true} onChange={() => {}} />,
|
|
47
62
|
);
|
|
48
63
|
expect(screen.getByRole('switch')).toBeChecked();
|
|
49
64
|
});
|
|
@@ -184,11 +199,7 @@ describe('Switch', () => {
|
|
|
184
199
|
|
|
185
200
|
it('shows label visually by default', () => {
|
|
186
201
|
render(
|
|
187
|
-
<Switch
|
|
188
|
-
label="Enable notifications"
|
|
189
|
-
value={false}
|
|
190
|
-
onChange={() => {}}
|
|
191
|
-
/>,
|
|
202
|
+
<Switch label="Enable notifications" value={false} onChange={() => {}} />,
|
|
192
203
|
);
|
|
193
204
|
const label = screen.getByText('Enable notifications');
|
|
194
205
|
expect(label).toBeVisible();
|
|
@@ -230,11 +241,7 @@ describe('Switch', () => {
|
|
|
230
241
|
|
|
231
242
|
it('has role="switch" for accessibility', () => {
|
|
232
243
|
render(
|
|
233
|
-
<Switch
|
|
234
|
-
label="Enable notifications"
|
|
235
|
-
value={false}
|
|
236
|
-
onChange={() => {}}
|
|
237
|
-
/>,
|
|
244
|
+
<Switch label="Enable notifications" value={false} onChange={() => {}} />,
|
|
238
245
|
);
|
|
239
246
|
expect(screen.getByRole('switch')).toBeInTheDocument();
|
|
240
247
|
});
|
|
@@ -335,4 +342,132 @@ describe('Switch', () => {
|
|
|
335
342
|
expect(screen.getByRole('switch')).toBeRequired();
|
|
336
343
|
});
|
|
337
344
|
|
|
345
|
+
describe('disabledMessage', () => {
|
|
346
|
+
const h = {hidden: true} as const;
|
|
347
|
+
|
|
348
|
+
function getRow(): HTMLElement {
|
|
349
|
+
return screen.getByRole('switch', h).closest('div')!.parentElement!;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
it('shows the reason tooltip on hover when disabled with a reason', async () => {
|
|
353
|
+
render(
|
|
354
|
+
<Switch
|
|
355
|
+
label="Enable notifications"
|
|
356
|
+
value={false}
|
|
357
|
+
onChange={() => {}}
|
|
358
|
+
isDisabled
|
|
359
|
+
disabledMessage="Notifications are turned off org-wide"
|
|
360
|
+
/>,
|
|
361
|
+
);
|
|
362
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
363
|
+
expect(tooltip).toHaveTextContent(
|
|
364
|
+
'Notifications are turned off org-wide',
|
|
365
|
+
);
|
|
366
|
+
fireEvent.mouseEnter(getRow());
|
|
367
|
+
await waitFor(() => expect(tooltip).toHaveAttribute('popover-open'));
|
|
368
|
+
fireEvent.mouseLeave(getRow());
|
|
369
|
+
await waitFor(() => expect(tooltip).not.toHaveAttribute('popover-open'));
|
|
370
|
+
});
|
|
371
|
+
|
|
372
|
+
it('shows the reason tooltip on keyboard focus', async () => {
|
|
373
|
+
const user = userEvent.setup();
|
|
374
|
+
render(
|
|
375
|
+
<Switch
|
|
376
|
+
label="Enable notifications"
|
|
377
|
+
value={false}
|
|
378
|
+
onChange={() => {}}
|
|
379
|
+
isDisabled
|
|
380
|
+
disabledMessage="Notifications are turned off org-wide"
|
|
381
|
+
/>,
|
|
382
|
+
);
|
|
383
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
384
|
+
await user.tab();
|
|
385
|
+
expect(screen.getByRole('switch', h)).toHaveFocus();
|
|
386
|
+
await waitFor(() => expect(tooltip).toHaveAttribute('popover-open'));
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('does not render a tooltip when not disabled', () => {
|
|
390
|
+
render(
|
|
391
|
+
<Switch
|
|
392
|
+
label="Enable notifications"
|
|
393
|
+
value={false}
|
|
394
|
+
onChange={() => {}}
|
|
395
|
+
disabledMessage="Notifications are turned off org-wide"
|
|
396
|
+
/>,
|
|
397
|
+
);
|
|
398
|
+
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
it('does not render a tooltip when disabled without a reason', () => {
|
|
402
|
+
render(
|
|
403
|
+
<Switch
|
|
404
|
+
label="Enable notifications"
|
|
405
|
+
value={false}
|
|
406
|
+
onChange={() => {}}
|
|
407
|
+
isDisabled
|
|
408
|
+
/>,
|
|
409
|
+
);
|
|
410
|
+
expect(screen.queryByRole('tooltip', h)).not.toBeInTheDocument();
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it('keeps the switch focusable via aria-disabled when a reason is provided', () => {
|
|
414
|
+
render(
|
|
415
|
+
<Switch
|
|
416
|
+
label="Enable notifications"
|
|
417
|
+
value={false}
|
|
418
|
+
onChange={() => {}}
|
|
419
|
+
isDisabled
|
|
420
|
+
disabledMessage="Notifications are turned off org-wide"
|
|
421
|
+
/>,
|
|
422
|
+
);
|
|
423
|
+
const control = screen.getByRole('switch', h);
|
|
424
|
+
expect(control).not.toBeDisabled();
|
|
425
|
+
expect(control).toHaveAttribute('aria-disabled', 'true');
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
it('links the reason tooltip via aria-describedby', () => {
|
|
429
|
+
render(
|
|
430
|
+
<Switch
|
|
431
|
+
label="Enable notifications"
|
|
432
|
+
value={false}
|
|
433
|
+
onChange={() => {}}
|
|
434
|
+
isDisabled
|
|
435
|
+
disabledMessage="Notifications are turned off org-wide"
|
|
436
|
+
/>,
|
|
437
|
+
);
|
|
438
|
+
const control = screen.getByRole('switch', h);
|
|
439
|
+
const tooltip = screen.getByRole('tooltip', h);
|
|
440
|
+
expect(control.getAttribute('aria-describedby')).toContain(tooltip.id);
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it('blocks toggling while focusable-disabled', async () => {
|
|
444
|
+
const user = userEvent.setup();
|
|
445
|
+
const onChange = vi.fn();
|
|
446
|
+
render(
|
|
447
|
+
<Switch
|
|
448
|
+
label="Enable notifications"
|
|
449
|
+
value={false}
|
|
450
|
+
onChange={onChange}
|
|
451
|
+
isDisabled
|
|
452
|
+
disabledMessage="Notifications are turned off org-wide"
|
|
453
|
+
/>,
|
|
454
|
+
);
|
|
455
|
+
const control = screen.getByRole('switch', h);
|
|
456
|
+
await user.click(control);
|
|
457
|
+
expect(onChange).not.toHaveBeenCalled();
|
|
458
|
+
expect(control).not.toBeChecked();
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
it('remains natively disabled when disabled without a reason', () => {
|
|
462
|
+
render(
|
|
463
|
+
<Switch
|
|
464
|
+
label="Enable notifications"
|
|
465
|
+
value={false}
|
|
466
|
+
onChange={() => {}}
|
|
467
|
+
isDisabled
|
|
468
|
+
/>,
|
|
469
|
+
);
|
|
470
|
+
expect(screen.getByRole('switch')).toBeDisabled();
|
|
471
|
+
});
|
|
472
|
+
});
|
|
338
473
|
});
|