@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -4,16 +4,20 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useListFocus.ts
|
|
7
|
-
* @input Uses React useCallback, useRef, useIsomorphicLayoutEffect
|
|
7
|
+
* @input Uses React useCallback, useRef, useIsomorphicLayoutEffect,
|
|
8
|
+
* isRtlElement
|
|
8
9
|
* @output Exports useListFocus hook for linear list keyboard navigation
|
|
9
10
|
* @position Core hook; used by TabMenu for dropdown menu navigation, Toolbar
|
|
10
11
|
* for roving tabindex, ButtonGroup, ContextMenu, NavHeadingMenu, and more.
|
|
12
|
+
* Auto-detects RTL from the container's computed direction so horizontal
|
|
13
|
+
* arrow keys follow visual direction (WCAG 1.3.2).
|
|
11
14
|
*
|
|
12
15
|
* SYNC: When modified, update:
|
|
13
16
|
* - /packages/core/src/hooks/index.ts
|
|
14
17
|
*/
|
|
15
18
|
|
|
16
19
|
import {useCallback, useRef} from 'react';
|
|
20
|
+
import {isRtlElement} from './isRtlElement';
|
|
17
21
|
import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
|
|
18
22
|
|
|
19
23
|
/**
|
|
@@ -34,6 +38,25 @@ export interface UseListFocusOptions {
|
|
|
34
38
|
*/
|
|
35
39
|
itemSelector?: string;
|
|
36
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Selector identifying a list boundary — used to scope a list that contains
|
|
43
|
+
* *nested* lists of the same kind (e.g. a menu with submenu flyouts).
|
|
44
|
+
*
|
|
45
|
+
* Overlays like submenu flyouts render inline (native popover, not a
|
|
46
|
+
* portal), so a nested list's items are DOM descendants of the parent list.
|
|
47
|
+
* Without scoping, the parent's `querySelectorAll` sweeps the nested items
|
|
48
|
+
* into its roving order (leaving hidden items `.focus()` can't land on), and
|
|
49
|
+
* key events from the nested list bubble into the parent's handler (moving
|
|
50
|
+
* focus twice). When set, `useListFocus`:
|
|
51
|
+
* - counts an item as its own only when the item's nearest
|
|
52
|
+
* `boundarySelector` ancestor is this list's container, and
|
|
53
|
+
* - ignores key events whose nearest `boundarySelector` ancestor is not
|
|
54
|
+
* this list's container (i.e. they originated in a nested list).
|
|
55
|
+
*
|
|
56
|
+
* Typically `'[role="menu"]'` for menus. Omit for flat lists.
|
|
57
|
+
*/
|
|
58
|
+
boundarySelector?: string;
|
|
59
|
+
|
|
37
60
|
/**
|
|
38
61
|
* Whether arrow navigation wraps around at the ends.
|
|
39
62
|
* @default true
|
|
@@ -62,7 +85,12 @@ export interface UseListFocusOptions {
|
|
|
62
85
|
* Whether the list is in a right-to-left context. When true, ArrowLeft and
|
|
63
86
|
* ArrowRight are swapped so horizontal navigation follows visual direction.
|
|
64
87
|
* Only affects horizontal (`'horizontal'`/`'both'`) navigation.
|
|
65
|
-
*
|
|
88
|
+
*
|
|
89
|
+
* When omitted, the direction is auto-detected from the container's computed
|
|
90
|
+
* `direction` (read lazily on keydown, only for horizontal arrow keys), so
|
|
91
|
+
* lists inside `dir="rtl"` subtrees flip automatically. Pass an explicit
|
|
92
|
+
* boolean to override detection.
|
|
93
|
+
* @default undefined (auto-detect from the container)
|
|
66
94
|
*/
|
|
67
95
|
isRtl?: boolean;
|
|
68
96
|
|
|
@@ -128,6 +156,23 @@ export interface UseListFocusReturn<T extends HTMLElement = HTMLElement> {
|
|
|
128
156
|
* Focus the last enabled item. Returns true when an item was focused.
|
|
129
157
|
*/
|
|
130
158
|
focusLast: () => boolean;
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Whether a key event belongs to this list level (vs. a nested list that
|
|
162
|
+
* shares the same `boundarySelector`). Useful when a consumer wraps
|
|
163
|
+
* `handleKeyDown` with extra behavior (Enter/Space activation, typeahead)
|
|
164
|
+
* and must apply it only to events this level owns. Always true when no
|
|
165
|
+
* `boundarySelector` is configured.
|
|
166
|
+
*/
|
|
167
|
+
ownsEvent: (e: React.KeyboardEvent) => boolean;
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The current, in-DOM-order list of this level's focusable items (already
|
|
171
|
+
* scoped by `boundarySelector`). Exposed so consumers can build typeahead
|
|
172
|
+
* targets from the same source of truth as roving focus, rather than
|
|
173
|
+
* re-querying and re-filtering.
|
|
174
|
+
*/
|
|
175
|
+
getItems: () => HTMLElement[];
|
|
131
176
|
}
|
|
132
177
|
|
|
133
178
|
// Text-editing inputs whose caret must not be hijacked by arrow navigation.
|
|
@@ -271,11 +316,12 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
|
|
|
271
316
|
): UseListFocusReturn<T> {
|
|
272
317
|
const {
|
|
273
318
|
itemSelector = '[role="menuitem"]',
|
|
319
|
+
boundarySelector,
|
|
274
320
|
wrap = true,
|
|
275
321
|
onEscape,
|
|
276
322
|
orientation = 'vertical',
|
|
277
323
|
hasHomeEnd = true,
|
|
278
|
-
isRtl
|
|
324
|
+
isRtl,
|
|
279
325
|
hasRovingTabIndex = false,
|
|
280
326
|
hasCaretGuard = false,
|
|
281
327
|
} = options;
|
|
@@ -299,13 +345,43 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
|
|
|
299
345
|
* Get all focusable items in the list.
|
|
300
346
|
*/
|
|
301
347
|
const getItems = useCallback((): HTMLElement[] => {
|
|
302
|
-
|
|
348
|
+
const listEl = listRef.current;
|
|
349
|
+
if (!listEl) {
|
|
303
350
|
return [];
|
|
304
351
|
}
|
|
305
|
-
|
|
306
|
-
|
|
352
|
+
const matched = Array.from(
|
|
353
|
+
listEl.querySelectorAll<HTMLElement>(itemSelector),
|
|
307
354
|
);
|
|
308
|
-
|
|
355
|
+
// When a boundary is set, keep only items that belong to THIS list level —
|
|
356
|
+
// i.e. whose nearest boundary ancestor is our own container. This excludes
|
|
357
|
+
// items inside nested lists (e.g. inline submenu flyouts) that would
|
|
358
|
+
// otherwise be swept in by querySelectorAll.
|
|
359
|
+
if (!boundarySelector) {
|
|
360
|
+
return matched;
|
|
361
|
+
}
|
|
362
|
+
return matched.filter(el => el.closest(boundarySelector) === listEl);
|
|
363
|
+
}, [itemSelector, boundarySelector]);
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Whether a key event belongs to this list level rather than a nested list.
|
|
367
|
+
* With a boundary set, an event that originated inside a nested boundary
|
|
368
|
+
* (e.g. a submenu flyout) has bubbled up to us and must be ignored so we
|
|
369
|
+
* don't double-handle navigation. Without a boundary, every event is ours.
|
|
370
|
+
*/
|
|
371
|
+
const ownsEvent = useCallback(
|
|
372
|
+
(e: React.KeyboardEvent): boolean => {
|
|
373
|
+
const listEl = listRef.current;
|
|
374
|
+
if (!listEl || !boundarySelector) {
|
|
375
|
+
return true;
|
|
376
|
+
}
|
|
377
|
+
const target = e.target as HTMLElement | null;
|
|
378
|
+
if (!target) {
|
|
379
|
+
return true;
|
|
380
|
+
}
|
|
381
|
+
return target.closest(boundarySelector) === listEl;
|
|
382
|
+
},
|
|
383
|
+
[boundarySelector],
|
|
384
|
+
);
|
|
309
385
|
|
|
310
386
|
/**
|
|
311
387
|
* Find the next enabled item index from `start`, moving by `step`, optionally
|
|
@@ -473,6 +549,13 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
|
|
|
473
549
|
return;
|
|
474
550
|
}
|
|
475
551
|
|
|
552
|
+
// Ignore events that bubbled up from a nested list (e.g. a submenu
|
|
553
|
+
// flyout, which renders inline inside this container). That level owns
|
|
554
|
+
// and already handled them; re-handling here would move focus twice.
|
|
555
|
+
if (!ownsEvent(e)) {
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
|
|
476
559
|
// Escape is handled regardless of orientation. Preserve the historical
|
|
477
560
|
// behavior of always consuming Escape here (preventDefault) so consumers
|
|
478
561
|
// that relied on it are unaffected.
|
|
@@ -486,11 +569,18 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
|
|
|
486
569
|
const vertical = orientation === 'vertical' || orientation === 'both';
|
|
487
570
|
|
|
488
571
|
// Resolve which keys advance vs retreat, honoring RTL for horizontal.
|
|
572
|
+
// Direction is resolved lazily — getComputedStyle runs only when a
|
|
573
|
+
// horizontal arrow key is actually pressed (SSR-safe, no layout thrash
|
|
574
|
+
// on unrelated keys) — and an explicit `isRtl` always wins.
|
|
489
575
|
const nextKeys: string[] = [];
|
|
490
576
|
const prevKeys: string[] = [];
|
|
491
577
|
if (horizontal) {
|
|
492
|
-
|
|
493
|
-
|
|
578
|
+
const rtl =
|
|
579
|
+
e.key === 'ArrowLeft' || e.key === 'ArrowRight'
|
|
580
|
+
? (isRtl ?? isRtlElement(listRef.current))
|
|
581
|
+
: false;
|
|
582
|
+
nextKeys.push(rtl ? 'ArrowLeft' : 'ArrowRight');
|
|
583
|
+
prevKeys.push(rtl ? 'ArrowRight' : 'ArrowLeft');
|
|
494
584
|
}
|
|
495
585
|
if (vertical) {
|
|
496
586
|
nextKeys.push('ArrowDown');
|
|
@@ -553,6 +643,7 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
|
|
|
553
643
|
focusFirst,
|
|
554
644
|
focusLast,
|
|
555
645
|
onEscape,
|
|
646
|
+
ownsEvent,
|
|
556
647
|
],
|
|
557
648
|
);
|
|
558
649
|
|
|
@@ -563,5 +654,7 @@ export function useListFocus<T extends HTMLElement = HTMLElement>(
|
|
|
563
654
|
focusItem,
|
|
564
655
|
focusFirst,
|
|
565
656
|
focusLast,
|
|
657
|
+
ownsEvent,
|
|
658
|
+
getItems,
|
|
566
659
|
};
|
|
567
660
|
}
|
|
@@ -14,12 +14,15 @@ function mockContainer(width: number): HTMLElement {
|
|
|
14
14
|
function mockMeasure(
|
|
15
15
|
itemWidths: number[],
|
|
16
16
|
indicatorWidth?: number,
|
|
17
|
+
itemHeight = 0,
|
|
17
18
|
): HTMLElement {
|
|
18
|
-
const children: {offsetWidth: number}[] =
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const children: {offsetWidth: number; offsetHeight: number}[] =
|
|
20
|
+
itemWidths.map(w => ({
|
|
21
|
+
offsetWidth: w,
|
|
22
|
+
offsetHeight: itemHeight,
|
|
23
|
+
}));
|
|
21
24
|
if (indicatorWidth != null) {
|
|
22
|
-
children.push({offsetWidth: indicatorWidth});
|
|
25
|
+
children.push({offsetWidth: indicatorWidth, offsetHeight: itemHeight});
|
|
23
26
|
}
|
|
24
27
|
return {children} as unknown as HTMLElement;
|
|
25
28
|
}
|
|
@@ -332,6 +335,95 @@ describe('useOverflow', () => {
|
|
|
332
335
|
});
|
|
333
336
|
});
|
|
334
337
|
|
|
338
|
+
describe('useOverflow with maxVisibleItems (cap)', () => {
|
|
339
|
+
it('caps visible items even when they all fit', () => {
|
|
340
|
+
const {result} = renderHook(() =>
|
|
341
|
+
useOverflow(5, {gap: 10, maxVisibleItems: 3}),
|
|
342
|
+
);
|
|
343
|
+
|
|
344
|
+
act(() => {
|
|
345
|
+
result.current.measureRef(mockMeasure([50, 50, 50, 50, 50], 30));
|
|
346
|
+
result.current.containerRef(mockContainer(10000));
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
expect(result.current.visibleCount).toBe(3);
|
|
350
|
+
expect(result.current.hasOverflow).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
it('cap does not raise a fit-limited count', () => {
|
|
354
|
+
const {result} = renderHook(() =>
|
|
355
|
+
useOverflow(4, {gap: 10, maxVisibleItems: 4}),
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
act(() => {
|
|
359
|
+
result.current.measureRef(mockMeasure([50, 50, 50, 50], 30));
|
|
360
|
+
result.current.containerRef(mockContainer(150));
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
expect(result.current.visibleCount).toBe(2);
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
it('min wins when maxVisibleItems < minVisibleItems and warns in dev', () => {
|
|
367
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
368
|
+
const {result} = renderHook(() =>
|
|
369
|
+
useOverflow(5, {gap: 10, minVisibleItems: 3, maxVisibleItems: 1}),
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
act(() => {
|
|
373
|
+
result.current.measureRef(mockMeasure([50, 50, 50, 50, 50], 30));
|
|
374
|
+
result.current.containerRef(mockContainer(10000));
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
expect(result.current.visibleCount).toBe(3);
|
|
378
|
+
expect(warn).toHaveBeenCalled();
|
|
379
|
+
warn.mockRestore();
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
describe('useOverflow with maxRows (multi-row)', () => {
|
|
384
|
+
it('exposes rows and rowHeight', () => {
|
|
385
|
+
const {result} = renderHook(() => useOverflow(6, {gap: 10, maxRows: 2}));
|
|
386
|
+
|
|
387
|
+
act(() => {
|
|
388
|
+
result.current.measureRef(mockMeasure([50, 50, 50, 50, 50, 50], 40, 24));
|
|
389
|
+
result.current.containerRef(mockContainer(170));
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
// 3 items per row (170), 2 rows → all 6 fit
|
|
393
|
+
expect(result.current.visibleCount).toBe(6);
|
|
394
|
+
expect(result.current.rows).toBe(2);
|
|
395
|
+
expect(result.current.rowHeight).toBe(24);
|
|
396
|
+
expect(result.current.hasOverflow).toBe(false);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it('collapses items beyond maxRows into the indicator', () => {
|
|
400
|
+
const {result} = renderHook(() => useOverflow(8, {gap: 10, maxRows: 2}));
|
|
401
|
+
|
|
402
|
+
act(() => {
|
|
403
|
+
result.current.measureRef(
|
|
404
|
+
mockMeasure([50, 50, 50, 50, 50, 50, 50, 50], 40, 24),
|
|
405
|
+
);
|
|
406
|
+
result.current.containerRef(mockContainer(170));
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
expect(result.current.visibleCount).toBe(5);
|
|
410
|
+
expect(result.current.rows).toBe(2);
|
|
411
|
+
expect(result.current.hasOverflow).toBe(true);
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
it('maxRows=1 matches single-line behavior', () => {
|
|
415
|
+
const {result} = renderHook(() => useOverflow(4, {gap: 10, maxRows: 1}));
|
|
416
|
+
|
|
417
|
+
act(() => {
|
|
418
|
+
result.current.measureRef(mockMeasure([50, 50, 50, 50], 30, 24));
|
|
419
|
+
result.current.containerRef(mockContainer(150));
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
expect(result.current.visibleCount).toBe(2);
|
|
423
|
+
expect(result.current.rows).toBe(1);
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
|
|
335
427
|
describe('useOverflow with behavior=observeParent', () => {
|
|
336
428
|
function mockContainerWithParent(
|
|
337
429
|
parentWidth: number,
|
package/src/hooks/useOverflow.ts
CHANGED
|
@@ -10,15 +10,20 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Measures children rendered in a hidden container to determine how many fit
|
|
12
12
|
* in the available width, without flickering. Uses ResizeObserver to react
|
|
13
|
-
* to container size changes.
|
|
13
|
+
* to container size changes. Supports an optional item cap (`maxVisibleItems`)
|
|
14
|
+
* and bounded multi-row wrapping (`maxRows`); the fit/clamp/row-packing math
|
|
15
|
+
* lives in the pure `computeOverflow` helper.
|
|
14
16
|
*
|
|
15
17
|
* SYNC: When modified, update:
|
|
16
18
|
* - /packages/core/src/hooks/index.ts
|
|
19
|
+
* - /packages/core/src/hooks/computeOverflow.ts (the pure computation)
|
|
17
20
|
*/
|
|
18
21
|
|
|
19
22
|
import {useState, useCallback, useRef} from 'react';
|
|
20
23
|
import {useIsomorphicLayoutEffect} from './useIsomorphicLayoutEffect';
|
|
21
24
|
import {observeResize, unobserveResize} from '../utils/sharedResizeObserver';
|
|
25
|
+
import {computeOverflow} from './computeOverflow';
|
|
26
|
+
import {useDevWarning} from './useDevWarning';
|
|
22
27
|
|
|
23
28
|
export interface UseOverflowOptions {
|
|
24
29
|
/**
|
|
@@ -33,6 +38,23 @@ export interface UseOverflowOptions {
|
|
|
33
38
|
*/
|
|
34
39
|
minVisibleItems?: number;
|
|
35
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Maximum number of items to ever show, even if they all fit. The ceiling
|
|
43
|
+
* partner to `minVisibleItems`. `undefined` means no cap. When it is less
|
|
44
|
+
* than `minVisibleItems`, the floor wins and a dev-only warning is emitted.
|
|
45
|
+
* @default undefined
|
|
46
|
+
*/
|
|
47
|
+
maxVisibleItems?: number;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Wrap items across up to this many rows before collapsing the rest into the
|
|
51
|
+
* overflow indicator. `undefined` (or `1`) keeps the single-line behavior.
|
|
52
|
+
* A number, not a boolean: unbounded wrapping is a plain flex-wrap layout,
|
|
53
|
+
* not overflow collapse. Assumes uniform row height.
|
|
54
|
+
* @default undefined
|
|
55
|
+
*/
|
|
56
|
+
maxRows?: number;
|
|
57
|
+
|
|
36
58
|
/**
|
|
37
59
|
* Which end to collapse items from.
|
|
38
60
|
* @default 'end'
|
|
@@ -61,6 +83,10 @@ export interface UseOverflowReturn {
|
|
|
61
83
|
visibleCount: number;
|
|
62
84
|
/** Whether any items are overflowing */
|
|
63
85
|
hasOverflow: boolean;
|
|
86
|
+
/** Number of rows the visible items occupy (1 for the single-line path) */
|
|
87
|
+
rows: number;
|
|
88
|
+
/** Measured max item height in pixels; used to size the multi-row container */
|
|
89
|
+
rowHeight: number;
|
|
64
90
|
}
|
|
65
91
|
|
|
66
92
|
/**
|
|
@@ -88,13 +114,25 @@ export function useOverflow(
|
|
|
88
114
|
const {
|
|
89
115
|
gap = 0,
|
|
90
116
|
minVisibleItems = 0,
|
|
117
|
+
maxVisibleItems,
|
|
118
|
+
maxRows,
|
|
91
119
|
collapseFrom = 'end',
|
|
92
120
|
behavior = 'observeSelf',
|
|
93
121
|
} = options;
|
|
94
122
|
|
|
123
|
+
useDevWarning(
|
|
124
|
+
'useOverflow',
|
|
125
|
+
`maxVisibleItems (${maxVisibleItems}) is less than ` +
|
|
126
|
+
`minVisibleItems (${minVisibleItems}); the floor wins and ` +
|
|
127
|
+
`minVisibleItems items will be shown.`,
|
|
128
|
+
maxVisibleItems != null && maxVisibleItems < minVisibleItems,
|
|
129
|
+
);
|
|
130
|
+
|
|
95
131
|
const observeParent = behavior === 'observeParent';
|
|
96
132
|
|
|
97
133
|
const [visibleCount, setVisibleCount] = useState(itemCount);
|
|
134
|
+
const [rows, setRows] = useState(1);
|
|
135
|
+
const [rowHeight, setRowHeight] = useState(0);
|
|
98
136
|
const containerElRef = useRef<HTMLElement | null>(null);
|
|
99
137
|
const measureElRef = useRef<HTMLElement | null>(null);
|
|
100
138
|
const observedElRef = useRef<HTMLElement | null>(null);
|
|
@@ -134,44 +172,45 @@ export function useOverflow(
|
|
|
134
172
|
if (children.length === 0) {
|
|
135
173
|
// eslint-disable-next-line @eslint-react/set-state-in-effect -- overflow count is derived from measured DOM widths
|
|
136
174
|
setVisibleCount(0);
|
|
175
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- derived from measured DOM
|
|
176
|
+
setRows(0);
|
|
137
177
|
return;
|
|
138
178
|
}
|
|
139
179
|
|
|
140
|
-
// Collect widths of all children
|
|
141
180
|
const widths = children.map(child => child.offsetWidth);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const reservedWidth = isLastItem
|
|
158
|
-
? 0
|
|
159
|
-
: indicatorWidth + (count > 0 || indicatorWidth > 0 ? gap : 0);
|
|
160
|
-
|
|
161
|
-
if (
|
|
162
|
-
candidateWidth + reservedWidth > availableWidth &&
|
|
163
|
-
count >= minVisibleItems
|
|
164
|
-
) {
|
|
165
|
-
break;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
totalWidth = candidateWidth;
|
|
169
|
-
count++;
|
|
170
|
-
}
|
|
181
|
+
const measuredRowHeight = children.reduce(
|
|
182
|
+
(max, child) => Math.max(max, child.offsetHeight || 0),
|
|
183
|
+
0,
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
const {visibleCount: nextVisible, rows: nextRows} = computeOverflow({
|
|
187
|
+
widths,
|
|
188
|
+
gap,
|
|
189
|
+
availableWidth,
|
|
190
|
+
indicatorWidth,
|
|
191
|
+
minVisibleItems,
|
|
192
|
+
maxVisibleItems,
|
|
193
|
+
maxRows,
|
|
194
|
+
collapseFrom,
|
|
195
|
+
});
|
|
171
196
|
|
|
172
197
|
// eslint-disable-next-line @eslint-react/set-state-in-effect -- overflow count is derived from measured DOM widths
|
|
173
|
-
setVisibleCount(
|
|
174
|
-
|
|
198
|
+
setVisibleCount(nextVisible);
|
|
199
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- derived from measured DOM
|
|
200
|
+
setRows(prev => (prev === nextRows ? prev : nextRows));
|
|
201
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- derived from measured DOM
|
|
202
|
+
setRowHeight(prev =>
|
|
203
|
+
prev === measuredRowHeight ? prev : measuredRowHeight,
|
|
204
|
+
);
|
|
205
|
+
}, [
|
|
206
|
+
itemCount,
|
|
207
|
+
gap,
|
|
208
|
+
minVisibleItems,
|
|
209
|
+
maxVisibleItems,
|
|
210
|
+
maxRows,
|
|
211
|
+
collapseFrom,
|
|
212
|
+
observeParent,
|
|
213
|
+
]);
|
|
175
214
|
|
|
176
215
|
const containerRef = useCallback(
|
|
177
216
|
(el: HTMLElement | null) => {
|
|
@@ -217,5 +256,7 @@ export function useOverflow(
|
|
|
217
256
|
measureRef,
|
|
218
257
|
visibleCount,
|
|
219
258
|
hasOverflow,
|
|
259
|
+
rows,
|
|
260
|
+
rowHeight,
|
|
220
261
|
};
|
|
221
262
|
}
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
* SYNC: When modified, update these files to stay in sync:
|
|
16
16
|
* - /packages/core/src/i18n/InternationalizationProvider.tsx
|
|
17
17
|
* - /packages/core/src/i18n/t.client.ts
|
|
18
|
+
* - /packages/core/src/i18n/useDirection.ts
|
|
19
|
+
* - /packages/core/src/i18n/getLocaleDirection.ts
|
|
18
20
|
* - /packages/core/src/i18n/index.ts
|
|
19
21
|
*/
|
|
20
22
|
|
|
@@ -23,6 +25,7 @@ import type {Locale, MessagesByLocale, Overrides} from './types';
|
|
|
23
25
|
|
|
24
26
|
export interface InternationalizationContextValue {
|
|
25
27
|
locale: Locale;
|
|
28
|
+
direction: 'ltr' | 'rtl';
|
|
26
29
|
messages: MessagesByLocale;
|
|
27
30
|
overrides?: Overrides;
|
|
28
31
|
}
|
|
@@ -34,6 +37,7 @@ export interface InternationalizationContextValue {
|
|
|
34
37
|
export const InternationalizationContext =
|
|
35
38
|
createContext<InternationalizationContextValue>({
|
|
36
39
|
locale: 'en',
|
|
40
|
+
direction: 'ltr',
|
|
37
41
|
messages: {},
|
|
38
42
|
});
|
|
39
43
|
InternationalizationContext.displayName = 'InternationalizationContext';
|
|
@@ -20,7 +20,29 @@ export const docs = {
|
|
|
20
20
|
],
|
|
21
21
|
usage: {
|
|
22
22
|
description:
|
|
23
|
-
|
|
23
|
+
'Wraps your app to set the active locale and (optionally) merge additional translation catalogs + per-locale overrides. Astryx components inside the subtree resolve their strings against this context. If no provider is present, components fall back to the shipped English defaults.',
|
|
24
|
+
bestPractices: [
|
|
25
|
+
{
|
|
26
|
+
guidance: true,
|
|
27
|
+
description:
|
|
28
|
+
'Use shipped Astryx locale catalogs from `@astryxdesign/core/locales/*` when one exists for your target locale.',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
guidance: true,
|
|
32
|
+
description:
|
|
33
|
+
'Use a same-shape local catalog only when Astryx has not shipped that locale yet or you are testing in-progress translations.',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
guidance: true,
|
|
37
|
+
description:
|
|
38
|
+
'Use real BCP 47 tags such as `fr`, `pt-BR`, or `ar`; regional locales fall back to their base language before English.',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
guidance: false,
|
|
42
|
+
description:
|
|
43
|
+
'Cast custom catalog maps to `any`; the i18n package exports `MessagesByLocale` and `Catalog` for local catalog typing.',
|
|
44
|
+
},
|
|
45
|
+
],
|
|
24
46
|
},
|
|
25
47
|
props: [
|
|
26
48
|
{
|
|
@@ -35,7 +57,7 @@ export const docs = {
|
|
|
35
57
|
type: 'MessagesByLocale',
|
|
36
58
|
required: false,
|
|
37
59
|
description:
|
|
38
|
-
'Optional map of BCP 47 tag to translation catalog.
|
|
60
|
+
'Optional map of BCP 47 tag to translation catalog. Import shipped catalogs from `@astryxdesign/core/locales/*`; the shipped "en" catalog is always available and does not need to be listed here.',
|
|
39
61
|
},
|
|
40
62
|
{
|
|
41
63
|
name: 'overrides',
|
|
@@ -51,6 +73,59 @@ export const docs = {
|
|
|
51
73
|
description: 'Content to render with the internationalization provider.',
|
|
52
74
|
},
|
|
53
75
|
],
|
|
76
|
+
examples: [
|
|
77
|
+
{
|
|
78
|
+
label: 'Load a shipped Astryx locale catalog',
|
|
79
|
+
code: `import type {ReactNode} from 'react';
|
|
80
|
+
import {InternationalizationProvider} from '@astryxdesign/core/i18n';
|
|
81
|
+
import frFR from '@astryxdesign/core/locales/fr-FR.json';
|
|
82
|
+
|
|
83
|
+
export function AppI18n({children}: {children: ReactNode}) {
|
|
84
|
+
return (
|
|
85
|
+
<InternationalizationProvider locale="fr-FR" messages={{'fr-FR': frFR}}>
|
|
86
|
+
{children}
|
|
87
|
+
</InternationalizationProvider>
|
|
88
|
+
);
|
|
89
|
+
}`,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
label: 'Override one Astryx string',
|
|
93
|
+
code: `import type {ReactNode} from 'react';
|
|
94
|
+
import {InternationalizationProvider} from '@astryxdesign/core/i18n';
|
|
95
|
+
|
|
96
|
+
export function AppI18n({children}: {children: ReactNode}) {
|
|
97
|
+
return (
|
|
98
|
+
<InternationalizationProvider
|
|
99
|
+
locale="en"
|
|
100
|
+
overrides={{
|
|
101
|
+
en: {'@astryx.selector.placeholder': 'Choose...'},
|
|
102
|
+
}}
|
|
103
|
+
>
|
|
104
|
+
{children}
|
|
105
|
+
</InternationalizationProvider>
|
|
106
|
+
);
|
|
107
|
+
}`,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
label: 'Provide a local fallback catalog',
|
|
111
|
+
code: `import type {ReactNode} from 'react';
|
|
112
|
+
import {
|
|
113
|
+
InternationalizationProvider,
|
|
114
|
+
type MessagesByLocale,
|
|
115
|
+
} from '@astryxdesign/core/i18n';
|
|
116
|
+
import ptBR from './locales/pt-BR.json';
|
|
117
|
+
|
|
118
|
+
const messages: MessagesByLocale = {'pt-BR': ptBR};
|
|
119
|
+
|
|
120
|
+
export function AppI18n({children}: {children: ReactNode}) {
|
|
121
|
+
return (
|
|
122
|
+
<InternationalizationProvider locale="pt-BR" messages={messages}>
|
|
123
|
+
{children}
|
|
124
|
+
</InternationalizationProvider>
|
|
125
|
+
);
|
|
126
|
+
}`,
|
|
127
|
+
},
|
|
128
|
+
],
|
|
54
129
|
};
|
|
55
130
|
|
|
56
131
|
/** @type {import('../docs-types').TranslationDoc} */
|
|
@@ -60,6 +135,28 @@ export const docsDense = {
|
|
|
60
135
|
usage: {
|
|
61
136
|
description:
|
|
62
137
|
'Wraps app to set active locale and (optionally) merge translation catalogs + per-locale overrides. Astryx components resolve strings against this context; missing keys fall back to shipped English.',
|
|
138
|
+
bestPractices: [
|
|
139
|
+
{
|
|
140
|
+
guidance: true,
|
|
141
|
+
description:
|
|
142
|
+
'Use shipped Astryx locale catalogs from `@astryxdesign/core/locales/*` when one exists for the target locale.',
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
guidance: true,
|
|
146
|
+
description:
|
|
147
|
+
'Use a same-shape local catalog only when Astryx has not shipped that locale yet or when testing in-progress translations.',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
guidance: true,
|
|
151
|
+
description:
|
|
152
|
+
'Use real BCP 47 tags like `fr`, `pt-BR`, or `ar`; regional locales fall back to base language before English.',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
guidance: false,
|
|
156
|
+
description:
|
|
157
|
+
'Cast custom catalog maps to `any`; the i18n package exports `MessagesByLocale` and `Catalog` for local catalog typing.',
|
|
158
|
+
},
|
|
159
|
+
],
|
|
63
160
|
},
|
|
64
161
|
propDescriptions: {
|
|
65
162
|
locale:
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
import {useMemo, type ReactNode} from 'react';
|
|
23
23
|
import {InternationalizationContext} from './InternationalizationContext';
|
|
24
|
+
import {getLocaleDirection} from './getLocaleDirection';
|
|
24
25
|
import type {Locale, MessagesByLocale, Overrides} from './types';
|
|
25
26
|
|
|
26
27
|
export interface InternationalizationProviderProps {
|
|
@@ -55,6 +56,13 @@ export interface InternationalizationProviderProps {
|
|
|
55
56
|
* ```
|
|
56
57
|
*/
|
|
57
58
|
overrides?: Overrides;
|
|
59
|
+
/**
|
|
60
|
+
* Optional explicit text direction override. When omitted, direction is derived
|
|
61
|
+
* from `locale` via `Intl.Locale.getTextInfo()`. Provide this to force a
|
|
62
|
+
* direction (e.g. RTL layout testing under an English catalog) or to skip the
|
|
63
|
+
* derivation when you already know the direction.
|
|
64
|
+
*/
|
|
65
|
+
dir?: 'ltr' | 'rtl';
|
|
58
66
|
children: ReactNode;
|
|
59
67
|
}
|
|
60
68
|
|
|
@@ -66,11 +74,13 @@ export function InternationalizationProvider({
|
|
|
66
74
|
locale,
|
|
67
75
|
messages,
|
|
68
76
|
overrides,
|
|
77
|
+
dir,
|
|
69
78
|
children,
|
|
70
79
|
}: InternationalizationProviderProps) {
|
|
80
|
+
const direction = dir ?? getLocaleDirection(locale);
|
|
71
81
|
const value = useMemo(
|
|
72
|
-
() => ({locale, messages: messages ?? {}, overrides}),
|
|
73
|
-
[locale, messages, overrides],
|
|
82
|
+
() => ({locale, direction, messages: messages ?? {}, overrides}),
|
|
83
|
+
[locale, direction, messages, overrides],
|
|
74
84
|
);
|
|
75
85
|
return (
|
|
76
86
|
<InternationalizationContext value={value}>
|