@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
|
@@ -20,8 +20,11 @@ import {
|
|
|
20
20
|
import userEvent from '@testing-library/user-event';
|
|
21
21
|
import {Selector} from './Selector';
|
|
22
22
|
import {SelectorOption} from './SelectorOption';
|
|
23
|
+
import {Icon} from '../Icon';
|
|
23
24
|
import {InputGroup, InputGroupText} from '../InputGroup';
|
|
24
25
|
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
26
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
27
|
+
import {generateThemeCSSFlat} from '../theme/generateThemeRules';
|
|
25
28
|
|
|
26
29
|
function politeRegion(): HTMLElement | null {
|
|
27
30
|
return document.querySelector('[data-astryx-live-region="polite"]');
|
|
@@ -503,6 +506,58 @@ describe('Selector', () => {
|
|
|
503
506
|
expect(search).toHaveAttribute('aria-activedescendant');
|
|
504
507
|
});
|
|
505
508
|
|
|
509
|
+
it('PageDown/PageUp jump the highlight to the last/first filtered option', async () => {
|
|
510
|
+
const user = userEvent.setup();
|
|
511
|
+
render(
|
|
512
|
+
<Selector
|
|
513
|
+
label="Fruit"
|
|
514
|
+
options={OPTIONS}
|
|
515
|
+
value="Apple"
|
|
516
|
+
onChange={() => {}}
|
|
517
|
+
hasSearch
|
|
518
|
+
/>,
|
|
519
|
+
);
|
|
520
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
521
|
+
const search = screen.getByRole('combobox', h);
|
|
522
|
+
// Filter to Apple and Banana so "last" means last *visible* option.
|
|
523
|
+
await user.type(search, 'a');
|
|
524
|
+
const options = screen.getAllByRole('option', h);
|
|
525
|
+
expect(options).toHaveLength(2);
|
|
526
|
+
await user.keyboard('{PageDown}');
|
|
527
|
+
expect(search).toHaveAttribute(
|
|
528
|
+
'aria-activedescendant',
|
|
529
|
+
options[options.length - 1].id,
|
|
530
|
+
);
|
|
531
|
+
await user.keyboard('{PageUp}');
|
|
532
|
+
expect(search).toHaveAttribute('aria-activedescendant', options[0].id);
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
it('Home/End move the search caret, not the option highlight', async () => {
|
|
536
|
+
const user = userEvent.setup();
|
|
537
|
+
render(
|
|
538
|
+
<Selector
|
|
539
|
+
label="Fruit"
|
|
540
|
+
options={OPTIONS}
|
|
541
|
+
value="Apple"
|
|
542
|
+
onChange={() => {}}
|
|
543
|
+
hasSearch
|
|
544
|
+
/>,
|
|
545
|
+
);
|
|
546
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
547
|
+
const search = screen.getByRole<HTMLInputElement>('combobox', h);
|
|
548
|
+
await user.type(search, 'an');
|
|
549
|
+
expect(search.selectionStart).toBe(2);
|
|
550
|
+
const activeBefore = search.getAttribute('aria-activedescendant');
|
|
551
|
+
// Home/End stay on the input for caret movement (APG editable
|
|
552
|
+
// combobox); the option highlight must not move.
|
|
553
|
+
await user.keyboard('{Home}');
|
|
554
|
+
expect(search.selectionStart).toBe(0);
|
|
555
|
+
expect(search.getAttribute('aria-activedescendant')).toBe(activeBefore);
|
|
556
|
+
await user.keyboard('{End}');
|
|
557
|
+
expect(search.selectionStart).toBe(2);
|
|
558
|
+
expect(search.getAttribute('aria-activedescendant')).toBe(activeBefore);
|
|
559
|
+
});
|
|
560
|
+
|
|
506
561
|
it('does not render search input when hasSearch is false', async () => {
|
|
507
562
|
const user = userEvent.setup();
|
|
508
563
|
render(
|
|
@@ -694,6 +749,119 @@ describe('Selector', () => {
|
|
|
694
749
|
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
695
750
|
});
|
|
696
751
|
});
|
|
752
|
+
|
|
753
|
+
describe('grouped search', () => {
|
|
754
|
+
const GROUPED = [
|
|
755
|
+
{
|
|
756
|
+
type: 'section' as const,
|
|
757
|
+
title: 'Citrus',
|
|
758
|
+
options: [
|
|
759
|
+
{value: 'orange', label: 'Orange'},
|
|
760
|
+
{value: 'lemon', label: 'Lemon'},
|
|
761
|
+
],
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
type: 'section' as const,
|
|
765
|
+
title: 'Berries',
|
|
766
|
+
options: [
|
|
767
|
+
{value: 'strawberry', label: 'Strawberry'},
|
|
768
|
+
{value: 'blueberry', label: 'Blueberry'},
|
|
769
|
+
],
|
|
770
|
+
},
|
|
771
|
+
];
|
|
772
|
+
|
|
773
|
+
it('keeps the group header above matching items while searching', async () => {
|
|
774
|
+
const user = userEvent.setup();
|
|
775
|
+
render(
|
|
776
|
+
<Selector
|
|
777
|
+
label="Fruit"
|
|
778
|
+
options={GROUPED}
|
|
779
|
+
onChange={() => {}}
|
|
780
|
+
hasSearch
|
|
781
|
+
/>,
|
|
782
|
+
);
|
|
783
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
784
|
+
// "orange" only matches within the Citrus group.
|
|
785
|
+
await user.type(screen.getByRole('combobox', h), 'orange');
|
|
786
|
+
|
|
787
|
+
expect(
|
|
788
|
+
screen.getByRole('group', {name: 'Citrus', ...h}),
|
|
789
|
+
).toBeInTheDocument();
|
|
790
|
+
const options = screen.getAllByRole('option', h);
|
|
791
|
+
expect(options).toHaveLength(1);
|
|
792
|
+
expect(options[0]).toHaveTextContent('Orange');
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
it('hides a group whose items have no match', async () => {
|
|
796
|
+
const user = userEvent.setup();
|
|
797
|
+
render(
|
|
798
|
+
<Selector
|
|
799
|
+
label="Fruit"
|
|
800
|
+
options={GROUPED}
|
|
801
|
+
onChange={() => {}}
|
|
802
|
+
hasSearch
|
|
803
|
+
/>,
|
|
804
|
+
);
|
|
805
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
806
|
+
// "berry" only matches items inside the Berries group.
|
|
807
|
+
await user.type(screen.getByRole('combobox', h), 'berry');
|
|
808
|
+
|
|
809
|
+
expect(
|
|
810
|
+
screen.getByRole('group', {name: 'Berries', ...h}),
|
|
811
|
+
).toBeInTheDocument();
|
|
812
|
+
expect(
|
|
813
|
+
screen.queryByRole('group', {name: 'Citrus', ...h}),
|
|
814
|
+
).not.toBeInTheDocument();
|
|
815
|
+
expect(screen.getAllByRole('option', h)).toHaveLength(2);
|
|
816
|
+
});
|
|
817
|
+
|
|
818
|
+
it('lands keyboard focus on the correct option after filtering', async () => {
|
|
819
|
+
const user = userEvent.setup();
|
|
820
|
+
render(
|
|
821
|
+
<Selector
|
|
822
|
+
label="Fruit"
|
|
823
|
+
options={GROUPED}
|
|
824
|
+
onChange={() => {}}
|
|
825
|
+
hasSearch
|
|
826
|
+
/>,
|
|
827
|
+
);
|
|
828
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
829
|
+
const search = screen.getByRole('combobox', h);
|
|
830
|
+
// "berry" leaves Strawberry, Blueberry (in that document order).
|
|
831
|
+
await user.type(search, 'berry');
|
|
832
|
+
const options = screen.getAllByRole('option', h);
|
|
833
|
+
expect(options.map(o => o.textContent)).toEqual([
|
|
834
|
+
'Strawberry',
|
|
835
|
+
'Blueberry',
|
|
836
|
+
]);
|
|
837
|
+
await user.keyboard('{ArrowDown}');
|
|
838
|
+
expect(search).toHaveAttribute('aria-activedescendant', options[0].id);
|
|
839
|
+
await user.keyboard('{ArrowDown}');
|
|
840
|
+
expect(search).toHaveAttribute('aria-activedescendant', options[1].id);
|
|
841
|
+
});
|
|
842
|
+
|
|
843
|
+
it('shows the empty state when no group has a match', async () => {
|
|
844
|
+
const user = userEvent.setup();
|
|
845
|
+
render(
|
|
846
|
+
<Selector
|
|
847
|
+
label="Fruit"
|
|
848
|
+
options={GROUPED}
|
|
849
|
+
onChange={() => {}}
|
|
850
|
+
hasSearch
|
|
851
|
+
/>,
|
|
852
|
+
);
|
|
853
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
854
|
+
await user.type(screen.getByRole('combobox', h), 'zzz');
|
|
855
|
+
expect(screen.queryAllByRole('option', h)).toHaveLength(0);
|
|
856
|
+
expect(
|
|
857
|
+
screen.queryByRole('group', {name: 'Citrus', ...h}),
|
|
858
|
+
).not.toBeInTheDocument();
|
|
859
|
+
const listbox = screen.getByRole('listbox', h);
|
|
860
|
+
expect(
|
|
861
|
+
within(listbox).getByText('No results found'),
|
|
862
|
+
).toBeInTheDocument();
|
|
863
|
+
});
|
|
864
|
+
});
|
|
697
865
|
});
|
|
698
866
|
|
|
699
867
|
describe('keyboard accessibility', () => {
|
|
@@ -722,6 +890,23 @@ describe('Selector', () => {
|
|
|
722
890
|
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
723
891
|
});
|
|
724
892
|
|
|
893
|
+
it('End/Home jump the highlight to the last/first option (non-search)', async () => {
|
|
894
|
+
const user = userEvent.setup();
|
|
895
|
+
render(<Selector label="Fruit" options={OPTIONS} />);
|
|
896
|
+
|
|
897
|
+
const trigger = screen.getByRole('combobox');
|
|
898
|
+
await user.click(trigger);
|
|
899
|
+
const options = screen.getAllByRole('option', h);
|
|
900
|
+
|
|
901
|
+
await user.keyboard('{End}');
|
|
902
|
+
expect(trigger).toHaveAttribute(
|
|
903
|
+
'aria-activedescendant',
|
|
904
|
+
options[options.length - 1].id,
|
|
905
|
+
);
|
|
906
|
+
await user.keyboard('{Home}');
|
|
907
|
+
expect(trigger).toHaveAttribute('aria-activedescendant', options[0].id);
|
|
908
|
+
});
|
|
909
|
+
|
|
725
910
|
it('opens and selects an option with Enter (no mouse)', async () => {
|
|
726
911
|
const user = userEvent.setup();
|
|
727
912
|
const onChange = vi.fn();
|
|
@@ -1004,3 +1189,235 @@ describe('Selector', () => {
|
|
|
1004
1189
|
});
|
|
1005
1190
|
});
|
|
1006
1191
|
});
|
|
1192
|
+
|
|
1193
|
+
describe('Selector statusVariant forwarding', () => {
|
|
1194
|
+
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
1195
|
+
const {container} = render(
|
|
1196
|
+
<Selector
|
|
1197
|
+
label="Fruit"
|
|
1198
|
+
options={['Apple', 'Banana']}
|
|
1199
|
+
status={{type: 'error', message: 'Required'}}
|
|
1200
|
+
/>,
|
|
1201
|
+
);
|
|
1202
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
1203
|
+
'data-variant',
|
|
1204
|
+
'attached',
|
|
1205
|
+
);
|
|
1206
|
+
});
|
|
1207
|
+
|
|
1208
|
+
it('forwards statusVariant="detached" to the underlying Field status', () => {
|
|
1209
|
+
const {container} = render(
|
|
1210
|
+
<Selector
|
|
1211
|
+
label="Fruit"
|
|
1212
|
+
options={['Apple', 'Banana']}
|
|
1213
|
+
status={{type: 'error', message: 'Required'}}
|
|
1214
|
+
statusVariant="detached"
|
|
1215
|
+
/>,
|
|
1216
|
+
);
|
|
1217
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
1218
|
+
'data-variant',
|
|
1219
|
+
'detached',
|
|
1220
|
+
);
|
|
1221
|
+
});
|
|
1222
|
+
});
|
|
1223
|
+
|
|
1224
|
+
describe('Selector clear icon theme target', () => {
|
|
1225
|
+
// Resolve the clear glyph span (the astryx-icon element inside the clear
|
|
1226
|
+
// button), independent of the theme target class.
|
|
1227
|
+
const getClearIcon = (): HTMLElement => {
|
|
1228
|
+
const button = screen.getByRole('button', {name: 'Clear Fruit'});
|
|
1229
|
+
const icon = button.querySelector('.astryx-icon');
|
|
1230
|
+
if (icon == null) {
|
|
1231
|
+
throw new Error('clear icon not found');
|
|
1232
|
+
}
|
|
1233
|
+
return icon as HTMLElement;
|
|
1234
|
+
};
|
|
1235
|
+
|
|
1236
|
+
it('renders the astryx-selector-clear-icon target on the clear glyph', () => {
|
|
1237
|
+
render(
|
|
1238
|
+
<Selector
|
|
1239
|
+
label="Fruit"
|
|
1240
|
+
options={OPTIONS}
|
|
1241
|
+
value="Banana"
|
|
1242
|
+
onChange={() => {}}
|
|
1243
|
+
hasClear
|
|
1244
|
+
/>,
|
|
1245
|
+
);
|
|
1246
|
+
// The stable theme target lands on the icon element itself (not the
|
|
1247
|
+
// button), so a theme can restyle just this glyph (color, size, hover)
|
|
1248
|
+
// via `defineTheme` — a button-level target could not reach the icon's
|
|
1249
|
+
// own color/size.
|
|
1250
|
+
const icon = getClearIcon();
|
|
1251
|
+
expect(icon).toHaveClass('astryx-selector-clear-icon');
|
|
1252
|
+
expect(icon).toHaveClass('astryx-icon');
|
|
1253
|
+
});
|
|
1254
|
+
|
|
1255
|
+
it('keeps the clear button functional alongside the target', () => {
|
|
1256
|
+
const onChange = vi.fn();
|
|
1257
|
+
render(
|
|
1258
|
+
<Selector
|
|
1259
|
+
label="Fruit"
|
|
1260
|
+
options={OPTIONS}
|
|
1261
|
+
value="Banana"
|
|
1262
|
+
onChange={onChange}
|
|
1263
|
+
hasClear
|
|
1264
|
+
/>,
|
|
1265
|
+
);
|
|
1266
|
+
const clear = screen.getByRole('button', {name: 'Clear Fruit'});
|
|
1267
|
+
expect(clear.tagName).toBe('BUTTON');
|
|
1268
|
+
fireEvent.click(clear);
|
|
1269
|
+
expect(onChange).toHaveBeenCalledWith(null);
|
|
1270
|
+
});
|
|
1271
|
+
|
|
1272
|
+
it('renders the default icon (secondary color, sm size) byte-identically', () => {
|
|
1273
|
+
// Pixel-identical default guard: the clear glyph must carry the exact same
|
|
1274
|
+
// StyleX color/size classes as a standalone secondary/sm icon. The added
|
|
1275
|
+
// target class is purely additive — it changes nothing until a theme
|
|
1276
|
+
// targets it.
|
|
1277
|
+
render(
|
|
1278
|
+
<Selector
|
|
1279
|
+
label="Fruit"
|
|
1280
|
+
options={OPTIONS}
|
|
1281
|
+
value="Banana"
|
|
1282
|
+
onChange={() => {}}
|
|
1283
|
+
hasClear
|
|
1284
|
+
/>,
|
|
1285
|
+
);
|
|
1286
|
+
const icon = getClearIcon();
|
|
1287
|
+
|
|
1288
|
+
const {container: refContainer} = render(
|
|
1289
|
+
<Icon icon="close" size="sm" color="secondary" />,
|
|
1290
|
+
);
|
|
1291
|
+
const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
|
|
1292
|
+
|
|
1293
|
+
const styleClasses = (el: HTMLElement) =>
|
|
1294
|
+
el.className
|
|
1295
|
+
.split(' ')
|
|
1296
|
+
.filter(c => c !== 'astryx-selector-clear-icon')
|
|
1297
|
+
.sort();
|
|
1298
|
+
|
|
1299
|
+
expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
|
|
1300
|
+
});
|
|
1301
|
+
|
|
1302
|
+
it('exposes selector-clear-icon so a theme reaches the icon color, size, and hover', () => {
|
|
1303
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertion above
|
|
1304
|
+
// (target lands on the icon element) plus this generation assertion (the
|
|
1305
|
+
// theme emits same-element icon rules in @layer astryx-theme) together
|
|
1306
|
+
// prove the seam: a same-element theme rule wins over the icon's own
|
|
1307
|
+
// base-layer color/size.
|
|
1308
|
+
const theme = defineTheme({
|
|
1309
|
+
name: 'selector-clear-icon-test',
|
|
1310
|
+
components: {
|
|
1311
|
+
'selector-clear-icon': {
|
|
1312
|
+
base: {
|
|
1313
|
+
width: '12px',
|
|
1314
|
+
height: '12px',
|
|
1315
|
+
fontSize: '12px',
|
|
1316
|
+
color: 'var(--color-icon-secondary)',
|
|
1317
|
+
':hover': {color: 'var(--color-icon-primary)'},
|
|
1318
|
+
},
|
|
1319
|
+
},
|
|
1320
|
+
},
|
|
1321
|
+
});
|
|
1322
|
+
const css = generateThemeCSSFlat(theme);
|
|
1323
|
+
expect(css).toContain('.astryx-selector-clear-icon {');
|
|
1324
|
+
expect(css).toContain('width: 12px');
|
|
1325
|
+
expect(css).toContain('height: 12px');
|
|
1326
|
+
expect(css).toContain('.astryx-selector-clear-icon:hover {');
|
|
1327
|
+
expect(css).toContain('color: var(--color-icon-primary)');
|
|
1328
|
+
});
|
|
1329
|
+
});
|
|
1330
|
+
|
|
1331
|
+
describe('Selector indicator (chevron) icon theme target', () => {
|
|
1332
|
+
const getIndicatorIcon = (container: HTMLElement): HTMLElement => {
|
|
1333
|
+
// The chevron is the only glyph carrying the indicator target class.
|
|
1334
|
+
const icon = container.querySelector('.astryx-selector-indicator-icon');
|
|
1335
|
+
if (icon == null) {
|
|
1336
|
+
throw new Error('indicator icon not found');
|
|
1337
|
+
}
|
|
1338
|
+
return icon as HTMLElement;
|
|
1339
|
+
};
|
|
1340
|
+
|
|
1341
|
+
it('renders the astryx-selector-indicator-icon target on the chevron glyph', () => {
|
|
1342
|
+
const {container} = render(
|
|
1343
|
+
<Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
|
|
1344
|
+
);
|
|
1345
|
+
// The stable theme target lands on the icon element itself (not the trigger
|
|
1346
|
+
// button), so a theme can restyle just this glyph (color, size, hover) —
|
|
1347
|
+
// and each open/closed state — via `defineTheme`. A button-level target
|
|
1348
|
+
// could not reach the icon's own color/size.
|
|
1349
|
+
const icon = getIndicatorIcon(container);
|
|
1350
|
+
expect(icon).toHaveClass('astryx-selector-indicator-icon');
|
|
1351
|
+
expect(icon).toHaveClass('astryx-icon');
|
|
1352
|
+
// Open/closed state is reflected so a theme can target each state alone.
|
|
1353
|
+
expect(icon).toHaveAttribute('data-state', 'collapsed');
|
|
1354
|
+
});
|
|
1355
|
+
|
|
1356
|
+
it('reflects the expanded state on the chevron when the popover is open', async () => {
|
|
1357
|
+
const user = userEvent.setup();
|
|
1358
|
+
const {container} = render(
|
|
1359
|
+
<Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
|
|
1360
|
+
);
|
|
1361
|
+
await user.click(screen.getByRole('combobox'));
|
|
1362
|
+
await waitFor(() => {
|
|
1363
|
+
expect(getIndicatorIcon(container)).toHaveAttribute(
|
|
1364
|
+
'data-state',
|
|
1365
|
+
'expanded',
|
|
1366
|
+
);
|
|
1367
|
+
});
|
|
1368
|
+
});
|
|
1369
|
+
|
|
1370
|
+
it('renders the default icon (inherit color, sm size) byte-identically', () => {
|
|
1371
|
+
// Pixel-identical default guard: the chevron glyph must carry the exact
|
|
1372
|
+
// same StyleX color/size classes as a standalone inherit/sm icon. The added
|
|
1373
|
+
// target class + data-state are purely additive — they change nothing until
|
|
1374
|
+
// a theme targets them.
|
|
1375
|
+
const {container} = render(
|
|
1376
|
+
<Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
|
|
1377
|
+
);
|
|
1378
|
+
const icon = getIndicatorIcon(container);
|
|
1379
|
+
|
|
1380
|
+
const {container: refContainer} = render(
|
|
1381
|
+
<Icon icon="chevronDown" size="sm" color="inherit" />,
|
|
1382
|
+
);
|
|
1383
|
+
const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
|
|
1384
|
+
|
|
1385
|
+
// Exclude the additive theme-target classes (the stable target + its
|
|
1386
|
+
// reflected state class) so only the StyleX color/size classes remain.
|
|
1387
|
+
const themeTargetClasses = new Set([
|
|
1388
|
+
'astryx-selector-indicator-icon',
|
|
1389
|
+
'collapsed',
|
|
1390
|
+
'expanded',
|
|
1391
|
+
]);
|
|
1392
|
+
const styleClasses = (el: HTMLElement) =>
|
|
1393
|
+
el.className
|
|
1394
|
+
.split(' ')
|
|
1395
|
+
.filter(c => !themeTargetClasses.has(c))
|
|
1396
|
+
.sort();
|
|
1397
|
+
|
|
1398
|
+
expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
|
|
1399
|
+
});
|
|
1400
|
+
|
|
1401
|
+
it('exposes selector-indicator-icon so a theme reaches the icon size and per-state color', () => {
|
|
1402
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
1403
|
+
// above (target lands on the icon element) plus this generation assertion
|
|
1404
|
+
// (the theme emits same-element icon rules in @layer astryx-theme) together
|
|
1405
|
+
// prove the seam: a same-element theme rule wins over the icon's own
|
|
1406
|
+
// base-layer color/size.
|
|
1407
|
+
const theme = defineTheme({
|
|
1408
|
+
name: 'selector-indicator-icon-test',
|
|
1409
|
+
components: {
|
|
1410
|
+
'selector-indicator-icon': {
|
|
1411
|
+
base: {width: '14px', height: '14px', fontSize: '14px'},
|
|
1412
|
+
'state:expanded': {color: 'var(--color-icon-primary)'},
|
|
1413
|
+
},
|
|
1414
|
+
},
|
|
1415
|
+
});
|
|
1416
|
+
const css = generateThemeCSSFlat(theme);
|
|
1417
|
+
expect(css).toContain('.astryx-selector-indicator-icon {');
|
|
1418
|
+
expect(css).toContain('width: 14px');
|
|
1419
|
+
expect(css).toContain('height: 14px');
|
|
1420
|
+
expect(css).toContain('.astryx-selector-indicator-icon.expanded');
|
|
1421
|
+
expect(css).toContain('color: var(--color-icon-primary)');
|
|
1422
|
+
});
|
|
1423
|
+
});
|
|
@@ -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 {layerAnimations} from '../Layer/layerAnimations.stylex';
|
|
@@ -253,7 +254,7 @@ const styles = stylex.create({
|
|
|
253
254
|
backgroundColor: 'transparent',
|
|
254
255
|
border: 'none',
|
|
255
256
|
cursor: 'pointer',
|
|
256
|
-
textAlign: '
|
|
257
|
+
textAlign: 'start',
|
|
257
258
|
outline: 'none',
|
|
258
259
|
},
|
|
259
260
|
itemContent: {
|
|
@@ -433,6 +434,13 @@ interface SelectorPropsBase<
|
|
|
433
434
|
* If message is provided, displays a message box below the selector.
|
|
434
435
|
*/
|
|
435
436
|
status?: SelectorStatus;
|
|
437
|
+
/**
|
|
438
|
+
* How the status message is placed relative to the input.
|
|
439
|
+
* - 'attached': message overlaps directly below the input (bordered treatment)
|
|
440
|
+
* - 'detached': message floats below as a separate element with spacing
|
|
441
|
+
* @default 'attached'
|
|
442
|
+
*/
|
|
443
|
+
statusVariant?: FieldStatusVariant;
|
|
436
444
|
|
|
437
445
|
/**
|
|
438
446
|
* Width of the field. Numbers are treated as pixels, strings are used as-is
|
|
@@ -537,6 +545,21 @@ function DefaultOption({option}: {option: SelectorOptionData}) {
|
|
|
537
545
|
);
|
|
538
546
|
}
|
|
539
547
|
|
|
548
|
+
// Case-insensitive substring match for a single option. The one predicate used
|
|
549
|
+
// by both the flat filter (count + keyboard nav) and the grouped renderer, so
|
|
550
|
+
// what is shown while searching stays in lockstep with the announced count.
|
|
551
|
+
function optionMatchesQuery(
|
|
552
|
+
option: SelectorOptionData,
|
|
553
|
+
query: string,
|
|
554
|
+
): boolean {
|
|
555
|
+
if (!query) {
|
|
556
|
+
return true;
|
|
557
|
+
}
|
|
558
|
+
return (option.label ?? option.value)
|
|
559
|
+
.toLowerCase()
|
|
560
|
+
.includes(query.toLowerCase());
|
|
561
|
+
}
|
|
562
|
+
|
|
540
563
|
// Case-insensitive substring filter over the selectable options. Shared by the
|
|
541
564
|
// `filteredItems` memo (rendering) and the search-change handler, which needs
|
|
542
565
|
// the count for the *next* query synchronously to announce it exactly once per
|
|
@@ -548,10 +571,7 @@ function filterOptionsByQuery(
|
|
|
548
571
|
if (!query) {
|
|
549
572
|
return items;
|
|
550
573
|
}
|
|
551
|
-
|
|
552
|
-
return items.filter(item =>
|
|
553
|
-
(item.label ?? item.value).toLowerCase().includes(q),
|
|
554
|
-
);
|
|
574
|
+
return items.filter(item => optionMatchesQuery(item, query));
|
|
555
575
|
}
|
|
556
576
|
|
|
557
577
|
/**
|
|
@@ -588,6 +608,7 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
588
608
|
placeholder: placeholderFromProps,
|
|
589
609
|
size: sizeProp,
|
|
590
610
|
status,
|
|
611
|
+
statusVariant = 'attached',
|
|
591
612
|
labelTooltip,
|
|
592
613
|
startIcon,
|
|
593
614
|
htmlName,
|
|
@@ -858,10 +879,14 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
858
879
|
onChange={handleSearchChange}
|
|
859
880
|
onKeyDown={e => {
|
|
860
881
|
// Arrow keys navigate options; Enter selects; Escape/Tab close.
|
|
861
|
-
// Home/End are left to the input for caret movement
|
|
882
|
+
// Home/End are left to the input for caret movement (APG editable
|
|
883
|
+
// combobox); PageUp/PageDown are the sanctioned substitute for
|
|
884
|
+
// jumping to the first/last option.
|
|
862
885
|
if (
|
|
863
886
|
e.key === 'ArrowDown' ||
|
|
864
887
|
e.key === 'ArrowUp' ||
|
|
888
|
+
e.key === 'PageUp' ||
|
|
889
|
+
e.key === 'PageDown' ||
|
|
865
890
|
e.key === 'Enter' ||
|
|
866
891
|
e.key === 'Escape' ||
|
|
867
892
|
e.key === 'Tab'
|
|
@@ -934,16 +959,15 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
934
959
|
|
|
935
960
|
// Render all options (handling sections/dividers)
|
|
936
961
|
const renderOptions = useCallback(() => {
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
return filteredItems.map((item, index) => renderItem(item, index));
|
|
962
|
+
const isSearching = hasSearch && Boolean(searchQuery);
|
|
963
|
+
|
|
964
|
+
// Nothing matched across every group/option: show the empty state.
|
|
965
|
+
if (isSearching && filteredItems.length === 0) {
|
|
966
|
+
return [
|
|
967
|
+
<div key="empty" {...stylex.props(styles.emptyState)}>
|
|
968
|
+
No results found
|
|
969
|
+
</div>,
|
|
970
|
+
];
|
|
947
971
|
}
|
|
948
972
|
|
|
949
973
|
let flatIndex = 0;
|
|
@@ -953,13 +977,27 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
953
977
|
const option = options[i];
|
|
954
978
|
|
|
955
979
|
if (isDivider(option)) {
|
|
980
|
+
// While searching, a standalone divider between groups would orphan
|
|
981
|
+
// itself once its neighbors are filtered out, so skip it.
|
|
982
|
+
if (isSearching) {
|
|
983
|
+
continue;
|
|
984
|
+
}
|
|
956
985
|
elements.push(<Divider key={`divider-${i}`} xstyle={styles.divider} />);
|
|
957
986
|
} else if (isSection(option)) {
|
|
958
987
|
const sectionItems: ReactNode[] = [];
|
|
959
988
|
for (const opt of option.options) {
|
|
960
|
-
|
|
989
|
+
const normalized = normalizeOption(opt);
|
|
990
|
+
if (isSearching && !optionMatchesQuery(normalized, searchQuery)) {
|
|
991
|
+
continue;
|
|
992
|
+
}
|
|
993
|
+
sectionItems.push(renderItem(normalized, flatIndex));
|
|
961
994
|
flatIndex++;
|
|
962
995
|
}
|
|
996
|
+
// Hide a group entirely (header + wrapper) when none of its items
|
|
997
|
+
// match the query, so no header is left standing over nothing.
|
|
998
|
+
if (sectionItems.length === 0) {
|
|
999
|
+
continue;
|
|
1000
|
+
}
|
|
963
1001
|
if (option.title) {
|
|
964
1002
|
elements.push(
|
|
965
1003
|
<Divider
|
|
@@ -975,7 +1013,11 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
975
1013
|
</div>,
|
|
976
1014
|
);
|
|
977
1015
|
} else if (isOptionData(option)) {
|
|
978
|
-
|
|
1016
|
+
const normalized = normalizeOption(option);
|
|
1017
|
+
if (isSearching && !optionMatchesQuery(normalized, searchQuery)) {
|
|
1018
|
+
continue;
|
|
1019
|
+
}
|
|
1020
|
+
elements.push(renderItem(normalized, flatIndex));
|
|
979
1021
|
flatIndex++;
|
|
980
1022
|
}
|
|
981
1023
|
}
|
|
@@ -1004,7 +1046,7 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1004
1046
|
isDisabled && inputWrapperStyles.disabled,
|
|
1005
1047
|
!selectedItem && styles.triggerPlaceholder,
|
|
1006
1048
|
status && inputStatusBorderStyles[status.type],
|
|
1007
|
-
status && inputStatusHoverShadowStyles[status.type],
|
|
1049
|
+
status && !isDisabled && inputStatusHoverShadowStyles[status.type],
|
|
1008
1050
|
inputGroup && groupStyles.inGroup,
|
|
1009
1051
|
xstyle,
|
|
1010
1052
|
),
|
|
@@ -1067,7 +1109,17 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1067
1109
|
onClick={handleClear}
|
|
1068
1110
|
aria-label={t('@astryx.selector.clearLabel', {label})}
|
|
1069
1111
|
{...stylex.props(styles.clearButton)}>
|
|
1070
|
-
<Icon
|
|
1112
|
+
<Icon
|
|
1113
|
+
icon="close"
|
|
1114
|
+
size="sm"
|
|
1115
|
+
color="secondary"
|
|
1116
|
+
// Stable theme target on the clear glyph itself, so a theme can
|
|
1117
|
+
// restyle just this icon (color, size, hover) via `defineTheme`.
|
|
1118
|
+
// Same-element rules in @layer astryx-theme win over the icon's
|
|
1119
|
+
// own base color/size, which a button-level target could not
|
|
1120
|
+
// reach.
|
|
1121
|
+
{...themeProps('selector-clear-icon')}
|
|
1122
|
+
/>
|
|
1071
1123
|
</button>
|
|
1072
1124
|
)}
|
|
1073
1125
|
<span
|
|
@@ -1083,7 +1135,19 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1083
1135
|
color={STATUS_ICON_COLOR_MAP[status.type]}
|
|
1084
1136
|
/>
|
|
1085
1137
|
) : (
|
|
1086
|
-
<Icon
|
|
1138
|
+
<Icon
|
|
1139
|
+
icon="chevronDown"
|
|
1140
|
+
size="sm"
|
|
1141
|
+
color="inherit"
|
|
1142
|
+
// Stable theme target on the chevron glyph itself, so a theme can
|
|
1143
|
+
// restyle just this icon (color, size, hover) — and its
|
|
1144
|
+
// open/closed state — via `defineTheme`. Same-element rules in
|
|
1145
|
+
// @layer astryx-theme win over the icon's own base color/size,
|
|
1146
|
+
// which a button-level target could not reach.
|
|
1147
|
+
{...themeProps('selector-indicator-icon', {
|
|
1148
|
+
state: popover.isOpen ? 'expanded' : 'collapsed',
|
|
1149
|
+
})}
|
|
1150
|
+
/>
|
|
1087
1151
|
)}
|
|
1088
1152
|
</span>
|
|
1089
1153
|
</div>
|
|
@@ -1150,6 +1214,7 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1150
1214
|
}
|
|
1151
1215
|
: undefined
|
|
1152
1216
|
}
|
|
1217
|
+
statusVariant={statusVariant}
|
|
1153
1218
|
labelTooltip={labelTooltip}
|
|
1154
1219
|
width={width}>
|
|
1155
1220
|
{selectorContent}
|
package/src/Selector/hooks.ts
CHANGED
|
@@ -318,6 +318,23 @@ export function useCombobox({
|
|
|
318
318
|
}
|
|
319
319
|
break;
|
|
320
320
|
|
|
321
|
+
// PageUp/PageDown mirror Home/End. In search mode Home/End stay on
|
|
322
|
+
// the input for caret movement (APG editable combobox), so these are
|
|
323
|
+
// the sanctioned substitute for jumping to the first/last option.
|
|
324
|
+
case 'PageUp':
|
|
325
|
+
e.preventDefault();
|
|
326
|
+
if (isOpen && enabledIndices.length > 0) {
|
|
327
|
+
setHighlightedIndex(enabledIndices[0]);
|
|
328
|
+
}
|
|
329
|
+
break;
|
|
330
|
+
|
|
331
|
+
case 'PageDown':
|
|
332
|
+
e.preventDefault();
|
|
333
|
+
if (isOpen && enabledIndices.length > 0) {
|
|
334
|
+
setHighlightedIndex(enabledIndices[enabledIndices.length - 1]);
|
|
335
|
+
}
|
|
336
|
+
break;
|
|
337
|
+
|
|
321
338
|
case 'Delete':
|
|
322
339
|
case 'Backspace':
|
|
323
340
|
// Keyboard equivalent of the clear button (comboboxes-2): clear the
|