@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3
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 +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +49 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +62 -20
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +7 -3
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +21 -23
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +12 -12
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +17 -9
- package/dist/Card/index.d.ts +35 -1
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +21 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -3
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/Field/InputClearButton.d.ts +9 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +14 -3
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -3
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/gestureCounter.d.ts +8 -0
- package/dist/Layer/gestureCounter.d.ts.map +1 -0
- package/dist/Layer/gestureCounter.js +53 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +128 -8
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +15 -4
- package/dist/Markdown/Markdown.d.ts +1 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +20 -7
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +4 -1
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +73 -15
- package/dist/MultiSelector/hooks.d.ts +7 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +3 -2
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +9 -5
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +1 -9
- package/dist/Popover/usePopover.d.ts +7 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +40 -21
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +12 -3
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +91 -18
- package/dist/Selector/hooks.d.ts +7 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +3 -2
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +43 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -3
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -10
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +15 -21
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +22 -7
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +71 -18
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -9
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +7 -4
- package/dist/Tokenizer/Tokenizer.d.ts +14 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +33 -21
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +31 -11
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +22 -7
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +7 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +35 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +119 -37
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +5 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +7 -2
- package/dist/astryx.css +113 -11
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/generateThemeRules.d.ts +21 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +26 -0
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/af-ZA.json +6 -6
- package/locales/ar-SA.json +6 -6
- package/locales/ca-ES.json +5 -5
- package/locales/cs-CZ.json +6 -6
- package/locales/da-DK.json +6 -6
- package/locales/de-DE.json +6 -6
- package/locales/el-GR.json +6 -6
- package/locales/en.json +163 -11
- package/locales/es-ES.json +5 -5
- package/locales/fi-FI.json +6 -6
- package/locales/fr-FR.json +6 -6
- package/locales/he-IL.json +6 -6
- package/locales/hu-HU.json +6 -6
- package/locales/it-IT.json +6 -6
- package/locales/ja-JP.json +6 -6
- package/locales/ko-KR.json +6 -6
- package/locales/nl-NL.json +6 -6
- package/locales/no-NO.json +6 -6
- package/locales/pl-PL.json +6 -6
- package/locales/pseudo.json +114 -0
- package/locales/pt-BR.json +6 -6
- package/locales/pt-PT.json +6 -6
- package/locales/ro-RO.json +6 -6
- package/locales/ru-RU.json +6 -6
- package/locales/sr-SP.json +6 -6
- package/locales/sv-SE.json +6 -6
- package/locales/tr-TR.json +6 -6
- package/locales/uk-UA.json +6 -6
- package/locales/vi-VN.json +6 -6
- package/locales/zh-CN.json +6 -6
- package/locales/zh-TW.json +6 -6
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +22 -11
- package/src/Banner/Banner.test.tsx +177 -25
- package/src/Banner/Banner.tsx +93 -27
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +7 -6
- package/src/Calendar/Calendar.test.tsx +143 -0
- package/src/Calendar/Calendar.tsx +30 -26
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +113 -19
- package/src/Card/Card.tsx +67 -89
- package/src/Card/index.ts +36 -1
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ComplexSelector/ComplexSelector.test.tsx +32 -0
- package/src/ComplexSelector/ComplexSelector.tsx +1 -3
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
- package/src/DateRangeInput/DateRangeInput.tsx +4 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/Field/InputClearButton.test.tsx +15 -1
- package/src/Field/InputClearButton.tsx +28 -4
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -3
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/gestureCounter.ts +57 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +324 -15
- package/src/Layer/useLayer.tsx +164 -8
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +311 -0
- package/src/MultiSelector/MultiSelector.tsx +151 -15
- package/src/MultiSelector/hooks.ts +9 -2
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +9 -5
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/Popover.test.tsx +14 -0
- package/src/Popover/Popover.tsx +1 -9
- package/src/Popover/usePopover.tsx +57 -32
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +346 -1
- package/src/Selector/Selector.tsx +148 -21
- package/src/Selector/hooks.ts +17 -2
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +67 -12
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +138 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +63 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +67 -1
- package/src/Text/Text.tsx +6 -3
- package/src/TextArea/TextArea.doc.mjs +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +37 -24
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +58 -0
- package/src/Timestamp/Timestamp.tsx +12 -10
- package/src/Toast/Toast.doc.mjs +26 -12
- package/src/Toast/Toast.tsx +28 -4
- package/src/Toast/ToastViewport.test.tsx +536 -8
- package/src/Toast/ToastViewport.tsx +81 -12
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +15 -10
- package/src/Token/TokenLink.tsx +14 -5
- package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +53 -24
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -5
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -7
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
- package/src/Typeahead/BaseTypeahead.tsx +181 -39
- package/src/Typeahead/Typeahead.doc.mjs +11 -0
- package/src/Typeahead/Typeahead.test.tsx +203 -0
- package/src/Typeahead/Typeahead.tsx +12 -2
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
- package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
- package/src/hooks/useInteractiveRole.doc.mjs +119 -0
- package/src/hooks/useLongPress.doc.mjs +123 -0
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/hooks/useTypeahead.doc.mjs +153 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/Theme.test.tsx +104 -2
- package/src/theme/Theme.tsx +49 -14
- package/src/theme/defineTheme.test.ts +23 -0
- package/src/theme/derivedVarRegistry.test.ts +26 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +99 -1
- package/src/theme/generateThemeRules.ts +28 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -44,12 +44,18 @@ function Harness({
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
describe('useTableRowStatus', () => {
|
|
47
|
-
it('
|
|
47
|
+
it('names the status column header for assistive technology', () => {
|
|
48
48
|
render(<Harness />);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
expect(
|
|
52
|
-
|
|
49
|
+
// The gutter looks blank but its th carries a visually hidden name.
|
|
50
|
+
const header = screen.getByRole('columnheader', {name: 'Row status'});
|
|
51
|
+
expect(header).toHaveAttribute('data-column-key', '__rowStatus');
|
|
52
|
+
// Status column is first.
|
|
53
|
+
expect(screen.getAllByRole('columnheader')[0]).toBe(header);
|
|
54
|
+
// The name must come from the clipped VisuallyHidden span — bare th text
|
|
55
|
+
// would be a visible header on what should stay a blank gutter.
|
|
56
|
+
const hiddenText = within(header).getByText('Row status');
|
|
57
|
+
expect(hiddenText.tagName).toBe('SPAN');
|
|
58
|
+
expect(hiddenText.className).not.toBe('');
|
|
53
59
|
});
|
|
54
60
|
|
|
55
61
|
it('renders a labeled dot for rows with a status', () => {
|
|
@@ -131,8 +137,8 @@ describe('useTableRowStatus', () => {
|
|
|
131
137
|
|
|
132
138
|
it('renders the status header with empty data and no indicators', () => {
|
|
133
139
|
render(<Harness rows={[]} />);
|
|
134
|
-
const
|
|
135
|
-
expect(
|
|
140
|
+
const header = screen.getByRole('columnheader', {name: 'Row status'});
|
|
141
|
+
expect(header).toHaveAttribute('data-column-key', '__rowStatus');
|
|
136
142
|
expect(screen.queryByRole('img')).not.toBeInTheDocument();
|
|
137
143
|
});
|
|
138
144
|
});
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useTableRowStatus.tsx
|
|
7
|
-
* @input React, StyleX, Icon, Table types
|
|
7
|
+
* @input React, StyleX, Icon, i18n, VisuallyHidden, Table types
|
|
8
8
|
* @output Exports useTableRowStatus hook + config type
|
|
9
9
|
* @position Row-status plugin; consumed by Table via plugins prop
|
|
10
10
|
*
|
|
@@ -16,6 +16,8 @@ import {useMemo} from 'react';
|
|
|
16
16
|
import * as stylex from '@stylexjs/stylex';
|
|
17
17
|
import {Icon, type IconColor, type IconName} from '../../../Icon';
|
|
18
18
|
import {Tooltip} from '../../../Tooltip';
|
|
19
|
+
import {useTranslator} from '../../../i18n';
|
|
20
|
+
import {VisuallyHidden} from '../../../VisuallyHidden';
|
|
19
21
|
import type {TableColumn, TablePlugin} from '../../types';
|
|
20
22
|
|
|
21
23
|
/**
|
|
@@ -142,6 +144,7 @@ const styles = stylex.create({
|
|
|
142
144
|
export function useTableRowStatus<T extends Record<string, unknown>>(
|
|
143
145
|
config: UseTableRowStatusConfig<T>,
|
|
144
146
|
): TablePlugin<T> {
|
|
147
|
+
const t = useTranslator();
|
|
145
148
|
const {getStatus} = config;
|
|
146
149
|
|
|
147
150
|
return useMemo(
|
|
@@ -149,7 +152,13 @@ export function useTableRowStatus<T extends Record<string, unknown>>(
|
|
|
149
152
|
transformColumns(columns) {
|
|
150
153
|
const statusColumn: TableColumn<T> = {
|
|
151
154
|
key: '__rowStatus',
|
|
152
|
-
|
|
155
|
+
// The gutter stays visually blank, but the th needs a discernible
|
|
156
|
+
// name for assistive technology (axe: empty-table-header).
|
|
157
|
+
header: (
|
|
158
|
+
<VisuallyHidden>
|
|
159
|
+
{t('@astryx.table.rowStatus.columnHeader')}
|
|
160
|
+
</VisuallyHidden>
|
|
161
|
+
),
|
|
153
162
|
width: STATUS_COLUMN_WIDTH,
|
|
154
163
|
resizable: false,
|
|
155
164
|
renderCell: (item: T) => {
|
|
@@ -184,6 +193,6 @@ export function useTableRowStatus<T extends Record<string, unknown>>(
|
|
|
184
193
|
return [statusColumn, ...columns];
|
|
185
194
|
},
|
|
186
195
|
}),
|
|
187
|
-
[getStatus],
|
|
196
|
+
[getStatus, t],
|
|
188
197
|
);
|
|
189
198
|
}
|
|
@@ -13,6 +13,7 @@ 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 {colorVars} from '../../../theme/tokens.stylex';
|
|
16
17
|
import type {BodyRowRenderProps, TableColumn} from '../../types';
|
|
17
18
|
|
|
18
19
|
// =============================================================================
|
|
@@ -41,10 +42,12 @@ function SelectionTable({
|
|
|
41
42
|
getIsItemSelectable,
|
|
42
43
|
getIsItemEnabled,
|
|
43
44
|
getRowLabel,
|
|
45
|
+
hasRowHighlight,
|
|
44
46
|
}: {
|
|
45
47
|
getIsItemSelectable?: (item: SelectableUser) => boolean;
|
|
46
48
|
getIsItemEnabled?: (item: SelectableUser) => boolean;
|
|
47
49
|
getRowLabel?: (item: SelectableUser) => string;
|
|
50
|
+
hasRowHighlight?: boolean;
|
|
48
51
|
}) {
|
|
49
52
|
const [selectedKeys, setSelectedKeys] = useState<Set<string>>(new Set());
|
|
50
53
|
|
|
@@ -78,6 +81,7 @@ function SelectionTable({
|
|
|
78
81
|
getIsItemSelectable,
|
|
79
82
|
getIsItemEnabled,
|
|
80
83
|
getRowLabel,
|
|
84
|
+
hasRowHighlight,
|
|
81
85
|
});
|
|
82
86
|
|
|
83
87
|
return (
|
|
@@ -211,6 +215,140 @@ describe('useTableSelection', () => {
|
|
|
211
215
|
expect(headers).toHaveLength(3);
|
|
212
216
|
});
|
|
213
217
|
|
|
218
|
+
describe('hasRowHighlight', () => {
|
|
219
|
+
const selectedBgColor = colorVars['--color-accent-muted'];
|
|
220
|
+
|
|
221
|
+
it('paints a checked row with the accent wash by default', async () => {
|
|
222
|
+
const user = userEvent.setup();
|
|
223
|
+
render(<SelectionTable />);
|
|
224
|
+
|
|
225
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
226
|
+
|
|
227
|
+
const row = screen.getAllByRole('row')[1];
|
|
228
|
+
expect(row.style.backgroundColor).toBe(selectedBgColor);
|
|
229
|
+
expect(row).toHaveAttribute('aria-selected', 'true');
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('leaves the row background alone when hasRowHighlight is false', async () => {
|
|
233
|
+
const user = userEvent.setup();
|
|
234
|
+
render(<SelectionTable hasRowHighlight={false} />);
|
|
235
|
+
|
|
236
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
237
|
+
|
|
238
|
+
const row = screen.getAllByRole('row')[1];
|
|
239
|
+
expect(row.style.backgroundColor).toBe('');
|
|
240
|
+
// The wash is opt-out; the semantics are not.
|
|
241
|
+
expect(row).toHaveAttribute('aria-selected', 'true');
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('clears an already-painted row when the flag flips to false', async () => {
|
|
245
|
+
const user = userEvent.setup();
|
|
246
|
+
const {rerender} = render(<SelectionTable />);
|
|
247
|
+
|
|
248
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
249
|
+
expect(screen.getAllByRole('row')[1].style.backgroundColor).toBe(
|
|
250
|
+
selectedBgColor,
|
|
251
|
+
);
|
|
252
|
+
|
|
253
|
+
rerender(<SelectionTable hasRowHighlight={false} />);
|
|
254
|
+
|
|
255
|
+
const row = screen.getAllByRole('row')[1];
|
|
256
|
+
expect(row.style.backgroundColor).toBe('');
|
|
257
|
+
expect(row).toHaveAttribute('aria-selected', 'true');
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it('repaints an already-checked row when the flag flips back to true', async () => {
|
|
261
|
+
const user = userEvent.setup();
|
|
262
|
+
const {rerender} = render(<SelectionTable hasRowHighlight={false} />);
|
|
263
|
+
|
|
264
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
265
|
+
rerender(<SelectionTable hasRowHighlight />);
|
|
266
|
+
|
|
267
|
+
expect(screen.getAllByRole('row')[1].style.backgroundColor).toBe(
|
|
268
|
+
selectedBgColor,
|
|
269
|
+
);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it('never paints unchecked rows in either mode', async () => {
|
|
273
|
+
const user = userEvent.setup();
|
|
274
|
+
const {rerender} = render(<SelectionTable />);
|
|
275
|
+
|
|
276
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
277
|
+
expect(screen.getAllByRole('row')[2].style.backgroundColor).toBe('');
|
|
278
|
+
expect(screen.getAllByRole('row')[2]).not.toHaveAttribute(
|
|
279
|
+
'aria-selected',
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
rerender(<SelectionTable hasRowHighlight={false} />);
|
|
283
|
+
expect(screen.getAllByRole('row')[2].style.backgroundColor).toBe('');
|
|
284
|
+
expect(screen.getAllByRole('row')[2]).not.toHaveAttribute(
|
|
285
|
+
'aria-selected',
|
|
286
|
+
);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
// A pinned cell paints over the row, then replays whatever the row
|
|
290
|
+
// published as --table-row-overlay. Without the variable the wash simply
|
|
291
|
+
// stops at the freeze line, so it has to track the background exactly.
|
|
292
|
+
describe('--table-row-overlay', () => {
|
|
293
|
+
const readOverlay = (row: HTMLElement) =>
|
|
294
|
+
row.style.getPropertyValue('--table-row-overlay');
|
|
295
|
+
|
|
296
|
+
it('publishes the wash so pinned cells can replay it', async () => {
|
|
297
|
+
const user = userEvent.setup();
|
|
298
|
+
render(<SelectionTable />);
|
|
299
|
+
|
|
300
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
301
|
+
|
|
302
|
+
expect(readOverlay(screen.getAllByRole('row')[1])).toBe(
|
|
303
|
+
selectedBgColor,
|
|
304
|
+
);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it('publishes nothing when the row is not painted', async () => {
|
|
308
|
+
const user = userEvent.setup();
|
|
309
|
+
render(<SelectionTable hasRowHighlight={false} />);
|
|
310
|
+
|
|
311
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
312
|
+
|
|
313
|
+
expect(readOverlay(screen.getAllByRole('row')[1])).toBe('');
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('withdraws the variable when a row is unchecked', async () => {
|
|
317
|
+
const user = userEvent.setup();
|
|
318
|
+
render(<SelectionTable />);
|
|
319
|
+
|
|
320
|
+
const checkbox = screen.getAllByLabelText('Select row')[0];
|
|
321
|
+
await user.click(checkbox);
|
|
322
|
+
await user.click(checkbox);
|
|
323
|
+
|
|
324
|
+
expect(readOverlay(screen.getAllByRole('row')[1])).toBe('');
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it('tracks the background when the flag flips', async () => {
|
|
328
|
+
const user = userEvent.setup();
|
|
329
|
+
const {rerender} = render(<SelectionTable />);
|
|
330
|
+
|
|
331
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
332
|
+
rerender(<SelectionTable hasRowHighlight={false} />);
|
|
333
|
+
expect(readOverlay(screen.getAllByRole('row')[1])).toBe('');
|
|
334
|
+
|
|
335
|
+
rerender(<SelectionTable hasRowHighlight />);
|
|
336
|
+
expect(readOverlay(screen.getAllByRole('row')[1])).toBe(
|
|
337
|
+
selectedBgColor,
|
|
338
|
+
);
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
it('leaves unchecked rows without the variable', async () => {
|
|
342
|
+
const user = userEvent.setup();
|
|
343
|
+
render(<SelectionTable />);
|
|
344
|
+
|
|
345
|
+
await user.click(screen.getAllByLabelText('Select row')[0]);
|
|
346
|
+
|
|
347
|
+
expect(readOverlay(screen.getAllByRole('row')[2])).toBe('');
|
|
348
|
+
});
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
|
|
214
352
|
it('unsubscribes detached row refs instead of accumulating listeners', () => {
|
|
215
353
|
const getIsItemSelected = vi.fn(() => false);
|
|
216
354
|
const {result, rerender} = renderHook(() =>
|
|
@@ -26,7 +26,13 @@
|
|
|
26
26
|
* DOM elements and no central element tracking. Each subscription
|
|
27
27
|
* self-cleans when the row disconnects.
|
|
28
28
|
*
|
|
29
|
+
* Because the background is an inline style, it outranks anything
|
|
30
|
+
* userland can layer on with StyleX. `hasRowHighlight: false` is the
|
|
31
|
+
* supported way to reclaim the row background; `aria-selected` is
|
|
32
|
+
* unaffected by it.
|
|
33
|
+
*
|
|
29
34
|
* SYNC: When modified, update these files to stay in sync:
|
|
35
|
+
* - /packages/core/src/Table/useTableSelection.doc.mjs (config prop table)
|
|
30
36
|
* - /packages/core/src/Table/Table.doc.mjs (selection documentation)
|
|
31
37
|
* - /packages/core/src/Table/index.ts (exports)
|
|
32
38
|
*/
|
|
@@ -81,6 +87,22 @@ export interface UseTableSelectionConfig<T extends Record<string, unknown>> {
|
|
|
81
87
|
* ```
|
|
82
88
|
*/
|
|
83
89
|
getRowLabel?: (item: T) => string;
|
|
90
|
+
/**
|
|
91
|
+
* Paint checked rows with the accent wash. Set false when the surrounding
|
|
92
|
+
* UI already uses row background to mean something else — a row that is
|
|
93
|
+
* open in a detail panel, for instance. The wash is an inline style, so
|
|
94
|
+
* it cannot be overridden from userland; this flag is the way off it.
|
|
95
|
+
*
|
|
96
|
+
* Only the background is dropped. `aria-selected` is still set on checked
|
|
97
|
+
* rows either way, so the selection stays legible to screen readers.
|
|
98
|
+
*
|
|
99
|
+
* @default true
|
|
100
|
+
* @example
|
|
101
|
+
* ```
|
|
102
|
+
* useTableSelection({...config, hasRowHighlight: false})
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
hasRowHighlight?: boolean;
|
|
84
106
|
}
|
|
85
107
|
|
|
86
108
|
// =============================================================================
|
|
@@ -121,17 +143,39 @@ function createSelectionStore<T extends Record<string, unknown>>(
|
|
|
121
143
|
|
|
122
144
|
/**
|
|
123
145
|
* Apply or remove selection styling on a <tr> element.
|
|
146
|
+
*
|
|
147
|
+
* `aria-selected` tracks selection on its own: it is the semantic half of
|
|
148
|
+
* the state and stays correct whether or not the row is painted.
|
|
124
149
|
*/
|
|
125
150
|
function applyRowSelectionStyle(
|
|
126
151
|
el: HTMLTableRowElement,
|
|
127
152
|
isSelected: boolean,
|
|
153
|
+
hasRowHighlight: boolean,
|
|
128
154
|
): void {
|
|
129
155
|
if (isSelected) {
|
|
130
156
|
el.setAttribute('aria-selected', 'true');
|
|
131
|
-
el.style.backgroundColor = selectedBgColor;
|
|
132
157
|
} else {
|
|
133
158
|
el.removeAttribute('aria-selected');
|
|
134
|
-
|
|
159
|
+
}
|
|
160
|
+
// Written on every pass, not just when painting: the flag can flip while a
|
|
161
|
+
// row is already selected, and the wash has to come back off.
|
|
162
|
+
const wash = isSelected && hasRowHighlight ? selectedBgColor : '';
|
|
163
|
+
if (el.style.backgroundColor !== wash) {
|
|
164
|
+
el.style.backgroundColor = wash;
|
|
165
|
+
}
|
|
166
|
+
// A pinned column paints its own opaque background over the row, so the
|
|
167
|
+
// wash alone stops at the freeze line. Publishing it as the row overlay is
|
|
168
|
+
// what lets useTableStickyColumns replay it on those cells — the same
|
|
169
|
+
// contract TableRow honours for striping and hover.
|
|
170
|
+
const currentOverlay = el.style.getPropertyValue(ROW_OVERLAY_VAR);
|
|
171
|
+
if (wash === '') {
|
|
172
|
+
if (currentOverlay !== '') {
|
|
173
|
+
el.style.removeProperty(ROW_OVERLAY_VAR);
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
if (currentOverlay !== wash) {
|
|
177
|
+
el.style.setProperty(ROW_OVERLAY_VAR, wash);
|
|
178
|
+
}
|
|
135
179
|
}
|
|
136
180
|
}
|
|
137
181
|
|
|
@@ -278,6 +322,13 @@ function SelectionCellContentInner<T extends Record<string, unknown>>({
|
|
|
278
322
|
|
|
279
323
|
const selectedBgColor = colorVars['--color-accent-muted'];
|
|
280
324
|
|
|
325
|
+
/**
|
|
326
|
+
* The row's current fill, republished for pinned cells to read. Declared as a
|
|
327
|
+
* literal rather than imported because StyleX needs the same name as a static
|
|
328
|
+
* key on the reading side, so there is no one constant both ends can share.
|
|
329
|
+
*/
|
|
330
|
+
const ROW_OVERLAY_VAR = '--table-row-overlay';
|
|
331
|
+
|
|
281
332
|
const selectionColumnStyles = stylex.create({
|
|
282
333
|
center: {
|
|
283
334
|
display: 'flex',
|
|
@@ -358,18 +409,23 @@ export function useTableSelection<T extends Record<string, unknown>>(
|
|
|
358
409
|
if (!el) {
|
|
359
410
|
return;
|
|
360
411
|
}
|
|
412
|
+
const applyStyle = () => {
|
|
413
|
+
const config = store.getConfig();
|
|
414
|
+
applyRowSelectionStyle(
|
|
415
|
+
el,
|
|
416
|
+
config.getIsItemSelected(item),
|
|
417
|
+
config.hasRowHighlight ?? true,
|
|
418
|
+
);
|
|
419
|
+
};
|
|
361
420
|
// Apply initial style
|
|
362
|
-
|
|
421
|
+
applyStyle();
|
|
363
422
|
// Subscribe for future changes
|
|
364
423
|
const unsub = store.subscribe(() => {
|
|
365
424
|
if (!el.isConnected) {
|
|
366
425
|
unsub();
|
|
367
426
|
return;
|
|
368
427
|
}
|
|
369
|
-
|
|
370
|
-
el,
|
|
371
|
-
store.getConfig().getIsItemSelected(item),
|
|
372
|
-
);
|
|
428
|
+
applyStyle();
|
|
373
429
|
});
|
|
374
430
|
return () => {
|
|
375
431
|
unsub();
|
|
@@ -210,8 +210,7 @@ const stickyStyles = stylex.create({
|
|
|
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.
|
|
212
212
|
const SHADOW_WIDTH = '6px';
|
|
213
|
-
|
|
214
|
-
const SHADOW_TINT = 'light-dark(rgba(0, 0, 0, 0.12), rgba(0, 0, 0, 0.32))';
|
|
213
|
+
const SHADOW_TINT = colorVars['--color-shadow'];
|
|
215
214
|
const shadowStyles = stylex.create({
|
|
216
215
|
// start-pinned: shadow falls toward inline-end (over scrolled content).
|
|
217
216
|
// insetInlineEnd anchors the strip to the column's inline-end edge; the strip
|
package/src/Table/types.ts
CHANGED
|
@@ -322,6 +322,19 @@ export interface BodyCellRenderProps {
|
|
|
322
322
|
* sticky offsets. Optional for backward compatibility.
|
|
323
323
|
*/
|
|
324
324
|
columns?: ReadonlyArray<TableColumn<Record<string, unknown>>>;
|
|
325
|
+
/**
|
|
326
|
+
* When true, the cell renders empty: BaseTable calls neither the column's
|
|
327
|
+
* `renderCell` nor the default renderer. Set it for a row whose cells a
|
|
328
|
+
* plugin is going to replace wholesale in `transformBodyRow` (a grouped-rows
|
|
329
|
+
* section header, a summary row) — the row is not one the consumer supplied,
|
|
330
|
+
* so their renderer can only misread it or throw, and its output is
|
|
331
|
+
* discarded moments later anyway.
|
|
332
|
+
*
|
|
333
|
+
* Applies to this cell only, and is decided per render against the final
|
|
334
|
+
* column list, so it covers columns other plugins contributed regardless of
|
|
335
|
+
* where in the pipeline this plugin sits.
|
|
336
|
+
*/
|
|
337
|
+
isContentSuppressed?: boolean;
|
|
325
338
|
}
|
|
326
339
|
|
|
327
340
|
/**
|
|
@@ -414,13 +427,18 @@ export type TableContextActions =
|
|
|
414
427
|
*
|
|
415
428
|
* 1. `transformColumns` — filter, reorder, or inject columns before rendering
|
|
416
429
|
* 2. `transformTable` — transform the root `<table>` element props
|
|
417
|
-
* 3. `
|
|
418
|
-
* 4. `
|
|
419
|
-
* 5. `
|
|
420
|
-
* 6. `
|
|
430
|
+
* 3. `transformHeaderCell` — transform each `<th>` props
|
|
431
|
+
* 4. `transformHeaderRow` — transform the header `<tr>` props
|
|
432
|
+
* 5. `transformBodyCell` — transform each body `<td>` props
|
|
433
|
+
* 6. `transformBodyRow` — transform each body `<tr>` props
|
|
421
434
|
* 7. `transformScrollWrapper` — transform the scroll-container wrapper around the table
|
|
422
435
|
* 8. `transformTableContext` — wrap the table output in context providers
|
|
423
436
|
*
|
|
437
|
+
* A row's cells are built before its row transform runs, and reach it as
|
|
438
|
+
* `children`: the cell hook is the earliest per-cell interception point, and a
|
|
439
|
+
* row transform can discard cells but cannot stop them being built (see
|
|
440
|
+
* `isContentSuppressed` on `BodyCellRenderProps` for that).
|
|
441
|
+
*
|
|
424
442
|
* Plugins may also contribute right-click menu actions by appending to
|
|
425
443
|
* `contextMenuActions` in `transformHeaderCell` / `transformBodyCell`
|
|
426
444
|
* (aggregated into one menu per header cell / row).
|
|
@@ -46,6 +46,11 @@ import {devWarn} from '../utils/devWarning';
|
|
|
46
46
|
* Canonical ordering for first-party plugin names.
|
|
47
47
|
* Plugins are sorted by their position in this array.
|
|
48
48
|
* Unknown names are appended after the known set.
|
|
49
|
+
*
|
|
50
|
+
* This decides LAYOUT — which column lands left of which, who wraps whom. It
|
|
51
|
+
* must never decide whether the table works: a plugin that renders in one
|
|
52
|
+
* order and crashes in the other is broken, and adding it here buys a lucky
|
|
53
|
+
* order rather than a fix.
|
|
49
54
|
*/
|
|
50
55
|
const PLUGIN_ORDER: ReadonlyArray<string> = [
|
|
51
56
|
'columnSettings',
|
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Table',
|
|
8
8
|
displayName: 'useTableGroupedRows',
|
|
9
9
|
description:
|
|
10
|
-
|
|
10
|
+
"Hook that groups a flat data array into collapsible section rows. Each distinct groupBy value becomes a full-width section-header row with a chevron toggle, the group label, and a member count; collapsing hides that group's data rows while keeping the header visible. Mirrors useTableTreeState: the consumer owns the collapsedGroups set and the hook returns {data, plugin, idKey}: pass them to Table as data, plugins, and idKey respectively. Grouping runs on the rows you hand it, so with pagination the order is filter, sort, slice, then group \u2014 sort by the group key first and the user's keys second, so a section's rows stay contiguous and each page appends to the bottom of the table instead of splicing rows in above the reader. A page that ends on a row count still cuts mid-section, and the heading then counts what has loaded rather than what exists \u2014 \"6\" quietly becoming \"10\". Where the full result set is in hand, carry the cut forward to the end of the section it lands in: every rendered section is then whole and its count is a total.",
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'data',
|
|
@@ -58,13 +58,14 @@ export const docs = {
|
|
|
58
58
|
/** @type {import('@astryxdesign/cli/authoring').ComponentTranslationDoc} */
|
|
59
59
|
export const docsDense = {
|
|
60
60
|
description:
|
|
61
|
-
'Groups a flat data array into collapsible section rows. Each groupBy value becomes a full-width header (chevron + label + count); collapsing hides its rows. Returns {data, plugin, idKey}: pass to Table data / plugins / idKey. Consumer owns the collapsedGroups set.',
|
|
61
|
+
'Groups a flat data array into collapsible section rows. Each groupBy value becomes a full-width header (chevron + label + count); collapsing hides its rows. Returns {data, plugin, idKey}: pass them to Table data / plugins / idKey. Consumer owns the collapsedGroups set. Under pagination the order is filter, sort, slice, group \u2014 sort by the group key first so sections stay contiguous and pages append at the bottom. A row-count cut lands mid-section and the heading counts the page, not the section; where the whole result set is in hand, carry the cut to the end of the section it lands in so every rendered section is complete.',
|
|
62
62
|
propDescriptions: {
|
|
63
63
|
data: 'The flat data to group.',
|
|
64
|
-
groupBy:
|
|
64
|
+
groupBy: "Derive a row's group key. Same key = same section.",
|
|
65
65
|
collapsedGroups: 'Set of currently-collapsed group keys.',
|
|
66
66
|
onToggleGroup: 'Called with the group key when a header is toggled.',
|
|
67
|
-
renderGroupHeader:
|
|
67
|
+
renderGroupHeader:
|
|
68
|
+
"Custom header content (right of chevron). Default '<key> (<count>)'. Args: (key, count, collapsed).",
|
|
68
69
|
getRowKey: 'Stable key for a real row; positional fallback when omitted.',
|
|
69
70
|
groupOrder: 'Pin these group keys first; others keep first-seen order.',
|
|
70
71
|
},
|
|
@@ -72,6 +72,12 @@ export const docs = {
|
|
|
72
72
|
description: 'Horizontal alignment of the pagination controls.',
|
|
73
73
|
default: "'center'",
|
|
74
74
|
},
|
|
75
|
+
{
|
|
76
|
+
name: 'label',
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: "Accessible name for the pagination nav landmark. With position='both' the two navs get distinct names (the label suffixed as '(top)' and '(bottom)') so same-type landmarks stay unique (axe landmark-unique).",
|
|
79
|
+
default: "'Table pagination'",
|
|
80
|
+
},
|
|
75
81
|
],
|
|
76
82
|
};
|
|
77
83
|
|
|
@@ -129,5 +135,6 @@ export const docsDense = {
|
|
|
129
135
|
pageSize: 'Items per page. Default 10.',
|
|
130
136
|
variant: "Pagination variant: 'pages'|'count'|'compact'|'dots'|'none'.",
|
|
131
137
|
position: "Render position: 'below'|'above'|'both'|'none'.",
|
|
138
|
+
label: "Accessible name for the nav landmark; position='both' emits '<label> (top)' / '<label> (bottom)'.",
|
|
132
139
|
},
|
|
133
140
|
};
|
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Table',
|
|
8
8
|
displayName: 'useTableRowStatus',
|
|
9
9
|
description:
|
|
10
|
-
'Hook that returns a TablePlugin which prepends a narrow column signaling per-row status: a colored status dot by default, or an icon when provided (shape + color is more accessible than color alone). getStatus maps a row to a semantic color (mapped to a theme token) or raw CSS color, an optional icon, and a required accessible label (shown in a tooltip on hover and announced to assistive technology, so status is never color-only); return null for no indicator. Memoize getStatus with useCallback for a stable plugin identity.',
|
|
10
|
+
'Hook that returns a TablePlugin which prepends a narrow column signaling per-row status: a colored status dot by default, or an icon when provided (shape + color is more accessible than color alone). getStatus maps a row to a semantic color (mapped to a theme token) or raw CSS color, an optional icon, and a required accessible label (shown in a tooltip on hover and announced to assistive technology, so status is never color-only); return null for no indicator. The column header is visually blank but carries a screen-reader-only localized name ("Row status", i18n key @astryx.table.rowStatus.columnHeader). Memoize getStatus with useCallback for a stable plugin identity.',
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'getStatus',
|
|
@@ -61,6 +61,13 @@ export const docs = {
|
|
|
61
61
|
description:
|
|
62
62
|
'Derives a human-readable identity for a row; the row checkbox\'s hidden label becomes `Select ${getRowLabel(item)}` so screen readers announce which row each checkbox selects. Falls back to "Select row" when omitted.',
|
|
63
63
|
},
|
|
64
|
+
{
|
|
65
|
+
name: 'hasRowHighlight',
|
|
66
|
+
type: 'boolean',
|
|
67
|
+
description:
|
|
68
|
+
'Paints checked rows with the accent wash. Set false when the surrounding UI already uses row background to mean something else (a row open in a detail panel, say). The wash is an inline style, so it cannot be overridden from userland. Only the background is dropped: aria-selected is still set on checked rows either way.',
|
|
69
|
+
default: 'true',
|
|
70
|
+
},
|
|
64
71
|
],
|
|
65
72
|
examples: [
|
|
66
73
|
{
|
|
@@ -82,6 +89,21 @@ const selectionPlugin = useTableSelection({
|
|
|
82
89
|
idKey="id"
|
|
83
90
|
plugins={{selection: selectionPlugin}}
|
|
84
91
|
/>;
|
|
92
|
+
`,
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
label: 'Opt out of the checked-row wash',
|
|
96
|
+
code: `
|
|
97
|
+
// This table already uses row background to mean "open in the detail
|
|
98
|
+
// panel". Turning the selection wash off keeps that meaning unambiguous;
|
|
99
|
+
// the checkbox and aria-selected still carry the selection.
|
|
100
|
+
const selectionPlugin = useTableSelection({
|
|
101
|
+
getIsItemSelected: item => selectedIds.has(item.id),
|
|
102
|
+
onSelectItem: ({item, isSelected}) => toggle(item.id, isSelected),
|
|
103
|
+
onSelectAll: ({isAllSelected}) => selectAll(isAllSelected),
|
|
104
|
+
getIsAllSelected: () => selectedIds.size === users.length,
|
|
105
|
+
hasRowHighlight: false,
|
|
106
|
+
});
|
|
85
107
|
`,
|
|
86
108
|
},
|
|
87
109
|
],
|
|
@@ -142,6 +164,13 @@ export const docsZh = {
|
|
|
142
164
|
description:
|
|
143
165
|
'为行派生人类可读的标识;行复选框的隐藏标签变为 `Select ${getRowLabel(item)}`,让屏幕阅读器播报每个复选框选择的是哪一行。省略时回退为 "Select row"。',
|
|
144
166
|
},
|
|
167
|
+
{
|
|
168
|
+
name: 'hasRowHighlight',
|
|
169
|
+
type: 'boolean',
|
|
170
|
+
description:
|
|
171
|
+
'为选中的行绘制强调色背景。当周围的界面已用行背景表达其他含义(例如该行已在详情面板中打开)时设为 false —— 该背景是内联样式,无法从业务代码覆盖。仅去掉背景:无论如何选中的行仍会设置 aria-selected。',
|
|
172
|
+
default: 'true',
|
|
173
|
+
},
|
|
145
174
|
],
|
|
146
175
|
};
|
|
147
176
|
|
|
@@ -164,5 +193,7 @@ export const docsDense = {
|
|
|
164
193
|
'Returns whether row checkbox is interactive; disabled rows show disabled checkbox.',
|
|
165
194
|
getRowLabel:
|
|
166
195
|
'Derives row identity for the checkbox\'s hidden label: `Select ${getRowLabel(item)}`. Falls back to "Select row" when omitted.',
|
|
196
|
+
hasRowHighlight:
|
|
197
|
+
'false => skip the accent wash on checked rows (inline style, not overridable from userland). aria-selected is unaffected. Defaults to true.',
|
|
167
198
|
},
|
|
168
199
|
};
|
package/src/Text/Text.test.tsx
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {render, screen} from '@testing-library/react';
|
|
9
|
-
import {describe, it, expect} from 'vitest';
|
|
9
|
+
import {describe, it, expect, vi} from 'vitest';
|
|
10
10
|
import {Text} from './Text';
|
|
11
11
|
import type {TextType} from './Text';
|
|
12
12
|
import type {TextColor} from '../theme/types';
|
|
@@ -23,6 +23,28 @@ describe('Text', () => {
|
|
|
23
23
|
expect(screen.getByText('Hello World')).toBeInTheDocument();
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
it('keeps a forwarded ref attached across rerenders', () => {
|
|
27
|
+
const ref = vi.fn();
|
|
28
|
+
const {rerender} = render(
|
|
29
|
+
<Text ref={ref} type="body">
|
|
30
|
+
Before
|
|
31
|
+
</Text>,
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const element = screen.getByText('Before');
|
|
35
|
+
expect(ref).toHaveBeenLastCalledWith(element);
|
|
36
|
+
ref.mockClear();
|
|
37
|
+
|
|
38
|
+
rerender(
|
|
39
|
+
<Text ref={ref} type="body">
|
|
40
|
+
After
|
|
41
|
+
</Text>,
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
expect(ref).not.toHaveBeenCalled();
|
|
45
|
+
expect(screen.getByText('After')).toBe(element);
|
|
46
|
+
});
|
|
47
|
+
|
|
26
48
|
it('renders as span by default', () => {
|
|
27
49
|
render(<Text type="body">Text</Text>);
|
|
28
50
|
const element = screen.getByText('Text');
|
|
@@ -275,3 +297,47 @@ describe('Text custom colors', () => {
|
|
|
275
297
|
expect(screen.getByText('Accent').className).toContain('accent');
|
|
276
298
|
});
|
|
277
299
|
});
|
|
300
|
+
|
|
301
|
+
// A truncated Text rendered its own Tooltip AND set `title` with the same
|
|
302
|
+
// string, so the browser drew a second, unstyled tooltip on top of ours.
|
|
303
|
+
describe('truncated text shows one tooltip, not two', () => {
|
|
304
|
+
function withOverflow() {
|
|
305
|
+
const proto = window.HTMLElement.prototype;
|
|
306
|
+
const original = {
|
|
307
|
+
scrollWidth: Object.getOwnPropertyDescriptor(proto, 'scrollWidth'),
|
|
308
|
+
offsetWidth: Object.getOwnPropertyDescriptor(proto, 'offsetWidth'),
|
|
309
|
+
};
|
|
310
|
+
Object.defineProperty(proto, 'scrollWidth', {
|
|
311
|
+
configurable: true,
|
|
312
|
+
get: () => 400,
|
|
313
|
+
});
|
|
314
|
+
Object.defineProperty(proto, 'offsetWidth', {
|
|
315
|
+
configurable: true,
|
|
316
|
+
get: () => 100,
|
|
317
|
+
});
|
|
318
|
+
return () => {
|
|
319
|
+
if (original.scrollWidth) {
|
|
320
|
+
Object.defineProperty(proto, 'scrollWidth', original.scrollWidth);
|
|
321
|
+
}
|
|
322
|
+
if (original.offsetWidth) {
|
|
323
|
+
Object.defineProperty(proto, 'offsetWidth', original.offsetWidth);
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
it('leaves the native title to the tooltip it already renders', () => {
|
|
329
|
+
const restore = withOverflow();
|
|
330
|
+
try {
|
|
331
|
+
render(
|
|
332
|
+
<Text type="body" maxLines={1}>
|
|
333
|
+
A label far wider than the space it has been given
|
|
334
|
+
</Text>,
|
|
335
|
+
);
|
|
336
|
+
expect(
|
|
337
|
+
screen.getByText('A label far wider than the space it has been given'),
|
|
338
|
+
).not.toHaveAttribute('title');
|
|
339
|
+
} finally {
|
|
340
|
+
restore();
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
});
|