@astryxdesign/core 0.1.9 → 0.2.0-canary.0e01213
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 +107 -0
- package/dist/Avatar/Avatar.d.ts +42 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +190 -59
- package/dist/Avatar/AvatarStatusDot.d.ts +6 -4
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- 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 +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -2
- package/dist/Banner/Banner.js +2 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -4
- package/dist/Breadcrumbs/index.d.ts +1 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +2 -1
- package/dist/Button/Button.d.ts +1 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +6 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +50 -9
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +2 -2
- 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.js +1 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +22 -12
- package/dist/Center/Center.d.ts +20 -3
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +10 -2
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +3 -1
- package/dist/Chat/ChatLayout.d.ts +7 -0
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +16 -5
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +8 -8
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +10 -3
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -6
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +19 -4
- 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/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +16 -10
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +42 -3
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +23 -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 +10 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +33 -19
- 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 +23 -18
- package/dist/Divider/Divider.d.ts +2 -2
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +13 -0
- 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 +18 -12
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +42 -64
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +10 -3
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +435 -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 +24 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +34 -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 +27 -10
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +4 -1
- package/dist/Field/FieldLabel.d.ts +2 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -5
- 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 +10 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +51 -5
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +93 -65
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +3 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +10 -4
- package/dist/Icon/Icon.d.ts +15 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +16 -3
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +31 -6
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +10 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +34 -15
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +6 -3
- package/dist/List/ListItem.d.ts +11 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +2 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MetadataList/MetadataList.d.ts +1 -1
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +4 -2
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +87 -45
- 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.js +2 -2
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- 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/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +6 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +49 -19
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -3
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +72 -19
- 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/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +2 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +87 -34
- package/dist/Spinner/Spinner.d.ts +3 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +11 -2
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +171 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabList.d.ts +2 -11
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +5 -9
- package/dist/TabList/TabListContext.d.ts +0 -5
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +0 -5
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +30 -4
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- 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 +18 -3
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +58 -30
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +15 -7
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +65 -25
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Text/Text.d.ts +10 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +25 -2
- package/dist/Text/index.d.ts +2 -2
- package/dist/Text/index.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +119 -52
- 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.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +51 -45
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +17 -17
- package/dist/Timestamp/Timestamp.d.ts +31 -3
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +48 -77
- package/dist/Timestamp/formatInstant.d.ts +41 -0
- package/dist/Timestamp/formatInstant.d.ts.map +1 -0
- package/dist/Timestamp/formatInstant.js +177 -0
- package/dist/Timestamp/index.d.ts +1 -0
- package/dist/Timestamp/index.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.d.ts +56 -0
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -0
- package/dist/Timestamp/tooltipEntries.js +163 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +61 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +3 -1
- package/dist/Token/Token.d.ts +34 -4
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +85 -45
- package/dist/Token/TokenLink.d.ts +62 -0
- package/dist/Token/TokenLink.d.ts.map +1 -0
- package/dist/Token/TokenLink.js +76 -0
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +9 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavItem.d.ts +3 -1
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +30 -3
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +9 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +1 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +8 -6
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +32 -14
- package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +22 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +11 -2
- 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 +115 -35
- package/dist/astryx.umd.js +51 -51
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.pool.stylex.d.ts +281 -0
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.pool.stylex.js +281 -0
- package/dist/hooks/index.d.ts +4 -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/useAnnounce.d.ts +3 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +39 -1
- package/dist/hooks/useContainerReveal.d.ts +83 -0
- package/dist/hooks/useContainerReveal.d.ts.map +1 -0
- package/dist/hooks/useContainerReveal.js +123 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +52 -11
- 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/useHotkeys.d.ts +9 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +9 -0
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +169 -0
- package/dist/hooks/useKeyboardHint.d.ts +1 -1
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +4 -2
- 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/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/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/defineTheme.d.ts +6 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/expandColorScale.d.ts +19 -2
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +38 -10
- package/dist/theme/index.d.ts +3 -3
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/types.d.ts +39 -2
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/plainDate.d.ts +17 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +23 -4
- 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/locales/en.json +120 -0
- package/locales/pseudo.json +90 -0
- package/package.json +8 -3
- package/src/Avatar/Avatar.doc.mjs +50 -3
- package/src/Avatar/Avatar.test.tsx +218 -0
- package/src/Avatar/Avatar.tsx +285 -79
- package/src/Avatar/AvatarStatusDot.doc.mjs +4 -4
- package/src/Avatar/AvatarStatusDot.tsx +6 -4
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +162 -2
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -2
- package/src/Banner/Banner.tsx +6 -6
- package/src/Breadcrumbs/BreadcrumbItem.tsx +10 -10
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +52 -1
- package/src/Breadcrumbs/index.ts +4 -0
- package/src/Button/Button.doc.mjs +0 -4
- package/src/Button/Button.test.tsx +16 -0
- package/src/Button/Button.tsx +6 -4
- package/src/Calendar/Calendar.test.tsx +170 -20
- package/src/Calendar/Calendar.tsx +73 -16
- package/src/Calendar/dayCellUtils.test.ts +18 -18
- package/src/Calendar/dayCellUtils.ts +2 -2
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.tsx +1 -1
- package/src/Carousel/Carousel.tsx +25 -6
- package/src/Center/Center.doc.mjs +38 -0
- package/src/Center/Center.test.tsx +75 -0
- package/src/Center/Center.tsx +37 -2
- package/src/Chat/ChatComposer.doc.mjs +2 -2
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.tsx +2 -2
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayout.test.tsx +57 -0
- package/src/Chat/ChatLayout.tsx +26 -5
- package/src/Chat/ChatMessageBubble.tsx +15 -10
- package/src/Chat/ChatSystemMessage.test.tsx +5 -0
- package/src/Chat/ChatToolCalls.tsx +9 -2
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +23 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +94 -3
- package/src/CheckboxList/CheckboxListItem.tsx +17 -10
- 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/CodeBlock/CodeBlock.test.tsx +17 -0
- package/src/CodeBlock/CodeBlock.tsx +38 -11
- 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.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +41 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +59 -2
- package/src/ContextMenu/ContextMenu.tsx +22 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +25 -0
- package/src/DateInput/DateInput.test.tsx +230 -0
- package/src/DateInput/DateInput.tsx +51 -29
- 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 +112 -0
- package/src/DateTimeInput/DateTimeInput.tsx +44 -39
- package/src/Divider/Divider.test.tsx +32 -8
- package/src/Divider/Divider.tsx +14 -1
- package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +95 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +49 -66
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +4 -12
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +19 -4
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +84 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +680 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +569 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +40 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +40 -14
- package/src/Field/Field.doc.mjs +4 -0
- package/src/Field/Field.tsx +14 -9
- package/src/Field/FieldLabel.test.tsx +25 -0
- package/src/Field/FieldLabel.tsx +12 -3
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +1 -0
- package/src/FieldStatus/FieldStatus.test.tsx +133 -0
- package/src/FieldStatus/FieldStatus.tsx +61 -4
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +104 -13
- package/src/FileInput/FileInput.tsx +106 -79
- package/src/Heading/Heading.tsx +2 -1
- package/src/HoverCard/useHoverCard.tsx +15 -3
- package/src/Icon/Icon.doc.mjs +13 -0
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +51 -3
- package/src/Item/Item.doc.mjs +5 -0
- package/src/Item/Item.test.tsx +88 -0
- package/src/Item/Item.tsx +57 -11
- package/src/Layer/layerAnimations.stylex.ts +23 -0
- package/src/Lightbox/Lightbox.test.tsx +33 -0
- package/src/Lightbox/Lightbox.tsx +30 -10
- package/src/List/List.test.tsx +17 -29
- package/src/List/List.tsx +6 -1
- package/src/List/ListItem.doc.mjs +12 -0
- package/src/List/ListItem.tsx +13 -0
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MetadataList/MetadataList.test.tsx +24 -0
- package/src/MetadataList/MetadataList.tsx +6 -2
- package/src/MultiSelector/MultiSelector.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.test.tsx +436 -0
- package/src/MultiSelector/MultiSelector.tsx +133 -67
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +71 -0
- package/src/NumberInput/NumberInput.tsx +35 -26
- package/src/Outline/Outline.test.tsx +12 -12
- package/src/Outline/Outline.tsx +2 -2
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +23 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/ProgressBar/ProgressBar.test.tsx +34 -0
- package/src/ProgressBar/ProgressBar.tsx +16 -1
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.test.tsx +26 -4
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +12 -5
- package/src/Resizable/ResizeHandle.test.tsx +94 -0
- package/src/Resizable/ResizeHandle.tsx +70 -20
- package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +22 -2
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +400 -0
- package/src/Selector/Selector.tsx +95 -23
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +9 -7
- package/src/SideNav/SideNavItem.tsx +5 -3
- package/src/Skeleton/Skeleton.test.tsx +16 -0
- package/src/Skeleton/Skeleton.tsx +13 -1
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +240 -12
- package/src/Slider/Slider.tsx +96 -23
- package/src/Spinner/Spinner.test.tsx +10 -8
- package/src/Spinner/Spinner.tsx +15 -5
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +111 -0
- package/src/Switch/Switch.tsx +149 -32
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabList.doc.mjs +0 -6
- package/src/TabList/TabList.test.tsx +3 -15
- package/src/TabList/TabList.tsx +6 -17
- package/src/TabList/TabListContext.ts +0 -6
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +34 -2
- 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/plugins/groupedRows/useTableGroupedRows.tsx +9 -6
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +48 -21
- package/src/Table/plugins/selection/useTableSelection.test.tsx +61 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +3 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +38 -9
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +161 -2
- package/src/Table/plugins/tree/useTableTreeData.tsx +71 -14
- package/src/Table/types.ts +33 -0
- package/src/Table/useTableRowExpansion.doc.mjs +55 -2
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableTreeData.doc.mjs +9 -0
- package/src/Text/Heading.doc.mjs +3 -3
- package/src/Text/Text.doc.mjs +1 -1
- package/src/Text/Text.test.tsx +42 -0
- package/src/Text/Text.tsx +25 -1
- package/src/Text/index.ts +2 -6
- package/src/TextArea/TextArea.doc.mjs +23 -2
- package/src/TextArea/TextArea.test.tsx +132 -4
- package/src/TextArea/TextArea.tsx +161 -67
- 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 +1 -1
- package/src/Thumbnail/Thumbnail.test.tsx +24 -1
- package/src/Thumbnail/Thumbnail.tsx +28 -35
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +23 -0
- package/src/TimeInput/TimeInput.tsx +24 -25
- package/src/Timestamp/Timestamp.doc.mjs +32 -6
- package/src/Timestamp/Timestamp.test.tsx +371 -0
- package/src/Timestamp/Timestamp.tsx +96 -93
- package/src/Timestamp/formatInstant.ts +218 -0
- package/src/Timestamp/index.ts +4 -0
- package/src/Timestamp/tooltipEntries.test.ts +552 -0
- package/src/Timestamp/tooltipEntries.ts +210 -0
- package/src/Toast/ToastViewport.test.tsx +218 -8
- package/src/Toast/ToastViewport.tsx +71 -12
- package/src/ToggleButton/ToggleButton.test.tsx +24 -0
- package/src/ToggleButton/ToggleButton.tsx +19 -1
- package/src/Token/Token.test.tsx +166 -15
- package/src/Token/Token.tsx +104 -47
- package/src/Token/TokenLink.tsx +107 -0
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +23 -1
- package/src/Tokenizer/Tokenizer.test.tsx +23 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +93 -2
- package/src/TopNav/TopNavItem.doc.mjs +3 -3
- package/src/TopNav/TopNavItem.tsx +35 -6
- package/src/TopNav/TopNavMegaMenu.tsx +26 -2
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
- package/src/TreeList/TreeList.doc.mjs +6 -0
- package/src/TreeList/TreeList.test.tsx +50 -10
- package/src/TreeList/TreeList.tsx +5 -0
- package/src/TreeList/TreeListBranches.tsx +8 -6
- package/src/TreeList/TreeListItem.tsx +33 -11
- package/src/Typeahead/BaseTypeahead.tsx +42 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +112 -0
- package/src/Typeahead/Typeahead.tsx +17 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/babelPluginAddExtensions.test.ts +190 -0
- package/src/__tests__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/doc-mjs.d.ts +19 -0
- package/src/hooks/containerReveal.pool.stylex.ts +464 -0
- package/src/hooks/index.ts +13 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useAnnounce.test.tsx +75 -2
- package/src/hooks/useAnnounce.ts +47 -1
- package/src/hooks/useContainerReveal.test.tsx +116 -0
- package/src/hooks/useContainerReveal.ts +180 -0
- package/src/hooks/useFocusTrap.test.tsx +104 -0
- package/src/hooks/useFocusTrap.ts +61 -12
- 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/useHotkeys.ts +9 -0
- package/src/hooks/useInputStatusIcon.test.tsx +221 -0
- package/src/hooks/useInputStatusIcon.tsx +235 -0
- package/src/hooks/useKeyboardHint.test.tsx +22 -0
- package/src/hooks/useKeyboardHint.tsx +6 -2
- 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/i18n/InternationalizationContext.ts +4 -0
- 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/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/defineTheme.ts +6 -0
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/expandColorScale.test.ts +144 -0
- package/src/theme/expandColorScale.ts +53 -15
- package/src/theme/generateThemeRules.test.ts +42 -0
- package/src/theme/index.ts +4 -8
- package/src/theme/types.ts +43 -13
- package/src/utils/index.ts +2 -0
- package/src/utils/plainDate.test.ts +24 -6
- package/src/utils/plainDate.ts +18 -4
- package/src/utils/rtlStyles.ts +27 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +0 -9
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +0 -1
- package/dist/Thumbnail/thumbnail.markers.stylex.js +0 -14
- package/src/Thumbnail/thumbnail.markers.stylex.ts +0 -12
|
@@ -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"]');
|
|
@@ -610,6 +613,28 @@ describe('Selector', () => {
|
|
|
610
613
|
expect(within(listbox).getByText('No results found')).toBeInTheDocument();
|
|
611
614
|
});
|
|
612
615
|
|
|
616
|
+
it('empty-state message is not exposed as a listbox child', async () => {
|
|
617
|
+
const user = userEvent.setup();
|
|
618
|
+
render(
|
|
619
|
+
<Selector
|
|
620
|
+
label="Fruit"
|
|
621
|
+
options={OPTIONS}
|
|
622
|
+
value="Apple"
|
|
623
|
+
onChange={() => {}}
|
|
624
|
+
hasSearch
|
|
625
|
+
/>,
|
|
626
|
+
);
|
|
627
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
628
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
629
|
+
|
|
630
|
+
// role="listbox" only permits option/group children — the visual
|
|
631
|
+
// empty-state message must be presentational (it is announced through
|
|
632
|
+
// the result-count live region instead).
|
|
633
|
+
const listbox = screen.getByRole('listbox', h);
|
|
634
|
+
const empty = within(listbox).getByText('No results found');
|
|
635
|
+
expect(empty).toHaveAttribute('role', 'presentation');
|
|
636
|
+
});
|
|
637
|
+
|
|
613
638
|
it('calls onChange when selecting a filtered option', async () => {
|
|
614
639
|
const user = userEvent.setup();
|
|
615
640
|
const onChange = vi.fn();
|
|
@@ -746,6 +771,119 @@ describe('Selector', () => {
|
|
|
746
771
|
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
747
772
|
});
|
|
748
773
|
});
|
|
774
|
+
|
|
775
|
+
describe('grouped search', () => {
|
|
776
|
+
const GROUPED = [
|
|
777
|
+
{
|
|
778
|
+
type: 'section' as const,
|
|
779
|
+
title: 'Citrus',
|
|
780
|
+
options: [
|
|
781
|
+
{value: 'orange', label: 'Orange'},
|
|
782
|
+
{value: 'lemon', label: 'Lemon'},
|
|
783
|
+
],
|
|
784
|
+
},
|
|
785
|
+
{
|
|
786
|
+
type: 'section' as const,
|
|
787
|
+
title: 'Berries',
|
|
788
|
+
options: [
|
|
789
|
+
{value: 'strawberry', label: 'Strawberry'},
|
|
790
|
+
{value: 'blueberry', label: 'Blueberry'},
|
|
791
|
+
],
|
|
792
|
+
},
|
|
793
|
+
];
|
|
794
|
+
|
|
795
|
+
it('keeps the group header above matching items while searching', 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
|
+
// "orange" only matches within the Citrus group.
|
|
807
|
+
await user.type(screen.getByRole('combobox', h), 'orange');
|
|
808
|
+
|
|
809
|
+
expect(
|
|
810
|
+
screen.getByRole('group', {name: 'Citrus', ...h}),
|
|
811
|
+
).toBeInTheDocument();
|
|
812
|
+
const options = screen.getAllByRole('option', h);
|
|
813
|
+
expect(options).toHaveLength(1);
|
|
814
|
+
expect(options[0]).toHaveTextContent('Orange');
|
|
815
|
+
});
|
|
816
|
+
|
|
817
|
+
it('hides a group whose items have no match', async () => {
|
|
818
|
+
const user = userEvent.setup();
|
|
819
|
+
render(
|
|
820
|
+
<Selector
|
|
821
|
+
label="Fruit"
|
|
822
|
+
options={GROUPED}
|
|
823
|
+
onChange={() => {}}
|
|
824
|
+
hasSearch
|
|
825
|
+
/>,
|
|
826
|
+
);
|
|
827
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
828
|
+
// "berry" only matches items inside the Berries group.
|
|
829
|
+
await user.type(screen.getByRole('combobox', h), 'berry');
|
|
830
|
+
|
|
831
|
+
expect(
|
|
832
|
+
screen.getByRole('group', {name: 'Berries', ...h}),
|
|
833
|
+
).toBeInTheDocument();
|
|
834
|
+
expect(
|
|
835
|
+
screen.queryByRole('group', {name: 'Citrus', ...h}),
|
|
836
|
+
).not.toBeInTheDocument();
|
|
837
|
+
expect(screen.getAllByRole('option', h)).toHaveLength(2);
|
|
838
|
+
});
|
|
839
|
+
|
|
840
|
+
it('lands keyboard focus on the correct option after filtering', async () => {
|
|
841
|
+
const user = userEvent.setup();
|
|
842
|
+
render(
|
|
843
|
+
<Selector
|
|
844
|
+
label="Fruit"
|
|
845
|
+
options={GROUPED}
|
|
846
|
+
onChange={() => {}}
|
|
847
|
+
hasSearch
|
|
848
|
+
/>,
|
|
849
|
+
);
|
|
850
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
851
|
+
const search = screen.getByRole('combobox', h);
|
|
852
|
+
// "berry" leaves Strawberry, Blueberry (in that document order).
|
|
853
|
+
await user.type(search, 'berry');
|
|
854
|
+
const options = screen.getAllByRole('option', h);
|
|
855
|
+
expect(options.map(o => o.textContent)).toEqual([
|
|
856
|
+
'Strawberry',
|
|
857
|
+
'Blueberry',
|
|
858
|
+
]);
|
|
859
|
+
await user.keyboard('{ArrowDown}');
|
|
860
|
+
expect(search).toHaveAttribute('aria-activedescendant', options[0].id);
|
|
861
|
+
await user.keyboard('{ArrowDown}');
|
|
862
|
+
expect(search).toHaveAttribute('aria-activedescendant', options[1].id);
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
it('shows the empty state when no group has a match', async () => {
|
|
866
|
+
const user = userEvent.setup();
|
|
867
|
+
render(
|
|
868
|
+
<Selector
|
|
869
|
+
label="Fruit"
|
|
870
|
+
options={GROUPED}
|
|
871
|
+
onChange={() => {}}
|
|
872
|
+
hasSearch
|
|
873
|
+
/>,
|
|
874
|
+
);
|
|
875
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
876
|
+
await user.type(screen.getByRole('combobox', h), 'zzz');
|
|
877
|
+
expect(screen.queryAllByRole('option', h)).toHaveLength(0);
|
|
878
|
+
expect(
|
|
879
|
+
screen.queryByRole('group', {name: 'Citrus', ...h}),
|
|
880
|
+
).not.toBeInTheDocument();
|
|
881
|
+
const listbox = screen.getByRole('listbox', h);
|
|
882
|
+
expect(
|
|
883
|
+
within(listbox).getByText('No results found'),
|
|
884
|
+
).toBeInTheDocument();
|
|
885
|
+
});
|
|
886
|
+
});
|
|
749
887
|
});
|
|
750
888
|
|
|
751
889
|
describe('keyboard accessibility', () => {
|
|
@@ -1073,3 +1211,265 @@ describe('Selector', () => {
|
|
|
1073
1211
|
});
|
|
1074
1212
|
});
|
|
1075
1213
|
});
|
|
1214
|
+
|
|
1215
|
+
describe('Selector statusVariant forwarding', () => {
|
|
1216
|
+
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
1217
|
+
const {container} = render(
|
|
1218
|
+
<Selector
|
|
1219
|
+
label="Fruit"
|
|
1220
|
+
options={['Apple', 'Banana']}
|
|
1221
|
+
status={{type: 'error', message: 'Required'}}
|
|
1222
|
+
/>,
|
|
1223
|
+
);
|
|
1224
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
1225
|
+
'data-variant',
|
|
1226
|
+
'attached',
|
|
1227
|
+
);
|
|
1228
|
+
});
|
|
1229
|
+
|
|
1230
|
+
it('forwards statusVariant="detached" to the underlying Field status', () => {
|
|
1231
|
+
const {container} = render(
|
|
1232
|
+
<Selector
|
|
1233
|
+
label="Fruit"
|
|
1234
|
+
options={['Apple', 'Banana']}
|
|
1235
|
+
status={{type: 'error', message: 'Required'}}
|
|
1236
|
+
statusVariant="detached"
|
|
1237
|
+
/>,
|
|
1238
|
+
);
|
|
1239
|
+
expect(container.querySelector('.astryx-field-status')).toHaveAttribute(
|
|
1240
|
+
'data-variant',
|
|
1241
|
+
'detached',
|
|
1242
|
+
);
|
|
1243
|
+
});
|
|
1244
|
+
|
|
1245
|
+
it('keeps the on-field status icon for the attached variant', () => {
|
|
1246
|
+
const {container} = render(
|
|
1247
|
+
<Selector
|
|
1248
|
+
label="Fruit"
|
|
1249
|
+
options={['Apple', 'Banana']}
|
|
1250
|
+
status={{type: 'error', message: 'Required'}}
|
|
1251
|
+
/>,
|
|
1252
|
+
);
|
|
1253
|
+
// Attached: the status glyph replaces the chevron indicator on the field.
|
|
1254
|
+
expect(
|
|
1255
|
+
container.querySelector('.astryx-selector-indicator-icon'),
|
|
1256
|
+
).toBeNull();
|
|
1257
|
+
});
|
|
1258
|
+
|
|
1259
|
+
it('suppresses the on-field status icon for the detached variant', () => {
|
|
1260
|
+
const {container} = render(
|
|
1261
|
+
<Selector
|
|
1262
|
+
label="Fruit"
|
|
1263
|
+
options={['Apple', 'Banana']}
|
|
1264
|
+
status={{type: 'error', message: 'Required'}}
|
|
1265
|
+
statusVariant="detached"
|
|
1266
|
+
/>,
|
|
1267
|
+
);
|
|
1268
|
+
// Detached: the message box below carries its own leading icon, so the
|
|
1269
|
+
// field keeps its chevron indicator rather than duplicating the glyph.
|
|
1270
|
+
expect(
|
|
1271
|
+
container.querySelector('.astryx-selector-indicator-icon'),
|
|
1272
|
+
).not.toBeNull();
|
|
1273
|
+
});
|
|
1274
|
+
});
|
|
1275
|
+
|
|
1276
|
+
describe('Selector clear icon theme target', () => {
|
|
1277
|
+
// Resolve the clear glyph span (the astryx-icon element inside the clear
|
|
1278
|
+
// button), independent of the theme target class.
|
|
1279
|
+
const getClearIcon = (): HTMLElement => {
|
|
1280
|
+
const button = screen.getByRole('button', {name: 'Clear Fruit'});
|
|
1281
|
+
const icon = button.querySelector('.astryx-icon');
|
|
1282
|
+
if (icon == null) {
|
|
1283
|
+
throw new Error('clear icon not found');
|
|
1284
|
+
}
|
|
1285
|
+
return icon as HTMLElement;
|
|
1286
|
+
};
|
|
1287
|
+
|
|
1288
|
+
it('renders the astryx-selector-clear-icon target on the clear glyph', () => {
|
|
1289
|
+
render(
|
|
1290
|
+
<Selector
|
|
1291
|
+
label="Fruit"
|
|
1292
|
+
options={OPTIONS}
|
|
1293
|
+
value="Banana"
|
|
1294
|
+
onChange={() => {}}
|
|
1295
|
+
hasClear
|
|
1296
|
+
/>,
|
|
1297
|
+
);
|
|
1298
|
+
// The stable theme target lands on the icon element itself (not the
|
|
1299
|
+
// button), so a theme can restyle just this glyph (color, size, hover)
|
|
1300
|
+
// via `defineTheme` — a button-level target could not reach the icon's
|
|
1301
|
+
// own color/size.
|
|
1302
|
+
const icon = getClearIcon();
|
|
1303
|
+
expect(icon).toHaveClass('astryx-selector-clear-icon');
|
|
1304
|
+
expect(icon).toHaveClass('astryx-icon');
|
|
1305
|
+
});
|
|
1306
|
+
|
|
1307
|
+
it('keeps the clear button functional alongside the target', () => {
|
|
1308
|
+
const onChange = vi.fn();
|
|
1309
|
+
render(
|
|
1310
|
+
<Selector
|
|
1311
|
+
label="Fruit"
|
|
1312
|
+
options={OPTIONS}
|
|
1313
|
+
value="Banana"
|
|
1314
|
+
onChange={onChange}
|
|
1315
|
+
hasClear
|
|
1316
|
+
/>,
|
|
1317
|
+
);
|
|
1318
|
+
const clear = screen.getByRole('button', {name: 'Clear Fruit'});
|
|
1319
|
+
expect(clear.tagName).toBe('BUTTON');
|
|
1320
|
+
fireEvent.click(clear);
|
|
1321
|
+
expect(onChange).toHaveBeenCalledWith(null);
|
|
1322
|
+
});
|
|
1323
|
+
|
|
1324
|
+
it('renders the default icon (secondary color, sm size) byte-identically', () => {
|
|
1325
|
+
// Pixel-identical default guard: the clear glyph must carry the exact same
|
|
1326
|
+
// StyleX color/size classes as a standalone secondary/sm icon. The added
|
|
1327
|
+
// target class is purely additive — it changes nothing until a theme
|
|
1328
|
+
// targets it.
|
|
1329
|
+
render(
|
|
1330
|
+
<Selector
|
|
1331
|
+
label="Fruit"
|
|
1332
|
+
options={OPTIONS}
|
|
1333
|
+
value="Banana"
|
|
1334
|
+
onChange={() => {}}
|
|
1335
|
+
hasClear
|
|
1336
|
+
/>,
|
|
1337
|
+
);
|
|
1338
|
+
const icon = getClearIcon();
|
|
1339
|
+
|
|
1340
|
+
const {container: refContainer} = render(
|
|
1341
|
+
<Icon icon="close" size="sm" color="secondary" />,
|
|
1342
|
+
);
|
|
1343
|
+
const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
|
|
1344
|
+
|
|
1345
|
+
const styleClasses = (el: HTMLElement) =>
|
|
1346
|
+
el.className
|
|
1347
|
+
.split(' ')
|
|
1348
|
+
.filter(c => c !== 'astryx-selector-clear-icon')
|
|
1349
|
+
.sort();
|
|
1350
|
+
|
|
1351
|
+
expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
|
|
1352
|
+
});
|
|
1353
|
+
|
|
1354
|
+
it('exposes selector-clear-icon so a theme reaches the icon color, size, and hover', () => {
|
|
1355
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertion above
|
|
1356
|
+
// (target lands on the icon element) plus this generation assertion (the
|
|
1357
|
+
// theme emits same-element icon rules in @layer astryx-theme) together
|
|
1358
|
+
// prove the seam: a same-element theme rule wins over the icon's own
|
|
1359
|
+
// base-layer color/size.
|
|
1360
|
+
const theme = defineTheme({
|
|
1361
|
+
name: 'selector-clear-icon-test',
|
|
1362
|
+
components: {
|
|
1363
|
+
'selector-clear-icon': {
|
|
1364
|
+
base: {
|
|
1365
|
+
width: '12px',
|
|
1366
|
+
height: '12px',
|
|
1367
|
+
fontSize: '12px',
|
|
1368
|
+
color: 'var(--color-icon-secondary)',
|
|
1369
|
+
':hover': {color: 'var(--color-icon-primary)'},
|
|
1370
|
+
},
|
|
1371
|
+
},
|
|
1372
|
+
},
|
|
1373
|
+
});
|
|
1374
|
+
const css = generateThemeCSSFlat(theme);
|
|
1375
|
+
expect(css).toContain('.astryx-selector-clear-icon {');
|
|
1376
|
+
expect(css).toContain('width: 12px');
|
|
1377
|
+
expect(css).toContain('height: 12px');
|
|
1378
|
+
expect(css).toContain('.astryx-selector-clear-icon:hover {');
|
|
1379
|
+
expect(css).toContain('color: var(--color-icon-primary)');
|
|
1380
|
+
});
|
|
1381
|
+
});
|
|
1382
|
+
|
|
1383
|
+
describe('Selector indicator (chevron) icon theme target', () => {
|
|
1384
|
+
const getIndicatorIcon = (container: HTMLElement): HTMLElement => {
|
|
1385
|
+
// The chevron is the only glyph carrying the indicator target class.
|
|
1386
|
+
const icon = container.querySelector('.astryx-selector-indicator-icon');
|
|
1387
|
+
if (icon == null) {
|
|
1388
|
+
throw new Error('indicator icon not found');
|
|
1389
|
+
}
|
|
1390
|
+
return icon as HTMLElement;
|
|
1391
|
+
};
|
|
1392
|
+
|
|
1393
|
+
it('renders the astryx-selector-indicator-icon target on the chevron glyph', () => {
|
|
1394
|
+
const {container} = render(
|
|
1395
|
+
<Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
|
|
1396
|
+
);
|
|
1397
|
+
// The stable theme target lands on the icon element itself (not the trigger
|
|
1398
|
+
// button), so a theme can restyle just this glyph (color, size, hover) —
|
|
1399
|
+
// and each open/closed state — via `defineTheme`. A button-level target
|
|
1400
|
+
// could not reach the icon's own color/size.
|
|
1401
|
+
const icon = getIndicatorIcon(container);
|
|
1402
|
+
expect(icon).toHaveClass('astryx-selector-indicator-icon');
|
|
1403
|
+
expect(icon).toHaveClass('astryx-icon');
|
|
1404
|
+
// Open/closed state is reflected so a theme can target each state alone.
|
|
1405
|
+
expect(icon).toHaveAttribute('data-state', 'collapsed');
|
|
1406
|
+
});
|
|
1407
|
+
|
|
1408
|
+
it('reflects the expanded state on the chevron when the popover is open', async () => {
|
|
1409
|
+
const user = userEvent.setup();
|
|
1410
|
+
const {container} = render(
|
|
1411
|
+
<Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
|
|
1412
|
+
);
|
|
1413
|
+
await user.click(screen.getByRole('combobox'));
|
|
1414
|
+
await waitFor(() => {
|
|
1415
|
+
expect(getIndicatorIcon(container)).toHaveAttribute(
|
|
1416
|
+
'data-state',
|
|
1417
|
+
'expanded',
|
|
1418
|
+
);
|
|
1419
|
+
});
|
|
1420
|
+
});
|
|
1421
|
+
|
|
1422
|
+
it('renders the default icon (inherit color, sm size) byte-identically', () => {
|
|
1423
|
+
// Pixel-identical default guard: the chevron glyph must carry the exact
|
|
1424
|
+
// same StyleX color/size classes as a standalone inherit/sm icon. The added
|
|
1425
|
+
// target class + data-state are purely additive — they change nothing until
|
|
1426
|
+
// a theme targets them.
|
|
1427
|
+
const {container} = render(
|
|
1428
|
+
<Selector label="Fruit" options={OPTIONS} onChange={() => {}} />,
|
|
1429
|
+
);
|
|
1430
|
+
const icon = getIndicatorIcon(container);
|
|
1431
|
+
|
|
1432
|
+
const {container: refContainer} = render(
|
|
1433
|
+
<Icon icon="chevronDown" size="sm" color="inherit" />,
|
|
1434
|
+
);
|
|
1435
|
+
const refIcon = refContainer.querySelector('.astryx-icon') as HTMLElement;
|
|
1436
|
+
|
|
1437
|
+
// Exclude the additive theme-target classes (the stable target + its
|
|
1438
|
+
// reflected state class) so only the StyleX color/size classes remain.
|
|
1439
|
+
const themeTargetClasses = new Set([
|
|
1440
|
+
'astryx-selector-indicator-icon',
|
|
1441
|
+
'collapsed',
|
|
1442
|
+
'expanded',
|
|
1443
|
+
]);
|
|
1444
|
+
const styleClasses = (el: HTMLElement) =>
|
|
1445
|
+
el.className
|
|
1446
|
+
.split(' ')
|
|
1447
|
+
.filter(c => !themeTargetClasses.has(c))
|
|
1448
|
+
.sort();
|
|
1449
|
+
|
|
1450
|
+
expect(styleClasses(icon)).toEqual(styleClasses(refIcon));
|
|
1451
|
+
});
|
|
1452
|
+
|
|
1453
|
+
it('exposes selector-indicator-icon so a theme reaches the icon size and per-state color', () => {
|
|
1454
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
1455
|
+
// above (target lands on the icon element) plus this generation assertion
|
|
1456
|
+
// (the theme emits same-element icon rules in @layer astryx-theme) together
|
|
1457
|
+
// prove the seam: a same-element theme rule wins over the icon's own
|
|
1458
|
+
// base-layer color/size.
|
|
1459
|
+
const theme = defineTheme({
|
|
1460
|
+
name: 'selector-indicator-icon-test',
|
|
1461
|
+
components: {
|
|
1462
|
+
'selector-indicator-icon': {
|
|
1463
|
+
base: {width: '14px', height: '14px', fontSize: '14px'},
|
|
1464
|
+
'state:expanded': {color: 'var(--color-icon-primary)'},
|
|
1465
|
+
},
|
|
1466
|
+
},
|
|
1467
|
+
});
|
|
1468
|
+
const css = generateThemeCSSFlat(theme);
|
|
1469
|
+
expect(css).toContain('.astryx-selector-indicator-icon {');
|
|
1470
|
+
expect(css).toContain('width: 14px');
|
|
1471
|
+
expect(css).toContain('height: 14px');
|
|
1472
|
+
expect(css).toContain('.astryx-selector-indicator-icon.expanded');
|
|
1473
|
+
expect(css).toContain('color: var(--color-icon-primary)');
|
|
1474
|
+
});
|
|
1475
|
+
});
|
|
@@ -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,
|
|
@@ -938,16 +959,22 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
938
959
|
|
|
939
960
|
// Render all options (handling sections/dividers)
|
|
940
961
|
const renderOptions = useCallback(() => {
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
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
|
+
// role="presentation" keeps the message out of the listbox's
|
|
967
|
+
// accessibility tree (role="listbox" only permits option/group
|
|
968
|
+
// children); the no-results outcome is announced via the
|
|
969
|
+
// result-count live region instead.
|
|
970
|
+
return [
|
|
971
|
+
<div
|
|
972
|
+
key="empty"
|
|
973
|
+
role="presentation"
|
|
974
|
+
{...stylex.props(styles.emptyState)}>
|
|
975
|
+
No results found
|
|
976
|
+
</div>,
|
|
977
|
+
];
|
|
951
978
|
}
|
|
952
979
|
|
|
953
980
|
let flatIndex = 0;
|
|
@@ -957,13 +984,27 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
957
984
|
const option = options[i];
|
|
958
985
|
|
|
959
986
|
if (isDivider(option)) {
|
|
987
|
+
// While searching, a standalone divider between groups would orphan
|
|
988
|
+
// itself once its neighbors are filtered out, so skip it.
|
|
989
|
+
if (isSearching) {
|
|
990
|
+
continue;
|
|
991
|
+
}
|
|
960
992
|
elements.push(<Divider key={`divider-${i}`} xstyle={styles.divider} />);
|
|
961
993
|
} else if (isSection(option)) {
|
|
962
994
|
const sectionItems: ReactNode[] = [];
|
|
963
995
|
for (const opt of option.options) {
|
|
964
|
-
|
|
996
|
+
const normalized = normalizeOption(opt);
|
|
997
|
+
if (isSearching && !optionMatchesQuery(normalized, searchQuery)) {
|
|
998
|
+
continue;
|
|
999
|
+
}
|
|
1000
|
+
sectionItems.push(renderItem(normalized, flatIndex));
|
|
965
1001
|
flatIndex++;
|
|
966
1002
|
}
|
|
1003
|
+
// Hide a group entirely (header + wrapper) when none of its items
|
|
1004
|
+
// match the query, so no header is left standing over nothing.
|
|
1005
|
+
if (sectionItems.length === 0) {
|
|
1006
|
+
continue;
|
|
1007
|
+
}
|
|
967
1008
|
if (option.title) {
|
|
968
1009
|
elements.push(
|
|
969
1010
|
<Divider
|
|
@@ -979,7 +1020,11 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
979
1020
|
</div>,
|
|
980
1021
|
);
|
|
981
1022
|
} else if (isOptionData(option)) {
|
|
982
|
-
|
|
1023
|
+
const normalized = normalizeOption(option);
|
|
1024
|
+
if (isSearching && !optionMatchesQuery(normalized, searchQuery)) {
|
|
1025
|
+
continue;
|
|
1026
|
+
}
|
|
1027
|
+
elements.push(renderItem(normalized, flatIndex));
|
|
983
1028
|
flatIndex++;
|
|
984
1029
|
}
|
|
985
1030
|
}
|
|
@@ -987,6 +1032,10 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
987
1032
|
return elements;
|
|
988
1033
|
}, [options, renderItem, hasSearch, searchQuery, filteredItems]);
|
|
989
1034
|
|
|
1035
|
+
// The detached message box renders its own leading status icon, so the
|
|
1036
|
+
// on-field icon would duplicate it — keep the chevron indicator instead.
|
|
1037
|
+
const showStatusIcon = status != null && statusVariant !== 'detached';
|
|
1038
|
+
|
|
990
1039
|
const selectorContent = (
|
|
991
1040
|
<>
|
|
992
1041
|
<div
|
|
@@ -1008,7 +1057,7 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1008
1057
|
isDisabled && inputWrapperStyles.disabled,
|
|
1009
1058
|
!selectedItem && styles.triggerPlaceholder,
|
|
1010
1059
|
status && inputStatusBorderStyles[status.type],
|
|
1011
|
-
status && inputStatusHoverShadowStyles[status.type],
|
|
1060
|
+
status && !isDisabled && inputStatusHoverShadowStyles[status.type],
|
|
1012
1061
|
inputGroup && groupStyles.inGroup,
|
|
1013
1062
|
xstyle,
|
|
1014
1063
|
),
|
|
@@ -1071,23 +1120,45 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1071
1120
|
onClick={handleClear}
|
|
1072
1121
|
aria-label={t('@astryx.selector.clearLabel', {label})}
|
|
1073
1122
|
{...stylex.props(styles.clearButton)}>
|
|
1074
|
-
<Icon
|
|
1123
|
+
<Icon
|
|
1124
|
+
icon="close"
|
|
1125
|
+
size="sm"
|
|
1126
|
+
color="secondary"
|
|
1127
|
+
// Stable theme target on the clear glyph itself, so a theme can
|
|
1128
|
+
// restyle just this icon (color, size, hover) via `defineTheme`.
|
|
1129
|
+
// Same-element rules in @layer astryx-theme win over the icon's
|
|
1130
|
+
// own base color/size, which a button-level target could not
|
|
1131
|
+
// reach.
|
|
1132
|
+
{...themeProps('selector-clear-icon')}
|
|
1133
|
+
/>
|
|
1075
1134
|
</button>
|
|
1076
1135
|
)}
|
|
1077
1136
|
<span
|
|
1078
1137
|
{...stylex.props(
|
|
1079
1138
|
styles.triggerIcon,
|
|
1080
|
-
!
|
|
1081
|
-
|
|
1139
|
+
!showStatusIcon && popover.isOpen && styles.triggerIconOpen,
|
|
1140
|
+
showStatusIcon && styles.triggerIconStatus,
|
|
1082
1141
|
)}>
|
|
1083
|
-
{
|
|
1142
|
+
{showStatusIcon ? (
|
|
1084
1143
|
<Icon
|
|
1085
1144
|
icon={STATUS_ICON_MAP[status.type]}
|
|
1086
1145
|
size="sm"
|
|
1087
1146
|
color={STATUS_ICON_COLOR_MAP[status.type]}
|
|
1088
1147
|
/>
|
|
1089
1148
|
) : (
|
|
1090
|
-
<Icon
|
|
1149
|
+
<Icon
|
|
1150
|
+
icon="chevronDown"
|
|
1151
|
+
size="sm"
|
|
1152
|
+
color="inherit"
|
|
1153
|
+
// Stable theme target on the chevron glyph itself, so a theme can
|
|
1154
|
+
// restyle just this icon (color, size, hover) — and its
|
|
1155
|
+
// open/closed state — via `defineTheme`. Same-element rules in
|
|
1156
|
+
// @layer astryx-theme win over the icon's own base color/size,
|
|
1157
|
+
// which a button-level target could not reach.
|
|
1158
|
+
{...themeProps('selector-indicator-icon', {
|
|
1159
|
+
state: popover.isOpen ? 'expanded' : 'collapsed',
|
|
1160
|
+
})}
|
|
1161
|
+
/>
|
|
1091
1162
|
)}
|
|
1092
1163
|
</span>
|
|
1093
1164
|
</div>
|
|
@@ -1154,6 +1225,7 @@ export function Selector<T extends SelectorOptionType>(
|
|
|
1154
1225
|
}
|
|
1155
1226
|
: undefined
|
|
1156
1227
|
}
|
|
1228
|
+
statusVariant={statusVariant}
|
|
1157
1229
|
labelTooltip={labelTooltip}
|
|
1158
1230
|
width={width}>
|
|
1159
1231
|
{selectorContent}
|
package/src/SideNav/SideNav.tsx
CHANGED
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
import type {BaseProps} from '../BaseProps';
|
|
32
32
|
import * as stylex from '@stylexjs/stylex';
|
|
33
33
|
import type {StyleXStyles} from '@stylexjs/stylex';
|
|
34
|
-
import {
|
|
34
|
+
import {spacingVars} from '../theme/tokens.stylex';
|
|
35
35
|
import {mergeProps, mergeRefs} from '../utils';
|
|
36
36
|
import {
|
|
37
37
|
SideNavCollapseContext,
|
|
@@ -123,9 +123,6 @@ const styles = stylex.create({
|
|
|
123
123
|
paddingInline: spacingVars['--spacing-2'],
|
|
124
124
|
paddingBlockStart: spacingVars['--spacing-1'],
|
|
125
125
|
paddingBlockEnd: spacingVars['--spacing-2'],
|
|
126
|
-
borderBlockStartWidth: borderVars['--border-width'],
|
|
127
|
-
borderBlockStartStyle: 'solid',
|
|
128
|
-
borderBlockStartColor: colorVars['--color-border'],
|
|
129
126
|
},
|
|
130
127
|
footerRow: {
|
|
131
128
|
display: 'flex',
|
|
@@ -145,7 +142,6 @@ const styles = stylex.create({
|
|
|
145
142
|
alignItems: 'center',
|
|
146
143
|
},
|
|
147
144
|
stickyBottomCollapsed: {
|
|
148
|
-
borderBlockStart: 'none',
|
|
149
145
|
paddingBlockStart: 0,
|
|
150
146
|
},
|
|
151
147
|
// Drawer footer — pushed to bottom of the scrollable content area
|
|
@@ -155,9 +151,6 @@ const styles = stylex.create({
|
|
|
155
151
|
marginBlockStart: 'auto',
|
|
156
152
|
gap: spacingVars['--spacing-2'],
|
|
157
153
|
paddingBlockStart: spacingVars['--spacing-2'],
|
|
158
|
-
borderBlockStartWidth: borderVars['--border-width'],
|
|
159
|
-
borderBlockStartStyle: 'solid',
|
|
160
|
-
borderBlockStartColor: colorVars['--color-border'],
|
|
161
154
|
},
|
|
162
155
|
drawerFooterIcons: {
|
|
163
156
|
display: 'flex',
|