@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
|
@@ -16,6 +16,7 @@ import {useCallback, useMemo, useRef, type ReactNode} from 'react';
|
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
17
|
import {spacingVars, colorVars, radiusVars} from '../../../theme/tokens.stylex';
|
|
18
18
|
import {Icon} from '../../../Icon';
|
|
19
|
+
import {rtlStyles} from '../../../utils';
|
|
19
20
|
import {resolveContextActions} from '../../tableContextMenu';
|
|
20
21
|
import {useTranslator} from '../../../i18n';
|
|
21
22
|
import type {
|
|
@@ -361,12 +362,14 @@ function ExpansionChevron({
|
|
|
361
362
|
}}
|
|
362
363
|
aria-label={ariaLabel}
|
|
363
364
|
aria-expanded={isExpanded}>
|
|
364
|
-
<span
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
365
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
366
|
+
<span
|
|
367
|
+
{...stylex.props(
|
|
368
|
+
expansionStyles.chevronIcon,
|
|
369
|
+
isExpanded && expansionStyles.chevronExpanded,
|
|
370
|
+
)}>
|
|
371
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
372
|
+
</span>
|
|
370
373
|
</span>
|
|
371
374
|
</button>
|
|
372
375
|
);
|
|
@@ -533,12 +536,14 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
|
533
536
|
? t('@astryx.tableRowExpansion.collapseAllRows')
|
|
534
537
|
: t('@astryx.tableRowExpansion.expandAllRows')
|
|
535
538
|
}>
|
|
536
|
-
<span
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
539
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
540
|
+
<span
|
|
541
|
+
{...stylex.props(
|
|
542
|
+
expansionStyles.chevronIcon,
|
|
543
|
+
allExpanded && expansionStyles.chevronExpanded,
|
|
544
|
+
)}>
|
|
545
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
546
|
+
</span>
|
|
542
547
|
</span>
|
|
543
548
|
</button>
|
|
544
549
|
),
|
|
@@ -573,11 +578,13 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
|
573
578
|
group: 'row-expansion',
|
|
574
579
|
label: isExpanded ? 'Collapse row' : 'Expand row',
|
|
575
580
|
icon: (
|
|
576
|
-
<
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
582
|
+
<Icon
|
|
583
|
+
icon={isExpanded ? 'chevronDown' : 'chevronRight'}
|
|
584
|
+
size="xsm"
|
|
585
|
+
aria-hidden
|
|
586
|
+
/>
|
|
587
|
+
</span>
|
|
581
588
|
),
|
|
582
589
|
onSelect: () => onToggle(key),
|
|
583
590
|
},
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
import {describe, it, expect} from 'vitest';
|
|
4
|
+
import {render, screen, within} from '@testing-library/react';
|
|
5
|
+
import {Table} from '../../Table';
|
|
6
|
+
import type {TableColumn} from '../../types';
|
|
7
|
+
import {useTableRowStatus, type TableRowStatus} from './useTableRowStatus';
|
|
8
|
+
|
|
9
|
+
interface Row extends Record<string, unknown> {
|
|
10
|
+
id: string;
|
|
11
|
+
name: string;
|
|
12
|
+
state: 'error' | 'warning' | 'ok' | 'done';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const data: Row[] = [
|
|
16
|
+
{id: 'a', name: 'Alice', state: 'error'},
|
|
17
|
+
{id: 'b', name: 'Bob', state: 'ok'},
|
|
18
|
+
{id: 'c', name: 'Carol', state: 'warning'},
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const columns: TableColumn<Row>[] = [{key: 'name', header: 'Name'}];
|
|
22
|
+
|
|
23
|
+
function getStatus(item: Row): TableRowStatus | null {
|
|
24
|
+
if (item.state === 'error') {
|
|
25
|
+
return {color: 'red', label: 'Error'};
|
|
26
|
+
}
|
|
27
|
+
if (item.state === 'warning') {
|
|
28
|
+
return {color: 'orange', label: 'Warning'};
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function Harness({
|
|
34
|
+
rows = data,
|
|
35
|
+
statusFn = getStatus,
|
|
36
|
+
}: {
|
|
37
|
+
rows?: Row[];
|
|
38
|
+
statusFn?: (item: Row) => TableRowStatus | null;
|
|
39
|
+
}) {
|
|
40
|
+
const rowStatus = useTableRowStatus<Row>({getStatus: statusFn});
|
|
41
|
+
return (
|
|
42
|
+
<Table data={rows} columns={columns} idKey="id" plugins={{rowStatus}} />
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
describe('useTableRowStatus', () => {
|
|
47
|
+
it('prepends a narrow status column with an empty header', () => {
|
|
48
|
+
render(<Harness />);
|
|
49
|
+
const headers = screen.getAllByRole('columnheader');
|
|
50
|
+
// Status column is first; its header is empty.
|
|
51
|
+
expect(headers[0]).toHaveAttribute('data-column-key', '__rowStatus');
|
|
52
|
+
expect(headers[0].textContent).toBe('');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('renders a labeled dot for rows with a status', () => {
|
|
56
|
+
render(<Harness />);
|
|
57
|
+
expect(screen.getByRole('img', {name: 'Error'})).toBeInTheDocument();
|
|
58
|
+
expect(screen.getByRole('img', {name: 'Warning'})).toBeInTheDocument();
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('renders a dot (not an icon) by default', () => {
|
|
62
|
+
render(<Harness />);
|
|
63
|
+
// Default (no icon) renders a plain colored dot: no svg in the indicator.
|
|
64
|
+
const dot = screen.getByRole('img', {name: 'Error'});
|
|
65
|
+
expect(dot.querySelector('svg')).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('renders no indicator for rows returning null', () => {
|
|
69
|
+
render(<Harness />);
|
|
70
|
+
const rows = screen.getAllByRole('row');
|
|
71
|
+
// rows[2] is Bob (state ok): no status indicator in his status cell.
|
|
72
|
+
const bob = rows[2];
|
|
73
|
+
expect(within(bob).getByText('Bob')).toBeInTheDocument();
|
|
74
|
+
expect(within(bob).queryByRole('img')).not.toBeInTheDocument();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('maps a semantic color name to its icon color token', () => {
|
|
78
|
+
render(<Harness />);
|
|
79
|
+
const errorDot = screen.getByRole('img', {name: 'Error'});
|
|
80
|
+
// 'red' resolves to var(--color-icon-red); StyleX emits it on the inline
|
|
81
|
+
// style of the inner dot element.
|
|
82
|
+
const dot = errorDot.querySelector('span');
|
|
83
|
+
expect(dot?.getAttribute('style')).toContain('--color-icon-red');
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('passes through a raw CSS color as an escape hatch', () => {
|
|
87
|
+
render(
|
|
88
|
+
<Harness
|
|
89
|
+
statusFn={item =>
|
|
90
|
+
item.state === 'error' ? {color: 'rgb(1, 2, 3)', label: 'Raw'} : null
|
|
91
|
+
}
|
|
92
|
+
/>,
|
|
93
|
+
);
|
|
94
|
+
const indicator = screen.getByRole('img', {name: 'Raw'});
|
|
95
|
+
const dot = indicator.querySelector('span');
|
|
96
|
+
expect(dot?.getAttribute('style')).toContain('rgb(1, 2, 3)');
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('renders an icon as the status signifier when icon is provided', () => {
|
|
100
|
+
render(
|
|
101
|
+
<Harness
|
|
102
|
+
statusFn={item =>
|
|
103
|
+
item.state === 'error'
|
|
104
|
+
? {color: 'red', icon: 'error', label: 'Error'}
|
|
105
|
+
: null
|
|
106
|
+
}
|
|
107
|
+
/>,
|
|
108
|
+
);
|
|
109
|
+
// Icon-mode still exposes the accessible label via role=img.
|
|
110
|
+
const indicator = screen.getByRole('img', {name: 'Error'});
|
|
111
|
+
expect(indicator).toBeInTheDocument();
|
|
112
|
+
// An SVG icon is rendered inside the indicator (dot mode has no svg).
|
|
113
|
+
expect(indicator.querySelector('svg')).not.toBeNull();
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('exposes the required label as the accessible name in dot mode', () => {
|
|
117
|
+
render(
|
|
118
|
+
<Harness
|
|
119
|
+
statusFn={item =>
|
|
120
|
+
item.state === 'error' ? {color: 'red', label: 'Error'} : null
|
|
121
|
+
}
|
|
122
|
+
/>,
|
|
123
|
+
);
|
|
124
|
+
// Label is required, so every dot is announced via role=img with its name.
|
|
125
|
+
const indicator = screen.getByRole('img', {name: 'Error'});
|
|
126
|
+
expect(indicator).toBeInTheDocument();
|
|
127
|
+
// Dot mode renders no svg (that is icon mode).
|
|
128
|
+
expect(indicator.querySelector('svg')).toBeNull();
|
|
129
|
+
expect(screen.getByText('Alice')).toBeInTheDocument();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('renders the status header with empty data and no indicators', () => {
|
|
133
|
+
render(<Harness rows={[]} />);
|
|
134
|
+
const headers = screen.getAllByRole('columnheader');
|
|
135
|
+
expect(headers[0]).toHaveAttribute('data-column-key', '__rowStatus');
|
|
136
|
+
expect(screen.queryByRole('img')).not.toBeInTheDocument();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useTableRowStatus.tsx
|
|
7
|
+
* @input React, StyleX, Icon, Table types
|
|
8
|
+
* @output Exports useTableRowStatus hook + config type
|
|
9
|
+
* @position Row-status plugin; consumed by Table via plugins prop
|
|
10
|
+
*
|
|
11
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
12
|
+
* - /packages/core/src/Table/index.ts (exports)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {useMemo} from 'react';
|
|
16
|
+
import * as stylex from '@stylexjs/stylex';
|
|
17
|
+
import {Icon, type IconColor, type IconName} from '../../../Icon';
|
|
18
|
+
import {Tooltip} from '../../../Tooltip';
|
|
19
|
+
import type {TableColumn, TablePlugin} from '../../types';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Semantic status colors, resolved to the design system's icon color tokens.
|
|
23
|
+
* Prefer these over raw CSS so status colors stay consistent with the theme.
|
|
24
|
+
*/
|
|
25
|
+
export type TableRowStatusColor =
|
|
26
|
+
| 'accent'
|
|
27
|
+
| 'success'
|
|
28
|
+
| 'error'
|
|
29
|
+
| 'warning'
|
|
30
|
+
| 'red'
|
|
31
|
+
| 'orange'
|
|
32
|
+
| 'green'
|
|
33
|
+
| 'yellow'
|
|
34
|
+
| 'blue'
|
|
35
|
+
| 'gray';
|
|
36
|
+
|
|
37
|
+
const SEMANTIC_COLORS: Record<TableRowStatusColor, string> = {
|
|
38
|
+
accent: 'var(--color-icon-accent)',
|
|
39
|
+
success: 'var(--color-icon-green)',
|
|
40
|
+
error: 'var(--color-icon-red)',
|
|
41
|
+
warning: 'var(--color-icon-orange)',
|
|
42
|
+
red: 'var(--color-icon-red)',
|
|
43
|
+
orange: 'var(--color-icon-orange)',
|
|
44
|
+
green: 'var(--color-icon-green)',
|
|
45
|
+
yellow: 'var(--color-icon-yellow)',
|
|
46
|
+
blue: 'var(--color-icon-blue)',
|
|
47
|
+
gray: 'var(--color-icon-gray)',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/** Icon colors that map cleanly from a semantic status color. */
|
|
51
|
+
const ICON_COLOR_BY_STATUS: Record<TableRowStatusColor, IconColor> = {
|
|
52
|
+
accent: 'accent',
|
|
53
|
+
success: 'success',
|
|
54
|
+
error: 'error',
|
|
55
|
+
warning: 'warning',
|
|
56
|
+
red: 'red',
|
|
57
|
+
orange: 'warning',
|
|
58
|
+
green: 'green',
|
|
59
|
+
yellow: 'warning',
|
|
60
|
+
blue: 'blue',
|
|
61
|
+
gray: 'gray',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A row's status indicator. `color` accepts a semantic status color
|
|
66
|
+
* (mapped to a theme token) or any raw CSS color string as an escape hatch.
|
|
67
|
+
* By default the plugin renders a colored status dot. Provide `icon` to signal
|
|
68
|
+
* status by shape as well as color, which is more accessible when several
|
|
69
|
+
* statuses coexist. `label` is required so the status is never conveyed by
|
|
70
|
+
* color alone — it names the indicator for assistive technology and shows on
|
|
71
|
+
* hover. Return `null` for rows with no status.
|
|
72
|
+
*/
|
|
73
|
+
export interface TableRowStatus {
|
|
74
|
+
/** Semantic status color (preferred) or a raw CSS color string. */
|
|
75
|
+
color: TableRowStatusColor | (string & {});
|
|
76
|
+
/** Optional icon rendered as the signifier instead of the dot (shape as an a11y differentiator). */
|
|
77
|
+
icon?: IconName;
|
|
78
|
+
/**
|
|
79
|
+
* Accessible name for the status, announced to assistive technology and
|
|
80
|
+
* shown in a tooltip on hover. Required: a status must never be conveyed by
|
|
81
|
+
* color alone.
|
|
82
|
+
*/
|
|
83
|
+
label: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Configuration for {@link useTableRowStatus}. */
|
|
87
|
+
export interface UseTableRowStatusConfig<T extends Record<string, unknown>> {
|
|
88
|
+
/**
|
|
89
|
+
* Derive the status indicator for a row. Return `null` for no indicator.
|
|
90
|
+
* Memoize with `useCallback` for a stable plugin identity across renders.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```
|
|
94
|
+
* getStatus: row =>
|
|
95
|
+
* row.hasError ? {color: 'error', icon: 'error', label: 'Error'} : null
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
getStatus: (item: T) => TableRowStatus | null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// The status column holds a small centered dot (or an icon when provided).
|
|
102
|
+
// A fixed narrow width keeps every row's indicator aligned in one gutter.
|
|
103
|
+
const STATUS_COLUMN_WIDTH = {type: 'pixel' as const, value: 28};
|
|
104
|
+
|
|
105
|
+
/** Resolve a semantic color name to a token, or pass a raw CSS color through. */
|
|
106
|
+
function resolveColor(color: string): string {
|
|
107
|
+
return (SEMANTIC_COLORS as Record<string, string>)[color] ?? color;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const styles = stylex.create({
|
|
111
|
+
// Centers the dot or icon within the narrow status column.
|
|
112
|
+
wrap: {
|
|
113
|
+
display: 'flex',
|
|
114
|
+
alignItems: 'center',
|
|
115
|
+
justifyContent: 'center',
|
|
116
|
+
},
|
|
117
|
+
dot: (color: string) => ({
|
|
118
|
+
width: '8px',
|
|
119
|
+
height: '8px',
|
|
120
|
+
borderRadius: '50%',
|
|
121
|
+
backgroundColor: color,
|
|
122
|
+
flexShrink: 0,
|
|
123
|
+
}),
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Returns a {@link TablePlugin} that prepends a narrow column signaling per-row
|
|
128
|
+
* status: a colored status dot by default, or an icon when `icon` is provided
|
|
129
|
+
* (shape + color is more accessible than color alone).
|
|
130
|
+
*
|
|
131
|
+
* @example
|
|
132
|
+
* ```
|
|
133
|
+
* const rowStatus = useTableRowStatus<Row>({
|
|
134
|
+
* getStatus: row =>
|
|
135
|
+
* row.state === 'error'
|
|
136
|
+
* ? {color: 'error', icon: 'error', label: 'Error'}
|
|
137
|
+
* : null,
|
|
138
|
+
* });
|
|
139
|
+
* <Table data={data} columns={columns} idKey="id" plugins={{rowStatus}} />;
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
export function useTableRowStatus<T extends Record<string, unknown>>(
|
|
143
|
+
config: UseTableRowStatusConfig<T>,
|
|
144
|
+
): TablePlugin<T> {
|
|
145
|
+
const {getStatus} = config;
|
|
146
|
+
|
|
147
|
+
return useMemo(
|
|
148
|
+
(): TablePlugin<T> => ({
|
|
149
|
+
transformColumns(columns) {
|
|
150
|
+
const statusColumn: TableColumn<T> = {
|
|
151
|
+
key: '__rowStatus',
|
|
152
|
+
header: '',
|
|
153
|
+
width: STATUS_COLUMN_WIDTH,
|
|
154
|
+
resizable: false,
|
|
155
|
+
renderCell: (item: T) => {
|
|
156
|
+
const status = getStatus(item);
|
|
157
|
+
if (!status) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
const signifier = status.icon ? (
|
|
161
|
+
<Icon
|
|
162
|
+
icon={status.icon}
|
|
163
|
+
size="xsm"
|
|
164
|
+
color={
|
|
165
|
+
ICON_COLOR_BY_STATUS[status.color as TableRowStatusColor] ??
|
|
166
|
+
'primary'
|
|
167
|
+
}
|
|
168
|
+
/>
|
|
169
|
+
) : (
|
|
170
|
+
<span {...stylex.props(styles.dot(resolveColor(status.color)))} />
|
|
171
|
+
);
|
|
172
|
+
return (
|
|
173
|
+
<Tooltip content={status.label}>
|
|
174
|
+
<span
|
|
175
|
+
{...stylex.props(styles.wrap)}
|
|
176
|
+
role="img"
|
|
177
|
+
aria-label={status.label}>
|
|
178
|
+
{signifier}
|
|
179
|
+
</span>
|
|
180
|
+
</Tooltip>
|
|
181
|
+
);
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
return [statusColumn, ...columns];
|
|
185
|
+
},
|
|
186
|
+
}),
|
|
187
|
+
[getStatus],
|
|
188
|
+
);
|
|
189
|
+
}
|
|
@@ -7,13 +7,13 @@
|
|
|
7
7
|
* @position Test file; validates selection behavior (checkboxes, aria, select-all)
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {describe, it, expect} from 'vitest';
|
|
10
|
+
import {describe, it, expect, vi} from 'vitest';
|
|
11
11
|
import {useState} from 'react';
|
|
12
|
-
import {render, screen, within} from '@testing-library/react';
|
|
12
|
+
import {act, render, renderHook, screen, within} from '@testing-library/react';
|
|
13
13
|
import userEvent from '@testing-library/user-event';
|
|
14
14
|
import {Table} from '../../Table';
|
|
15
15
|
import {useTableSelection} from './useTableSelection';
|
|
16
|
-
import type {TableColumn} from '../../types';
|
|
16
|
+
import type {BodyRowRenderProps, TableColumn} from '../../types';
|
|
17
17
|
|
|
18
18
|
// =============================================================================
|
|
19
19
|
// Test Data
|
|
@@ -40,9 +40,11 @@ const selectableColumns: TableColumn<SelectableUser>[] = [
|
|
|
40
40
|
function SelectionTable({
|
|
41
41
|
getIsItemSelectable,
|
|
42
42
|
getIsItemEnabled,
|
|
43
|
+
getRowLabel,
|
|
43
44
|
}: {
|
|
44
45
|
getIsItemSelectable?: (item: SelectableUser) => boolean;
|
|
45
46
|
getIsItemEnabled?: (item: SelectableUser) => boolean;
|
|
47
|
+
getRowLabel?: (item: SelectableUser) => string;
|
|
46
48
|
}) {
|
|
47
49
|
const [selectedKeys, setSelectedKeys] = useState<Set<string>>(new Set());
|
|
48
50
|
|
|
@@ -75,6 +77,7 @@ function SelectionTable({
|
|
|
75
77
|
},
|
|
76
78
|
getIsItemSelectable,
|
|
77
79
|
getIsItemEnabled,
|
|
80
|
+
getRowLabel,
|
|
78
81
|
});
|
|
79
82
|
|
|
80
83
|
return (
|
|
@@ -109,6 +112,19 @@ describe('useTableSelection', () => {
|
|
|
109
112
|
expect(rowCheckboxes).toHaveLength(3);
|
|
110
113
|
});
|
|
111
114
|
|
|
115
|
+
it('derives per-row accessible names from getRowLabel', () => {
|
|
116
|
+
render(<SelectionTable getRowLabel={item => item.name} />);
|
|
117
|
+
expect(screen.getByLabelText('Select Alice')).toBeInTheDocument();
|
|
118
|
+
expect(screen.getByLabelText('Select Bob')).toBeInTheDocument();
|
|
119
|
+
expect(screen.getByLabelText('Select Charlie')).toBeInTheDocument();
|
|
120
|
+
expect(screen.queryByLabelText('Select row')).not.toBeInTheDocument();
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('keeps the "Select all rows" header label when getRowLabel is provided', () => {
|
|
124
|
+
render(<SelectionTable getRowLabel={item => item.name} />);
|
|
125
|
+
expect(screen.getByLabelText('Select all rows')).toBeInTheDocument();
|
|
126
|
+
});
|
|
127
|
+
|
|
112
128
|
it('toggles individual row selection on click', async () => {
|
|
113
129
|
const user = userEvent.setup();
|
|
114
130
|
render(<SelectionTable />);
|
|
@@ -194,4 +210,62 @@ describe('useTableSelection', () => {
|
|
|
194
210
|
const headers = within(headerRow).getAllByRole('columnheader');
|
|
195
211
|
expect(headers).toHaveLength(3);
|
|
196
212
|
});
|
|
213
|
+
|
|
214
|
+
it('unsubscribes detached row refs instead of accumulating listeners', () => {
|
|
215
|
+
const getIsItemSelected = vi.fn(() => false);
|
|
216
|
+
const {result, rerender} = renderHook(() =>
|
|
217
|
+
useTableSelection<SelectableUser>({
|
|
218
|
+
getIsItemSelected,
|
|
219
|
+
onSelectItem: vi.fn(),
|
|
220
|
+
onSelectAll: vi.fn(),
|
|
221
|
+
getIsAllSelected: () => false,
|
|
222
|
+
}),
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
const initialProps: BodyRowRenderProps = {
|
|
226
|
+
htmlProps: {},
|
|
227
|
+
styles: [],
|
|
228
|
+
children: null,
|
|
229
|
+
};
|
|
230
|
+
const row = document.createElement('tr');
|
|
231
|
+
document.body.append(row);
|
|
232
|
+
|
|
233
|
+
let detach: (() => void) | undefined;
|
|
234
|
+
|
|
235
|
+
// Simulate React replacing the callback ref as this row re-renders.
|
|
236
|
+
// Each detach must unsubscribe the previous ref before the next attaches.
|
|
237
|
+
for (let i = 0; i < 3; i++) {
|
|
238
|
+
act(() => {
|
|
239
|
+
detach?.();
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
const transformed = result.current.transformBodyRow?.(
|
|
243
|
+
initialProps,
|
|
244
|
+
selectableUsers[0],
|
|
245
|
+
0,
|
|
246
|
+
);
|
|
247
|
+
expect(transformed?.ref).toBeTypeOf('function');
|
|
248
|
+
|
|
249
|
+
act(() => {
|
|
250
|
+
const cleanup = (
|
|
251
|
+
transformed?.ref as React.RefCallback<HTMLTableRowElement>
|
|
252
|
+
)(row);
|
|
253
|
+
expect(cleanup).toBeTypeOf('function');
|
|
254
|
+
detach = cleanup as () => void;
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
getIsItemSelected.mockClear();
|
|
259
|
+
rerender();
|
|
260
|
+
expect(getIsItemSelected).toHaveBeenCalledTimes(1);
|
|
261
|
+
|
|
262
|
+
act(() => {
|
|
263
|
+
detach?.();
|
|
264
|
+
});
|
|
265
|
+
getIsItemSelected.mockClear();
|
|
266
|
+
rerender();
|
|
267
|
+
expect(getIsItemSelected).not.toHaveBeenCalled();
|
|
268
|
+
|
|
269
|
+
row.remove();
|
|
270
|
+
});
|
|
197
271
|
});
|
|
@@ -68,6 +68,19 @@ export interface UseTableSelectionConfig<T extends Record<string, unknown>> {
|
|
|
68
68
|
getIsItemSelectable?: (item: T) => boolean;
|
|
69
69
|
/** Is this row's checkbox interactive? Disabled rows show disabled checkbox. @default () => true */
|
|
70
70
|
getIsItemEnabled?: (item: T) => boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Derive a human-readable identity for a row, used in the row checkbox's
|
|
73
|
+
* hidden label as `Select ${getRowLabel(item)}`. Without it, every row
|
|
74
|
+
* checkbox announces an undifferentiated "Select row" to screen readers.
|
|
75
|
+
* With `getRowLabel: item => item.name`, checkbox accessible names become
|
|
76
|
+
* "Select Alice", "Select Bob", and so on.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```
|
|
80
|
+
* getRowLabel: item => item.name
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
getRowLabel?: (item: T) => string;
|
|
71
84
|
}
|
|
72
85
|
|
|
73
86
|
// =============================================================================
|
|
@@ -235,6 +248,7 @@ function SelectionCellContentInner<T extends Record<string, unknown>>({
|
|
|
235
248
|
const isSelected = useIsItemSelected(store, item);
|
|
236
249
|
const selectable = config.getIsItemSelectable?.(item) ?? true;
|
|
237
250
|
const enabled = config.getIsItemEnabled?.(item) ?? true;
|
|
251
|
+
const rowLabel = config.getRowLabel?.(item);
|
|
238
252
|
|
|
239
253
|
if (!selectable) {
|
|
240
254
|
return null;
|
|
@@ -242,7 +256,11 @@ function SelectionCellContentInner<T extends Record<string, unknown>>({
|
|
|
242
256
|
|
|
243
257
|
return (
|
|
244
258
|
<CheckboxInput
|
|
245
|
-
label={
|
|
259
|
+
label={
|
|
260
|
+
rowLabel != null
|
|
261
|
+
? t('@astryx.table.selection.selectRowNamed', {label: rowLabel})
|
|
262
|
+
: t('@astryx.table.selection.selectRow')
|
|
263
|
+
}
|
|
246
264
|
isLabelHidden
|
|
247
265
|
value={isSelected}
|
|
248
266
|
onChange={() =>
|
|
@@ -353,6 +371,9 @@ export function useTableSelection<T extends Record<string, unknown>>(
|
|
|
353
371
|
store.getConfig().getIsItemSelected(item),
|
|
354
372
|
);
|
|
355
373
|
});
|
|
374
|
+
return () => {
|
|
375
|
+
unsub();
|
|
376
|
+
};
|
|
356
377
|
};
|
|
357
378
|
|
|
358
379
|
return {
|
|
@@ -205,7 +205,7 @@ const stickyStyles = stylex.create({
|
|
|
205
205
|
},
|
|
206
206
|
});
|
|
207
207
|
|
|
208
|
-
// Soft drop shadow over the scrolling region (
|
|
208
|
+
// Soft drop shadow over the scrolling region (a standard sticky-column shadow treatment).
|
|
209
209
|
// border-collapse tables don't paint box-shadow on cells in Chromium, so it's a
|
|
210
210
|
// ::after gradient strip just past the pinned edge (visible thanks to the cell's
|
|
211
211
|
// overflow: visible). Opacity is gated by the scroll-state variable above.
|