@astryxdesign/core 0.1.3 → 0.1.4-canary.01e5b29
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 +51 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +20 -18
- package/dist/AlertDialog/useImperativeAlertDialog.js +3 -3
- package/dist/AppShell/AppShell.d.ts +1 -1
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +55 -53
- package/dist/AspectRatio/AspectRatio.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +27 -25
- package/dist/Avatar/AvatarStatusDot.js +5 -5
- package/dist/AvatarGroup/AvatarGroup.js +5 -5
- package/dist/AvatarGroup/AvatarGroupOverflow.js +5 -5
- package/dist/Badge/Badge.js +3 -3
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +32 -25
- package/dist/Blockquote/Blockquote.js +7 -7
- package/dist/Breadcrumbs/BreadcrumbItem.js +17 -17
- package/dist/Breadcrumbs/Breadcrumbs.js +7 -7
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +47 -26
- package/dist/ButtonGroup/ButtonGroup.js +7 -7
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +108 -64
- package/dist/Calendar/dayCellUtils.d.ts +67 -5
- package/dist/Calendar/dayCellUtils.d.ts.map +1 -1
- package/dist/Calendar/dayCellUtils.js +139 -18
- package/dist/Calendar/styles.d.ts +2 -2
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +2 -2
- package/dist/Card/Card.d.ts +4 -2
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +18 -10
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +20 -19
- package/dist/Center/Center.js +3 -3
- package/dist/Chat/ChatComposer.js +23 -23
- package/dist/Chat/ChatComposerDrawer.js +14 -14
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +27 -15
- package/dist/Chat/ChatDictationButton.d.ts +1 -1
- package/dist/Chat/ChatDictationButton.d.ts.map +1 -1
- package/dist/Chat/ChatDictationButton.js +13 -11
- package/dist/Chat/ChatLayout.js +17 -17
- package/dist/Chat/ChatLayoutScrollButton.d.ts +1 -1
- package/dist/Chat/ChatLayoutScrollButton.d.ts.map +1 -1
- package/dist/Chat/ChatLayoutScrollButton.js +12 -10
- package/dist/Chat/ChatMessage.js +12 -12
- package/dist/Chat/ChatMessageBubble.js +7 -7
- package/dist/Chat/ChatMessageList.js +14 -14
- package/dist/Chat/ChatMessageMetadata.d.ts +1 -1
- package/dist/Chat/ChatMessageMetadata.d.ts.map +1 -1
- package/dist/Chat/ChatMessageMetadata.js +14 -12
- package/dist/Chat/ChatPastedTextToken.js +13 -13
- package/dist/Chat/ChatSendButton.js +3 -3
- package/dist/Chat/ChatSystemMessage.d.ts +1 -1
- package/dist/Chat/ChatSystemMessage.d.ts.map +1 -1
- package/dist/Chat/ChatSystemMessage.js +17 -17
- package/dist/Chat/ChatTokenizedText.d.ts +1 -1
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +24 -15
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +81 -74
- package/dist/Chat/index.d.ts +1 -1
- package/dist/Chat/index.d.ts.map +1 -1
- package/dist/Chat/useTriggerMenu.js +15 -15
- package/dist/CheckboxInput/CheckboxInput.d.ts +6 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +32 -24
- package/dist/CheckboxList/CheckboxList.js +9 -9
- package/dist/CheckboxList/CheckboxListItem.d.ts +1 -1
- package/dist/CheckboxList/CheckboxListItem.d.ts.map +1 -1
- package/dist/CheckboxList/CheckboxListItem.js +8 -6
- package/dist/Citation/Citation.js +10 -10
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +32 -9
- package/dist/Code/Code.d.ts +15 -1
- package/dist/Code/Code.d.ts.map +1 -1
- package/dist/Code/Code.js +35 -5
- package/dist/Code/index.d.ts +1 -1
- package/dist/Code/index.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.d.ts +10 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +88 -52
- package/dist/CodeBlock/index.d.ts +1 -1
- package/dist/CodeBlock/index.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.d.ts +9 -3
- package/dist/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/Collapsible/Collapsible.js +110 -22
- package/dist/Collapsible/CollapsibleGroup.d.ts +39 -7
- package/dist/Collapsible/CollapsibleGroup.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroup.js +73 -12
- package/dist/Collapsible/CollapsibleGroupContext.d.ts +31 -0
- package/dist/Collapsible/CollapsibleGroupContext.d.ts.map +1 -1
- package/dist/Collapsible/CollapsibleGroupContext.js +33 -3
- package/dist/Collapsible/index.d.ts +1 -0
- package/dist/Collapsible/index.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.d.ts +4 -1
- package/dist/Collapsible/useCollapsible.d.ts.map +1 -1
- package/dist/Collapsible/useCollapsible.js +20 -6
- package/dist/CommandPalette/CommandPalette.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPalette.js +36 -34
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteEmpty.js +27 -7
- package/dist/CommandPalette/CommandPaletteFooter.js +16 -16
- package/dist/CommandPalette/CommandPaletteGroup.js +5 -5
- package/dist/CommandPalette/CommandPaletteInput.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.js +3 -3
- package/dist/CommandPalette/CommandPaletteList.js +3 -3
- package/dist/ContextMenu/ContextMenu.d.ts +9 -1
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +16 -11
- package/dist/DateInput/DateInput.js +18 -18
- package/dist/DateRangeInput/DateRangeInput.js +23 -23
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -7
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +30 -26
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +9 -9
- package/dist/Dialog/DialogHeader.js +16 -16
- package/dist/Dialog/useImperativeDialog.js +3 -3
- package/dist/Divider/Divider.d.ts +0 -22
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +7 -7
- package/dist/DropdownMenu/DropdownMenu.js +10 -10
- package/dist/DropdownMenu/DropdownMenuItem.d.ts +2 -17
- package/dist/DropdownMenu/DropdownMenuItem.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuItem.js +3 -3
- package/dist/DropdownMenu/renderDropdownItems.js +10 -10
- package/dist/EmptyState/EmptyState.js +9 -9
- package/dist/Field/Field.js +17 -17
- package/dist/Field/FieldLabel.js +15 -15
- package/dist/Field/InputClearButton.js +5 -5
- package/dist/FieldStatus/FieldStatus.js +3 -3
- package/dist/FileInput/FileInput.js +29 -29
- package/dist/FormLayout/FormLayout.js +5 -5
- package/dist/Grid/Grid.d.ts +4 -3
- package/dist/Grid/Grid.d.ts.map +1 -1
- package/dist/Grid/Grid.js +29 -12
- package/dist/Grid/GridSpan.js +3 -3
- package/dist/HStack/HStack.js +3 -3
- package/dist/Heading/Heading.js +10 -10
- package/dist/HoverCard/HoverCard.js +9 -9
- package/dist/HoverCard/useHoverCard.js +3 -3
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/Icon.js +16 -12
- package/dist/Icon/defaultIcons.js +116 -116
- package/dist/IconButton/IconButton.js +3 -3
- package/dist/InputGroup/InputGroup.js +11 -11
- package/dist/InputGroup/InputGroupText.js +3 -3
- package/dist/Item/Item.js +18 -18
- package/dist/Kbd/Kbd.js +5 -5
- package/dist/Layer/LayerProvider.js +7 -7
- package/dist/Layer/useLayer.js +5 -5
- package/dist/Layout/Layout.js +21 -21
- package/dist/Layout/LayoutContent.js +3 -3
- package/dist/Layout/LayoutFooter.js +5 -5
- package/dist/Layout/LayoutHeader.js +5 -5
- package/dist/Layout/LayoutPanel.js +3 -3
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +55 -31
- package/dist/Lightbox/useLightbox.js +3 -3
- package/dist/Link/Link.js +15 -15
- package/dist/Link/LinkProvider.js +3 -3
- package/dist/Link/useLinkify.js +3 -3
- package/dist/List/List.js +11 -11
- package/dist/List/ListItem.js +11 -11
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +102 -102
- package/dist/Markdown/parser.d.ts +7 -0
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +300 -6
- package/dist/MetadataList/MetadataList.js +10 -10
- package/dist/MetadataList/MetadataListItem.js +15 -15
- package/dist/MobileNav/MobileNav.js +15 -15
- package/dist/MobileNav/MobileNavToggle.js +5 -5
- package/dist/MoreMenu/MoreMenu.js +3 -3
- package/dist/MultiSelector/MultiSelector.d.ts +7 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +64 -55
- package/dist/NavIcon/NavIcon.js +3 -3
- package/dist/NavMenu/NavHeadingMenu.js +5 -5
- package/dist/NavMenu/NavHeadingMenuItem.js +8 -8
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +48 -32
- package/dist/Outline/Outline.js +15 -15
- package/dist/OverflowList/OverflowList.js +8 -8
- package/dist/Overlay/Overlay.js +3 -3
- package/dist/Overlay/OverlayScrim.js +5 -5
- package/dist/Overlay/useOverlay.js +3 -3
- package/dist/Pagination/Pagination.d.ts +1 -1
- package/dist/Pagination/Pagination.d.ts.map +1 -1
- package/dist/Pagination/Pagination.js +125 -72
- package/dist/Popover/Popover.js +16 -16
- package/dist/Popover/usePopover.js +7 -7
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +110 -92
- package/dist/PowerSearch/PowerSearchEditPopover.js +84 -84
- package/dist/PowerSearch/PowerSearchFilterEditor.js +3 -3
- package/dist/PowerSearch/PowerSearchToken.js +5 -5
- package/dist/PowerSearch/PowerSearchValueEditor.js +54 -54
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +25 -18
- package/dist/RadioList/RadioList.d.ts +7 -1
- package/dist/RadioList/RadioList.d.ts.map +1 -1
- package/dist/RadioList/RadioList.js +10 -8
- package/dist/RadioList/RadioListItem.d.ts +1 -1
- package/dist/RadioList/RadioListItem.d.ts.map +1 -1
- package/dist/RadioList/RadioListItem.js +30 -22
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +28 -10
- package/dist/Section/Section.js +5 -5
- package/dist/SegmentedControl/SegmentedControl.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +32 -10
- package/dist/SegmentedControl/SegmentedControlItem.d.ts +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +18 -12
- package/dist/SelectableCard/SelectableCard.js +5 -5
- package/dist/Selector/Selector.d.ts +6 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +54 -45
- package/dist/Selector/SelectorOption.js +3 -3
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +38 -34
- package/dist/SideNav/SideNavCollapseButton.d.ts +1 -1
- package/dist/SideNav/SideNavCollapseButton.d.ts.map +1 -1
- package/dist/SideNav/SideNavCollapseButton.js +8 -6
- package/dist/SideNav/SideNavHeading.js +87 -87
- package/dist/SideNav/SideNavItem.js +42 -42
- package/dist/SideNav/SideNavSection.d.ts +1 -1
- package/dist/SideNav/SideNavSection.d.ts.map +1 -1
- package/dist/SideNav/SideNavSection.js +18 -16
- package/dist/Skeleton/Skeleton.js +3 -3
- package/dist/Slider/Slider.d.ts +6 -0
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +31 -22
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +10 -10
- package/dist/StatusDot/StatusDot.js +5 -5
- package/dist/Switch/Switch.d.ts +13 -4
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +41 -30
- package/dist/TabList/Tab.js +18 -18
- package/dist/TabList/TabList.js +5 -5
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +57 -30
- package/dist/TabList/tab.markers.stylex.d.ts +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +51 -39
- package/dist/Table/Table.js +7 -7
- package/dist/Table/TableBody.d.ts +1 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableBody.js +9 -5
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js +76 -7
- package/dist/Table/TableFooter.d.ts +1 -1
- package/dist/Table/TableFooter.d.ts.map +1 -1
- package/dist/Table/TableFooter.js +9 -5
- package/dist/Table/TableHeader.d.ts +1 -1
- package/dist/Table/TableHeader.d.ts.map +1 -1
- package/dist/Table/TableHeader.js +9 -5
- package/dist/Table/TableHeaderCell.js +3 -3
- package/dist/Table/TableRow.js +5 -5
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +1 -0
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +14 -11
- package/dist/Table/plugins/filtering/useTableFiltering.js +71 -71
- package/dist/Table/plugins/pagination/paginateData.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/paginateData.js +5 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +7 -7
- package/dist/Table/plugins/rowExpansion/index.d.ts +3 -0
- package/dist/Table/plugins/rowExpansion/index.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/index.js +3 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts +90 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -0
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +398 -0
- package/dist/Table/plugins/selection/useTableSelection.js +18 -18
- package/dist/Table/plugins/selection/useTableSelectionState.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelectionState.js +11 -1
- package/dist/Table/plugins/sortable/useTableSortable.js +17 -17
- package/dist/Table/plugins/sortable/useTableSortableState.d.ts.map +1 -1
- package/dist/Table/plugins/sortable/useTableSortableState.js +8 -4
- package/dist/Table/tableContextMenu.d.ts +5 -1
- package/dist/Table/tableContextMenu.d.ts.map +1 -1
- package/dist/Table/tableContextMenu.js +19 -12
- package/dist/Text/Text.d.ts +1 -1
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +14 -13
- package/dist/Text/text.stylex.d.ts +35 -0
- package/dist/Text/text.stylex.d.ts.map +1 -1
- package/dist/Text/text.stylex.js +52 -1
- package/dist/TextArea/TextArea.js +14 -14
- package/dist/TextInput/TextInput.js +15 -15
- package/dist/Thumbnail/Thumbnail.d.ts +3 -2
- package/dist/Thumbnail/Thumbnail.d.ts.map +1 -1
- package/dist/Thumbnail/Thumbnail.js +30 -29
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +26 -21
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +37 -26
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +25 -17
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +23 -11
- package/dist/Toast/useToast.js +4 -4
- package/dist/ToggleButton/ToggleButton.js +12 -12
- package/dist/ToggleButton/ToggleButtonGroup.js +5 -5
- package/dist/Token/Token.js +21 -21
- package/dist/Tokenizer/Tokenizer.d.ts +6 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +38 -29
- package/dist/Toolbar/Toolbar.js +18 -18
- package/dist/Tooltip/Tooltip.js +11 -11
- package/dist/Tooltip/useTooltip.js +3 -3
- package/dist/TopNav/TopNav.js +32 -32
- package/dist/TopNav/TopNavHeading.js +67 -67
- package/dist/TopNav/TopNavItem.js +5 -5
- package/dist/TopNav/TopNavMegaMenu.js +30 -30
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuFeaturedCard.js +25 -14
- package/dist/TopNav/TopNavMegaMenuItem.js +16 -16
- package/dist/TopNav/TopNavMenu.js +32 -32
- package/dist/TreeList/TreeList.js +8 -8
- package/dist/TreeList/TreeListBranches.js +11 -11
- package/dist/TreeList/TreeListItem.js +30 -30
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +23 -20
- package/dist/Typeahead/Typeahead.js +12 -12
- package/dist/Typeahead/TypeaheadItem.js +10 -10
- package/dist/VStack/VStack.js +3 -3
- package/dist/astryx.css +23 -0
- package/dist/astryx.umd.js +60 -58
- package/dist/astryx.umd.js.map +4 -4
- package/dist/docs-types.d.ts +13 -1
- package/dist/docs-types.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.d.ts +1 -1
- package/dist/hooks/focusableSelector.d.ts.map +1 -1
- package/dist/hooks/focusableSelector.js +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +3 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +38 -1
- package/dist/hooks/useHotkeys.d.ts +51 -0
- package/dist/hooks/useHotkeys.d.ts.map +1 -0
- package/dist/hooks/useHotkeys.js +160 -0
- package/dist/hooks/useInteractiveRole.d.ts +6 -2
- package/dist/hooks/useInteractiveRole.d.ts.map +1 -1
- package/dist/hooks/useInteractiveRole.js +6 -2
- package/dist/hooks/useKeyboardHint.js +9 -9
- package/dist/hooks/useStreamingText.d.ts +3 -1
- package/dist/hooks/useStreamingText.d.ts.map +1 -1
- package/dist/hooks/useStreamingText.js +14 -5
- package/dist/theme/MediaTheme.js +3 -3
- package/dist/theme/Theme.js +7 -7
- package/dist/theme/defineTheme.d.ts +1 -1
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/expandColorScale.d.ts.map +1 -1
- package/dist/theme/expandColorScale.js +10 -3
- package/dist/theme/hct.d.ts +0 -15
- package/dist/theme/hct.d.ts.map +1 -1
- package/dist/theme/hct.js +9 -9
- package/dist/theme/syntax/SyntaxTheme.js +5 -5
- package/dist/theme/tokens.d.ts +10 -2
- package/dist/theme/tokens.d.ts.map +1 -1
- package/dist/theme/tokens.js +220 -4
- package/dist/utils/color.d.ts +42 -0
- package/dist/utils/color.d.ts.map +1 -0
- package/dist/utils/color.js +150 -0
- package/dist/utils/composeEventHandlers.d.ts +30 -0
- package/dist/utils/composeEventHandlers.d.ts.map +1 -0
- package/dist/utils/composeEventHandlers.js +40 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +8 -5
- package/package.json +3 -3
- package/src/AlertDialog/AlertDialog.tsx +2 -0
- package/src/AppShell/AppShell.tsx +2 -0
- package/src/AspectRatio/AspectRatio.doc.mjs +1 -1
- package/src/Avatar/Avatar.doc.mjs +13 -2
- package/src/Avatar/Avatar.test.tsx +32 -1
- package/src/Avatar/Avatar.tsx +12 -20
- package/src/Banner/Banner.doc.mjs +8 -0
- package/src/Banner/Banner.test.tsx +38 -0
- package/src/Banner/Banner.tsx +8 -1
- package/src/Button/Button.tsx +39 -6
- package/src/ButtonGroup/ButtonGroup.doc.mjs +1 -1
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Calendar/Calendar.test.tsx +201 -17
- package/src/Calendar/Calendar.tsx +79 -26
- package/src/Calendar/dayCellUtils.test.ts +306 -1
- package/src/Calendar/dayCellUtils.ts +206 -13
- package/src/Calendar/styles.ts +12 -2
- package/src/Card/Card.doc.mjs +1 -1
- package/src/Card/Card.tsx +16 -6
- package/src/Carousel/Carousel.doc.mjs +12 -12
- package/src/Carousel/Carousel.test.tsx +13 -0
- package/src/Carousel/Carousel.tsx +1 -0
- package/src/Chat/Chat.doc.mjs +1 -1
- package/src/Chat/ChatComposerInput.test.tsx +24 -0
- package/src/Chat/ChatComposerInput.tsx +17 -1
- package/src/Chat/ChatDictationButton.test.tsx +43 -0
- package/src/Chat/ChatDictationButton.tsx +4 -4
- package/src/Chat/ChatLayoutScrollButton.test.tsx +33 -0
- package/src/Chat/ChatLayoutScrollButton.tsx +3 -1
- package/src/Chat/ChatMessageMetadata.test.tsx +32 -0
- package/src/Chat/ChatMessageMetadata.tsx +4 -6
- package/src/Chat/ChatSystemMessage.test.tsx +26 -11
- package/src/Chat/ChatSystemMessage.tsx +7 -7
- package/src/Chat/ChatTokenizedText.test.tsx +29 -16
- package/src/Chat/ChatTokenizedText.tsx +15 -8
- package/src/Chat/ChatToolCalls.test.tsx +55 -0
- package/src/Chat/ChatToolCalls.tsx +10 -12
- package/src/Chat/index.ts +1 -4
- package/src/Chat/useChatNewMessages.test.tsx +4 -4
- package/src/CheckboxInput/CheckboxInput.doc.mjs +12 -4
- package/src/CheckboxInput/CheckboxInput.test.tsx +103 -0
- package/src/CheckboxInput/CheckboxInput.tsx +13 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxList.test.tsx +19 -0
- package/src/CheckboxList/CheckboxListItem.tsx +11 -2
- package/src/Citation/Citation.doc.mjs +5 -0
- package/src/ClickableCard/ClickableCard.tsx +45 -2
- package/src/Code/Code.test.tsx +54 -0
- package/src/Code/Code.tsx +48 -4
- package/src/Code/index.ts +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +7 -2
- package/src/CodeBlock/CodeBlock.test.tsx +122 -3
- package/src/CodeBlock/CodeBlock.tsx +62 -4
- package/src/CodeBlock/index.ts +1 -1
- package/src/Collapsible/Collapsible.doc.mjs +8 -4
- package/src/Collapsible/Collapsible.test.tsx +405 -0
- package/src/Collapsible/Collapsible.tsx +86 -10
- package/src/Collapsible/CollapsibleGroup.doc.mjs +27 -3
- package/src/Collapsible/CollapsibleGroup.test.tsx +318 -0
- package/src/Collapsible/CollapsibleGroup.tsx +107 -9
- package/src/Collapsible/CollapsibleGroupContext.tsx +42 -2
- package/src/Collapsible/index.ts +4 -0
- package/src/Collapsible/useCollapsible.ts +20 -6
- package/src/CommandPalette/CommandPalette.tsx +5 -3
- package/src/CommandPalette/CommandPaletteEmpty.doc.mjs +5 -0
- package/src/CommandPalette/CommandPaletteEmpty.tsx +15 -1
- package/src/CommandPalette/CommandPaletteGroup.doc.mjs +10 -0
- package/src/CommandPalette/CommandPaletteInput.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteItem.doc.mjs +6 -0
- package/src/CommandPalette/CommandPaletteList.doc.mjs +9 -0
- package/src/ContextMenu/ContextMenu.doc.mjs +15 -0
- package/src/ContextMenu/ContextMenu.test.tsx +15 -0
- package/src/ContextMenu/ContextMenu.tsx +19 -1
- package/src/ContextMenu/ContextMenuItem.doc.mjs +6 -0
- package/src/DateInput/DateInput.doc.mjs +6 -1
- package/src/DateInput/DateInput.test.tsx +11 -20
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.test.tsx +31 -44
- package/src/DateRangeInput/DateRangeInput.tsx +2 -2
- package/src/DateTimeInput/DateTimeInput.doc.mjs +4 -3
- package/src/DateTimeInput/DateTimeInput.test.tsx +118 -16
- package/src/DateTimeInput/DateTimeInput.tsx +9 -8
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/DialogHeader.doc.mjs +45 -0
- package/src/Divider/Divider.tsx +1 -23
- package/src/DropdownMenu/DropdownMenu.doc.mjs +1 -1
- package/src/DropdownMenu/DropdownMenu.test.tsx +5 -3
- package/src/DropdownMenu/DropdownMenuItem.tsx +5 -17
- package/src/EmptyState/EmptyState.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/Field/FieldLabel.test.tsx +2 -2
- package/src/FieldStatus/FieldStatus.test.tsx +282 -0
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/FormLayout/__snapshots__/FormLayout.test.tsx.snap +0 -3
- package/src/Grid/Grid.doc.mjs +3 -3
- package/src/Grid/Grid.test.tsx +43 -18
- package/src/Grid/Grid.tsx +26 -9
- package/src/Icon/Icon.test.tsx +41 -29
- package/src/Icon/Icon.tsx +6 -2
- package/src/InputGroup/InputGroup.tsx +2 -2
- package/src/InteractiveRoleContext/InteractiveRoleContext.test.tsx +185 -0
- package/src/Item/Item.tsx +1 -1
- package/src/Layout/Layout.test.tsx +285 -0
- package/src/Layout/LayoutContent.doc.mjs +12 -0
- package/src/Layout/LayoutPanel.doc.mjs +40 -0
- package/src/Layout/LayoutSlots.test.tsx +364 -0
- package/src/Layout/__tests__/edgeCompensation.test.tsx +72 -0
- package/src/Lightbox/Lightbox.doc.mjs +5 -0
- package/src/Lightbox/Lightbox.test.tsx +123 -2
- package/src/Lightbox/Lightbox.tsx +29 -1
- package/src/Markdown/Markdown.test.tsx +23 -0
- package/src/Markdown/Markdown.tsx +9 -7
- package/src/Markdown/incremental.test.ts +36 -0
- package/src/Markdown/parser.perf.test.ts +34 -12
- package/src/Markdown/parser.test.ts +210 -0
- package/src/Markdown/parser.ts +301 -6
- package/src/MobileNav/MobileNav.doc.mjs +20 -0
- package/src/MultiSelector/MultiSelector.doc.mjs +14 -1
- package/src/MultiSelector/MultiSelector.test.tsx +33 -0
- package/src/MultiSelector/MultiSelector.tsx +20 -0
- package/src/NavMenu/NavMenu.doc.mjs +15 -0
- package/src/NumberInput/NumberInput.test.tsx +48 -3
- package/src/NumberInput/NumberInput.tsx +32 -15
- package/src/Outline/parseOutlineFromMarkdown.test.ts +80 -0
- package/src/OverflowList/OverflowList.test.tsx +416 -0
- package/src/Overlay/Overlay.doc.mjs +6 -0
- package/src/Overlay/Overlay.test.tsx +356 -0
- package/src/Pagination/Pagination.test.tsx +162 -0
- package/src/Pagination/Pagination.tsx +80 -26
- package/src/Popover/Popover.test.tsx +65 -0
- package/src/PowerSearch/PowerSearch.doc.mjs +4 -4
- package/src/PowerSearch/PowerSearch.test.tsx +109 -1
- package/src/PowerSearch/PowerSearch.tsx +37 -16
- package/src/ProgressBar/ProgressBar.test.tsx +30 -0
- package/src/ProgressBar/ProgressBar.tsx +12 -5
- package/src/RadioList/RadioList.doc.mjs +7 -1
- package/src/RadioList/RadioList.test.tsx +65 -0
- package/src/RadioList/RadioList.tsx +10 -1
- package/src/RadioList/RadioListItem.tsx +13 -4
- package/src/Resizable/ResizeHandle.test.tsx +218 -0
- package/src/Resizable/ResizeHandle.tsx +22 -4
- package/src/Section/Section.test.tsx +4 -10
- package/src/SegmentedControl/SegmentedControl.doc.mjs +2 -2
- package/src/SegmentedControl/SegmentedControl.test.tsx +192 -0
- package/src/SegmentedControl/SegmentedControl.tsx +27 -5
- package/src/SegmentedControl/SegmentedControlItem.tsx +9 -4
- package/src/SelectableCard/SelectableCard.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +12 -1
- package/src/Selector/Selector.test.tsx +30 -0
- package/src/Selector/Selector.tsx +18 -0
- package/src/SideNav/SideNav.doc.mjs +7 -1
- package/src/SideNav/SideNav.test.tsx +66 -0
- package/src/SideNav/SideNav.tsx +6 -2
- package/src/SideNav/SideNavCollapseButton.tsx +4 -3
- package/src/SideNav/SideNavSection.tsx +6 -4
- package/src/SizeContext/SizeContext.test.tsx +226 -0
- package/src/Slider/Slider.doc.mjs +14 -2
- package/src/Slider/Slider.test.tsx +30 -0
- package/src/Slider/Slider.tsx +20 -0
- package/src/Spinner/Spinner.tsx +1 -0
- package/src/Switch/Switch.doc.mjs +21 -9
- package/src/Switch/Switch.test.tsx +137 -0
- package/src/Switch/Switch.tsx +32 -7
- package/src/TabList/TabList.doc.mjs +3 -3
- package/src/TabList/TabList.test.tsx +185 -1
- package/src/TabList/TabMenu.tsx +45 -9
- package/src/Table/BaseTable.tsx +16 -3
- package/src/Table/Table.test.tsx +87 -0
- package/src/Table/TableBody.tsx +15 -2
- package/src/Table/TableCell.tsx +87 -8
- package/src/Table/TableFooter.tsx +15 -2
- package/src/Table/TableHeader.tsx +15 -2
- package/src/Table/index.ts +5 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +13 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +3 -1
- package/src/Table/plugins/pagination/paginateData.ts +5 -1
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +13 -0
- package/src/Table/plugins/rowExpansion/index.ts +7 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.test.tsx +155 -0
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +590 -0
- package/src/Table/plugins/selection/useTableSelectionState.test.tsx +23 -0
- package/src/Table/plugins/selection/useTableSelectionState.tsx +11 -6
- package/src/Table/plugins/sortable/useTableSortableState.test.tsx +35 -1
- package/src/Table/plugins/sortable/useTableSortableState.tsx +8 -4
- package/src/Table/tableContextMenu.test.tsx +27 -3
- package/src/Table/tableContextMenu.tsx +20 -2
- package/src/Table/useTablePagination.doc.mjs +4 -1
- package/src/Table/useTableRowExpansion.doc.mjs +80 -0
- package/src/Table/useTableSortable.doc.mjs +4 -1
- package/src/Text/Text.doc.mjs +2 -2
- package/src/Text/Text.test.tsx +11 -0
- package/src/Text/Text.tsx +4 -2
- package/src/Text/text.stylex.ts +41 -0
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextArea/TextArea.test.tsx +3 -3
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TextInput/TextInput.test.tsx +3 -3
- package/src/Thumbnail/Thumbnail.test.tsx +36 -2
- package/src/Thumbnail/Thumbnail.tsx +4 -2
- package/src/TimeInput/TimeInput.doc.mjs +11 -6
- package/src/TimeInput/TimeInput.test.tsx +37 -0
- package/src/TimeInput/TimeInput.tsx +11 -1
- package/src/Timestamp/Timestamp.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +52 -0
- package/src/Timestamp/Timestamp.tsx +30 -16
- package/src/Toast/Toast.tsx +11 -3
- package/src/Toast/ToastViewport.test.tsx +64 -0
- package/src/Toast/ToastViewport.tsx +12 -0
- package/src/ToggleButton/ToggleButton.doc.mjs +1 -0
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -4
- package/src/Tokenizer/Tokenizer.test.tsx +33 -0
- package/src/Tokenizer/Tokenizer.tsx +19 -0
- package/src/Toolbar/Toolbar.test.tsx +1 -1
- package/src/TopNav/TopNav.doc.mjs +1 -1
- package/src/TopNav/TopNav.test.tsx +18 -0
- package/src/TopNav/TopNavMegaMenuFeaturedCard.tsx +9 -2
- package/src/TreeList/TreeList.doc.mjs +2 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +19 -0
- package/src/Typeahead/BaseTypeahead.tsx +5 -2
- package/src/Typeahead/Typeahead.doc.mjs +7 -2
- package/src/Typeahead/Typeahead.test.tsx +45 -1
- package/src/__tests__/TestIcon.tsx +26 -0
- package/src/__tests__/fastRoleQueries.ts +66 -0
- package/src/docPropReferences.test.ts +178 -0
- package/src/docs-types.ts +14 -0
- package/src/hooks/focusableSelector.ts +1 -1
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useFocusTrap.doc.mjs +4 -2
- package/src/hooks/useFocusTrap.test.tsx +149 -1
- package/src/hooks/useFocusTrap.ts +50 -1
- package/src/hooks/useHotkeys.doc.mjs +52 -0
- package/src/hooks/useHotkeys.test.ts +245 -0
- package/src/hooks/useHotkeys.ts +203 -0
- package/src/hooks/useInteractiveRole.ts +12 -4
- package/src/hooks/useKeyboardHint.doc.mjs +6 -6
- package/src/hooks/useStreamingText.test.ts +54 -19
- package/src/hooks/useStreamingText.ts +16 -5
- package/src/theme/SyntaxTheme.doc.mjs +4 -4
- package/src/theme/defineTheme.ts +4 -13
- package/src/theme/derivedVarRegistry.test.ts +2 -2
- package/src/theme/expandColorScale.test.ts +29 -0
- package/src/theme/expandColorScale.ts +11 -6
- package/src/theme/hct.ts +9 -17
- package/src/theme/tokens.test.ts +182 -9
- package/src/theme/tokens.ts +239 -4
- package/src/theme/useTheme.test.tsx +20 -0
- package/src/utils/color.test.ts +133 -0
- package/src/utils/color.ts +148 -0
- package/src/utils/composeEventHandlers.test.ts +71 -0
- package/src/utils/composeEventHandlers.ts +44 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/mergeProps.test.ts +166 -0
- package/src/utils/sharedResizeObserver.test.ts +2 -2
- package/src/utils/timeParser.test.ts +13 -0
- package/src/utils/timeParser.ts +8 -5
|
@@ -8,6 +8,10 @@ describe('useStreamingText', () => {
|
|
|
8
8
|
let rafCallbacks: ((time: number) => void)[];
|
|
9
9
|
let originalRAF: typeof requestAnimationFrame;
|
|
10
10
|
let originalCAF: typeof cancelAnimationFrame;
|
|
11
|
+
let originalMatchMedia: typeof window.matchMedia | undefined;
|
|
12
|
+
// Toggled per-test to drive the reduced-motion media query. Reset in
|
|
13
|
+
// beforeEach so the preference never leaks between tests.
|
|
14
|
+
let prefersReducedMotion: boolean;
|
|
11
15
|
|
|
12
16
|
beforeEach(() => {
|
|
13
17
|
rafCallbacks = [];
|
|
@@ -19,33 +23,44 @@ describe('useStreamingText', () => {
|
|
|
19
23
|
});
|
|
20
24
|
globalThis.cancelAnimationFrame = vi.fn();
|
|
21
25
|
|
|
22
|
-
// Mock matchMedia for useTheme → useMediaQuery
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
26
|
+
// Mock matchMedia for useTheme → useMediaQuery and the hook's own
|
|
27
|
+
// reduced-motion read. Only the reduced-motion query reflects
|
|
28
|
+
// `prefersReducedMotion`; theme media queries always report no match.
|
|
29
|
+
prefersReducedMotion = false;
|
|
30
|
+
originalMatchMedia = window.matchMedia;
|
|
31
|
+
Object.defineProperty(window, 'matchMedia', {
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true,
|
|
34
|
+
value: vi.fn().mockImplementation((query: string) => ({
|
|
35
|
+
matches: query.includes('prefers-reduced-motion')
|
|
36
|
+
? prefersReducedMotion
|
|
37
|
+
: false,
|
|
38
|
+
media: query,
|
|
39
|
+
onchange: null,
|
|
40
|
+
addListener: vi.fn(),
|
|
41
|
+
removeListener: vi.fn(),
|
|
42
|
+
addEventListener: vi.fn(),
|
|
43
|
+
removeEventListener: vi.fn(),
|
|
44
|
+
dispatchEvent: vi.fn(),
|
|
45
|
+
})),
|
|
46
|
+
});
|
|
38
47
|
});
|
|
39
48
|
|
|
40
49
|
afterEach(() => {
|
|
41
50
|
globalThis.requestAnimationFrame = originalRAF;
|
|
42
51
|
globalThis.cancelAnimationFrame = originalCAF;
|
|
52
|
+
// Restore matchMedia so the mock never leaks into other suites. jsdom
|
|
53
|
+
// has no matchMedia by default, so drop the property when there was none.
|
|
54
|
+
if (originalMatchMedia === undefined) {
|
|
55
|
+
// @ts-expect-error jsdom leaves matchMedia undefined by default
|
|
56
|
+
delete window.matchMedia;
|
|
57
|
+
} else {
|
|
58
|
+
window.matchMedia = originalMatchMedia;
|
|
59
|
+
}
|
|
43
60
|
});
|
|
44
61
|
|
|
45
62
|
it('returns full text when not streaming', () => {
|
|
46
|
-
const {result} = renderHook(() =>
|
|
47
|
-
useStreamingText('Hello world', false),
|
|
48
|
-
);
|
|
63
|
+
const {result} = renderHook(() => useStreamingText('Hello world', false));
|
|
49
64
|
expect(result.current).toBe('Hello world');
|
|
50
65
|
});
|
|
51
66
|
|
|
@@ -56,6 +71,26 @@ describe('useStreamingText', () => {
|
|
|
56
71
|
expect(result.current).toBe('Hello world');
|
|
57
72
|
});
|
|
58
73
|
|
|
74
|
+
it('snaps to full text immediately when reduced motion is preferred', () => {
|
|
75
|
+
prefersReducedMotion = true;
|
|
76
|
+
const {result} = renderHook(() => useStreamingText('Hello world', true));
|
|
77
|
+
expect(result.current).toBe('Hello world');
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('keeps snapping to the full text on updates when reduced motion is preferred', () => {
|
|
81
|
+
prefersReducedMotion = true;
|
|
82
|
+
const {result, rerender} = renderHook(
|
|
83
|
+
({text}) => useStreamingText(text, true),
|
|
84
|
+
{initialProps: {text: 'Hello'}},
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
expect(result.current).toBe('Hello');
|
|
88
|
+
|
|
89
|
+
// A later chunk arrives — it should appear in full, not reveal char-by-char.
|
|
90
|
+
rerender({text: 'Hello world'});
|
|
91
|
+
expect(result.current).toBe('Hello world');
|
|
92
|
+
});
|
|
93
|
+
|
|
59
94
|
it('starts with empty string when streaming', () => {
|
|
60
95
|
const {result} = renderHook(() => useStreamingText('Hello world', true));
|
|
61
96
|
expect(result.current).toBe('');
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useStreamingText.ts
|
|
7
|
-
* @input Uses React useState, useEffect, useRef, useTheme
|
|
7
|
+
* @input Uses React useState, useEffect, useRef, useMediaQuery, useTheme
|
|
8
8
|
* @output Exports useStreamingText hook for smooth text streaming
|
|
9
9
|
* @position Core hook; smooths bursty streamed text into steady character reveal
|
|
10
10
|
*
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import {useEffect, useMemo, useRef, useState} from 'react';
|
|
26
|
+
import {useMediaQuery} from './useMediaQuery';
|
|
26
27
|
import {useTheme} from '../theme/useTheme';
|
|
27
28
|
|
|
28
29
|
/**
|
|
@@ -71,7 +72,9 @@ const CHARS_PER_TICK = {
|
|
|
71
72
|
* Smooths bursty streamed text into a steady character-by-character reveal.
|
|
72
73
|
*
|
|
73
74
|
* Returns a string that grows steadily toward `targetText`. When `isStreaming`
|
|
74
|
-
* is false, returns the full `targetText` immediately.
|
|
75
|
+
* is false, returns the full `targetText` immediately. When the user prefers
|
|
76
|
+
* reduced motion, the progressive reveal is skipped entirely and the full
|
|
77
|
+
* `targetText` is returned immediately.
|
|
75
78
|
*
|
|
76
79
|
* The hook advances on word and syntax boundaries, avoiding slices inside
|
|
77
80
|
* markdown markers like `**`, backticks, `[]()`, etc. This prevents visual
|
|
@@ -143,9 +146,17 @@ export function useStreamingText(
|
|
|
143
146
|
}
|
|
144
147
|
}
|
|
145
148
|
|
|
149
|
+
// Respect the user's reduced-motion preference — skip the progressive
|
|
150
|
+
// reveal and snap straight to the full text. Uses the package's SSR-safe
|
|
151
|
+
// useMediaQuery (useMediaQuery.ts) so the read stays in sync if the
|
|
152
|
+
// preference changes mid-stream.
|
|
153
|
+
const prefersReducedMotion = useMediaQuery(
|
|
154
|
+
'(prefers-reduced-motion: reduce)',
|
|
155
|
+
);
|
|
156
|
+
|
|
146
157
|
// Animation loop
|
|
147
158
|
useEffect(() => {
|
|
148
|
-
if (!isStreaming || speed === 'instant') {
|
|
159
|
+
if (!isStreaming || speed === 'instant' || prefersReducedMotion) {
|
|
149
160
|
return;
|
|
150
161
|
}
|
|
151
162
|
|
|
@@ -174,9 +185,9 @@ export function useStreamingText(
|
|
|
174
185
|
rafRef.current = null;
|
|
175
186
|
}
|
|
176
187
|
};
|
|
177
|
-
}, [isStreaming, charsPerTick, tickMs, speed]);
|
|
188
|
+
}, [isStreaming, charsPerTick, tickMs, speed, prefersReducedMotion]);
|
|
178
189
|
|
|
179
|
-
if (!isStreaming || speed === 'instant') {
|
|
190
|
+
if (!isStreaming || speed === 'instant' || prefersReducedMotion) {
|
|
180
191
|
return targetText;
|
|
181
192
|
}
|
|
182
193
|
|
|
@@ -50,9 +50,9 @@ export const docs = {
|
|
|
50
50
|
'Syntax themes support light-dark() tuples: each token can have different values for light and dark mode, resolved automatically by the color scheme.',
|
|
51
51
|
},
|
|
52
52
|
{
|
|
53
|
-
guidance:
|
|
53
|
+
guidance: true,
|
|
54
54
|
description:
|
|
55
|
-
'
|
|
55
|
+
'For a single CodeBlock, pass the syntaxTheme prop directly: it is shorthand for wrapping that block in SyntaxTheme. Use the SyntaxTheme wrapper when theming a whole region of code components.',
|
|
56
56
|
},
|
|
57
57
|
],
|
|
58
58
|
},
|
|
@@ -96,9 +96,9 @@ export const docsDense = {
|
|
|
96
96
|
'Syntax themes support light-dark() tuples: each token can have different values for light/dark mode, resolved automatically by color scheme.',
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
|
-
guidance:
|
|
99
|
+
guidance: true,
|
|
100
100
|
description:
|
|
101
|
-
'
|
|
101
|
+
'Single CodeBlock: pass syntaxTheme prop (shorthand for wrapping in SyntaxTheme). Whole region of code components: wrap w/ SyntaxTheme.',
|
|
102
102
|
},
|
|
103
103
|
],
|
|
104
104
|
},
|
package/src/theme/defineTheme.ts
CHANGED
|
@@ -56,14 +56,8 @@ import {
|
|
|
56
56
|
generateTypeScaleComponents,
|
|
57
57
|
type TypeScaleConfig,
|
|
58
58
|
} from './expandTypeScale';
|
|
59
|
-
import {
|
|
60
|
-
|
|
61
|
-
type MotionScaleConfig,
|
|
62
|
-
} from './expandMotionScale';
|
|
63
|
-
import {
|
|
64
|
-
expandRadiusScale,
|
|
65
|
-
type RadiusScaleConfig,
|
|
66
|
-
} from './expandRadiusScale';
|
|
59
|
+
import {expandMotionScale, type MotionScaleConfig} from './expandMotionScale';
|
|
60
|
+
import {expandRadiusScale, type RadiusScaleConfig} from './expandRadiusScale';
|
|
67
61
|
import {expandColorScale, type ColorScaleConfig} from './expandColorScale';
|
|
68
62
|
|
|
69
63
|
import type {DomainTokenName} from './domainTokens';
|
|
@@ -153,10 +147,7 @@ export type StyleOverrides = Record<string, string | Record<string, string>>;
|
|
|
153
147
|
* }
|
|
154
148
|
* ```
|
|
155
149
|
*/
|
|
156
|
-
export type ComponentStyleMap = Record<
|
|
157
|
-
string,
|
|
158
|
-
Record<string, StyleOverrides>
|
|
159
|
-
>;
|
|
150
|
+
export type ComponentStyleMap = Record<string, Record<string, StyleOverrides>>;
|
|
160
151
|
|
|
161
152
|
/** Input to defineTheme */
|
|
162
153
|
export interface DefineThemeInput {
|
|
@@ -287,7 +278,7 @@ export interface DefineThemeInput {
|
|
|
287
278
|
/**
|
|
288
279
|
* Default syntax highlighting theme for code components.
|
|
289
280
|
* Sets --color-syntax-* tokens at the theme root. Can be overridden
|
|
290
|
-
* per-region
|
|
281
|
+
* per-region (or per-instance) by wrapping in SyntaxTheme.
|
|
291
282
|
*
|
|
292
283
|
* @example
|
|
293
284
|
* ```tsx
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
|
|
15
15
|
import {describe, it, expect} from 'vitest';
|
|
16
16
|
import {derivedVarRegistry, getDerivedVars} from './derivedVarRegistry';
|
|
17
|
-
import {readdirSync, readFileSync} from 'fs';
|
|
18
|
-
import {join} from 'path';
|
|
17
|
+
import {readdirSync, readFileSync} from 'node:fs';
|
|
18
|
+
import {join} from 'node:path';
|
|
19
19
|
|
|
20
20
|
const SRC_DIR = join(__dirname, '..');
|
|
21
21
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import {describe, it, expect} from 'vitest';
|
|
4
4
|
import {expandColorScale} from './expandColorScale';
|
|
5
5
|
import {defineTheme} from './defineTheme';
|
|
6
|
+
import {generateThemeRules} from './generateThemeRules';
|
|
6
7
|
|
|
7
8
|
describe('expandColorScale', () => {
|
|
8
9
|
it('produces all expected token keys', () => {
|
|
@@ -60,6 +61,19 @@ describe('expandColorScale', () => {
|
|
|
60
61
|
expect(warm['--color-neutral']).not.toBe(neutral['--color-neutral']);
|
|
61
62
|
});
|
|
62
63
|
|
|
64
|
+
it('emits derived accent tokens as references to --color-accent', () => {
|
|
65
|
+
const tokens = expandColorScale({accent: '#0064E0'});
|
|
66
|
+
// Reference tokens follow a scoped --color-accent override at runtime.
|
|
67
|
+
expect(tokens['--color-text-accent']).toBe('var(--color-accent)');
|
|
68
|
+
expect(tokens['--color-icon-accent']).toBe('var(--color-accent)');
|
|
69
|
+
expect(tokens['--color-accent-muted']).toBe(
|
|
70
|
+
'light-dark(color-mix(in srgb, var(--color-accent) 20%, transparent), color-mix(in srgb, var(--color-accent) 25%, transparent))',
|
|
71
|
+
);
|
|
72
|
+
// The base token and the contrast-computed on-accent stay resolved.
|
|
73
|
+
expect(tokens['--color-accent']).toMatch(/^light-dark\(#/);
|
|
74
|
+
expect(tokens['--color-on-accent']).toMatch(/^light-dark\(#/);
|
|
75
|
+
});
|
|
76
|
+
|
|
63
77
|
it('contrast high produces different --color-text-primary than standard', () => {
|
|
64
78
|
const standard = expandColorScale({
|
|
65
79
|
accent: '#0064E0',
|
|
@@ -81,4 +95,19 @@ describe('expandColorScale + defineTheme integration', () => {
|
|
|
81
95
|
});
|
|
82
96
|
expect(theme.tokens['--color-accent']).toBe('red');
|
|
83
97
|
});
|
|
98
|
+
|
|
99
|
+
it('generated theme CSS keeps the accent references (#3495)', () => {
|
|
100
|
+
const theme = defineTheme({
|
|
101
|
+
name: 'test-accent-refs',
|
|
102
|
+
color: {accent: '#DC2626'},
|
|
103
|
+
});
|
|
104
|
+
const css = generateThemeRules(theme).join('\n');
|
|
105
|
+
expect(css).toContain('--color-text-accent: var(--color-accent);');
|
|
106
|
+
expect(css).toContain('--color-icon-accent: var(--color-accent);');
|
|
107
|
+
expect(css).toContain(
|
|
108
|
+
'--color-accent-muted: light-dark(color-mix(in srgb, var(--color-accent) 20%, transparent), color-mix(in srgb, var(--color-accent) 25%, transparent));',
|
|
109
|
+
);
|
|
110
|
+
// The base token itself stays a resolved color pair.
|
|
111
|
+
expect(css).toMatch(/--color-accent: light-dark\(#/);
|
|
112
|
+
});
|
|
84
113
|
});
|
|
@@ -77,6 +77,10 @@ function ld(light: string, dark: string): string {
|
|
|
77
77
|
return `light-dark(${light}, ${dark})`;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
function accentWithAlpha(alpha: number): string {
|
|
81
|
+
return `color-mix(in srgb, var(--color-accent) ${alpha * 100}%, transparent)`;
|
|
82
|
+
}
|
|
83
|
+
|
|
80
84
|
/**
|
|
81
85
|
* Expand a color scale config into Astryx color token overrides.
|
|
82
86
|
*
|
|
@@ -117,10 +121,11 @@ export function expandColorScale(
|
|
|
117
121
|
return {
|
|
118
122
|
// Core semantic
|
|
119
123
|
'--color-accent': ld(P[40], P[80]),
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
+
// Derived accent tokens reference --color-accent instead of baking its
|
|
125
|
+
// resolved hex, so a scoped override of the base token re-accents the
|
|
126
|
+
// whole subtree at runtime. --color-on-accent stays baked: it is a
|
|
127
|
+
// contrast computation against the accent, which CSS cannot express.
|
|
128
|
+
'--color-accent-muted': ld(accentWithAlpha(0.2), accentWithAlpha(0.25)),
|
|
124
129
|
'--color-on-accent': ld(P[100], P[20]),
|
|
125
130
|
'--color-neutral': ld(hexWithAlpha(N[10], 0.1), hexWithAlpha(N[90], 0.2)),
|
|
126
131
|
'--color-background-surface': ld(N[99], N[10]),
|
|
@@ -146,10 +151,10 @@ export function expandColorScale(
|
|
|
146
151
|
NV[textSecondaryDarkTone],
|
|
147
152
|
),
|
|
148
153
|
'--color-text-disabled': ld(NV[60], NV[40]),
|
|
149
|
-
'--color-text-accent':
|
|
154
|
+
'--color-text-accent': 'var(--color-accent)',
|
|
150
155
|
|
|
151
156
|
// Icon
|
|
152
|
-
'--color-icon-accent':
|
|
157
|
+
'--color-icon-accent': 'var(--color-accent)',
|
|
153
158
|
'--color-icon-primary': ld(N[textPrimaryLightTone], N[textPrimaryDarkTone]),
|
|
154
159
|
'--color-icon-secondary': ld(
|
|
155
160
|
NV[textSecondaryLightTone],
|
package/src/theme/hct.ts
CHANGED
|
@@ -16,6 +16,8 @@
|
|
|
16
16
|
* - Tone from L* (CIE Lightness, 0=black, 100=white)
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import {parseHex, formatHex} from '../utils/color';
|
|
20
|
+
|
|
19
21
|
// =============================================================================
|
|
20
22
|
// Types
|
|
21
23
|
// =============================================================================
|
|
@@ -121,21 +123,11 @@ export function yToTone(y: number): number {
|
|
|
121
123
|
// =============================================================================
|
|
122
124
|
|
|
123
125
|
function hexToRgb(hex: string): [number, number, number] {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
return [
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function rgbToHex(r: number, g: number, b: number): string {
|
|
132
|
-
return (
|
|
133
|
-
'#' +
|
|
134
|
-
[r, g, b]
|
|
135
|
-
.map(c => c.toString(16).padStart(2, '0'))
|
|
136
|
-
.join('')
|
|
137
|
-
.toUpperCase()
|
|
138
|
-
);
|
|
126
|
+
const parsed = parseHex(hex);
|
|
127
|
+
if (parsed === null) {
|
|
128
|
+
return [0, 0, 0];
|
|
129
|
+
}
|
|
130
|
+
return [parsed.r, parsed.g, parsed.b];
|
|
139
131
|
}
|
|
140
132
|
|
|
141
133
|
// =============================================================================
|
|
@@ -181,7 +173,7 @@ export function hctToHex(hct: HCT): string {
|
|
|
181
173
|
}
|
|
182
174
|
if (chroma < 0.5) {
|
|
183
175
|
const gray = toneToGray(tone);
|
|
184
|
-
return
|
|
176
|
+
return formatHex(gray, gray, gray);
|
|
185
177
|
}
|
|
186
178
|
|
|
187
179
|
let lo = 0;
|
|
@@ -241,7 +233,7 @@ function hctComponentToHex(
|
|
|
241
233
|
return null;
|
|
242
234
|
}
|
|
243
235
|
|
|
244
|
-
return
|
|
236
|
+
return formatHex(r, g, bVal);
|
|
245
237
|
}
|
|
246
238
|
|
|
247
239
|
// =============================================================================
|
package/src/theme/tokens.test.ts
CHANGED
|
@@ -20,9 +20,7 @@ const testTheme = defineTheme({
|
|
|
20
20
|
|
|
21
21
|
describe('tokenVar', () => {
|
|
22
22
|
it('returns a CSS var() reference for known token names', () => {
|
|
23
|
-
expect(tokenVar('--color-text-primary')).toBe(
|
|
24
|
-
'var(--color-text-primary)',
|
|
25
|
-
);
|
|
23
|
+
expect(tokenVar('--color-text-primary')).toBe('var(--color-text-primary)');
|
|
26
24
|
});
|
|
27
25
|
|
|
28
26
|
it('returns a CSS var() reference for custom token names', () => {
|
|
@@ -32,9 +30,7 @@ describe('tokenVar', () => {
|
|
|
32
30
|
|
|
33
31
|
describe('tokenVars', () => {
|
|
34
32
|
it('contains var() references for known tokens', () => {
|
|
35
|
-
expect(tokenVars['--color-text-primary']).toBe(
|
|
36
|
-
'var(--color-text-primary)',
|
|
37
|
-
);
|
|
33
|
+
expect(tokenVars['--color-text-primary']).toBe('var(--color-text-primary)');
|
|
38
34
|
expect(tokenVars['--spacing-4']).toBe('var(--spacing-4)');
|
|
39
35
|
});
|
|
40
36
|
});
|
|
@@ -87,9 +83,9 @@ describe('resolveThemeTokens', () => {
|
|
|
87
83
|
|
|
88
84
|
describe('resolveThemeToken', () => {
|
|
89
85
|
it('resolves one token', () => {
|
|
90
|
-
expect(
|
|
91
|
-
|
|
92
|
-
)
|
|
86
|
+
expect(resolveThemeToken(testTheme, '--color-accent', {mode: 'dark'})).toBe(
|
|
87
|
+
'#FF5555',
|
|
88
|
+
);
|
|
93
89
|
});
|
|
94
90
|
|
|
95
91
|
it('returns fallback for unknown token names', () => {
|
|
@@ -107,3 +103,180 @@ describe('resolveThemeToken', () => {
|
|
|
107
103
|
).toBe('');
|
|
108
104
|
});
|
|
109
105
|
});
|
|
106
|
+
|
|
107
|
+
describe('resolveThemeTokens — reference resolution', () => {
|
|
108
|
+
it('resolves a token that references another token to a raw value', () => {
|
|
109
|
+
const theme = defineTheme({
|
|
110
|
+
name: 'ref',
|
|
111
|
+
tokens: {
|
|
112
|
+
'--color-accent': ['#0058D2', '#BBC2FF'],
|
|
113
|
+
'--color-text-accent': 'var(--color-accent)',
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const light = resolveThemeTokens(theme, {mode: 'light'});
|
|
118
|
+
const dark = resolveThemeTokens(theme, {mode: 'dark'});
|
|
119
|
+
|
|
120
|
+
expect(light['--color-text-accent']).toBe('#0058D2');
|
|
121
|
+
expect(dark['--color-text-accent']).toBe('#BBC2FF');
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('resolves reference chains iteratively', () => {
|
|
125
|
+
const theme = defineTheme({
|
|
126
|
+
name: 'chain',
|
|
127
|
+
tokens: {
|
|
128
|
+
'--color-accent': ['#112233', '#445566'],
|
|
129
|
+
'--color-icon-accent': 'var(--color-accent)',
|
|
130
|
+
'--color-text-accent': 'var(--color-icon-accent)',
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const light = resolveThemeTokens(theme, {mode: 'light'});
|
|
135
|
+
expect(light['--color-icon-accent']).toBe('#112233');
|
|
136
|
+
expect(light['--color-text-accent']).toBe('#112233');
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it('uses the var() fallback when the referenced token is unknown', () => {
|
|
140
|
+
const theme = defineTheme({
|
|
141
|
+
name: 'fallback',
|
|
142
|
+
tokens: {
|
|
143
|
+
'--color-text-accent': 'var(--not-a-token, #ABCDEF)',
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
148
|
+
expect(tokens['--color-text-accent']).toBe('#ABCDEF');
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
it('leaves an unresolvable reference as a literal var()', () => {
|
|
152
|
+
const theme = defineTheme({
|
|
153
|
+
name: 'unresolvable',
|
|
154
|
+
tokens: {
|
|
155
|
+
'--color-text-accent': 'var(--not-a-token)',
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
160
|
+
expect(tokens['--color-text-accent']).toBe('var(--not-a-token)');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('does not loop forever on a reference cycle', () => {
|
|
164
|
+
const theme = defineTheme({
|
|
165
|
+
name: 'cycle',
|
|
166
|
+
tokens: {
|
|
167
|
+
'--color-text-accent': 'var(--color-icon-accent)',
|
|
168
|
+
'--color-icon-accent': 'var(--color-text-accent)',
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
173
|
+
// The cycle collapses to a literal reference rather than hanging.
|
|
174
|
+
expect(tokens['--color-text-accent']).toContain('var(');
|
|
175
|
+
expect(tokens['--color-icon-accent']).toContain('var(');
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
describe('resolveThemeTokens — CSS color functions', () => {
|
|
180
|
+
it('evaluates color-mix with transparent to an rgba() value', () => {
|
|
181
|
+
const theme = defineTheme({
|
|
182
|
+
name: 'mix',
|
|
183
|
+
tokens: {
|
|
184
|
+
'--color-accent': ['#0058D2', '#BBC2FF'],
|
|
185
|
+
'--color-accent-muted':
|
|
186
|
+
'color-mix(in srgb, var(--color-accent) 20%, transparent)',
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const light = resolveThemeTokens(theme, {mode: 'light'});
|
|
191
|
+
const dark = resolveThemeTokens(theme, {mode: 'dark'});
|
|
192
|
+
|
|
193
|
+
expect(light['--color-accent-muted']).toBe('rgba(0, 88, 210, 0.2)');
|
|
194
|
+
expect(dark['--color-accent-muted']).toBe('rgba(187, 194, 255, 0.2)');
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('resolves the muted token inside a light-dark() tuple per mode', () => {
|
|
198
|
+
const theme = defineTheme({
|
|
199
|
+
name: 'ld-mix',
|
|
200
|
+
tokens: {
|
|
201
|
+
'--color-accent': ['#FF0000', '#00FF00'],
|
|
202
|
+
'--color-accent-muted': [
|
|
203
|
+
'color-mix(in srgb, var(--color-accent) 20%, transparent)',
|
|
204
|
+
'color-mix(in srgb, var(--color-accent) 25%, transparent)',
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
const light = resolveThemeTokens(theme, {mode: 'light'});
|
|
210
|
+
const dark = resolveThemeTokens(theme, {mode: 'dark'});
|
|
211
|
+
|
|
212
|
+
expect(light['--color-accent-muted']).toBe('rgba(255, 0, 0, 0.2)');
|
|
213
|
+
expect(dark['--color-accent-muted']).toBe('rgba(0, 255, 0, 0.25)');
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('mixes two opaque colors by weight', () => {
|
|
217
|
+
const theme = defineTheme({
|
|
218
|
+
name: 'two-color',
|
|
219
|
+
tokens: {
|
|
220
|
+
'--color-neutral': 'color-mix(in srgb, #000000, #FFFFFF)',
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
225
|
+
expect(tokens['--color-neutral']).toBe('#808080');
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('mixes two opaque colors with an explicit percentage', () => {
|
|
229
|
+
const theme = defineTheme({
|
|
230
|
+
name: 'weighted',
|
|
231
|
+
tokens: {
|
|
232
|
+
'--color-neutral': 'color-mix(in srgb, #000000 25%, #FFFFFF)',
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
237
|
+
expect(tokens['--color-neutral']).toBe('#BFBFBF');
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it('preserves an unsupported color space rather than guessing', () => {
|
|
241
|
+
const theme = defineTheme({
|
|
242
|
+
name: 'oklab',
|
|
243
|
+
tokens: {
|
|
244
|
+
'--color-accent': ['#0058D2', '#BBC2FF'],
|
|
245
|
+
'--color-neutral':
|
|
246
|
+
'color-mix(in oklab, var(--color-accent), black 15%)',
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
const tokens = resolveThemeTokens(theme, {mode: 'light'});
|
|
251
|
+
// var() still resolves; the unsupported mix stays as a color-mix() expression.
|
|
252
|
+
expect(tokens['--color-neutral']).toContain('color-mix(in oklab');
|
|
253
|
+
expect(tokens['--color-neutral']).toContain('#0058D2');
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
describe('resolveThemeTokens — generated themes end to end', () => {
|
|
258
|
+
it('resolves derived accent tokens from defineTheme({color}) to raw values', () => {
|
|
259
|
+
const theme = defineTheme({name: 'brand', color: {accent: '#0064E0'}});
|
|
260
|
+
|
|
261
|
+
const light = resolveThemeTokens(theme, {mode: 'light'});
|
|
262
|
+
const dark = resolveThemeTokens(theme, {mode: 'dark'});
|
|
263
|
+
|
|
264
|
+
const isConcreteColor = (value: string): boolean => /^(#|rgb)/.test(value);
|
|
265
|
+
|
|
266
|
+
for (const key of [
|
|
267
|
+
'--color-accent',
|
|
268
|
+
'--color-text-accent',
|
|
269
|
+
'--color-icon-accent',
|
|
270
|
+
'--color-accent-muted',
|
|
271
|
+
]) {
|
|
272
|
+
expect(isConcreteColor(light[key])).toBe(true);
|
|
273
|
+
expect(isConcreteColor(dark[key])).toBe(true);
|
|
274
|
+
expect(light[key]).not.toContain('var(');
|
|
275
|
+
expect(light[key]).not.toContain('color-mix');
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// The derived accent tokens resolve to the base accent.
|
|
279
|
+
expect(light['--color-text-accent']).toBe(light['--color-accent']);
|
|
280
|
+
expect(light['--color-icon-accent']).toBe(light['--color-accent']);
|
|
281
|
+
});
|
|
282
|
+
});
|