@astryxdesign/core 0.1.8 → 0.1.9-canary.09e9ddd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +53 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +203 -49
- package/dist/Avatar/AvatarStatusDot.d.ts +33 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +208 -6
- package/dist/Breadcrumbs/index.d.ts +5 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +9 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +30 -2
- package/dist/Calendar/dayCellUtils.js +1 -1
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +24 -4
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +1 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +18 -9
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +9 -2
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +3 -1
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/DateInput/DateInput.d.ts +55 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +28 -2
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +3 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +18 -3
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +1 -2
- package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +2 -3
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/FieldStatus/FieldStatus.d.ts +15 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +58 -6
- package/dist/FileInput/FileInput.d.ts +9 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +42 -20
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -2
- package/dist/Icon/Icon.d.ts +7 -2
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.js +4 -4
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +41 -12
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +9 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +8 -1
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +7 -3
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +19 -2
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +3 -2
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +4 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +87 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +9 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +2 -0
- package/dist/TextInput/TextInput.d.ts +9 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +6 -1
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +9 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +17 -4
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +18 -4
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +2 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +10 -4
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +28 -8
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +2 -0
- package/dist/astryx.css +41 -31
- package/dist/astryx.umd.js +51 -51
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useListFocus.d.ts +6 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +12 -4
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +3 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +53 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +32 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +24 -0
- package/package.json +1 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +60 -3
- package/src/Avatar/Avatar.test.tsx +281 -1
- package/src/Avatar/Avatar.tsx +324 -64
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +178 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +125 -0
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +284 -2
- package/src/Breadcrumbs/index.ts +27 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +193 -0
- package/src/Calendar/Calendar.tsx +38 -16
- package/src/Calendar/dayCellUtils.test.ts +5 -0
- package/src/Calendar/dayCellUtils.ts +1 -1
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +34 -4
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +4 -1
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +25 -4
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +10 -2
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.tsx +3 -1
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +193 -0
- package/src/DateInput/DateInput.doc.mjs +31 -0
- package/src/DateInput/DateInput.test.tsx +131 -0
- package/src/DateInput/DateInput.tsx +78 -3
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +8 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +23 -0
- package/src/DateRangeInput/DateRangeInput.tsx +13 -3
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +42 -18
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +169 -0
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +6 -5
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +63 -5
- package/src/FileInput/FileInput.doc.mjs +17 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +53 -28
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +24 -2
- package/src/Icon/Icon.doc.mjs +3 -2
- package/src/Icon/Icon.tsx +7 -2
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +4 -4
- package/src/List/List.test.tsx +9 -8
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +13 -2
- package/src/MultiSelector/MultiSelector.test.tsx +195 -3
- package/src/MultiSelector/MultiSelector.tsx +65 -12
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +21 -4
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +7 -0
- package/src/Selector/Selector.test.tsx +92 -0
- package/src/Selector/Selector.tsx +16 -2
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNavCollapseButton.tsx +6 -1
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +5 -1
- package/src/Slider/Slider.test.tsx +75 -2
- package/src/Slider/Slider.tsx +21 -5
- package/src/Switch/Switch.test.tsx +32 -1
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +3 -5
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +6 -2
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +16 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +19 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +128 -1
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +15 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +10 -0
- package/src/TextInput/TextInput.doc.mjs +15 -0
- package/src/TextInput/TextInput.test.tsx +44 -0
- package/src/TextInput/TextInput.tsx +13 -1
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +15 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +29 -6
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +30 -1
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +26 -4
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +22 -0
- package/src/TreeList/TreeList.test.tsx +232 -0
- package/src/TreeList/TreeList.tsx +18 -2
- package/src/TreeList/TreeListBranches.tsx +16 -2
- package/src/TreeList/TreeListItem.tsx +52 -12
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +7 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +10 -0
- package/src/authoring/doc.ts +1 -3
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useListFocus.doc.mjs +3 -3
- package/src/hooks/useListFocus.test.tsx +67 -1
- package/src/hooks/useListFocus.ts +21 -5
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +6 -0
- package/src/utils/plainDate.test.ts +22 -0
- package/src/utils/plainDate.ts +61 -0
- package/src/utils/types.ts +14 -0
|
@@ -226,3 +226,128 @@ describe('AvatarGroupOverflow — hardening', () => {
|
|
|
226
226
|
expect(screen.getByLabelText('4912 more')).toBeInTheDocument();
|
|
227
227
|
});
|
|
228
228
|
});
|
|
229
|
+
|
|
230
|
+
describe('AvatarGroup — roving focus + keyboard hint', () => {
|
|
231
|
+
it('is a single tab stop over interactive avatars (one tabindex=0, rest -1)', () => {
|
|
232
|
+
render(
|
|
233
|
+
<AvatarGroup>
|
|
234
|
+
<Avatar name="Alice" href="/alice" />
|
|
235
|
+
<Avatar name="Bob" href="/bob" />
|
|
236
|
+
<Avatar name="Charlie" href="/charlie" />
|
|
237
|
+
</AvatarGroup>,
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
const alice = screen.getByRole('link', {name: 'Alice'});
|
|
241
|
+
const bob = screen.getByRole('link', {name: 'Bob'});
|
|
242
|
+
const charlie = screen.getByRole('link', {name: 'Charlie'});
|
|
243
|
+
|
|
244
|
+
expect(alice).toHaveAttribute('tabindex', '0');
|
|
245
|
+
expect(bob).toHaveAttribute('tabindex', '-1');
|
|
246
|
+
expect(charlie).toHaveAttribute('tabindex', '-1');
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('roves focus with ArrowRight/ArrowLeft across interactive avatars', async () => {
|
|
250
|
+
const user = userEvent.setup();
|
|
251
|
+
render(
|
|
252
|
+
<AvatarGroup>
|
|
253
|
+
<Avatar name="Alice" href="/alice" />
|
|
254
|
+
<Avatar name="Bob" onClick={() => {}} />
|
|
255
|
+
<Avatar name="Charlie" href="/charlie" />
|
|
256
|
+
</AvatarGroup>,
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
const alice = screen.getByRole('link', {name: 'Alice'});
|
|
260
|
+
const bob = screen.getByRole('button', {name: 'Bob'});
|
|
261
|
+
const charlie = screen.getByRole('link', {name: 'Charlie'});
|
|
262
|
+
|
|
263
|
+
alice.focus();
|
|
264
|
+
expect(alice).toHaveFocus();
|
|
265
|
+
|
|
266
|
+
await user.keyboard('{ArrowRight}');
|
|
267
|
+
expect(bob).toHaveFocus();
|
|
268
|
+
expect(bob).toHaveAttribute('tabindex', '0');
|
|
269
|
+
expect(alice).toHaveAttribute('tabindex', '-1');
|
|
270
|
+
|
|
271
|
+
await user.keyboard('{ArrowRight}');
|
|
272
|
+
expect(charlie).toHaveFocus();
|
|
273
|
+
|
|
274
|
+
await user.keyboard('{ArrowLeft}');
|
|
275
|
+
expect(bob).toHaveFocus();
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
it('includes the overflow button as the last roving item', async () => {
|
|
279
|
+
const user = userEvent.setup();
|
|
280
|
+
render(
|
|
281
|
+
<AvatarGroup>
|
|
282
|
+
<Avatar name="Alice" href="/alice" />
|
|
283
|
+
<AvatarGroupOverflow count={3} onClick={() => {}} />
|
|
284
|
+
</AvatarGroup>,
|
|
285
|
+
);
|
|
286
|
+
|
|
287
|
+
const alice = screen.getByRole('link', {name: 'Alice'});
|
|
288
|
+
const overflow = screen.getByRole('button', {name: '3 more'});
|
|
289
|
+
expect(overflow).toHaveAttribute('data-avatar-item');
|
|
290
|
+
|
|
291
|
+
alice.focus();
|
|
292
|
+
await user.keyboard('{ArrowRight}');
|
|
293
|
+
expect(overflow).toHaveFocus();
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('does NOT rove over a non-avatar button in a status slot', async () => {
|
|
297
|
+
const user = userEvent.setup();
|
|
298
|
+
render(
|
|
299
|
+
<AvatarGroup>
|
|
300
|
+
<Avatar
|
|
301
|
+
name="Alice"
|
|
302
|
+
href="/alice"
|
|
303
|
+
status={<button type="button">badge</button>}
|
|
304
|
+
/>
|
|
305
|
+
<Avatar name="Bob" href="/bob" />
|
|
306
|
+
</AvatarGroup>,
|
|
307
|
+
);
|
|
308
|
+
|
|
309
|
+
const alice = screen.getByRole('link', {name: 'Alice'});
|
|
310
|
+
const bob = screen.getByRole('link', {name: 'Bob'});
|
|
311
|
+
const statusButton = screen.getByRole('button', {name: 'badge'});
|
|
312
|
+
|
|
313
|
+
// The status button carries no data-avatar-item marker.
|
|
314
|
+
expect(statusButton).not.toHaveAttribute('data-avatar-item');
|
|
315
|
+
|
|
316
|
+
alice.focus();
|
|
317
|
+
await user.keyboard('{ArrowRight}');
|
|
318
|
+
// Arrow moves to the next avatar, skipping the nested status button.
|
|
319
|
+
expect(bob).toHaveFocus();
|
|
320
|
+
expect(statusButton).not.toHaveFocus();
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('attaches an aria-describedby keyboard hint when interactive children exist', () => {
|
|
324
|
+
render(
|
|
325
|
+
<AvatarGroup>
|
|
326
|
+
<Avatar name="Alice" href="/alice" />
|
|
327
|
+
<Avatar name="Bob" href="/bob" />
|
|
328
|
+
</AvatarGroup>,
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
const group = screen.getByRole('group');
|
|
332
|
+
const describedBy = group.getAttribute('aria-describedby');
|
|
333
|
+
expect(describedBy).toBeTruthy();
|
|
334
|
+
const hint = document.getElementById(describedBy!);
|
|
335
|
+
expect(hint).not.toBeNull();
|
|
336
|
+
expect(hint).toHaveTextContent('Use arrow keys to move between avatars');
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it('a purely static group has no tab stop and no keyboard hint', () => {
|
|
340
|
+
render(
|
|
341
|
+
<AvatarGroup>
|
|
342
|
+
<Avatar name="Alice" data-testid="alice" />
|
|
343
|
+
<Avatar name="Bob" data-testid="bob" />
|
|
344
|
+
</AvatarGroup>,
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
const group = screen.getByRole('group');
|
|
348
|
+
expect(group).not.toHaveAttribute('aria-describedby');
|
|
349
|
+
// Static avatars are not focusable — no roving tabindex stamped.
|
|
350
|
+
expect(screen.getByTestId('alice')).not.toHaveAttribute('tabindex');
|
|
351
|
+
expect(screen.getByTestId('bob')).not.toHaveAttribute('tabindex');
|
|
352
|
+
});
|
|
353
|
+
});
|
|
@@ -11,6 +11,12 @@
|
|
|
11
11
|
* one AvatarGroupOverflow). The group provides overlap styling via
|
|
12
12
|
* context — no child introspection needed.
|
|
13
13
|
*
|
|
14
|
+
* When the group contains interactive avatars (rendered as links/buttons) or an
|
|
15
|
+
* interactive AvatarGroupOverflow, it becomes a single Tab stop with roving
|
|
16
|
+
* arrow-key focus (via useListFocus with hasRovingTabIndex) and exposes a
|
|
17
|
+
* screen-reader keyboard hint via aria-describedby. A purely static facepile
|
|
18
|
+
* gets neither — it stays a plain non-focusable group.
|
|
19
|
+
*
|
|
14
20
|
* SYNC: When modified, update these files to stay in sync:
|
|
15
21
|
* - /packages/core/src/AvatarGroup/AvatarGroup.doc.mjs (props table, features)
|
|
16
22
|
* - /packages/core/src/AvatarGroup/index.ts (exports if types change)
|
|
@@ -18,14 +24,18 @@
|
|
|
18
24
|
* - /packages/cli/templates/blocks/components/AvatarGroup/ (showcase blocks)
|
|
19
25
|
*/
|
|
20
26
|
|
|
21
|
-
import {useMemo, type ReactNode} from 'react';
|
|
27
|
+
import {useId, useMemo, useState, type ReactNode} from 'react';
|
|
22
28
|
import type {BaseProps} from '../BaseProps';
|
|
23
29
|
import {resolveSize, type AvatarSize} from '../Avatar';
|
|
24
30
|
import * as stylex from '@stylexjs/stylex';
|
|
25
|
-
import {mergeProps} from '../utils';
|
|
31
|
+
import {mergeProps, mergeRefs} from '../utils';
|
|
32
|
+
import {composeEventHandlers} from '../utils/composeEventHandlers';
|
|
26
33
|
import {AvatarGroupContext} from './AvatarGroupContext';
|
|
27
34
|
import {themeProps} from '../utils/themeProps';
|
|
28
35
|
import {useTranslator} from '../i18n';
|
|
36
|
+
import {useListFocus} from '../hooks/useListFocus';
|
|
37
|
+
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
38
|
+
import {VisuallyHidden} from '../VisuallyHidden';
|
|
29
39
|
|
|
30
40
|
const OVERLAP_RATIO = 0.25;
|
|
31
41
|
|
|
@@ -78,6 +88,9 @@ export function AvatarGroup({
|
|
|
78
88
|
size = 'md',
|
|
79
89
|
'data-testid': testId,
|
|
80
90
|
'aria-label': ariaLabelFromProps,
|
|
91
|
+
'aria-describedby': ariaDescribedByFromProps,
|
|
92
|
+
onKeyDown,
|
|
93
|
+
onFocus,
|
|
81
94
|
xstyle,
|
|
82
95
|
className,
|
|
83
96
|
style,
|
|
@@ -94,14 +107,51 @@ export function AvatarGroup({
|
|
|
94
107
|
[size, overlap, numericSize],
|
|
95
108
|
);
|
|
96
109
|
|
|
110
|
+
// The keyboard hint and roving tab stop only make sense once the group has
|
|
111
|
+
// interactive children. Detect their presence (and the writing direction for
|
|
112
|
+
// RTL-correct arrow navigation) from the rendered DOM after commit, matching
|
|
113
|
+
// how the codebase reads direction elsewhere (`getComputedStyle(el).direction`).
|
|
114
|
+
const [hasInteractiveItems, setHasInteractiveItems] = useState(false);
|
|
115
|
+
const [isRtl, setIsRtl] = useState(false);
|
|
116
|
+
|
|
117
|
+
// Single tab stop + roving arrow focus over the group's interactive items.
|
|
118
|
+
// `itemSelector` targets the shared `[data-avatar-item]` marker stamped on
|
|
119
|
+
// interactive avatars (their rendered <a>/<button>) and on the overflow
|
|
120
|
+
// button — NOT a tag/role selector — so roving never catches a nested button
|
|
121
|
+
// inside a custom status/badge slot (O5).
|
|
122
|
+
const {listRef, handleKeyDown, handleFocus} = useListFocus<HTMLDivElement>({
|
|
123
|
+
itemSelector: '[data-avatar-item]',
|
|
124
|
+
orientation: 'horizontal',
|
|
125
|
+
hasRovingTabIndex: true,
|
|
126
|
+
isRtl,
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
useIsomorphicLayoutEffect(() => {
|
|
130
|
+
const root = listRef.current;
|
|
131
|
+
if (!root) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
setHasInteractiveItems(root.querySelector('[data-avatar-item]') != null);
|
|
135
|
+
setIsRtl(getComputedStyle(root).direction === 'rtl');
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const hintId = useId();
|
|
139
|
+
const describedBy =
|
|
140
|
+
[ariaDescribedByFromProps, hasInteractiveItems ? hintId : null]
|
|
141
|
+
.filter(Boolean)
|
|
142
|
+
.join(' ') || undefined;
|
|
143
|
+
|
|
97
144
|
return (
|
|
98
145
|
<AvatarGroupContext value={contextValue}>
|
|
99
146
|
<div
|
|
100
147
|
{...props}
|
|
101
|
-
ref={ref}
|
|
148
|
+
ref={mergeRefs(ref, listRef)}
|
|
102
149
|
role="group"
|
|
103
150
|
aria-label={ariaLabel}
|
|
151
|
+
aria-describedby={describedBy}
|
|
104
152
|
data-testid={testId}
|
|
153
|
+
onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}
|
|
154
|
+
onFocus={composeEventHandlers(onFocus, handleFocus)}
|
|
105
155
|
{...mergeProps(
|
|
106
156
|
themeProps('avatar-group', {size}),
|
|
107
157
|
stylex.props(styles.root, xstyle),
|
|
@@ -109,6 +159,11 @@ export function AvatarGroup({
|
|
|
109
159
|
style,
|
|
110
160
|
)}>
|
|
111
161
|
{children}
|
|
162
|
+
{hasInteractiveItems && (
|
|
163
|
+
<VisuallyHidden id={hintId}>
|
|
164
|
+
{t('@astryx.avatarGroup.keyboardHint')}
|
|
165
|
+
</VisuallyHidden>
|
|
166
|
+
)}
|
|
112
167
|
</div>
|
|
113
168
|
</AvatarGroupContext>
|
|
114
169
|
);
|
|
@@ -81,6 +81,13 @@ export const docs = {
|
|
|
81
81
|
'Container type: card has border-radius; section is full-width with no border-radius for page-level use.',
|
|
82
82
|
default: "'card'",
|
|
83
83
|
},
|
|
84
|
+
{
|
|
85
|
+
name: 'elevation',
|
|
86
|
+
type: "'none' | 'low' | 'med' | 'high'",
|
|
87
|
+
description:
|
|
88
|
+
'Resting shadow depth. Use for a floating banner that hovers above content; `none` is the default inline banner. A `card`-container banner rounds its shadow to match.',
|
|
89
|
+
default: "'none'",
|
|
90
|
+
},
|
|
84
91
|
{
|
|
85
92
|
name: 'children',
|
|
86
93
|
type: 'ReactNode',
|
|
@@ -157,6 +164,7 @@ export const docsZh = {
|
|
|
157
164
|
{name: 'onDismiss', type: '() => void', description: '点击关闭按钮时调用;无论是否提供此回调,横幅都会自动隐藏。'},
|
|
158
165
|
{name: 'endContent', type: 'ReactNode', description: '渲染在头部区域末端对齐的操作内容,通常是按钮或链接。'},
|
|
159
166
|
{name: 'container', type: "'card' | 'section'", description: '视觉变体:card 带圆角;section 无圆角全宽,适用于页面级场景。', default: "'card'"},
|
|
167
|
+
{name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: '静止阴影深度。用于悬浮于内容之上的浮动横幅;none 为默认内联横幅。', default: "'none'"},
|
|
160
168
|
{name: 'children', type: 'ReactNode', description: '渲染在彩色头部下方卡片背景区域的内容。'},
|
|
161
169
|
{name: 'defaultIsExpanded', type: 'boolean', description: '内容区域(children)是否初始展开。仅在提供 children 时相关。', default: 'false'},
|
|
162
170
|
{
|
|
@@ -230,6 +238,7 @@ export const docsDense = {
|
|
|
230
238
|
onDismiss: 'dismiss callback; banner self-hides regardless',
|
|
231
239
|
endContent: 'end-aligned action in header, typically button/link',
|
|
232
240
|
container: 'card=border-radius; section=full-width no radius for page-level',
|
|
241
|
+
elevation: 'resting shadow depth: none|low|med|high; raise for a floating banner',
|
|
233
242
|
children: 'content in card-bg area below colored header',
|
|
234
243
|
xstyle: 'StyleX layout customization via stylex.create()',
|
|
235
244
|
},
|
|
@@ -368,4 +368,34 @@ describe('Banner', () => {
|
|
|
368
368
|
);
|
|
369
369
|
expect(screen.getByTestId('custom-chevron')).toBeInTheDocument();
|
|
370
370
|
});
|
|
371
|
+
|
|
372
|
+
describe('elevation', () => {
|
|
373
|
+
it('renders a distinct root class for each elevation level', () => {
|
|
374
|
+
const classFor = (elevation: 'none' | 'low' | 'med' | 'high') => {
|
|
375
|
+
const {container} = render(
|
|
376
|
+
<Banner status="info" title="Heads up" elevation={elevation} />,
|
|
377
|
+
);
|
|
378
|
+
return container.firstElementChild!.className;
|
|
379
|
+
};
|
|
380
|
+
const classes = new Set([
|
|
381
|
+
classFor('none'),
|
|
382
|
+
classFor('low'),
|
|
383
|
+
classFor('med'),
|
|
384
|
+
classFor('high'),
|
|
385
|
+
]);
|
|
386
|
+
expect(classes.size).toBe(4);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('defaults to flat (elevation none)', () => {
|
|
390
|
+
const {container: def} = render(
|
|
391
|
+
<Banner status="info" title="Heads up" />,
|
|
392
|
+
);
|
|
393
|
+
const {container: none} = render(
|
|
394
|
+
<Banner status="info" title="Heads up" elevation="none" />,
|
|
395
|
+
);
|
|
396
|
+
expect(def.firstElementChild!.className).toBe(
|
|
397
|
+
none.firstElementChild!.className,
|
|
398
|
+
);
|
|
399
|
+
});
|
|
400
|
+
});
|
|
371
401
|
});
|
package/src/Banner/Banner.tsx
CHANGED
|
@@ -46,8 +46,10 @@ import {
|
|
|
46
46
|
borderVars,
|
|
47
47
|
durationVars,
|
|
48
48
|
easeVars,
|
|
49
|
+
shadowVars,
|
|
49
50
|
} from '../theme/tokens.stylex';
|
|
50
51
|
import {mergeProps} from '../utils';
|
|
52
|
+
import type {Elevation} from '../utils/types';
|
|
51
53
|
import {edgeCompSlot} from '../Layout/edgeCompensation.stylex';
|
|
52
54
|
import {themeProps} from '../utils/themeProps';
|
|
53
55
|
import {useTranslator} from '../i18n';
|
|
@@ -157,6 +159,13 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
|
|
|
157
159
|
* @default 'card'
|
|
158
160
|
*/
|
|
159
161
|
container?: BannerContainer;
|
|
162
|
+
/**
|
|
163
|
+
* Resting elevation — the shadow depth the banner sits at. Use for a
|
|
164
|
+
* floating banner that hovers above content. `none` is the default inline
|
|
165
|
+
* banner.
|
|
166
|
+
* @default 'none'
|
|
167
|
+
*/
|
|
168
|
+
elevation?: Elevation;
|
|
160
169
|
/**
|
|
161
170
|
* Whether the content area (children) starts expanded.
|
|
162
171
|
* Only relevant when children are provided.
|
|
@@ -215,6 +224,11 @@ const styles = stylex.create({
|
|
|
215
224
|
flexDirection: 'column',
|
|
216
225
|
fontFamily: 'inherit',
|
|
217
226
|
},
|
|
227
|
+
// When elevated, a card-container banner rounds its root so the shadow
|
|
228
|
+
// follows the same silhouette as the header/content border-radius.
|
|
229
|
+
rootElevatedCard: {
|
|
230
|
+
borderRadius: radiusVars['--radius-container'],
|
|
231
|
+
},
|
|
218
232
|
// Header area — colored status background with icon, title, description, actions
|
|
219
233
|
// This is the primary theme target ('banner')
|
|
220
234
|
header: {
|
|
@@ -280,14 +294,14 @@ const styles = stylex.create({
|
|
|
280
294
|
backgroundColor: colorVars['--color-background-card'],
|
|
281
295
|
paddingBlock: spacingVars['--spacing-3'],
|
|
282
296
|
paddingInline: spacingVars['--spacing-4'],
|
|
283
|
-
|
|
284
|
-
|
|
297
|
+
borderInlineStartWidth: borderVars['--border-width'],
|
|
298
|
+
borderInlineEndWidth: borderVars['--border-width'],
|
|
285
299
|
borderBottomWidth: borderVars['--border-width'],
|
|
286
|
-
|
|
287
|
-
|
|
300
|
+
borderInlineStartStyle: 'solid',
|
|
301
|
+
borderInlineEndStyle: 'solid',
|
|
288
302
|
borderBottomStyle: 'solid',
|
|
289
|
-
|
|
290
|
-
|
|
303
|
+
borderInlineStartColor: colorVars['--color-border'],
|
|
304
|
+
borderInlineEndColor: colorVars['--color-border'],
|
|
291
305
|
borderBottomColor: colorVars['--color-border'],
|
|
292
306
|
},
|
|
293
307
|
contentAreaCard: {
|
|
@@ -323,6 +337,18 @@ const statusStyles = stylex.create({
|
|
|
323
337
|
},
|
|
324
338
|
});
|
|
325
339
|
|
|
340
|
+
// Resting elevation for the banner. Applied to the root so the shadow wraps
|
|
341
|
+
// the whole banner (header + optional content). 'none' is the default and
|
|
342
|
+
// leaves the layout-only root untouched. For the `card` container the root is
|
|
343
|
+
// rounded (rootElevatedCard) so the shadow follows the card silhouette; the
|
|
344
|
+
// full-width `section` container stays square.
|
|
345
|
+
const elevationStyles = stylex.create({
|
|
346
|
+
none: {boxShadow: 'none'},
|
|
347
|
+
low: {boxShadow: shadowVars['--shadow-low']},
|
|
348
|
+
med: {boxShadow: shadowVars['--shadow-med']},
|
|
349
|
+
high: {boxShadow: shadowVars['--shadow-high']},
|
|
350
|
+
});
|
|
351
|
+
|
|
326
352
|
// =============================================================================
|
|
327
353
|
// Component
|
|
328
354
|
// =============================================================================
|
|
@@ -381,6 +407,7 @@ export function Banner({
|
|
|
381
407
|
onDismiss,
|
|
382
408
|
endContent,
|
|
383
409
|
container = 'card',
|
|
410
|
+
elevation = 'none',
|
|
384
411
|
defaultIsExpanded = false,
|
|
385
412
|
children,
|
|
386
413
|
xstyle,
|
|
@@ -429,7 +456,16 @@ export function Banner({
|
|
|
429
456
|
<div
|
|
430
457
|
ref={ref}
|
|
431
458
|
role={role}
|
|
432
|
-
{...mergeProps(
|
|
459
|
+
{...mergeProps(
|
|
460
|
+
stylex.props(
|
|
461
|
+
styles.root,
|
|
462
|
+
elevationStyles[elevation],
|
|
463
|
+
isCard && elevation !== 'none' && styles.rootElevatedCard,
|
|
464
|
+
xstyle,
|
|
465
|
+
),
|
|
466
|
+
className,
|
|
467
|
+
style,
|
|
468
|
+
)}
|
|
433
469
|
{...rest}>
|
|
434
470
|
{/* Header: colored status background — primary theme target ('banner') */}
|
|
435
471
|
<div
|
|
@@ -474,8 +510,16 @@ export function Banner({
|
|
|
474
510
|
<Button
|
|
475
511
|
variant="ghost"
|
|
476
512
|
size="sm"
|
|
477
|
-
label={
|
|
478
|
-
|
|
513
|
+
label={
|
|
514
|
+
isExpanded
|
|
515
|
+
? t('@astryx.banner.collapse')
|
|
516
|
+
: t('@astryx.banner.expand')
|
|
517
|
+
}
|
|
518
|
+
tooltip={
|
|
519
|
+
isExpanded
|
|
520
|
+
? t('@astryx.banner.collapse')
|
|
521
|
+
: t('@astryx.banner.expand')
|
|
522
|
+
}
|
|
479
523
|
icon={
|
|
480
524
|
<span
|
|
481
525
|
{...stylex.props(
|
|
@@ -45,6 +45,18 @@ export const docs = {
|
|
|
45
45
|
},
|
|
46
46
|
],
|
|
47
47
|
},
|
|
48
|
+
{
|
|
49
|
+
name: 'menu',
|
|
50
|
+
type: 'DropdownMenuOption[] | ReactNode',
|
|
51
|
+
description:
|
|
52
|
+
'Menu opened when the item is activated, using the same item API as DropdownMenu/MoreMenu/ContextMenu (a DropdownMenuOption[] array or composed DropdownMenuItem children). Renders a link-styled menu trigger with a chevron and aria-haspopup="menu". Takes precedence over href/onClick.',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'menuSize',
|
|
56
|
+
type: "'sm' | 'md' | 'lg'",
|
|
57
|
+
description:
|
|
58
|
+
"Size passed to the menu items. Defaults from the breadcrumb variant ('supporting' → 'sm', otherwise 'md').",
|
|
59
|
+
},
|
|
48
60
|
{
|
|
49
61
|
name: 'as',
|
|
50
62
|
type: 'LinkComponentType',
|
|
@@ -86,6 +98,18 @@ export const docsZh = {
|
|
|
86
98
|
type: 'ReactNode',
|
|
87
99
|
description: '在项目标签前渲染的图标。',
|
|
88
100
|
},
|
|
101
|
+
{
|
|
102
|
+
name: 'menu',
|
|
103
|
+
type: 'DropdownMenuOption[] | ReactNode',
|
|
104
|
+
description:
|
|
105
|
+
'激活项目时打开的菜单,使用与 DropdownMenu/MoreMenu/ContextMenu 相同的项目 API(DropdownMenuOption[] 数组或组合的 DropdownMenuItem 子元素)。渲染为带 chevron 和 aria-haspopup="menu" 的链接样式触发器。优先于 href/onClick。',
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'menuSize',
|
|
109
|
+
type: "'sm' | 'md' | 'lg'",
|
|
110
|
+
description:
|
|
111
|
+
"传递给菜单项的尺寸。默认根据面包屑变体推断('supporting' → 'sm',否则 'md')。",
|
|
112
|
+
},
|
|
89
113
|
{
|
|
90
114
|
name: 'as',
|
|
91
115
|
type: 'LinkComponentType',
|
|
@@ -105,6 +129,8 @@ export const docsDense = {
|
|
|
105
129
|
onClick: 'click handler',
|
|
106
130
|
isCurrent: 'marks current page w/ aria-current="page"',
|
|
107
131
|
startIcon: 'icon before label',
|
|
132
|
+
menu: 'DropdownMenuOption[] | children; opens a menu trigger (aria-haspopup="menu"); reuses the DropdownMenu item API',
|
|
133
|
+
menuSize: "menu item size; defaults from variant (supporting→sm, else md)",
|
|
108
134
|
as: 'custom link component; overrides LinkProvider default',
|
|
109
135
|
},
|
|
110
136
|
};
|