@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
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
11
|
-
import {render, screen, waitFor, fireEvent} from '@testing-library/react';
|
|
11
|
+
import {render, screen, waitFor, fireEvent, act} from '@testing-library/react';
|
|
12
12
|
import {CommandPalette} from './CommandPalette';
|
|
13
13
|
import {createStaticSource} from '@astryxdesign/core/Typeahead';
|
|
14
14
|
import type {SearchSource, SearchableItem} from '@astryxdesign/core/Typeahead';
|
|
15
|
+
import {__resetLiveRegionsForTest} from '../hooks/useAnnounce';
|
|
15
16
|
|
|
16
17
|
const simpleSource = createStaticSource([
|
|
17
18
|
{id: 'home', label: 'Home'},
|
|
@@ -35,6 +36,9 @@ beforeEach(() => {
|
|
|
35
36
|
HTMLDialogElement.prototype.close = vi.fn(function (this: HTMLDialogElement) {
|
|
36
37
|
this.removeAttribute('open');
|
|
37
38
|
});
|
|
39
|
+
// The live regions are module-level singletons; reset them so
|
|
40
|
+
// announcements from one test don't leak into the next.
|
|
41
|
+
__resetLiveRegionsForTest();
|
|
38
42
|
});
|
|
39
43
|
|
|
40
44
|
describe('CommandPalette', () => {
|
|
@@ -269,4 +273,94 @@ describe('CommandPalette', () => {
|
|
|
269
273
|
expect(screen.getByText('No results')).toBeInTheDocument(),
|
|
270
274
|
);
|
|
271
275
|
});
|
|
276
|
+
|
|
277
|
+
describe('screen reader announcements', () => {
|
|
278
|
+
const politeRegion = () =>
|
|
279
|
+
document.querySelector('[data-astryx-live-region="polite"]');
|
|
280
|
+
|
|
281
|
+
it('announces the result count politely after typing a query', async () => {
|
|
282
|
+
render(
|
|
283
|
+
<CommandPalette
|
|
284
|
+
isOpen={true}
|
|
285
|
+
onOpenChange={() => {}}
|
|
286
|
+
searchSource={simpleSource}
|
|
287
|
+
/>,
|
|
288
|
+
);
|
|
289
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
290
|
+
// "e" matches both Home and Settings.
|
|
291
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'e'}});
|
|
292
|
+
await waitFor(() => {
|
|
293
|
+
expect(politeRegion()).toHaveTextContent('2 results');
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it('announces the singular form when one item matches', async () => {
|
|
298
|
+
render(
|
|
299
|
+
<CommandPalette
|
|
300
|
+
isOpen={true}
|
|
301
|
+
onOpenChange={() => {}}
|
|
302
|
+
searchSource={simpleSource}
|
|
303
|
+
/>,
|
|
304
|
+
);
|
|
305
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
306
|
+
// "set" matches only Settings. Anchored so it cannot pass on "1 results".
|
|
307
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'set'}});
|
|
308
|
+
await waitFor(() => {
|
|
309
|
+
expect(politeRegion()).toHaveTextContent(/^1 result$/);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it('announces the empty state with the query when nothing matches', async () => {
|
|
314
|
+
render(
|
|
315
|
+
<CommandPalette
|
|
316
|
+
isOpen={true}
|
|
317
|
+
onOpenChange={() => {}}
|
|
318
|
+
searchSource={simpleSource}
|
|
319
|
+
/>,
|
|
320
|
+
);
|
|
321
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
322
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'zzz'}});
|
|
323
|
+
await waitFor(() => {
|
|
324
|
+
expect(politeRegion()).toHaveTextContent('No results for zzz');
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('announces loading politely while a search is in flight', async () => {
|
|
329
|
+
// A source whose searches never resolve, so the palette stays busy and
|
|
330
|
+
// only the loading announcement can reach the live region.
|
|
331
|
+
const source: SearchSource = {
|
|
332
|
+
bootstrap: () => [],
|
|
333
|
+
async search(): Promise<SearchableItem[]> {
|
|
334
|
+
return new Promise<SearchableItem[]>(() => {});
|
|
335
|
+
},
|
|
336
|
+
};
|
|
337
|
+
render(
|
|
338
|
+
<CommandPalette
|
|
339
|
+
isOpen={true}
|
|
340
|
+
onOpenChange={() => {}}
|
|
341
|
+
searchSource={source}
|
|
342
|
+
/>,
|
|
343
|
+
);
|
|
344
|
+
fireEvent.change(screen.getByRole('combobox'), {target: {value: 'z'}});
|
|
345
|
+
await waitFor(() => {
|
|
346
|
+
expect(politeRegion()).toHaveTextContent('Loading');
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('does not announce on initial open (bootstrap)', async () => {
|
|
351
|
+
render(
|
|
352
|
+
<CommandPalette
|
|
353
|
+
isOpen={true}
|
|
354
|
+
onOpenChange={() => {}}
|
|
355
|
+
searchSource={simpleSource}
|
|
356
|
+
/>,
|
|
357
|
+
);
|
|
358
|
+
await waitFor(() => expect(screen.getByText('Home')).toBeInTheDocument());
|
|
359
|
+
// Flush effects and any pending live-region rAF writes.
|
|
360
|
+
await act(async () => {
|
|
361
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
362
|
+
});
|
|
363
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
364
|
+
});
|
|
365
|
+
});
|
|
272
366
|
});
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
'use client';
|
|
4
4
|
/**
|
|
5
5
|
* @file CommandPalette.tsx
|
|
6
|
-
* @input Uses React, Dialog, Layout, CommandPaletteContext, SearchSource, useCombobox
|
|
6
|
+
* @input Uses React, Dialog, Layout, CommandPaletteContext, SearchSource, useCombobox, useAnnounce
|
|
7
7
|
* @output Exports CommandPalette root component and props
|
|
8
8
|
* @position Core root component; dialog shell with searchSource-driven items
|
|
9
9
|
*
|
|
@@ -36,6 +36,7 @@ import {CommandPaletteInput} from './CommandPaletteInput';
|
|
|
36
36
|
import {CommandPaletteFooter} from './CommandPaletteFooter';
|
|
37
37
|
import {CommandPaletteEmpty} from './CommandPaletteEmpty';
|
|
38
38
|
import type {BaseProps} from '../BaseProps';
|
|
39
|
+
import {useAnnounce} from '../hooks/useAnnounce';
|
|
39
40
|
import {useTranslator} from '../i18n';
|
|
40
41
|
|
|
41
42
|
export interface CommandPaletteProps<
|
|
@@ -291,6 +292,13 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
|
|
|
291
292
|
const isBusy = isPending;
|
|
292
293
|
const searchVersionRef = useRef(0);
|
|
293
294
|
|
|
295
|
+
// Announce search status to screen readers through the shared polite live
|
|
296
|
+
// region (comboboxes-7 announce path, mirroring Selector / BaseTypeahead).
|
|
297
|
+
// The busy spinner and the empty states are otherwise purely visual, so a
|
|
298
|
+
// screen-reader user typing a query would hear nothing when loading starts
|
|
299
|
+
// or results disappear.
|
|
300
|
+
const announce = useAnnounce();
|
|
301
|
+
|
|
294
302
|
const value = controlledValue ?? internalValue;
|
|
295
303
|
|
|
296
304
|
const setValue = useCallback(
|
|
@@ -318,8 +326,12 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
|
|
|
318
326
|
setInternalValue('');
|
|
319
327
|
}
|
|
320
328
|
searchSource.cancel?.();
|
|
329
|
+
// Clear any lingering result / loading announcement when the palette
|
|
330
|
+
// closes so stale status text does not linger in the a11y tree
|
|
331
|
+
// (matching Selector's onHide).
|
|
332
|
+
announce('');
|
|
321
333
|
onOpenChange(false);
|
|
322
|
-
}, [onOpenChange, searchSource, controlledValue]);
|
|
334
|
+
}, [onOpenChange, searchSource, controlledValue, announce]);
|
|
323
335
|
|
|
324
336
|
const selectItem = useCallback(
|
|
325
337
|
(itemValue: string) => {
|
|
@@ -355,6 +367,14 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
|
|
|
355
367
|
startTransition(async () => {
|
|
356
368
|
const isBootstrap = query === '';
|
|
357
369
|
|
|
370
|
+
// Loading started for a user query: tell screen-reader users the
|
|
371
|
+
// spinner appeared. The polite region coalesces rapid updates, so for
|
|
372
|
+
// fast sources the result-count announcement below simply replaces
|
|
373
|
+
// this instead of stacking one "Loading" per keystroke.
|
|
374
|
+
if (!isBootstrap) {
|
|
375
|
+
announce(t('@astryx.commandPalette.loading'));
|
|
376
|
+
}
|
|
377
|
+
|
|
358
378
|
// Client-filter previous results for instant narrowing while fetch is in flight
|
|
359
379
|
if (!isBootstrap && searchResults.length > 0) {
|
|
360
380
|
const lower = query.toLowerCase().trim();
|
|
@@ -377,6 +397,23 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
|
|
|
377
397
|
setOptimisticResults(items);
|
|
378
398
|
setSearchResults(items);
|
|
379
399
|
|
|
400
|
+
// Announce the outcome from the search commit (not a reactive
|
|
401
|
+
// effect), matching Selector / BaseTypeahead: exactly one
|
|
402
|
+
// announcement per committed query, and the version check above
|
|
403
|
+
// already discards stale keystrokes. Bootstrap stays silent — the
|
|
404
|
+
// same role PowerSearch's mount guard plays — so opening the
|
|
405
|
+
// palette announces nothing; clearing the query only clears any
|
|
406
|
+
// lingering status text.
|
|
407
|
+
if (isBootstrap) {
|
|
408
|
+
announce('');
|
|
409
|
+
} else if (items.length === 0) {
|
|
410
|
+
announce(t('@astryx.commandPalette.noResultsFor', {query}));
|
|
411
|
+
} else {
|
|
412
|
+
announce(
|
|
413
|
+
t('@astryx.commandPalette.resultCount', {count: items.length}),
|
|
414
|
+
);
|
|
415
|
+
}
|
|
416
|
+
|
|
380
417
|
// When opening with a preselected value, highlight it once
|
|
381
418
|
// bootstrap results arrive. No value → highlight stays at -1
|
|
382
419
|
// and ArrowDown naturally moves to the first item.
|
|
@@ -396,6 +433,8 @@ export function CommandPalette<T extends SearchableItem = SearchableItem>({
|
|
|
396
433
|
value,
|
|
397
434
|
combobox,
|
|
398
435
|
setOptimisticResults,
|
|
436
|
+
announce,
|
|
437
|
+
t,
|
|
399
438
|
],
|
|
400
439
|
);
|
|
401
440
|
|
|
@@ -136,6 +136,21 @@ describe('ContextMenu', () => {
|
|
|
136
136
|
expect(HTMLElement.prototype.hidePopover).toHaveBeenCalled();
|
|
137
137
|
});
|
|
138
138
|
|
|
139
|
+
it('closes the menu when Tab is pressed inside it (APG menu pattern)', () => {
|
|
140
|
+
render(
|
|
141
|
+
<ContextMenu items={[{label: 'Item 1'}]}>
|
|
142
|
+
<div>Right-click me</div>
|
|
143
|
+
</ContextMenu>,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
fireEvent.contextMenu(screen.getByText('Right-click me'));
|
|
147
|
+
expect(HTMLElement.prototype.showPopover).toHaveBeenCalled();
|
|
148
|
+
|
|
149
|
+
const menu = screen.getByRole('menu', {hidden: true});
|
|
150
|
+
fireEvent.keyDown(menu, {key: 'Tab'});
|
|
151
|
+
expect(HTMLElement.prototype.hidePopover).toHaveBeenCalled();
|
|
152
|
+
});
|
|
153
|
+
|
|
139
154
|
it('ignores Escape during IME composition', () => {
|
|
140
155
|
render(
|
|
141
156
|
<ContextMenu items={[{label: 'Item 1'}]}>
|
|
@@ -552,7 +567,7 @@ describe('ContextMenu selectable items', () => {
|
|
|
552
567
|
<ContextMenuRadioGroup
|
|
553
568
|
value="name"
|
|
554
569
|
onChange={() => {}}
|
|
555
|
-
|
|
570
|
+
label="Sort by">
|
|
556
571
|
<ContextMenuRadioItem value="name" label="Sort by name" />
|
|
557
572
|
<ContextMenuRadioItem value="date" label="Sort by date" />
|
|
558
573
|
</ContextMenuRadioGroup>
|
|
@@ -587,7 +602,7 @@ describe('ContextMenu selectable items', () => {
|
|
|
587
602
|
<ContextMenuRadioGroup
|
|
588
603
|
value="name"
|
|
589
604
|
onChange={onSort}
|
|
590
|
-
|
|
605
|
+
label="Sort by">
|
|
591
606
|
<ContextMenuRadioItem value="name" label="Sort by name" />
|
|
592
607
|
<ContextMenuRadioItem value="date" label="Sort by date" />
|
|
593
608
|
</ContextMenuRadioGroup>
|
|
@@ -803,4 +818,46 @@ describe('ContextMenu keyboard access for menuitemradio/menuitemcheckbox (#3829)
|
|
|
803
818
|
screen.getByRole('menuitemradio', {name: 'Oldest', hidden: true}),
|
|
804
819
|
).toHaveFocus();
|
|
805
820
|
});
|
|
821
|
+
|
|
822
|
+
it('renders a submenu from a nested items array and keyboard-reaches an item after it', () => {
|
|
823
|
+
// Same inline-flyout scoping the DropdownMenu fix covers: the submenu's
|
|
824
|
+
// items must not pollute the ContextMenu's roving order, and an item after
|
|
825
|
+
// the submenu row must stay keyboard-reachable.
|
|
826
|
+
const onDelete = vi.fn();
|
|
827
|
+
render(
|
|
828
|
+
<ContextMenu
|
|
829
|
+
items={[
|
|
830
|
+
{label: 'Cut', onClick: () => {}},
|
|
831
|
+
{
|
|
832
|
+
label: 'Move to',
|
|
833
|
+
items: [
|
|
834
|
+
{label: 'Folder A', onClick: () => {}},
|
|
835
|
+
{label: 'Folder B', onClick: () => {}},
|
|
836
|
+
],
|
|
837
|
+
},
|
|
838
|
+
{type: 'divider'},
|
|
839
|
+
{label: 'Delete', onClick: onDelete},
|
|
840
|
+
]}>
|
|
841
|
+
<div>Right-click me</div>
|
|
842
|
+
</ContextMenu>,
|
|
843
|
+
);
|
|
844
|
+
fireEvent.contextMenu(screen.getByText('Right-click me'));
|
|
845
|
+
// Two role="menu" exist (the context menu + the inline submenu flyout);
|
|
846
|
+
// the context menu is the first in DOM order.
|
|
847
|
+
const menu = screen.getAllByRole('menu', {hidden: true})[0];
|
|
848
|
+
// The submenu trigger renders as a menuitem with aria-haspopup.
|
|
849
|
+
const submenuTrigger = screen.getByRole('menuitem', {
|
|
850
|
+
name: /Move to/,
|
|
851
|
+
hidden: true,
|
|
852
|
+
});
|
|
853
|
+
expect(submenuTrigger).toHaveAttribute('aria-haspopup', 'menu');
|
|
854
|
+
// Cut → Move to → Delete, one step per press (submenu items not swept in).
|
|
855
|
+
screen.getByRole('menuitem', {name: 'Cut', hidden: true}).focus();
|
|
856
|
+
fireEvent.keyDown(menu, {key: 'ArrowDown'});
|
|
857
|
+
expect(submenuTrigger).toHaveFocus();
|
|
858
|
+
fireEvent.keyDown(menu, {key: 'ArrowDown'});
|
|
859
|
+
expect(
|
|
860
|
+
screen.getByRole('menuitem', {name: 'Delete', hidden: true}),
|
|
861
|
+
).toHaveFocus();
|
|
862
|
+
});
|
|
806
863
|
});
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
import {
|
|
50
50
|
MENU_ITEM_ROLES,
|
|
51
51
|
MENU_ITEM_SELECTOR,
|
|
52
|
+
MENU_BOUNDARY_SELECTOR,
|
|
52
53
|
} from '../DropdownMenu/menuItemRoles';
|
|
53
54
|
import {useListFocus} from '../hooks/useListFocus';
|
|
54
55
|
import {useTypeahead} from '../hooks/useTypeahead';
|
|
@@ -268,22 +269,18 @@ export function ContextMenu({
|
|
|
268
269
|
handleKeyDown: listNavKeyDown,
|
|
269
270
|
focusFirst,
|
|
270
271
|
focusItem,
|
|
272
|
+
ownsEvent,
|
|
273
|
+
getItems: getMenuItems,
|
|
271
274
|
} = useListFocus<HTMLDivElement>({
|
|
272
275
|
itemSelector: MENU_ITEM_SELECTOR,
|
|
276
|
+
boundarySelector: MENU_BOUNDARY_SELECTOR,
|
|
273
277
|
wrap: false,
|
|
274
278
|
onEscape: closeMenu,
|
|
275
279
|
});
|
|
276
280
|
|
|
277
|
-
// First-character typeahead over the enabled menu items (menus-11).
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
listRef.current
|
|
281
|
-
? Array.from(
|
|
282
|
-
listRef.current.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR),
|
|
283
|
-
)
|
|
284
|
-
: [],
|
|
285
|
-
[listRef],
|
|
286
|
-
);
|
|
281
|
+
// First-character typeahead over the enabled menu items (menus-11). Reuses
|
|
282
|
+
// the hook's scoped item collection so an inline submenu flyout's items
|
|
283
|
+
// aren't swept in.
|
|
287
284
|
const typeahead = useTypeahead({
|
|
288
285
|
getItemLabels: () => getMenuItems().map(el => el.textContent),
|
|
289
286
|
onMatch: focusItem,
|
|
@@ -340,6 +337,11 @@ export function ContextMenu({
|
|
|
340
337
|
|
|
341
338
|
const listKeyDown = useCallback(
|
|
342
339
|
(e: React.KeyboardEvent) => {
|
|
340
|
+
// A submenu flyout renders inline inside this menu; its key events bubble
|
|
341
|
+
// up here. Let that level own them — only handle events from this level.
|
|
342
|
+
if (!ownsEvent(e)) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
343
345
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
344
346
|
e.preventDefault();
|
|
345
347
|
const focused = document.activeElement as HTMLElement | null;
|
|
@@ -351,13 +353,22 @@ export function ContextMenu({
|
|
|
351
353
|
}
|
|
352
354
|
return;
|
|
353
355
|
}
|
|
356
|
+
// APG menu pattern: Tab closes the menu. Menu items are tabIndex={-1}
|
|
357
|
+
// so Tab would otherwise leak focus into the page while the menu stayed
|
|
358
|
+
// open (menus-5). Do NOT preventDefault — closing restores focus to the
|
|
359
|
+
// previously focused element, and the browser's default Tab then
|
|
360
|
+
// continues from there to the next element.
|
|
361
|
+
if (e.key === 'Tab') {
|
|
362
|
+
closeMenu();
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
354
365
|
if (typeahead.onKeyDown(e)) {
|
|
355
366
|
e.preventDefault();
|
|
356
367
|
return;
|
|
357
368
|
}
|
|
358
369
|
listNavKeyDown(e);
|
|
359
370
|
},
|
|
360
|
-
[listNavKeyDown, typeahead],
|
|
371
|
+
[listNavKeyDown, closeMenu, typeahead, ownsEvent],
|
|
361
372
|
);
|
|
362
373
|
|
|
363
374
|
// Place the zero-size cursor anchor at a point in the trigger's local
|
package/src/ContextMenu/index.ts
CHANGED
|
@@ -35,3 +35,8 @@ export {
|
|
|
35
35
|
DropdownMenuRadioItem as ContextMenuRadioItem,
|
|
36
36
|
type DropdownMenuRadioItemProps as ContextMenuRadioItemProps,
|
|
37
37
|
} from '../DropdownMenu/DropdownMenuRadioItem';
|
|
38
|
+
// Submenus work inside a ContextMenu too (nested flyout of items).
|
|
39
|
+
export {
|
|
40
|
+
DropdownMenuSubMenu as ContextMenuSubMenu,
|
|
41
|
+
type DropdownMenuSubMenuProps as ContextMenuSubMenuProps,
|
|
42
|
+
} from '../DropdownMenu/DropdownMenuSubMenu';
|
|
@@ -115,6 +115,13 @@ export const docs = {
|
|
|
115
115
|
description:
|
|
116
116
|
'Status indicator object for error, warning, or success states with a message.',
|
|
117
117
|
},
|
|
118
|
+
{
|
|
119
|
+
name: 'statusVariant',
|
|
120
|
+
type: "'attached' | 'detached' | 'tooltip'",
|
|
121
|
+
description:
|
|
122
|
+
'How the status message is placed relative to the input. attached overlaps directly below the input (bordered treatment); detached floats below as a separate element with spacing; tooltip hides the message box and surfaces it in a tooltip on the status icon.',
|
|
123
|
+
default: "'attached'",
|
|
124
|
+
},
|
|
118
125
|
{
|
|
119
126
|
name: 'labelTooltip',
|
|
120
127
|
type: 'string',
|
|
@@ -142,6 +149,12 @@ export const docs = {
|
|
|
142
149
|
"How the committed date value is displayed. Named values are reused from Timestamp's format vocabulary: 'date' shows 'Mar 21, 2026', 'date_long' shows 'March 21, 2026', 'date_weekday' shows 'Wed, Mar 21, 2026', 'system_date' shows '2026-03-21'. A function receives the ISO value and returns a custom string. Applies only to the committed value, never to text being typed.",
|
|
143
150
|
default: "'date_long'",
|
|
144
151
|
},
|
|
152
|
+
{
|
|
153
|
+
name: 'width',
|
|
154
|
+
type: 'SizeValue',
|
|
155
|
+
description:
|
|
156
|
+
'Width of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned.',
|
|
157
|
+
},
|
|
145
158
|
{
|
|
146
159
|
name: 'xstyle',
|
|
147
160
|
type: 'StyleXStyles',
|
|
@@ -152,6 +165,8 @@ export const docs = {
|
|
|
152
165
|
theming: {
|
|
153
166
|
targets: [
|
|
154
167
|
{className: 'astryx-date-input', visualProps: ['size', 'status']},
|
|
168
|
+
{className: 'astryx-date-input-toggle-icon', states: ['state']},
|
|
169
|
+
{className: 'astryx-date-input-clear-icon'},
|
|
155
170
|
],
|
|
156
171
|
},
|
|
157
172
|
usage: {
|
|
@@ -384,6 +399,13 @@ export const docsZh = {
|
|
|
384
399
|
type: "{type: 'warning' | 'error' | 'success', message?: string}",
|
|
385
400
|
description: '错误、警告或成功状态的状态指示对象,附带消息。',
|
|
386
401
|
},
|
|
402
|
+
{
|
|
403
|
+
name: 'statusVariant',
|
|
404
|
+
type: "'attached' | 'detached' | 'tooltip'",
|
|
405
|
+
description:
|
|
406
|
+
'状态消息相对于输入框的放置方式。attached 直接叠加在输入框下方(带边框处理);detached 作为独立元素浮于下方并留有间距;tooltip 隐藏消息框,并在状态图标上以提示气泡形式显示。',
|
|
407
|
+
default: "'attached'",
|
|
408
|
+
},
|
|
387
409
|
{
|
|
388
410
|
name: 'labelTooltip',
|
|
389
411
|
type: 'string',
|
|
@@ -415,6 +437,8 @@ export const docsZh = {
|
|
|
415
437
|
className: 'astryx-date-input',
|
|
416
438
|
visualProps: ['size', 'status'],
|
|
417
439
|
},
|
|
440
|
+
{className: 'astryx-date-input-toggle-icon', states: ['state']},
|
|
441
|
+
{className: 'astryx-date-input-clear-icon'},
|
|
418
442
|
],
|
|
419
443
|
},
|
|
420
444
|
};
|
|
@@ -492,6 +516,7 @@ export const docsDense = {
|
|
|
492
516
|
placeholder: 'placeholder text in input',
|
|
493
517
|
size: 'input control size',
|
|
494
518
|
status: 'error/warning/success status w/ message',
|
|
519
|
+
statusVariant: 'How status message is placed: attached overlaps below input; detached floats below w/ spacing; tooltip hides the box and shows it on the status icon.',
|
|
495
520
|
labelTooltip: 'tooltip text via info icon at label end',
|
|
496
521
|
hasClear: 'Shows clear button when date is set. Clears value on click.',
|
|
497
522
|
numberOfMonths: 'months shown simultaneously in calendar popover',
|