@astryxdesign/core 0.1.9 → 0.2.0-canary.0e01213
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/Center/Center.d.ts +20 -3
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +10 -2
- 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.d.ts +7 -0
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +16 -5
- 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 +18 -12
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +42 -64
- 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 +10 -3
- 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 +27 -10
- 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 +87 -45
- 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 +72 -19
- 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 +18 -3
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +58 -30
- 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 +11 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +65 -25
- 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 +115 -35
- package/dist/astryx.umd.js +51 -51
- 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/defineTheme.d.ts +6 -0
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/expandColorScale.d.ts +19 -2
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +38 -10
- 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 +8 -3
- 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/Center/Center.doc.mjs +38 -0
- package/src/Center/Center.test.tsx +75 -0
- package/src/Center/Center.tsx +37 -2
- 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.test.tsx +57 -0
- package/src/Chat/ChatLayout.tsx +26 -5
- 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.doc.mjs +5 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +95 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +49 -66
- 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 +19 -4
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +84 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +680 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +569 -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 +40 -14
- 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 +436 -0
- package/src/MultiSelector/MultiSelector.tsx +133 -67
- 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 +400 -0
- package/src/Selector/Selector.tsx +95 -23
- 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 +48 -21
- 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.test.tsx +161 -2
- package/src/Table/plugins/tree/useTableTreeData.tsx +71 -14
- package/src/Table/types.ts +33 -0
- package/src/Table/useTableRowExpansion.doc.mjs +55 -2
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableTreeData.doc.mjs +9 -0
- 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/defineTheme.ts +6 -0
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/expandColorScale.test.ts +144 -0
- package/src/theme/expandColorScale.ts +53 -15
- 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
|
@@ -58,15 +58,20 @@ function TreeTable(
|
|
|
58
58
|
props: Partial<UseTableTreeStateConfig<FileRow>> & {
|
|
59
59
|
data?: FileRow[];
|
|
60
60
|
hasExpandAllControl?: boolean;
|
|
61
|
+
hasRowClickExpansion?: boolean;
|
|
61
62
|
},
|
|
62
63
|
) {
|
|
63
|
-
const {hasExpandAllControl, ...stateProps} = props;
|
|
64
|
+
const {hasExpandAllControl, hasRowClickExpansion, ...stateProps} = props;
|
|
64
65
|
const {visibleData, treeConfig} = useTableTreeState<FileRow>({
|
|
65
66
|
data: props.data ?? fileTree,
|
|
66
67
|
idKey: 'id',
|
|
67
68
|
...stateProps,
|
|
68
69
|
});
|
|
69
|
-
const tree = useTableTreeData({
|
|
70
|
+
const tree = useTableTreeData({
|
|
71
|
+
...treeConfig,
|
|
72
|
+
hasExpandAllControl,
|
|
73
|
+
hasRowClickExpansion,
|
|
74
|
+
});
|
|
70
75
|
|
|
71
76
|
return (
|
|
72
77
|
<Table data={visibleData} columns={columns} idKey="id" plugins={{tree}} />
|
|
@@ -153,6 +158,160 @@ describe('useTableTreeData — expander', () => {
|
|
|
153
158
|
});
|
|
154
159
|
});
|
|
155
160
|
|
|
161
|
+
// =============================================================================
|
|
162
|
+
// Whole-row-click expansion
|
|
163
|
+
// =============================================================================
|
|
164
|
+
|
|
165
|
+
describe('useTableTreeData — row-click expansion', () => {
|
|
166
|
+
it('does not toggle on row click when hasRowClickExpansion is unset', async () => {
|
|
167
|
+
const user = userEvent.setup();
|
|
168
|
+
render(<TreeTable />);
|
|
169
|
+
|
|
170
|
+
await user.click(within(getRowByText('src')).getByText('src'));
|
|
171
|
+
|
|
172
|
+
// Row body click is inert by default: subtree stays collapsed.
|
|
173
|
+
expect(screen.queryByText('components')).toBeNull();
|
|
174
|
+
expect(
|
|
175
|
+
within(getRowByText('src')).getByRole('button', {name: 'Expand row'}),
|
|
176
|
+
).toBeInTheDocument();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('expands an expandable row when its body is clicked', async () => {
|
|
180
|
+
const user = userEvent.setup();
|
|
181
|
+
render(<TreeTable hasRowClickExpansion />);
|
|
182
|
+
|
|
183
|
+
await user.click(within(getRowByText('src')).getByText('src'));
|
|
184
|
+
|
|
185
|
+
expect(screen.getByText('components')).toBeInTheDocument();
|
|
186
|
+
expect(screen.getByText('utils.ts')).toBeInTheDocument();
|
|
187
|
+
expect(
|
|
188
|
+
within(getRowByText('src')).getByRole('button', {name: 'Collapse row'}),
|
|
189
|
+
).toBeInTheDocument();
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('collapses an expanded row when its body is clicked', async () => {
|
|
193
|
+
const user = userEvent.setup();
|
|
194
|
+
render(<TreeTable hasRowClickExpansion defaultExpandedIds={['src']} />);
|
|
195
|
+
|
|
196
|
+
expect(screen.getByText('components')).toBeInTheDocument();
|
|
197
|
+
|
|
198
|
+
await user.click(within(getRowByText('src')).getByText('src'));
|
|
199
|
+
|
|
200
|
+
expect(screen.queryByText('components')).toBeNull();
|
|
201
|
+
expect(
|
|
202
|
+
within(getRowByText('src')).getByRole('button', {name: 'Expand row'}),
|
|
203
|
+
).toBeInTheDocument();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('does not toggle when a leaf row body is clicked', async () => {
|
|
207
|
+
const user = userEvent.setup();
|
|
208
|
+
render(<TreeTable hasRowClickExpansion />);
|
|
209
|
+
|
|
210
|
+
const before = screen.getAllByRole('row').length;
|
|
211
|
+
await user.click(within(getRowByText('README.md')).getByText('README.md'));
|
|
212
|
+
|
|
213
|
+
// Leaf has no expansion: row count is unchanged.
|
|
214
|
+
expect(screen.getAllByRole('row')).toHaveLength(before);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('toggles once when the chevron is clicked (no double-toggle via row click)', async () => {
|
|
218
|
+
const user = userEvent.setup();
|
|
219
|
+
const onToggle = vi.fn();
|
|
220
|
+
|
|
221
|
+
function SpyTree() {
|
|
222
|
+
const {visibleData, treeConfig} = useTableTreeState<FileRow>({
|
|
223
|
+
data: fileTree,
|
|
224
|
+
idKey: 'id',
|
|
225
|
+
});
|
|
226
|
+
const tree = useTableTreeData({
|
|
227
|
+
...treeConfig,
|
|
228
|
+
hasRowClickExpansion: true,
|
|
229
|
+
onToggleItem: item => {
|
|
230
|
+
onToggle(item);
|
|
231
|
+
treeConfig.onToggleItem(item);
|
|
232
|
+
},
|
|
233
|
+
});
|
|
234
|
+
return (
|
|
235
|
+
<Table
|
|
236
|
+
data={visibleData}
|
|
237
|
+
columns={columns}
|
|
238
|
+
idKey="id"
|
|
239
|
+
plugins={{tree}}
|
|
240
|
+
/>
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
render(<SpyTree />);
|
|
245
|
+
|
|
246
|
+
await user.click(
|
|
247
|
+
within(getRowByText('src')).getByRole('button', {name: 'Expand row'}),
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
// The chevron stops propagation, so a chevron click toggles exactly once.
|
|
251
|
+
expect(onToggle).toHaveBeenCalledTimes(1);
|
|
252
|
+
expect(screen.getByText('components')).toBeInTheDocument();
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('does not toggle when an interactive control inside the row is clicked', async () => {
|
|
256
|
+
const user = userEvent.setup();
|
|
257
|
+
// Compose with selection: each row carries a checkbox in its own column.
|
|
258
|
+
function TreeWithSelection() {
|
|
259
|
+
const [selectedKeys, setSelectedKeys] = useState<Set<string>>(
|
|
260
|
+
() => new Set(),
|
|
261
|
+
);
|
|
262
|
+
const {visibleData, treeConfig} = useTableTreeState<FileRow>({
|
|
263
|
+
data: fileTree,
|
|
264
|
+
idKey: 'id',
|
|
265
|
+
});
|
|
266
|
+
const {selectionConfig} = useTableSelectionState<FileRow>({
|
|
267
|
+
data: visibleData,
|
|
268
|
+
idKey: 'id',
|
|
269
|
+
selectedKeys,
|
|
270
|
+
setSelectedKeys,
|
|
271
|
+
});
|
|
272
|
+
const selection = useTableSelection<FileRow>(selectionConfig);
|
|
273
|
+
const tree = useTableTreeData({
|
|
274
|
+
...treeConfig,
|
|
275
|
+
hasRowClickExpansion: true,
|
|
276
|
+
});
|
|
277
|
+
return (
|
|
278
|
+
<Table
|
|
279
|
+
data={visibleData}
|
|
280
|
+
columns={columns}
|
|
281
|
+
idKey="id"
|
|
282
|
+
plugins={{tree, selection}}
|
|
283
|
+
/>
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
render(<TreeWithSelection />);
|
|
288
|
+
|
|
289
|
+
const srcRow = getRowByText('src');
|
|
290
|
+
const cells = within(srcRow).getAllByRole('cell');
|
|
291
|
+
await user.click(within(cells[0]).getByRole('checkbox'));
|
|
292
|
+
|
|
293
|
+
// Clicking the checkbox selects the row but must NOT expand it.
|
|
294
|
+
expect(screen.queryByText('components')).toBeNull();
|
|
295
|
+
expect(
|
|
296
|
+
within(getRowByText('src')).getByRole('button', {name: 'Expand row'}),
|
|
297
|
+
).toBeInTheDocument();
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('is a no-op on flat data even when hasRowClickExpansion is set', async () => {
|
|
301
|
+
const user = userEvent.setup();
|
|
302
|
+
const flat: FileRow[] = [
|
|
303
|
+
{id: 'a', name: 'a.txt', size: 1},
|
|
304
|
+
{id: 'b', name: 'b.txt', size: 2},
|
|
305
|
+
];
|
|
306
|
+
render(<TreeTable data={flat} hasRowClickExpansion />);
|
|
307
|
+
|
|
308
|
+
const before = screen.getAllByRole('row').length;
|
|
309
|
+
await user.click(within(getRowByText('a.txt')).getByText('a.txt'));
|
|
310
|
+
|
|
311
|
+
expect(screen.getAllByRole('row')).toHaveLength(before);
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
|
|
156
315
|
// =============================================================================
|
|
157
316
|
// Row ARIA
|
|
158
317
|
// =============================================================================
|
|
@@ -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,
|
|
@@ -106,6 +106,17 @@ export interface UseTableTreeDataConfig<T extends Record<string, unknown>> {
|
|
|
106
106
|
indent?: 'sm' | 'md' | 'lg';
|
|
107
107
|
/** Column that carries the indent + expander. @default the first column */
|
|
108
108
|
treeColumnKey?: string;
|
|
109
|
+
/**
|
|
110
|
+
* When true, clicking anywhere on an expandable row toggles its expansion,
|
|
111
|
+
* in addition to the chevron. Leaf rows stay inert. No-op on flat data.
|
|
112
|
+
*
|
|
113
|
+
* This is a pointer-only convenience layered over the chevron: keyboard and
|
|
114
|
+
* assistive-tech users toggle via the chevron button (which stays the
|
|
115
|
+
* accessible control). Clicks originating from interactive cell content
|
|
116
|
+
* (buttons, links, form controls) or a text selection do not toggle.
|
|
117
|
+
* @default false (only the chevron toggles expansion).
|
|
118
|
+
*/
|
|
119
|
+
hasRowClickExpansion?: boolean;
|
|
109
120
|
}
|
|
110
121
|
|
|
111
122
|
// =============================================================================
|
|
@@ -271,6 +282,10 @@ const treeStyles = stylex.create({
|
|
|
271
282
|
gap: spacingVars['--spacing-1'],
|
|
272
283
|
minWidth: 0,
|
|
273
284
|
},
|
|
285
|
+
/** Whole-row-click expansion: signal the row is interactive. */
|
|
286
|
+
clickableRow: {
|
|
287
|
+
cursor: 'pointer',
|
|
288
|
+
},
|
|
274
289
|
});
|
|
275
290
|
|
|
276
291
|
// =============================================================================
|
|
@@ -299,12 +314,14 @@ function TreeExpander({
|
|
|
299
314
|
: t('@astryx.tableTree.expandRow')
|
|
300
315
|
}
|
|
301
316
|
aria-expanded={isExpanded}>
|
|
302
|
-
<span
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
317
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
318
|
+
<span
|
|
319
|
+
{...stylex.props(
|
|
320
|
+
treeStyles.chevron,
|
|
321
|
+
isExpanded && treeStyles.chevronExpanded,
|
|
322
|
+
)}>
|
|
323
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
324
|
+
</span>
|
|
308
325
|
</span>
|
|
309
326
|
</button>
|
|
310
327
|
);
|
|
@@ -346,12 +363,14 @@ function TreeExpandAllToggle({
|
|
|
346
363
|
: t('@astryx.tableTree.expandAllRows')
|
|
347
364
|
}
|
|
348
365
|
aria-expanded={allExpanded}>
|
|
349
|
-
<span
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
366
|
+
<span {...stylex.props(rtlStyles.mirror)}>
|
|
367
|
+
<span
|
|
368
|
+
{...stylex.props(
|
|
369
|
+
treeStyles.chevron,
|
|
370
|
+
allExpanded && treeStyles.chevronExpanded,
|
|
371
|
+
)}>
|
|
372
|
+
<Icon icon="chevronRight" size="xsm" />
|
|
373
|
+
</span>
|
|
355
374
|
</span>
|
|
356
375
|
</button>
|
|
357
376
|
);
|
|
@@ -612,10 +631,48 @@ export function useTableTreeData<T extends Record<string, unknown>>(
|
|
|
612
631
|
};
|
|
613
632
|
};
|
|
614
633
|
|
|
615
|
-
|
|
634
|
+
const withRef = {
|
|
616
635
|
...props,
|
|
617
636
|
ref: props.ref ? mergeRefs(props.ref, treeRef) : treeRef,
|
|
618
637
|
};
|
|
638
|
+
|
|
639
|
+
// Whole-row-click expansion (opt-in). Only expandable rows are
|
|
640
|
+
// clickable; leaves and flat data stay inert. `hasExpandableRows` is
|
|
641
|
+
// the feature-level flag (short-circuits the whole feature when off);
|
|
642
|
+
// `hasChildren` is the per-row check — both are intentional.
|
|
643
|
+
const cfg = store.getConfig();
|
|
644
|
+
const rowClickExpandable =
|
|
645
|
+
cfg.hasRowClickExpansion === true &&
|
|
646
|
+
cfg.hasExpandableRows &&
|
|
647
|
+
cfg.getRowMeta(item)?.hasChildren === true;
|
|
648
|
+
if (!rowClickExpandable) {
|
|
649
|
+
return withRef;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
return {
|
|
653
|
+
...withRef,
|
|
654
|
+
htmlProps: {
|
|
655
|
+
...withRef.htmlProps,
|
|
656
|
+
onClick: (event: React.MouseEvent<HTMLTableRowElement>) => {
|
|
657
|
+
// Don't hijack clicks on interactive cell content (the chevron
|
|
658
|
+
// already stops propagation, but a composed selection checkbox,
|
|
659
|
+
// link, or action button does not) or a text selection.
|
|
660
|
+
const target = event.target as HTMLElement;
|
|
661
|
+
if (
|
|
662
|
+
target.closest(
|
|
663
|
+
'button, a, input, select, textarea, [role="button"], [role="checkbox"], [contenteditable="true"]',
|
|
664
|
+
)
|
|
665
|
+
) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
if ((window.getSelection()?.toString() ?? '') !== '') {
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
671
|
+
cfg.onToggleItem(item);
|
|
672
|
+
},
|
|
673
|
+
},
|
|
674
|
+
xstyle: [...withRef.xstyle, treeStyles.clickableRow],
|
|
675
|
+
};
|
|
619
676
|
},
|
|
620
677
|
};
|
|
621
678
|
}, [store]);
|
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
|
/**
|
|
@@ -7,7 +7,7 @@ export const docs = {
|
|
|
7
7
|
subComponentOf: 'Table',
|
|
8
8
|
displayName: 'useTableRowExpansion',
|
|
9
9
|
description:
|
|
10
|
-
'Hook that returns a TablePlugin implementing expandable rows with inherited columns. Child rows use the same columns as their parents, indented by depth. Clicking the chevron (or right-click context menu) toggles expansion. Pair with useTableRowExpansionState, which flattens the tree and derives this config (expand/collapse handlers + expand-all state) from a single expandedKeys set.',
|
|
10
|
+
'Deprecated: use useTableTreeData + useTableTreeState instead. Hook that returns a TablePlugin implementing expandable rows with inherited columns. Child rows use the same columns as their parents, indented by depth. Clicking the chevron (or right-click context menu) toggles expansion. Pair with useTableRowExpansionState, which flattens the tree and derives this config (expand/collapse handlers + expand-all state) from a single expandedKeys set. Converging with useTableTreeData: new tree tables should prefer useTableTreeData + useTableTreeState, which cover the same affordances with a cycle guard and fine-grained re-render. See the migration example below.',
|
|
11
11
|
props: [
|
|
12
12
|
{
|
|
13
13
|
name: 'expandedKeys',
|
|
@@ -60,12 +60,65 @@ export const docs = {
|
|
|
60
60
|
description: 'Callback when the expand-all header toggle is clicked.',
|
|
61
61
|
},
|
|
62
62
|
],
|
|
63
|
+
examples: [
|
|
64
|
+
{
|
|
65
|
+
label: 'Migrating to useTableTreeData + useTableTreeState',
|
|
66
|
+
code: `// useTableRowExpansion and useTableTreeData are converging onto one tree
|
|
67
|
+
// plugin. useTableTreeData is the destination: it adds a cycle guard,
|
|
68
|
+
// per-row fine-grained re-render, and imperative row ARIA, and now covers
|
|
69
|
+
// the same affordances (expand-all header control, whole-row click).
|
|
70
|
+
|
|
71
|
+
// BEFORE: useTableRowExpansion + useTableRowExpansionState
|
|
72
|
+
const [expandedKeys, setExpandedKeys] = useState(new Set(['root']));
|
|
73
|
+
const {data, expansionConfig} = useTableRowExpansionState({
|
|
74
|
+
baseData: tree,
|
|
75
|
+
getChildren: item => item.children ?? [],
|
|
76
|
+
getRowKey: item => item.id,
|
|
77
|
+
expandedKeys,
|
|
78
|
+
setExpandedKeys,
|
|
79
|
+
});
|
|
80
|
+
const expansion = useTableRowExpansion(expansionConfig);
|
|
81
|
+
<Table data={data} columns={columns} idKey="id" plugins={{expansion}} />;
|
|
82
|
+
|
|
83
|
+
// AFTER: useTableTreeState + useTableTreeData
|
|
84
|
+
const {visibleData, treeConfig} = useTableTreeState({
|
|
85
|
+
data: tree, // nested data, not a flat array
|
|
86
|
+
idKey: 'id', // or a function: idKey={item => item.id}
|
|
87
|
+
childrenKey: 'children', // replaces getChildren (default 'children')
|
|
88
|
+
defaultExpandedIds: ['root'], // uncontrolled; or expandedIds + onExpandedIdsChange
|
|
89
|
+
});
|
|
90
|
+
const tree = useTableTreeData({
|
|
91
|
+
...treeConfig,
|
|
92
|
+
hasExpandAllControl: true, // was isAllExpanded + onToggleExpandAll
|
|
93
|
+
hasRowClickExpansion: true, // same prop name
|
|
94
|
+
});
|
|
95
|
+
<Table data={visibleData} columns={columns} idKey="id" plugins={{tree}} />;`,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
label: 'Config mapping',
|
|
99
|
+
code: `// useTableRowExpansion(State) -> useTableTreeState / useTableTreeData
|
|
100
|
+
|
|
101
|
+
// baseData: T[] (nested) -> data: T[] (useTableTreeState)
|
|
102
|
+
// getChildren: item => item.children -> childrenKey: 'children' (property name)
|
|
103
|
+
// getRowKey: item => item.id -> idKey: 'id' | (item => item.id)
|
|
104
|
+
// getIsItemExpandable -> isItemExpandable (same shape)
|
|
105
|
+
// expandedKeys + setExpandedKeys -> defaultExpandedIds (uncontrolled), or
|
|
106
|
+
// expandedIds + onExpandedIdsChange (controlled)
|
|
107
|
+
// getDepth -> removed; depth derives from nesting
|
|
108
|
+
// isAllExpanded + onToggleExpandAll -> hasExpandAllControl (state is computed)
|
|
109
|
+
// hasRowClickExpansion -> hasRowClickExpansion (unchanged)
|
|
110
|
+
|
|
111
|
+
// Rendering: useTableRowExpansion prepends a dedicated expander column;
|
|
112
|
+
// useTableTreeData decorates the tree column in place (configurable via
|
|
113
|
+
// treeColumnKey). Keyboard and AT users toggle via the chevron in both.`,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
63
116
|
};
|
|
64
117
|
|
|
65
118
|
/** @type {import('../docs-types').TranslationDoc} */
|
|
66
119
|
export const docsDense = {
|
|
67
120
|
description:
|
|
68
|
-
'Returns a TablePlugin for expandable rows w/ inherited columns. Child rows reuse parent columns, indented by depth. Chevron click (or right-click menu) toggles expansion. Pair w/ useTableRowExpansionState, which flattens the tree + derives this config from one expandedKeys set.',
|
|
121
|
+
'Deprecated: use useTableTreeData + useTableTreeState instead. Returns a TablePlugin for expandable rows w/ inherited columns. Child rows reuse parent columns, indented by depth. Chevron click (or right-click menu) toggles expansion. Pair w/ useTableRowExpansionState, which flattens the tree + derives this config from one expandedKeys set.',
|
|
69
122
|
propDescriptions: {
|
|
70
123
|
expandedKeys: 'Set of currently-expanded row keys.',
|
|
71
124
|
onToggle: 'Called when a row expansion is toggled.',
|
|
@@ -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
|
],
|
|
@@ -65,6 +65,13 @@ export const docs = {
|
|
|
65
65
|
description:
|
|
66
66
|
'Column that carries the indent + expander. Defaults to the first column.',
|
|
67
67
|
},
|
|
68
|
+
{
|
|
69
|
+
name: 'hasRowClickExpansion',
|
|
70
|
+
type: 'boolean',
|
|
71
|
+
description:
|
|
72
|
+
'When true, clicking anywhere on an expandable row toggles its expansion, in addition to the chevron. A pointer-only convenience: keyboard and assistive-tech users toggle via the chevron button. Clicks on interactive cell content (buttons, links, form controls) or a text selection do not toggle. Leaf rows stay inert, and it is a no-op on flat data.',
|
|
73
|
+
default: 'false',
|
|
74
|
+
},
|
|
68
75
|
],
|
|
69
76
|
examples: [
|
|
70
77
|
{
|
|
@@ -100,5 +107,7 @@ export const docsDense = {
|
|
|
100
107
|
"aggregate state driving the header toggle: true (all) | false (none) | 'indeterminate' (some).",
|
|
101
108
|
onExpandAll: 'expand every expandable row (header control)',
|
|
102
109
|
onCollapseAll: 'collapse every row (header control)',
|
|
110
|
+
hasRowClickExpansion:
|
|
111
|
+
'true => clicking an expandable row body toggles it (in addition to the chevron). Leaves stay inert; no-op on flat data. Defaults to false.',
|
|
103
112
|
},
|
|
104
113
|
};
|
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
|
+
});
|
package/src/Text/Text.tsx
CHANGED
|
@@ -23,6 +23,7 @@ import type {
|
|
|
23
23
|
BuiltinTextType,
|
|
24
24
|
TextSize,
|
|
25
25
|
TextColor,
|
|
26
|
+
BuiltinTextColor,
|
|
26
27
|
TextWeight,
|
|
27
28
|
TextDisplay,
|
|
28
29
|
TextJustify,
|
|
@@ -185,6 +186,24 @@ function resolveStyleType(type: TextType): BuiltinTextType {
|
|
|
185
186
|
return 'body';
|
|
186
187
|
}
|
|
187
188
|
|
|
189
|
+
/**
|
|
190
|
+
* Resolve the StyleX baseline color. Built-in colors map to their own color
|
|
191
|
+
* style; custom (theme-defined) colors fall back to the `primary` baseline —
|
|
192
|
+
* their actual color comes from theme CSS (`.astryx-text.<color>` /
|
|
193
|
+
* `.astryx-heading.<color>`), which the rendered `color` class targets.
|
|
194
|
+
*
|
|
195
|
+
* Exported so Heading applies the same custom-color fallback as Text.
|
|
196
|
+
*/
|
|
197
|
+
export function resolveStyleColor(color: TextColor): BuiltinTextColor {
|
|
198
|
+
// The `in` guard is a runtime check for consumer-augmented custom colors
|
|
199
|
+
// (which widen `TextColor` beyond the built-ins via TextColorMap); within
|
|
200
|
+
// core the two types coincide, so no cast is needed.
|
|
201
|
+
if (color in colorStyles) {
|
|
202
|
+
return color;
|
|
203
|
+
}
|
|
204
|
+
return 'primary';
|
|
205
|
+
}
|
|
206
|
+
|
|
188
207
|
/**
|
|
189
208
|
* Semantic text component. Renders text with type-based styling from the theme.
|
|
190
209
|
*
|
|
@@ -228,6 +247,11 @@ export function Text({
|
|
|
228
247
|
// Resolve style type — custom types fall back to 'body' for StyleX baseline
|
|
229
248
|
const styleType = resolveStyleType(type);
|
|
230
249
|
|
|
250
|
+
// Resolve style color — custom colors fall back to 'primary' for StyleX
|
|
251
|
+
// baseline; the real color comes from theme CSS via the rendered `color`
|
|
252
|
+
// class (see themeProps below).
|
|
253
|
+
const styleColor = resolveStyleColor(resolvedColor);
|
|
254
|
+
|
|
231
255
|
// Resolve wordBreak with smart default
|
|
232
256
|
const resolvedWordBreak =
|
|
233
257
|
wordBreak ?? (maxLines === 1 ? 'break-all' : 'break-word');
|
|
@@ -257,7 +281,7 @@ export function Text({
|
|
|
257
281
|
{...mergeProps(
|
|
258
282
|
themeProps('text', {type, size, color: resolvedColor}),
|
|
259
283
|
stylex.props(
|
|
260
|
-
colorStyles[
|
|
284
|
+
colorStyles[styleColor],
|
|
261
285
|
sizeByTypeStyles[styleType],
|
|
262
286
|
size && sizeStyles[size],
|
|
263
287
|
defaultWeightByTypeStyles[styleType],
|
package/src/Text/index.ts
CHANGED
|
@@ -7,12 +7,7 @@
|
|
|
7
7
|
* @position Entry point for Text components
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
export {
|
|
11
|
-
Text,
|
|
12
|
-
type TextProps,
|
|
13
|
-
type TextType,
|
|
14
|
-
type TextSize,
|
|
15
|
-
} from './Text';
|
|
10
|
+
export {Text, type TextProps, type TextType, type TextSize} from './Text';
|
|
16
11
|
export {
|
|
17
12
|
Heading,
|
|
18
13
|
type HeadingProps,
|
|
@@ -23,6 +18,7 @@ export {
|
|
|
23
18
|
// Re-export shared types from theme for convenience
|
|
24
19
|
export type {
|
|
25
20
|
TextColor,
|
|
21
|
+
TextColorMap,
|
|
26
22
|
TextWeight,
|
|
27
23
|
TextDisplay,
|
|
28
24
|
TextJustify,
|