@astryxdesign/core 0.3.0 → 0.4.0-canary.3112e99
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 +156 -0
- package/dist/AlertDialog/AlertDialog.d.ts +10 -2
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +22 -3
- package/dist/AppShell/AppShell.d.ts +2 -2
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +40 -9
- package/dist/AspectRatio/AspectRatio.d.ts +13 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +9 -0
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +33 -20
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +2 -3
- package/dist/Banner/Banner.d.ts +3 -0
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -17
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +21 -8
- package/dist/Breadcrumbs/index.d.ts +2 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +1 -0
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +12 -16
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +2 -1
- package/dist/Calendar/styles.d.ts +0 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +0 -2
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +8 -12
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +2 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +3 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -3
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +17 -17
- package/dist/Chat/useTriggerMenu.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +2 -6
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +36 -125
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -11
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +84 -67
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +35 -15
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +6 -3
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +32 -31
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +1 -1
- package/dist/ContextMenu/index.d.ts +2 -1
- package/dist/ContextMenu/index.d.ts.map +1 -1
- package/dist/ContextMenu/index.js +1 -0
- package/dist/DateInput/DateInput.d.ts +9 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +47 -33
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +55 -32
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +54 -30
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +4 -4
- package/dist/DropdownMenu/DropdownMenu.d.ts +33 -8
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +62 -20
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +32 -31
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts +25 -0
- package/dist/DropdownMenu/DropdownMenuDivider.d.ts.map +1 -0
- package/dist/DropdownMenu/DropdownMenuDivider.js +66 -0
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +15 -2
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +20 -8
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +10 -3
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +5 -5
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +24 -67
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +2 -8
- package/dist/DropdownMenu/index.d.ts +2 -1
- package/dist/DropdownMenu/index.d.ts.map +1 -1
- package/dist/DropdownMenu/index.js +4 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +35 -27
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +9 -5
- package/dist/Field/InputClearButton.d.ts +16 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +15 -4
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +21 -10
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +3 -19
- package/dist/Indicator/CheckIndicator.d.ts +25 -0
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckIndicator.js +155 -0
- package/dist/Indicator/CheckboxIndicator.d.ts +22 -0
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -0
- package/dist/Indicator/CheckboxIndicator.js +173 -0
- package/dist/Indicator/RadioIndicator.d.ts +23 -0
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -0
- package/dist/Indicator/RadioIndicator.js +137 -0
- package/dist/Indicator/index.d.ts +24 -0
- package/dist/Indicator/index.d.ts.map +1 -0
- package/dist/Indicator/index.js +26 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts +16 -0
- package/dist/Indicator/indicator.markers.stylex.d.ts.map +1 -0
- package/dist/Indicator/indicator.markers.stylex.js +21 -0
- package/dist/Indicator/indicatorRegistry.d.ts +71 -0
- package/dist/Indicator/indicatorRegistry.d.ts.map +1 -0
- package/dist/Indicator/indicatorRegistry.js +93 -0
- package/dist/Indicator/types.d.ts +177 -0
- package/dist/Indicator/types.d.ts.map +1 -0
- package/dist/Indicator/types.js +1 -0
- package/dist/Indicator/useIndicator.d.ts +18 -0
- package/dist/Indicator/useIndicator.d.ts.map +1 -0
- package/dist/Indicator/useIndicator.js +30 -0
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -8
- package/dist/Layer/useLayer.d.ts +14 -0
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +25 -2
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +80 -103
- package/dist/Link/Link.d.ts.map +1 -1
- package/dist/Link/Link.js +4 -5
- package/dist/MobileNav/MobileNav.js +8 -8
- package/dist/MoreMenu/MoreMenu.d.ts +14 -1
- package/dist/MoreMenu/MoreMenu.d.ts.map +1 -1
- package/dist/MoreMenu/MoreMenu.js +4 -0
- package/dist/MultiSelector/MultiSelector.d.ts +8 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +119 -95
- package/dist/NumberInput/NumberInput.d.ts +27 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +230 -42
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +2 -3
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +61 -63
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +6 -8
- package/dist/Popover/usePopover.d.ts +15 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +14 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +7 -0
- package/dist/ProgressBar/ProgressBar.d.ts +11 -4
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +95 -6
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +29 -84
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +2 -3
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +2 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -11
- package/dist/Selector/Selector.d.ts +12 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +222 -111
- package/dist/Selector/hooks.d.ts +18 -6
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +57 -40
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +29 -14
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +56 -20
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +28 -22
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +2 -6
- package/dist/Stack/stack.stylex.d.ts +3 -3
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +14 -13
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +2 -3
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +41 -19
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +8 -0
- package/dist/Table/TableRow.d.ts +1 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +4 -2
- package/dist/Table/index.d.ts +1 -1
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +22 -18
- package/dist/Table/plugins/rowExpansion/index.d.ts +1 -1
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/index.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +41 -76
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +94 -345
- package/dist/Table/plugins/sortable/useTableSortable.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +23 -4
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +29 -33
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +2 -1
- package/dist/Table/types.d.ts +11 -0
- package/dist/Table/types.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 +16 -6
- package/dist/TextInput/TextInput.d.ts +10 -1
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +13 -19
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +32 -26
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +14 -17
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +14 -3
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -1
- package/dist/Timestamp/TimestampHoverCard.js +16 -34
- package/dist/Timestamp/formatInstant.d.ts +11 -1
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +3 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -11
- 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 +3 -19
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +6 -5
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +54 -16
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -9
- package/dist/TopNav/TopNavMegaMenu.d.ts +7 -0
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +146 -60
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +22 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +83 -38
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +13 -0
- package/dist/TreeList/TreeListBranches.d.ts +1 -1
- package/dist/TreeList/TreeListBranches.d.ts.map +1 -1
- package/dist/TreeList/TreeListBranches.js +14 -4
- package/dist/TreeList/TreeListItem.d.ts +11 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +57 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +16 -8
- package/dist/astryx.css +84 -96
- package/dist/astryx.umd.js +56 -56
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.stylex.d.ts +61 -0
- package/dist/hooks/containerReveal.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.stylex.js +63 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/useClipboard.d.ts +59 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useClipboard.js +106 -0
- package/dist/hooks/useContainerReveal.d.ts +14 -8
- package/dist/hooks/useContainerReveal.d.ts.map +1 -1
- package/dist/hooks/useContainerReveal.js +28 -69
- package/dist/hooks/useIndicatorFocusRing.d.ts +28 -0
- package/dist/hooks/useIndicatorFocusRing.d.ts.map +1 -0
- package/dist/hooks/useIndicatorFocusRing.js +96 -0
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +17 -4
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +12 -2
- package/dist/hooks/useScrollLock.d.ts.map +1 -1
- package/dist/hooks/useScrollLock.js +33 -18
- package/dist/hooks/useStreamingText.d.ts +18 -3
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +47 -7
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +9 -3
- package/dist/hooks/useTypeahead.d.ts +3 -2
- package/dist/hooks/useTypeahead.d.ts.map +1 -1
- package/dist/hooks/useTypeahead.js +19 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/defineTheme.d.ts +18 -2
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +10 -1
- package/dist/theme/derivedVarRegistry.d.ts +8 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +14 -13
- package/dist/theme/expandColorScale.d.ts +3 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +17 -7
- package/dist/theme/expandTypeScale.d.ts.map +1 -1
- package/dist/theme/expandTypeScale.js +17 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +11 -0
- package/dist/theme/index.d.ts +2 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/dist/theme/tokens.stylex.d.ts +12 -0
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +23 -0
- package/dist/utils/focusOutline.stylex.d.ts +122 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -0
- package/dist/utils/focusOutline.stylex.js +143 -0
- package/dist/utils/focusReturn.d.ts +24 -0
- package/dist/utils/focusReturn.d.ts.map +1 -0
- package/dist/utils/focusReturn.js +29 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -1
- package/dist/utils/mergeRefs.d.ts.map +1 -1
- package/dist/utils/mergeRefs.js +7 -5
- package/dist/utils/rtlStyles.d.ts +2 -2
- package/dist/utils/rtlStyles.js +2 -2
- package/dist/utils/themeProps.d.ts +20 -1
- package/dist/utils/themeProps.d.ts.map +1 -1
- package/dist/utils/themeProps.js +8 -2
- package/locales/en.json +52 -0
- package/locales/pseudo.json +39 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +16 -3
- package/src/AlertDialog/AlertDialog.test.tsx +208 -1
- package/src/AlertDialog/AlertDialog.tsx +21 -3
- package/src/AppShell/AppShell.doc.mjs +11 -0
- package/src/AppShell/AppShell.test.tsx +139 -0
- package/src/AppShell/AppShell.tsx +32 -22
- package/src/AspectRatio/AspectRatio.doc.mjs +27 -3
- package/src/AspectRatio/AspectRatio.test.tsx +30 -0
- package/src/AspectRatio/AspectRatio.tsx +13 -0
- package/src/Avatar/Avatar.doc.mjs +2 -13
- package/src/Avatar/Avatar.test.tsx +33 -8
- package/src/Avatar/Avatar.tsx +52 -50
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +2 -9
- package/src/Banner/Banner.test.tsx +58 -1
- package/src/Banner/Banner.tsx +33 -11
- package/src/Breadcrumbs/BreadcrumbItem.tsx +16 -6
- package/src/Breadcrumbs/index.ts +5 -1
- package/src/Button/Button.doc.mjs +2 -2
- package/src/Button/Button.tsx +22 -41
- package/src/Calendar/Calendar.tsx +2 -1
- package/src/Calendar/styles.ts +0 -8
- package/src/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.tsx +10 -6
- package/src/Chat/Chat.doc.mjs +2 -0
- package/src/Chat/ChatDictationButton.tsx +7 -1
- package/src/Chat/ChatLayoutScrollButton.test.tsx +22 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +8 -1
- package/src/Chat/ChatSendButton.tsx +2 -3
- package/src/Chat/ChatToolCalls.test.tsx +35 -0
- package/src/Chat/ChatToolCalls.tsx +36 -16
- package/src/Chat/useTriggerMenu.tsx +2 -5
- package/src/CheckboxInput/CheckboxInput.doc.mjs +4 -2
- package/src/CheckboxInput/CheckboxInput.test.tsx +120 -0
- package/src/CheckboxInput/CheckboxInput.tsx +45 -202
- package/src/ClickableCard/ClickableCard.tsx +6 -11
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -0
- package/src/CodeBlock/CodeBlock.test.tsx +91 -0
- package/src/CodeBlock/CodeBlock.tsx +57 -80
- package/src/Collapsible/Collapsible.tsx +22 -18
- package/src/CommandPalette/CommandPalette.test.tsx +29 -0
- package/src/CommandPalette/CommandPaletteItem.tsx +7 -4
- package/src/CommandPalette/CommandPaletteList.tsx +2 -2
- package/src/ComplexSelector/ComplexSelector.doc.mjs +42 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +73 -0
- package/src/ComplexSelector/ComplexSelector.tsx +41 -28
- package/src/ContextMenu/ContextMenu.doc.mjs +1 -1
- package/src/ContextMenu/ContextMenu.test.tsx +41 -0
- package/src/ContextMenu/ContextMenu.tsx +3 -3
- package/src/ContextMenu/index.ts +5 -1
- package/src/DateInput/DateInput.doc.mjs +18 -3
- package/src/DateInput/DateInput.test.tsx +112 -11
- package/src/DateInput/DateInput.tsx +44 -25
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +110 -14
- package/src/DateRangeInput/DateRangeInput.tsx +27 -21
- package/src/DateTimeInput/DateTimeInput.doc.mjs +16 -2
- package/src/DateTimeInput/DateTimeInput.test.tsx +154 -1
- package/src/DateTimeInput/DateTimeInput.tsx +58 -17
- package/src/Dialog/Dialog.tsx +2 -9
- package/src/DropdownMenu/DropdownMenu.doc.mjs +5 -9
- package/src/DropdownMenu/DropdownMenu.test.tsx +534 -4
- package/src/DropdownMenu/DropdownMenu.tsx +113 -52
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +27 -30
- package/src/DropdownMenu/DropdownMenuDivider.doc.mjs +34 -0
- package/src/DropdownMenu/DropdownMenuDivider.tsx +81 -0
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +39 -4
- package/src/DropdownMenu/DropdownMenuItem.tsx +48 -10
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +2 -1
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +30 -76
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +25 -19
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +44 -14
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +1 -5
- package/src/DropdownMenu/index.ts +8 -1
- package/src/DropdownMenu/renderDropdownItems.tsx +33 -34
- package/src/EmptyState/EmptyState.doc.mjs +4 -0
- package/src/EmptyState/EmptyState.test.tsx +62 -0
- package/src/EmptyState/EmptyState.tsx +16 -6
- package/src/Field/Field.doc.mjs +1 -0
- package/src/Field/InputClearButton.test.tsx +117 -0
- package/src/Field/InputClearButton.tsx +30 -3
- package/src/FileInput/FileInput.tsx +21 -8
- package/src/HoverCard/useHoverCard.tsx +2 -23
- package/src/Icon/Icon.doc.mjs +2 -1
- package/src/Indicator/CheckIndicator.tsx +174 -0
- package/src/Indicator/CheckboxIndicator.tsx +257 -0
- package/src/Indicator/Indicator.doc.mjs +344 -0
- package/src/Indicator/Indicator.test.tsx +393 -0
- package/src/Indicator/RadioIndicator.tsx +206 -0
- package/src/Indicator/index.ts +46 -0
- package/src/Indicator/indicator.markers.stylex.ts +19 -0
- package/src/Indicator/indicatorRegistry.test.tsx +106 -0
- package/src/Indicator/indicatorRegistry.ts +120 -0
- package/src/Indicator/types.ts +197 -0
- package/src/Indicator/useIndicator.ts +39 -0
- package/src/Item/Item.doc.mjs +1 -1
- package/src/Item/Item.tsx +7 -14
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layer/useLayer.test.tsx +85 -0
- package/src/Layer/useLayer.tsx +39 -1
- package/src/Lightbox/Lightbox.doc.mjs +1 -1
- package/src/Lightbox/Lightbox.tsx +45 -49
- package/src/Link/Link.tsx +4 -11
- package/src/MobileNav/MobileNav.tsx +3 -3
- package/src/MoreMenu/MoreMenu.doc.mjs +31 -0
- package/src/MoreMenu/MoreMenu.test.tsx +68 -1
- package/src/MoreMenu/MoreMenu.tsx +19 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +16 -1
- package/src/MultiSelector/MultiSelector.test.tsx +259 -16
- package/src/MultiSelector/MultiSelector.tsx +144 -121
- package/src/NumberInput/NumberInput.doc.mjs +265 -50
- package/src/NumberInput/NumberInput.test.tsx +726 -21
- package/src/NumberInput/NumberInput.tsx +353 -59
- package/src/Outline/Outline.tsx +2 -5
- package/src/Pagination/Pagination.doc.mjs +1 -1
- package/src/Pagination/Pagination.test.tsx +22 -7
- package/src/Pagination/Pagination.tsx +38 -35
- package/src/Popover/Popover.doc.mjs +2 -0
- package/src/Popover/Popover.tsx +6 -7
- package/src/Popover/usePopover.tsx +37 -4
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +42 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +7 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +27 -5
- package/src/ProgressBar/ProgressBar.test.tsx +224 -1
- package/src/ProgressBar/ProgressBar.tsx +126 -30
- package/src/RadioList/RadioList.doc.mjs +4 -2
- package/src/RadioList/RadioListItem.tsx +31 -130
- package/src/Resizable/ResizeHandle.tsx +2 -9
- package/src/SegmentedControl/SegmentedControlItem.tsx +2 -9
- package/src/SelectableCard/SelectableCard.tsx +4 -9
- package/src/Selector/Selector.doc.mjs +15 -4
- package/src/Selector/Selector.test.tsx +1234 -98
- package/src/Selector/Selector.tsx +254 -126
- package/src/Selector/hooks.ts +77 -50
- package/src/SideNav/SideNav.test.tsx +46 -0
- package/src/SideNav/SideNav.tsx +1 -0
- package/src/SideNav/SideNavCollapseButton.tsx +15 -10
- package/src/SideNav/SideNavHeading.tsx +48 -10
- package/src/SideNav/SideNavItem.tsx +20 -12
- package/src/Slider/Slider.tsx +2 -11
- package/src/Stack/Stack.doc.mjs +110 -0
- package/src/StatusDot/StatusDot.doc.mjs +12 -3
- package/src/Switch/Switch.test.tsx +32 -0
- package/src/Switch/Switch.tsx +18 -10
- package/src/TabList/Tab.tsx +2 -9
- package/src/TabList/TabMenu.tsx +14 -21
- package/src/Table/BaseTable.tsx +11 -0
- package/src/Table/Table.test.tsx +31 -0
- package/src/Table/TableRow.tsx +6 -0
- package/src/Table/index.ts +1 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +30 -14
- package/src/Table/plugins/rowExpansion/index.ts +1 -4
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +125 -175
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +115 -458
- package/src/Table/plugins/sortable/useTableSortable.tsx +2 -6
- package/src/Table/plugins/tree/useTableTreeData.tsx +43 -24
- package/src/Table/tableContextMenu.test.tsx +27 -0
- package/src/Table/tableContextMenu.tsx +1 -0
- package/src/Table/types.ts +11 -0
- package/src/Table/useTableGroupedRows.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +43 -66
- package/src/TextArea/TextArea.doc.mjs +42 -2
- package/src/TextArea/TextArea.test.tsx +219 -0
- package/src/TextArea/TextArea.tsx +34 -7
- package/src/TextInput/TextInput.doc.mjs +18 -2
- package/src/TextInput/TextInput.test.tsx +189 -0
- package/src/TextInput/TextInput.tsx +25 -31
- package/src/Thumbnail/Thumbnail.tsx +2 -9
- package/src/TimeInput/TimeInput.doc.mjs +2 -2
- package/src/TimeInput/TimeInput.test.tsx +84 -3
- package/src/TimeInput/TimeInput.tsx +26 -28
- package/src/Timestamp/Timestamp.doc.mjs +4 -3
- package/src/Timestamp/Timestamp.test.tsx +91 -14
- package/src/Timestamp/Timestamp.tsx +14 -2
- package/src/Timestamp/TimestampHoverCard.tsx +13 -35
- package/src/Timestamp/formatInstant.ts +16 -1
- package/src/Token/Token.tsx +5 -28
- package/src/Tokenizer/Tokenizer.doc.mjs +2 -2
- package/src/Tokenizer/Tokenizer.test.tsx +45 -3
- package/src/Tokenizer/Tokenizer.tsx +10 -2
- package/src/Tooltip/useTooltip.tsx +2 -23
- package/src/TopNav/TopNav.tsx +1 -3
- package/src/TopNav/TopNavHeading.tsx +42 -13
- package/src/TopNav/TopNavItem.tsx +3 -21
- package/src/TopNav/TopNavMegaMenu.doc.mjs +5 -0
- package/src/TopNav/TopNavMegaMenu.test.tsx +433 -33
- package/src/TopNav/TopNavMegaMenu.tsx +118 -53
- package/src/TopNav/TopNavMegaMenuItem.tsx +2 -9
- package/src/TopNav/TopNavMenu.tsx +34 -37
- package/src/TreeList/TreeList.doc.mjs +5 -0
- package/src/TreeList/TreeList.test.tsx +208 -8
- package/src/TreeList/TreeList.tsx +22 -0
- package/src/TreeList/TreeListBranches.tsx +25 -2
- package/src/TreeList/TreeListItem.tsx +89 -52
- package/src/Typeahead/BaseTypeahead.tsx +19 -6
- package/src/Typeahead/Typeahead.doc.mjs +1 -0
- package/src/Typeahead/Typeahead.test.tsx +76 -3
- package/src/hooks/containerReveal.stylex.ts +102 -0
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useClipboard.doc.mjs +87 -0
- package/src/hooks/useClipboard.test.tsx +151 -0
- package/src/hooks/useClipboard.ts +135 -0
- package/src/hooks/useContainerReveal.doc.mjs +7 -7
- package/src/hooks/useContainerReveal.test.tsx +42 -62
- package/src/hooks/useContainerReveal.ts +36 -91
- package/src/hooks/useImageMode.test.ts +1 -1
- package/src/hooks/useIndicatorFocusRing.tsx +120 -0
- package/src/hooks/useInputStatusIcon.tsx +8 -8
- package/src/hooks/useLongPress.test.tsx +18 -0
- package/src/hooks/useLongPress.ts +12 -2
- package/src/hooks/useScrollLock.test.ts +72 -0
- package/src/hooks/useScrollLock.ts +51 -19
- package/src/hooks/useStreamingText.test.ts +46 -1
- package/src/hooks/useStreamingText.ts +49 -7
- package/src/hooks/useTreeFocus.test.tsx +50 -0
- package/src/hooks/useTreeFocus.ts +14 -3
- package/src/hooks/useTypeahead.test.tsx +150 -0
- package/src/hooks/useTypeahead.ts +24 -9
- package/src/i18n/InternationalizationProvider.doc.mjs +7 -2
- package/src/index.ts +1 -0
- package/src/theme/defineTheme.ts +27 -0
- package/src/theme/derivedVarRegistry.test.ts +21 -1
- package/src/theme/derivedVarRegistry.ts +19 -6
- package/src/theme/expandColorScale.test.ts +14 -0
- package/src/theme/expandColorScale.ts +24 -9
- package/src/theme/expandTypeScale.test.ts +43 -0
- package/src/theme/expandTypeScale.ts +17 -0
- package/src/theme/generateThemeRules.test.ts +78 -20
- package/src/theme/generateThemeRules.ts +11 -0
- package/src/theme/index.ts +15 -0
- package/src/theme/tokens.stylex.ts +18 -0
- package/src/theme/tokens.test.ts +37 -0
- package/src/utils/focusOutline.stylex.ts +177 -0
- package/src/utils/focusReturn.test.ts +42 -0
- package/src/utils/focusReturn.ts +31 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/mergeRefs.test.ts +48 -0
- package/src/utils/mergeRefs.ts +12 -6
- package/src/utils/rtlStyles.ts +2 -2
- package/src/utils/themeProps.ts +26 -4
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts +0 -9
- package/dist/CheckboxInput/checkbox.markers.stylex.d.ts.map +0 -1
- package/dist/CheckboxInput/checkbox.markers.stylex.js +0 -14
- package/dist/RadioList/radio.markers.stylex.d.ts +0 -7
- package/dist/RadioList/radio.markers.stylex.d.ts.map +0 -1
- package/dist/RadioList/radio.markers.stylex.js +0 -12
- package/dist/hooks/containerReveal.pool.stylex.d.ts +0 -303
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +0 -1
- package/dist/hooks/containerReveal.pool.stylex.js +0 -292
- package/src/CheckboxInput/checkbox.markers.stylex.ts +0 -12
- package/src/RadioList/radio.markers.stylex.ts +0 -10
- package/src/hooks/containerReveal.pool.stylex.ts +0 -571
|
@@ -186,7 +186,6 @@ function discoverComponents(): ComponentInfo[] {
|
|
|
186
186
|
// ---------------------------------------------------------------------------
|
|
187
187
|
|
|
188
188
|
const DIR_TO_REGISTRY_KEY: Record<string, string> = {
|
|
189
|
-
Avatar: 'avatar',
|
|
190
189
|
Banner: 'banner',
|
|
191
190
|
Button: 'button',
|
|
192
191
|
Card: 'card',
|
|
@@ -196,8 +195,10 @@ const DIR_TO_REGISTRY_KEY: Record<string, string> = {
|
|
|
196
195
|
Field: 'field',
|
|
197
196
|
HoverCard: 'hovercard',
|
|
198
197
|
Popover: 'popover',
|
|
198
|
+
ProgressBar: 'progressbar-mark',
|
|
199
199
|
Section: 'section',
|
|
200
200
|
SegmentedControl: 'segmented-control',
|
|
201
|
+
TextArea: 'textarea',
|
|
201
202
|
};
|
|
202
203
|
|
|
203
204
|
/**
|
|
@@ -340,4 +341,23 @@ describe('getDerivedVars', () => {
|
|
|
340
341
|
it('returns empty for unregistered property', () => {
|
|
341
342
|
expect(getDerivedVars('card', 'color')).toEqual([]);
|
|
342
343
|
});
|
|
344
|
+
|
|
345
|
+
it('marks textarea paddingInline as replacing the source property', () => {
|
|
346
|
+
const result = getDerivedVars('textarea', 'paddingInline');
|
|
347
|
+
expect(result).toHaveLength(1);
|
|
348
|
+
expect(result[0].vars).toEqual(['--_textarea-inline-padding']);
|
|
349
|
+
expect(result[0].replaces).toBe(true);
|
|
350
|
+
});
|
|
351
|
+
|
|
352
|
+
it('marks progressbar-mark width and height as replacing the source property', () => {
|
|
353
|
+
for (const [property, varName] of [
|
|
354
|
+
['width', '--_progressbar-mark-width'],
|
|
355
|
+
['height', '--_progressbar-mark-height'],
|
|
356
|
+
]) {
|
|
357
|
+
const result = getDerivedVars('progressbar-mark', property);
|
|
358
|
+
expect(result).toHaveLength(1);
|
|
359
|
+
expect(result[0].vars).toEqual([varName]);
|
|
360
|
+
expect(result[0].replaces).toBe(true);
|
|
361
|
+
}
|
|
362
|
+
});
|
|
343
363
|
});
|
|
@@ -25,6 +25,14 @@ export interface DerivedVarEntry {
|
|
|
25
25
|
vars?: string[];
|
|
26
26
|
/** Named expansion strategy. 'container' expands padding to container tokens. */
|
|
27
27
|
expand?: 'container';
|
|
28
|
+
/**
|
|
29
|
+
* Emit only the internal `vars`, dropping the source property from the rule.
|
|
30
|
+
* Use when the class-carrying element must NOT receive the standard property
|
|
31
|
+
* itself — the value is consumed by a child through the var instead. Without
|
|
32
|
+
* this, the property is emitted alongside the var (correct when the same
|
|
33
|
+
* element both reads the var and applies the property, e.g. Chat/DropdownMenu).
|
|
34
|
+
*/
|
|
35
|
+
replaces?: boolean;
|
|
28
36
|
}
|
|
29
37
|
|
|
30
38
|
/**
|
|
@@ -35,12 +43,6 @@ export interface DerivedVarEntry {
|
|
|
35
43
|
* entries share the same property.
|
|
36
44
|
*/
|
|
37
45
|
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
|
-
],
|
|
44
46
|
banner: [{property: 'borderRadius', vars: ['--_banner-radius']}],
|
|
45
47
|
button: [{property: 'borderRadius', vars: ['--_button-radius']}],
|
|
46
48
|
card: [
|
|
@@ -62,11 +64,22 @@ export const derivedVarRegistry: Record<string, DerivedVarEntry[]> = {
|
|
|
62
64
|
field: [{property: 'borderRadius', vars: ['--_field-radius']}],
|
|
63
65
|
hovercard: [{property: 'borderRadius', vars: ['--_hovercard-radius']}],
|
|
64
66
|
popover: [{property: 'borderRadius', vars: ['--_popover-radius']}],
|
|
67
|
+
'progressbar-mark': [
|
|
68
|
+
{property: 'width', vars: ['--_progressbar-mark-width'], replaces: true},
|
|
69
|
+
{property: 'height', vars: ['--_progressbar-mark-height'], replaces: true},
|
|
70
|
+
],
|
|
65
71
|
section: [{property: 'padding', expand: 'container'}],
|
|
66
72
|
'segmented-control': [
|
|
67
73
|
{property: 'borderRadius', vars: ['--_segmented-control-radius']},
|
|
68
74
|
{property: 'padding', vars: ['--_segmented-control-padding']},
|
|
69
75
|
],
|
|
76
|
+
textarea: [
|
|
77
|
+
{
|
|
78
|
+
property: 'paddingInline',
|
|
79
|
+
vars: ['--_textarea-inline-padding'],
|
|
80
|
+
replaces: true,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
70
83
|
};
|
|
71
84
|
|
|
72
85
|
/**
|
|
@@ -100,6 +100,20 @@ describe('expandColorScale', () => {
|
|
|
100
100
|
standard['--color-text-primary'],
|
|
101
101
|
);
|
|
102
102
|
});
|
|
103
|
+
|
|
104
|
+
it('contrast high strengthens both border tokens', () => {
|
|
105
|
+
const standard = expandColorScale({
|
|
106
|
+
accent: '#0064E0',
|
|
107
|
+
contrast: 'standard',
|
|
108
|
+
});
|
|
109
|
+
const high = expandColorScale({accent: '#0064E0', contrast: 'high'});
|
|
110
|
+
// Both the subtle hairline and the emphasized border shift under high
|
|
111
|
+
// contrast, so structural boundaries stay perceivable.
|
|
112
|
+
expect(high['--color-border']).not.toBe(standard['--color-border']);
|
|
113
|
+
expect(high['--color-border-emphasized']).not.toBe(
|
|
114
|
+
standard['--color-border-emphasized'],
|
|
115
|
+
);
|
|
116
|
+
});
|
|
103
117
|
});
|
|
104
118
|
|
|
105
119
|
describe('expandColorScale — neutral-only themes (#2279)', () => {
|
|
@@ -71,7 +71,9 @@ export interface ColorScaleConfig {
|
|
|
71
71
|
neutralStyle?: 'warm' | 'cool' | 'neutral';
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
|
-
* Contrast level.
|
|
74
|
+
* Contrast level. `'high'` pulls text, icons, and borders toward stronger
|
|
75
|
+
* tones (and thickens the subtle border's alpha) so structural and textual
|
|
76
|
+
* boundaries stay perceivable.
|
|
75
77
|
* @default 'standard'
|
|
76
78
|
*/
|
|
77
79
|
contrast?: 'standard' | 'high';
|
|
@@ -190,17 +192,25 @@ export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
|
|
|
190
192
|
const textSecondaryLightTone = isHigh ? 20 : 30;
|
|
191
193
|
const textSecondaryDarkTone = isHigh ? 80 : 70;
|
|
192
194
|
|
|
195
|
+
// Borders track contrast the same way text does: high contrast pulls the
|
|
196
|
+
// emphasized border tone toward mid-scale (stronger against both the near-
|
|
197
|
+
// white light surface and the near-black dark surface) and thickens the
|
|
198
|
+
// otherwise-decorative subtle hairline by doubling its alpha, so structural
|
|
199
|
+
// boundaries stay perceivable for users who opt into high contrast.
|
|
200
|
+
const borderSubtleAlpha = isHigh ? 0.2 : 0.1;
|
|
201
|
+
|
|
193
202
|
// Emphasized borders outline form controls (CheckboxInput, Selector), so
|
|
194
203
|
// they are non-text UI boundaries under WCAG 1.4.11 and must reach 3:1
|
|
195
|
-
// against the surface they sit on.
|
|
196
|
-
//
|
|
197
|
-
//
|
|
198
|
-
|
|
204
|
+
// against the surface they sit on. High contrast starts at a more
|
|
205
|
+
// aggressive tone (50 vs 70/30), guaranteeing a stronger result; standard
|
|
206
|
+
// contrast starts at 70/30 and walks toward mid-scale only as far as needed.
|
|
207
|
+
const borderEmphasizedStartLight = isHigh ? 50 : 70;
|
|
208
|
+
const borderEmphasizedStartDark = isHigh ? 50 : 30;
|
|
199
209
|
const borderEmphasized = ld(
|
|
200
210
|
ensureContrastTone(
|
|
201
211
|
seedHue,
|
|
202
212
|
neutralVariantChroma,
|
|
203
|
-
|
|
213
|
+
borderEmphasizedStartLight,
|
|
204
214
|
-1,
|
|
205
215
|
N[99],
|
|
206
216
|
NON_TEXT_MIN_CONTRAST,
|
|
@@ -208,7 +218,7 @@ export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
|
|
|
208
218
|
ensureContrastTone(
|
|
209
219
|
seedHue,
|
|
210
220
|
neutralVariantChroma,
|
|
211
|
-
|
|
221
|
+
borderEmphasizedStartDark,
|
|
212
222
|
1,
|
|
213
223
|
N[10],
|
|
214
224
|
NON_TEXT_MIN_CONTRAST,
|
|
@@ -276,8 +286,13 @@ export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
|
|
|
276
286
|
'--color-background-inverted': ld(N[10], N[99]),
|
|
277
287
|
|
|
278
288
|
// Border
|
|
279
|
-
//
|
|
280
|
-
|
|
289
|
+
// Border
|
|
290
|
+
// Decorative hairline — not a WCAG 1.4.11 boundary. High contrast
|
|
291
|
+
// doubles the alpha so structural boundaries stay perceivable.
|
|
292
|
+
'--color-border': ld(
|
|
293
|
+
hexWithAlpha(N[10], borderSubtleAlpha),
|
|
294
|
+
hexWithAlpha(N[95], borderSubtleAlpha),
|
|
295
|
+
),
|
|
281
296
|
'--color-border-emphasized': borderEmphasized,
|
|
282
297
|
|
|
283
298
|
// Effects
|
|
@@ -305,4 +305,47 @@ describe('generateTypeScaleComponents', () => {
|
|
|
305
305
|
'var(--text-body-leading)',
|
|
306
306
|
);
|
|
307
307
|
});
|
|
308
|
+
|
|
309
|
+
it('generates rules for all 3 heading display types', () => {
|
|
310
|
+
const components = generateTypeScaleComponents({base: 14, ratio: 1.2});
|
|
311
|
+
for (const type of ['display-1', 'display-2', 'display-3']) {
|
|
312
|
+
expect(components.heading).toHaveProperty(`type:${type}`);
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('heading display-type rules reference the display semantic tokens', () => {
|
|
317
|
+
const components = generateTypeScaleComponents({base: 14, ratio: 1.2});
|
|
318
|
+
const display1 = components.heading['type:display-1'];
|
|
319
|
+
expect(display1.fontFamily).toBe('var(--font-family-heading)');
|
|
320
|
+
expect(display1.fontSize).toBe('var(--text-display-1-size)');
|
|
321
|
+
expect(display1.lineHeight).toBe('var(--text-display-1-leading)');
|
|
322
|
+
// fontWeight is intentionally omitted here, matching the `text` branch's
|
|
323
|
+
// type-keyed rules — see defaultWeightByTypeStyles for how weight is
|
|
324
|
+
// applied instead.
|
|
325
|
+
expect(display1.fontWeight).toBeUndefined();
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it('emits heading type:display-N rules after level:N rules, so type wins at equal specificity', () => {
|
|
329
|
+
// Heading renders both a `level:N` and a `type:display-N` class on the
|
|
330
|
+
// same element simultaneously when `type` is set (see Heading.tsx).
|
|
331
|
+
// Both produce single-class-selector CSS rules of equal specificity, so
|
|
332
|
+
// CSS's own "last rule wins" tiebreak is what makes `type` take
|
|
333
|
+
// precedence over `level` -- which only holds if type rules are emitted
|
|
334
|
+
// strictly after all level rules in this object's (and therefore the
|
|
335
|
+
// generated stylesheet's) key order. This regression-tests #4829,
|
|
336
|
+
// where type-keyed heading rules didn't exist at all and level always
|
|
337
|
+
// won by default, silently discarding the `type` prop under any theme
|
|
338
|
+
// with a typography.scale.
|
|
339
|
+
const components = generateTypeScaleComponents({base: 14, ratio: 1.2});
|
|
340
|
+
const keys = Object.keys(components.heading);
|
|
341
|
+
const lastLevelIndex = Math.max(
|
|
342
|
+
...[1, 2, 3, 4, 5, 6].map(level => keys.indexOf(`level:${level}`)),
|
|
343
|
+
);
|
|
344
|
+
const firstTypeIndex = Math.min(
|
|
345
|
+
...['display-1', 'display-2', 'display-3'].map(type =>
|
|
346
|
+
keys.indexOf(`type:${type}`),
|
|
347
|
+
),
|
|
348
|
+
);
|
|
349
|
+
expect(firstTypeIndex).toBeGreaterThan(lastLevelIndex);
|
|
350
|
+
});
|
|
308
351
|
});
|
|
@@ -368,6 +368,23 @@ export function generateTypeScaleComponents(
|
|
|
368
368
|
lineHeight: `var(--text-heading-${level}-leading)`,
|
|
369
369
|
};
|
|
370
370
|
}
|
|
371
|
+
// `Heading` renders both a `level:N` and, when set, a `type:display-N`
|
|
372
|
+
// visual-prop class simultaneously (type sizing takes precedence over
|
|
373
|
+
// level sizing — see Heading.tsx's own `type ? sizeByTypeStyles[type] :
|
|
374
|
+
// sizeByLevelStyles[level]`). Without a `type:display-N` rule here, the
|
|
375
|
+
// `level:N` rule is the only one that matches, so it silently wins
|
|
376
|
+
// regardless of `type` once a theme supplies a type scale. Emitting these
|
|
377
|
+
// after the level rules keeps them later in source order, so they take
|
|
378
|
+
// precedence at equal specificity, matching the component's own logic.
|
|
379
|
+
// fontWeight is intentionally omitted, mirroring the `text` branch below
|
|
380
|
+
// and preserving `defaultWeightByTypeStyles`.
|
|
381
|
+
for (const type of ['display-1', 'display-2', 'display-3']) {
|
|
382
|
+
headingRules[`type:${type}`] = {
|
|
383
|
+
fontFamily: 'var(--font-family-heading)',
|
|
384
|
+
fontSize: `var(--text-${type}-size)`,
|
|
385
|
+
lineHeight: `var(--text-${type}-leading)`,
|
|
386
|
+
};
|
|
387
|
+
}
|
|
371
388
|
components.heading = headingRules;
|
|
372
389
|
|
|
373
390
|
const textRules: Record<string, Record<string, string>> = {};
|
|
@@ -23,6 +23,23 @@ const defaultInput = {
|
|
|
23
23
|
},
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
+
describe('focus outline tokens', () => {
|
|
27
|
+
it('emits a focus ring override into the theme scope', () => {
|
|
28
|
+
const theme = defineTheme({
|
|
29
|
+
name: 'brand',
|
|
30
|
+
tokens: {
|
|
31
|
+
'--focus-outline-color': '#FF00FF',
|
|
32
|
+
'--focus-outline-width': '4px',
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const {component} = generateThemeCSS(theme);
|
|
37
|
+
|
|
38
|
+
expect(component).toContain('--focus-outline-color: #FF00FF;');
|
|
39
|
+
expect(component).toContain('--focus-outline-width: 4px;');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
|
|
26
43
|
describe('generateThemeRules', () => {
|
|
27
44
|
const theme = defineTheme(defaultInput);
|
|
28
45
|
const rules = generateThemeRules(theme);
|
|
@@ -385,46 +402,46 @@ describe('derived var expansion', () => {
|
|
|
385
402
|
expect(rule).toContain('--_button-radius: 8px');
|
|
386
403
|
});
|
|
387
404
|
|
|
388
|
-
it('emits
|
|
405
|
+
it('emits direct rules for avatar fallback background, color, and weight', () => {
|
|
389
406
|
const theme = defineTheme({
|
|
390
|
-
name: 'test-
|
|
407
|
+
name: 'test-avatar-fallback',
|
|
391
408
|
components: {
|
|
392
|
-
avatar: {
|
|
409
|
+
'avatar-fallback': {
|
|
393
410
|
base: {
|
|
394
|
-
fontWeight: 'var(--font-weight-normal)',
|
|
395
|
-
color: 'var(--color-text-secondary)',
|
|
396
411
|
backgroundColor: 'var(--color-accent-muted)',
|
|
412
|
+
color: 'var(--color-text-secondary)',
|
|
413
|
+
fontWeight: 'var(--font-weight-normal)',
|
|
397
414
|
},
|
|
398
415
|
},
|
|
399
416
|
},
|
|
400
417
|
});
|
|
401
418
|
const rules = generateThemeRules(theme);
|
|
402
|
-
const rule = rules.find(r => r.includes('.astryx-avatar'));
|
|
419
|
+
const rule = rules.find(r => r.includes('.astryx-avatar-fallback'));
|
|
403
420
|
expect(rule).toBeDefined();
|
|
404
|
-
expect(rule).toContain(
|
|
405
|
-
|
|
406
|
-
);
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
);
|
|
410
|
-
expect(rule).toContain(
|
|
411
|
-
'--_avatar-fallback-background: var(--color-accent-muted)',
|
|
412
|
-
);
|
|
421
|
+
expect(rule).toContain('background-color: var(--color-accent-muted)');
|
|
422
|
+
expect(rule).toContain('color: var(--color-text-secondary)');
|
|
423
|
+
expect(rule).toContain('font-weight: var(--font-weight-normal)');
|
|
424
|
+
// These are direct class targets now, not internal derived vars.
|
|
425
|
+
expect(rule).not.toContain('--_avatar-fallback-background');
|
|
426
|
+
expect(rule).not.toContain('--_avatar-fallback-color');
|
|
427
|
+
expect(rule).not.toContain('--_avatar-fallback-font-weight');
|
|
413
428
|
});
|
|
414
429
|
|
|
415
|
-
it('emits a per-size
|
|
430
|
+
it('emits a direct per-size font-size rule for the avatar fallback target', () => {
|
|
416
431
|
const theme = defineTheme({
|
|
417
|
-
name: 'test-
|
|
432
|
+
name: 'test-avatar-fallback-size',
|
|
418
433
|
components: {
|
|
419
|
-
avatar: {
|
|
434
|
+
'avatar-fallback': {
|
|
420
435
|
'size:sm': {fontSize: '9px'},
|
|
421
436
|
},
|
|
422
437
|
},
|
|
423
438
|
});
|
|
424
439
|
const rules = generateThemeRules(theme);
|
|
425
|
-
const rule = rules.find(r => r.includes('.astryx-avatar.sm'));
|
|
440
|
+
const rule = rules.find(r => r.includes('.astryx-avatar-fallback.sm'));
|
|
426
441
|
expect(rule).toBeDefined();
|
|
427
|
-
expect(rule).toContain('
|
|
442
|
+
expect(rule).toContain('font-size: 9px');
|
|
443
|
+
// Direct class target now — no internal derived var.
|
|
444
|
+
expect(rule).not.toContain('--_avatar-fallback-font-size');
|
|
428
445
|
});
|
|
429
446
|
|
|
430
447
|
it('does not emit derived vars for components without registry entries', () => {
|
|
@@ -475,6 +492,47 @@ describe('derived var expansion', () => {
|
|
|
475
492
|
expect(rule).toContain('border-radius: 16px');
|
|
476
493
|
expect(rule).toContain('--_card-radius: 16px');
|
|
477
494
|
});
|
|
495
|
+
|
|
496
|
+
it('replaces paddingInline with the var for textarea (no raw property)', () => {
|
|
497
|
+
const theme = defineTheme({
|
|
498
|
+
name: 'test-derived-textarea',
|
|
499
|
+
components: {
|
|
500
|
+
textarea: {
|
|
501
|
+
base: {paddingInline: 'var(--eps-input-padding-x)'},
|
|
502
|
+
},
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
const rules = generateThemeRules(theme);
|
|
506
|
+
const rule = rules.find(r => r.includes('.astryx-textarea'));
|
|
507
|
+
expect(rule).toBeDefined();
|
|
508
|
+
// Value flows to the inner <textarea> via the var…
|
|
509
|
+
expect(rule).toContain(
|
|
510
|
+
'--_textarea-inline-padding: var(--eps-input-padding-x)',
|
|
511
|
+
);
|
|
512
|
+
// …and must NOT land on the flush wrapper, which would re-inset the
|
|
513
|
+
// full-bleed textarea and push the native resize grip off the corner.
|
|
514
|
+
expect(rule).not.toContain('padding-inline: var(--eps-input-padding-x)');
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
it('replaces progressbar-mark width/height with vars (no raw properties)', () => {
|
|
518
|
+
const theme = defineTheme({
|
|
519
|
+
name: 'test-derived-progressbar-mark',
|
|
520
|
+
components: {
|
|
521
|
+
'progressbar-mark': {
|
|
522
|
+
base: {width: '2px', height: '12px'},
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
});
|
|
526
|
+
const rules = generateThemeRules(theme);
|
|
527
|
+
const rule = rules.find(r => r.includes('.astryx-progressbar-mark'));
|
|
528
|
+
expect(rule).toBeDefined();
|
|
529
|
+
expect(rule).toContain('--_progressbar-mark-width: 2px');
|
|
530
|
+
expect(rule).toContain('--_progressbar-mark-height: 12px');
|
|
531
|
+
// Raw dimensions would be a same-element fight with the mark's StyleX,
|
|
532
|
+
// which an unlayered consumer build wins — the vars have no competitor.
|
|
533
|
+
expect(rule).not.toMatch(/[{;]\s*width: 2px/);
|
|
534
|
+
expect(rule).not.toMatch(/[{;]\s*height: 12px/);
|
|
535
|
+
});
|
|
478
536
|
});
|
|
479
537
|
|
|
480
538
|
describe('brutalist-style derived expansion', () => {
|
|
@@ -350,9 +350,11 @@ function generateComponentRules(
|
|
|
350
350
|
// Entries are processed in order (priority).
|
|
351
351
|
// - `vars`: emit internal CSS custom property declarations
|
|
352
352
|
// - `expand: 'container'`: expand padding to container layout tokens
|
|
353
|
+
// - `replaces: true`: emit only the var, dropping the source property
|
|
353
354
|
let finalProps = props;
|
|
354
355
|
const derivedProps: [string, string][] = [];
|
|
355
356
|
let containerExpanded = false;
|
|
357
|
+
const replacedProps = new Set<string>();
|
|
356
358
|
|
|
357
359
|
for (const [prop, value] of props) {
|
|
358
360
|
const derived = getDerivedVars(component, prop);
|
|
@@ -366,6 +368,9 @@ function generateComponentRules(
|
|
|
366
368
|
if (entry.expand === 'container' && PADDING_PROPS.has(prop)) {
|
|
367
369
|
containerExpanded = true;
|
|
368
370
|
}
|
|
371
|
+
if (entry.replaces) {
|
|
372
|
+
replacedProps.add(prop);
|
|
373
|
+
}
|
|
369
374
|
if (entry.vars) {
|
|
370
375
|
for (const varName of entry.vars) {
|
|
371
376
|
derivedProps.push([varName, value]);
|
|
@@ -384,6 +389,12 @@ function generateComponentRules(
|
|
|
384
389
|
finalProps = [...nonPaddingProps, ...containerTokens];
|
|
385
390
|
}
|
|
386
391
|
|
|
392
|
+
// Drop properties whose derived entry set `replaces` — their value is
|
|
393
|
+
// carried by the emitted var and must not land on the class element.
|
|
394
|
+
if (replacedProps.size > 0) {
|
|
395
|
+
finalProps = finalProps.filter(([p]) => !replacedProps.has(p));
|
|
396
|
+
}
|
|
397
|
+
|
|
387
398
|
if (derivedProps.length > 0) {
|
|
388
399
|
finalProps = [...finalProps, ...derivedProps];
|
|
389
400
|
}
|
package/src/theme/index.ts
CHANGED
|
@@ -90,6 +90,7 @@ export {
|
|
|
90
90
|
spacingDefaults,
|
|
91
91
|
sizeDefaults,
|
|
92
92
|
borderDefaults,
|
|
93
|
+
focusDefaults,
|
|
93
94
|
radiusDefaults,
|
|
94
95
|
shadowDefaults,
|
|
95
96
|
durationDefaults,
|
|
@@ -102,6 +103,7 @@ export {
|
|
|
102
103
|
spacingVars,
|
|
103
104
|
sizeVars,
|
|
104
105
|
borderVars,
|
|
106
|
+
focusVars,
|
|
105
107
|
radiusVars,
|
|
106
108
|
shadowVars,
|
|
107
109
|
durationVars,
|
|
@@ -130,6 +132,19 @@ export type {
|
|
|
130
132
|
|
|
131
133
|
export {useTheme, useThemeName, ThemeContext} from './useTheme';
|
|
132
134
|
export type {UseThemeReturn, ThemeContextValue} from './useTheme';
|
|
135
|
+
|
|
136
|
+
export type {
|
|
137
|
+
IndicatorComponent,
|
|
138
|
+
IndicatorFamily,
|
|
139
|
+
IndicatorFamilyMap,
|
|
140
|
+
IndicatorMap,
|
|
141
|
+
IndicatorName,
|
|
142
|
+
IndicatorNameOfFamily,
|
|
143
|
+
IndicatorProps,
|
|
144
|
+
IndicatorRegistry,
|
|
145
|
+
IndicatorSize,
|
|
146
|
+
IndicatorState,
|
|
147
|
+
} from '../Indicator';
|
|
133
148
|
export {
|
|
134
149
|
resolveThemeToken,
|
|
135
150
|
resolveThemeTokens,
|
|
@@ -193,6 +193,24 @@ export const borderVars = stylex.defineVars(borderDefaults);
|
|
|
193
193
|
|
|
194
194
|
export type BorderVarName = keyof typeof borderDefaults;
|
|
195
195
|
|
|
196
|
+
// =============================================================================
|
|
197
|
+
// Focus Tokens
|
|
198
|
+
// =============================================================================
|
|
199
|
+
// The keyboard focus ring, as one definition for the whole system. Values come
|
|
200
|
+
// from Design Conventions §User Interaction States: 2px --color-accent at 3px
|
|
201
|
+
// offset. Components read these through utils/focusOutline.stylex.ts; the
|
|
202
|
+
// `:focus-visible` condition stays in core, so a theme can restyle the ring
|
|
203
|
+
// but cannot show it to pointer users.
|
|
204
|
+
|
|
205
|
+
export const focusDefaults = {
|
|
206
|
+
'--focus-outline-width': '2px',
|
|
207
|
+
'--focus-outline-style': 'solid',
|
|
208
|
+
'--focus-outline-color': 'var(--color-accent)',
|
|
209
|
+
'--focus-outline-offset': '3px',
|
|
210
|
+
} as const;
|
|
211
|
+
|
|
212
|
+
export const focusVars = stylex.defineVars(focusDefaults);
|
|
213
|
+
|
|
196
214
|
// =============================================================================
|
|
197
215
|
// Radius Tokens
|
|
198
216
|
// =============================================================================
|
package/src/theme/tokens.test.ts
CHANGED
|
@@ -280,3 +280,40 @@ describe('resolveThemeTokens — generated themes end to end', () => {
|
|
|
280
280
|
expect(light['--color-icon-accent']).toBe(light['--color-accent']);
|
|
281
281
|
});
|
|
282
282
|
});
|
|
283
|
+
|
|
284
|
+
describe('focus outline tokens', () => {
|
|
285
|
+
it('default to the accent ring from Design Conventions', () => {
|
|
286
|
+
const tokens = resolveThemeTokens(null, {mode: 'light'});
|
|
287
|
+
|
|
288
|
+
expect(tokens['--focus-outline-width']).toBe('2px');
|
|
289
|
+
expect(tokens['--focus-outline-style']).toBe('solid');
|
|
290
|
+
expect(tokens['--focus-outline-offset']).toBe('3px');
|
|
291
|
+
// Tracks the theme's accent unless a theme says otherwise.
|
|
292
|
+
expect(tokens['--focus-outline-color']).toBe(tokens['--color-accent']);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('follows a theme accent without an explicit focus override', () => {
|
|
296
|
+
const theme = defineTheme({name: 'brand', color: {accent: '#AA0000'}});
|
|
297
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
298
|
+
|
|
299
|
+
expect(tokens['--focus-outline-color']).toBe(tokens['--color-accent']);
|
|
300
|
+
expect(tokens['--focus-outline-color']).not.toContain('var(');
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it('takes an explicit ring over the accent', () => {
|
|
304
|
+
const theme = defineTheme({
|
|
305
|
+
name: 'brand',
|
|
306
|
+
color: {accent: '#AA0000'},
|
|
307
|
+
tokens: {
|
|
308
|
+
'--focus-outline-color': '#00FF00',
|
|
309
|
+
'--focus-outline-width': '4px',
|
|
310
|
+
'--focus-outline-offset': '0px',
|
|
311
|
+
},
|
|
312
|
+
});
|
|
313
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
314
|
+
|
|
315
|
+
expect(tokens['--focus-outline-color']).toBe('#00FF00');
|
|
316
|
+
expect(tokens['--focus-outline-width']).toBe('4px');
|
|
317
|
+
expect(tokens['--focus-outline-offset']).toBe('0px');
|
|
318
|
+
});
|
|
319
|
+
});
|