@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
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 +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
inputStatusBorderStyles,
|
|
38
38
|
inputStatusHoverShadowStyles,
|
|
39
39
|
inputWrapperStyles,
|
|
40
|
+
type FieldStatusVariant,
|
|
40
41
|
} from '../Field';
|
|
41
42
|
import {Divider} from '../Divider';
|
|
42
43
|
import {Spinner} from '../Spinner';
|
|
@@ -479,6 +480,13 @@ export interface MultiSelectorProps<
|
|
|
479
480
|
* Status indicator for the selector.
|
|
480
481
|
*/
|
|
481
482
|
status?: MultiSelectorStatus;
|
|
483
|
+
/**
|
|
484
|
+
* How the status message is placed relative to the input.
|
|
485
|
+
* - 'attached': message overlaps directly below the input (bordered treatment)
|
|
486
|
+
* - 'detached': message floats below as a separate element with spacing
|
|
487
|
+
* @default 'attached'
|
|
488
|
+
*/
|
|
489
|
+
statusVariant?: FieldStatusVariant;
|
|
482
490
|
|
|
483
491
|
/**
|
|
484
492
|
* Width of the field. Numbers are treated as pixels, strings are used as-is
|
|
@@ -562,6 +570,35 @@ export interface MultiSelectorProps<
|
|
|
562
570
|
'data-testid'?: string;
|
|
563
571
|
}
|
|
564
572
|
|
|
573
|
+
// Case-insensitive substring match for a single option. The one predicate used
|
|
574
|
+
// by both the flat filter (count + keyboard nav) and the grouped renderer, so
|
|
575
|
+
// what is shown while searching stays in lockstep with the announced count.
|
|
576
|
+
function optionMatchesQuery(
|
|
577
|
+
option: MultiSelectorOptionData,
|
|
578
|
+
query: string,
|
|
579
|
+
): boolean {
|
|
580
|
+
if (!query) {
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
return (option.label ?? option.value)
|
|
584
|
+
.toLowerCase()
|
|
585
|
+
.includes(query.toLowerCase());
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
// Case-insensitive substring filter over the selectable options. Shared by the
|
|
589
|
+
// `filteredItems` memo (rendering) and the search-change handler, which needs
|
|
590
|
+
// the count for the *next* query synchronously to announce it exactly once per
|
|
591
|
+
// keystroke rather than reacting to state in an effect.
|
|
592
|
+
function filterOptionsByQuery(
|
|
593
|
+
items: MultiSelectorOptionData[],
|
|
594
|
+
query: string,
|
|
595
|
+
): MultiSelectorOptionData[] {
|
|
596
|
+
if (!query) {
|
|
597
|
+
return items;
|
|
598
|
+
}
|
|
599
|
+
return items.filter(item => optionMatchesQuery(item, query));
|
|
600
|
+
}
|
|
601
|
+
|
|
565
602
|
/**
|
|
566
603
|
* A multi-select dropdown component with checkboxes for choosing
|
|
567
604
|
* multiple items from a list of options.
|
|
@@ -593,6 +630,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
593
630
|
placeholder: placeholderFromProps,
|
|
594
631
|
size: sizeProp,
|
|
595
632
|
status,
|
|
633
|
+
statusVariant = 'attached',
|
|
596
634
|
labelTooltip,
|
|
597
635
|
startIcon,
|
|
598
636
|
hasClear = false,
|
|
@@ -692,47 +730,32 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
692
730
|
);
|
|
693
731
|
|
|
694
732
|
// Filter items by search query
|
|
695
|
-
const filteredItems = useMemo(
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
const query = searchQuery.toLowerCase();
|
|
700
|
-
return selectableItems.filter(item =>
|
|
701
|
-
(item.label ?? item.value).toLowerCase().includes(query),
|
|
702
|
-
);
|
|
703
|
-
}, [selectableItems, searchQuery]);
|
|
733
|
+
const filteredItems = useMemo(
|
|
734
|
+
() => filterOptionsByQuery(selectableItems, searchQuery),
|
|
735
|
+
[selectableItems, searchQuery],
|
|
736
|
+
);
|
|
704
737
|
|
|
705
738
|
// Single source of truth for item order. Both the hook (keyboard navigation)
|
|
706
739
|
// and renderOptions (DOM rendering) consume this list — no independent sorting.
|
|
707
|
-
// Selected-at-open items are placed first within each group/section
|
|
740
|
+
// Selected-at-open items are placed first within each group/section, and the
|
|
741
|
+
// same walk applies while searching so group structure survives filtering
|
|
742
|
+
// (only matching items are kept; the query is empty in non-search mode).
|
|
708
743
|
const sortedItems = useMemo(() => {
|
|
709
744
|
const selectedSet = selectedAtOpen ?? new Set<string>();
|
|
710
|
-
if (searchQuery) {
|
|
711
|
-
const selected = filteredItems.filter(item =>
|
|
712
|
-
selectedSet.has(item.value),
|
|
713
|
-
);
|
|
714
|
-
const unselected = filteredItems.filter(
|
|
715
|
-
item => !selectedSet.has(item.value),
|
|
716
|
-
);
|
|
717
|
-
const items = [...selected, ...unselected];
|
|
718
|
-
if (hasSelectAll) {
|
|
719
|
-
return [{value: SELECT_ALL_VALUE, label: selectAllLabel}, ...items];
|
|
720
|
-
}
|
|
721
|
-
return items;
|
|
722
|
-
}
|
|
723
|
-
// For non-search mode, flatten options in the same order as renderOptions
|
|
724
745
|
const result: MultiSelectorOptionData[] = [];
|
|
725
746
|
let pendingFlat: MultiSelectorOptionData[] = [];
|
|
726
747
|
|
|
748
|
+
const orderSelectedFirst = (items: MultiSelectorOptionData[]) => {
|
|
749
|
+
const selected = items.filter(item => selectedSet.has(item.value));
|
|
750
|
+
const unselected = items.filter(item => !selectedSet.has(item.value));
|
|
751
|
+
return [...selected, ...unselected];
|
|
752
|
+
};
|
|
753
|
+
|
|
727
754
|
const flushFlat = () => {
|
|
728
755
|
if (pendingFlat.length === 0) {
|
|
729
756
|
return;
|
|
730
757
|
}
|
|
731
|
-
|
|
732
|
-
const unselected = pendingFlat.filter(
|
|
733
|
-
item => !selectedSet.has(item.value),
|
|
734
|
-
);
|
|
735
|
-
result.push(...selected, ...unselected);
|
|
758
|
+
result.push(...orderSelectedFirst(pendingFlat));
|
|
736
759
|
pendingFlat = [];
|
|
737
760
|
};
|
|
738
761
|
|
|
@@ -741,16 +764,15 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
741
764
|
flushFlat();
|
|
742
765
|
} else if (isSection(option)) {
|
|
743
766
|
flushFlat();
|
|
744
|
-
const sectionOptions = option.options
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
);
|
|
748
|
-
const unselected = sectionOptions.filter(
|
|
749
|
-
item => !selectedSet.has(item.value),
|
|
750
|
-
);
|
|
751
|
-
result.push(...selected, ...unselected);
|
|
767
|
+
const sectionOptions = option.options
|
|
768
|
+
.map(opt => normalizeOption(opt))
|
|
769
|
+
.filter(opt => optionMatchesQuery(opt, searchQuery));
|
|
770
|
+
result.push(...orderSelectedFirst(sectionOptions));
|
|
752
771
|
} else if (isOptionData(option)) {
|
|
753
|
-
|
|
772
|
+
const normalized = normalizeOption(option);
|
|
773
|
+
if (optionMatchesQuery(normalized, searchQuery)) {
|
|
774
|
+
pendingFlat.push(normalized);
|
|
775
|
+
}
|
|
754
776
|
}
|
|
755
777
|
}
|
|
756
778
|
flushFlat();
|
|
@@ -759,21 +781,17 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
759
781
|
return [{value: SELECT_ALL_VALUE, label: selectAllLabel}, ...result];
|
|
760
782
|
}
|
|
761
783
|
return result;
|
|
762
|
-
}, [
|
|
763
|
-
filteredItems,
|
|
764
|
-
searchQuery,
|
|
765
|
-
options,
|
|
766
|
-
selectedAtOpen,
|
|
767
|
-
hasSelectAll,
|
|
768
|
-
selectAllLabel,
|
|
769
|
-
]);
|
|
784
|
+
}, [searchQuery, options, selectedAtOpen, hasSelectAll, selectAllLabel]);
|
|
770
785
|
|
|
771
786
|
// Layer for dropdown positioning
|
|
772
787
|
const handleLayerHide = useCallback(() => {
|
|
773
788
|
setSearchQuery('');
|
|
774
789
|
setSelectedAtOpen(null);
|
|
790
|
+
// Clear any lingering result count when the popover closes so stale status
|
|
791
|
+
// text does not linger in the a11y tree.
|
|
792
|
+
announce('');
|
|
775
793
|
triggerRef.current?.focus();
|
|
776
|
-
}, []);
|
|
794
|
+
}, [announce]);
|
|
777
795
|
|
|
778
796
|
const popover = usePopover({
|
|
779
797
|
hasLightDismiss: true,
|
|
@@ -793,6 +811,30 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
793
811
|
// eslint-disable-next-line @eslint-react/exhaustive-deps -- mount-only: isDefaultOpen is not reactive
|
|
794
812
|
}, []);
|
|
795
813
|
|
|
814
|
+
// Announce the filtered result count from the query-change handler (matching
|
|
815
|
+
// BaseTypeahead) rather than a reactive effect: computing the count for the
|
|
816
|
+
// next query here fires the announcement exactly once per keystroke and does
|
|
817
|
+
// not re-speak on unrelated re-renders. Reuses the announce instance shared
|
|
818
|
+
// with the selection-count announcements above.
|
|
819
|
+
const handleSearchChange = useCallback(
|
|
820
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
821
|
+
const nextQuery = event.target.value;
|
|
822
|
+
setSearchQuery(nextQuery);
|
|
823
|
+
if (nextQuery.length === 0) {
|
|
824
|
+
// Emptying the query clears the region rather than announcing a count.
|
|
825
|
+
announce('');
|
|
826
|
+
return;
|
|
827
|
+
}
|
|
828
|
+
const count = filterOptionsByQuery(selectableItems, nextQuery).length;
|
|
829
|
+
announce(
|
|
830
|
+
count === 0
|
|
831
|
+
? 'No results found'
|
|
832
|
+
: `${count} result${count === 1 ? '' : 's'}`,
|
|
833
|
+
);
|
|
834
|
+
},
|
|
835
|
+
[announce, selectableItems],
|
|
836
|
+
);
|
|
837
|
+
|
|
796
838
|
// Handle toggle
|
|
797
839
|
// Clear all selected values. Shared by the clear button and the keyboard
|
|
798
840
|
// Delete/Backspace path so clearing is reachable without a mouse.
|
|
@@ -1041,14 +1083,17 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1041
1083
|
aria-label={t('@astryx.multiSelector.searchOptions')}
|
|
1042
1084
|
type="text"
|
|
1043
1085
|
value={searchQuery}
|
|
1044
|
-
onChange={
|
|
1086
|
+
onChange={handleSearchChange}
|
|
1045
1087
|
onKeyDown={e => {
|
|
1046
1088
|
// Arrow keys navigate options; Enter toggles; Escape/Tab close.
|
|
1047
1089
|
// Space and Home/End are left to the input (type a space / move
|
|
1048
|
-
// the caret)
|
|
1090
|
+
// the caret) per the APG editable combobox; PageUp/PageDown are
|
|
1091
|
+
// the sanctioned substitute for jumping to the first/last option.
|
|
1049
1092
|
if (
|
|
1050
1093
|
e.key === 'ArrowDown' ||
|
|
1051
1094
|
e.key === 'ArrowUp' ||
|
|
1095
|
+
e.key === 'PageUp' ||
|
|
1096
|
+
e.key === 'PageDown' ||
|
|
1052
1097
|
e.key === 'Enter' ||
|
|
1053
1098
|
e.key === 'Escape' ||
|
|
1054
1099
|
e.key === 'Tab'
|
|
@@ -1067,6 +1112,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1067
1112
|
listboxId,
|
|
1068
1113
|
searchQuery,
|
|
1069
1114
|
searchPlaceholder,
|
|
1115
|
+
handleSearchChange,
|
|
1070
1116
|
onKeyDown,
|
|
1071
1117
|
popover.isOpen,
|
|
1072
1118
|
highlightedIndex,
|
|
@@ -1175,15 +1221,12 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1175
1221
|
return elements;
|
|
1176
1222
|
}
|
|
1177
1223
|
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
// Non-search: consume items from sortedItems in order, interleaving
|
|
1186
|
-
// structural elements (dividers, section headers) from the options prop.
|
|
1224
|
+
// Consume items from sortedItems in order, interleaving structural elements
|
|
1225
|
+
// (dividers, section headers) from the options prop. While searching, only
|
|
1226
|
+
// matching items are present in sortedItems, so a section consumes just its
|
|
1227
|
+
// matches and is skipped entirely when none match — no header left standing
|
|
1228
|
+
// over nothing, and the cursor stays aligned with the combobox indices.
|
|
1229
|
+
const isSearching = Boolean(searchQuery);
|
|
1187
1230
|
let pendingCount = 0;
|
|
1188
1231
|
|
|
1189
1232
|
const flushPending = () => {
|
|
@@ -1199,12 +1242,25 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1199
1242
|
|
|
1200
1243
|
if (isDivider(option)) {
|
|
1201
1244
|
flushPending();
|
|
1202
|
-
|
|
1245
|
+
// A standalone divider between groups would orphan itself once its
|
|
1246
|
+
// neighbors are filtered out, so skip it while searching.
|
|
1247
|
+
if (!isSearching) {
|
|
1248
|
+
elements.push(
|
|
1249
|
+
<Divider key={`divider-${i}`} xstyle={styles.divider} />,
|
|
1250
|
+
);
|
|
1251
|
+
}
|
|
1203
1252
|
} else if (isSection(option)) {
|
|
1204
1253
|
flushPending();
|
|
1205
|
-
const
|
|
1254
|
+
const matchCount = isSearching
|
|
1255
|
+
? option.options.filter(opt =>
|
|
1256
|
+
optionMatchesQuery(normalizeOption(opt), searchQuery),
|
|
1257
|
+
).length
|
|
1258
|
+
: option.options.length;
|
|
1259
|
+
if (matchCount === 0) {
|
|
1260
|
+
continue;
|
|
1261
|
+
}
|
|
1206
1262
|
const sectionItems: ReactNode[] = [];
|
|
1207
|
-
for (let j = 0; j <
|
|
1263
|
+
for (let j = 0; j < matchCount; j++) {
|
|
1208
1264
|
sectionItems.push(renderItem(sortedItems[cursor], cursor));
|
|
1209
1265
|
cursor++;
|
|
1210
1266
|
}
|
|
@@ -1223,7 +1279,12 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1223
1279
|
</div>,
|
|
1224
1280
|
);
|
|
1225
1281
|
} else if (isOptionData(option)) {
|
|
1226
|
-
|
|
1282
|
+
if (
|
|
1283
|
+
!isSearching ||
|
|
1284
|
+
optionMatchesQuery(normalizeOption(option), searchQuery)
|
|
1285
|
+
) {
|
|
1286
|
+
pendingCount++;
|
|
1287
|
+
}
|
|
1227
1288
|
}
|
|
1228
1289
|
}
|
|
1229
1290
|
flushPending();
|
|
@@ -1252,7 +1313,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1252
1313
|
isDisabled && inputWrapperStyles.disabled,
|
|
1253
1314
|
optimisticValue.length === 0 && styles.triggerPlaceholder,
|
|
1254
1315
|
status && inputStatusBorderStyles[status.type],
|
|
1255
|
-
status && inputStatusHoverShadowStyles[status.type],
|
|
1316
|
+
status && !isDisabled && inputStatusHoverShadowStyles[status.type],
|
|
1256
1317
|
inputGroup && groupStyles.inGroup,
|
|
1257
1318
|
xstyle,
|
|
1258
1319
|
),
|
|
@@ -1316,7 +1377,17 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1316
1377
|
onClick={handleClear}
|
|
1317
1378
|
aria-label={t('@astryx.multiSelector.clearAll', {label})}
|
|
1318
1379
|
{...stylex.props(styles.clearButton)}>
|
|
1319
|
-
<Icon
|
|
1380
|
+
<Icon
|
|
1381
|
+
icon="close"
|
|
1382
|
+
size="sm"
|
|
1383
|
+
color="secondary"
|
|
1384
|
+
// Stable theme target on the clear glyph itself, so a theme can
|
|
1385
|
+
// restyle just this icon (color, size, hover) via `defineTheme`.
|
|
1386
|
+
// Same-element rules in @layer astryx-theme win over the icon's
|
|
1387
|
+
// own base color/size, which a button-level target could not
|
|
1388
|
+
// reach.
|
|
1389
|
+
{...themeProps('multi-selector-clear-icon')}
|
|
1390
|
+
/>
|
|
1320
1391
|
</button>
|
|
1321
1392
|
)}
|
|
1322
1393
|
<span
|
|
@@ -1332,7 +1403,19 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1332
1403
|
color={STATUS_ICON_COLOR_MAP[status.type]}
|
|
1333
1404
|
/>
|
|
1334
1405
|
) : (
|
|
1335
|
-
<Icon
|
|
1406
|
+
<Icon
|
|
1407
|
+
icon="chevronDown"
|
|
1408
|
+
size="sm"
|
|
1409
|
+
color="inherit"
|
|
1410
|
+
// Stable theme target on the chevron glyph itself, so a theme can
|
|
1411
|
+
// restyle just this icon (color, size, hover) — and its
|
|
1412
|
+
// open/closed state — via `defineTheme`. Same-element rules in
|
|
1413
|
+
// @layer astryx-theme win over the icon's own base color/size,
|
|
1414
|
+
// which a button-level target could not reach.
|
|
1415
|
+
{...themeProps('multi-selector-indicator-icon', {
|
|
1416
|
+
state: popover.isOpen ? 'expanded' : 'collapsed',
|
|
1417
|
+
})}
|
|
1418
|
+
/>
|
|
1336
1419
|
)}
|
|
1337
1420
|
</span>
|
|
1338
1421
|
</div>
|
|
@@ -1383,6 +1466,7 @@ export function MultiSelector<T extends MultiSelectorOptionType>({
|
|
|
1383
1466
|
}
|
|
1384
1467
|
: undefined
|
|
1385
1468
|
}
|
|
1469
|
+
statusVariant={statusVariant}
|
|
1386
1470
|
labelTooltip={labelTooltip}
|
|
1387
1471
|
width={width}>
|
|
1388
1472
|
{multiSelectorContent}
|
|
@@ -192,6 +192,23 @@ export function useMultiCombobox({
|
|
|
192
192
|
}
|
|
193
193
|
break;
|
|
194
194
|
|
|
195
|
+
// PageUp/PageDown mirror Home/End. In search mode Home/End stay on
|
|
196
|
+
// the input for caret movement (APG editable combobox), so these are
|
|
197
|
+
// the sanctioned substitute for jumping to the first/last option.
|
|
198
|
+
case 'PageUp':
|
|
199
|
+
e.preventDefault();
|
|
200
|
+
if (isOpen && enabledIndices.length > 0) {
|
|
201
|
+
setHighlightedIndex(enabledIndices[0]);
|
|
202
|
+
}
|
|
203
|
+
break;
|
|
204
|
+
|
|
205
|
+
case 'PageDown':
|
|
206
|
+
e.preventDefault();
|
|
207
|
+
if (isOpen && enabledIndices.length > 0) {
|
|
208
|
+
setHighlightedIndex(enabledIndices[enabledIndices.length - 1]);
|
|
209
|
+
}
|
|
210
|
+
break;
|
|
211
|
+
|
|
195
212
|
case 'Delete':
|
|
196
213
|
case 'Backspace':
|
|
197
214
|
// Keyboard equivalent of the clear button (comboboxes-2): clear all
|
|
@@ -94,6 +94,13 @@ export const docs = {
|
|
|
94
94
|
type: "{type: 'error' | 'warning' | 'success', message?: string}",
|
|
95
95
|
description: 'Validation status with optional message.',
|
|
96
96
|
},
|
|
97
|
+
{
|
|
98
|
+
name: 'statusVariant',
|
|
99
|
+
type: "'attached' | 'detached' | 'tooltip'",
|
|
100
|
+
description:
|
|
101
|
+
'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing; tooltip hides the message box and surfaces it in a tooltip on the status icon.',
|
|
102
|
+
default: "'attached'",
|
|
103
|
+
},
|
|
97
104
|
{
|
|
98
105
|
name: 'min',
|
|
99
106
|
type: 'number | null',
|
|
@@ -138,6 +145,12 @@ export const docs = {
|
|
|
138
145
|
type: 'string',
|
|
139
146
|
description: 'HTML autocomplete attribute.',
|
|
140
147
|
},
|
|
148
|
+
{
|
|
149
|
+
name: 'width',
|
|
150
|
+
type: 'SizeValue',
|
|
151
|
+
description:
|
|
152
|
+
'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
|
|
153
|
+
},
|
|
141
154
|
{
|
|
142
155
|
name: 'hasAutoFocus',
|
|
143
156
|
type: 'boolean',
|
|
@@ -275,6 +288,13 @@ export const docsZh = {
|
|
|
275
288
|
type: "{type: 'error' | 'warning' | 'success', message?: string}",
|
|
276
289
|
description: '带可选消息的验证状态。',
|
|
277
290
|
},
|
|
291
|
+
{
|
|
292
|
+
name: 'statusVariant',
|
|
293
|
+
type: "'attached' | 'detached' | 'tooltip'",
|
|
294
|
+
description:
|
|
295
|
+
'状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距;tooltip 隐藏消息框,并在状态图标上以提示气泡形式显示。',
|
|
296
|
+
default: "'attached'",
|
|
297
|
+
},
|
|
278
298
|
{
|
|
279
299
|
name: 'min',
|
|
280
300
|
type: 'number | null',
|
|
@@ -402,6 +422,7 @@ export const docsDense = {
|
|
|
402
422
|
startIcon: 'Icon at input start.',
|
|
403
423
|
labelIcon: 'Icon before label text.',
|
|
404
424
|
status: 'Validation status w/ optional message.',
|
|
425
|
+
statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing; tooltip hides the box and shows it on the status icon.',
|
|
405
426
|
min: 'Minimum value allowed.',
|
|
406
427
|
max: 'Maximum value allowed.',
|
|
407
428
|
step: 'Step increment.',
|
|
@@ -9,11 +9,20 @@
|
|
|
9
9
|
* SYNC: When NumberInput.tsx changes, update tests to match new behavior
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
12
|
+
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
13
|
import {render, screen, fireEvent, waitFor} from '@testing-library/react';
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {TestIcon} from '../__tests__/TestIcon';
|
|
16
|
+
import {InputGroup} from '../InputGroup';
|
|
16
17
|
import {NumberInput} from './NumberInput';
|
|
18
|
+
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
19
|
+
|
|
20
|
+
// FieldStatus announces status messages through the persistent useAnnounce
|
|
21
|
+
// singletons; remove them between tests so role/aria-live queries in this
|
|
22
|
+
// file never match a leftover region.
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
__resetLiveRegionsForTest();
|
|
25
|
+
});
|
|
17
26
|
|
|
18
27
|
// Mock showPopover/hidePopover since jsdom does not implement them. Used by the
|
|
19
28
|
// disabledMessage tooltip.
|
|
@@ -328,6 +337,33 @@ describe('NumberInput', () => {
|
|
|
328
337
|
expect(screen.queryByText('%')).not.toBeInTheDocument();
|
|
329
338
|
expect(screen.queryByText('GB')).not.toBeInTheDocument();
|
|
330
339
|
});
|
|
340
|
+
|
|
341
|
+
it('includes the units text in the accessible description (WCAG 1.3.1)', () => {
|
|
342
|
+
render(
|
|
343
|
+
<NumberInput
|
|
344
|
+
label="Storage"
|
|
345
|
+
value={50}
|
|
346
|
+
onChange={() => {}}
|
|
347
|
+
units="GB"
|
|
348
|
+
/>,
|
|
349
|
+
);
|
|
350
|
+
expect(screen.getByRole('spinbutton')).toHaveAccessibleDescription(/GB/);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('combines units with the description in the accessible description', () => {
|
|
354
|
+
render(
|
|
355
|
+
<NumberInput
|
|
356
|
+
label="Discount"
|
|
357
|
+
value={10}
|
|
358
|
+
onChange={() => {}}
|
|
359
|
+
description="Applied at checkout"
|
|
360
|
+
units="%"
|
|
361
|
+
/>,
|
|
362
|
+
);
|
|
363
|
+
const input = screen.getByRole('spinbutton');
|
|
364
|
+
expect(input).toHaveAccessibleDescription(/Applied at checkout/);
|
|
365
|
+
expect(input).toHaveAccessibleDescription(/%/);
|
|
366
|
+
});
|
|
331
367
|
});
|
|
332
368
|
|
|
333
369
|
describe('event callbacks', () => {
|
|
@@ -455,6 +491,26 @@ describe('NumberInput', () => {
|
|
|
455
491
|
expect(screen.getByText('Value must be positive')).toBeInTheDocument();
|
|
456
492
|
});
|
|
457
493
|
|
|
494
|
+
it('has no dangling aria-describedby ids inside InputGroup (WCAG 1.3.1)', () => {
|
|
495
|
+
// Inside an InputGroup no Field renders, so the status message element
|
|
496
|
+
// does not exist; aria-describedby must not reference its id.
|
|
497
|
+
render(
|
|
498
|
+
<InputGroup label="Price">
|
|
499
|
+
<NumberInput
|
|
500
|
+
label="Amount"
|
|
501
|
+
value={null}
|
|
502
|
+
onChange={() => {}}
|
|
503
|
+
status={{type: 'error', message: 'Value must be positive'}}
|
|
504
|
+
/>
|
|
505
|
+
</InputGroup>,
|
|
506
|
+
);
|
|
507
|
+
const input = screen.getByRole('spinbutton');
|
|
508
|
+
const describedBy = input.getAttribute('aria-describedby') ?? '';
|
|
509
|
+
for (const idToken of describedBy.split(/\s+/).filter(Boolean)) {
|
|
510
|
+
expect(document.getElementById(idToken)).not.toBeNull();
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
|
|
458
514
|
it('does not render status message when not provided', () => {
|
|
459
515
|
render(
|
|
460
516
|
<NumberInput
|
|
@@ -871,9 +927,7 @@ describe('NumberInput', () => {
|
|
|
871
927
|
describe('keyboard clearing with hasClear (#3599)', () => {
|
|
872
928
|
it('commits null when the input is emptied and blurred', () => {
|
|
873
929
|
const onChange = vi.fn();
|
|
874
|
-
render(
|
|
875
|
-
<NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
|
|
876
|
-
);
|
|
930
|
+
render(<NumberInput label="Qty" hasClear value={42} onChange={onChange} />);
|
|
877
931
|
const input = screen.getByLabelText('Qty');
|
|
878
932
|
fireEvent.change(input, {target: {value: ''}});
|
|
879
933
|
fireEvent.blur(input);
|
|
@@ -882,9 +936,7 @@ describe('keyboard clearing with hasClear (#3599)', () => {
|
|
|
882
936
|
|
|
883
937
|
it('commits null when the input is emptied and Enter is pressed', () => {
|
|
884
938
|
const onChange = vi.fn();
|
|
885
|
-
render(
|
|
886
|
-
<NumberInput label="Qty" hasClear value={42} onChange={onChange} />,
|
|
887
|
-
);
|
|
939
|
+
render(<NumberInput label="Qty" hasClear value={42} onChange={onChange} />);
|
|
888
940
|
const input = screen.getByLabelText('Qty');
|
|
889
941
|
fireEvent.change(input, {target: {value: ''}});
|
|
890
942
|
fireEvent.keyDown(input, {key: 'Enter'});
|
|
@@ -912,3 +964,26 @@ describe('keyboard clearing with hasClear (#3599)', () => {
|
|
|
912
964
|
expect((input as HTMLInputElement).value).toBe('42');
|
|
913
965
|
});
|
|
914
966
|
});
|
|
967
|
+
|
|
968
|
+
|
|
969
|
+
describe('NumberInput statusVariant forwarding', () => {
|
|
970
|
+
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
971
|
+
const {container} = render(
|
|
972
|
+
<NumberInput label="Amount" value={null} onChange={() => {}} status={{type: 'error', message: 'Must be positive'}} />,
|
|
973
|
+
);
|
|
974
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
975
|
+
'data-variant',
|
|
976
|
+
'attached',
|
|
977
|
+
);
|
|
978
|
+
});
|
|
979
|
+
|
|
980
|
+
it('forwards statusVariant="detached" to the underlying Field status', () => {
|
|
981
|
+
const {container} = render(
|
|
982
|
+
<NumberInput label="Amount" value={null} onChange={() => {}} status={{type: 'error', message: 'Must be positive'}} statusVariant="detached" />,
|
|
983
|
+
);
|
|
984
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
985
|
+
'data-variant',
|
|
986
|
+
'detached',
|
|
987
|
+
);
|
|
988
|
+
});
|
|
989
|
+
});
|