@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
|
@@ -14,6 +14,8 @@ import {render, screen, fireEvent} from '@testing-library/react';
|
|
|
14
14
|
import userEvent from '@testing-library/user-event';
|
|
15
15
|
import {TreeList} from './TreeList';
|
|
16
16
|
import type {TreeListItemData} from './TreeListTypes';
|
|
17
|
+
import {defineTheme} from '../theme/defineTheme';
|
|
18
|
+
import {generateThemeCSSFlat} from '../theme/generateThemeRules';
|
|
17
19
|
|
|
18
20
|
const simpleItems: TreeListItemData[] = [
|
|
19
21
|
{id: 'a', label: 'Item A'},
|
|
@@ -393,6 +395,115 @@ describe('TreeList', () => {
|
|
|
393
395
|
expect(screen.getByRole('tree')).toBeInTheDocument();
|
|
394
396
|
});
|
|
395
397
|
|
|
398
|
+
// ===========================================================================
|
|
399
|
+
// Variant (guide lines)
|
|
400
|
+
// ===========================================================================
|
|
401
|
+
|
|
402
|
+
describe('variant', () => {
|
|
403
|
+
it('renders guide lines by default', () => {
|
|
404
|
+
const {container} = render(<TreeList items={nestedItemsExpanded} />);
|
|
405
|
+
expect(container.querySelector('.astryx-tree-list-guide')).not.toBeNull();
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it("variant='lineGuides' renders guide lines (explicit == default)", () => {
|
|
409
|
+
const {container} = render(
|
|
410
|
+
<TreeList items={nestedItemsExpanded} variant="lineGuides" />,
|
|
411
|
+
);
|
|
412
|
+
expect(container.querySelector('.astryx-tree-list-guide')).not.toBeNull();
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
it("variant='noGuides' renders NO guide lines", () => {
|
|
416
|
+
const {container} = render(
|
|
417
|
+
<TreeList items={nestedItemsExpanded} variant="noGuides" />,
|
|
418
|
+
);
|
|
419
|
+
expect(container.querySelector('.astryx-tree-list-guide')).toBeNull();
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
it("variant='noGuides' preserves the tree structure and items", () => {
|
|
423
|
+
render(<TreeList items={nestedItemsExpanded} variant="noGuides" />);
|
|
424
|
+
// Rows, roles, and nesting are all intact — only the connectors are gone.
|
|
425
|
+
expect(screen.getByRole('tree')).toBeInTheDocument();
|
|
426
|
+
expect(screen.getAllByRole('treeitem')).toHaveLength(4);
|
|
427
|
+
expect(screen.getByText('Parent')).toBeInTheDocument();
|
|
428
|
+
expect(screen.getByText('Child 1')).toBeInTheDocument();
|
|
429
|
+
expect(screen.getByText('Child 2')).toBeInTheDocument();
|
|
430
|
+
expect(screen.getByText('Sibling')).toBeInTheDocument();
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it("variant='noGuides' preserves per-level indentation on the rows", () => {
|
|
434
|
+
// Indentation lives on the row's margin-inline-start (not the guide
|
|
435
|
+
// element), so it must survive when the connectors are suppressed. A
|
|
436
|
+
// deeper row is indented more than a shallower one.
|
|
437
|
+
const {container} = render(
|
|
438
|
+
<TreeList items={deepItems} variant="noGuides" />,
|
|
439
|
+
);
|
|
440
|
+
const marginOf = (text: string): string => {
|
|
441
|
+
const li = screen.getByText(text).closest('li')!;
|
|
442
|
+
const styled = li.querySelector('[style*="margin-inline-start"]');
|
|
443
|
+
return styled?.getAttribute('style') ?? '';
|
|
444
|
+
};
|
|
445
|
+
// Guides are gone…
|
|
446
|
+
expect(container.querySelector('.astryx-tree-list-guide')).toBeNull();
|
|
447
|
+
// …but each level still carries an inline margin-inline-start, and the
|
|
448
|
+
// level multiplier grows with depth (0, 1, 2).
|
|
449
|
+
expect(marginOf('Root')).toContain('margin-inline-start');
|
|
450
|
+
expect(marginOf('Mid')).toContain('margin-inline-start');
|
|
451
|
+
expect(marginOf('Leaf')).toContain('margin-inline-start');
|
|
452
|
+
const level = (text: string): number => {
|
|
453
|
+
const m = /calc\((\d+)/.exec(marginOf(text));
|
|
454
|
+
return m ? Number(m[1]) : NaN;
|
|
455
|
+
};
|
|
456
|
+
expect(level('Mid')).toBeGreaterThan(level('Root'));
|
|
457
|
+
expect(level('Leaf')).toBeGreaterThan(level('Mid'));
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
// ===========================================================================
|
|
462
|
+
// Guide theme target
|
|
463
|
+
// ===========================================================================
|
|
464
|
+
|
|
465
|
+
describe('guide theme target', () => {
|
|
466
|
+
it('renders the astryx-tree-list-guide target on the connector lines', () => {
|
|
467
|
+
const {container} = render(<TreeList items={nestedItemsExpanded} />);
|
|
468
|
+
const guide = container.querySelector('.astryx-tree-list-guide');
|
|
469
|
+
// A dedicated, stable target so a theme can recolor or hide the guides
|
|
470
|
+
// without hiding the built-in connectors and reimplementing them.
|
|
471
|
+
expect(guide).not.toBeNull();
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
it('exposes tree-list-guide as a themeable defineTheme target', () => {
|
|
475
|
+
// jsdom cannot resolve the @layer cascade, so the generated CSS is what
|
|
476
|
+
// proves a theme override reaches the guide element.
|
|
477
|
+
const theme = defineTheme({
|
|
478
|
+
name: 'tree-list-guide-test',
|
|
479
|
+
components: {
|
|
480
|
+
'tree-list-guide': {
|
|
481
|
+
base: {backgroundColor: 'var(--color-accent)'},
|
|
482
|
+
},
|
|
483
|
+
},
|
|
484
|
+
});
|
|
485
|
+
const css = generateThemeCSSFlat(theme);
|
|
486
|
+
expect(css).toContain('.astryx-tree-list-guide {');
|
|
487
|
+
expect(css).toContain('background-color: var(--color-accent)');
|
|
488
|
+
});
|
|
489
|
+
|
|
490
|
+
it('lets a theme hide the guides via display: none on the target', () => {
|
|
491
|
+
// Hiding the guides is done through the theme target, not a prop — the
|
|
492
|
+
// theme rule lands in @layer astryx-theme, above StyleX's base layer.
|
|
493
|
+
const theme = defineTheme({
|
|
494
|
+
name: 'tree-list-guide-hidden-test',
|
|
495
|
+
components: {
|
|
496
|
+
'tree-list-guide': {
|
|
497
|
+
base: {display: 'none'},
|
|
498
|
+
},
|
|
499
|
+
},
|
|
500
|
+
});
|
|
501
|
+
const css = generateThemeCSSFlat(theme);
|
|
502
|
+
expect(css).toContain('.astryx-tree-list-guide {');
|
|
503
|
+
expect(css).toContain('display: none');
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
|
|
396
507
|
// ===========================================================================
|
|
397
508
|
// xds class name
|
|
398
509
|
// ===========================================================================
|
|
@@ -403,6 +514,127 @@ describe('TreeList', () => {
|
|
|
403
514
|
expect(root.className).toContain('astryx-tree-list');
|
|
404
515
|
});
|
|
405
516
|
|
|
517
|
+
// ===========================================================================
|
|
518
|
+
// Chevron theme target
|
|
519
|
+
// ===========================================================================
|
|
520
|
+
|
|
521
|
+
describe('chevron theme target', () => {
|
|
522
|
+
it('renders the astryx-tree-list-chevron target on the toggle button', () => {
|
|
523
|
+
render(<TreeList items={nestedItems} />);
|
|
524
|
+
const toggle = screen
|
|
525
|
+
.getByText('Parent')
|
|
526
|
+
.closest('li')!
|
|
527
|
+
.querySelector('[data-tree-toggle]')!;
|
|
528
|
+
|
|
529
|
+
// Dedicated, stable theme target on the expand/collapse control, so a
|
|
530
|
+
// theme can restyle the chevron without a fragile [data-tree-toggle] hook.
|
|
531
|
+
expect(toggle).toHaveClass('astryx-tree-list-chevron');
|
|
532
|
+
// Open/closed state is reflected so a theme can target each state alone.
|
|
533
|
+
expect(toggle).toHaveAttribute('data-state', 'collapsed');
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
it('reflects the expanded state on the toggle when open', () => {
|
|
537
|
+
render(<TreeList items={nestedItemsExpanded} />);
|
|
538
|
+
const toggle = screen
|
|
539
|
+
.getByText('Parent')
|
|
540
|
+
.closest('li')!
|
|
541
|
+
.querySelector('[data-tree-toggle]')!;
|
|
542
|
+
|
|
543
|
+
expect(toggle).toHaveClass('astryx-tree-list-chevron');
|
|
544
|
+
expect(toggle).toHaveAttribute('data-state', 'expanded');
|
|
545
|
+
});
|
|
546
|
+
|
|
547
|
+
it('keeps the functional data-tree-toggle hook alongside the new target', () => {
|
|
548
|
+
// The theme target is additive — the toggle is still a real <button> and
|
|
549
|
+
// still carries the functional activation attribute TreeList relies on.
|
|
550
|
+
render(<TreeList items={nestedItems} />);
|
|
551
|
+
const toggle = screen
|
|
552
|
+
.getByText('Parent')
|
|
553
|
+
.closest('li')!
|
|
554
|
+
.querySelector('[data-tree-toggle]')!;
|
|
555
|
+
expect(toggle.tagName).toBe('BUTTON');
|
|
556
|
+
expect(toggle).toHaveAttribute('data-tree-toggle');
|
|
557
|
+
});
|
|
558
|
+
|
|
559
|
+
it('exposes tree-list-chevron as a themeable defineTheme target', () => {
|
|
560
|
+
// The generated CSS is what proves the target is reachable by a theme:
|
|
561
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
562
|
+
// above and this generation assertion together cover the seam.
|
|
563
|
+
const theme = defineTheme({
|
|
564
|
+
name: 'tree-list-chevron-test',
|
|
565
|
+
components: {
|
|
566
|
+
'tree-list-chevron': {
|
|
567
|
+
base: {color: 'var(--color-accent)'},
|
|
568
|
+
'state:expanded': {color: 'var(--color-text-primary)'},
|
|
569
|
+
},
|
|
570
|
+
},
|
|
571
|
+
});
|
|
572
|
+
const css = generateThemeCSSFlat(theme);
|
|
573
|
+
expect(css).toContain('.astryx-tree-list-chevron {');
|
|
574
|
+
expect(css).toContain('color: var(--color-accent)');
|
|
575
|
+
expect(css).toContain('.astryx-tree-list-chevron.expanded');
|
|
576
|
+
expect(css).toContain('color: var(--color-text-primary)');
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
// ===========================================================================
|
|
581
|
+
// Item label theme target
|
|
582
|
+
// ===========================================================================
|
|
583
|
+
|
|
584
|
+
describe('item label theme target', () => {
|
|
585
|
+
it('renders the astryx-tree-list-item-label target on the label span', () => {
|
|
586
|
+
render(<TreeList items={simpleItems} />);
|
|
587
|
+
const label = screen.getByText('Item A');
|
|
588
|
+
|
|
589
|
+
// Dedicated, stable theme target on the label text, so a theme can style
|
|
590
|
+
// just the label without a fragile `button:not([data-tree-toggle]) > span`
|
|
591
|
+
// structural selector.
|
|
592
|
+
expect(label).toHaveClass('astryx-tree-list-item-label');
|
|
593
|
+
// A non-selected item's label carries no selected reflection.
|
|
594
|
+
expect(label).not.toHaveAttribute('data-selected');
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
it('reflects the selected state on the selected item label', () => {
|
|
598
|
+
render(
|
|
599
|
+
<TreeList items={[{id: 'a', label: 'Item A', isSelected: true}]} />,
|
|
600
|
+
);
|
|
601
|
+
const label = screen.getByText('Item A');
|
|
602
|
+
expect(label).toHaveClass('astryx-tree-list-item-label');
|
|
603
|
+
expect(label).toHaveAttribute('data-selected', 'selected');
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
it('keeps the label linked to its row via aria-labelledby', () => {
|
|
607
|
+
// The theme target is additive — the label still owns the id the
|
|
608
|
+
// interactive row references for its accessible name.
|
|
609
|
+
render(
|
|
610
|
+
<TreeList items={[{id: 'a', label: 'Item A', onClick: () => {}}]} />,
|
|
611
|
+
);
|
|
612
|
+
const label = screen.getByText('Item A');
|
|
613
|
+
const action = screen.getByRole('button');
|
|
614
|
+
expect(action).toHaveAttribute('aria-labelledby', label.id);
|
|
615
|
+
});
|
|
616
|
+
|
|
617
|
+
it('exposes tree-list-item-label as a themeable defineTheme target', () => {
|
|
618
|
+
// The generated CSS is what proves the target is reachable by a theme:
|
|
619
|
+
// jsdom cannot resolve the @layer cascade, so the DOM-class assertions
|
|
620
|
+
// above and this generation assertion together cover the seam.
|
|
621
|
+
const theme = defineTheme({
|
|
622
|
+
name: 'tree-list-item-label-test',
|
|
623
|
+
components: {
|
|
624
|
+
'tree-list-item-label': {
|
|
625
|
+
base: {color: 'var(--color-text-primary)'},
|
|
626
|
+
selected: {fontWeight: 'var(--font-weight-bold)'},
|
|
627
|
+
},
|
|
628
|
+
},
|
|
629
|
+
});
|
|
630
|
+
const css = generateThemeCSSFlat(theme);
|
|
631
|
+
expect(css).toContain('.astryx-tree-list-item-label {');
|
|
632
|
+
expect(css).toContain('color: var(--color-text-primary)');
|
|
633
|
+
expect(css).toContain('.astryx-tree-list-item-label.selected');
|
|
634
|
+
expect(css).toContain('font-weight: var(--font-weight-bold)');
|
|
635
|
+
});
|
|
636
|
+
});
|
|
637
|
+
|
|
406
638
|
// ===========================================================================
|
|
407
639
|
// APG structural ARIA (aria-level / aria-posinset / aria-setsize)
|
|
408
640
|
// ===========================================================================
|
|
@@ -21,7 +21,11 @@ import {spacingVars} from '../theme/tokens.stylex';
|
|
|
21
21
|
import {mergeProps} from '../utils';
|
|
22
22
|
import type {BaseProps} from '../BaseProps';
|
|
23
23
|
import {TreeListItem} from './TreeListItem';
|
|
24
|
-
import type {
|
|
24
|
+
import type {
|
|
25
|
+
TreeListItemData,
|
|
26
|
+
TreeListDensity,
|
|
27
|
+
TreeListVariant,
|
|
28
|
+
} from './TreeListTypes';
|
|
25
29
|
import {themeProps} from '../utils/themeProps';
|
|
26
30
|
import {useTreeFocus} from '../hooks/useTreeFocus';
|
|
27
31
|
|
|
@@ -29,7 +33,7 @@ import {useTreeFocus} from '../hooks/useTreeFocus';
|
|
|
29
33
|
// Types
|
|
30
34
|
// =============================================================================
|
|
31
35
|
|
|
32
|
-
export {type TreeListDensity} from './TreeListTypes';
|
|
36
|
+
export {type TreeListDensity, type TreeListVariant} from './TreeListTypes';
|
|
33
37
|
|
|
34
38
|
export interface TreeListProps extends BaseProps<HTMLDivElement> {
|
|
35
39
|
/** Ref forwarded to the root element */
|
|
@@ -50,6 +54,16 @@ export interface TreeListProps extends BaseProps<HTMLDivElement> {
|
|
|
50
54
|
*/
|
|
51
55
|
density?: TreeListDensity;
|
|
52
56
|
|
|
57
|
+
/**
|
|
58
|
+
* Visual treatment of the hierarchy guide (connector) lines.
|
|
59
|
+
* - `lineGuides`: connector lines between parent and child rows
|
|
60
|
+
* - `noGuides`: no connector lines; indentation alone conveys nesting
|
|
61
|
+
*
|
|
62
|
+
* Orthogonal to `density` (which controls spacing) — the two compose.
|
|
63
|
+
* @default 'lineGuides'
|
|
64
|
+
*/
|
|
65
|
+
variant?: TreeListVariant;
|
|
66
|
+
|
|
53
67
|
/**
|
|
54
68
|
* Header content rendered above the tree list.
|
|
55
69
|
* Semantically associated via aria-labelledby.
|
|
@@ -156,6 +170,7 @@ function findInitialTabbableId(items: TreeListItemData[]): string | undefined {
|
|
|
156
170
|
export function TreeList({
|
|
157
171
|
items,
|
|
158
172
|
density = 'balanced',
|
|
173
|
+
variant = 'lineGuides',
|
|
159
174
|
header,
|
|
160
175
|
xstyle,
|
|
161
176
|
className,
|
|
@@ -275,6 +290,7 @@ export function TreeList({
|
|
|
275
290
|
isExpanded={isExpanded}
|
|
276
291
|
onToggle={handleToggle}
|
|
277
292
|
density={density}
|
|
293
|
+
variant={variant}
|
|
278
294
|
renderedChildren={renderedChildren}
|
|
279
295
|
posInSet={index + 1}
|
|
280
296
|
setSize={items.length}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
17
|
import {colorVars, spacingVars} from '../theme/tokens.stylex';
|
|
18
18
|
import {mergeProps} from '../utils';
|
|
19
|
+
import {themeProps} from '../utils/themeProps';
|
|
19
20
|
|
|
20
21
|
const LINE_WIDTH = 1;
|
|
21
22
|
|
|
@@ -65,6 +66,11 @@ interface TreeListBranchesProps {
|
|
|
65
66
|
/**
|
|
66
67
|
* Renders vertical lines showing parent-child relationships in the tree.
|
|
67
68
|
* Positioned in a full-height container to span the entire item including children.
|
|
69
|
+
*
|
|
70
|
+
* The line element carries the stable `astryx-tree-list-guide` theme target so a
|
|
71
|
+
* theme can recolor or hide the connectors via `defineTheme` (e.g.
|
|
72
|
+
* `backgroundColor` or `display: 'none'`) instead of hiding the built-in guides
|
|
73
|
+
* and reimplementing them.
|
|
68
74
|
*/
|
|
69
75
|
export function TreeListBranches({
|
|
70
76
|
ancestorsIsLast,
|
|
@@ -90,7 +96,10 @@ export function TreeListBranches({
|
|
|
90
96
|
},
|
|
91
97
|
})}>
|
|
92
98
|
<div
|
|
93
|
-
{...
|
|
99
|
+
{...mergeProps(
|
|
100
|
+
themeProps('tree-list-guide'),
|
|
101
|
+
stylex.props(styles.verticalLine, styles.verticalFull),
|
|
102
|
+
)}
|
|
94
103
|
/>
|
|
95
104
|
</div>
|
|
96
105
|
)
|
|
@@ -103,7 +112,12 @@ export function TreeListBranches({
|
|
|
103
112
|
left: `calc(${BRANCH_MARGIN} + ${nestedLevel - 1} * ${LEVEL_INDENT})`,
|
|
104
113
|
},
|
|
105
114
|
})}>
|
|
106
|
-
<div
|
|
115
|
+
<div
|
|
116
|
+
{...mergeProps(
|
|
117
|
+
themeProps('tree-list-guide'),
|
|
118
|
+
stylex.props(styles.verticalLine, styles.verticalFull),
|
|
119
|
+
)}
|
|
120
|
+
/>
|
|
107
121
|
</div>
|
|
108
122
|
)}
|
|
109
123
|
</>
|
|
@@ -28,7 +28,7 @@ import {getIcon} from '../Icon/globalIconRegistry';
|
|
|
28
28
|
import {mergeProps} from '../utils';
|
|
29
29
|
import {useLinkComponent} from '../Link/useLinkComponent';
|
|
30
30
|
import {TreeListBranches} from './TreeListBranches';
|
|
31
|
-
import type {TreeListDensity} from './TreeListTypes';
|
|
31
|
+
import type {TreeListDensity, TreeListVariant} from './TreeListTypes';
|
|
32
32
|
import {themeProps} from '../utils/themeProps';
|
|
33
33
|
import {useTranslator} from '../i18n';
|
|
34
34
|
|
|
@@ -268,6 +268,12 @@ export interface TreeListItemInternalProps {
|
|
|
268
268
|
isExpanded: boolean;
|
|
269
269
|
onToggle?: (id: string) => void;
|
|
270
270
|
density: TreeListDensity;
|
|
271
|
+
/**
|
|
272
|
+
* Guide-line visual treatment. `noGuides` suppresses the connector lines;
|
|
273
|
+
* indentation is unaffected (it lives on the row's `marginLeft`, not the
|
|
274
|
+
* guide element).
|
|
275
|
+
*/
|
|
276
|
+
variant: TreeListVariant;
|
|
271
277
|
/** Pre-rendered children subtree (rendered by the parent recursion) */
|
|
272
278
|
renderedChildren?: ReactNode;
|
|
273
279
|
/** 1-based position of this item among its siblings (aria-posinset). */
|
|
@@ -304,6 +310,7 @@ export function TreeListItem({
|
|
|
304
310
|
isExpanded,
|
|
305
311
|
onToggle,
|
|
306
312
|
density,
|
|
313
|
+
variant,
|
|
307
314
|
renderedChildren,
|
|
308
315
|
posInSet,
|
|
309
316
|
setSize,
|
|
@@ -352,7 +359,20 @@ export function TreeListItem({
|
|
|
352
359
|
|
|
353
360
|
const labelAndDescription = (
|
|
354
361
|
<>
|
|
355
|
-
<span
|
|
362
|
+
<span
|
|
363
|
+
id={labelId}
|
|
364
|
+
{...mergeProps(
|
|
365
|
+
// Stable theme target for the item's label text. The label carries no
|
|
366
|
+
// themeable handle today, so a theme can only reach it through a
|
|
367
|
+
// fragile structural selector (a content button's first span). This
|
|
368
|
+
// adds an `astryx-tree-list-item-label` class and reflects the row's
|
|
369
|
+
// `selected` state so a theme can, e.g., bold just the selected
|
|
370
|
+
// item's label via `defineTheme`.
|
|
371
|
+
themeProps('tree-list-item-label', {
|
|
372
|
+
selected: isSelected ? 'selected' : null,
|
|
373
|
+
}),
|
|
374
|
+
stylex.props(styles.label),
|
|
375
|
+
)}>
|
|
356
376
|
{label}
|
|
357
377
|
</span>
|
|
358
378
|
{description != null && (
|
|
@@ -394,12 +414,30 @@ export function TreeListItem({
|
|
|
394
414
|
// a separate tab stop. Row-level Enter/Space forwards to this button.
|
|
395
415
|
tabIndex={-1}
|
|
396
416
|
onClick={handleToggle}
|
|
397
|
-
{...
|
|
417
|
+
{...mergeProps(
|
|
418
|
+
// Stable theme target for the expand/collapse control. `data-tree-toggle`
|
|
419
|
+
// stays as the functional activation hook; this adds a themeable
|
|
420
|
+
// `astryx-tree-list-chevron` class and reflects the open/closed state so
|
|
421
|
+
// a theme can restyle the toggle (and each state) without a fragile
|
|
422
|
+
// `[data-tree-toggle]` selector.
|
|
423
|
+
themeProps('tree-list-chevron', {
|
|
424
|
+
state: isExpanded ? 'expanded' : 'collapsed',
|
|
425
|
+
}),
|
|
426
|
+
stylex.props(styles.chevronButton),
|
|
427
|
+
)}>
|
|
398
428
|
{chevronIcon}
|
|
399
429
|
</button>
|
|
400
430
|
) : (
|
|
401
431
|
// Non-interactive chevron only when toggling is not wired up at all
|
|
402
|
-
<span
|
|
432
|
+
<span
|
|
433
|
+
{...mergeProps(
|
|
434
|
+
themeProps('tree-list-chevron', {
|
|
435
|
+
state: isExpanded ? 'expanded' : 'collapsed',
|
|
436
|
+
}),
|
|
437
|
+
stylex.props(styles.chevronContainer),
|
|
438
|
+
)}>
|
|
439
|
+
{chevronIcon}
|
|
440
|
+
</span>
|
|
403
441
|
)
|
|
404
442
|
) : null;
|
|
405
443
|
|
|
@@ -461,13 +499,15 @@ export function TreeListItem({
|
|
|
461
499
|
data-tree-level={nestedLevel + 1}
|
|
462
500
|
data-tree-disabled={isDisabled || undefined}
|
|
463
501
|
{...stylex.props(styles.wrapper)}>
|
|
464
|
-
|
|
465
|
-
<
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
502
|
+
{variant !== 'noGuides' && (
|
|
503
|
+
<div {...stylex.props(styles.treeBranches)}>
|
|
504
|
+
<TreeListBranches
|
|
505
|
+
ancestorsIsLast={ancestorsIsLast}
|
|
506
|
+
isLast={isLast}
|
|
507
|
+
nestedLevel={nestedLevel}
|
|
508
|
+
/>
|
|
509
|
+
</div>
|
|
510
|
+
)}
|
|
471
511
|
<div {...stylex.props(styles.rowWrapper)}>
|
|
472
512
|
<div
|
|
473
513
|
{...mergeProps(
|
|
@@ -487,7 +527,7 @@ export function TreeListItem({
|
|
|
487
527
|
isSelected && styles.selected,
|
|
488
528
|
),
|
|
489
529
|
)}
|
|
490
|
-
style={{
|
|
530
|
+
style={{marginInlineStart: computedMarginLeft}}
|
|
491
531
|
onClick={handleClick}>
|
|
492
532
|
{innerContent}
|
|
493
533
|
</div>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* @file TreeListTypes.ts
|
|
5
5
|
* @input Uses React types
|
|
6
|
-
* @output Exports TreeListItemData, TreeListDensity types
|
|
6
|
+
* @output Exports TreeListItemData, TreeListDensity, TreeListVariant types
|
|
7
7
|
* @position Type definitions; consumed by TreeList.tsx, TreeListItem.tsx, index.ts
|
|
8
8
|
*
|
|
9
9
|
* SYNC: When modified, update these files to stay in sync:
|
|
@@ -16,6 +16,32 @@ import type {ReactNode} from 'react';
|
|
|
16
16
|
/** Spacing density for tree list items. */
|
|
17
17
|
export type TreeListDensity = 'compact' | 'balanced' | 'spacious';
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Extensible variant map for TreeList.
|
|
21
|
+
*
|
|
22
|
+
* Theme packages can add custom variants via TypeScript module augmentation:
|
|
23
|
+
* @example
|
|
24
|
+
* ```
|
|
25
|
+
* declare module '@astryxdesign/core/TreeList' {
|
|
26
|
+
* interface TreeListVariantMap {
|
|
27
|
+
* 'dotted': true;
|
|
28
|
+
* }
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export interface TreeListVariantMap {
|
|
33
|
+
lineGuides: true;
|
|
34
|
+
noGuides: true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Visual treatment of the hierarchy guide (connector) lines. Extensible via
|
|
39
|
+
* module augmentation of TreeListVariantMap.
|
|
40
|
+
* - `lineGuides`: connector lines between parent and child rows (default)
|
|
41
|
+
* - `noGuides`: no connector lines; indentation alone conveys nesting
|
|
42
|
+
*/
|
|
43
|
+
export type TreeListVariant = keyof TreeListVariantMap;
|
|
44
|
+
|
|
19
45
|
/** Recursive item configuration for TreeList. */
|
|
20
46
|
export interface TreeListItemData {
|
|
21
47
|
/** Unique identifier for the item. Used as React key and for expansion tracking. */
|
package/src/TreeList/index.ts
CHANGED
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
export {TreeList} from './TreeList';
|
|
15
|
-
export type {TreeListProps, TreeListDensity} from './TreeList';
|
|
16
|
-
export type {TreeListItemData} from './TreeListTypes';
|
|
15
|
+
export type {TreeListProps, TreeListDensity, TreeListVariant} from './TreeList';
|
|
16
|
+
export type {TreeListItemData, TreeListVariantMap} from './TreeListTypes';
|
|
@@ -230,7 +230,7 @@ const styles = stylex.create({
|
|
|
230
230
|
outline: 'none',
|
|
231
231
|
backgroundColor: 'transparent',
|
|
232
232
|
border: 'none',
|
|
233
|
-
textAlign: '
|
|
233
|
+
textAlign: 'start',
|
|
234
234
|
},
|
|
235
235
|
itemHighlighted: {
|
|
236
236
|
backgroundColor: colorVars['--color-overlay-hover'],
|
|
@@ -431,7 +431,7 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
431
431
|
resultsGenRef.current = gen;
|
|
432
432
|
const shown = searchResults.slice(0, maxMenuItems);
|
|
433
433
|
setResults(shown);
|
|
434
|
-
setHighlightedIndex(
|
|
434
|
+
setHighlightedIndex(shown.length > 0 ? 0 : -1);
|
|
435
435
|
if (searchResults.length > 0 || searchQuery.length > 0) {
|
|
436
436
|
showLayer();
|
|
437
437
|
}
|
|
@@ -469,8 +469,9 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
469
469
|
return;
|
|
470
470
|
}
|
|
471
471
|
resultsGenRef.current = gen;
|
|
472
|
-
|
|
473
|
-
|
|
472
|
+
const shown = bootstrapResults.slice(0, maxMenuItems);
|
|
473
|
+
setResults(shown);
|
|
474
|
+
setHighlightedIndex(shown.length > 0 ? 0 : -1);
|
|
474
475
|
if (bootstrapResults.length > 0) {
|
|
475
476
|
showLayer();
|
|
476
477
|
}
|
|
@@ -637,15 +638,19 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
637
638
|
switch (e.key) {
|
|
638
639
|
case 'ArrowDown':
|
|
639
640
|
e.preventDefault();
|
|
640
|
-
|
|
641
|
-
prev
|
|
642
|
-
|
|
641
|
+
if (results.length > 0) {
|
|
642
|
+
setHighlightedIndex(prev =>
|
|
643
|
+
prev < results.length - 1 ? prev + 1 : 0,
|
|
644
|
+
);
|
|
645
|
+
}
|
|
643
646
|
break;
|
|
644
647
|
case 'ArrowUp':
|
|
645
648
|
e.preventDefault();
|
|
646
|
-
|
|
647
|
-
prev
|
|
648
|
-
|
|
649
|
+
if (results.length > 0) {
|
|
650
|
+
setHighlightedIndex(prev =>
|
|
651
|
+
prev > 0 ? prev - 1 : results.length - 1,
|
|
652
|
+
);
|
|
653
|
+
}
|
|
649
654
|
break;
|
|
650
655
|
case 'Enter':
|
|
651
656
|
e.preventDefault();
|
|
@@ -660,13 +665,17 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
660
665
|
case 'Home':
|
|
661
666
|
if (popover.isOpen) {
|
|
662
667
|
e.preventDefault();
|
|
663
|
-
|
|
668
|
+
if (results.length > 0) {
|
|
669
|
+
setHighlightedIndex(0);
|
|
670
|
+
}
|
|
664
671
|
}
|
|
665
672
|
break;
|
|
666
673
|
case 'End':
|
|
667
674
|
if (popover.isOpen) {
|
|
668
675
|
e.preventDefault();
|
|
669
|
-
|
|
676
|
+
if (results.length > 0) {
|
|
677
|
+
setHighlightedIndex(results.length - 1);
|
|
678
|
+
}
|
|
670
679
|
}
|
|
671
680
|
break;
|
|
672
681
|
}
|
|
@@ -694,13 +703,17 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
694
703
|
// cursor walks off-screen once navigation passes the visible window. Mirrors
|
|
695
704
|
// CommandPaletteItem's scrollIntoView({block: 'nearest'}) behavior.
|
|
696
705
|
useEffect(() => {
|
|
697
|
-
if (
|
|
706
|
+
if (
|
|
707
|
+
!popover.isOpen ||
|
|
708
|
+
highlightedIndex < 0 ||
|
|
709
|
+
highlightedIndex >= results.length
|
|
710
|
+
) {
|
|
698
711
|
return;
|
|
699
712
|
}
|
|
700
713
|
document
|
|
701
714
|
.getElementById(getItemId(highlightedIndex))
|
|
702
715
|
?.scrollIntoView?.({block: 'nearest'});
|
|
703
|
-
}, [popover.isOpen, highlightedIndex, getItemId]);
|
|
716
|
+
}, [popover.isOpen, highlightedIndex, getItemId, results.length]);
|
|
704
717
|
|
|
705
718
|
const selectedKey =
|
|
706
719
|
value == null ? null : getKey(value.id, () => results.indexOf(value));
|
|
@@ -725,7 +738,9 @@ export const BaseTypeahead = function BaseTypeahead<T extends SearchableItem>({
|
|
|
725
738
|
aria-expanded={popover.isOpen}
|
|
726
739
|
aria-controls={listboxId}
|
|
727
740
|
aria-activedescendant={
|
|
728
|
-
popover.isOpen &&
|
|
741
|
+
popover.isOpen &&
|
|
742
|
+
highlightedIndex >= 0 &&
|
|
743
|
+
highlightedIndex < results.length
|
|
729
744
|
? getItemId(highlightedIndex)
|
|
730
745
|
: undefined
|
|
731
746
|
}
|
|
@@ -89,6 +89,13 @@ export const docs = {
|
|
|
89
89
|
description:
|
|
90
90
|
'Validation status object with type and message for error/warning/success states.',
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
name: 'statusVariant',
|
|
94
|
+
type: "'attached' | 'detached'",
|
|
95
|
+
description:
|
|
96
|
+
'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.',
|
|
97
|
+
default: "'attached'",
|
|
98
|
+
},
|
|
92
99
|
{
|
|
93
100
|
name: 'renderItem',
|
|
94
101
|
type: '(item: T) => ReactNode',
|