@astryxdesign/core 0.1.9 → 0.2.0-canary.068bda9
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 +107 -0
- package/dist/Avatar/Avatar.d.ts +42 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +190 -59
- package/dist/Avatar/AvatarStatusDot.d.ts +6 -4
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- 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 +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -2
- package/dist/Banner/Banner.js +2 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -4
- package/dist/Breadcrumbs/index.d.ts +1 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +2 -1
- package/dist/Button/Button.d.ts +1 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +6 -4
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +50 -9
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +2 -2
- 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.js +1 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +22 -12
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +3 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatMessageBubble.d.ts.map +1 -1
- package/dist/Chat/ChatMessageBubble.js +8 -8
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +10 -3
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -6
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +19 -4
- 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/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +16 -10
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +42 -3
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +23 -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 +10 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +33 -19
- 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 +23 -18
- package/dist/Divider/Divider.d.ts +2 -2
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +13 -0
- 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.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +435 -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 +24 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +34 -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 +4 -1
- package/dist/Field/FieldLabel.d.ts +2 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -5
- 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 +10 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +51 -5
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +93 -65
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +3 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +10 -4
- package/dist/Icon/Icon.d.ts +15 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +16 -3
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +31 -6
- package/dist/Layer/layerAnimations.stylex.d.ts.map +1 -1
- package/dist/Layer/layerAnimations.stylex.js +10 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +34 -15
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +6 -3
- package/dist/List/ListItem.d.ts +11 -1
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +2 -0
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MetadataList/MetadataList.d.ts +1 -1
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +4 -2
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +81 -43
- 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.js +2 -2
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- 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/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +6 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +5 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +49 -19
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +5 -3
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +66 -17
- 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/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +2 -2
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +87 -34
- package/dist/Spinner/Spinner.d.ts +3 -2
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +11 -2
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +171 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabList.d.ts +2 -11
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +5 -9
- package/dist/TabList/TabListContext.d.ts +0 -5
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +0 -5
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +30 -4
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- 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 +37 -27
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +3 -0
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +15 -7
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -23
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Text/Text.d.ts +10 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +25 -2
- package/dist/Text/index.d.ts +2 -2
- package/dist/Text/index.d.ts.map +1 -1
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +119 -52
- 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.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +51 -45
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +17 -17
- package/dist/Timestamp/Timestamp.d.ts +31 -3
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +48 -77
- package/dist/Timestamp/formatInstant.d.ts +41 -0
- package/dist/Timestamp/formatInstant.d.ts.map +1 -0
- package/dist/Timestamp/formatInstant.js +177 -0
- package/dist/Timestamp/index.d.ts +1 -0
- package/dist/Timestamp/index.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.d.ts +56 -0
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -0
- package/dist/Timestamp/tooltipEntries.js +163 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +61 -9
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +3 -1
- package/dist/Token/Token.d.ts +34 -4
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +85 -45
- package/dist/Token/TokenLink.d.ts +62 -0
- package/dist/Token/TokenLink.d.ts.map +1 -0
- package/dist/Token/TokenLink.js +76 -0
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +9 -2
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +4 -2
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavItem.d.ts +3 -1
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +30 -3
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +9 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +1 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +8 -6
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +32 -14
- package/dist/Typeahead/BaseTypeahead.d.ts +9 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +22 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +11 -2
- 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 +114 -35
- package/dist/astryx.umd.js +50 -50
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.pool.stylex.d.ts +281 -0
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.pool.stylex.js +281 -0
- package/dist/hooks/index.d.ts +4 -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/useAnnounce.d.ts +3 -0
- package/dist/hooks/useAnnounce.d.ts.map +1 -1
- package/dist/hooks/useAnnounce.js +39 -1
- package/dist/hooks/useContainerReveal.d.ts +83 -0
- package/dist/hooks/useContainerReveal.d.ts.map +1 -0
- package/dist/hooks/useContainerReveal.js +123 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +52 -11
- 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/useHotkeys.d.ts +9 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +9 -0
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +169 -0
- package/dist/hooks/useKeyboardHint.d.ts +1 -1
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +4 -2
- 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/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/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/index.d.ts +3 -3
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/types.d.ts +39 -2
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/plainDate.d.ts +17 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +23 -4
- 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/locales/en.json +120 -0
- package/locales/pseudo.json +90 -0
- package/package.json +7 -2
- package/src/Avatar/Avatar.doc.mjs +50 -3
- package/src/Avatar/Avatar.test.tsx +218 -0
- package/src/Avatar/Avatar.tsx +285 -79
- package/src/Avatar/AvatarStatusDot.doc.mjs +4 -4
- package/src/Avatar/AvatarStatusDot.tsx +6 -4
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +162 -2
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -2
- package/src/Banner/Banner.tsx +6 -6
- package/src/Breadcrumbs/BreadcrumbItem.tsx +10 -10
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +52 -1
- package/src/Breadcrumbs/index.ts +4 -0
- package/src/Button/Button.doc.mjs +0 -4
- package/src/Button/Button.test.tsx +16 -0
- package/src/Button/Button.tsx +6 -4
- package/src/Calendar/Calendar.test.tsx +170 -20
- package/src/Calendar/Calendar.tsx +73 -16
- package/src/Calendar/dayCellUtils.test.ts +18 -18
- package/src/Calendar/dayCellUtils.ts +2 -2
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.tsx +1 -1
- package/src/Carousel/Carousel.tsx +25 -6
- package/src/Chat/ChatComposer.doc.mjs +2 -2
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.tsx +2 -2
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayout.tsx +4 -4
- package/src/Chat/ChatMessageBubble.tsx +15 -10
- package/src/Chat/ChatSystemMessage.test.tsx +5 -0
- package/src/Chat/ChatToolCalls.tsx +9 -2
- package/src/Chat/useTriggerMenu.tsx +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +23 -0
- package/src/CheckboxInput/CheckboxInput.tsx +21 -6
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +94 -3
- package/src/CheckboxList/CheckboxListItem.tsx +17 -10
- 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/CodeBlock/CodeBlock.test.tsx +17 -0
- package/src/CodeBlock/CodeBlock.tsx +38 -11
- 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.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +41 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +59 -2
- package/src/ContextMenu/ContextMenu.tsx +22 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +25 -0
- package/src/DateInput/DateInput.test.tsx +230 -0
- package/src/DateInput/DateInput.tsx +51 -29
- 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 +112 -0
- package/src/DateTimeInput/DateTimeInput.tsx +44 -39
- package/src/Divider/Divider.test.tsx +32 -8
- package/src/Divider/Divider.tsx +14 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +60 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +4 -12
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +20 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +663 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +561 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +40 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.doc.mjs +4 -0
- package/src/Field/Field.tsx +14 -9
- package/src/Field/FieldLabel.test.tsx +25 -0
- package/src/Field/FieldLabel.tsx +12 -3
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +1 -0
- package/src/FieldStatus/FieldStatus.test.tsx +133 -0
- package/src/FieldStatus/FieldStatus.tsx +61 -4
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +104 -13
- package/src/FileInput/FileInput.tsx +106 -79
- package/src/Heading/Heading.tsx +2 -1
- package/src/HoverCard/useHoverCard.tsx +15 -3
- package/src/Icon/Icon.doc.mjs +13 -0
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +51 -3
- package/src/Item/Item.doc.mjs +5 -0
- package/src/Item/Item.test.tsx +88 -0
- package/src/Item/Item.tsx +57 -11
- package/src/Layer/layerAnimations.stylex.ts +23 -0
- package/src/Lightbox/Lightbox.test.tsx +33 -0
- package/src/Lightbox/Lightbox.tsx +30 -10
- package/src/List/List.test.tsx +17 -29
- package/src/List/List.tsx +6 -1
- package/src/List/ListItem.doc.mjs +12 -0
- package/src/List/ListItem.tsx +13 -0
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MetadataList/MetadataList.test.tsx +24 -0
- package/src/MetadataList/MetadataList.tsx +6 -2
- package/src/MultiSelector/MultiSelector.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.test.tsx +402 -0
- package/src/MultiSelector/MultiSelector.tsx +126 -64
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +71 -0
- package/src/NumberInput/NumberInput.tsx +35 -26
- package/src/Outline/Outline.test.tsx +12 -12
- package/src/Outline/Outline.tsx +2 -2
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/PowerSearch/PowerSearch.doc.mjs +15 -0
- package/src/PowerSearch/PowerSearch.test.tsx +23 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/ProgressBar/ProgressBar.test.tsx +34 -0
- package/src/ProgressBar/ProgressBar.tsx +16 -1
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.test.tsx +26 -4
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +12 -5
- package/src/Resizable/ResizeHandle.test.tsx +94 -0
- package/src/Resizable/ResizeHandle.tsx +70 -20
- package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +22 -2
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +370 -0
- package/src/Selector/Selector.tsx +88 -20
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +9 -7
- package/src/SideNav/SideNavItem.tsx +5 -3
- package/src/Skeleton/Skeleton.test.tsx +16 -0
- package/src/Skeleton/Skeleton.tsx +13 -1
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +240 -12
- package/src/Slider/Slider.tsx +96 -23
- package/src/Spinner/Spinner.test.tsx +10 -8
- package/src/Spinner/Spinner.tsx +15 -5
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +111 -0
- package/src/Switch/Switch.tsx +149 -32
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabList.doc.mjs +0 -6
- package/src/TabList/TabList.test.tsx +3 -15
- package/src/TabList/TabList.tsx +6 -17
- package/src/TabList/TabListContext.ts +0 -6
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +34 -2
- 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/plugins/groupedRows/useTableGroupedRows.tsx +9 -6
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +27 -18
- package/src/Table/plugins/selection/useTableSelection.test.tsx +61 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +3 -0
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +38 -9
- package/src/Table/plugins/tree/useTableTreeData.tsx +17 -13
- package/src/Table/types.ts +33 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Text/Heading.doc.mjs +3 -3
- package/src/Text/Text.doc.mjs +1 -1
- package/src/Text/Text.test.tsx +42 -0
- package/src/Text/Text.tsx +25 -1
- package/src/Text/index.ts +2 -6
- package/src/TextArea/TextArea.doc.mjs +23 -2
- package/src/TextArea/TextArea.test.tsx +132 -4
- package/src/TextArea/TextArea.tsx +161 -67
- 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 +1 -1
- package/src/Thumbnail/Thumbnail.test.tsx +24 -1
- package/src/Thumbnail/Thumbnail.tsx +28 -35
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +23 -0
- package/src/TimeInput/TimeInput.tsx +24 -25
- package/src/Timestamp/Timestamp.doc.mjs +32 -6
- package/src/Timestamp/Timestamp.test.tsx +371 -0
- package/src/Timestamp/Timestamp.tsx +96 -93
- package/src/Timestamp/formatInstant.ts +218 -0
- package/src/Timestamp/index.ts +4 -0
- package/src/Timestamp/tooltipEntries.test.ts +552 -0
- package/src/Timestamp/tooltipEntries.ts +210 -0
- package/src/Toast/ToastViewport.test.tsx +218 -8
- package/src/Toast/ToastViewport.tsx +71 -12
- package/src/ToggleButton/ToggleButton.test.tsx +24 -0
- package/src/ToggleButton/ToggleButton.tsx +19 -1
- package/src/Token/Token.test.tsx +166 -15
- package/src/Token/Token.tsx +104 -47
- package/src/Token/TokenLink.tsx +107 -0
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +23 -1
- package/src/Tokenizer/Tokenizer.test.tsx +23 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +93 -2
- package/src/TopNav/TopNavItem.doc.mjs +3 -3
- package/src/TopNav/TopNavItem.tsx +35 -6
- package/src/TopNav/TopNavMegaMenu.tsx +26 -2
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
- package/src/TreeList/TreeList.doc.mjs +6 -0
- package/src/TreeList/TreeList.test.tsx +50 -10
- package/src/TreeList/TreeList.tsx +5 -0
- package/src/TreeList/TreeListBranches.tsx +8 -6
- package/src/TreeList/TreeListItem.tsx +33 -11
- package/src/Typeahead/BaseTypeahead.tsx +42 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +112 -0
- package/src/Typeahead/Typeahead.tsx +17 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/babelPluginAddExtensions.test.ts +190 -0
- package/src/__tests__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/doc-mjs.d.ts +19 -0
- package/src/hooks/containerReveal.pool.stylex.ts +464 -0
- package/src/hooks/index.ts +13 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useAnnounce.test.tsx +75 -2
- package/src/hooks/useAnnounce.ts +47 -1
- package/src/hooks/useContainerReveal.test.tsx +116 -0
- package/src/hooks/useContainerReveal.ts +180 -0
- package/src/hooks/useFocusTrap.test.tsx +104 -0
- package/src/hooks/useFocusTrap.ts +61 -12
- 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/useHotkeys.ts +9 -0
- package/src/hooks/useInputStatusIcon.test.tsx +221 -0
- package/src/hooks/useInputStatusIcon.tsx +235 -0
- package/src/hooks/useKeyboardHint.test.tsx +22 -0
- package/src/hooks/useKeyboardHint.tsx +6 -2
- 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/i18n/InternationalizationContext.ts +4 -0
- 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/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +42 -0
- package/src/theme/index.ts +4 -8
- package/src/theme/types.ts +43 -13
- package/src/utils/index.ts +2 -0
- package/src/utils/plainDate.test.ts +24 -6
- package/src/utils/plainDate.ts +18 -4
- package/src/utils/rtlStyles.ts +27 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +0 -9
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +0 -1
- package/dist/Thumbnail/thumbnail.markers.stylex.js +0 -14
- package/src/Thumbnail/thumbnail.markers.stylex.ts +0 -12
package/src/Table/Table.doc.mjs
CHANGED
|
@@ -93,6 +93,17 @@ export const docs = {
|
|
|
93
93
|
type: 'Record<string, TablePlugin<T>>',
|
|
94
94
|
description: 'Named plugins that extend table behavior via the transform pipeline. Converted to an ordered array internally.',
|
|
95
95
|
},
|
|
96
|
+
{
|
|
97
|
+
name: 'rowIndexStart',
|
|
98
|
+
type: 'number',
|
|
99
|
+
description: 'ARIA row index (1-based) for the first rendered body row. The row ordinal is an accessibility concern independent of any visible index column, so setting this (or rowCount) makes the table emit aria-rowindex on body rows and aria-rowcount on the table. For a paginated/windowed view, pass the offset of the first visible row (e.g. (page - 1) * pageSize + 1) so aria-rowindex reflects position in the full dataset. Data-driven mode only.',
|
|
100
|
+
default: '1',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'rowCount',
|
|
104
|
+
type: 'number',
|
|
105
|
+
description: 'Total number of body rows across all pages/windows, used for aria-rowcount so assistive tech can announce "row X of Y" against the full dataset. When omitted but rowIndexStart is set (windowed view with an unknown total), aria-rowcount is set to -1 per the ARIA unknown-count convention. Data-driven mode only.',
|
|
106
|
+
},
|
|
96
107
|
{
|
|
97
108
|
name: 'children',
|
|
98
109
|
type: 'ReactNode',
|
package/src/Table/Table.test.tsx
CHANGED
|
@@ -1451,3 +1451,88 @@ describe('emptyState', () => {
|
|
|
1451
1451
|
});
|
|
1452
1452
|
});
|
|
1453
1453
|
});
|
|
1454
|
+
|
|
1455
|
+
describe('ARIA row indexing (#3939)', () => {
|
|
1456
|
+
const bodyRows = (container: HTMLElement): HTMLTableRowElement[] =>
|
|
1457
|
+
Array.from(container.querySelectorAll('tbody tr'));
|
|
1458
|
+
|
|
1459
|
+
it('emits no aria-rowindex/aria-rowcount by default', () => {
|
|
1460
|
+
const {container} = render(<Table data={users} columns={columns} />);
|
|
1461
|
+
expect(screen.getByRole('table')).not.toHaveAttribute('aria-rowcount');
|
|
1462
|
+
for (const row of bodyRows(container)) {
|
|
1463
|
+
expect(row).not.toHaveAttribute('aria-rowindex');
|
|
1464
|
+
}
|
|
1465
|
+
});
|
|
1466
|
+
|
|
1467
|
+
it('numbers rows from 1 when rowCount is provided', () => {
|
|
1468
|
+
const {container} = render(
|
|
1469
|
+
<Table data={users} columns={columns} rowCount={users.length} />,
|
|
1470
|
+
);
|
|
1471
|
+
expect(screen.getByRole('table')).toHaveAttribute(
|
|
1472
|
+
'aria-rowcount',
|
|
1473
|
+
String(users.length),
|
|
1474
|
+
);
|
|
1475
|
+
const indices = bodyRows(container).map(r =>
|
|
1476
|
+
r.getAttribute('aria-rowindex'),
|
|
1477
|
+
);
|
|
1478
|
+
expect(indices).toEqual(['1', '2', '3']);
|
|
1479
|
+
});
|
|
1480
|
+
|
|
1481
|
+
it('offsets aria-rowindex by rowIndexStart for a paginated view', () => {
|
|
1482
|
+
// Page 3 of a 10-per-page dataset: first visible row is dataset row 21.
|
|
1483
|
+
const {container} = render(
|
|
1484
|
+
<Table
|
|
1485
|
+
data={users}
|
|
1486
|
+
columns={columns}
|
|
1487
|
+
rowIndexStart={21}
|
|
1488
|
+
rowCount={100}
|
|
1489
|
+
/>,
|
|
1490
|
+
);
|
|
1491
|
+
expect(screen.getByRole('table')).toHaveAttribute('aria-rowcount', '100');
|
|
1492
|
+
const indices = bodyRows(container).map(r =>
|
|
1493
|
+
r.getAttribute('aria-rowindex'),
|
|
1494
|
+
);
|
|
1495
|
+
expect(indices).toEqual(['21', '22', '23']);
|
|
1496
|
+
});
|
|
1497
|
+
|
|
1498
|
+
it('sets aria-rowcount to -1 (unknown) when only rowIndexStart is given', () => {
|
|
1499
|
+
// Windowed/cursor pagination: offset known, total unknown.
|
|
1500
|
+
const {container} = render(
|
|
1501
|
+
<Table data={users} columns={columns} rowIndexStart={5} />,
|
|
1502
|
+
);
|
|
1503
|
+
expect(screen.getByRole('table')).toHaveAttribute('aria-rowcount', '-1');
|
|
1504
|
+
const indices = bodyRows(container).map(r =>
|
|
1505
|
+
r.getAttribute('aria-rowindex'),
|
|
1506
|
+
);
|
|
1507
|
+
expect(indices).toEqual(['5', '6', '7']);
|
|
1508
|
+
});
|
|
1509
|
+
|
|
1510
|
+
it('does not assign an ARIA row index to the header row', () => {
|
|
1511
|
+
render(<Table data={users} columns={columns} rowCount={users.length} />);
|
|
1512
|
+
const header = screen.getAllByRole('row')[0];
|
|
1513
|
+
expect(header).not.toHaveAttribute('aria-rowindex');
|
|
1514
|
+
});
|
|
1515
|
+
|
|
1516
|
+
it('lets a plugin override the seeded aria-rowindex', () => {
|
|
1517
|
+
const plugin: TablePlugin<User> = {
|
|
1518
|
+
transformBodyRow(props, _item, index) {
|
|
1519
|
+
return {
|
|
1520
|
+
...props,
|
|
1521
|
+
htmlProps: {...props.htmlProps, 'aria-rowindex': 100 + index},
|
|
1522
|
+
};
|
|
1523
|
+
},
|
|
1524
|
+
};
|
|
1525
|
+
const {container} = render(
|
|
1526
|
+
<Table
|
|
1527
|
+
data={users}
|
|
1528
|
+
columns={columns}
|
|
1529
|
+
rowCount={users.length}
|
|
1530
|
+
plugins={{custom: plugin}}
|
|
1531
|
+
/>,
|
|
1532
|
+
);
|
|
1533
|
+
const indices = bodyRows(container).map(r =>
|
|
1534
|
+
r.getAttribute('aria-rowindex'),
|
|
1535
|
+
);
|
|
1536
|
+
expect(indices).toEqual(['100', '101', '102']);
|
|
1537
|
+
});
|
|
1538
|
+
});
|
package/src/Table/TableCell.tsx
CHANGED
|
@@ -161,12 +161,12 @@ const dividerRowStyles = stylex.create({
|
|
|
161
161
|
|
|
162
162
|
const dividerColumnStyles = stylex.create({
|
|
163
163
|
cell: {
|
|
164
|
-
|
|
164
|
+
borderInlineEndWidth: {
|
|
165
165
|
default: borderVars['--border-width'],
|
|
166
166
|
':last-child': '0',
|
|
167
167
|
},
|
|
168
|
-
|
|
169
|
-
|
|
168
|
+
borderInlineEndStyle: 'solid',
|
|
169
|
+
borderInlineEndColor: colorVars['--color-border'],
|
|
170
170
|
},
|
|
171
171
|
});
|
|
172
172
|
|
|
@@ -91,12 +91,12 @@ const headerDividerStyles = stylex.create({
|
|
|
91
91
|
|
|
92
92
|
const dividerColumnStyles = stylex.create({
|
|
93
93
|
cell: {
|
|
94
|
-
|
|
94
|
+
borderInlineEndWidth: {
|
|
95
95
|
default: borderVars['--border-width'],
|
|
96
96
|
':last-child': '0',
|
|
97
97
|
},
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
borderInlineEndStyle: 'solid',
|
|
99
|
+
borderInlineEndColor: colorVars['--color-border'],
|
|
100
100
|
},
|
|
101
101
|
});
|
|
102
102
|
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
fontWeightVars,
|
|
21
21
|
} from '../../../theme/tokens.stylex';
|
|
22
22
|
import {Icon} from '../../../Icon';
|
|
23
|
+
import {rtlStyles} from '../../../utils';
|
|
23
24
|
import type {TablePlugin} from '../../types';
|
|
24
25
|
import {useTranslator} from '../../../i18n';
|
|
25
26
|
|
|
@@ -333,12 +334,14 @@ export function useTableGroupedRows<T extends Record<string, unknown>>(
|
|
|
333
334
|
})
|
|
334
335
|
}
|
|
335
336
|
aria-expanded={!collapsed}>
|
|
336
|
-
<span
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
337
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
338
|
+
<span
|
|
339
|
+
{...stylex.props(
|
|
340
|
+
styles.chevronIcon,
|
|
341
|
+
!collapsed && styles.chevronExpanded,
|
|
342
|
+
)}>
|
|
343
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
344
|
+
</span>
|
|
342
345
|
</span>
|
|
343
346
|
</button>
|
|
344
347
|
{content}
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
useTableRowExpansion,
|
|
10
10
|
useTableRowExpansionState,
|
|
11
11
|
} from './useTableRowExpansion';
|
|
12
|
+
import {InternationalizationProvider} from '../../../i18n';
|
|
12
13
|
|
|
13
14
|
// popover mock for context-menu tests
|
|
14
15
|
beforeEach(() => {
|
|
@@ -118,6 +119,24 @@ describe('useTableRowExpansion', () => {
|
|
|
118
119
|
expect(items.length).toBeGreaterThan(0);
|
|
119
120
|
});
|
|
120
121
|
|
|
122
|
+
it('localizes the context-menu action label through the i18n catalog', () => {
|
|
123
|
+
render(
|
|
124
|
+
<InternationalizationProvider
|
|
125
|
+
locale="fr"
|
|
126
|
+
overrides={{
|
|
127
|
+
fr: {'@astryx.tableRowExpansion.expandRow': 'Développer la ligne'},
|
|
128
|
+
}}>
|
|
129
|
+
<Harness />
|
|
130
|
+
</InternationalizationProvider>,
|
|
131
|
+
);
|
|
132
|
+
fireEvent.contextMenu(screen.getByText('Folder A'));
|
|
133
|
+
const items = screen.getAllByRole('menuitem', {
|
|
134
|
+
name: /Développer la ligne/,
|
|
135
|
+
hidden: true,
|
|
136
|
+
});
|
|
137
|
+
expect(items.length).toBeGreaterThan(0);
|
|
138
|
+
});
|
|
139
|
+
|
|
121
140
|
it('does not show chevron for leaf nodes', () => {
|
|
122
141
|
render(<Harness />);
|
|
123
142
|
// Leaf C has no children
|
|
@@ -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
|
),
|
|
@@ -571,13 +576,17 @@ export function useTableRowExpansion<T extends Record<string, unknown>>(
|
|
|
571
576
|
{
|
|
572
577
|
id: 'row-expansion-toggle',
|
|
573
578
|
group: 'row-expansion',
|
|
574
|
-
label: isExpanded
|
|
579
|
+
label: isExpanded
|
|
580
|
+
? t('@astryx.tableRowExpansion.collapseRow')
|
|
581
|
+
: t('@astryx.tableRowExpansion.expandRow'),
|
|
575
582
|
icon: (
|
|
576
|
-
<
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
583
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
584
|
+
<Icon
|
|
585
|
+
icon={isExpanded ? 'chevronDown' : 'chevronRight'}
|
|
586
|
+
size="xsm"
|
|
587
|
+
aria-hidden
|
|
588
|
+
/>
|
|
589
|
+
</span>
|
|
581
590
|
),
|
|
582
591
|
onSelect: () => onToggle(key),
|
|
583
592
|
},
|
|
@@ -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
|
|
@@ -210,4 +210,62 @@ describe('useTableSelection', () => {
|
|
|
210
210
|
const headers = within(headerRow).getAllByRole('columnheader');
|
|
211
211
|
expect(headers).toHaveLength(3);
|
|
212
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
|
+
xstyle: [],
|
|
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
|
+
});
|
|
213
271
|
});
|
|
@@ -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.
|
|
@@ -213,7 +213,12 @@ const SHADOW_WIDTH = '6px';
|
|
|
213
213
|
// --color-shadow is only ~10% alpha (too faint here); use a slightly stronger soft tint.
|
|
214
214
|
const SHADOW_TINT = 'light-dark(rgba(0, 0, 0, 0.12), rgba(0, 0, 0, 0.32))';
|
|
215
215
|
const shadowStyles = stylex.create({
|
|
216
|
-
// start-pinned: shadow falls
|
|
216
|
+
// start-pinned: shadow falls toward inline-end (over scrolled content).
|
|
217
|
+
// insetInlineEnd anchors the strip to the column's inline-end edge; the strip
|
|
218
|
+
// must then be nudged one full width OUTWARD (past that edge) into the
|
|
219
|
+
// scrolled region. Outward is +X under LTR (inline-end = right) but −X under
|
|
220
|
+
// RTL (inline-end = left), and the fade must run from the pinned edge toward
|
|
221
|
+
// content in each direction — hence both transform and gradient flip on dir.
|
|
217
222
|
start: {
|
|
218
223
|
'::after': {
|
|
219
224
|
content: '""',
|
|
@@ -222,14 +227,24 @@ const shadowStyles = stylex.create({
|
|
|
222
227
|
bottom: 0,
|
|
223
228
|
insetInlineEnd: 0,
|
|
224
229
|
width: SHADOW_WIDTH,
|
|
225
|
-
transform:
|
|
230
|
+
transform: {
|
|
231
|
+
default: 'translateX(100%)',
|
|
232
|
+
':is([dir="rtl"] *)': 'translateX(-100%)',
|
|
233
|
+
},
|
|
226
234
|
pointerEvents: 'none',
|
|
227
235
|
transition: 'opacity 150ms ease',
|
|
228
236
|
opacity: `var(${SHADOW_VAR_START}, 0)`,
|
|
229
|
-
backgroundImage:
|
|
237
|
+
backgroundImage: {
|
|
238
|
+
default: `linear-gradient(to right, ${SHADOW_TINT}, transparent)`,
|
|
239
|
+
':is([dir="rtl"] *)': `linear-gradient(to left, ${SHADOW_TINT}, transparent)`,
|
|
240
|
+
},
|
|
230
241
|
},
|
|
231
242
|
},
|
|
232
|
-
// end-pinned: shadow falls
|
|
243
|
+
// end-pinned: shadow falls toward inline-start (over scrolled content).
|
|
244
|
+
// insetInlineStart anchors the strip to the column's inline-start edge; the
|
|
245
|
+
// strip is nudged one full width OUTWARD into content — −X under LTR
|
|
246
|
+
// (inline-start = left) but +X under RTL (inline-start = right) — with the
|
|
247
|
+
// gradient fading from the pinned edge toward content in each direction.
|
|
233
248
|
end: {
|
|
234
249
|
'::after': {
|
|
235
250
|
content: '""',
|
|
@@ -238,11 +253,17 @@ const shadowStyles = stylex.create({
|
|
|
238
253
|
bottom: 0,
|
|
239
254
|
insetInlineStart: 0,
|
|
240
255
|
width: SHADOW_WIDTH,
|
|
241
|
-
transform:
|
|
256
|
+
transform: {
|
|
257
|
+
default: 'translateX(-100%)',
|
|
258
|
+
':is([dir="rtl"] *)': 'translateX(100%)',
|
|
259
|
+
},
|
|
242
260
|
pointerEvents: 'none',
|
|
243
261
|
transition: 'opacity 150ms ease',
|
|
244
262
|
opacity: `var(${SHADOW_VAR_END}, 0)`,
|
|
245
|
-
backgroundImage:
|
|
263
|
+
backgroundImage: {
|
|
264
|
+
default: `linear-gradient(to left, ${SHADOW_TINT}, transparent)`,
|
|
265
|
+
':is([dir="rtl"] *)': `linear-gradient(to right, ${SHADOW_TINT}, transparent)`,
|
|
266
|
+
},
|
|
246
267
|
},
|
|
247
268
|
},
|
|
248
269
|
});
|
|
@@ -289,16 +310,24 @@ export function useTableStickyColumns<T extends Record<string, unknown>>(
|
|
|
289
310
|
const {hasStart: hs, hasEnd: he} = stateRef.current;
|
|
290
311
|
const maxScroll = el.scrollWidth - el.clientWidth;
|
|
291
312
|
const hasOverflow = maxScroll > 1;
|
|
313
|
+
// RTL-safe scroll position. Spec-compliant browsers report a NEGATIVE
|
|
314
|
+
// scrollLeft under RTL (0 at the inline-start edge, decreasing toward the
|
|
315
|
+
// inline-end edge), so a raw `scrollLeft > 1` start test would never fire
|
|
316
|
+
// and the end test would be wrong-signed. Math.abs collapses both
|
|
317
|
+
// conventions to a distance-from-inline-start, matching the repo's own
|
|
318
|
+
// useScrollOverflow (overflowStart/overflowEnd use Math.abs, tolerance 1).
|
|
319
|
+
// No-op under LTR where scrollLeft is already >= 0.
|
|
320
|
+
const pos = Math.abs(el.scrollLeft);
|
|
292
321
|
if (hs) {
|
|
293
322
|
el.style.setProperty(
|
|
294
323
|
SHADOW_VAR_START,
|
|
295
|
-
hasOverflow &&
|
|
324
|
+
hasOverflow && pos > 1 ? '1' : '0',
|
|
296
325
|
);
|
|
297
326
|
}
|
|
298
327
|
if (he) {
|
|
299
328
|
el.style.setProperty(
|
|
300
329
|
SHADOW_VAR_END,
|
|
301
|
-
hasOverflow &&
|
|
330
|
+
hasOverflow && pos < maxScroll - 1 ? '1' : '0',
|
|
302
331
|
);
|
|
303
332
|
}
|
|
304
333
|
};
|
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
import * as stylex from '@stylexjs/stylex';
|
|
43
43
|
import {colorVars, radiusVars, spacingVars} from '../../../theme/tokens.stylex';
|
|
44
44
|
import {Icon} from '../../../Icon';
|
|
45
|
-
import {mergeRefs} from '../../../utils';
|
|
45
|
+
import {mergeRefs, rtlStyles} from '../../../utils';
|
|
46
46
|
import type {
|
|
47
47
|
TablePlugin,
|
|
48
48
|
TableColumn,
|
|
@@ -299,12 +299,14 @@ function TreeExpander({
|
|
|
299
299
|
: t('@astryx.tableTree.expandRow')
|
|
300
300
|
}
|
|
301
301
|
aria-expanded={isExpanded}>
|
|
302
|
-
<span
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
302
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
303
|
+
<span
|
|
304
|
+
{...stylex.props(
|
|
305
|
+
treeStyles.chevron,
|
|
306
|
+
isExpanded && treeStyles.chevronExpanded,
|
|
307
|
+
)}>
|
|
308
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
309
|
+
</span>
|
|
308
310
|
</span>
|
|
309
311
|
</button>
|
|
310
312
|
);
|
|
@@ -346,12 +348,14 @@ function TreeExpandAllToggle({
|
|
|
346
348
|
: t('@astryx.tableTree.expandAllRows')
|
|
347
349
|
}
|
|
348
350
|
aria-expanded={allExpanded}>
|
|
349
|
-
<span
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
351
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
352
|
+
<span
|
|
353
|
+
{...stylex.props(
|
|
354
|
+
treeStyles.chevron,
|
|
355
|
+
allExpanded && treeStyles.chevronExpanded,
|
|
356
|
+
)}>
|
|
357
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
358
|
+
</span>
|
|
355
359
|
</span>
|
|
356
360
|
</button>
|
|
357
361
|
);
|
package/src/Table/types.ts
CHANGED
|
@@ -540,6 +540,39 @@ export interface BaseTableProps<
|
|
|
540
540
|
/** Plugins to transform render props at each level */
|
|
541
541
|
plugins?: TablePlugin<T>[];
|
|
542
542
|
|
|
543
|
+
/**
|
|
544
|
+
* ARIA row index (1-based) assigned to the **first** rendered body row.
|
|
545
|
+
*
|
|
546
|
+
* The row ordinal is an accessibility concern independent of any visible
|
|
547
|
+
* index column: `aria-rowindex` on each `<tr>` should reflect the row's
|
|
548
|
+
* position in the **full** dataset, not just the current page. For a
|
|
549
|
+
* paginated / windowed view, pass the offset of the first visible row,
|
|
550
|
+
* e.g. `(page - 1) * pageSize + 1`.
|
|
551
|
+
*
|
|
552
|
+
* Setting this (or {@link rowCount}) opts the table into emitting
|
|
553
|
+
* `aria-rowindex` on body rows and `aria-rowcount` on the `<table>`. Data
|
|
554
|
+
* rows are numbered from this value; the header row keeps native table
|
|
555
|
+
* semantics and is not assigned an ARIA row index (so the visible
|
|
556
|
+
* `useTableRowIndex` numbering and `aria-rowindex` stay in agreement).
|
|
557
|
+
*
|
|
558
|
+
* Applies to data-driven mode only (ignored in children mode).
|
|
559
|
+
*
|
|
560
|
+
* @default 1
|
|
561
|
+
*/
|
|
562
|
+
rowIndexStart?: number;
|
|
563
|
+
/**
|
|
564
|
+
* Total number of body rows across **all** pages/windows, used for
|
|
565
|
+
* `aria-rowcount` on the `<table>`. Provide this for paginated data so
|
|
566
|
+
* assistive tech can announce "row X of Y" against the full dataset.
|
|
567
|
+
*
|
|
568
|
+
* When omitted but {@link rowIndexStart} is set (a windowed view with an
|
|
569
|
+
* unknown total, e.g. cursor pagination), `aria-rowcount` is set to `-1`
|
|
570
|
+
* per the ARIA convention for an unknown row count.
|
|
571
|
+
*
|
|
572
|
+
* Applies to data-driven mode only (ignored in children mode).
|
|
573
|
+
*/
|
|
574
|
+
rowCount?: number;
|
|
575
|
+
|
|
543
576
|
/** Children mode — render `<tr>`/`<td>` directly instead of data-driven */
|
|
544
577
|
children?: ReactNode;
|
|
545
578
|
/**
|
|
@@ -13,7 +13,7 @@ export const docs = {
|
|
|
13
13
|
name: 'getStatus',
|
|
14
14
|
type: "(item: T) => { color: 'accent' | 'success' | 'error' | 'warning' | 'red' | 'orange' | 'green' | 'yellow' | 'blue' | 'gray' | string; icon?: IconName; label: string } | null",
|
|
15
15
|
description:
|
|
16
|
-
'Derive the status indicator for a row: a semantic color (accent, success, error, warning, red, orange, green, yellow, blue, gray
|
|
16
|
+
'Derive the status indicator for a row: a semantic color (accent, success, error, warning, red, orange, green, yellow, blue, gray, each mapped to a theme token) or a raw CSS color as an escape hatch; an optional icon to signal status by shape instead of the dot (recommended when multiple statuses coexist; valid names: close, chevronDown, chevronLeft, chevronRight, check, success, error, warning, info, calendar, clock, externalLink, menu, moreHorizontal, search, arrowUp, arrowDown, arrowsUpDown, funnel, eyeSlash, viewColumns, copy, checkDouble, wrench, stop, microphone); and a required accessible label (announced via role="img" and shown in a tooltip on hover, so a status is never conveyed by color alone). Return null for rows with no status. Memoize with useCallback for a stable plugin identity.',
|
|
17
17
|
required: true,
|
|
18
18
|
},
|
|
19
19
|
],
|
package/src/Text/Heading.doc.mjs
CHANGED
|
@@ -33,7 +33,7 @@ export const docs = {
|
|
|
33
33
|
{
|
|
34
34
|
name: 'color',
|
|
35
35
|
type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
|
|
36
|
-
description: 'Text color.',
|
|
36
|
+
description: 'Text color. Themes may add custom colors.',
|
|
37
37
|
default: "'primary'",
|
|
38
38
|
},
|
|
39
39
|
{
|
|
@@ -120,7 +120,7 @@ export const docsZh = {
|
|
|
120
120
|
{
|
|
121
121
|
name: 'color',
|
|
122
122
|
type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
|
|
123
|
-
description: '
|
|
123
|
+
description: '文本颜色。主题可添加自定义颜色。',
|
|
124
124
|
default: "'primary'",
|
|
125
125
|
},
|
|
126
126
|
{
|
|
@@ -186,7 +186,7 @@ export const docsDense = {
|
|
|
186
186
|
type: 'Display variant (display-1/2/3); overrides visual styling from level with display-scale sizing.',
|
|
187
187
|
children: 'Heading content.',
|
|
188
188
|
accessibilityLevel: 'aria-level override when different from level for document outline.',
|
|
189
|
-
color: 'Text color.',
|
|
189
|
+
color: 'Text color. Themes may add custom colors.',
|
|
190
190
|
display: "Display type; overridden to 'block' when maxLines>0 or hasCapsize.",
|
|
191
191
|
maxLines: 'Max lines before truncation; 0=none. Shows tooltip if truncated.',
|
|
192
192
|
hasTruncateTooltip: "Tooltip for truncated text; true=default position, false=disabled, or a placement ('above' | 'below' | 'start' | 'end').",
|
package/src/Text/Text.doc.mjs
CHANGED
|
@@ -41,7 +41,7 @@ export const docs = {
|
|
|
41
41
|
{
|
|
42
42
|
name: 'color',
|
|
43
43
|
type: "'primary' | 'secondary' | 'disabled' | 'placeholder' | 'accent' | 'inherit'",
|
|
44
|
-
description: "Text color. Defaults to 'secondary' for the 'supporting' type, 'primary' for all others.",
|
|
44
|
+
description: "Text color. Defaults to 'secondary' for the 'supporting' type, 'primary' for all others. Themes may add custom colors.",
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
name: 'weight',
|
package/src/Text/Text.test.tsx
CHANGED
|
@@ -9,6 +9,7 @@ import {render, screen} from '@testing-library/react';
|
|
|
9
9
|
import {describe, it, expect} from 'vitest';
|
|
10
10
|
import {Text} from './Text';
|
|
11
11
|
import type {TextType} from './Text';
|
|
12
|
+
import type {TextColor} from '../theme/types';
|
|
12
13
|
|
|
13
14
|
describe('Text', () => {
|
|
14
15
|
describe('rendering', () => {
|
|
@@ -233,3 +234,44 @@ describe('Text custom types', () => {
|
|
|
233
234
|
expect(screen.getByText('Muted').className).toContain('secondary');
|
|
234
235
|
});
|
|
235
236
|
});
|
|
237
|
+
|
|
238
|
+
describe('Text custom colors', () => {
|
|
239
|
+
it('renders a custom color as a stable class for theme CSS to target', () => {
|
|
240
|
+
// A theme adds a custom color (e.g. via TextColorMap augmentation +
|
|
241
|
+
// defineTheme). The rendered element carries the color as a class
|
|
242
|
+
// (astryx-text.<color>) so `.astryx-text.brand { color: ... }` from the
|
|
243
|
+
// theme applies — mirroring how custom `type`s work.
|
|
244
|
+
render(<Text color={'brand' as TextColor}>Branded</Text>);
|
|
245
|
+
const el = screen.getByText('Branded');
|
|
246
|
+
expect(el.className).toContain('astryx-text');
|
|
247
|
+
expect(el.className).toContain('brand');
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it('does not crash on a custom color (falls back to the primary StyleX baseline)', () => {
|
|
251
|
+
// colorStyles has no entry for a custom color; the component must resolve a
|
|
252
|
+
// built-in baseline instead of indexing undefined. Built-in `primary` is
|
|
253
|
+
// the baseline, so both share its StyleX color class.
|
|
254
|
+
render(
|
|
255
|
+
<>
|
|
256
|
+
<Text color={'brand' as TextColor}>Custom</Text>
|
|
257
|
+
<Text color="primary">Builtin</Text>
|
|
258
|
+
</>,
|
|
259
|
+
);
|
|
260
|
+
const custom = screen.getByText('Custom');
|
|
261
|
+
const builtin = screen.getByText('Builtin');
|
|
262
|
+
// Neither throws, and the custom color reuses primary's baseline StyleX
|
|
263
|
+
// class (the real color comes from theme CSS via the `brand` class).
|
|
264
|
+
const primaryAtomic = builtin.className
|
|
265
|
+
.split(/\s+/)
|
|
266
|
+
.filter(c => c.startsWith('x'));
|
|
267
|
+
expect(primaryAtomic.length).toBeGreaterThan(0);
|
|
268
|
+
for (const cls of primaryAtomic) {
|
|
269
|
+
expect(custom.className).toContain(cls);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it('still applies built-in colors directly', () => {
|
|
274
|
+
render(<Text color="accent">Accent</Text>);
|
|
275
|
+
expect(screen.getByText('Accent').className).toContain('accent');
|
|
276
|
+
});
|
|
277
|
+
});
|