@astryxdesign/core 0.2.0 → 0.3.0-canary.1b8b3f2
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 +110 -0
- package/README.md +5 -3
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.js +1 -1
- package/dist/AppShell/AppShell.d.ts +2 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +25 -18
- package/dist/AppShell/index.d.ts +20 -1
- package/dist/AppShell/index.d.ts.map +1 -1
- package/dist/AppShell/index.js +14 -0
- package/dist/AspectRatio/AspectRatio.d.ts +1 -1
- package/dist/AspectRatio/AspectRatio.js +1 -1
- package/dist/Avatar/Avatar.d.ts +1 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +35 -14
- package/dist/Avatar/AvatarStatusDot.d.ts +2 -26
- package/dist/Avatar/AvatarStatusDot.d.ts.map +1 -1
- package/dist/Avatar/AvatarStatusDot.js +1 -22
- package/dist/Avatar/index.d.ts +26 -1
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +21 -0
- package/dist/AvatarGroup/AvatarGroup.d.ts +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +4 -8
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts +2 -2
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +7 -3
- package/dist/Badge/Badge.d.ts +2 -30
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +2 -17
- package/dist/Badge/index.d.ts +31 -2
- package/dist/Badge/index.d.ts.map +1 -1
- package/dist/Badge/index.js +15 -1
- package/dist/Banner/Banner.d.ts +2 -37
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +6 -34
- package/dist/Banner/index.d.ts +37 -1
- package/dist/Banner/index.d.ts.map +1 -1
- package/dist/Banner/index.js +27 -0
- package/dist/Blockquote/Blockquote.d.ts +1 -1
- package/dist/Blockquote/Blockquote.js +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +4 -3
- package/dist/Breadcrumbs/Breadcrumbs.d.ts +2 -18
- package/dist/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs/Breadcrumbs.js +1 -15
- package/dist/Breadcrumbs/index.d.ts +18 -1
- package/dist/Breadcrumbs/index.d.ts.map +1 -1
- package/dist/Breadcrumbs/index.js +14 -0
- package/dist/Button/Button.d.ts +3 -21
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +6 -19
- package/dist/Button/index.d.ts +21 -3
- package/dist/Button/index.d.ts.map +1 -1
- package/dist/Button/index.js +15 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/Calendar/Calendar.js +1 -1
- package/dist/Calendar/index.d.ts +1 -1
- package/dist/Calendar/index.d.ts.map +1 -1
- package/dist/Calendar/index.js +1 -1
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.js +2 -2
- package/dist/Calendar/utils.d.ts +0 -4
- package/dist/Calendar/utils.d.ts.map +1 -1
- package/dist/Calendar/utils.js +1 -8
- package/dist/Card/Card.d.ts +1 -1
- package/dist/Card/Card.js +1 -1
- package/dist/Carousel/Carousel.d.ts +54 -3
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +90 -27
- package/dist/Carousel/index.d.ts +1 -1
- package/dist/Carousel/index.d.ts.map +1 -1
- package/dist/Center/Center.d.ts +21 -4
- package/dist/Center/Center.d.ts.map +1 -1
- package/dist/Center/Center.js +11 -3
- package/dist/Chat/ChatComposer.d.ts +1 -1
- package/dist/Chat/ChatComposer.js +9 -9
- package/dist/Chat/ChatComposerDrawer.d.ts +1 -1
- package/dist/Chat/ChatComposerDrawer.js +5 -5
- package/dist/Chat/ChatComposerInput.d.ts +1 -1
- package/dist/Chat/ChatComposerInput.js +1 -1
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.js +1 -1
- package/dist/Chat/ChatLayout.d.ts +8 -1
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +15 -4
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +1 -1
- package/dist/Chat/ChatMessage.d.ts +1 -1
- package/dist/Chat/ChatMessage.js +1 -1
- package/dist/Chat/ChatMessageBubble.d.ts +1 -1
- package/dist/Chat/ChatMessageBubble.js +1 -1
- package/dist/Chat/ChatMessageList.d.ts +1 -1
- package/dist/Chat/ChatMessageList.js +1 -1
- package/dist/Chat/ChatSendButton.d.ts.map +1 -1
- package/dist/Chat/ChatSendButton.js +4 -2
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.js +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +3 -3
- package/dist/CheckboxList/CheckboxList.d.ts +1 -1
- package/dist/CheckboxList/CheckboxList.js +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +20 -5
- package/dist/Citation/Citation.d.ts +1 -1
- package/dist/Citation/Citation.js +1 -1
- package/dist/ClickableCard/ClickableCard.d.ts +3 -3
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/Code/Code.d.ts +2 -2
- package/dist/Code/Code.js +2 -2
- package/dist/CodeBlock/CodeBlock.js +2 -2
- package/dist/Collapsible/Collapsible.d.ts +1 -1
- package/dist/Collapsible/Collapsible.js +3 -3
- package/dist/Collapsible/CollapsibleGroup.d.ts +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +1 -1
- package/dist/CommandPalette/CommandPalette.d.ts +1 -1
- package/dist/CommandPalette/CommandPalette.js +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +1 -1
- package/dist/CommandPalette/CommandPaletteFooter.js +1 -1
- package/dist/CommandPalette/CommandPaletteGroup.js +1 -1
- package/dist/CommandPalette/CommandPaletteInput.d.ts +2 -2
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +4 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +1 -1
- package/dist/CommandPalette/CommandPaletteList.js +1 -1
- package/dist/ComplexSelector/ComplexSelector.d.ts +108 -0
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -0
- package/dist/ComplexSelector/ComplexSelector.js +316 -0
- package/dist/ComplexSelector/index.d.ts +7 -0
- package/dist/ComplexSelector/index.d.ts.map +1 -0
- package/dist/ComplexSelector/index.js +10 -0
- package/dist/ContextMenu/ContextMenu.d.ts +2 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +24 -6
- package/dist/DateInput/DateInput.d.ts +9 -2
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts +9 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +4 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts +9 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +4 -2
- package/dist/Dialog/Dialog.d.ts +33 -24
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +47 -31
- package/dist/Dialog/DialogHeader.d.ts +1 -1
- package/dist/Dialog/DialogHeader.js +1 -1
- package/dist/Dialog/index.d.ts +18 -1
- package/dist/Dialog/index.d.ts.map +1 -1
- package/dist/Dialog/index.js +14 -0
- package/dist/Divider/Divider.d.ts +2 -18
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +1 -15
- package/dist/Divider/index.d.ts +18 -1
- package/dist/Divider/index.d.ts.map +1 -1
- package/dist/Divider/index.js +14 -0
- package/dist/DropdownMenu/DropdownMenu.d.ts +9 -3
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +23 -19
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts +18 -12
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuCheckboxItem.js +38 -63
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts +8 -11
- package/dist/DropdownMenu/DropdownMenuRadioGroup.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioGroup.js +3 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuRadioItem.js +6 -2
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +14 -6
- package/dist/DropdownMenu/menuItemHover.d.ts +1 -0
- package/dist/DropdownMenu/menuItemHover.d.ts.map +1 -1
- package/dist/DropdownMenu/menuItemHover.js +1 -0
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +6 -4
- package/dist/EmptyState/EmptyState.d.ts +1 -1
- package/dist/EmptyState/EmptyState.js +1 -1
- package/dist/Field/Field.d.ts +1 -1
- package/dist/Field/Field.js +1 -1
- package/dist/Field/FieldLabel.d.ts +4 -3
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +48 -5
- package/dist/FieldStatus/FieldStatus.d.ts +1 -18
- package/dist/FieldStatus/FieldStatus.d.ts.map +1 -1
- package/dist/FieldStatus/FieldStatus.js +13 -17
- package/dist/FieldStatus/index.d.ts +19 -1
- package/dist/FieldStatus/index.d.ts.map +1 -1
- package/dist/FieldStatus/index.js +14 -0
- package/dist/FileInput/FileInput.js +1 -1
- package/dist/FormLayout/FormLayout.d.ts +1 -1
- package/dist/FormLayout/FormLayout.d.ts.map +1 -1
- package/dist/FormLayout/FormLayout.js +1 -1
- package/dist/Grid/Grid.d.ts +2 -10
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +1 -10
- package/dist/Grid/GridSpan.d.ts +1 -1
- package/dist/Grid/GridSpan.js +1 -1
- package/dist/HStack/HStack.d.ts +1 -1
- package/dist/HStack/HStack.js +1 -1
- package/dist/Heading/Heading.d.ts +2 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +5 -4
- package/dist/HoverCard/HoverCard.d.ts +1 -1
- package/dist/HoverCard/HoverCard.js +1 -1
- package/dist/Icon/Icon.d.ts +1 -1
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +4 -2
- package/dist/Icon/defaultIcons.d.ts.map +1 -1
- package/dist/Icon/defaultIcons.js +14 -0
- package/dist/Icon/globalIconRegistry.d.ts +48 -6
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +74 -7
- package/dist/Icon/index.d.ts +4 -3
- package/dist/Icon/index.d.ts.map +1 -1
- package/dist/Icon/index.js +2 -1
- package/dist/Icon/useIcon.d.ts +14 -0
- package/dist/Icon/useIcon.d.ts.map +1 -0
- package/dist/Icon/useIcon.js +21 -0
- package/dist/IconButton/IconButton.d.ts +1 -1
- package/dist/IconButton/IconButton.js +1 -1
- package/dist/InputGroup/InputGroup.d.ts +1 -1
- package/dist/InputGroup/InputGroup.js +1 -1
- package/dist/InputGroup/InputGroupText.d.ts +1 -1
- package/dist/InputGroup/InputGroupText.js +1 -1
- package/dist/Item/Item.d.ts +17 -4
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +32 -7
- package/dist/Kbd/Kbd.d.ts +1 -1
- package/dist/Kbd/Kbd.js +1 -1
- package/dist/Layout/Layout.d.ts +1 -1
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.d.ts +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.d.ts +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.d.ts +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Layout/LayoutPanel.d.ts +1 -1
- package/dist/Layout/LayoutPanel.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts +6 -4
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +173 -79
- package/dist/Link/Link.d.ts +1 -1
- package/dist/Link/Link.js +1 -1
- package/dist/Link/LinkProvider.d.ts +2 -2
- package/dist/Link/LinkProvider.js +2 -2
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.d.ts +12 -2
- package/dist/List/ListItem.d.ts.map +1 -1
- package/dist/List/ListItem.js +3 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +35 -13
- package/dist/MetadataList/MetadataList.d.ts +2 -2
- package/dist/MetadataList/MetadataList.d.ts.map +1 -1
- package/dist/MetadataList/MetadataList.js +38 -12
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.js +1 -1
- package/dist/MobileNav/MobileNav.d.ts +1 -1
- package/dist/MobileNav/MobileNav.js +9 -9
- package/dist/MoreMenu/MoreMenu.d.ts +1 -1
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +13 -4
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +118 -24
- package/dist/NavIcon/NavIcon.d.ts +1 -1
- package/dist/NavIcon/NavIcon.js +1 -1
- package/dist/NavMenu/index.d.ts +0 -2
- package/dist/NavMenu/index.d.ts.map +1 -1
- package/dist/NavMenu/index.js +1 -3
- package/dist/NumberInput/NumberInput.d.ts +1 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +16 -5
- package/dist/Outline/Outline.js +1 -1
- package/dist/OverflowList/OverflowList.d.ts +1 -1
- package/dist/OverflowList/OverflowList.js +1 -1
- package/dist/Pagination/Pagination.d.ts +26 -21
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +174 -52
- package/dist/Pagination/index.d.ts +22 -1
- package/dist/Pagination/index.d.ts.map +1 -1
- package/dist/Pagination/index.js +14 -0
- package/dist/Popover/Popover.d.ts +20 -3
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +5 -1
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +14 -3
- package/dist/PowerSearch/PowerSearch.d.ts +1 -1
- package/dist/PowerSearch/PowerSearch.js +1 -1
- package/dist/ProgressBar/ProgressBar.d.ts +56 -22
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +169 -22
- package/dist/ProgressBar/ProgressBarMarkTooltip.d.ts +27 -0
- package/dist/ProgressBar/ProgressBarMarkTooltip.d.ts.map +1 -0
- package/dist/ProgressBar/ProgressBarMarkTooltip.js +35 -0
- package/dist/ProgressBar/index.d.ts +21 -1
- package/dist/ProgressBar/index.d.ts.map +1 -1
- package/dist/ProgressBar/index.js +14 -0
- package/dist/RadioList/RadioList.d.ts +1 -1
- package/dist/RadioList/RadioList.js +1 -1
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +2 -2
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +15 -11
- package/dist/Section/Section.d.ts +2 -19
- package/dist/Section/Section.d.ts.map +1 -1
- package/dist/Section/Section.js +1 -15
- package/dist/Section/index.d.ts +19 -1
- package/dist/Section/index.d.ts.map +1 -1
- package/dist/Section/index.js +14 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -3
- package/dist/SelectableCard/SelectableCard.d.ts +4 -3
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +15 -3
- package/dist/Selector/Selector.d.ts +12 -3
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +114 -21
- package/dist/SideNav/SideNav.d.ts +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 +4 -3
- package/dist/SideNav/SideNavHeading.d.ts +1 -1
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts +2 -2
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +6 -7
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.js +1 -1
- package/dist/Skeleton/Skeleton.d.ts +1 -1
- package/dist/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +78 -68
- package/dist/Spinner/Spinner.d.ts +1 -1
- package/dist/Spinner/Spinner.js +1 -1
- package/dist/Stack/Stack.d.ts +1 -1
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.d.ts +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/Stack/stack.stylex.d.ts +3 -3
- package/dist/StatusDot/StatusDot.d.ts +1 -20
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +2 -17
- package/dist/StatusDot/index.d.ts +21 -1
- package/dist/StatusDot/index.d.ts.map +1 -1
- package/dist/StatusDot/index.js +14 -0
- package/dist/Switch/Switch.d.ts +2 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +28 -20
- package/dist/TabList/Tab.d.ts +1 -1
- package/dist/TabList/Tab.js +1 -1
- package/dist/TabList/TabList.d.ts +1 -1
- package/dist/TabList/TabList.js +1 -1
- package/dist/TabList/TabMenu.d.ts +1 -1
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +11 -3
- package/dist/Table/BaseTable.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +4 -7
- package/dist/Table/Table.d.ts +1 -1
- package/dist/Table/Table.js +1 -1
- package/dist/Table/TableCell.d.ts +1 -1
- package/dist/Table/TableCell.js +4 -2
- package/dist/Table/TableHeaderCell.d.ts +1 -1
- package/dist/Table/TableHeaderCell.js +4 -2
- package/dist/Table/TableRow.d.ts +1 -1
- package/dist/Table/TableRow.js +1 -1
- 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.js +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +18 -3
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +27 -11
- package/dist/Table/plugins/tree/useTableTreeData.d.ts +11 -0
- package/dist/Table/plugins/tree/useTableTreeData.d.ts.map +1 -1
- package/dist/Table/plugins/tree/useTableTreeData.js +36 -2
- package/dist/Table/types.d.ts +0 -9
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Text/Text.d.ts +11 -2
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +26 -3
- package/dist/Text/index.d.ts +31 -1
- package/dist/Text/index.d.ts.map +1 -1
- package/dist/Text/index.js +23 -0
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +107 -39
- package/dist/TextInput/TextInput.d.ts +1 -1
- package/dist/TextInput/TextInput.js +1 -1
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +52 -46
- package/dist/TimeInput/TimeInput.js +1 -1
- package/dist/Timestamp/Timestamp.d.ts +26 -12
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +128 -65
- package/dist/Timestamp/TimestampHoverCard.d.ts +45 -0
- package/dist/Timestamp/TimestampHoverCard.d.ts.map +1 -0
- package/dist/Timestamp/TimestampHoverCard.js +228 -0
- package/dist/Timestamp/formatInstant.d.ts +3 -3
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +7 -2
- package/dist/Timestamp/tooltipEntries.d.ts +17 -2
- package/dist/Timestamp/tooltipEntries.d.ts.map +1 -1
- package/dist/Timestamp/tooltipEntries.js +4 -2
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +61 -9
- package/dist/ToggleButton/ToggleButton.d.ts +1 -1
- package/dist/ToggleButton/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButton.js +4 -2
- package/dist/ToggleButton/ToggleButtonGroup.d.ts +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButton/ToggleButtonGroup.js +1 -1
- package/dist/Token/Token.d.ts +6 -28
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +69 -58
- package/dist/Token/TokenLink.d.ts +62 -0
- package/dist/Token/TokenLink.d.ts.map +1 -0
- package/dist/Token/TokenLink.js +76 -0
- package/dist/Token/index.d.ts +27 -1
- package/dist/Token/index.d.ts.map +1 -1
- package/dist/Token/index.js +14 -0
- package/dist/Tokenizer/Tokenizer.d.ts +1 -1
- package/dist/Tokenizer/Tokenizer.js +1 -1
- package/dist/Toolbar/Toolbar.d.ts +1 -1
- package/dist/Toolbar/Toolbar.js +1 -1
- package/dist/Tooltip/Tooltip.d.ts +1 -1
- package/dist/Tooltip/Tooltip.js +1 -1
- package/dist/TopNav/TopNav.d.ts +1 -1
- package/dist/TopNav/TopNav.d.ts.map +1 -1
- package/dist/TopNav/TopNav.js +7 -6
- package/dist/TopNav/TopNavHeading.d.ts +2 -8
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +8 -10
- package/dist/TopNav/TopNavItem.d.ts +1 -1
- package/dist/TopNav/TopNavItem.js +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +27 -16
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +1 -1
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +5 -4
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.js +1 -1
- package/dist/TreeList/TreeListBranches.js +1 -1
- package/dist/TreeList/TreeListItem.d.ts +1 -1
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +4 -3
- package/dist/TreeList/TreeListTypes.d.ts +1 -17
- package/dist/TreeList/TreeListTypes.d.ts.map +1 -1
- package/dist/TreeList/index.d.ts +18 -1
- package/dist/TreeList/index.d.ts.map +1 -1
- package/dist/TreeList/index.js +14 -0
- package/dist/Typeahead/BaseTypeahead.d.ts +10 -1
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +3 -1
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -2
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.js +1 -1
- package/dist/VStack/VStack.d.ts +1 -1
- package/dist/VStack/VStack.js +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +1 -1
- package/dist/VisuallyHidden/VisuallyHidden.js +1 -1
- package/dist/astryx.css +116 -37
- package/dist/astryx.umd.js +50 -54
- package/dist/astryx.umd.js.map +4 -4
- package/dist/hooks/containerReveal.pool.stylex.d.ts +303 -0
- package/dist/hooks/containerReveal.pool.stylex.d.ts.map +1 -0
- package/dist/hooks/containerReveal.pool.stylex.js +292 -0
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/useContainerReveal.d.ts +83 -0
- package/dist/hooks/useContainerReveal.d.ts.map +1 -0
- package/dist/hooks/useContainerReveal.js +123 -0
- package/dist/hooks/useGridFocus.d.ts +8 -6
- package/dist/hooks/useGridFocus.d.ts.map +1 -1
- package/dist/hooks/useInputContainer.d.ts.map +1 -1
- package/dist/hooks/useInputContainer.js +29 -1
- package/dist/hooks/useInputStatusIcon.d.ts.map +1 -1
- package/dist/hooks/useInputStatusIcon.js +11 -0
- package/dist/hooks/useKeyboardHint.d.ts +2 -2
- package/dist/hooks/useKeyboardHint.d.ts.map +1 -1
- package/dist/hooks/useKeyboardHint.js +5 -3
- package/dist/hooks/useListFocus.d.ts +8 -7
- package/dist/hooks/useListFocus.d.ts.map +1 -1
- package/dist/hooks/useLongPress.d.ts.map +1 -1
- package/dist/hooks/useLongPress.js +12 -2
- package/dist/hooks/useTreeFocus.d.ts.map +1 -1
- package/dist/hooks/useTreeFocus.js +13 -2
- package/dist/i18n/InternationalizationProvider.d.ts +6 -0
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/useDirection.d.ts.map +1 -1
- package/dist/i18n/useDirection.js +6 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +2 -7
- package/dist/theme/contrast.d.ts +45 -0
- package/dist/theme/contrast.d.ts.map +1 -0
- package/dist/theme/contrast.js +88 -0
- package/dist/theme/defineTheme.d.ts +9 -3
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +6 -4
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +0 -13
- package/dist/theme/expandColorScale.d.ts +32 -3
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +102 -13
- package/dist/theme/generateThemeRules.d.ts +0 -6
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +0 -15
- package/dist/theme/index.d.ts +9 -7
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +4 -3
- package/dist/theme/themeRegistry.d.ts +32 -0
- package/dist/theme/themeRegistry.d.ts.map +1 -0
- package/dist/theme/themeRegistry.js +49 -0
- package/dist/theme/tokens.stylex.d.ts +0 -17
- package/dist/theme/tokens.stylex.d.ts.map +1 -1
- package/dist/theme/tokens.stylex.js +0 -22
- package/dist/theme/types.d.ts +10 -2
- package/dist/theme/types.d.ts.map +1 -1
- package/dist/theme/useTheme.d.ts +9 -0
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +82 -27
- package/dist/utils/rtlStyles.d.ts +23 -2
- package/dist/utils/rtlStyles.d.ts.map +1 -1
- package/dist/utils/rtlStyles.js +28 -3
- package/groups.doc.mjs +2 -2
- package/locales/en.json +124 -0
- package/locales/pseudo.json +93 -0
- package/package.json +9 -13
- package/src/AlertDialog/AlertDialog.doc.mjs +3 -3
- package/src/AlertDialog/AlertDialog.tsx +1 -1
- package/src/AlertDialog/useImperativeAlertDialog.doc.mjs +1 -1
- package/src/AppShell/AppShell.doc.mjs +3 -3
- package/src/AppShell/AppShell.test.tsx +55 -0
- package/src/AppShell/AppShell.tsx +27 -22
- package/src/AppShell/index.ts +20 -1
- package/src/AppShell/useAppShellMobile.doc.mjs +2 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
- package/src/AspectRatio/AspectRatio.tsx +1 -1
- package/src/Avatar/Avatar.doc.mjs +4 -15
- package/src/Avatar/Avatar.test.tsx +33 -8
- package/src/Avatar/Avatar.tsx +58 -25
- package/src/Avatar/AvatarStatusDot.doc.mjs +1 -1
- package/src/Avatar/AvatarStatusDot.tsx +2 -27
- package/src/Avatar/index.ts +26 -1
- package/src/AvatarGroup/AvatarGroup.doc.mjs +3 -3
- package/src/AvatarGroup/AvatarGroup.test.tsx +21 -1
- package/src/AvatarGroup/AvatarGroup.tsx +3 -7
- package/src/AvatarGroup/AvatarGroupOverflow.doc.mjs +1 -1
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +5 -3
- package/src/Badge/Badge.doc.mjs +3 -3
- package/src/Badge/Badge.tsx +2 -31
- package/src/Badge/index.ts +32 -6
- package/src/Banner/Banner.doc.mjs +3 -3
- package/src/Banner/Banner.tsx +8 -45
- package/src/Banner/index.ts +39 -7
- package/src/Blockquote/Blockquote.doc.mjs +3 -3
- package/src/Blockquote/Blockquote.tsx +1 -1
- package/src/Breadcrumbs/BreadcrumbItem.doc.mjs +1 -1
- package/src/Breadcrumbs/BreadcrumbItem.tsx +5 -3
- package/src/Breadcrumbs/Breadcrumbs.doc.mjs +3 -3
- package/src/Breadcrumbs/Breadcrumbs.test.tsx +1 -1
- package/src/Breadcrumbs/Breadcrumbs.tsx +2 -19
- package/src/Breadcrumbs/index.ts +19 -5
- package/src/Button/Button.doc.mjs +3 -3
- package/src/Button/Button.test.tsx +16 -0
- package/src/Button/Button.tsx +6 -23
- package/src/Button/index.ts +22 -7
- package/src/ButtonGroup/ButtonGroup.doc.mjs +3 -3
- package/src/ButtonGroup/ButtonGroup.tsx +1 -1
- package/src/Calendar/Calendar.doc.mjs +3 -3
- package/src/Calendar/Calendar.test.tsx +22 -6
- package/src/Calendar/Calendar.tsx +1 -1
- package/src/Calendar/index.ts +1 -6
- package/src/Calendar/styles.ts +2 -2
- package/src/Calendar/utils.ts +0 -11
- package/src/Card/Card.doc.mjs +3 -3
- package/src/Card/Card.tsx +1 -1
- package/src/Carousel/Carousel.doc.mjs +10 -3
- package/src/Carousel/Carousel.test.tsx +232 -1
- package/src/Carousel/Carousel.tsx +154 -27
- package/src/Carousel/index.ts +1 -1
- package/src/Center/Center.doc.mjs +41 -3
- package/src/Center/Center.test.tsx +75 -0
- package/src/Center/Center.tsx +38 -3
- package/src/Chat/Chat.doc.mjs +3 -3
- package/src/Chat/ChatComposer.doc.mjs +1 -1
- package/src/Chat/ChatComposer.tsx +5 -5
- package/src/Chat/ChatComposerDrawer.doc.mjs +1 -1
- package/src/Chat/ChatComposerDrawer.tsx +5 -5
- package/src/Chat/ChatComposerInput.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.tsx +1 -1
- package/src/Chat/ChatComposerTokenElement.doc.mjs +1 -1
- package/src/Chat/ChatDictationButton.doc.mjs +3 -3
- package/src/Chat/ChatDictationButton.tsx +1 -1
- package/src/Chat/ChatLayout.doc.mjs +1 -1
- package/src/Chat/ChatLayout.test.tsx +57 -0
- package/src/Chat/ChatLayout.tsx +23 -2
- package/src/Chat/ChatLayoutScrollButton.doc.mjs +1 -1
- package/src/Chat/ChatLayoutScrollButton.tsx +1 -1
- package/src/Chat/ChatMessage.doc.mjs +1 -1
- package/src/Chat/ChatMessage.tsx +1 -1
- package/src/Chat/ChatMessageBubble.doc.mjs +1 -1
- package/src/Chat/ChatMessageBubble.tsx +1 -1
- package/src/Chat/ChatMessageList.doc.mjs +1 -1
- package/src/Chat/ChatMessageList.tsx +1 -1
- package/src/Chat/ChatMessageMetadata.doc.mjs +1 -1
- package/src/Chat/ChatSendButton.doc.mjs +1 -1
- package/src/Chat/ChatSendButton.tsx +5 -3
- package/src/Chat/ChatSystemMessage.doc.mjs +1 -1
- package/src/Chat/ChatSystemMessage.tsx +1 -1
- package/src/Chat/ChatTokenizedText.doc.mjs +1 -1
- package/src/Chat/ChatTokenizedText.tsx +1 -1
- package/src/Chat/ChatToolCalls.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -3
- package/src/CheckboxInput/CheckboxInput.test.tsx +56 -0
- package/src/CheckboxInput/CheckboxInput.tsx +18 -3
- package/src/CheckboxList/CheckboxList.doc.mjs +3 -3
- package/src/CheckboxList/CheckboxList.test.tsx +94 -3
- package/src/CheckboxList/CheckboxList.tsx +1 -1
- package/src/CheckboxList/CheckboxListItem.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxListItem.tsx +18 -11
- package/src/Citation/Citation.doc.mjs +2 -2
- package/src/Citation/Citation.tsx +1 -1
- package/src/ClickableCard/ClickableCard.doc.mjs +2 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -3
- package/src/Code/Code.tsx +2 -2
- package/src/CodeBlock/Code.doc.mjs +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +3 -3
- package/src/CodeBlock/CodeBlock.test.tsx +17 -0
- package/src/CodeBlock/CodeBlock.tsx +2 -2
- package/src/Collapsible/Collapsible.doc.mjs +3 -3
- package/src/Collapsible/Collapsible.tsx +3 -3
- package/src/Collapsible/CollapsibleGroup.doc.mjs +1 -1
- package/src/Collapsible/CollapsibleGroup.tsx +1 -1
- package/src/Collapsible/CollapsibleGroupContext.tsx +1 -1
- package/src/Collapsible/useCollapsible.doc.mjs +2 -2
- package/src/CommandPalette/CommandPalette.doc.mjs +4 -4
- package/src/CommandPalette/CommandPalette.tsx +1 -1
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteEmpty.tsx +1 -1
- package/src/CommandPalette/CommandPaletteFooter.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteFooter.tsx +1 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteGroup.test.tsx +6 -2
- package/src/CommandPalette/CommandPaletteGroup.tsx +1 -1
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteInput.tsx +5 -1
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteItem.tsx +1 -1
- package/src/CommandPalette/CommandPaletteList.doc.mjs +1 -1
- package/src/CommandPalette/CommandPaletteList.tsx +1 -1
- package/src/ComplexSelector/ComplexSelector.doc.mjs +220 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +156 -0
- package/src/ComplexSelector/ComplexSelector.tsx +429 -0
- package/src/ComplexSelector/index.ts +17 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +3 -3
- package/src/ContextMenu/ContextMenu.test.tsx +17 -2
- package/src/ContextMenu/ContextMenu.tsx +27 -6
- package/src/ContextMenu/ContextMenuItem.doc.mjs +1 -1
- package/src/DateInput/DateInput.doc.mjs +17 -3
- package/src/DateInput/DateInput.test.tsx +62 -3
- package/src/DateInput/DateInput.tsx +18 -2
- package/src/DateRangeInput/DateRangeInput.doc.mjs +10 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +73 -2
- package/src/DateRangeInput/DateRangeInput.tsx +18 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +17 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +62 -2
- package/src/DateTimeInput/DateTimeInput.tsx +18 -2
- package/src/Dialog/Dialog.doc.mjs +7 -5
- package/src/Dialog/Dialog.test.tsx +46 -3
- package/src/Dialog/Dialog.tsx +61 -44
- package/src/Dialog/DialogHeader.doc.mjs +1 -1
- package/src/Dialog/DialogHeader.tsx +1 -1
- package/src/Dialog/index.ts +18 -1
- package/src/Dialog/useImperativeDialog.doc.mjs +1 -1
- package/src/Divider/Divider.doc.mjs +3 -3
- package/src/Divider/Divider.tsx +2 -19
- package/src/Divider/index.ts +19 -5
- package/src/DropdownMenu/DropdownMenu.doc.mjs +20 -5
- package/src/DropdownMenu/DropdownMenu.test.tsx +122 -0
- package/src/DropdownMenu/DropdownMenu.tsx +31 -20
- package/src/DropdownMenu/DropdownMenuCheckboxItem.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuCheckboxItem.tsx +41 -64
- package/src/DropdownMenu/DropdownMenuItem.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuItem.tsx +1 -1
- package/src/DropdownMenu/DropdownMenuRadioGroup.doc.mjs +5 -13
- package/src/DropdownMenu/DropdownMenuRadioGroup.tsx +9 -10
- package/src/DropdownMenu/DropdownMenuRadioItem.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuRadioItem.tsx +11 -2
- package/src/DropdownMenu/DropdownMenuSelectable.test.tsx +84 -2
- package/src/DropdownMenu/DropdownMenuSubMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +46 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +24 -8
- package/src/DropdownMenu/menuItemHover.ts +1 -0
- package/src/DropdownMenu/renderDropdownItems.tsx +14 -2
- package/src/EmptyState/EmptyState.doc.mjs +3 -3
- package/src/EmptyState/EmptyState.tsx +1 -1
- package/src/Field/Field.doc.mjs +7 -3
- package/src/Field/Field.tsx +1 -1
- package/src/Field/FieldLabel.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +103 -0
- package/src/Field/FieldLabel.tsx +61 -5
- package/src/FieldStatus/FieldStatus.doc.mjs +3 -2
- package/src/FieldStatus/FieldStatus.test.tsx +61 -0
- package/src/FieldStatus/FieldStatus.tsx +16 -23
- package/src/FieldStatus/index.ts +20 -5
- package/src/FileInput/FileInput.doc.mjs +3 -3
- package/src/FileInput/FileInput.tsx +1 -1
- package/src/FormLayout/FormLayout.doc.mjs +3 -3
- package/src/FormLayout/FormLayout.tsx +2 -5
- package/src/Grid/Grid.doc.mjs +3 -8
- package/src/Grid/Grid.tsx +1 -25
- package/src/Grid/GridSpan.doc.mjs +1 -1
- package/src/Grid/GridSpan.tsx +1 -1
- package/src/HStack/HStack.tsx +1 -1
- package/src/Heading/Heading.tsx +4 -3
- package/src/HoverCard/HoverCard.doc.mjs +3 -3
- package/src/HoverCard/HoverCard.tsx +1 -1
- package/src/HoverCard/useHoverCard.doc.mjs +2 -2
- package/src/Icon/Icon.doc.mjs +7 -6
- package/src/Icon/Icon.test.tsx +23 -0
- package/src/Icon/Icon.tsx +4 -2
- package/src/Icon/defaultIcons.tsx +14 -0
- package/src/Icon/globalIconRegistry.test.tsx +87 -1
- package/src/Icon/globalIconRegistry.tsx +111 -9
- package/src/Icon/index.ts +9 -7
- package/src/Icon/useIcon.ts +23 -0
- package/src/IconButton/IconButton.doc.mjs +2 -2
- package/src/IconButton/IconButton.tsx +1 -1
- package/src/InputGroup/InputGroup.doc.mjs +2 -2
- package/src/InputGroup/InputGroup.tsx +1 -1
- package/src/InputGroup/InputGroupText.doc.mjs +1 -1
- package/src/InputGroup/InputGroupText.tsx +1 -1
- package/src/Item/Item.doc.mjs +8 -3
- package/src/Item/Item.test.tsx +88 -0
- package/src/Item/Item.tsx +58 -12
- package/src/Kbd/Kbd.doc.mjs +3 -3
- package/src/Kbd/Kbd.tsx +1 -1
- package/src/Layer/Layer.doc.mjs +2 -2
- package/src/Layer/useLayer.doc.mjs +2 -2
- package/src/Layout/Layout.doc.mjs +3 -3
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.doc.mjs +1 -1
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.doc.mjs +1 -1
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.doc.mjs +1 -1
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.doc.mjs +1 -1
- package/src/Layout/LayoutPanel.tsx +1 -1
- package/src/Lightbox/Lightbox.doc.mjs +6 -6
- package/src/Lightbox/Lightbox.test.tsx +211 -0
- package/src/Lightbox/Lightbox.tsx +152 -60
- package/src/Link/Link.doc.mjs +3 -3
- package/src/Link/Link.tsx +1 -1
- package/src/Link/LinkProvider.doc.mjs +2 -2
- package/src/Link/LinkProvider.tsx +2 -2
- package/src/List/List.doc.mjs +3 -3
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.doc.mjs +13 -1
- package/src/List/ListItem.tsx +14 -1
- package/src/Markdown/Markdown.doc.mjs +81 -1
- package/src/Markdown/Markdown.test.tsx +92 -0
- package/src/Markdown/Markdown.tsx +96 -68
- package/src/Markdown/parser.perf.test.ts +47 -35
- package/src/MetadataList/MetadataList.doc.mjs +3 -3
- package/src/MetadataList/MetadataList.test.tsx +82 -0
- package/src/MetadataList/MetadataList.tsx +45 -20
- package/src/MetadataList/MetadataListItem.doc.mjs +1 -1
- package/src/MetadataList/MetadataListItem.tsx +1 -1
- package/src/MobileNav/MobileNav.doc.mjs +3 -3
- package/src/MobileNav/MobileNav.tsx +4 -4
- package/src/MoreMenu/MoreMenu.doc.mjs +3 -3
- package/src/MoreMenu/MoreMenu.tsx +3 -3
- package/src/MultiSelector/MultiSelector.doc.mjs +35 -10
- package/src/MultiSelector/MultiSelector.test.tsx +303 -3
- package/src/MultiSelector/MultiSelector.tsx +223 -58
- package/src/NavIcon/NavIcon.doc.mjs +3 -3
- package/src/NavIcon/NavIcon.tsx +1 -1
- package/src/NavMenu/NavHeadingMenu.test.tsx +0 -16
- package/src/NavMenu/NavMenu.doc.mjs +2 -2
- package/src/NavMenu/index.ts +0 -4
- package/src/NumberInput/NumberInput.doc.mjs +3 -6
- package/src/NumberInput/NumberInput.test.tsx +38 -3
- package/src/NumberInput/NumberInput.tsx +24 -1
- package/src/Outline/Outline.doc.mjs +3 -3
- package/src/Outline/Outline.tsx +1 -1
- package/src/OverflowList/OverflowList.doc.mjs +3 -3
- package/src/OverflowList/OverflowList.tsx +1 -1
- package/src/Overlay/Overlay.doc.mjs +2 -2
- package/src/Pagination/Pagination.doc.mjs +55 -8
- package/src/Pagination/Pagination.test.tsx +582 -0
- package/src/Pagination/Pagination.tsx +247 -55
- package/src/Pagination/index.ts +22 -1
- package/src/Popover/Popover.doc.mjs +31 -3
- package/src/Popover/Popover.test.tsx +41 -0
- package/src/Popover/Popover.tsx +25 -2
- package/src/Popover/usePopover.doc.mjs +2 -2
- package/src/Popover/usePopover.tsx +10 -4
- package/src/PowerSearch/PowerSearch.doc.mjs +3 -3
- package/src/PowerSearch/PowerSearch.tsx +1 -1
- package/src/ProgressBar/ProgressBar.doc.mjs +24 -3
- package/src/ProgressBar/ProgressBar.test.tsx +523 -2
- package/src/ProgressBar/ProgressBar.tsx +250 -25
- package/src/ProgressBar/ProgressBarMarkTooltip.tsx +43 -0
- package/src/ProgressBar/index.ts +22 -1
- package/src/RadioList/RadioList.doc.mjs +3 -3
- package/src/RadioList/RadioList.test.tsx +26 -4
- package/src/RadioList/RadioList.tsx +1 -1
- package/src/RadioList/RadioListItem.doc.mjs +1 -1
- package/src/RadioList/RadioListItem.tsx +9 -2
- package/src/Resizable/Resizable.doc.mjs +2 -2
- package/src/Resizable/ResizeHandle.test.tsx +52 -3
- package/src/Resizable/ResizeHandle.tsx +25 -13
- package/src/Resizable/useResizable.doc.mjs +2 -2
- package/src/Section/Section.doc.mjs +3 -3
- package/src/Section/Section.tsx +2 -20
- package/src/Section/index.ts +20 -5
- package/src/SegmentedControl/SegmentedControl.doc.mjs +3 -3
- package/src/SegmentedControl/SegmentedControl.test.tsx +28 -0
- package/src/SegmentedControl/SegmentedControl.tsx +1 -1
- package/src/SegmentedControl/SegmentedControlItem.doc.mjs +1 -1
- package/src/SegmentedControl/SegmentedControlItem.tsx +21 -3
- package/src/SelectableCard/SelectableCard.doc.mjs +4 -2
- package/src/SelectableCard/SelectableCard.test.tsx +55 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -3
- package/src/Selector/Selector.doc.mjs +29 -8
- package/src/Selector/Selector.test.tsx +299 -3
- package/src/Selector/Selector.tsx +213 -53
- package/src/Selector/SelectorOption.doc.mjs +1 -1
- package/src/SideNav/SideNav.doc.mjs +3 -3
- package/src/SideNav/SideNav.tsx +1 -1
- package/src/SideNav/SideNavCollapseButton.doc.mjs +1 -1
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavHeading.doc.mjs +1 -1
- package/src/SideNav/SideNavHeading.tsx +8 -9
- package/src/SideNav/SideNavItem.doc.mjs +1 -1
- package/src/SideNav/SideNavItem.tsx +5 -6
- package/src/SideNav/SideNavSection.doc.mjs +1 -1
- package/src/SideNav/SideNavSection.tsx +1 -1
- package/src/Skeleton/Skeleton.doc.mjs +3 -3
- package/src/Skeleton/Skeleton.test.tsx +16 -0
- package/src/Skeleton/Skeleton.tsx +14 -2
- package/src/Slider/Slider.doc.mjs +3 -3
- package/src/Slider/Slider.tsx +9 -13
- package/src/Spinner/Spinner.doc.mjs +3 -3
- package/src/Spinner/Spinner.tsx +1 -1
- package/src/Stack/Stack.doc.mjs +113 -3
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/StatusDot/StatusDot.doc.mjs +15 -6
- package/src/StatusDot/StatusDot.tsx +2 -22
- package/src/StatusDot/index.ts +22 -5
- package/src/Switch/Switch.doc.mjs +5 -5
- package/src/Switch/Switch.test.tsx +71 -25
- package/src/Switch/Switch.tsx +63 -26
- package/src/TabList/Tab.doc.mjs +1 -1
- package/src/TabList/Tab.tsx +1 -1
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +21 -18
- package/src/TabList/TabList.tsx +1 -1
- package/src/TabList/TabMenu.doc.mjs +1 -1
- package/src/TabList/TabMenu.tsx +11 -3
- package/src/Table/BaseTable.tsx +4 -5
- package/src/Table/Table.doc.mjs +5 -5
- package/src/Table/Table.test.tsx +27 -49
- package/src/Table/Table.tsx +1 -1
- package/src/Table/TableCell.doc.mjs +1 -1
- package/src/Table/TableCell.tsx +2 -2
- package/src/Table/TableHeaderCell.doc.mjs +1 -1
- package/src/Table/TableHeaderCell.tsx +2 -2
- package/src/Table/TableRow.doc.mjs +1 -1
- package/src/Table/TableRow.tsx +1 -1
- package/src/Table/index.ts +1 -1
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +1 -1
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +19 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +30 -11
- package/src/Table/plugins/tree/useTableTreeData.test.tsx +161 -2
- package/src/Table/plugins/tree/useTableTreeData.tsx +54 -1
- package/src/Table/types.ts +0 -9
- package/src/Table/useTableColumnResize.doc.mjs +1 -1
- package/src/Table/useTableColumnSettings.doc.mjs +1 -1
- package/src/Table/useTableFilterState.doc.mjs +1 -1
- package/src/Table/useTableFiltering.doc.mjs +1 -1
- package/src/Table/useTableGroupedRows.doc.mjs +2 -2
- package/src/Table/useTablePagination.doc.mjs +1 -1
- package/src/Table/useTableRowExpansion.doc.mjs +57 -4
- package/src/Table/useTableRowIndex.doc.mjs +2 -2
- package/src/Table/useTableRowStatus.doc.mjs +3 -3
- package/src/Table/useTableSelection.doc.mjs +1 -1
- package/src/Table/useTableSelectionState.doc.mjs +1 -1
- package/src/Table/useTableSortable.doc.mjs +1 -1
- package/src/Table/useTableStickyColumns.doc.mjs +1 -1
- package/src/Table/useTableTreeData.doc.mjs +10 -1
- package/src/Table/useTableTreeState.doc.mjs +1 -1
- package/src/Text/Heading.doc.mjs +4 -4
- package/src/Text/Text.doc.mjs +4 -4
- package/src/Text/Text.test.tsx +42 -0
- package/src/Text/Text.tsx +26 -2
- package/src/Text/index.ts +32 -6
- package/src/TextArea/TextArea.doc.mjs +5 -5
- package/src/TextArea/TextArea.test.tsx +112 -7
- package/src/TextArea/TextArea.tsx +143 -50
- package/src/TextInput/TextInput.doc.mjs +3 -3
- package/src/TextInput/TextInput.tsx +1 -1
- package/src/Thumbnail/Thumbnail.doc.mjs +2 -2
- package/src/Thumbnail/Thumbnail.test.tsx +24 -1
- package/src/Thumbnail/Thumbnail.tsx +28 -35
- package/src/TimeInput/TimeInput.doc.mjs +3 -3
- package/src/TimeInput/TimeInput.tsx +1 -1
- package/src/Timestamp/Timestamp.doc.mjs +30 -24
- package/src/Timestamp/Timestamp.test.tsx +438 -107
- package/src/Timestamp/Timestamp.tsx +167 -103
- package/src/Timestamp/TimestampHoverCard.tsx +283 -0
- package/src/Timestamp/formatInstant.ts +9 -4
- package/src/Timestamp/tooltipEntries.test.ts +9 -0
- package/src/Timestamp/tooltipEntries.ts +18 -2
- package/src/Toast/Toast.doc.mjs +3 -3
- package/src/Toast/ToastViewport.test.tsx +218 -8
- package/src/Toast/ToastViewport.tsx +71 -12
- package/src/Toast/useToast.doc.mjs +2 -2
- package/src/ToggleButton/ToggleButton.doc.mjs +3 -3
- package/src/ToggleButton/ToggleButton.test.tsx +24 -0
- package/src/ToggleButton/ToggleButton.tsx +20 -2
- package/src/ToggleButton/ToggleButtonGroup.doc.mjs +1 -1
- package/src/ToggleButton/ToggleButtonGroup.tsx +3 -6
- package/src/Token/Token.doc.mjs +3 -3
- package/src/Token/Token.test.tsx +145 -0
- package/src/Token/Token.tsx +75 -61
- package/src/Token/TokenLink.tsx +107 -0
- package/src/Token/index.ts +28 -1
- package/src/Tokenizer/Tokenizer.doc.mjs +3 -3
- package/src/Tokenizer/Tokenizer.tsx +1 -1
- package/src/Toolbar/Toolbar.doc.mjs +3 -3
- package/src/Toolbar/Toolbar.tsx +1 -1
- package/src/Tooltip/Tooltip.doc.mjs +3 -3
- package/src/Tooltip/Tooltip.tsx +1 -1
- package/src/Tooltip/useTooltip.doc.mjs +2 -2
- package/src/TopNav/TopNav.doc.mjs +3 -3
- package/src/TopNav/TopNav.test.tsx +2 -2
- package/src/TopNav/TopNav.tsx +2 -4
- package/src/TopNav/TopNavHeading.doc.mjs +1 -12
- package/src/TopNav/TopNavHeading.tsx +8 -18
- package/src/TopNav/TopNavItem.doc.mjs +1 -1
- package/src/TopNav/TopNavItem.tsx +1 -1
- package/src/TopNav/TopNavMegaMenu.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenu.tsx +35 -11
- package/src/TopNav/TopNavMegaMenuFeaturedCard.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +1 -1
- package/src/TopNav/TopNavMegaMenuItem.doc.mjs +1 -1
- package/src/TopNav/TopNavMegaMenuItem.tsx +1 -1
- package/src/TopNav/TopNavMenu.doc.mjs +1 -1
- package/src/TopNav/TopNavMenu.tsx +5 -4
- package/src/TreeList/TreeList.doc.mjs +3 -3
- package/src/TreeList/TreeList.test.tsx +10 -6
- package/src/TreeList/TreeList.tsx +1 -1
- package/src/TreeList/TreeListBranches.tsx +1 -1
- package/src/TreeList/TreeListItem.tsx +4 -3
- package/src/TreeList/TreeListTypes.ts +1 -18
- package/src/TreeList/index.ts +19 -1
- package/src/Typeahead/BaseTypeahead.doc.mjs +1 -1
- package/src/Typeahead/BaseTypeahead.tsx +13 -1
- package/src/Typeahead/Typeahead.doc.mjs +3 -3
- package/src/Typeahead/Typeahead.test.tsx +62 -0
- package/src/Typeahead/Typeahead.tsx +7 -1
- package/src/Typeahead/TypeaheadItem.doc.mjs +1 -1
- package/src/Typeahead/TypeaheadItem.tsx +1 -1
- package/src/VStack/VStack.tsx +1 -1
- package/src/VisuallyHidden/VisuallyHidden.doc.mjs +3 -3
- package/src/VisuallyHidden/VisuallyHidden.tsx +1 -1
- package/src/__tests__/babelPluginAddExtensions.test.ts +190 -0
- package/src/__tests__/forcedColors.ts +60 -0
- package/src/__tests__/inputWidthContract.test.tsx +8 -1
- package/src/doc-mjs.d.ts +5 -2
- package/src/docPropLiterals.test.ts +1 -1
- package/src/docPropReferences.test.ts +1 -1
- package/src/hooks/containerReveal.pool.stylex.ts +571 -0
- package/src/hooks/index.ts +7 -0
- package/src/hooks/useClickableContainer.doc.mjs +2 -2
- package/src/hooks/useContainerReveal.doc.mjs +75 -0
- package/src/hooks/useContainerReveal.test.tsx +116 -0
- package/src/hooks/useContainerReveal.ts +181 -0
- package/src/hooks/useEntryAnimation.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.doc.mjs +2 -2
- package/src/hooks/useGridFocus.doc.mjs +2 -2
- package/src/hooks/useGridFocus.ts +8 -6
- package/src/hooks/useHotkeys.doc.mjs +2 -2
- package/src/hooks/useImageMode.doc.mjs +2 -2
- package/src/hooks/useImageMode.test.ts +1 -1
- package/src/hooks/useInputContainer.doc.mjs +2 -2
- package/src/hooks/useInputContainer.test.tsx +180 -0
- package/src/hooks/useInputContainer.ts +36 -1
- package/src/hooks/useInputStatusIcon.test.tsx +59 -0
- package/src/hooks/useInputStatusIcon.tsx +12 -1
- package/src/hooks/useKeyboardHint.doc.mjs +2 -2
- package/src/hooks/useKeyboardHint.test.tsx +22 -0
- package/src/hooks/useKeyboardHint.tsx +7 -3
- package/src/hooks/useListFocus.doc.mjs +2 -2
- package/src/hooks/useListFocus.ts +8 -7
- package/src/hooks/useLongPress.test.tsx +18 -0
- package/src/hooks/useLongPress.ts +12 -2
- package/src/hooks/useMediaQuery.doc.mjs +2 -2
- package/src/hooks/useOverflow.doc.mjs +2 -2
- package/src/hooks/useScrollLock.doc.mjs +2 -2
- package/src/hooks/useScrollOverflow.doc.mjs +2 -2
- package/src/hooks/useStreamingText.doc.mjs +2 -2
- package/src/hooks/useTreeFocus.doc.mjs +2 -2
- package/src/hooks/useTreeFocus.test.tsx +53 -1
- package/src/hooks/useTreeFocus.ts +13 -2
- package/src/i18n/InternationalizationProvider.doc.mjs +14 -2
- package/src/i18n/InternationalizationProvider.tsx +6 -0
- package/src/i18n/useDirection.ts +6 -3
- package/src/i18n/useTranslator.doc.mjs +2 -2
- package/src/index.ts +2 -18
- package/src/theme/MediaTheme.doc.mjs +2 -2
- package/src/theme/SyntaxTheme.doc.mjs +2 -2
- package/src/theme/Theme.doc.mjs +2 -2
- package/src/theme/Theme.tsx +3 -7
- package/src/theme/contrast.test.ts +94 -0
- package/src/theme/contrast.ts +99 -0
- package/src/theme/defineTheme.test.ts +29 -30
- package/src/theme/defineTheme.ts +11 -5
- package/src/theme/derivedVarRegistry.test.ts +0 -1
- package/src/theme/derivedVarRegistry.ts +0 -6
- package/src/theme/expandColorScale.test.ts +401 -1
- package/src/theme/expandColorScale.ts +143 -19
- package/src/theme/generateThemeRules.test.ts +20 -20
- package/src/theme/generateThemeRules.ts +0 -15
- package/src/theme/index.ts +11 -13
- package/src/theme/themeRegistry.test.ts +59 -0
- package/src/theme/themeRegistry.ts +53 -0
- package/src/theme/tokens.stylex.ts +0 -19
- package/src/theme/types.ts +14 -13
- package/src/theme/useTheme.doc.mjs +2 -2
- package/src/theme/useTheme.test.tsx +48 -3
- package/src/theme/useTheme.ts +100 -29
- package/src/utils/rtlStyles.ts +24 -2
- package/dist/NavMenu/NavMenuItem.d.ts +0 -13
- package/dist/NavMenu/NavMenuItem.d.ts.map +0 -1
- package/dist/NavMenu/NavMenuItem.js +0 -16
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts +0 -9
- package/dist/Thumbnail/thumbnail.markers.stylex.d.ts.map +0 -1
- package/dist/Thumbnail/thumbnail.markers.stylex.js +0 -14
- package/dist/authoring/doc.d.ts +0 -145
- package/dist/authoring/doc.d.ts.map +0 -1
- package/dist/authoring/doc.js +0 -100
- package/dist/authoring/index.d.ts +0 -29
- package/dist/authoring/index.d.ts.map +0 -1
- package/dist/authoring/index.js +0 -28
- package/dist/authoring/integration.d.ts +0 -35
- package/dist/authoring/integration.d.ts.map +0 -1
- package/dist/authoring/integration.js +0 -30
- package/dist/authoring/template.d.ts +0 -66
- package/dist/authoring/template.d.ts.map +0 -1
- package/dist/authoring/template.js +0 -55
- package/dist/config.d.ts +0 -80
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -40
- package/dist/docs-types.d.ts +0 -969
- package/dist/docs-types.d.ts.map +0 -1
- package/dist/docs-types.js +0 -1
- package/src/NavMenu/NavMenuItem.tsx +0 -19
- package/src/Thumbnail/thumbnail.markers.stylex.ts +0 -12
- package/src/authoring/doc.ts +0 -164
- package/src/authoring/index.test.ts +0 -52
- package/src/authoring/index.ts +0 -50
- package/src/authoring/integration.ts +0 -42
- package/src/authoring/template.ts +0 -74
- package/src/config.test.ts +0 -16
- package/src/config.ts +0 -92
- package/src/docs-types.ts +0 -1108
|
@@ -1,9 +1,25 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
3
|
import {describe, it, expect} from 'vitest';
|
|
4
|
-
import {expandColorScale} from './expandColorScale';
|
|
4
|
+
import {expandColorScale, ensureContrastTone} from './expandColorScale';
|
|
5
|
+
import {contrastRatio, compositeOver} from './contrast';
|
|
6
|
+
import {hexToHct, tonalPalette} from './hct';
|
|
5
7
|
import {defineTheme} from './defineTheme';
|
|
6
8
|
import {generateThemeRules} from './generateThemeRules';
|
|
9
|
+
import {resolveThemeTokens} from './tokens';
|
|
10
|
+
import {colorDefaults} from './tokens.stylex';
|
|
11
|
+
import {parseColor, formatColor} from '../utils/color';
|
|
12
|
+
|
|
13
|
+
/** Light-mode half of colorDefaults['--color-accent'] — the hue an accent-less config seeds from. */
|
|
14
|
+
const DEFAULT_ACCENT = '#0064E0';
|
|
15
|
+
const DEFAULT_ACCENT_DARK = '#2694FE';
|
|
16
|
+
|
|
17
|
+
/** The three tokens that only exist when a seed accent is supplied. */
|
|
18
|
+
const ACCENT_TOKENS = [
|
|
19
|
+
'--color-accent',
|
|
20
|
+
'--color-accent-muted',
|
|
21
|
+
'--color-on-accent',
|
|
22
|
+
] as const;
|
|
7
23
|
|
|
8
24
|
describe('expandColorScale', () => {
|
|
9
25
|
it('produces all expected token keys', () => {
|
|
@@ -84,6 +100,96 @@ describe('expandColorScale', () => {
|
|
|
84
100
|
standard['--color-text-primary'],
|
|
85
101
|
);
|
|
86
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
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe('expandColorScale — neutral-only themes (#2279)', () => {
|
|
120
|
+
it('accent is optional — a config without one expands', () => {
|
|
121
|
+
const tokens = expandColorScale({neutralStyle: 'warm'});
|
|
122
|
+
expect(tokens['--color-background-surface']).toMatch(/^light-dark\(#/);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('expands an empty config', () => {
|
|
126
|
+
const tokens = expandColorScale({});
|
|
127
|
+
expect(tokens['--color-background-surface']).toMatch(/^light-dark\(#/);
|
|
128
|
+
expect(tokens).not.toHaveProperty('--color-accent');
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it('omits the accent tokens so they fall through to colorDefaults', () => {
|
|
132
|
+
const tokens = expandColorScale({neutralStyle: 'warm'});
|
|
133
|
+
for (const key of ACCENT_TOKENS) {
|
|
134
|
+
expect(tokens).not.toHaveProperty(key);
|
|
135
|
+
}
|
|
136
|
+
// ...and the reference tokens still point at whatever --color-accent resolves to.
|
|
137
|
+
expect(tokens['--color-text-accent']).toBe('var(--color-accent)');
|
|
138
|
+
expect(tokens['--color-icon-accent']).toBe('var(--color-accent)');
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('seeds the neutral palettes from the light half of the default accent', () => {
|
|
142
|
+
// Drift guard: the module's DEFAULT_ACCENT_SEED is private, so pin the
|
|
143
|
+
// colorDefaults value it is copied from. Re-coloring the default accent
|
|
144
|
+
// without re-seeding would silently change every neutral-only theme.
|
|
145
|
+
expect(colorDefaults['--color-accent']).toBe(
|
|
146
|
+
`light-dark(${DEFAULT_ACCENT}, ${DEFAULT_ACCENT_DARK})`,
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const neutralOnly = expandColorScale({neutralStyle: 'warm'});
|
|
150
|
+
const seeded = expandColorScale({
|
|
151
|
+
accent: DEFAULT_ACCENT,
|
|
152
|
+
neutralStyle: 'warm',
|
|
153
|
+
});
|
|
154
|
+
for (const [key, value] of Object.entries(seeded)) {
|
|
155
|
+
if ((ACCENT_TOKENS as ReadonlyArray<string>).includes(key)) {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
expect(neutralOnly[key], key).toBe(value);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('honours neutralStyle and contrast without an accent', () => {
|
|
163
|
+
const warm = expandColorScale({neutralStyle: 'warm'});
|
|
164
|
+
const cool = expandColorScale({neutralStyle: 'cool'});
|
|
165
|
+
expect(warm['--color-neutral']).not.toBe(cool['--color-neutral']);
|
|
166
|
+
|
|
167
|
+
const high = expandColorScale({contrast: 'high'});
|
|
168
|
+
const standard = expandColorScale({contrast: 'standard'});
|
|
169
|
+
expect(high['--color-text-primary']).not.toBe(
|
|
170
|
+
standard['--color-text-primary'],
|
|
171
|
+
);
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('does not re-color themes that do pass an accent', () => {
|
|
175
|
+
// Seeding from the default hex derives a DIFFERENT accent than the default
|
|
176
|
+
// token holds, so "just default the seed" is not behavior-preserving —
|
|
177
|
+
// omitting the tokens is the only way a neutral-only theme keeps the
|
|
178
|
+
// default accent.
|
|
179
|
+
const tokens = expandColorScale({accent: DEFAULT_ACCENT});
|
|
180
|
+
expect(tokens['--color-accent']).toMatch(/^light-dark\(#/);
|
|
181
|
+
expect(tokens['--color-accent']).not.toBe(colorDefaults['--color-accent']);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('treats an empty accent as supplied, not absent', () => {
|
|
185
|
+
// '' is falsy but not nullish. Only an absent accent is neutral-only; a
|
|
186
|
+
// supplied-but-malformed one keeps its pre-#2279 behavior (the hex parser
|
|
187
|
+
// falls back to black) rather than silently dropping the accent tokens.
|
|
188
|
+
const tokens = expandColorScale({accent: ''});
|
|
189
|
+
for (const key of ACCENT_TOKENS) {
|
|
190
|
+
expect(tokens).toHaveProperty(key);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
87
193
|
});
|
|
88
194
|
|
|
89
195
|
describe('expandColorScale + defineTheme integration', () => {
|
|
@@ -110,4 +216,298 @@ describe('expandColorScale + defineTheme integration', () => {
|
|
|
110
216
|
// The base token itself stays a resolved color pair.
|
|
111
217
|
expect(css).toMatch(/--color-accent: light-dark\(#/);
|
|
112
218
|
});
|
|
219
|
+
|
|
220
|
+
it('a neutral-only theme leaves the accent tokens at their defaults (#2279)', () => {
|
|
221
|
+
const theme = defineTheme({
|
|
222
|
+
name: 'test-neutral-only',
|
|
223
|
+
color: {neutralStyle: 'warm'},
|
|
224
|
+
});
|
|
225
|
+
for (const key of ACCENT_TOKENS) {
|
|
226
|
+
expect(theme.tokens).not.toHaveProperty(key);
|
|
227
|
+
}
|
|
228
|
+
// Neutrals are still themed.
|
|
229
|
+
expect(theme.tokens['--color-background-surface']).toMatch(
|
|
230
|
+
/^light-dark\(#/,
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
const css = generateThemeRules(theme).join('\n');
|
|
234
|
+
expect(css).not.toContain('--color-accent:');
|
|
235
|
+
expect(css).not.toContain('--color-on-accent:');
|
|
236
|
+
expect(css).toContain('--color-background-surface:');
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('a neutral-only theme resolves accent tokens to the defaults at runtime (#2279)', () => {
|
|
240
|
+
// The CSS side falls through by simply not emitting the tokens. The JS side
|
|
241
|
+
// (useTheme/resolveThemeTokens) has to agree: the omitted tokens come back
|
|
242
|
+
// from tokenDefaults, and the var() references the theme DOES emit resolve
|
|
243
|
+
// against them instead of leaking a literal 'var(--color-accent)'.
|
|
244
|
+
const theme = defineTheme({
|
|
245
|
+
name: 'test-neutral-only-runtime',
|
|
246
|
+
color: {neutralStyle: 'warm'},
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
const light = resolveThemeTokens(theme, {mode: 'light'});
|
|
250
|
+
expect(light['--color-accent']).toBe(DEFAULT_ACCENT);
|
|
251
|
+
expect(light['--color-text-accent']).toBe(DEFAULT_ACCENT);
|
|
252
|
+
expect(light['--color-icon-accent']).toBe(DEFAULT_ACCENT);
|
|
253
|
+
|
|
254
|
+
const dark = resolveThemeTokens(theme, {mode: 'dark'});
|
|
255
|
+
expect(dark['--color-accent']).toBe(DEFAULT_ACCENT_DARK);
|
|
256
|
+
expect(dark['--color-text-accent']).toBe(DEFAULT_ACCENT_DARK);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
it('an explicit accent token still wins on a neutral-only theme (#2279)', () => {
|
|
260
|
+
// Neutral scale from HCT + a hand-picked accent: the tokens map is the only
|
|
261
|
+
// source of --color-accent, so the reference tokens follow it.
|
|
262
|
+
const theme = defineTheme({
|
|
263
|
+
name: 'test-neutral-only-explicit-accent',
|
|
264
|
+
color: {neutralStyle: 'warm'},
|
|
265
|
+
tokens: {'--color-accent': ['#AA0000', '#FF5555']},
|
|
266
|
+
});
|
|
267
|
+
expect(
|
|
268
|
+
resolveThemeTokens(theme, {mode: 'light'})['--color-text-accent'],
|
|
269
|
+
).toBe('#AA0000');
|
|
270
|
+
|
|
271
|
+
const css = generateThemeRules(theme).join('\n');
|
|
272
|
+
expect(css).toContain('--color-text-accent: var(--color-accent);');
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// =============================================================================
|
|
277
|
+
// WCAG contrast guarantees (WCAG 1.4.3 text >= 4.5:1, 1.4.11 non-text >= 3:1)
|
|
278
|
+
// =============================================================================
|
|
279
|
+
|
|
280
|
+
/** Split a light-dark(a, b) token into its [light, dark] halves. */
|
|
281
|
+
function splitLightDark(value: string): [light: string, dark: string] {
|
|
282
|
+
const match = value.match(/^light-dark\((.+?),\s*(.+)\)$/);
|
|
283
|
+
if (!match) {
|
|
284
|
+
// Single-value tokens apply to both modes.
|
|
285
|
+
return [value, value];
|
|
286
|
+
}
|
|
287
|
+
return [match[1], match[2]];
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
type Mode = 0 | 1; // 0 = light, 1 = dark
|
|
291
|
+
|
|
292
|
+
/** Resolve one mode of a token to a concrete color string. */
|
|
293
|
+
function resolveToken(
|
|
294
|
+
tokens: Record<string, string>,
|
|
295
|
+
name: string,
|
|
296
|
+
mode: Mode,
|
|
297
|
+
): string {
|
|
298
|
+
return splitLightDark(tokens[name])[mode];
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/** Resolve one mode of an alpha token, composited over its backdrop. */
|
|
302
|
+
function resolveComposited(
|
|
303
|
+
tokens: Record<string, string>,
|
|
304
|
+
name: string,
|
|
305
|
+
backdrop: string,
|
|
306
|
+
mode: Mode,
|
|
307
|
+
): string {
|
|
308
|
+
const fg = parseColor(resolveToken(tokens, name, mode));
|
|
309
|
+
const bg = parseColor(backdrop);
|
|
310
|
+
if (fg === null || bg === null) {
|
|
311
|
+
throw new Error(`could not parse ${name} or its backdrop`);
|
|
312
|
+
}
|
|
313
|
+
return formatColor(compositeOver(fg, bg));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
describe('expandColorScale WCAG contrast guarantees', () => {
|
|
317
|
+
// Representative configs: the docs' default accent, both contrast levels,
|
|
318
|
+
// every neutralStyle, saturated custom brand accents across the hue wheel,
|
|
319
|
+
// a low-chroma (gray) seed, and degenerate black/white seeds.
|
|
320
|
+
const configs = [
|
|
321
|
+
{accent: '#0064E0'},
|
|
322
|
+
{accent: '#0064E0', contrast: 'high'},
|
|
323
|
+
{accent: '#DC2626', neutralStyle: 'warm'},
|
|
324
|
+
{accent: '#B7410E', neutralStyle: 'warm', contrast: 'high'},
|
|
325
|
+
{accent: '#12B76A', neutralStyle: 'neutral'},
|
|
326
|
+
{accent: '#D9006E', neutralStyle: 'warm'},
|
|
327
|
+
{accent: '#657100', neutralStyle: 'cool'},
|
|
328
|
+
{accent: '#6B7280'},
|
|
329
|
+
{accent: '#000000'},
|
|
330
|
+
{accent: '#FFFFFF', neutralStyle: 'neutral', contrast: 'high'},
|
|
331
|
+
] as const;
|
|
332
|
+
|
|
333
|
+
const modes: [label: string, mode: Mode][] = [
|
|
334
|
+
['light', 0],
|
|
335
|
+
['dark', 1],
|
|
336
|
+
];
|
|
337
|
+
|
|
338
|
+
describe.each(configs)('config %o', config => {
|
|
339
|
+
const tokens = expandColorScale(config);
|
|
340
|
+
|
|
341
|
+
it.each(modes)(
|
|
342
|
+
'text tokens meet 4.5:1 on the surfaces the system pairs them with (%s)',
|
|
343
|
+
(_label, mode) => {
|
|
344
|
+
const surface = resolveToken(
|
|
345
|
+
tokens,
|
|
346
|
+
'--color-background-surface',
|
|
347
|
+
mode,
|
|
348
|
+
);
|
|
349
|
+
const body = resolveToken(tokens, '--color-background-body', mode);
|
|
350
|
+
const card = resolveToken(tokens, '--color-background-card', mode);
|
|
351
|
+
const popover = resolveToken(
|
|
352
|
+
tokens,
|
|
353
|
+
'--color-background-popover',
|
|
354
|
+
mode,
|
|
355
|
+
);
|
|
356
|
+
// Alpha tokens paint over the surface — composite before measuring.
|
|
357
|
+
const muted = resolveComposited(
|
|
358
|
+
tokens,
|
|
359
|
+
'--color-background-muted',
|
|
360
|
+
surface,
|
|
361
|
+
mode,
|
|
362
|
+
);
|
|
363
|
+
const neutral = resolveComposited(
|
|
364
|
+
tokens,
|
|
365
|
+
'--color-neutral',
|
|
366
|
+
surface,
|
|
367
|
+
mode,
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
const textPrimary = resolveToken(tokens, '--color-text-primary', mode);
|
|
371
|
+
const textSecondary = resolveToken(
|
|
372
|
+
tokens,
|
|
373
|
+
'--color-text-secondary',
|
|
374
|
+
mode,
|
|
375
|
+
);
|
|
376
|
+
const accent = resolveToken(tokens, '--color-accent', mode);
|
|
377
|
+
const onAccent = resolveToken(tokens, '--color-on-accent', mode);
|
|
378
|
+
|
|
379
|
+
// Primary text on every generated background it renders on.
|
|
380
|
+
for (const bg of [surface, body, card, popover, muted, neutral]) {
|
|
381
|
+
expect(contrastRatio(textPrimary, bg)).toBeGreaterThanOrEqual(4.5);
|
|
382
|
+
}
|
|
383
|
+
// Secondary/muted text on the main content surfaces.
|
|
384
|
+
for (const bg of [surface, body, card, popover]) {
|
|
385
|
+
expect(contrastRatio(textSecondary, bg)).toBeGreaterThanOrEqual(4.5);
|
|
386
|
+
}
|
|
387
|
+
// Accent-colored text (--color-text-accent references --color-accent).
|
|
388
|
+
expect(contrastRatio(accent, surface)).toBeGreaterThanOrEqual(4.5);
|
|
389
|
+
// Label text on accent-filled controls (primary buttons).
|
|
390
|
+
expect(contrastRatio(onAccent, accent)).toBeGreaterThanOrEqual(4.5);
|
|
391
|
+
},
|
|
392
|
+
);
|
|
393
|
+
|
|
394
|
+
it.each(modes)(
|
|
395
|
+
'non-text UI tokens meet 3:1 against the surface (%s)',
|
|
396
|
+
(_label, mode) => {
|
|
397
|
+
const surface = resolveToken(
|
|
398
|
+
tokens,
|
|
399
|
+
'--color-background-surface',
|
|
400
|
+
mode,
|
|
401
|
+
);
|
|
402
|
+
// Accent-filled controls and focus indicators.
|
|
403
|
+
expect(
|
|
404
|
+
contrastRatio(resolveToken(tokens, '--color-accent', mode), surface),
|
|
405
|
+
).toBeGreaterThanOrEqual(3);
|
|
406
|
+
// Meaningful icons alongside text.
|
|
407
|
+
expect(
|
|
408
|
+
contrastRatio(
|
|
409
|
+
resolveToken(tokens, '--color-icon-primary', mode),
|
|
410
|
+
surface,
|
|
411
|
+
),
|
|
412
|
+
).toBeGreaterThanOrEqual(3);
|
|
413
|
+
expect(
|
|
414
|
+
contrastRatio(
|
|
415
|
+
resolveToken(tokens, '--color-icon-secondary', mode),
|
|
416
|
+
surface,
|
|
417
|
+
),
|
|
418
|
+
).toBeGreaterThanOrEqual(3);
|
|
419
|
+
// Form-control boundaries (CheckboxInput, Selector borders).
|
|
420
|
+
expect(
|
|
421
|
+
contrastRatio(
|
|
422
|
+
resolveToken(tokens, '--color-border-emphasized', mode),
|
|
423
|
+
surface,
|
|
424
|
+
),
|
|
425
|
+
).toBeGreaterThanOrEqual(3);
|
|
426
|
+
},
|
|
427
|
+
);
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
it('documents the intentionally decorative tokens excluded from 3:1', () => {
|
|
431
|
+
// These tokens are decorative or redundant cues, not WCAG 1.4.11
|
|
432
|
+
// boundaries, and are deliberately NOT held to 3:1:
|
|
433
|
+
// - --color-border: hairline separator (~1.1:1 by design). Components
|
|
434
|
+
// that rely on it as their only boundary are tracked separately.
|
|
435
|
+
// - --color-skeleton: loading placeholder; conveys no information.
|
|
436
|
+
// - --color-track: rail behind a >= 3:1 thumb/fill (Slider, Switch,
|
|
437
|
+
// ProgressBar) — the indicator, not the rail, carries state.
|
|
438
|
+
// - --color-text-disabled / --color-icon-disabled: disabled controls
|
|
439
|
+
// are explicitly exempt from WCAG 1.4.3/1.4.11.
|
|
440
|
+
// Lock in the decorative alpha form of --color-border so a future
|
|
441
|
+
// change that starts relying on it for contrast shows up here.
|
|
442
|
+
const tokens = expandColorScale({accent: '#0064E0'});
|
|
443
|
+
const [light, dark] = splitLightDark(tokens['--color-border']);
|
|
444
|
+
for (const half of [light, dark]) {
|
|
445
|
+
const parsed = parseColor(half);
|
|
446
|
+
expect(parsed).not.toBeNull();
|
|
447
|
+
expect(parsed !== null && parsed.a).toBeLessThanOrEqual(0.2);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
describe('ensureContrastTone', () => {
|
|
453
|
+
it('returns the starting tone when it already meets the ratio', () => {
|
|
454
|
+
// Tone 10 on a near-white background is far past 4.5:1 already.
|
|
455
|
+
const hex = ensureContrastTone(282, 8, 10, -1, '#FCFDFE', 4.5);
|
|
456
|
+
expect(hex).toBe(ensureContrastTone(282, 8, 10, 1, '#FCFDFE', 1));
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it('bumps the tone until the ratio passes', () => {
|
|
460
|
+
// Tone 70 sits around 2.2:1 on a near-white surface — below 3:1.
|
|
461
|
+
const before = ensureContrastTone(282, 8, 70, -1, '#FCFDFE', 1);
|
|
462
|
+
expect(contrastRatio(before, '#FCFDFE')).toBeLessThan(3);
|
|
463
|
+
const after = ensureContrastTone(282, 8, 70, -1, '#FCFDFE', 3);
|
|
464
|
+
expect(contrastRatio(after, '#FCFDFE')).toBeGreaterThanOrEqual(3);
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
it('terminates at the tone floor/ceiling for impossible ratios', () => {
|
|
468
|
+
// 22:1 is unreachable; the loop must stop at pure black.
|
|
469
|
+
expect(ensureContrastTone(282, 8, 70, -1, '#FFFFFF', 22)).toBe('#000000');
|
|
470
|
+
expect(ensureContrastTone(282, 8, 30, 1, '#000000', 22)).toBe('#FFFFFF');
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
// =============================================================================
|
|
475
|
+
// --color-border-emphasized: concrete before/after delta
|
|
476
|
+
// =============================================================================
|
|
477
|
+
//
|
|
478
|
+
// This is the one generated token whose emitted VALUE changes. Every other
|
|
479
|
+
// token is byte-identical to the pre-change output; they only gained the
|
|
480
|
+
// assertions above. Before this change the token was emitted directly as the
|
|
481
|
+
// neutral-variant palette's tone 70 (light) / 30 (dark) — `ld(NV[70], NV[30])`.
|
|
482
|
+
// Those preferred tones land BELOW the WCAG 1.4.11 3:1 floor against the
|
|
483
|
+
// generated surface, so the generator now tone-bumps them until they clear
|
|
484
|
+
// 3:1. These tests reconstruct the exact old output and lock in the delta so
|
|
485
|
+
// the correction can't silently regress to the sub-3:1 value.
|
|
486
|
+
describe('--color-border-emphasized WCAG 1.4.11 correction (before/after)', () => {
|
|
487
|
+
const config = {accent: '#0064E0'} as const; // docs default, cool neutrals
|
|
488
|
+
const NEUTRAL_VARIANT_CHROMA_COOL = 8; // NEUTRAL_VARIANT_CHROMA.cool
|
|
489
|
+
const {hue} = hexToHct(config.accent);
|
|
490
|
+
// Exactly what the pre-change generator emitted: NV[70] light / NV[30] dark.
|
|
491
|
+
const nv = tonalPalette(hue, NEUTRAL_VARIANT_CHROMA_COOL);
|
|
492
|
+
const tokens = expandColorScale(config);
|
|
493
|
+
|
|
494
|
+
it('light: old NV[70] (~2.24:1) is corrected to >= 3:1', () => {
|
|
495
|
+
const surface = resolveToken(tokens, '--color-background-surface', 0);
|
|
496
|
+
const oldValue = nv[70];
|
|
497
|
+
const newValue = resolveToken(tokens, '--color-border-emphasized', 0);
|
|
498
|
+
expect(contrastRatio(oldValue, surface)).toBeCloseTo(2.24, 1);
|
|
499
|
+
expect(contrastRatio(oldValue, surface)).toBeLessThan(3);
|
|
500
|
+
expect(newValue).not.toBe(oldValue);
|
|
501
|
+
expect(contrastRatio(newValue, surface)).toBeGreaterThanOrEqual(3);
|
|
502
|
+
});
|
|
503
|
+
|
|
504
|
+
it('dark: old NV[30] (~1.84:1) is corrected to >= 3:1', () => {
|
|
505
|
+
const surface = resolveToken(tokens, '--color-background-surface', 1);
|
|
506
|
+
const oldValue = nv[30];
|
|
507
|
+
const newValue = resolveToken(tokens, '--color-border-emphasized', 1);
|
|
508
|
+
expect(contrastRatio(oldValue, surface)).toBeCloseTo(1.84, 1);
|
|
509
|
+
expect(contrastRatio(oldValue, surface)).toBeLessThan(3);
|
|
510
|
+
expect(newValue).not.toBe(oldValue);
|
|
511
|
+
expect(contrastRatio(newValue, surface)).toBeGreaterThanOrEqual(3);
|
|
512
|
+
});
|
|
113
513
|
});
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @file expandColorScale.ts
|
|
5
|
-
* @input Color scale configuration { accent
|
|
5
|
+
* @input Color scale configuration { accent?, neutralStyle?, contrast? }
|
|
6
6
|
* @output Token overrides for derivable color tokens
|
|
7
7
|
* @position Theme utility; consumed by defineTheme.ts
|
|
8
8
|
*
|
|
@@ -11,11 +11,27 @@
|
|
|
11
11
|
* derive from the accent — status colors, categorical hues, and fixed
|
|
12
12
|
* tokens (on-dark/on-light) fall through to colorDefaults.
|
|
13
13
|
*
|
|
14
|
+
* `accent` is optional: a neutral-only config still gets the full neutral
|
|
15
|
+
* ramp (seeded from the default accent's hue) while the accent tokens
|
|
16
|
+
* themselves fall through to colorDefaults, same as the tokens above.
|
|
17
|
+
*
|
|
18
|
+
* WCAG contrast guarantees (asserted in expandColorScale.test.ts):
|
|
19
|
+
* - Text tones are guaranteed >= 4.5:1 against their surfaces by tone
|
|
20
|
+
* spacing alone — HCT tone is CIE L*, which fixes relative luminance
|
|
21
|
+
* regardless of hue/chroma, so the fixed tone assignments hold for any
|
|
22
|
+
* accent/neutralStyle (WCAG 1.4.3).
|
|
23
|
+
* - --color-border-emphasized (form-control boundaries) is tone-bumped
|
|
24
|
+
* until it reaches >= 3:1 against the generated surface (WCAG 1.4.11).
|
|
25
|
+
* - --color-border, --color-skeleton, and --color-track are intentionally
|
|
26
|
+
* decorative/redundant cues and are NOT held to 3:1 — see the test file
|
|
27
|
+
* for the rationale.
|
|
28
|
+
*
|
|
14
29
|
* SYNC: When modified, update:
|
|
15
30
|
* - /packages/core/src/theme/defineTheme.ts
|
|
16
31
|
*/
|
|
17
32
|
|
|
18
|
-
import {
|
|
33
|
+
import {contrastRatio} from './contrast';
|
|
34
|
+
import {hexToHct, hctToHex, tonalPalette, hexWithAlpha} from './hct';
|
|
19
35
|
|
|
20
36
|
// =============================================================================
|
|
21
37
|
// Types
|
|
@@ -31,11 +47,21 @@ import {hexToHct, tonalPalette, hexWithAlpha} from './hct';
|
|
|
31
47
|
*
|
|
32
48
|
* // With customization
|
|
33
49
|
* { accent: '#B7410E', neutralStyle: 'warm', contrast: 'high' }
|
|
50
|
+
*
|
|
51
|
+
* // Neutral-only — keeps the default accent, themes the neutrals
|
|
52
|
+
* { neutralStyle: 'warm' }
|
|
34
53
|
* ```
|
|
35
54
|
*/
|
|
36
55
|
export interface ColorScaleConfig {
|
|
37
|
-
/**
|
|
38
|
-
|
|
56
|
+
/**
|
|
57
|
+
* Seed accent color as hex (#RRGGBB). Everything derives from this.
|
|
58
|
+
*
|
|
59
|
+
* Optional. When omitted, the neutral palettes are seeded from the
|
|
60
|
+
* default accent's hue and the accent tokens (--color-accent,
|
|
61
|
+
* --color-accent-muted, --color-on-accent) are not generated — they
|
|
62
|
+
* fall through to colorDefaults.
|
|
63
|
+
*/
|
|
64
|
+
accent?: string;
|
|
39
65
|
|
|
40
66
|
/**
|
|
41
67
|
* Neutral tone warmth. Controls how much of the seed's hue bleeds
|
|
@@ -45,7 +71,9 @@ export interface ColorScaleConfig {
|
|
|
45
71
|
neutralStyle?: 'warm' | 'cool' | 'neutral';
|
|
46
72
|
|
|
47
73
|
/**
|
|
48
|
-
* 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.
|
|
49
77
|
* @default 'standard'
|
|
50
78
|
*/
|
|
51
79
|
contrast?: 'standard' | 'high';
|
|
@@ -69,6 +97,14 @@ const NEUTRAL_VARIANT_CHROMA: Record<string, number> = {
|
|
|
69
97
|
neutral: 6,
|
|
70
98
|
};
|
|
71
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Hue source for accent-less configs — the light half of
|
|
102
|
+
* colorDefaults['--color-accent'] (a test guards the two against drift).
|
|
103
|
+
* Only its hue reaches the output: the accent tokens stay ungenerated, so
|
|
104
|
+
* they keep their colorDefaults values rather than this seed's derivation.
|
|
105
|
+
*/
|
|
106
|
+
const DEFAULT_ACCENT_SEED = '#0064E0';
|
|
107
|
+
|
|
72
108
|
// =============================================================================
|
|
73
109
|
// Computation
|
|
74
110
|
// =============================================================================
|
|
@@ -81,6 +117,39 @@ function accentWithAlpha(alpha: number): string {
|
|
|
81
117
|
return `color-mix(in srgb, var(--color-accent) ${alpha * 100}%, transparent)`;
|
|
82
118
|
}
|
|
83
119
|
|
|
120
|
+
/** WCAG 1.4.11 minimum contrast for non-text UI boundaries. */
|
|
121
|
+
const NON_TEXT_MIN_CONTRAST = 3;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Walk tone in `step` increments from `startTone` until the color reaches
|
|
125
|
+
* `minRatio` against `background`, and return the resulting hex.
|
|
126
|
+
*
|
|
127
|
+
* Used for tokens whose preferred tone is not guaranteed by tone spacing
|
|
128
|
+
* alone (e.g. --color-border-emphasized). Because HCT tone is CIE L*,
|
|
129
|
+
* each step moves luminance monotonically, so the loop always terminates —
|
|
130
|
+
* at worst at pure black/white (21:1 against anything mid-range).
|
|
131
|
+
*/
|
|
132
|
+
export function ensureContrastTone(
|
|
133
|
+
hue: number,
|
|
134
|
+
chroma: number,
|
|
135
|
+
startTone: number,
|
|
136
|
+
step: -1 | 1,
|
|
137
|
+
background: string,
|
|
138
|
+
minRatio: number,
|
|
139
|
+
): string {
|
|
140
|
+
let tone = startTone;
|
|
141
|
+
let hex = hctToHex({hue, chroma, tone});
|
|
142
|
+
while (
|
|
143
|
+
contrastRatio(hex, background) < minRatio &&
|
|
144
|
+
tone + step >= 0 &&
|
|
145
|
+
tone + step <= 100
|
|
146
|
+
) {
|
|
147
|
+
tone += step;
|
|
148
|
+
hex = hctToHex({hue, chroma, tone});
|
|
149
|
+
}
|
|
150
|
+
return hex;
|
|
151
|
+
}
|
|
152
|
+
|
|
84
153
|
/**
|
|
85
154
|
* Expand a color scale config into Astryx color token overrides.
|
|
86
155
|
*
|
|
@@ -89,18 +158,23 @@ function accentWithAlpha(alpha: number): string {
|
|
|
89
158
|
* --color-on-dark/on-light) are NOT generated — they fall through
|
|
90
159
|
* to colorDefaults.
|
|
91
160
|
*
|
|
161
|
+
* Without an `accent`, the accent tokens join that fall-through set: the
|
|
162
|
+
* neutrals are seeded from the default accent's hue, and --color-accent,
|
|
163
|
+
* --color-accent-muted and --color-on-accent keep their colorDefaults values.
|
|
164
|
+
*
|
|
92
165
|
* @example
|
|
93
166
|
* ```
|
|
94
167
|
* const tokens = expandColorScale({ accent: '#0064E0' });
|
|
95
168
|
* // tokens['--color-accent'] === 'light-dark(#..., #...)'
|
|
169
|
+
*
|
|
170
|
+
* const neutralOnly = expandColorScale({ neutralStyle: 'warm' });
|
|
171
|
+
* // neutralOnly['--color-accent'] === undefined
|
|
96
172
|
* ```
|
|
97
173
|
*/
|
|
98
|
-
export function expandColorScale(
|
|
99
|
-
config: ColorScaleConfig,
|
|
100
|
-
): ColorScaleTokens {
|
|
174
|
+
export function expandColorScale(config: ColorScaleConfig): ColorScaleTokens {
|
|
101
175
|
const {accent, neutralStyle = 'cool', contrast = 'standard'} = config;
|
|
102
176
|
|
|
103
|
-
const seed = hexToHct(accent);
|
|
177
|
+
const seed = hexToHct(accent ?? DEFAULT_ACCENT_SEED);
|
|
104
178
|
const seedHue = seed.hue;
|
|
105
179
|
|
|
106
180
|
const primaryChroma = Math.max(seed.chroma, 48);
|
|
@@ -118,15 +192,59 @@ export function expandColorScale(
|
|
|
118
192
|
const textSecondaryLightTone = isHigh ? 20 : 30;
|
|
119
193
|
const textSecondaryDarkTone = isHigh ? 80 : 70;
|
|
120
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
|
+
|
|
202
|
+
// Emphasized borders outline form controls (CheckboxInput, Selector), so
|
|
203
|
+
// they are non-text UI boundaries under WCAG 1.4.11 and must reach 3:1
|
|
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;
|
|
209
|
+
const borderEmphasized = ld(
|
|
210
|
+
ensureContrastTone(
|
|
211
|
+
seedHue,
|
|
212
|
+
neutralVariantChroma,
|
|
213
|
+
borderEmphasizedStartLight,
|
|
214
|
+
-1,
|
|
215
|
+
N[99],
|
|
216
|
+
NON_TEXT_MIN_CONTRAST,
|
|
217
|
+
),
|
|
218
|
+
ensureContrastTone(
|
|
219
|
+
seedHue,
|
|
220
|
+
neutralVariantChroma,
|
|
221
|
+
borderEmphasizedStartDark,
|
|
222
|
+
1,
|
|
223
|
+
N[10],
|
|
224
|
+
NON_TEXT_MIN_CONTRAST,
|
|
225
|
+
),
|
|
226
|
+
);
|
|
227
|
+
|
|
121
228
|
return {
|
|
122
|
-
// Core semantic
|
|
123
|
-
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
229
|
+
// Core semantic — only with a seed accent. Without one these fall through
|
|
230
|
+
// to colorDefaults, whose --color-accent is NOT what the default seed
|
|
231
|
+
// derives: defaulting the seed instead of omitting the tokens would
|
|
232
|
+
// recolor every neutral-only theme. Nullish and not truthy, matching the
|
|
233
|
+
// seed above, so a supplied-but-malformed accent keeps its old behavior.
|
|
234
|
+
...(accent != null
|
|
235
|
+
? {
|
|
236
|
+
'--color-accent': ld(P[40], P[80]),
|
|
237
|
+
// Derived accent tokens reference --color-accent instead of baking its
|
|
238
|
+
// resolved hex, so a scoped override of the base token re-accents the
|
|
239
|
+
// whole subtree at runtime. --color-on-accent stays baked: it is a
|
|
240
|
+
// contrast computation against the accent, which CSS cannot express.
|
|
241
|
+
'--color-accent-muted': ld(
|
|
242
|
+
accentWithAlpha(0.2),
|
|
243
|
+
accentWithAlpha(0.25),
|
|
244
|
+
),
|
|
245
|
+
'--color-on-accent': ld(P[100], P[20]),
|
|
246
|
+
}
|
|
247
|
+
: null),
|
|
130
248
|
'--color-neutral': ld(hexWithAlpha(N[10], 0.1), hexWithAlpha(N[90], 0.2)),
|
|
131
249
|
'--color-background-surface': ld(N[99], N[10]),
|
|
132
250
|
'--color-background-body': ld(N[95], N[5]),
|
|
@@ -168,8 +286,14 @@ export function expandColorScale(
|
|
|
168
286
|
'--color-background-inverted': ld(N[10], N[99]),
|
|
169
287
|
|
|
170
288
|
// Border
|
|
171
|
-
|
|
172
|
-
|
|
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
|
+
),
|
|
296
|
+
'--color-border-emphasized': borderEmphasized,
|
|
173
297
|
|
|
174
298
|
// Effects
|
|
175
299
|
'--color-skeleton': ld(NV[70], NV[30]),
|