@astryxdesign/core 0.1.8 → 0.1.9-canary.02ef052
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +100 -0
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +6 -2
- package/dist/AppShell/AppShellMobileContext.d.ts +8 -0
- package/dist/AppShell/AppShellMobileContext.d.ts.map +1 -1
- package/dist/Avatar/Avatar.d.ts +58 -3
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +240 -53
- package/dist/Avatar/AvatarStatusDot.d.ts +35 -5
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +144 -19
- package/dist/AvatarGroup/AvatarGroup.d.ts +7 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +58 -6
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +1 -0
- package/dist/Banner/Banner.d.ts +9 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +33 -4
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +31 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +215 -6
- package/dist/Breadcrumbs/index.d.ts +6 -0
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +10 -1
- package/dist/Button/Button.d.ts +8 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +33 -4
- package/dist/ButtonGroup/ButtonGroup.d.ts +9 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +30 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +80 -11
- package/dist/Calendar/dayCellUtils.d.ts +4 -4
- package/dist/Calendar/dayCellUtils.js +3 -3
- package/dist/Calendar/styles.d.ts +30 -31
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +30 -31
- package/dist/Card/Card.d.ts +8 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +28 -2
- package/dist/Carousel/Carousel.d.ts +4 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +46 -16
- package/dist/Chat/ChatComposer.d.ts +8 -0
- package/dist/Chat/ChatComposer.d.ts.map +1 -1
- package/dist/Chat/ChatComposer.js +46 -7
- package/dist/Chat/ChatComposerDrawer.d.ts +2 -0
- package/dist/Chat/ChatComposerDrawer.d.ts.map +1 -1
- package/dist/Chat/ChatComposerDrawer.js +11 -1
- package/dist/Chat/ChatComposerInput.d.ts +20 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +36 -4
- package/dist/Chat/ChatContext.d.ts +33 -0
- package/dist/Chat/ChatContext.d.ts.map +1 -1
- package/dist/Chat/ChatContext.js +16 -2
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +4 -2
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +4 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +4 -4
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +7 -1
- package/dist/Chat/ChatToolCalls.d.ts +5 -1
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +27 -11
- package/dist/Chat/index.d.ts +2 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/index.js +1 -1
- package/dist/Chat/useChatStreamScroll.d.ts +2 -1
- package/dist/Chat/useChatStreamScroll.d.ts.map +1 -1
- package/dist/Chat/useChatStreamScroll.js +22 -8
- package/dist/Chat/useSpeechRecognition.d.ts +0 -1
- package/dist/Chat/useSpeechRecognition.d.ts.map +1 -1
- package/dist/Chat/useSpeechRecognition.js +1 -1
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -2
- package/dist/CheckboxInput/CheckboxInput.js +5 -5
- package/dist/CheckboxList/CheckboxListItem.d.ts +20 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +11 -1
- package/dist/Citation/Citation.d.ts +22 -1
- package/dist/Citation/Citation.d.ts.map +1 -1
- package/dist/Citation/Citation.js +20 -6
- package/dist/ClickableCard/ClickableCard.d.ts +9 -2
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +5 -2
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +22 -9
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +3 -1
- package/dist/CommandPalette/CommandPalette.d.ts +2 -2
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +45 -4
- package/dist/CommandPalette/CommandPaletteGroup.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +9 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts +7 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +6 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +14 -5
- package/dist/ContextMenu/index.d.ts +1 -0
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +3 -1
- package/dist/DateInput/DateInput.d.ts +56 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +59 -21
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.d.ts +10 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +23 -20
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +33 -19
- package/dist/Dialog/Dialog.d.ts +3 -0
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +57 -6
- package/dist/Dialog/DialogContext.d.ts +7 -0
- package/dist/Dialog/DialogContext.d.ts.map +1 -1
- package/dist/Dialog/DialogContext.js +2 -2
- package/dist/Dialog/DialogHeader.d.ts +5 -2
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +6 -1
- package/dist/Divider/Divider.js +1 -1
- package/dist/DropdownMenu/DropdownMenu.d.ts +6 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +22 -5
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +5 -3
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +5 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +1 -2
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +4 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +104 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +427 -0
- package/dist/DropdownMenu/index.d.ts +10 -0
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +13 -0
- package/dist/DropdownMenu/menuItemHover.d.ts +23 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -0
- package/dist/DropdownMenu/menuItemHover.js +33 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts +8 -0
- package/dist/DropdownMenu/menuItemRoles.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemRoles.js +10 -1
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -6
- package/dist/Field/Field.d.ts +3 -1
- package/dist/Field/Field.d.ts.map +1 -1
- package/dist/Field/Field.js +6 -4
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +43 -16
- package/dist/Field/inputStyles.stylex.d.ts +1 -0
- package/dist/Field/inputStyles.stylex.d.ts.map +1 -1
- package/dist/Field/inputStyles.stylex.js +1 -0
- package/dist/FieldStatus/FieldStatus.d.ts +18 -0
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +60 -6
- package/dist/FileInput/FileInput.d.ts +10 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +54 -35
- package/dist/HoverCard/HoverCard.d.ts +9 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +2 -0
- package/dist/HoverCard/useHoverCard.d.ts +8 -0
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +17 -6
- package/dist/Icon/Icon.d.ts +22 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +19 -3
- package/dist/Item/Item.d.ts +6 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +22 -1
- package/dist/Layer/useLayer.d.ts +6 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +2 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +19 -13
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +7 -0
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +6 -1
- package/dist/MobileNav/MobileNavToggle.d.ts.map +1 -1
- package/dist/MobileNav/MobileNavToggle.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +9 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +104 -50
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +16 -0
- package/dist/NavMenu/NavHeadingMenuItem.js +1 -1
- package/dist/NumberInput/NumberInput.d.ts +10 -2
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +22 -17
- package/dist/Outline/Outline.d.ts +0 -1
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +0 -1
- package/dist/OverflowList/OverflowList.d.ts +20 -3
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +29 -4
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +11 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +3 -9
- package/dist/PowerSearch/PowerSearch.d.ts +9 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +2 -0
- package/dist/PowerSearch/PowerSearchEditPopover.js +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/RadioList/RadioList.d.ts +2 -2
- package/dist/RadioList/RadioListItem.js +4 -4
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -1
- package/dist/SelectableCard/SelectableCard.d.ts +9 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +16 -13
- package/dist/Selector/Selector.d.ts +8 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +65 -19
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +16 -0
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +5 -5
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +13 -10
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +21 -8
- package/dist/SideNav/SideNavItem.d.ts +1 -1
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +12 -10
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +106 -36
- package/dist/Stack/stack.stylex.d.ts +9 -9
- package/dist/Switch/Switch.d.ts +8 -1
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +160 -91
- package/dist/TabList/Tab.js +2 -2
- package/dist/TabList/TabMenu.js +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +33 -6
- package/dist/Table/TableCell.js +3 -3
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +15 -11
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +36 -26
- package/dist/Table/plugins/rowStatus/index.d.ts +3 -0
- package/dist/Table/plugins/rowStatus/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/index.js +3 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts +60 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -0
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +145 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts +13 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +7 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +16 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +105 -12
- package/dist/Table/plugins/tree/useTableTreeState.d.ts +6 -0
- package/dist/Table/plugins/tree/useTableTreeState.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeState.js +22 -1
- package/dist/Table/types.d.ts +32 -0
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -3
- package/dist/TextArea/TextArea.d.ts +10 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +18 -19
- package/dist/TextInput/TextInput.d.ts +10 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +20 -17
- package/dist/Thumbnail/Thumbnail.d.ts +26 -5
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +97 -54
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +9 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +1 -0
- package/dist/Thumbnail/thumbnail.markers.stylex.js +14 -0
- package/dist/TimeInput/TimeInput.d.ts +10 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +32 -21
- package/dist/Timestamp/Timestamp.d.ts +3 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +8 -6
- package/dist/Toast/useToast.d.ts.map +1 -1
- package/dist/Toast/useToast.js +2 -5
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +0 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +30 -3
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +17 -2
- package/dist/Token/index.d.ts +1 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.d.ts +10 -3
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +20 -6
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +17 -1
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +18 -8
- package/dist/TopNav/TopNavMegaMenu.js +10 -4
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +9 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +8 -1
- package/dist/TopNav/TopNavMenu.d.ts +2 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +68 -6
- package/dist/TreeList/TreeList.d.ts +12 -3
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +3 -0
- package/dist/TreeList/TreeListBranches.d.ts +5 -0
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +18 -10
- package/dist/TreeList/TreeListItem.d.ts +8 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +59 -21
- package/dist/TreeList/TreeListTypes.d.ts +25 -1
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +2 -2
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +20 -11
- package/dist/Typeahead/Typeahead.d.ts +9 -2
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -1
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +20 -10
- package/dist/astryx.css +61 -39
- package/dist/astryx.umd.js +53 -53
- package/dist/astryx.umd.js.map +4 -4
- package/dist/authoring/doc.d.ts.map +1 -1
- package/dist/docs-types.d.ts +8 -0
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/computeOverflow.d.ts +47 -0
- package/dist/hooks/computeOverflow.d.ts.map +1 -0
- package/dist/hooks/computeOverflow.js +213 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -1
- package/dist/hooks/isRtlElement.d.ts +18 -0
- package/dist/hooks/isRtlElement.d.ts.map +1 -0
- package/dist/hooks/isRtlElement.js +27 -0
- package/dist/hooks/useDevWarning.d.ts +18 -0
- package/dist/hooks/useDevWarning.d.ts.map +1 -0
- package/dist/hooks/useDevWarning.js +49 -0
- package/dist/hooks/useGridFocus.d.ts +6 -1
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useGridFocus.js +12 -9
- package/dist/hooks/useInputStatusIcon.d.ts +38 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -0
- package/dist/hooks/useInputStatusIcon.js +158 -0
- package/dist/hooks/useListFocus.d.ts +39 -1
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useListFocus.js +54 -9
- package/dist/hooks/useOverflow.d.ts +19 -0
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +36 -25
- package/dist/i18n/InternationalizationContext.d.ts +1 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -0
- package/dist/i18n/InternationalizationProvider.d.ts +8 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +5 -1
- package/dist/i18n/getLocaleDirection.d.ts +18 -0
- package/dist/i18n/getLocaleDirection.d.ts.map +1 -0
- package/dist/i18n/getLocaleDirection.js +29 -0
- package/dist/i18n/index.d.ts +6 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +7 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +7 -18
- package/dist/i18n/useDirection.d.ts +2 -0
- package/dist/i18n/useDirection.d.ts.map +1 -0
- package/dist/i18n/useDirection.js +27 -0
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +13 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +51 -0
- package/dist/theme/hct.d.ts +0 -1
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.d.ts.map +1 -1
- package/dist/theme/syntax/defineSyntaxTheme.js +2 -1
- package/dist/utils/devWarning.d.ts +42 -0
- package/dist/utils/devWarning.d.ts.map +1 -0
- package/dist/utils/devWarning.js +88 -0
- package/dist/utils/index.d.ts +4 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -2
- package/dist/utils/plainDate.d.ts +30 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +65 -3
- package/dist/utils/rtlStyles.d.ts +24 -0
- package/dist/utils/rtlStyles.d.ts.map +1 -0
- package/dist/utils/rtlStyles.js +27 -0
- package/dist/utils/types.d.ts +13 -0
- package/dist/utils/types.d.ts.map +1 -1
- package/locales/en.json +104 -0
- package/locales/fr-FR.json +14 -0
- package/locales/pseudo.json +78 -0
- package/package.json +6 -1
- package/src/AppShell/AppShell.tsx +6 -0
- package/src/AppShell/AppShellMobileContext.tsx +8 -0
- package/src/AppShell/useAppShellMobile.doc.mjs +8 -0
- package/src/Avatar/Avatar.doc.mjs +64 -5
- package/src/Avatar/Avatar.test.tsx +374 -1
- package/src/Avatar/Avatar.tsx +367 -69
- package/src/Avatar/AvatarStatusDot.doc.mjs +23 -12
- package/src/Avatar/AvatarStatusDot.test.tsx +284 -0
- package/src/Avatar/AvatarStatusDot.tsx +180 -21
- package/src/AvatarGroup/AvatarGroup.doc.mjs +2 -0
- package/src/AvatarGroup/AvatarGroup.test.tsx +141 -1
- package/src/AvatarGroup/AvatarGroup.tsx +58 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +1 -0
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +30 -0
- package/src/Banner/Banner.tsx +53 -9
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +26 -0
- package/src/Breadcrumbs/BreadcrumbItem.tsx +333 -14
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +2 -0
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +335 -2
- package/src/Breadcrumbs/index.ts +31 -0
- package/src/Button/Button.doc.mjs +9 -4
- package/src/Button/Button.test.tsx +49 -0
- package/src/Button/Button.tsx +27 -3
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -0
- package/src/ButtonGroup/ButtonGroup.test.tsx +37 -0
- package/src/ButtonGroup/ButtonGroup.tsx +32 -0
- package/src/Calendar/Calendar.doc.mjs +12 -1
- package/src/Calendar/Calendar.test.tsx +362 -19
- package/src/Calendar/Calendar.tsx +111 -32
- package/src/Calendar/dayCellUtils.test.ts +23 -18
- package/src/Calendar/dayCellUtils.ts +3 -3
- package/src/Calendar/styles.ts +33 -39
- package/src/Card/Card.doc.mjs +9 -0
- package/src/Card/Card.test.tsx +21 -3
- package/src/Card/Card.tsx +35 -2
- package/src/Carousel/Carousel.doc.mjs +1 -0
- package/src/Carousel/Carousel.test.tsx +53 -0
- package/src/Carousel/Carousel.tsx +59 -10
- package/src/Chat/ChatComposer.doc.mjs +12 -3
- package/src/Chat/ChatComposer.test.tsx +115 -0
- package/src/Chat/ChatComposer.tsx +73 -9
- package/src/Chat/ChatComposerDrawer.test.tsx +61 -0
- package/src/Chat/ChatComposerDrawer.tsx +11 -1
- package/src/Chat/ChatComposerInput.doc.mjs +7 -0
- package/src/Chat/ChatComposerInput.test.tsx +103 -0
- package/src/Chat/ChatComposerInput.tsx +51 -5
- package/src/Chat/ChatContext.tsx +37 -10
- package/src/Chat/ChatDictationButton.tsx +11 -2
- package/src/Chat/ChatLayout.tsx +7 -5
- package/src/Chat/ChatLayoutScrollButton.tsx +7 -2
- package/src/Chat/ChatMessageMetadata.tsx +1 -2
- package/src/Chat/ChatSendButton.tsx +11 -1
- package/src/Chat/ChatToolCalls.test.tsx +64 -0
- package/src/Chat/ChatToolCalls.tsx +33 -5
- package/src/Chat/index.ts +5 -1
- package/src/Chat/useChatStreamScroll.test.tsx +49 -0
- package/src/Chat/useChatStreamScroll.ts +27 -10
- package/src/Chat/useSpeechRecognition.ts +1 -1
- package/src/Chat/useTriggerMenu.tsx +4 -2
- package/src/CheckboxInput/CheckboxInput.doc.mjs +6 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +32 -1
- package/src/CheckboxInput/CheckboxInput.tsx +5 -5
- package/src/CheckboxList/CheckboxList.doc.mjs +6 -0
- package/src/CheckboxList/CheckboxList.test.tsx +81 -3
- package/src/CheckboxList/CheckboxListItem.doc.mjs +33 -5
- package/src/CheckboxList/CheckboxListItem.tsx +41 -5
- package/src/Citation/Citation.doc.mjs +4 -3
- package/src/Citation/Citation.test.tsx +97 -0
- package/src/Citation/Citation.tsx +43 -11
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -0
- package/src/ClickableCard/ClickableCard.test.tsx +34 -0
- package/src/ClickableCard/ClickableCard.tsx +13 -3
- package/src/CodeBlock/CodeBlock.test.tsx +56 -0
- package/src/CodeBlock/CodeBlock.tsx +45 -10
- package/src/Collapsible/Collapsible.doc.mjs +1 -0
- package/src/Collapsible/Collapsible.test.tsx +7 -0
- package/src/Collapsible/Collapsible.tsx +16 -6
- package/src/CommandPalette/CommandPalette.doc.mjs +1 -0
- package/src/CommandPalette/CommandPalette.test.tsx +95 -1
- package/src/CommandPalette/CommandPalette.tsx +44 -3
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +71 -0
- package/src/CommandPalette/CommandPaletteGroup.tsx +12 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +26 -9
- package/src/CommandPalette/CommandPaletteInput.test.tsx +34 -0
- package/src/CommandPalette/CommandPaletteInput.tsx +11 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +235 -0
- package/src/ContextMenu/ContextMenu.tsx +13 -11
- package/src/ContextMenu/index.ts +5 -0
- package/src/DateInput/DateInput.doc.mjs +41 -0
- package/src/DateInput/DateInput.test.tsx +338 -0
- package/src/DateInput/DateInput.tsx +119 -32
- package/src/DateInput/index.ts +1 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +16 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +140 -0
- package/src/DateRangeInput/DateRangeInput.tsx +42 -30
- package/src/DateTimeInput/DateTimeInput.doc.mjs +22 -1
- package/src/DateTimeInput/DateTimeInput.test.tsx +147 -0
- package/src/DateTimeInput/DateTimeInput.tsx +58 -41
- package/src/Dialog/Dialog.doc.mjs +2 -2
- package/src/Dialog/Dialog.test.tsx +77 -4
- package/src/Dialog/Dialog.tsx +89 -5
- package/src/Dialog/DialogContext.ts +9 -2
- package/src/Dialog/DialogHeader.doc.mjs +2 -2
- package/src/Dialog/DialogHeader.tsx +9 -2
- package/src/Divider/Divider.tsx +2 -2
- package/src/DropdownMenu/DropdownMenu.test.tsx +229 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -12
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +9 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +9 -3
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +1 -2
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +8 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +88 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +635 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +553 -0
- package/src/DropdownMenu/index.ts +16 -0
- package/src/DropdownMenu/menuItemHover.ts +39 -0
- package/src/DropdownMenu/menuItemRoles.ts +9 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +29 -15
- package/src/Field/Field.test.tsx +57 -12
- package/src/Field/Field.tsx +20 -14
- package/src/Field/FieldLabel.tsx +9 -1
- package/src/Field/inputStyles.stylex.ts +2 -0
- package/src/FieldStatus/FieldStatus.doc.mjs +17 -5
- package/src/FieldStatus/FieldStatus.test.tsx +150 -40
- package/src/FieldStatus/FieldStatus.tsx +69 -5
- package/src/FileInput/FileInput.doc.mjs +23 -2
- package/src/FileInput/FileInput.test.tsx +135 -12
- package/src/FileInput/FileInput.tsx +65 -51
- package/src/HoverCard/HoverCard.doc.mjs +13 -0
- package/src/HoverCard/HoverCard.test.tsx +21 -2
- package/src/HoverCard/HoverCard.tsx +11 -0
- package/src/HoverCard/useHoverCard.doc.mjs +2 -0
- package/src/HoverCard/useHoverCard.tsx +39 -5
- package/src/Icon/Icon.doc.mjs +16 -2
- package/src/Icon/Icon.test.tsx +89 -0
- package/src/Icon/Icon.tsx +58 -5
- package/src/IconButton/IconButton.doc.mjs +8 -0
- package/src/IconButton/IconButton.test.tsx +15 -18
- package/src/Item/Item.test.tsx +40 -18
- package/src/Item/Item.tsx +38 -2
- package/src/Layer/useLayer.tsx +8 -0
- package/src/Lightbox/Lightbox.tsx +15 -7
- package/src/List/List.test.tsx +9 -8
- package/src/Markdown/Markdown.test.tsx +21 -0
- package/src/Markdown/Markdown.tsx +4 -0
- package/src/MobileNav/MobileNav.tsx +12 -1
- package/src/MobileNav/MobileNavToggle.test.tsx +116 -0
- package/src/MobileNav/MobileNavToggle.tsx +9 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +24 -2
- package/src/MultiSelector/MultiSelector.test.tsx +498 -3
- package/src/MultiSelector/MultiSelector.tsx +149 -65
- package/src/MultiSelector/hooks.ts +17 -0
- package/src/NavMenu/NavHeadingMenuItem.tsx +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +21 -0
- package/src/NumberInput/NumberInput.test.tsx +82 -7
- package/src/NumberInput/NumberInput.tsx +36 -28
- package/src/Outline/Outline.tsx +0 -1
- package/src/OverflowList/OverflowList.doc.mjs +39 -6
- package/src/OverflowList/OverflowList.test.tsx +111 -0
- package/src/OverflowList/OverflowList.tsx +48 -8
- package/src/Pagination/Pagination.tsx +11 -3
- package/src/Popover/Popover.tsx +7 -4
- package/src/Popover/usePopover.tsx +9 -13
- package/src/PowerSearch/PowerSearch.doc.mjs +29 -0
- package/src/PowerSearch/PowerSearch.test.tsx +43 -0
- package/src/PowerSearch/PowerSearch.tsx +10 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +67 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +1 -1
- package/src/PowerSearch/usePowerSearchSource.ts +1 -2
- package/src/RadioList/RadioList.doc.mjs +6 -0
- package/src/RadioList/RadioList.tsx +2 -2
- package/src/RadioList/RadioListItem.tsx +4 -4
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -0
- package/src/SelectableCard/SelectableCard.doc.mjs +2 -0
- package/src/SelectableCard/SelectableCard.test.tsx +46 -4
- package/src/SelectableCard/SelectableCard.tsx +29 -16
- package/src/Selector/Selector.doc.mjs +15 -0
- package/src/Selector/Selector.test.tsx +417 -0
- package/src/Selector/Selector.tsx +86 -21
- package/src/Selector/hooks.ts +17 -0
- package/src/SideNav/SideNav.test.tsx +119 -3
- package/src/SideNav/SideNav.tsx +1 -8
- package/src/SideNav/SideNavCollapseButton.tsx +15 -8
- package/src/SideNav/SideNavHeading.tsx +24 -8
- package/src/SideNav/SideNavItem.tsx +10 -4
- package/src/Slider/Slider.doc.mjs +6 -0
- package/src/Slider/Slider.test.tsx +314 -13
- package/src/Slider/Slider.tsx +117 -28
- package/src/Switch/Switch.doc.mjs +142 -42
- package/src/Switch/Switch.test.tsx +54 -1
- package/src/Switch/Switch.tsx +90 -33
- package/src/TabList/Tab.tsx +2 -2
- package/src/TabList/TabMenu.tsx +2 -2
- package/src/Table/BaseTable.tsx +37 -7
- package/src/Table/Table.doc.mjs +11 -0
- package/src/Table/Table.test.tsx +85 -0
- package/src/Table/TableCell.tsx +3 -3
- package/src/Table/TableHeaderCell.tsx +3 -3
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +15 -8
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +24 -17
- package/src/Table/plugins/rowStatus/index.ts +7 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +138 -0
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +189 -0
- package/src/Table/plugins/selection/useTableSelection.test.tsx +77 -3
- package/src/Table/plugins/selection/useTableSelection.tsx +22 -1
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -1
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +135 -3
- package/src/Table/plugins/tree/useTableTreeData.tsx +139 -8
- package/src/Table/plugins/tree/useTableTreeState.test.tsx +104 -0
- package/src/Table/plugins/tree/useTableTreeState.tsx +46 -2
- package/src/Table/types.ts +33 -0
- package/src/Table/useBaseTablePlugins.ts +10 -6
- package/src/Table/useTableRowStatus.doc.mjs +30 -0
- package/src/Table/useTableSelection.doc.mjs +65 -14
- package/src/Table/useTableTreeData.doc.mjs +29 -0
- package/src/Table/useTableTreeState.doc.mjs +2 -2
- package/src/TextArea/TextArea.doc.mjs +21 -0
- package/src/TextArea/TextArea.test.tsx +32 -1
- package/src/TextArea/TextArea.tsx +27 -26
- package/src/TextInput/TextInput.doc.mjs +21 -0
- package/src/TextInput/TextInput.test.tsx +150 -0
- package/src/TextInput/TextInput.tsx +28 -25
- package/src/Thumbnail/Thumbnail.doc.mjs +19 -10
- package/src/Thumbnail/Thumbnail.test.tsx +98 -7
- package/src/Thumbnail/Thumbnail.tsx +142 -42
- package/src/Thumbnail/thumbnail.markers.stylex.ts +12 -0
- package/src/TimeInput/TimeInput.doc.mjs +21 -0
- package/src/TimeInput/TimeInput.test.tsx +99 -1
- package/src/TimeInput/TimeInput.tsx +43 -31
- package/src/Timestamp/Timestamp.doc.mjs +4 -4
- package/src/Timestamp/Timestamp.test.tsx +32 -0
- package/src/Timestamp/Timestamp.tsx +28 -8
- package/src/Toast/useToast.tsx +7 -8
- package/src/ToggleButton/ToggleButtonGroup.tsx +1 -1
- package/src/Token/Token.test.tsx +21 -15
- package/src/Token/Token.tsx +31 -14
- package/src/Token/index.ts +1 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +38 -2
- package/src/Tokenizer/Tokenizer.test.tsx +206 -2
- package/src/Tokenizer/Tokenizer.tsx +30 -6
- package/src/Tooltip/Tooltip.test.tsx +46 -0
- package/src/Tooltip/useTooltip.tsx +20 -0
- package/src/TopNav/TopNav.test.tsx +125 -1
- package/src/TopNav/TopNavHeading.tsx +24 -8
- package/src/TopNav/TopNavMegaMenu.test.tsx +149 -1
- package/src/TopNav/TopNavMegaMenu.tsx +10 -4
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +3 -3
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +19 -2
- package/src/TopNav/TopNavMenu.test.tsx +118 -4
- package/src/TopNav/TopNavMenu.tsx +83 -5
- package/src/TreeList/TreeList.doc.mjs +28 -0
- package/src/TreeList/TreeList.test.tsx +272 -0
- package/src/TreeList/TreeList.tsx +23 -2
- package/src/TreeList/TreeListBranches.tsx +24 -8
- package/src/TreeList/TreeListItem.tsx +84 -22
- package/src/TreeList/TreeListTypes.ts +27 -1
- package/src/TreeList/index.ts +2 -2
- package/src/Typeahead/BaseTypeahead.tsx +30 -15
- package/src/Typeahead/Typeahead.doc.mjs +13 -0
- package/src/Typeahead/Typeahead.test.tsx +50 -0
- package/src/Typeahead/Typeahead.tsx +11 -1
- package/src/Typeahead/TypeaheadItem.tsx +2 -1
- package/src/__tests__/inputWidthContract.test.tsx +62 -0
- package/src/authoring/doc.ts +1 -3
- package/src/doc-mjs.d.ts +19 -0
- package/src/docs-types.ts +5 -0
- package/src/hooks/computeOverflow.test.ts +422 -0
- package/src/hooks/computeOverflow.ts +290 -0
- package/src/hooks/index.ts +8 -0
- package/src/hooks/isRtlElement.ts +27 -0
- package/src/hooks/useDevWarning.test.tsx +45 -0
- package/src/hooks/useDevWarning.ts +54 -0
- package/src/hooks/useGridFocus.doc.mjs +3 -3
- package/src/hooks/useGridFocus.test.tsx +41 -0
- package/src/hooks/useGridFocus.ts +21 -10
- package/src/hooks/useInputStatusIcon.test.tsx +162 -0
- package/src/hooks/useInputStatusIcon.tsx +224 -0
- package/src/hooks/useListFocus.doc.mjs +25 -3
- package/src/hooks/useListFocus.test.tsx +153 -1
- package/src/hooks/useListFocus.ts +102 -9
- package/src/hooks/useOverflow.test.ts +96 -4
- package/src/hooks/useOverflow.ts +74 -33
- package/src/i18n/InternationalizationContext.ts +4 -0
- package/src/i18n/InternationalizationProvider.doc.mjs +99 -2
- package/src/i18n/InternationalizationProvider.tsx +12 -2
- package/src/i18n/__tests__/getLocaleDirection.test.ts +40 -0
- package/src/i18n/__tests__/useDirection.test.tsx +66 -0
- package/src/i18n/getLocaleDirection.ts +29 -0
- package/src/i18n/index.ts +6 -0
- package/src/i18n/resolve.ts +9 -21
- package/src/i18n/useDirection.ts +29 -0
- package/src/reset.css +0 -26
- package/src/reset.test.ts +60 -0
- package/src/theme/Theme.tsx +11 -14
- package/src/theme/derivedVarRegistry.test.ts +1 -0
- package/src/theme/derivedVarRegistry.ts +6 -0
- package/src/theme/generateThemeRules.test.ts +107 -0
- package/src/theme/generateThemeRules.ts +56 -0
- package/src/theme/hct.ts +1 -1
- package/src/theme/syntax/defineSyntaxTheme.ts +5 -6
- package/src/utils/devWarning.test.ts +56 -0
- package/src/utils/devWarning.ts +102 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/plainDate.test.ts +46 -6
- package/src/utils/plainDate.ts +69 -3
- package/src/utils/rtlStyles.ts +27 -0
- package/src/utils/types.ts +14 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file getLocaleDirection.test.ts
|
|
5
|
+
* @input packages/core/src/i18n/getLocaleDirection.ts
|
|
6
|
+
* @output Unit tests for the server-safe locale → direction helper
|
|
7
|
+
* @position Colocated tests; targets LTR/RTL classification and the
|
|
8
|
+
* try/catch fallback for malformed input.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {describe, expect, test} from 'vitest';
|
|
12
|
+
import {getLocaleDirection} from '../getLocaleDirection';
|
|
13
|
+
|
|
14
|
+
describe('getLocaleDirection', () => {
|
|
15
|
+
test('returns ltr for English', () => {
|
|
16
|
+
expect(getLocaleDirection('en')).toBe('ltr');
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test('returns rtl for RTL languages', () => {
|
|
20
|
+
expect(getLocaleDirection('ar')).toBe('rtl');
|
|
21
|
+
expect(getLocaleDirection('he')).toBe('rtl');
|
|
22
|
+
expect(getLocaleDirection('fa')).toBe('rtl');
|
|
23
|
+
expect(getLocaleDirection('ur')).toBe('rtl');
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('returns ltr for regional LTR tags', () => {
|
|
27
|
+
expect(getLocaleDirection('pt-BR')).toBe('ltr');
|
|
28
|
+
expect(getLocaleDirection('zh-CN')).toBe('ltr');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('falls back to ltr for a malformed locale without throwing', () => {
|
|
32
|
+
expect(() => getLocaleDirection('not_a_locale')).not.toThrow();
|
|
33
|
+
expect(getLocaleDirection('not_a_locale')).toBe('ltr');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('falls back to ltr for an empty string without throwing', () => {
|
|
37
|
+
expect(() => getLocaleDirection('')).not.toThrow();
|
|
38
|
+
expect(getLocaleDirection('')).toBe('ltr');
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file useDirection.test.tsx
|
|
5
|
+
* @input packages/core/src/i18n/useDirection.ts, InternationalizationProvider
|
|
6
|
+
* @output Unit tests for the ambient text-direction hook
|
|
7
|
+
* @position Colocated tests; targets the default (no-provider) fallback,
|
|
8
|
+
* locale-derived direction, and the explicit `dir` override.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type {ReactNode} from 'react';
|
|
12
|
+
import {describe, expect, test} from 'vitest';
|
|
13
|
+
import {renderHook} from '@testing-library/react';
|
|
14
|
+
import {useDirection} from '../useDirection';
|
|
15
|
+
import {InternationalizationProvider} from '../InternationalizationProvider';
|
|
16
|
+
|
|
17
|
+
describe('useDirection', () => {
|
|
18
|
+
test('returns ltr when rendered without a provider', () => {
|
|
19
|
+
const {result} = renderHook(() => useDirection());
|
|
20
|
+
expect(result.current).toBe('ltr');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test('returns ltr under an English provider', () => {
|
|
24
|
+
const {result} = renderHook(() => useDirection(), {
|
|
25
|
+
wrapper: ({children}: {children: ReactNode}) => (
|
|
26
|
+
<InternationalizationProvider locale="en">
|
|
27
|
+
{children}
|
|
28
|
+
</InternationalizationProvider>
|
|
29
|
+
),
|
|
30
|
+
});
|
|
31
|
+
expect(result.current).toBe('ltr');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('returns rtl under an Arabic provider', () => {
|
|
35
|
+
const {result} = renderHook(() => useDirection(), {
|
|
36
|
+
wrapper: ({children}: {children: ReactNode}) => (
|
|
37
|
+
<InternationalizationProvider locale="ar">
|
|
38
|
+
{children}
|
|
39
|
+
</InternationalizationProvider>
|
|
40
|
+
),
|
|
41
|
+
});
|
|
42
|
+
expect(result.current).toBe('rtl');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('explicit dir="rtl" wins over an LTR locale', () => {
|
|
46
|
+
const {result} = renderHook(() => useDirection(), {
|
|
47
|
+
wrapper: ({children}: {children: ReactNode}) => (
|
|
48
|
+
<InternationalizationProvider locale="en" dir="rtl">
|
|
49
|
+
{children}
|
|
50
|
+
</InternationalizationProvider>
|
|
51
|
+
),
|
|
52
|
+
});
|
|
53
|
+
expect(result.current).toBe('rtl');
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('explicit dir="ltr" wins over an RTL locale', () => {
|
|
57
|
+
const {result} = renderHook(() => useDirection(), {
|
|
58
|
+
wrapper: ({children}: {children: ReactNode}) => (
|
|
59
|
+
<InternationalizationProvider locale="ar" dir="ltr">
|
|
60
|
+
{children}
|
|
61
|
+
</InternationalizationProvider>
|
|
62
|
+
),
|
|
63
|
+
});
|
|
64
|
+
expect(result.current).toBe('ltr');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file getLocaleDirection.ts
|
|
5
|
+
* @input BCP 47 locale tag
|
|
6
|
+
* @output 'ltr' | 'rtl'
|
|
7
|
+
* @position Server-safe helper for computing text direction from a locale.
|
|
8
|
+
* Callable in React Server Components / Next.js layouts to set <html dir>.
|
|
9
|
+
*
|
|
10
|
+
* Uses Intl.Locale.getTextInfo() (CLDR-backed) with a try/catch fallback to
|
|
11
|
+
* 'ltr'. React 19 baseline covers all target browsers + Node ≥20; the older
|
|
12
|
+
* accessor form (`.textInfo`) is handled as a fallback for defensive parity.
|
|
13
|
+
*
|
|
14
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
15
|
+
* - /packages/core/src/i18n/InternationalizationProvider.tsx (uses this to derive default)
|
|
16
|
+
* - /packages/core/src/i18n/useDirection.ts (client-side hook counterpart)
|
|
17
|
+
* - /packages/core/src/i18n/index.ts (public export)
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
export function getLocaleDirection(locale: string): 'ltr' | 'rtl' {
|
|
21
|
+
try {
|
|
22
|
+
const loc = new Intl.Locale(locale);
|
|
23
|
+
// @ts-expect-error — older engines expose accessor form `.textInfo`
|
|
24
|
+
const info = typeof loc.getTextInfo === 'function' ? loc.getTextInfo() : loc.textInfo;
|
|
25
|
+
return info?.direction === 'rtl' ? 'rtl' : 'ltr';
|
|
26
|
+
} catch {
|
|
27
|
+
return 'ltr';
|
|
28
|
+
}
|
|
29
|
+
}
|
package/src/i18n/index.ts
CHANGED
|
@@ -10,10 +10,14 @@
|
|
|
10
10
|
* The public API is deliberately small:
|
|
11
11
|
* - InternationalizationProvider — provider component
|
|
12
12
|
* - useTranslator — hook returning a translator function
|
|
13
|
+
* - useDirection — hook returning the ambient text direction
|
|
14
|
+
* - getLocaleDirection — server-safe locale → direction helper
|
|
13
15
|
* - Translator — interface for consumer-injected runtimes
|
|
14
16
|
*
|
|
15
17
|
* SYNC: When modified, update these files to stay in sync:
|
|
16
18
|
* - /packages/core/src/index.ts
|
|
19
|
+
* - /packages/core/src/i18n/useDirection.ts
|
|
20
|
+
* - /packages/core/src/i18n/getLocaleDirection.ts
|
|
17
21
|
*/
|
|
18
22
|
|
|
19
23
|
export {InternationalizationProvider} from './InternationalizationProvider';
|
|
@@ -22,6 +26,8 @@ export {InternationalizationContext} from './InternationalizationContext';
|
|
|
22
26
|
export type {InternationalizationContextValue} from './InternationalizationContext';
|
|
23
27
|
export {useTranslator} from './useTranslator';
|
|
24
28
|
export type {TranslatorFn} from './useTranslator';
|
|
29
|
+
export {useDirection} from './useDirection';
|
|
30
|
+
export {getLocaleDirection} from './getLocaleDirection';
|
|
25
31
|
export type {Translator} from './translator';
|
|
26
32
|
export type {
|
|
27
33
|
Locale,
|
package/src/i18n/resolve.ts
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
import IntlMessageFormat from 'intl-messageformat';
|
|
23
23
|
import type {Catalog, Locale, MessagesByLocale, Overrides} from './types';
|
|
24
24
|
import enSource from '../../locales/en.json' with {type: 'json'};
|
|
25
|
+
import {warnOnce, __resetDevWarnings} from '../utils/devWarning';
|
|
25
26
|
|
|
26
27
|
const EN_CATALOG = enSource as Catalog;
|
|
27
28
|
|
|
@@ -72,23 +73,6 @@ export function resolveLocaleChain(locale: Locale): Locale[] {
|
|
|
72
73
|
return chain;
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
/**
|
|
76
|
-
* Missing-key warn-once tracking. Fires ONLY when a key is missing from
|
|
77
|
-
* every source including the shipped `en` catalog — that's a real bug
|
|
78
|
-
* (typo, stale catalog, deleted key). Fallback to `en` from a non-en
|
|
79
|
-
* locale is expected and silent, matching the FormatJS / i18next default
|
|
80
|
-
* of not spamming the console when a translation simply hasn't been
|
|
81
|
-
* written yet.
|
|
82
|
-
*/
|
|
83
|
-
const warnedMissing = new Set<string>();
|
|
84
|
-
|
|
85
|
-
function warnOnce(bucket: Set<string>, key: string, message: string): void {
|
|
86
|
-
if (!bucket.has(key)) {
|
|
87
|
-
bucket.add(key);
|
|
88
|
-
console.warn(message);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
76
|
function lookup(
|
|
93
77
|
key: string,
|
|
94
78
|
locale: Locale,
|
|
@@ -135,10 +119,14 @@ export function resolve(
|
|
|
135
119
|
const result = lookup(key, locale, messages, overrides);
|
|
136
120
|
|
|
137
121
|
if (result === null) {
|
|
122
|
+
// Fires ONLY when a key is missing from every source including the
|
|
123
|
+
// shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
|
|
124
|
+
// Fallback to `en` from a non-en locale is expected and stays silent,
|
|
125
|
+
// matching the FormatJS / i18next default.
|
|
138
126
|
warnOnce(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
`
|
|
127
|
+
`astryx-i18n:${locale}::${key}`,
|
|
128
|
+
'astryx-i18n',
|
|
129
|
+
`missing key: ${key} (locale: ${locale})`,
|
|
142
130
|
);
|
|
143
131
|
return key;
|
|
144
132
|
}
|
|
@@ -161,5 +149,5 @@ export function resolve(
|
|
|
161
149
|
*/
|
|
162
150
|
export function __resetForTests(): void {
|
|
163
151
|
formatterCache.clear();
|
|
164
|
-
|
|
152
|
+
__resetDevWarnings();
|
|
165
153
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file useDirection.ts
|
|
7
|
+
* @input InternationalizationContext (via use())
|
|
8
|
+
* @output 'ltr' | 'rtl'
|
|
9
|
+
* @position Client hook for reading the ambient text direction. Returns 'ltr'
|
|
10
|
+
* when called outside a provider (matches the silent-en-fallback pattern of
|
|
11
|
+
* useTranslator).
|
|
12
|
+
*
|
|
13
|
+
* Use this in components that need to swap directional icons, mirror
|
|
14
|
+
* behavioral logic (slider math, keyboard nav), or apply direction-specific
|
|
15
|
+
* styling that CSS logical properties can't express.
|
|
16
|
+
*
|
|
17
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
18
|
+
* - /packages/core/src/i18n/InternationalizationContext.ts
|
|
19
|
+
* - /packages/core/src/i18n/getLocaleDirection.ts (server-safe counterpart)
|
|
20
|
+
* - /packages/core/src/i18n/index.ts
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import {use} from 'react';
|
|
24
|
+
import {InternationalizationContext} from './InternationalizationContext';
|
|
25
|
+
|
|
26
|
+
export function useDirection(): 'ltr' | 'rtl' {
|
|
27
|
+
const ctx = use(InternationalizationContext);
|
|
28
|
+
return ctx.direction;
|
|
29
|
+
}
|
package/src/reset.css
CHANGED
|
@@ -360,32 +360,6 @@
|
|
|
360
360
|
-webkit-tap-highlight-color: transparent;
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
-
/* ===========================================================================
|
|
364
|
-
Touch Devices
|
|
365
|
-
=========================================================================== */
|
|
366
|
-
|
|
367
|
-
/*
|
|
368
|
-
* Suppress focus-visible outlines on touch-only devices.
|
|
369
|
-
*
|
|
370
|
-
* Focus rings exist to show keyboard users where focus is. On devices
|
|
371
|
-
* with no hover capability and a coarse pointer (phones, tablets),
|
|
372
|
-
* there's no keyboard navigation — focus rings are visual noise that
|
|
373
|
-
* can flash on tap, on dialog open (showModal auto-focus), or on
|
|
374
|
-
* programmatic focus.
|
|
375
|
-
*
|
|
376
|
-
* This targets touch-only devices specifically:
|
|
377
|
-
* - (hover: none) — no hover capability (not a mouse)
|
|
378
|
-
* - (pointer: coarse) — imprecise pointer (finger, not stylus)
|
|
379
|
-
*
|
|
380
|
-
* Hybrid devices (laptop with touchscreen) are NOT affected because
|
|
381
|
-
* their primary pointer is fine (trackpad/mouse) and hover is available.
|
|
382
|
-
*/
|
|
383
|
-
@media (hover: none) and (pointer: coarse) {
|
|
384
|
-
:where(:focus-visible) {
|
|
385
|
-
outline: none;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
363
|
/* ===========================================================================
|
|
390
364
|
Color Scheme
|
|
391
365
|
=========================================================================== */
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tests for reset.css invariants that components rely on.
|
|
5
|
+
*
|
|
6
|
+
* reset.css is a plain stylesheet, so these tests assert on its source
|
|
7
|
+
* text (same approach as the reset.css baseline checks in
|
|
8
|
+
* theme/onMediaTokens.test.ts and AspectRatio/AspectRatio.test.tsx).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
|
|
14
|
+
import {beforeAll, describe, expect, it} from 'vitest';
|
|
15
|
+
|
|
16
|
+
describe('reset.css accessibility invariants', () => {
|
|
17
|
+
let ruleBlocks: {selector: string; body: string}[];
|
|
18
|
+
|
|
19
|
+
beforeAll(() => {
|
|
20
|
+
const resetCSS = fs.readFileSync(
|
|
21
|
+
path.resolve(__dirname, './reset.css'),
|
|
22
|
+
'utf-8',
|
|
23
|
+
);
|
|
24
|
+
// Strip comments, then collect every innermost `selector { body }`
|
|
25
|
+
// block. `[^{}]` keeps at-rule preludes (@media, @layer) out of the
|
|
26
|
+
// selector capture, since their own `{` terminates any earlier match.
|
|
27
|
+
const stripped = resetCSS.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
28
|
+
ruleBlocks = [...stripped.matchAll(/([^{}]+)\{([^{}]*)\}/g)].map(
|
|
29
|
+
([, selector, body]) => ({selector: selector.trim(), body}),
|
|
30
|
+
);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('parses rule blocks out of reset.css', () => {
|
|
34
|
+
// Guards the WCAG assertion below against silently passing if the
|
|
35
|
+
// block parsing ever breaks.
|
|
36
|
+
expect(ruleBlocks.length).toBeGreaterThan(20);
|
|
37
|
+
expect(
|
|
38
|
+
ruleBlocks.some(({body}) => body.includes('box-sizing: border-box')),
|
|
39
|
+
).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* WCAG 2.4.7 (Focus Visible, Level AA): keyboard focus indicators must
|
|
44
|
+
* not be suppressed. `:focus-visible` only matches keyboard-style focus,
|
|
45
|
+
* so any `outline: none` on it removes the focus indicator for keyboard
|
|
46
|
+
* users — and a `@media (hover: none) and (pointer: coarse)` guard does
|
|
47
|
+
* not exempt keyboard users on coarse-pointer devices (iPad/phone with a
|
|
48
|
+
* Bluetooth keyboard, switch-control users).
|
|
49
|
+
*/
|
|
50
|
+
it('does not suppress :focus-visible outlines (WCAG 2.4.7)', () => {
|
|
51
|
+
const focusVisibleBlocks = ruleBlocks.filter(({selector}) =>
|
|
52
|
+
selector.includes(':focus-visible'),
|
|
53
|
+
);
|
|
54
|
+
for (const {selector, body} of focusVisibleBlocks) {
|
|
55
|
+
expect
|
|
56
|
+
.soft(body, `":focus-visible" rule "${selector}" must keep the outline`)
|
|
57
|
+
.not.toMatch(/outline(?:-style|-width)?\s*:\s*(?:none|0)/);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
package/src/theme/Theme.tsx
CHANGED
|
@@ -45,6 +45,7 @@ import {registerIcons} from '../Icon/globalIconRegistry';
|
|
|
45
45
|
import {generateThemeCSS, type DefinedTheme} from './defineTheme';
|
|
46
46
|
import {dataAttr} from '../naming';
|
|
47
47
|
import {ThemeContext} from './useTheme';
|
|
48
|
+
import {warnOnce} from '../utils/devWarning';
|
|
48
49
|
|
|
49
50
|
/**
|
|
50
51
|
* Theme provider props
|
|
@@ -97,9 +98,6 @@ ThemeNestingContext.displayName = 'ThemeNestingContext';
|
|
|
97
98
|
/** Track which themes have already been injected */
|
|
98
99
|
const injectedThemes = new Set<string>();
|
|
99
100
|
|
|
100
|
-
/** Track which themes have already logged the perf warning */
|
|
101
|
-
const warnedThemes = new Set<string>();
|
|
102
|
-
|
|
103
101
|
/**
|
|
104
102
|
* Hook to inject theme CSS into the document.
|
|
105
103
|
* Built themes (from `astryx theme build`) skip injection — their CSS
|
|
@@ -120,17 +118,16 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
|
|
|
120
118
|
}
|
|
121
119
|
|
|
122
120
|
// One-time perf hint per theme
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
121
|
+
warnOnce(
|
|
122
|
+
`theme-injection:${theme.name}`,
|
|
123
|
+
'Theme',
|
|
124
|
+
`"${theme.name}" is using runtime style injection. ` +
|
|
125
|
+
`For better performance, use the pre-built theme:\n\n` +
|
|
126
|
+
` import {${theme.name}Theme} from '@astryxdesign/theme-${theme.name}/built';\n` +
|
|
127
|
+
` import '@astryxdesign/theme-${theme.name}/theme.css';\n\n` +
|
|
128
|
+
`For custom themes, run \`npx @astryxdesign/cli theme build <file>\` to generate ` +
|
|
129
|
+
`the built artifacts.`,
|
|
130
|
+
);
|
|
134
131
|
|
|
135
132
|
const {prose, component} = generateThemeCSS(theme);
|
|
136
133
|
if (!prose && !component) {
|
|
@@ -186,6 +186,7 @@ function discoverComponents(): ComponentInfo[] {
|
|
|
186
186
|
// ---------------------------------------------------------------------------
|
|
187
187
|
|
|
188
188
|
const DIR_TO_REGISTRY_KEY: Record<string, string> = {
|
|
189
|
+
Avatar: 'avatar',
|
|
189
190
|
Banner: 'banner',
|
|
190
191
|
Button: 'button',
|
|
191
192
|
Card: 'card',
|
|
@@ -35,6 +35,12 @@ export interface DerivedVarEntry {
|
|
|
35
35
|
* entries share the same property.
|
|
36
36
|
*/
|
|
37
37
|
export const derivedVarRegistry: Record<string, DerivedVarEntry[]> = {
|
|
38
|
+
avatar: [
|
|
39
|
+
{property: 'fontSize', vars: ['--_avatar-fallback-font-size']},
|
|
40
|
+
{property: 'fontWeight', vars: ['--_avatar-fallback-font-weight']},
|
|
41
|
+
{property: 'color', vars: ['--_avatar-fallback-color']},
|
|
42
|
+
{property: 'backgroundColor', vars: ['--_avatar-fallback-background']},
|
|
43
|
+
],
|
|
38
44
|
banner: [{property: 'borderRadius', vars: ['--_banner-radius']}],
|
|
39
45
|
button: [{property: 'borderRadius', vars: ['--_button-radius']}],
|
|
40
46
|
card: [
|
|
@@ -190,6 +190,61 @@ describe('generateThemeRules', () => {
|
|
|
190
190
|
expect(rules.some(r => r.includes('.astryx-text.accent'))).toBe(true);
|
|
191
191
|
});
|
|
192
192
|
|
|
193
|
+
// --- Size-prop overrides (so `size` beats a themed `type`) ---
|
|
194
|
+
|
|
195
|
+
it('emits Text size-prop font-size overrides in the same layer as type rules', () => {
|
|
196
|
+
// Digit-leading sizes are prefixed (size-2xs); word sizes stay bare.
|
|
197
|
+
const sizeRule = rules.find(
|
|
198
|
+
r => r.includes('.astryx-text.size-2xs') && r.includes('font-size'),
|
|
199
|
+
);
|
|
200
|
+
expect(sizeRule).toBeDefined();
|
|
201
|
+
expect(sizeRule).toContain('var(--font-size-2xs)');
|
|
202
|
+
|
|
203
|
+
// `xsm` maps to the --font-size-xs token (matches sizeStyles).
|
|
204
|
+
const xsmRule = rules.find(r => r.includes('.astryx-text.xsm'));
|
|
205
|
+
expect(xsmRule).toBeDefined();
|
|
206
|
+
expect(xsmRule).toContain('var(--font-size-xs)');
|
|
207
|
+
|
|
208
|
+
// Overrides set only font-size — line-height/family come from `type`.
|
|
209
|
+
expect(xsmRule).not.toContain('line-height');
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('emits a size override for every TextSize value', () => {
|
|
213
|
+
const sizes = [
|
|
214
|
+
'size-4xs',
|
|
215
|
+
'size-3xs',
|
|
216
|
+
'size-2xs',
|
|
217
|
+
'xsm',
|
|
218
|
+
'sm',
|
|
219
|
+
'base',
|
|
220
|
+
'lg',
|
|
221
|
+
'xl',
|
|
222
|
+
'size-2xl',
|
|
223
|
+
'size-3xl',
|
|
224
|
+
'size-4xl',
|
|
225
|
+
];
|
|
226
|
+
for (const cls of sizes) {
|
|
227
|
+
expect(
|
|
228
|
+
rules.some(
|
|
229
|
+
r => r.includes(`.astryx-text.${cls}`) && r.includes('font-size'),
|
|
230
|
+
),
|
|
231
|
+
).toBe(true);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it('orders size overrides after the themed type font-size rules', () => {
|
|
236
|
+
// Source order breaks specificity ties within a layer, so the size
|
|
237
|
+
// override must come after the `.astryx-text.<type>` type rule.
|
|
238
|
+
const typeIdx = rules.findIndex(
|
|
239
|
+
r => r.includes('.astryx-text.supporting') && r.includes('font-size'),
|
|
240
|
+
);
|
|
241
|
+
const sizeIdx = rules.findIndex(
|
|
242
|
+
r => r.includes('.astryx-text.size-2xs') && r.includes('font-size'),
|
|
243
|
+
);
|
|
244
|
+
expect(typeIdx).toBeGreaterThanOrEqual(0);
|
|
245
|
+
expect(sizeIdx).toBeGreaterThan(typeIdx);
|
|
246
|
+
});
|
|
247
|
+
|
|
193
248
|
// --- Consistency ---
|
|
194
249
|
|
|
195
250
|
it('generateThemeCSS returns prose and component blocks with @scope', () => {
|
|
@@ -202,6 +257,16 @@ describe('generateThemeRules', () => {
|
|
|
202
257
|
expect(combined).toContain(rule);
|
|
203
258
|
}
|
|
204
259
|
});
|
|
260
|
+
|
|
261
|
+
it('routes Text size overrides into the component (astryx-theme) block', () => {
|
|
262
|
+
// The size override only beats a themed type if it lands in the same
|
|
263
|
+
// layer as the type rules (astryx-theme / component block), not the
|
|
264
|
+
// reset-tier prose block.
|
|
265
|
+
const {prose, component} = generateThemeCSS(theme);
|
|
266
|
+
expect(component).toContain('.astryx-text.size-2xs');
|
|
267
|
+
expect(component).toContain('.astryx-text.xsm');
|
|
268
|
+
expect(prose).not.toContain('.astryx-text.size-2xs');
|
|
269
|
+
});
|
|
205
270
|
});
|
|
206
271
|
|
|
207
272
|
describe('generateThemeRules with weight overrides', () => {
|
|
@@ -320,6 +385,48 @@ describe('derived var expansion', () => {
|
|
|
320
385
|
expect(rule).toContain('--_button-radius: 8px');
|
|
321
386
|
});
|
|
322
387
|
|
|
388
|
+
it('emits internal vars for avatar fallback typography (base)', () => {
|
|
389
|
+
const theme = defineTheme({
|
|
390
|
+
name: 'test-derived-avatar',
|
|
391
|
+
components: {
|
|
392
|
+
avatar: {
|
|
393
|
+
base: {
|
|
394
|
+
fontWeight: 'var(--font-weight-normal)',
|
|
395
|
+
color: 'var(--color-text-secondary)',
|
|
396
|
+
backgroundColor: 'var(--color-accent-muted)',
|
|
397
|
+
},
|
|
398
|
+
},
|
|
399
|
+
},
|
|
400
|
+
});
|
|
401
|
+
const rules = generateThemeRules(theme);
|
|
402
|
+
const rule = rules.find(r => r.includes('.astryx-avatar'));
|
|
403
|
+
expect(rule).toBeDefined();
|
|
404
|
+
expect(rule).toContain(
|
|
405
|
+
'--_avatar-fallback-font-weight: var(--font-weight-normal)',
|
|
406
|
+
);
|
|
407
|
+
expect(rule).toContain(
|
|
408
|
+
'--_avatar-fallback-color: var(--color-text-secondary)',
|
|
409
|
+
);
|
|
410
|
+
expect(rule).toContain(
|
|
411
|
+
'--_avatar-fallback-background: var(--color-accent-muted)',
|
|
412
|
+
);
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
it('emits a per-size fallback font-size for avatar (size:sm)', () => {
|
|
416
|
+
const theme = defineTheme({
|
|
417
|
+
name: 'test-derived-avatar-size',
|
|
418
|
+
components: {
|
|
419
|
+
avatar: {
|
|
420
|
+
'size:sm': {fontSize: '9px'},
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
});
|
|
424
|
+
const rules = generateThemeRules(theme);
|
|
425
|
+
const rule = rules.find(r => r.includes('.astryx-avatar.sm'));
|
|
426
|
+
expect(rule).toBeDefined();
|
|
427
|
+
expect(rule).toContain('--_avatar-fallback-font-size: 9px');
|
|
428
|
+
});
|
|
429
|
+
|
|
323
430
|
it('does not emit derived vars for components without registry entries', () => {
|
|
324
431
|
const theme = defineTheme({
|
|
325
432
|
name: 'test-no-derived',
|
|
@@ -301,6 +301,10 @@ export function generateThemeRules(theme: DefinedTheme): string[] {
|
|
|
301
301
|
// 4. Prop-level color overrides (for text/heading/link specificity)
|
|
302
302
|
generateColorOverrides(theme.components || {}, parts);
|
|
303
303
|
|
|
304
|
+
// 5. Text `size`-prop font-size overrides (so an explicit size beats a
|
|
305
|
+
// themed type's font-size across the astryx-base → astryx-theme layers)
|
|
306
|
+
generateSizeOverrides(theme.components || {}, parts);
|
|
307
|
+
|
|
304
308
|
// (on-media rules are generated separately — see generateOnMediaCSS)
|
|
305
309
|
|
|
306
310
|
return parts;
|
|
@@ -500,6 +504,58 @@ function generateColorOverrides(
|
|
|
500
504
|
}
|
|
501
505
|
}
|
|
502
506
|
|
|
507
|
+
/**
|
|
508
|
+
* Map a Text `size` prop value to its raw font-size token.
|
|
509
|
+
* Mirrors `sizeStyles` in `Text/text.stylex.ts` (note `xsm` → `--font-size-xs`).
|
|
510
|
+
* <!-- SYNC: packages/core/src/Text/text.stylex.ts (sizeStyles) -->
|
|
511
|
+
*/
|
|
512
|
+
const TEXT_SIZE_TOKEN_MAP: Record<string, string> = {
|
|
513
|
+
'4xs': 'var(--font-size-4xs)',
|
|
514
|
+
'3xs': 'var(--font-size-3xs)',
|
|
515
|
+
'2xs': 'var(--font-size-2xs)',
|
|
516
|
+
xsm: 'var(--font-size-xs)',
|
|
517
|
+
sm: 'var(--font-size-sm)',
|
|
518
|
+
base: 'var(--font-size-base)',
|
|
519
|
+
lg: 'var(--font-size-lg)',
|
|
520
|
+
xl: 'var(--font-size-xl)',
|
|
521
|
+
'2xl': 'var(--font-size-2xl)',
|
|
522
|
+
'3xl': 'var(--font-size-3xl)',
|
|
523
|
+
'4xl': 'var(--font-size-4xl)',
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* Generate `size`-prop font-size overrides for the Text component.
|
|
528
|
+
*
|
|
529
|
+
* The `size` prop is documented as a font-size override that wins over the
|
|
530
|
+
* size implied by `type`. Its StyleX class lives in `@layer astryx-base`, but a
|
|
531
|
+
* theme's per-type font-size rule (`.astryx-text.<type>`) lives in the higher
|
|
532
|
+
* `@layer astryx-theme`, so the layer cascade let the theme silently shadow
|
|
533
|
+
* `size` for any `type` the theme styled. Re-emitting the size classes here —
|
|
534
|
+
* same layer as the type rules, same `.astryx-text.<x>` specificity, later in
|
|
535
|
+
* source — restores `size` as a real override.
|
|
536
|
+
*
|
|
537
|
+
* Only `font-size` is overridden; line-height and other type properties are
|
|
538
|
+
* intentionally preserved, matching the prop's documented contract.
|
|
539
|
+
*
|
|
540
|
+
* Gated on the theme touching `text` (which includes the auto-generated
|
|
541
|
+
* type-scale rules) — with no theme type rule to beat, the base-layer StyleX
|
|
542
|
+
* class already wins and no override is needed.
|
|
543
|
+
*/
|
|
544
|
+
function generateSizeOverrides(
|
|
545
|
+
components: Record<string, unknown>,
|
|
546
|
+
parts: string[],
|
|
547
|
+
): void {
|
|
548
|
+
if (!('text' in components)) {
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
for (const [sizeName, sizeValue] of Object.entries(TEXT_SIZE_TOKEN_MAP)) {
|
|
552
|
+
const suffix = parseStyleKey(`size:${sizeName}`);
|
|
553
|
+
parts.push(
|
|
554
|
+
` ${componentClassSelector('text', suffix)} { font-size: ${sizeValue}; }`,
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
503
559
|
/**
|
|
504
560
|
* Generate theme rules split into component and prose groups.
|
|
505
561
|
*
|
package/src/theme/hct.ts
CHANGED
|
@@ -110,7 +110,7 @@ function labToXyz(L: number, a: number, b: number): [number, number, number] {
|
|
|
110
110
|
// Tone <-> Y (CIE Luminance)
|
|
111
111
|
// =============================================================================
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
function toneToY(tone: number): number {
|
|
114
114
|
return labFInv((tone + 16) / 116);
|
|
115
115
|
}
|
|
116
116
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
import {syntaxTokenDefaults, type SyntaxTokenName} from './tokens';
|
|
15
|
+
import {devWarn} from '../../utils/devWarning';
|
|
15
16
|
|
|
16
17
|
// =============================================================================
|
|
17
18
|
// Types
|
|
@@ -139,12 +140,10 @@ export function defineSyntaxTheme(
|
|
|
139
140
|
): SyntaxThemeDefinition {
|
|
140
141
|
const missing = ALL_SYNTAX_KEYS.filter(key => !(key in input.tokens));
|
|
141
142
|
if (missing.length > 0) {
|
|
142
|
-
|
|
143
|
-
'
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
missing.join(', ') +
|
|
147
|
-
'. All 14 syntax tokens are required.',
|
|
143
|
+
devWarn(
|
|
144
|
+
'defineSyntaxTheme',
|
|
145
|
+
`"${input.name}": missing tokens: ${missing.join(', ')}. ` +
|
|
146
|
+
`All 14 syntax tokens are required.`,
|
|
148
147
|
);
|
|
149
148
|
}
|
|
150
149
|
|