@astryxdesign/core 0.5.0 → 0.5.1-canary.f64186a
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 +222 -0
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AspectRatio/AspectRatio.d.ts +6 -6
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +43 -9
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +5 -2
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +11 -7
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +26 -2
- package/dist/Banner/Banner.d.ts +10 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +11 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +8 -7
- package/dist/Calendar/Calendar.d.ts +4 -2
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +15 -21
- package/dist/Calendar/hooks/useCalendarDays.js +4 -6
- package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
- package/dist/Calendar/styles.d.ts +5 -20
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -17
- package/dist/Card/Card.d.ts +12 -12
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +17 -9
- package/dist/Card/index.d.ts +35 -1
- package/dist/Card/index.d.ts.map +1 -1
- package/dist/Card/index.js +21 -1
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +108 -7
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +7 -1
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +2 -7
- package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -7
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -5
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +5 -3
- package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
- package/dist/DateInput/MonthYearWheels.js +6 -4
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +52 -25
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +1 -0
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateRangeInput/DateRangeInput.d.ts +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +3 -5
- package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +35 -10
- package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
- package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
- package/dist/Dialog/Dialog.d.ts +16 -2
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +28 -7
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/Field/InputClearButton.d.ts +9 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +14 -3
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +0 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +14 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -1
- package/dist/Icon/Icon.d.ts +4 -2
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/defaultIcons.d.ts +3 -2
- package/dist/Icon/defaultIcons.d.ts.map +1 -1
- package/dist/Icon/defaultIcons.js +7 -0
- package/dist/Icon/globalIconRegistry.d.ts +13 -0
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +34 -6
- package/dist/Icon/index.d.ts +1 -1
- package/dist/Icon/index.d.ts.map +1 -1
- package/dist/Icon/useIcon.d.ts +5 -2
- package/dist/Icon/useIcon.d.ts.map +1 -1
- package/dist/Icon/useIcon.js +3 -0
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +2 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -26
- package/dist/Layer/gestureCounter.d.ts +8 -0
- package/dist/Layer/gestureCounter.d.ts.map +1 -0
- package/dist/Layer/gestureCounter.js +53 -0
- package/dist/Layer/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +146 -24
- package/dist/List/List.d.ts +1 -1
- package/dist/List/List.d.ts.map +1 -1
- package/dist/List/List.js +15 -4
- package/dist/Markdown/Markdown.d.ts +1 -1
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +20 -7
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +5 -3
- package/dist/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +4 -1
- package/dist/MultiSelector/MultiSelector.d.ts +18 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +58 -11
- package/dist/MultiSelector/hooks.d.ts +7 -1
- package/dist/MultiSelector/hooks.d.ts.map +1 -1
- package/dist/MultiSelector/hooks.js +3 -2
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
- package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
- package/dist/NavItem/navItemStyles.stylex.js +0 -2
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +7 -4
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +95 -126
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +2 -3
- package/dist/OverflowList/OverflowList.d.ts +41 -1
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +43 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +8 -14
- package/dist/Popover/usePopover.d.ts +15 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +26 -7
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +4 -2
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/useResizable.d.ts +19 -1
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +104 -38
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +9 -0
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +92 -21
- package/dist/Selector/hooks.d.ts +7 -1
- package/dist/Selector/hooks.d.ts.map +1 -1
- package/dist/Selector/hooks.js +3 -2
- package/dist/SideNav/SideNav.d.ts +6 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +57 -27
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +5 -4
- package/dist/SideNav/SideNavItem.d.ts +29 -4
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +75 -20
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +34 -2
- package/dist/Spinner/Spinner.d.ts +3 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +199 -20
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +7 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +5 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +6 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts +26 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +34 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +25 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +0 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -8
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +10 -18
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +10 -5
- package/dist/Toast/Toast.d.ts +17 -2
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +77 -11
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +76 -21
- package/dist/Toast/index.d.ts +1 -1
- package/dist/Toast/index.d.ts.map +1 -1
- package/dist/Toast/types.d.ts +38 -0
- package/dist/Toast/types.d.ts.map +1 -1
- package/dist/Toast/useToastGesture.d.ts +26 -0
- package/dist/Toast/useToastGesture.d.ts.map +1 -0
- package/dist/Toast/useToastGesture.js +223 -0
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +23 -12
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +5 -2
- package/dist/Tokenizer/Tokenizer.d.ts +12 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +31 -21
- package/dist/TopNav/TopNavHeading.js +2 -2
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -3
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +30 -9
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +21 -6
- package/dist/TreeList/TreeList.d.ts +1 -1
- package/dist/TreeList/TreeList.d.ts.map +1 -1
- package/dist/TreeList/TreeList.js +7 -2
- package/dist/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +2 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +51 -8
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +2 -0
- package/dist/Typeahead/TypeaheadItem.d.ts +1 -1
- package/dist/Typeahead/TypeaheadItem.d.ts.map +1 -1
- package/dist/Typeahead/TypeaheadItem.js +7 -2
- package/dist/astryx.css +87 -22
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -25
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +14 -4
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- package/dist/theme/defineTheme.d.ts +9 -3
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +5 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/generateThemeRules.d.ts +21 -0
- package/dist/theme/generateThemeRules.d.ts.map +1 -1
- package/dist/theme/generateThemeRules.js +26 -0
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +6 -7
- package/dist/utils/dateParser.d.ts +5 -8
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +10 -11
- package/dist/utils/focusOutline.stylex.d.ts +25 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.js +15 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
- package/dist/utils/interactionOverlay.stylex.js +42 -0
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/plainDate.d.ts +11 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +20 -4
- package/locales/af-ZA.json +7 -7
- package/locales/ar-SA.json +7 -7
- package/locales/ca-ES.json +6 -6
- package/locales/cs-CZ.json +7 -7
- package/locales/da-DK.json +7 -7
- package/locales/de-DE.json +7 -7
- package/locales/el-GR.json +7 -7
- package/locales/en.json +178 -6
- package/locales/es-ES.json +6 -6
- package/locales/fi-FI.json +7 -7
- package/locales/fr-FR.json +7 -7
- package/locales/he-IL.json +7 -7
- package/locales/hu-HU.json +7 -7
- package/locales/it-IT.json +7 -7
- package/locales/ja-JP.json +7 -7
- package/locales/ko-KR.json +7 -7
- package/locales/nl-NL.json +7 -7
- package/locales/no-NO.json +7 -7
- package/locales/pl-PL.json +7 -7
- package/locales/pseudo.json +130 -1
- package/locales/pt-BR.json +7 -7
- package/locales/pt-PT.json +7 -7
- package/locales/ro-RO.json +7 -7
- package/locales/ru-RU.json +7 -7
- package/locales/sr-SP.json +7 -7
- package/locales/sv-SE.json +7 -7
- package/locales/tr-TR.json +7 -7
- package/locales/uk-UA.json +7 -7
- package/locales/vi-VN.json +7 -7
- package/locales/zh-CN.json +7 -7
- package/locales/zh-TW.json +7 -7
- package/package.json +4 -5
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AspectRatio/AspectRatio.doc.mjs +3 -3
- package/src/AspectRatio/AspectRatio.tsx +6 -6
- package/src/Avatar/Avatar.doc.mjs +12 -2
- package/src/Avatar/Avatar.test.tsx +80 -0
- package/src/Avatar/Avatar.tsx +64 -14
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +12 -4
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
- package/src/Badge/Badge.doc.mjs +3 -2
- package/src/Badge/Badge.test.tsx +32 -3
- package/src/Badge/Badge.tsx +42 -1
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +76 -11
- package/src/Banner/Banner.tsx +21 -2
- package/src/Button/Button.doc.mjs +2 -1
- package/src/Button/Button.test.tsx +19 -4
- package/src/Button/Button.tsx +9 -29
- package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
- package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
- package/src/Calendar/Calendar.doc.mjs +3 -3
- package/src/Calendar/Calendar.test.tsx +112 -0
- package/src/Calendar/Calendar.tsx +18 -16
- package/src/Calendar/hooks/useCalendarDays.ts +4 -4
- package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
- package/src/Calendar/styles.ts +48 -42
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +113 -19
- package/src/Card/Card.tsx +67 -89
- package/src/Card/index.ts +36 -1
- package/src/Carousel/Carousel.doc.mjs +3 -0
- package/src/Carousel/Carousel.test.tsx +360 -0
- package/src/Carousel/Carousel.tsx +116 -15
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +5 -0
- package/src/CodeBlock/CodeBlock.doc.mjs +10 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteItem.tsx +2 -12
- package/src/ComplexSelector/ComplexSelector.doc.mjs +7 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
- package/src/ComplexSelector/ComplexSelector.tsx +22 -12
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.test.tsx +9 -4
- package/src/DateInput/DateInput.tsx +54 -3
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/MonthScroller.tsx +5 -1
- package/src/DateInput/MonthYearWheels.tsx +7 -4
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +83 -33
- package/src/DateInput/Wheel.tsx +1 -0
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
- package/src/DateRangeInput/DateRangeInput.tsx +8 -13
- package/src/DateTimeInput/DateTimeInput.doc.mjs +38 -21
- package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
- package/src/DateTimeInput/DateTimeInput.tsx +54 -20
- package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
- package/src/Dialog/Dialog.test.tsx +185 -18
- package/src/Dialog/Dialog.tsx +35 -11
- package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/Field/InputClearButton.test.tsx +15 -1
- package/src/Field/InputClearButton.tsx +28 -4
- package/src/Heading/Heading.tsx +0 -1
- package/src/HoverCard/HoverCard.doc.mjs +8 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +137 -3
- package/src/HoverCard/useHoverCard.tsx +23 -3
- package/src/Icon/Icon.test.tsx +55 -1
- package/src/Icon/Icon.tsx +5 -3
- package/src/Icon/defaultIcons.tsx +11 -2
- package/src/Icon/globalIconRegistry.test.tsx +16 -3
- package/src/Icon/globalIconRegistry.tsx +37 -6
- package/src/Icon/index.ts +1 -0
- package/src/Icon/useIcon.ts +9 -2
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +2 -7
- package/src/Kbd/Kbd.test.tsx +0 -17
- package/src/Kbd/Kbd.tsx +2 -26
- package/src/Layer/gestureCounter.ts +57 -0
- package/src/Layer/useLayer.test.tsx +368 -16
- package/src/Layer/useLayer.tsx +208 -35
- package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- package/src/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- package/src/Markdown/parser.test.ts +33 -0
- package/src/Markdown/parser.ts +9 -3
- package/src/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- package/src/MultiSelector/MultiSelector.doc.mjs +22 -1
- package/src/MultiSelector/MultiSelector.test.tsx +205 -0
- package/src/MultiSelector/MultiSelector.tsx +103 -16
- package/src/MultiSelector/hooks.ts +9 -2
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavItem/navItemStyles.stylex.ts +0 -8
- package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +7 -4
- package/src/NumberInput/NumberInput.doc.mjs +26 -7
- package/src/NumberInput/NumberInput.test.tsx +563 -8
- package/src/NumberInput/NumberInput.tsx +77 -131
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +2 -4
- package/src/OverflowList/OverflowList.doc.mjs +102 -21
- package/src/OverflowList/OverflowList.test.tsx +550 -4
- package/src/OverflowList/OverflowList.tsx +100 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/Popover.doc.mjs +2 -2
- package/src/Popover/Popover.test.tsx +38 -0
- package/src/Popover/Popover.tsx +28 -66
- package/src/Popover/usePopover.tsx +44 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
- package/src/PowerSearch/formatFilterValue.test.ts +16 -1
- package/src/PowerSearch/formatFilterValue.ts +2 -0
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/Resizable.doc.mjs +2 -2
- package/src/Resizable/useResizable.doc.mjs +21 -2
- package/src/Resizable/useResizable.test.ts +421 -0
- package/src/Resizable/useResizable.ts +133 -48
- package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +16 -0
- package/src/Selector/Selector.doc.mjs +14 -0
- package/src/Selector/Selector.source-build.test.mjs +65 -0
- package/src/Selector/Selector.test.tsx +301 -0
- package/src/Selector/Selector.tsx +145 -32
- package/src/Selector/hooks.ts +17 -2
- package/src/SideNav/SideNav.doc.mjs +2 -2
- package/src/SideNav/SideNav.test.tsx +1069 -6
- package/src/SideNav/SideNav.tsx +109 -38
- package/src/SideNav/SideNavHeading.tsx +5 -2
- package/src/SideNav/SideNavItem.doc.mjs +24 -3
- package/src/SideNav/SideNavItem.tsx +134 -44
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +52 -1
- package/src/Spinner/Spinner.doc.mjs +17 -5
- package/src/Spinner/Spinner.test.tsx +164 -0
- package/src/Spinner/Spinner.tsx +252 -22
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +1 -1
- package/src/Stepper/Step.tsx +7 -14
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +3 -0
- package/src/Table/BaseTable.tsx +6 -1
- package/src/Table/Table.doc.mjs +5 -3
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +2 -2
- package/src/Table/TableFooter.doc.mjs +1 -1
- package/src/Table/TableHeader.doc.mjs +1 -1
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +50 -4
- package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/useTableGroupedRows.doc.mjs +3 -3
- package/src/Table/useTablePagination.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +1 -1
- package/src/Text/Text.test.tsx +44 -0
- package/src/Text/Text.tsx +0 -1
- package/src/TextArea/TextArea.doc.mjs +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +34 -22
- package/src/Timestamp/Timestamp.test.tsx +89 -0
- package/src/Timestamp/Timestamp.tsx +8 -8
- package/src/Timestamp/formatInstant.ts +5 -0
- package/src/Toast/Toast.doc.mjs +213 -44
- package/src/Toast/Toast.tsx +118 -23
- package/src/Toast/ToastViewport.test.tsx +1434 -8
- package/src/Toast/ToastViewport.tsx +85 -14
- package/src/Toast/index.ts +2 -0
- package/src/Toast/types.ts +43 -5
- package/src/Toast/useToastGesture.ts +361 -0
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +19 -17
- package/src/Token/TokenLink.tsx +12 -3
- package/src/Tokenizer/Tokenizer.doc.mjs +16 -3
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +49 -24
- package/src/TopNav/TopNavHeading.tsx +2 -2
- package/src/TopNav/TopNavItem.tsx +3 -7
- package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -4
- package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -5
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/TreeList/TreeListItem.tsx +2 -7
- package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
- package/src/Typeahead/BaseTypeahead.tsx +96 -6
- package/src/Typeahead/Typeahead.doc.mjs +6 -0
- package/src/Typeahead/Typeahead.test.tsx +154 -0
- package/src/Typeahead/Typeahead.tsx +9 -0
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- package/src/hooks/useHotkeys.test.ts +0 -18
- package/src/hooks/useHotkeys.ts +3 -25
- package/src/hooks/useIndicatorFocusRing.doc.mjs +104 -0
- package/src/hooks/useInputStatusIcon.doc.mjs +142 -0
- package/src/hooks/useInteractiveRole.doc.mjs +119 -0
- package/src/hooks/useLongPress.doc.mjs +123 -0
- package/src/hooks/useOverflow.doc.mjs +58 -17
- package/src/hooks/useOverflow.ts +16 -4
- package/src/hooks/useTypeahead.doc.mjs +153 -0
- package/src/index.ts +2 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/Theme.test.tsx +104 -2
- package/src/theme/Theme.tsx +49 -14
- package/src/theme/defineTheme.test.ts +23 -0
- package/src/theme/defineTheme.ts +12 -3
- package/src/theme/derivedVarRegistry.test.ts +87 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +99 -1
- package/src/theme/generateThemeRules.ts +28 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/theme/useTheme.test.tsx +10 -0
- package/src/theme/useTheme.ts +16 -10
- package/src/utils/dateParser.test.ts +34 -2
- package/src/utils/dateParser.ts +11 -14
- package/src/utils/focusOutline.stylex.ts +50 -0
- package/src/utils/interactionOverlay.stylex.ts +74 -0
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/plainDate.test.ts +46 -0
- package/src/utils/plainDate.ts +18 -3
package/src/hooks/useOverflow.ts
CHANGED
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* @position Core hook; used by OverflowList and consumers for overflow patterns
|
|
10
10
|
*
|
|
11
11
|
* Measures children rendered in a hidden container to determine how many fit
|
|
12
|
-
* in the available width, without flickering.
|
|
13
|
-
*
|
|
12
|
+
* in the available width, without flickering. Observes both the visible and
|
|
13
|
+
* hidden measurement containers so changes to available width or measured child
|
|
14
|
+
* sizes recalculate the result. Supports an optional item cap (`maxVisibleItems`)
|
|
14
15
|
* and bounded multi-row wrapping (`maxRows`); the fit/clamp/row-packing math
|
|
15
16
|
* lives in the pure `computeOverflow` helper.
|
|
16
17
|
*
|
|
@@ -136,6 +137,7 @@ export function useOverflow(
|
|
|
136
137
|
const containerElRef = useRef<HTMLElement | null>(null);
|
|
137
138
|
const measureElRef = useRef<HTMLElement | null>(null);
|
|
138
139
|
const observedElRef = useRef<HTMLElement | null>(null);
|
|
140
|
+
const observedMeasureElRef = useRef<HTMLElement | null>(null);
|
|
139
141
|
|
|
140
142
|
const calculate = useCallback(() => {
|
|
141
143
|
const container = containerElRef.current;
|
|
@@ -236,10 +238,20 @@ export function useOverflow(
|
|
|
236
238
|
|
|
237
239
|
const measureRef = useCallback(
|
|
238
240
|
(el: HTMLElement | null) => {
|
|
241
|
+
if (observedMeasureElRef.current) {
|
|
242
|
+
unobserveResize(observedMeasureElRef.current);
|
|
243
|
+
observedMeasureElRef.current = null;
|
|
244
|
+
}
|
|
245
|
+
|
|
239
246
|
measureElRef.current = el;
|
|
240
|
-
if (el) {
|
|
241
|
-
|
|
247
|
+
if (!el) {
|
|
248
|
+
return;
|
|
242
249
|
}
|
|
250
|
+
|
|
251
|
+
observeResize(el, () => {
|
|
252
|
+
calculate();
|
|
253
|
+
});
|
|
254
|
+
observedMeasureElRef.current = el;
|
|
243
255
|
},
|
|
244
256
|
[calculate],
|
|
245
257
|
);
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/** @type {import('@astryxdesign/cli/authoring').HookDoc} */
|
|
4
|
+
export const docs = {
|
|
5
|
+
name: 'useTypeahead',
|
|
6
|
+
displayName: 'useTypeahead',
|
|
7
|
+
keywords: [
|
|
8
|
+
'typeahead',
|
|
9
|
+
'type to focus',
|
|
10
|
+
'first character',
|
|
11
|
+
'keyboard',
|
|
12
|
+
'search',
|
|
13
|
+
'jump',
|
|
14
|
+
'menu',
|
|
15
|
+
'listbox',
|
|
16
|
+
'select',
|
|
17
|
+
'apg',
|
|
18
|
+
'accessibility',
|
|
19
|
+
'a11y',
|
|
20
|
+
],
|
|
21
|
+
params: [
|
|
22
|
+
{
|
|
23
|
+
name: 'options',
|
|
24
|
+
type: 'UseTypeaheadOptions',
|
|
25
|
+
description: 'Configuration object.',
|
|
26
|
+
required: true,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: 'options.getItemLabels',
|
|
30
|
+
type: '() => ReadonlyArray<string | null | undefined>',
|
|
31
|
+
description:
|
|
32
|
+
"Returns the item labels in DOM order. A null or empty entry marks a non-matchable slot and keeps indices aligned with the caller's items.",
|
|
33
|
+
required: true,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: 'options.onMatch',
|
|
37
|
+
type: '(index: number) => void',
|
|
38
|
+
description:
|
|
39
|
+
"Called with the index of the matched item so the caller can focus or select it; typically useListFocus's focusItem.",
|
|
40
|
+
required: true,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'options.getCurrentIndex',
|
|
44
|
+
type: '() => number',
|
|
45
|
+
description:
|
|
46
|
+
'The index to search from, usually the focused item, so repeated presses of one letter cycle through matches. A negative value means nothing is current.',
|
|
47
|
+
default: '() => -1',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'options.resetMs',
|
|
51
|
+
type: 'number',
|
|
52
|
+
description:
|
|
53
|
+
'Milliseconds of inactivity after which the typed buffer resets.',
|
|
54
|
+
default: '750',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'options.isDisabled',
|
|
58
|
+
type: '(index: number) => boolean',
|
|
59
|
+
description: 'Whether an index should be skipped, e.g. disabled items.',
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
returns: [
|
|
63
|
+
{
|
|
64
|
+
name: 'onKeyDown',
|
|
65
|
+
type: '(e: React.KeyboardEvent | KeyboardEvent) => boolean',
|
|
66
|
+
description:
|
|
67
|
+
'Keydown handler. Returns true when it consumed a printable character, so the caller can stop its own key handling.',
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'reset',
|
|
71
|
+
type: '() => void',
|
|
72
|
+
description:
|
|
73
|
+
'Clears the pending buffer, e.g. when the collection closes.',
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
usage: {
|
|
77
|
+
description:
|
|
78
|
+
"Adds APG type-to-focus search to a collection: printable keystrokes are buffered (resetting after a pause), and the first item whose label starts with the buffer is reported through onMatch. Pressing the same letter repeatedly cycles through the matches rather than filtering deeper. It moves nothing itself; pair it with the collection's own focus management, most often useListFocus or useGridFocus.",
|
|
79
|
+
bestPractices: [
|
|
80
|
+
{
|
|
81
|
+
guidance: true,
|
|
82
|
+
description:
|
|
83
|
+
'Wire onMatch to the focus manager you already have (useListFocus.focusItem) instead of moving focus yourself.',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
guidance: true,
|
|
87
|
+
description:
|
|
88
|
+
'Let it see the key event first and fall through to arrow-key navigation only when it returns false.',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
guidance: true,
|
|
92
|
+
description:
|
|
93
|
+
'Pass getCurrentIndex so repeated presses of one letter walk through matches instead of sticking on the first.',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
guidance: false,
|
|
97
|
+
description:
|
|
98
|
+
'Use it on a text input; the field already receives the characters, and typeahead would fight the value.',
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
relatedComponents: ['DropdownMenu', 'Selector', 'TreeList'],
|
|
103
|
+
relatedHooks: ['useListFocus', 'useGridFocus', 'useTreeFocus'],
|
|
104
|
+
importPath: '@astryxdesign/core/hooks',
|
|
105
|
+
category: 'focus',
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/** @type {import('@astryxdesign/cli/authoring').HookTranslationDoc} */
|
|
109
|
+
export const docsDense = {
|
|
110
|
+
description:
|
|
111
|
+
'APG type-to-focus search for a collection. Buffers printable keys (resets after pause), matches labels by prefix, reports index via onMatch. Same letter pressed repeatedly cycles matches. Moves nothing itself; pair w/ useListFocus / useGridFocus.',
|
|
112
|
+
paramDescriptions: {
|
|
113
|
+
options: 'config.',
|
|
114
|
+
'options.getItemLabels':
|
|
115
|
+
'item labels in DOM order; null / empty = non-matchable slot, indices stay aligned.',
|
|
116
|
+
'options.onMatch':
|
|
117
|
+
'called w/ matched index so caller focuses / selects (e.g. useListFocus focusItem).',
|
|
118
|
+
'options.getCurrentIndex':
|
|
119
|
+
'index to search from (usually focused item) so repeat presses cycle. negative = nothing current.',
|
|
120
|
+
'options.resetMs': 'ms of inactivity before typed buffer resets.',
|
|
121
|
+
'options.isDisabled': 'whether an index is skipped (e.g. disabled items).',
|
|
122
|
+
},
|
|
123
|
+
returnDescriptions: {
|
|
124
|
+
onKeyDown:
|
|
125
|
+
'keydown handler; true = consumed a printable char, caller can stop its own handling.',
|
|
126
|
+
reset: 'clears pending buffer (e.g. on close).',
|
|
127
|
+
},
|
|
128
|
+
usage: {
|
|
129
|
+
description:
|
|
130
|
+
'Type-to-jump for menus / listboxes / trees. Buffered prefix match w/ APG same-letter cycling; reports index, caller owns focus.',
|
|
131
|
+
bestPractices: [
|
|
132
|
+
{
|
|
133
|
+
guidance: true,
|
|
134
|
+
description:
|
|
135
|
+
'Wire onMatch to existing focus manager (useListFocus.focusItem), do not move focus yourself.',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
guidance: true,
|
|
139
|
+
description:
|
|
140
|
+
'Give it the key event first; fall through to arrow navigation when it returns false.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
guidance: true,
|
|
144
|
+
description:
|
|
145
|
+
'Pass getCurrentIndex so repeat presses walk matches instead of sticking on first.',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
guidance: false,
|
|
149
|
+
description: 'Use on a text input; field already gets the characters.',
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
},
|
|
153
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Ambient module declaration for Vite's `?raw` imports.
|
|
5
|
+
*
|
|
6
|
+
* numberParser.docblock.test.ts reads its own subject's source as text, to
|
|
7
|
+
* check the prose in it against the parser's behaviour. Vite serves that with
|
|
8
|
+
* the `?raw` query; without this declaration TypeScript fails with TS2307.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
declare module '*?raw' {
|
|
12
|
+
const content: string;
|
|
13
|
+
export default content;
|
|
14
|
+
}
|
package/src/theme/Theme.test.tsx
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
2
|
|
|
3
|
-
import {describe, it, expect, beforeEach, afterEach} from 'vitest';
|
|
3
|
+
import {describe, it, expect, beforeEach, afterEach, vi} from 'vitest';
|
|
4
4
|
import {render, cleanup} from '@testing-library/react';
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import {Theme} from './Theme';
|
|
7
7
|
import {defineTheme} from './defineTheme';
|
|
8
|
+
import {dataTokenDefaults} from './domainTokens';
|
|
9
|
+
import type * as DefineThemeModule from './defineTheme';
|
|
10
|
+
|
|
11
|
+
const {generateThemeCSSSpy} = vi.hoisted(() => ({
|
|
12
|
+
generateThemeCSSSpy: vi.fn(),
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
vi.mock('./defineTheme', async importOriginal => {
|
|
16
|
+
const actual = await importOriginal<typeof DefineThemeModule>();
|
|
17
|
+
generateThemeCSSSpy.mockImplementation(actual.generateThemeCSS);
|
|
18
|
+
return {...actual, generateThemeCSS: generateThemeCSSSpy};
|
|
19
|
+
});
|
|
8
20
|
|
|
9
21
|
const testTheme = defineTheme({
|
|
10
22
|
name: 'test',
|
|
@@ -25,6 +37,7 @@ describe('Theme', () => {
|
|
|
25
37
|
// Clean up documentElement state before each test
|
|
26
38
|
document.documentElement.removeAttribute('data-theme');
|
|
27
39
|
document.documentElement.removeAttribute('data-astryx-theme');
|
|
40
|
+
generateThemeCSSSpy.mockClear();
|
|
28
41
|
});
|
|
29
42
|
|
|
30
43
|
afterEach(() => {
|
|
@@ -120,7 +133,9 @@ describe('Theme', () => {
|
|
|
120
133
|
'test',
|
|
121
134
|
);
|
|
122
135
|
unmount();
|
|
123
|
-
expect(document.documentElement.hasAttribute('data-astryx-theme')).toBe(
|
|
136
|
+
expect(document.documentElement.hasAttribute('data-astryx-theme')).toBe(
|
|
137
|
+
false,
|
|
138
|
+
);
|
|
124
139
|
});
|
|
125
140
|
|
|
126
141
|
// =========================================================================
|
|
@@ -166,4 +181,91 @@ describe('Theme', () => {
|
|
|
166
181
|
expect(nestedWrapper).toBeTruthy();
|
|
167
182
|
expect(nestedWrapper?.getAttribute('data-theme')).toBe('light');
|
|
168
183
|
});
|
|
184
|
+
|
|
185
|
+
// =========================================================================
|
|
186
|
+
// Data token defaults — one shared :root block, not one per theme scope
|
|
187
|
+
// =========================================================================
|
|
188
|
+
|
|
189
|
+
const baseTags = () =>
|
|
190
|
+
Array.from(document.head.querySelectorAll('style[data-astryx-theme-base]'));
|
|
191
|
+
|
|
192
|
+
it('injects the data token defaults into @layer astryx-base', () => {
|
|
193
|
+
render(
|
|
194
|
+
<Theme theme={testTheme}>
|
|
195
|
+
<span>child</span>
|
|
196
|
+
</Theme>,
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
expect(baseTags()).toHaveLength(1);
|
|
200
|
+
const css = baseTags()[0].textContent ?? '';
|
|
201
|
+
expect(css).toContain('@layer astryx-base {');
|
|
202
|
+
expect(css).toContain(':root {');
|
|
203
|
+
expect(css).toContain(
|
|
204
|
+
`--color-data-categorical-blue: ${dataTokenDefaults['--color-data-categorical-blue']};`,
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('injects one shared block for nested themes, not one per scope', () => {
|
|
209
|
+
render(
|
|
210
|
+
<Theme theme={testTheme}>
|
|
211
|
+
<Theme theme={altTheme}>
|
|
212
|
+
<span>nested</span>
|
|
213
|
+
</Theme>
|
|
214
|
+
</Theme>,
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
expect(baseTags()).toHaveLength(1);
|
|
218
|
+
|
|
219
|
+
// The nested theme declares no --color-data-* of its own, so nothing
|
|
220
|
+
// shadows a value the parent theme set: that is what lets the override
|
|
221
|
+
// inherit through the ordinary cascade.
|
|
222
|
+
const themeTags = Array.from(
|
|
223
|
+
document.head.querySelectorAll('style[data-astryx-theme]'),
|
|
224
|
+
);
|
|
225
|
+
for (const tag of themeTags) {
|
|
226
|
+
expect(tag.textContent).not.toContain('--color-data-');
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it('keeps the defaults while any theme is still mounted', () => {
|
|
231
|
+
const outer = render(
|
|
232
|
+
<Theme theme={testTheme}>
|
|
233
|
+
<span>a</span>
|
|
234
|
+
</Theme>,
|
|
235
|
+
);
|
|
236
|
+
render(
|
|
237
|
+
<Theme theme={altTheme}>
|
|
238
|
+
<span>b</span>
|
|
239
|
+
</Theme>,
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
outer.unmount();
|
|
243
|
+
expect(baseTags()).toHaveLength(1);
|
|
244
|
+
|
|
245
|
+
cleanup();
|
|
246
|
+
expect(baseTags()).toHaveLength(0);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('generates a theme once across nested and sibling mounts', () => {
|
|
250
|
+
render(
|
|
251
|
+
<Theme theme={testTheme}>
|
|
252
|
+
<Theme theme={testTheme}>
|
|
253
|
+
<span>nested</span>
|
|
254
|
+
</Theme>
|
|
255
|
+
</Theme>,
|
|
256
|
+
);
|
|
257
|
+
render(
|
|
258
|
+
<Theme theme={testTheme}>
|
|
259
|
+
<span>sibling</span>
|
|
260
|
+
</Theme>,
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
expect(generateThemeCSSSpy).toHaveBeenCalledTimes(1);
|
|
264
|
+
expect(baseTags()).toHaveLength(1);
|
|
265
|
+
|
|
266
|
+
const injected = Array.from(document.querySelectorAll('style'))
|
|
267
|
+
.map(tag => tag.textContent ?? '')
|
|
268
|
+
.join('\n');
|
|
269
|
+
expect(injected.match(/:root\s*\{/g)).toHaveLength(1);
|
|
270
|
+
});
|
|
169
271
|
});
|
package/src/theme/Theme.tsx
CHANGED
|
@@ -42,6 +42,7 @@ import * as stylex from '@stylexjs/stylex';
|
|
|
42
42
|
import type {ThemeMode} from './types';
|
|
43
43
|
import {colorVars, typographyVars} from './tokens.stylex';
|
|
44
44
|
import {generateThemeCSS, type DefinedTheme} from './defineTheme';
|
|
45
|
+
import {generateDataTokenDefaultsCSS} from './generateThemeRules';
|
|
45
46
|
import {registerTheme} from './themeRegistry';
|
|
46
47
|
import {dataAttr} from '../naming';
|
|
47
48
|
import {ThemeContext} from './useTheme';
|
|
@@ -98,6 +99,16 @@ ThemeNestingContext.displayName = 'ThemeNestingContext';
|
|
|
98
99
|
/** Track which themes have already been injected */
|
|
99
100
|
const injectedThemes = new Set<string>();
|
|
100
101
|
|
|
102
|
+
/**
|
|
103
|
+
* How many mounted `Theme`s are relying on the injected data-token defaults.
|
|
104
|
+
*
|
|
105
|
+
* The defaults are one document-wide `:root` block, shared by every theme, so
|
|
106
|
+
* they are injected once and removed only when the last theme that took a
|
|
107
|
+
* reference unmounts — tearing them down with whichever provider happened to
|
|
108
|
+
* inject them would strip the palette from the providers still mounted.
|
|
109
|
+
*/
|
|
110
|
+
let dataTokenDefaultsRefCount = 0;
|
|
111
|
+
|
|
101
112
|
/**
|
|
102
113
|
* Hook to inject theme CSS into the document.
|
|
103
114
|
* Built themes (from `astryx theme build`) skip injection — their CSS
|
|
@@ -112,6 +123,8 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
|
|
|
112
123
|
return;
|
|
113
124
|
}
|
|
114
125
|
|
|
126
|
+
// Second and later `Theme`s using this theme do no work at all —
|
|
127
|
+
// generation included. Its CSS is document-wide and identical for each.
|
|
115
128
|
const themeKey = `astryx-theme-${theme.name}`;
|
|
116
129
|
if (injectedThemes.has(themeKey)) {
|
|
117
130
|
return;
|
|
@@ -130,8 +143,26 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
|
|
|
130
143
|
);
|
|
131
144
|
|
|
132
145
|
const {prose, component} = generateThemeCSS(theme);
|
|
133
|
-
|
|
134
|
-
|
|
146
|
+
const base = generateDataTokenDefaultsCSS();
|
|
147
|
+
injectedThemes.add(themeKey);
|
|
148
|
+
const cleanups: (() => void)[] = [() => injectedThemes.delete(themeKey)];
|
|
149
|
+
|
|
150
|
+
// Data token defaults go into @layer astryx-base, where StyleX puts the
|
|
151
|
+
// core token defaults, so a theme's own `--color-data-*` outranks them by
|
|
152
|
+
// layer. Appended (never prepended) so it cannot register `astryx-base`
|
|
153
|
+
// ahead of `reset` and invert the layer order.
|
|
154
|
+
if (base) {
|
|
155
|
+
if (dataTokenDefaultsRefCount++ === 0) {
|
|
156
|
+
const baseStyle = document.createElement('style');
|
|
157
|
+
baseStyle.setAttribute(dataAttr('theme-base'), '');
|
|
158
|
+
baseStyle.textContent = `@layer astryx-base {\n${base}\n}`;
|
|
159
|
+
document.head.appendChild(baseStyle);
|
|
160
|
+
}
|
|
161
|
+
cleanups.push(() => {
|
|
162
|
+
if (--dataTokenDefaultsRefCount === 0) {
|
|
163
|
+
document.querySelector(`style[${dataAttr('theme-base')}]`)?.remove();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
135
166
|
}
|
|
136
167
|
|
|
137
168
|
// Prose defaults go into @layer reset — lowest priority, scoped to
|
|
@@ -154,20 +185,24 @@ function useThemeStyleInjection(theme: DefinedTheme): void {
|
|
|
154
185
|
document.head.appendChild(compStyle);
|
|
155
186
|
}
|
|
156
187
|
|
|
157
|
-
|
|
188
|
+
if (prose || component) {
|
|
189
|
+
cleanups.push(() => {
|
|
190
|
+
// Matched by the astryx id marker, which is always written above.
|
|
191
|
+
const proseEl = document.querySelector(
|
|
192
|
+
`style[${dataAttr('theme-prose')}="${theme.name}"][${dataAttr('id')}="${id}"]`,
|
|
193
|
+
);
|
|
194
|
+
const compEl = document.querySelector(
|
|
195
|
+
`style[${dataAttr('theme')}="${theme.name}"][${dataAttr('id')}="${id}"]`,
|
|
196
|
+
);
|
|
197
|
+
proseEl?.remove();
|
|
198
|
+
compEl?.remove();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
158
201
|
|
|
159
202
|
return () => {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
`style[${dataAttr('theme-prose')}="${theme.name}"][${dataAttr('id')}="${id}"]`,
|
|
164
|
-
);
|
|
165
|
-
const compEl = document.querySelector(
|
|
166
|
-
`style[${dataAttr('theme')}="${theme.name}"][${dataAttr('id')}="${id}"]`,
|
|
167
|
-
);
|
|
168
|
-
proseEl?.remove();
|
|
169
|
-
compEl?.remove();
|
|
170
|
-
injectedThemes.delete(themeKey);
|
|
203
|
+
for (const cleanup of cleanups) {
|
|
204
|
+
cleanup();
|
|
205
|
+
}
|
|
171
206
|
};
|
|
172
207
|
}, [theme, id]);
|
|
173
208
|
}
|
|
@@ -116,6 +116,29 @@ describe('generateThemeCSS', () => {
|
|
|
116
116
|
expect(css).toContain('font-family: var(--font-family-heading)');
|
|
117
117
|
});
|
|
118
118
|
|
|
119
|
+
it('keeps the data palette out of a theme that never mentions it', () => {
|
|
120
|
+
// That the palette IS declared is covered by `seeds the whole palette
|
|
121
|
+
// once, at :root` in generateThemeRules.test.ts. It is theme-independent,
|
|
122
|
+
// so there is nothing about it a theme can be used to assert.
|
|
123
|
+
const {component} = generateThemeCSS(defineTheme({name: 'chartless'}));
|
|
124
|
+
expect(component).not.toContain('--color-data-');
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('puts only the named data token in the theme block, not its siblings', () => {
|
|
128
|
+
const theme = defineTheme({
|
|
129
|
+
name: 'brand-charts',
|
|
130
|
+
tokens: {'--color-data-categorical-blue': '#00A3FF'},
|
|
131
|
+
});
|
|
132
|
+
const {component} = generateThemeCSS(theme);
|
|
133
|
+
expect(component).toContain('--color-data-categorical-blue: #00A3FF;');
|
|
134
|
+
// Leaving the siblings out of the theme's own block is what lets a nested
|
|
135
|
+
// theme inherit a parent's override instead of shadowing it.
|
|
136
|
+
expect(component).not.toContain('--color-data-categorical-orange');
|
|
137
|
+
// Defaults reach the stylesheet without entering the theme's own tokens,
|
|
138
|
+
// which are what `astryx theme build` reports as overrides.
|
|
139
|
+
expect(theme.tokens['--color-data-categorical-orange']).toBeUndefined();
|
|
140
|
+
});
|
|
141
|
+
|
|
119
142
|
it('splits prose into reset layer and components into astryx-theme', () => {
|
|
120
143
|
const theme = defineTheme({
|
|
121
144
|
name: 'split-test',
|
package/src/theme/defineTheme.ts
CHANGED
|
@@ -36,7 +36,16 @@
|
|
|
36
36
|
* - /packages/cli/assets/docs/theme.doc.mjs (`astryx docs theme`)
|
|
37
37
|
*/
|
|
38
38
|
|
|
39
|
-
import type {
|
|
39
|
+
import type {ReactNode} from 'react';
|
|
40
|
+
import type {IconName, NamespacedIconName} from '../Icon/globalIconRegistry';
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Icon overrides a theme may declare: any built-in semantic name, plus the
|
|
44
|
+
* namespaced keys components and libraries own (`'richtext:bold'`).
|
|
45
|
+
*/
|
|
46
|
+
type ThemeIconOverrides = Partial<
|
|
47
|
+
Record<IconName | NamespacedIconName, ReactNode>
|
|
48
|
+
>;
|
|
40
49
|
import type {IndicatorRegistry} from '../Indicator/types';
|
|
41
50
|
import type {TypographyConfig, FontWeight} from './types';
|
|
42
51
|
import {
|
|
@@ -319,7 +328,7 @@ export interface DefineThemeInput {
|
|
|
319
328
|
*/
|
|
320
329
|
components?: ComponentStyleMap;
|
|
321
330
|
/** Icon registry — maps semantic icon names to React nodes */
|
|
322
|
-
icons?:
|
|
331
|
+
icons?: ThemeIconOverrides;
|
|
323
332
|
/**
|
|
324
333
|
* Indicator overrides — replaces the components that draw stateful control
|
|
325
334
|
* visuals with the theme's own, by name.
|
|
@@ -381,7 +390,7 @@ export interface DefinedTheme {
|
|
|
381
390
|
/** Component style overrides */
|
|
382
391
|
components?: ComponentStyleMap;
|
|
383
392
|
/** Icon registry */
|
|
384
|
-
icons?:
|
|
393
|
+
icons?: ThemeIconOverrides;
|
|
385
394
|
/** Indicator overrides for stateful control visuals, keyed by name */
|
|
386
395
|
indicators?: IndicatorRegistry;
|
|
387
396
|
/** Whether this theme has been pre-compiled by theme build CLI */
|
|
@@ -213,6 +213,7 @@ function discoverComponents(): ComponentInfo[] {
|
|
|
213
213
|
// ---------------------------------------------------------------------------
|
|
214
214
|
|
|
215
215
|
const DIR_TO_REGISTRY_KEY: Record<string, string> = {
|
|
216
|
+
Avatar: 'avatar',
|
|
216
217
|
Banner: 'banner',
|
|
217
218
|
Button: 'button',
|
|
218
219
|
Card: 'card',
|
|
@@ -221,13 +222,13 @@ const DIR_TO_REGISTRY_KEY: Record<string, string> = {
|
|
|
221
222
|
Dialog: 'dialog',
|
|
222
223
|
DropdownMenu: 'dropdown-menu',
|
|
223
224
|
Field: 'field',
|
|
224
|
-
HoverCard: '
|
|
225
|
+
HoverCard: 'hover-card',
|
|
225
226
|
NumberInput: 'number-input',
|
|
226
227
|
Popover: 'popover',
|
|
227
|
-
ProgressBar: '
|
|
228
|
+
ProgressBar: 'progress-bar-mark',
|
|
228
229
|
Section: 'section',
|
|
229
230
|
SegmentedControl: 'segmented-control',
|
|
230
|
-
TextArea: '
|
|
231
|
+
TextArea: 'text-area',
|
|
231
232
|
};
|
|
232
233
|
|
|
233
234
|
/**
|
|
@@ -279,6 +280,13 @@ const VARS_WITHOUT_DERIVED_MAPPING = new Set([
|
|
|
279
280
|
'--_thumbnail-hit-inset',
|
|
280
281
|
'--_input-clear-hit-inset',
|
|
281
282
|
'--_input-clear-hit-content',
|
|
283
|
+
// Placement and swipe lifecycle values are private Toast behavior. A theme
|
|
284
|
+
// author controls the surface transform/opacity as a whole, not these values.
|
|
285
|
+
'--_toast-slide-y',
|
|
286
|
+
'--_toast-swipe-y',
|
|
287
|
+
'--_toast-swipe-exit-y',
|
|
288
|
+
'--_toast-swipe-opacity',
|
|
289
|
+
'--_toast-swipe-scale',
|
|
282
290
|
// Indentation and row-spacing metrics: --tree-list-indent is the authorable
|
|
283
291
|
// step, --_tree-indent the per-row distance TreeListItem computes from it.
|
|
284
292
|
// --tree-list-row-gap is applied as half a padding-block on each row wrapper,
|
|
@@ -292,6 +300,19 @@ const VARS_WITHOUT_DERIVED_MAPPING = new Set([
|
|
|
292
300
|
// other.
|
|
293
301
|
'--_card-elevation',
|
|
294
302
|
'--_card-ring',
|
|
303
|
+
// The colour inside that composed ring, for a variant only a theme knows.
|
|
304
|
+
// It is one component of one shadow in the list, so no standard property
|
|
305
|
+
// maps onto it either — a theme sets it beside the fill it has to contrast.
|
|
306
|
+
'--selectable-card-ring-color',
|
|
307
|
+
// The spinner's ring is drawn as an SVG circle, so none of its four vars is
|
|
308
|
+
// a CSS property of the element carrying the theme target: `width` and
|
|
309
|
+
// `borderWidth` would name a box the ring is not, and a `color` mapping
|
|
310
|
+
// would take the label's text color with it. They are public vars a theme
|
|
311
|
+
// sets directly under a size- or shade-variant key.
|
|
312
|
+
'--spinner-diameter',
|
|
313
|
+
'--spinner-stroke-width',
|
|
314
|
+
'--spinner-color',
|
|
315
|
+
'--spinner-track-color',
|
|
295
316
|
]);
|
|
296
317
|
|
|
297
318
|
// ---------------------------------------------------------------------------
|
|
@@ -418,6 +439,21 @@ describe('getDerivedVars', () => {
|
|
|
418
439
|
expect(getDerivedVars('unknown', 'borderRadius')).toEqual([]);
|
|
419
440
|
});
|
|
420
441
|
|
|
442
|
+
it('resolves a deprecated key to the entries of the key that replaced it', () => {
|
|
443
|
+
// A theme written against the old spelling still selects the element (the
|
|
444
|
+
// component emits both classes), so its derived vars must still expand —
|
|
445
|
+
// otherwise the rule lands and the var half of it silently does nothing.
|
|
446
|
+
expect(getDerivedVars('hovercard', 'borderRadius')).toEqual(
|
|
447
|
+
getDerivedVars('hover-card', 'borderRadius'),
|
|
448
|
+
);
|
|
449
|
+
expect(getDerivedVars('textarea', 'paddingInline')).toEqual(
|
|
450
|
+
getDerivedVars('text-area', 'paddingInline'),
|
|
451
|
+
);
|
|
452
|
+
expect(getDerivedVars('progressbar-mark', 'width')).toEqual(
|
|
453
|
+
getDerivedVars('progress-bar-mark', 'width'),
|
|
454
|
+
);
|
|
455
|
+
});
|
|
456
|
+
|
|
421
457
|
it('returns empty for unregistered property', () => {
|
|
422
458
|
expect(getDerivedVars('card', 'color')).toEqual([]);
|
|
423
459
|
});
|
|
@@ -441,3 +477,51 @@ describe('getDerivedVars', () => {
|
|
|
441
477
|
}
|
|
442
478
|
});
|
|
443
479
|
});
|
|
480
|
+
|
|
481
|
+
// ---------------------------------------------------------------------------
|
|
482
|
+
// Read check: a registered var nothing reads is a dead theming knob
|
|
483
|
+
// ---------------------------------------------------------------------------
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Every source file under packages/core/src, concatenated once.
|
|
487
|
+
*
|
|
488
|
+
* `--_popover-radius` shipped documented and registered while `usePopover`
|
|
489
|
+
* hardcoded its radius, so `popover: {borderRadius}` set a var no element ever
|
|
490
|
+
* read. Sync between source, docs and registry cannot catch that: the three
|
|
491
|
+
* agreed with each other, and none of them required a reader.
|
|
492
|
+
*/
|
|
493
|
+
function readAllSource(dir: string): string {
|
|
494
|
+
let out = '';
|
|
495
|
+
for (const entry of readdirSync(dir, {withFileTypes: true})) {
|
|
496
|
+
const path = join(dir, entry.name);
|
|
497
|
+
if (entry.isDirectory()) {
|
|
498
|
+
out += readAllSource(path);
|
|
499
|
+
} else if (
|
|
500
|
+
(entry.name.endsWith('.ts') || entry.name.endsWith('.tsx')) &&
|
|
501
|
+
!entry.name.includes('.test.') &&
|
|
502
|
+
!entry.name.endsWith('.d.ts')
|
|
503
|
+
) {
|
|
504
|
+
out += readFileSync(path, 'utf-8');
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
return out;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
describe('registered derived vars are read by component styles', () => {
|
|
511
|
+
const source = readAllSource(SRC_DIR);
|
|
512
|
+
|
|
513
|
+
for (const [component, entries] of Object.entries(derivedVarRegistry)) {
|
|
514
|
+
for (const varName of entries.flatMap(e => e.vars ?? [])) {
|
|
515
|
+
it(`${component}: ${varName} is read via var()`, () => {
|
|
516
|
+
expect(
|
|
517
|
+
source.includes(`var(${varName})`) ||
|
|
518
|
+
source.includes(`var(${varName},`),
|
|
519
|
+
`${varName} is registered as the derived var for a CSS property on ` +
|
|
520
|
+
`\`${component}\`, but no component reads it. A theme setting that ` +
|
|
521
|
+
`property would write a var nothing consumes. Read it in the ` +
|
|
522
|
+
`element's StyleX styles, or drop the derived entry.`,
|
|
523
|
+
).toBe(true);
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
});
|