@astryxdesign/core 0.5.0 → 0.5.1-canary.70169cd
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/i18n/InternationalizationContext.d.ts +2 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +3 -1
- package/dist/i18n/resolve.d.ts +1 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +37 -38
- package/dist/i18n/useTranslator.d.ts.map +1 -1
- package/dist/i18n/useTranslator.js +2 -3
- 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 +4 -4
- 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 +3 -1
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +5 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- 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 +9 -2
- package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
- package/src/ComplexSelector/ComplexSelector.tsx +22 -12
- package/src/DateInput/DateInput.doc.mjs +17 -1
- 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 +3 -3
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
- package/src/DateRangeInput/DateRangeInput.tsx +8 -13
- package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
- 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/Field.doc.mjs +1 -1
- 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/FieldStatus/FieldStatus.doc.mjs +1 -1
- package/src/FileInput/FileInput.doc.mjs +1 -1
- 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 +3 -1
- package/src/InputGroup/InputGroup.doc.mjs +1 -1
- 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 +23 -2
- 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 +27 -8
- 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/PowerSearch.doc.mjs +1 -1
- 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/RadioList/RadioList.doc.mjs +1 -1
- 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 +15 -1
- 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.doc.mjs +2 -2
- 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 +3 -1
- 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 +13 -3
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +34 -22
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.doc.mjs +1 -1
- 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 +17 -4
- 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 +7 -1
- 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/i18n/InternationalizationContext.ts +3 -0
- package/src/i18n/InternationalizationProvider.tsx +8 -1
- package/src/i18n/__tests__/resolve.test.ts +23 -1
- package/src/i18n/resolve.ts +46 -49
- package/src/i18n/useTranslator.ts +2 -7
- 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/Spinner/Spinner.tsx
CHANGED
|
@@ -34,6 +34,16 @@ import {themeProps} from '../utils/themeProps';
|
|
|
34
34
|
*/
|
|
35
35
|
const ARC_FRACTION = 0.375;
|
|
36
36
|
|
|
37
|
+
/**
|
|
38
|
+
* The dash pattern, per unit of diameter: one arc, then the gap that closes
|
|
39
|
+
* the circle. The circumference is `pi x diameter`, so multiplying the
|
|
40
|
+
* resolved diameter by these two constants gives exactly the lengths the
|
|
41
|
+
* default render has always used, and scales them with a themed diameter.
|
|
42
|
+
*/
|
|
43
|
+
const PI = 3.141592653589793;
|
|
44
|
+
const ARC_DASH = PI * ARC_FRACTION;
|
|
45
|
+
const ARC_GAP = PI * (1 - ARC_FRACTION);
|
|
46
|
+
|
|
37
47
|
const SIZES = {
|
|
38
48
|
sm: {diameter: 10, border: 2},
|
|
39
49
|
md: {diameter: 14, border: 3},
|
|
@@ -41,14 +51,103 @@ const SIZES = {
|
|
|
41
51
|
xl: {diameter: 28, border: 4},
|
|
42
52
|
};
|
|
43
53
|
|
|
44
|
-
/**
|
|
45
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Opacity the track is drawn at, per shade. `77 / 255` is the `4D` the onMedia
|
|
56
|
+
* track used to append to the token's hex — the same composite, but applied as
|
|
57
|
+
* `stroke-opacity` to a color off the cascade, so it no longer depends on the
|
|
58
|
+
* token being hex notation and it applies to a themed color too.
|
|
59
|
+
*/
|
|
60
|
+
const TRACK_OPACITY: Record<SpinnerShade, number> = {
|
|
46
61
|
default: 1,
|
|
47
62
|
subtle: 1,
|
|
48
63
|
onMedia: 77 / 255,
|
|
49
64
|
inherit: 0.3,
|
|
50
65
|
};
|
|
51
66
|
|
|
67
|
+
/**
|
|
68
|
+
* Where the resolved geometry lands: the public var, resolved into a registered
|
|
69
|
+
* `<length>` the `calc()`s below can do arithmetic on. The box and the ring
|
|
70
|
+
* read these; the public vars are declared once, on the element carrying the
|
|
71
|
+
* theme target, by `sizeStyles`.
|
|
72
|
+
*/
|
|
73
|
+
const RESOLVED_DIAMETER = '--_spinner-ring-diameter';
|
|
74
|
+
const RESOLVED_STROKE = '--_spinner-ring-stroke';
|
|
75
|
+
const RESOLVED_GEOMETRY_VARS = [RESOLVED_DIAMETER, RESOLVED_STROKE];
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The composed box size: diameter plus a stroke width on each side.
|
|
79
|
+
*
|
|
80
|
+
* It is deliberately NOT registered, unlike the pair above. The element reads
|
|
81
|
+
* it through an inline `width`/`height` with the size's own default as the
|
|
82
|
+
* `var()` fallback, so a render with no stylesheet — where nothing declares
|
|
83
|
+
* it — still sizes the box the way it always did. A registered property always
|
|
84
|
+
* has a value (its `initial-value`), which would swallow that fallback and
|
|
85
|
+
* collapse the box to zero.
|
|
86
|
+
*/
|
|
87
|
+
const BOX_SIZE = '--_spinner-box-size';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Register the resolved geometry vars as `<length>`.
|
|
91
|
+
*
|
|
92
|
+
* Both are consumed inside `calc()` — the box adds two stroke widths to a diameter,
|
|
93
|
+
* the circle halves one. Unregistered, a custom property substitutes as text,
|
|
94
|
+
* so whatever a theme wrote lands in the expression verbatim and a bare `0`
|
|
95
|
+
* (a valid length on its own, a `<number>` inside `calc()`) poisons the sum:
|
|
96
|
+
* `calc(28px + 0 * 2)` is invalid at computed-value time and the box loses its
|
|
97
|
+
* size. Registered, the value is already an absolute length by the time the
|
|
98
|
+
* `calc()` sees it, so `0` means `0px` — a zero-width stroke that paints
|
|
99
|
+
* nothing — rather than a bare `0` that invalidates the sum and leaves the box
|
|
100
|
+
* with no size at all. One `stroke-width` drives both circles, so a themed
|
|
101
|
+
* stroke width of `0` hides the arc along with the track; an arc with no track behind
|
|
102
|
+
* it is `--spinner-track-color: transparent`.
|
|
103
|
+
*
|
|
104
|
+
* Only these private vars are registered. The four public ones deliberately
|
|
105
|
+
* are not: a registered property has an `initial-value`, so every element in
|
|
106
|
+
* the document would report a value for it — and
|
|
107
|
+
* `.github/scripts/theme-var-reachability.js` finds a var's declaring element
|
|
108
|
+
* by exactly that test, so registering them would point the guard at `<html>`
|
|
109
|
+
* and report a var no theme can select.
|
|
110
|
+
*/
|
|
111
|
+
function registerSpinnerVars(): void {
|
|
112
|
+
if (
|
|
113
|
+
typeof CSS === 'undefined' ||
|
|
114
|
+
typeof CSS.registerProperty !== 'function'
|
|
115
|
+
) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
for (const name of RESOLVED_GEOMETRY_VARS) {
|
|
119
|
+
try {
|
|
120
|
+
CSS.registerProperty({
|
|
121
|
+
name,
|
|
122
|
+
syntax: '<length>',
|
|
123
|
+
inherits: true,
|
|
124
|
+
initialValue: '0px',
|
|
125
|
+
});
|
|
126
|
+
} catch {
|
|
127
|
+
// Already registered — a second copy of the package on the page, or a
|
|
128
|
+
// fast-refresh re-evaluation. registerProperty throws rather than
|
|
129
|
+
// replacing, and the existing registration is this same one.
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Registering an inherited property with an `initial-value` invalidates style
|
|
135
|
+
// for the whole document, so this runs when the module is evaluated rather
|
|
136
|
+
// than when a spinner mounts. A spinner is the loading indicator: it mounts
|
|
137
|
+
// onto a page that is already rendered, with someone already waiting, and the
|
|
138
|
+
// recalc it triggers there is paid on the full tree. At import the tree is
|
|
139
|
+
// whatever has rendered so far, which for a bundle loaded in the head is
|
|
140
|
+
// nothing.
|
|
141
|
+
//
|
|
142
|
+
// It is safe at module scope in both directions. The `typeof CSS` guard above
|
|
143
|
+
// keeps it out of the server render, and tree-shaking cannot strip it from a
|
|
144
|
+
// build that renders a spinner: core's `sideEffects` allowlist does not name
|
|
145
|
+
// this file, so a bundle that never imports `Spinner` drops the module whole —
|
|
146
|
+
// registration and all, which is the outcome you want — while one that does
|
|
147
|
+
// import it keeps the module, and a bare call is not something a bundler may
|
|
148
|
+
// elide.
|
|
149
|
+
registerSpinnerVars();
|
|
150
|
+
|
|
52
151
|
/**
|
|
53
152
|
* Pin every ring's rotation to the document timeline's origin instead of its
|
|
54
153
|
* own start time, so spinners mounted seconds apart turn in phase.
|
|
@@ -78,12 +177,20 @@ function pinRingsToTimelineOrigin(): void {
|
|
|
78
177
|
}
|
|
79
178
|
}
|
|
80
179
|
|
|
180
|
+
/**
|
|
181
|
+
* Ref callback for the ring: the one place a mounted ring touches the DOM.
|
|
182
|
+
*
|
|
183
|
+
* It reads nothing back — the geometry is resolved by the cascade, not in JS.
|
|
184
|
+
*/
|
|
81
185
|
function syncRotationPhase(
|
|
82
186
|
svg: SVGSVGElement | null,
|
|
83
187
|
): (() => void) | undefined {
|
|
188
|
+
if (svg == null) {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
84
191
|
// jsdom implements no Web Animations, and this runs in every consumer's
|
|
85
192
|
// component tests.
|
|
86
|
-
if (
|
|
193
|
+
if (typeof svg.getAnimations !== 'function') {
|
|
87
194
|
return undefined;
|
|
88
195
|
}
|
|
89
196
|
pendingRings.add(svg);
|
|
@@ -121,11 +228,31 @@ const styles = stylex.create({
|
|
|
121
228
|
placeItems: 'center',
|
|
122
229
|
overflow: 'hidden',
|
|
123
230
|
verticalAlign: 'middle',
|
|
231
|
+
// The public geometry vars, resolved into the registered `<length>` pair
|
|
232
|
+
// the arithmetic below needs. Reading them here rather than in each
|
|
233
|
+
// `calc()` keeps one place where a themed value enters the component, and
|
|
234
|
+
// it is the span that reads them whether the theme target is the span or
|
|
235
|
+
// the wrapper — a custom property inherits either way.
|
|
236
|
+
[RESOLVED_DIAMETER]: 'var(--spinner-diameter)',
|
|
237
|
+
[RESOLVED_STROKE]: 'var(--spinner-stroke-width)',
|
|
238
|
+
// The size of the box, composed here and applied as an inline style at the
|
|
239
|
+
// element, so that the box and the drawn ring come from the same two vars
|
|
240
|
+
// and a themed size moves both together — without the sizing moving from
|
|
241
|
+
// an inline style to a rule, which would hand a caller's `style={{width}}`
|
|
242
|
+
// a precedence over the box that it has never had.
|
|
243
|
+
[BOX_SIZE]: `calc(var(${RESOLVED_DIAMETER}) + var(${RESOLVED_STROKE}) * 2)`,
|
|
124
244
|
},
|
|
125
245
|
ring: {
|
|
126
246
|
backfaceVisibility: 'hidden',
|
|
127
247
|
display: 'block',
|
|
128
248
|
willChange: 'transform',
|
|
249
|
+
// The svg keeps the size its `viewBox` describes, so one user unit is one
|
|
250
|
+
// CSS pixel and the lengths below mean what they say. A themed diameter
|
|
251
|
+
// therefore draws a ring wider than the svg's own box — which is fine, and
|
|
252
|
+
// stays centered, because the box it is centered in is the span, sized
|
|
253
|
+
// from the same two vars. Clipping it to the default frame is the one
|
|
254
|
+
// thing that would break that, hence `visible`.
|
|
255
|
+
overflow: 'visible',
|
|
129
256
|
// Slow the rotation dramatically under reduced-motion rather than freezing
|
|
130
257
|
// it (a frozen spinner reads as broken), matching ProgressBar's approach.
|
|
131
258
|
// The role="status" + "Loading" label still convey busy state (obs-6).
|
|
@@ -140,30 +267,98 @@ const styles = stylex.create({
|
|
|
140
267
|
circle: {
|
|
141
268
|
fill: 'none',
|
|
142
269
|
strokeLinecap: 'round',
|
|
270
|
+
// The geometry the ring is actually drawn at. `r` and `stroke-width` are
|
|
271
|
+
// CSS properties on an SVG shape, and a CSS declaration outranks the
|
|
272
|
+
// presentation attribute of the same name — so the attributes below stay
|
|
273
|
+
// as the size's default (and as what a server render and a no-CSS render
|
|
274
|
+
// draw), and these take over the moment the cascade has a themed value.
|
|
275
|
+
r: `calc(var(${RESOLVED_DIAMETER}) / 2)`,
|
|
276
|
+
strokeWidth: `var(${RESOLVED_STROKE})`,
|
|
143
277
|
},
|
|
278
|
+
// The two ring colors ride `stroke` directly, read off the public vars the
|
|
279
|
+
// shade declares. The paint comes from the cascade, so every notation a
|
|
280
|
+
// theme can write — `var()`, `color-mix()`, and the `currentColor` the
|
|
281
|
+
// inherit shade is built on — resolves where it is used, and a color changed
|
|
282
|
+
// after mount repaints instead of going stale.
|
|
283
|
+
//
|
|
284
|
+
// The dash pattern is composed from the resolved diameter the same way, so a
|
|
285
|
+
// themed ring keeps the same fraction of arc rather than the same absolute
|
|
286
|
+
// dash. `pathLength` would be the shorter route to that, but it rescales the
|
|
287
|
+
// pattern against the path length the UA measures on its own approximation
|
|
288
|
+
// of the circle — 87.398 against the 87.965 of pi x 28 — which shortens the
|
|
289
|
+
// default arc by 0.64% and moves the cap by half a pixel. Composing the
|
|
290
|
+
// lengths keeps the default byte-identical to what it drew before.
|
|
291
|
+
arc: {
|
|
292
|
+
stroke: 'var(--spinner-color)',
|
|
293
|
+
strokeDasharray: `calc(var(${RESOLVED_DIAMETER}) * ${ARC_DASH}) calc(var(${RESOLVED_DIAMETER}) * ${ARC_GAP})`,
|
|
294
|
+
},
|
|
295
|
+
track: {stroke: 'var(--spinner-track-color)'},
|
|
144
296
|
});
|
|
145
297
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
298
|
+
// What each named `size` and `shade` resolve to. Both groups DECLARE the four
|
|
299
|
+
// public vars, on the element that carries the `spinner` theme target, and
|
|
300
|
+
// everything downstream reads them — so a theme's `@layer astryx-theme` rule
|
|
301
|
+
// against `.astryx-spinner.xl` overrides the default the same way it does for
|
|
302
|
+
// `--tree-list-indent` or `--button-focus-offset`, e.g.
|
|
303
|
+
// spinner: { 'size:xl': { '--spinner-diameter': '40px' } }.
|
|
304
|
+
//
|
|
305
|
+
// Declaring is only safe because #5410 moved the compiled StyleX CSS inside
|
|
306
|
+
// `@layer astryx-base`. Before it, StyleX emitted custom-property
|
|
307
|
+
// declarations at priority 0 and therefore OUTSIDE its layers, and an
|
|
308
|
+
// unlayered declaration beats every layer — so a StyleX-declared
|
|
309
|
+
// `--spinner-diameter: 10px` shadowed the theme's own rule no matter how
|
|
310
|
+
// specific the theme got. An earlier revision of this component worked around
|
|
311
|
+
// that by never declaring the public var and reading it with the default as a
|
|
312
|
+
// `var()` fallback; that is no longer necessary, and the fallback shape has a
|
|
313
|
+
// cost of its own — with nothing declaring the var,
|
|
314
|
+
// `theme-var-reachability.js` cannot find an element to check, so a documented
|
|
315
|
+
// var reads as unreachable.
|
|
316
|
+
const sizeStyles = stylex.create({
|
|
317
|
+
sm: {
|
|
318
|
+
'--spinner-diameter': `${SIZES.sm.diameter}px`,
|
|
319
|
+
'--spinner-stroke-width': `${SIZES.sm.border}px`,
|
|
320
|
+
},
|
|
321
|
+
md: {
|
|
322
|
+
'--spinner-diameter': `${SIZES.md.diameter}px`,
|
|
323
|
+
'--spinner-stroke-width': `${SIZES.md.border}px`,
|
|
324
|
+
},
|
|
325
|
+
lg: {
|
|
326
|
+
'--spinner-diameter': `${SIZES.lg.diameter}px`,
|
|
327
|
+
'--spinner-stroke-width': `${SIZES.lg.border}px`,
|
|
328
|
+
},
|
|
329
|
+
xl: {
|
|
330
|
+
'--spinner-diameter': `${SIZES.xl.diameter}px`,
|
|
331
|
+
'--spinner-stroke-width': `${SIZES.xl.border}px`,
|
|
332
|
+
},
|
|
151
333
|
});
|
|
152
334
|
|
|
153
|
-
const
|
|
335
|
+
const shadeStyles = stylex.create({
|
|
154
336
|
default: {
|
|
155
|
-
|
|
156
|
-
|
|
337
|
+
'--spinner-color': colorVars['--color-accent'],
|
|
338
|
+
'--spinner-track-color': colorVars['--color-track'],
|
|
157
339
|
},
|
|
158
340
|
subtle: {
|
|
159
|
-
|
|
160
|
-
|
|
341
|
+
'--spinner-color': colorVars['--color-text-secondary'],
|
|
342
|
+
'--spinner-track-color': colorVars['--color-track'],
|
|
161
343
|
},
|
|
162
344
|
onMedia: {
|
|
163
|
-
|
|
164
|
-
|
|
345
|
+
'--spinner-color': colorVars['--color-on-dark'],
|
|
346
|
+
'--spinner-track-color': colorVars['--color-on-dark'],
|
|
347
|
+
},
|
|
348
|
+
inherit: {
|
|
349
|
+
'--spinner-color': 'currentColor',
|
|
350
|
+
'--spinner-track-color': 'currentColor',
|
|
165
351
|
},
|
|
166
|
-
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
// The track's alpha is a property, not a color: it composites over whatever
|
|
355
|
+
// color the shade or the theme supplies. `77 / 255` is the `4D` the onMedia
|
|
356
|
+
// token's hex used to carry.
|
|
357
|
+
const trackOpacityStyles = stylex.create({
|
|
358
|
+
default: {strokeOpacity: TRACK_OPACITY.default},
|
|
359
|
+
subtle: {strokeOpacity: TRACK_OPACITY.subtle},
|
|
360
|
+
onMedia: {strokeOpacity: TRACK_OPACITY.onMedia},
|
|
361
|
+
inherit: {strokeOpacity: TRACK_OPACITY.inherit},
|
|
167
362
|
});
|
|
168
363
|
|
|
169
364
|
// =============================================================================
|
|
@@ -178,7 +373,9 @@ export interface SpinnerProps extends BaseProps<HTMLSpanElement> {
|
|
|
178
373
|
/** Ref forwarded to the root element */
|
|
179
374
|
ref?: React.Ref<HTMLSpanElement>;
|
|
180
375
|
/**
|
|
181
|
-
* Spinner size.
|
|
376
|
+
* Spinner size. The diameter is the ring itself; the rendered box adds the
|
|
377
|
+
* stroke width on each side (xl draws a 28px ring in a 36px box). A theme can
|
|
378
|
+
* redefine what each named size resolves to — see `--spinner-diameter`.
|
|
182
379
|
* - 'sm': 10px diameter
|
|
183
380
|
* - 'md': 14px diameter
|
|
184
381
|
* - 'lg': 18px diameter
|
|
@@ -275,9 +472,30 @@ export function Spinner({
|
|
|
275
472
|
{...(hasLabel ? {} : restProps)}
|
|
276
473
|
{...mergeProps(
|
|
277
474
|
hasLabel ? '' : themeProps('spinner', {size, shade}),
|
|
278
|
-
stylex.props(
|
|
475
|
+
stylex.props(
|
|
476
|
+
styles.spinner,
|
|
477
|
+
// The defaults are declared on whichever element carries the theme
|
|
478
|
+
// target, and only there: when a label moves the target to the
|
|
479
|
+
// wrapper, this span must inherit the wrapper's value rather than
|
|
480
|
+
// declare its own, which would shadow a theme's override with the
|
|
481
|
+
// default it is trying to replace.
|
|
482
|
+
!hasLabel && sizeStyles[size],
|
|
483
|
+
!hasLabel && shadeStyles[shade],
|
|
484
|
+
!hasLabel && xstyle,
|
|
485
|
+
),
|
|
279
486
|
hasLabel ? undefined : className,
|
|
280
|
-
|
|
487
|
+
// The box is sized here, after the caller's `style`, exactly as it was
|
|
488
|
+
// before the geometry became themeable: the component's own size wins
|
|
489
|
+
// over a `style={{width}}` a caller passes, and the precedence between
|
|
490
|
+
// the two is unchanged by this PR. What the value is made of has
|
|
491
|
+
// changed — it is the composed var rather than a number — so a themed
|
|
492
|
+
// diameter moves the box with the ring. The fallback is the size's own
|
|
493
|
+
// frame, for the render where no stylesheet has declared the var.
|
|
494
|
+
{
|
|
495
|
+
...(hasLabel ? {} : style),
|
|
496
|
+
width: `var(${BOX_SIZE}, ${frameSize}px)`,
|
|
497
|
+
height: `var(${BOX_SIZE}, ${frameSize}px)`,
|
|
498
|
+
},
|
|
281
499
|
)}>
|
|
282
500
|
<svg
|
|
283
501
|
ref={syncRotationPhase}
|
|
@@ -291,16 +509,23 @@ export function Spinner({
|
|
|
291
509
|
cy={center}
|
|
292
510
|
r={diameter / 2}
|
|
293
511
|
strokeWidth={border}
|
|
294
|
-
{...stylex.props(
|
|
512
|
+
{...stylex.props(
|
|
513
|
+
styles.circle,
|
|
514
|
+
styles.track,
|
|
515
|
+
trackOpacityStyles[shade],
|
|
516
|
+
)}
|
|
295
517
|
/>
|
|
296
518
|
<circle
|
|
297
519
|
cx={center}
|
|
298
520
|
cy={center}
|
|
299
521
|
r={diameter / 2}
|
|
300
522
|
strokeWidth={border}
|
|
523
|
+
// The size's own dash, for the render with no stylesheet. The rule
|
|
524
|
+
// above composes the same lengths from the resolved diameter, so a
|
|
525
|
+
// themed ring keeps this fraction of arc rather than this length.
|
|
301
526
|
strokeDasharray={`${arcLength} ${circumference - arcLength}`}
|
|
302
527
|
transform={`rotate(-90 ${center} ${center})`}
|
|
303
|
-
{...stylex.props(styles.circle,
|
|
528
|
+
{...stylex.props(styles.circle, styles.arc)}
|
|
304
529
|
/>
|
|
305
530
|
</svg>
|
|
306
531
|
</span>
|
|
@@ -317,7 +542,12 @@ export function Spinner({
|
|
|
317
542
|
{...restProps}
|
|
318
543
|
{...mergeProps(
|
|
319
544
|
themeProps('spinner', {size, shade}),
|
|
320
|
-
stylex.props(
|
|
545
|
+
stylex.props(
|
|
546
|
+
styles.wrapper,
|
|
547
|
+
sizeStyles[size],
|
|
548
|
+
shadeStyles[shade],
|
|
549
|
+
xstyle,
|
|
550
|
+
),
|
|
321
551
|
className,
|
|
322
552
|
style,
|
|
323
553
|
)}>
|
|
@@ -48,7 +48,10 @@ export const docs = {
|
|
|
48
48
|
],
|
|
49
49
|
theming: {
|
|
50
50
|
targets: [
|
|
51
|
-
{className: 'astryx-
|
|
51
|
+
{className: 'astryx-status-dot', visualProps: ['variant']},
|
|
52
|
+
// Still emitted beside the names above, so themes written against
|
|
53
|
+
// them keep working. Drop in the next major.
|
|
54
|
+
{className: 'astryx-statusdot', visualProps: ['variant'], deprecatedFor: 'status-dot'},
|
|
52
55
|
],
|
|
53
56
|
},
|
|
54
57
|
usage: {
|
|
@@ -105,7 +108,10 @@ export const docsZh = {
|
|
|
105
108
|
],
|
|
106
109
|
theming: {
|
|
107
110
|
targets: [
|
|
108
|
-
{className: 'astryx-
|
|
111
|
+
{className: 'astryx-status-dot', visualProps: ['variant']},
|
|
112
|
+
// Still emitted beside the names above, so themes written against
|
|
113
|
+
// them keep working. Drop in the next major.
|
|
114
|
+
{className: 'astryx-statusdot', visualProps: ['variant'], deprecatedFor: 'status-dot'},
|
|
109
115
|
],
|
|
110
116
|
},
|
|
111
117
|
usage: {
|
|
@@ -189,3 +189,12 @@ describe('StatusDot', () => {
|
|
|
189
189
|
});
|
|
190
190
|
});
|
|
191
191
|
});
|
|
192
|
+
|
|
193
|
+
describe('StatusDot theme target names', () => {
|
|
194
|
+
it('renders the deprecated class beside the current one', () => {
|
|
195
|
+
render(<StatusDot variant="success" label="Online" />);
|
|
196
|
+
const dot = screen.getByRole('img', {name: 'Online'});
|
|
197
|
+
expect(dot).toHaveClass('astryx-status-dot');
|
|
198
|
+
expect(dot).toHaveClass('astryx-statusdot');
|
|
199
|
+
});
|
|
200
|
+
});
|
|
@@ -200,7 +200,13 @@ export function StatusDot({
|
|
|
200
200
|
role="img"
|
|
201
201
|
aria-label={label}
|
|
202
202
|
{...mergeProps(
|
|
203
|
-
themeProps(
|
|
203
|
+
themeProps(
|
|
204
|
+
'status-dot',
|
|
205
|
+
{variant},
|
|
206
|
+
// `statusdot` ran the compound name together; themes styling it keep
|
|
207
|
+
// working until the next major.
|
|
208
|
+
{legacyNames: ['statusdot']},
|
|
209
|
+
),
|
|
204
210
|
stylex.props(
|
|
205
211
|
styles.base,
|
|
206
212
|
variants[variant],
|
package/src/Stepper/Step.doc.mjs
CHANGED
|
@@ -10,7 +10,7 @@ export const docs = {
|
|
|
10
10
|
category: 'Navigation',
|
|
11
11
|
isHiddenFromOverview: true,
|
|
12
12
|
description:
|
|
13
|
-
'Individual step within a Stepper. Renders a progress-bar segment, an indicator, and a label with optional description. Progress (completed/active/not-started) is derived from the parent Stepper\
|
|
13
|
+
'Individual step within a Stepper. Renders a progress-bar segment, an indicator, and a label with optional description. Progress (completed/active/not-started) is derived from the parent Stepper\'s activeStep and this step\'s step index.',
|
|
14
14
|
props: [
|
|
15
15
|
{
|
|
16
16
|
name: 'step',
|
package/src/Stepper/Step.tsx
CHANGED
|
@@ -51,6 +51,7 @@ import {
|
|
|
51
51
|
isRenderable,
|
|
52
52
|
themeProps,
|
|
53
53
|
} from '../utils';
|
|
54
|
+
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
54
55
|
import type {BaseProps} from '../BaseProps';
|
|
55
56
|
import {Icon} from '../Icon';
|
|
56
57
|
import {VisuallyHidden} from '../VisuallyHidden';
|
|
@@ -655,13 +656,7 @@ const styles = stylex.create({
|
|
|
655
656
|
'@media (prefers-reduced-motion: reduce)': '0s',
|
|
656
657
|
},
|
|
657
658
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
658
|
-
backgroundColor:
|
|
659
|
-
default: 'transparent',
|
|
660
|
-
':hover:where(:not(:disabled,[aria-disabled="true"]))': {
|
|
661
|
-
'@media (hover: hover)': colorVars['--color-overlay-hover'],
|
|
662
|
-
},
|
|
663
|
-
':active': colorVars['--color-overlay-pressed'],
|
|
664
|
-
},
|
|
659
|
+
backgroundColor: 'transparent',
|
|
665
660
|
},
|
|
666
661
|
|
|
667
662
|
// ===================== ON-TRACK LAYOUT =====================
|
|
@@ -702,13 +697,7 @@ const styles = stylex.create({
|
|
|
702
697
|
'@media (prefers-reduced-motion: reduce)': '0s',
|
|
703
698
|
},
|
|
704
699
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
705
|
-
backgroundColor:
|
|
706
|
-
default: 'transparent',
|
|
707
|
-
':hover:where(:not(:disabled,[aria-disabled="true"]))': {
|
|
708
|
-
'@media (hover: hover)': colorVars['--color-overlay-hover'],
|
|
709
|
-
},
|
|
710
|
-
':active': colorVars['--color-overlay-pressed'],
|
|
711
|
-
},
|
|
700
|
+
backgroundColor: 'transparent',
|
|
712
701
|
},
|
|
713
702
|
|
|
714
703
|
otRowWrap: {
|
|
@@ -1411,6 +1400,7 @@ export function Step({
|
|
|
1411
1400
|
aria-label={stepAriaLabel}
|
|
1412
1401
|
{...stylex.props(
|
|
1413
1402
|
styles.otInteractive,
|
|
1403
|
+
interactionOverlayStyles.backgroundColor,
|
|
1414
1404
|
styles.otRowWrap,
|
|
1415
1405
|
styles.otRowPadV(densitySpace),
|
|
1416
1406
|
focusOutlineStyles.focusVisible,
|
|
@@ -1493,6 +1483,7 @@ export function Step({
|
|
|
1493
1483
|
aria-label={stepAriaLabel}
|
|
1494
1484
|
{...stylex.props(
|
|
1495
1485
|
styles.otInteractive,
|
|
1486
|
+
interactionOverlayStyles.backgroundColor,
|
|
1496
1487
|
styles.otColWrap,
|
|
1497
1488
|
styles.otPadBlock(densitySpace),
|
|
1498
1489
|
focusOutlineStyles.focusVisible,
|
|
@@ -1549,6 +1540,7 @@ export function Step({
|
|
|
1549
1540
|
aria-label={stepAriaLabel}
|
|
1550
1541
|
{...stylex.props(
|
|
1551
1542
|
styles.buttonReset,
|
|
1543
|
+
interactionOverlayStyles.backgroundColor,
|
|
1552
1544
|
focusOutlineStyles.focusVisible,
|
|
1553
1545
|
density === 'compact' && styles.densityCompact,
|
|
1554
1546
|
density === 'balanced' && styles.densityBalanced,
|
|
@@ -1609,6 +1601,7 @@ export function Step({
|
|
|
1609
1601
|
aria-label={stepAriaLabel}
|
|
1610
1602
|
{...stylex.props(
|
|
1611
1603
|
styles.buttonReset,
|
|
1604
|
+
interactionOverlayStyles.backgroundColor,
|
|
1612
1605
|
focusOutlineStyles.focusVisible,
|
|
1613
1606
|
density === 'compact' && styles.densityCompact,
|
|
1614
1607
|
density === 'balanced' && styles.densityBalanced,
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
export const docs = {
|
|
6
6
|
name: 'Switch',
|
|
7
7
|
displayName: 'Switch',
|
|
8
|
-
category: '
|
|
8
|
+
category: 'Form Controls',
|
|
9
9
|
keywords: [
|
|
10
10
|
'switch',
|
|
11
11
|
'toggle',
|
|
@@ -167,6 +167,7 @@ export const docs = {
|
|
|
167
167
|
className: 'astryx-switch-field',
|
|
168
168
|
visualProps: ['labelPosition', 'labelSpacing'],
|
|
169
169
|
},
|
|
170
|
+
{className: 'astryx-switch-label'},
|
|
170
171
|
],
|
|
171
172
|
},
|
|
172
173
|
usage: {
|
|
@@ -338,6 +339,7 @@ export const docsZh = {
|
|
|
338
339
|
className: 'astryx-switch-field',
|
|
339
340
|
visualProps: ['labelPosition', 'labelSpacing'],
|
|
340
341
|
},
|
|
342
|
+
{className: 'astryx-switch-label'},
|
|
341
343
|
],
|
|
342
344
|
},
|
|
343
345
|
usage: {
|
|
@@ -823,3 +823,13 @@ describe('forced colors (WCAG 1.4.11)', () => {
|
|
|
823
823
|
expect(getForcedColorsRules()).not.toContain('color-mix');
|
|
824
824
|
});
|
|
825
825
|
});
|
|
826
|
+
|
|
827
|
+
describe('label theme target', () => {
|
|
828
|
+
it('names its own label so a theme can style it apart from a field label', () => {
|
|
829
|
+
// See CheckboxInput: the control names the label it owns.
|
|
830
|
+
render(<Switch label="Wi-Fi" value={false} onChange={() => {}} />);
|
|
831
|
+
const label = screen.getByText('Wi-Fi').closest('label');
|
|
832
|
+
expect(label).toHaveClass('astryx-field-label');
|
|
833
|
+
expect(label).toHaveClass('astryx-switch-label');
|
|
834
|
+
});
|
|
835
|
+
});
|
package/src/Switch/Switch.tsx
CHANGED
|
@@ -633,6 +633,9 @@ export function Switch({
|
|
|
633
633
|
const labelElement = (
|
|
634
634
|
<div {...stylex.props(styles.labelWrapper, labelWrapperSizeStyles[size])}>
|
|
635
635
|
<FieldLabel
|
|
636
|
+
// See CheckboxInput: the control names its own label target rather
|
|
637
|
+
// than the label guessing at its placement.
|
|
638
|
+
{...themeProps('switch-label')}
|
|
636
639
|
label={label}
|
|
637
640
|
inputID={id}
|
|
638
641
|
isLabelHidden={isLabelHidden}
|
package/src/Table/BaseTable.tsx
CHANGED
|
@@ -528,7 +528,12 @@ function BaseTableInner<T extends Record<string, unknown>>({
|
|
|
528
528
|
{...(ariaRowCount != null ? {'aria-rowcount': ariaRowCount} : null)}
|
|
529
529
|
{...tableRenderProps.htmlProps}
|
|
530
530
|
{...mergeProps(
|
|
531
|
-
themeProps('
|
|
531
|
+
themeProps('table', undefined, {
|
|
532
|
+
// `base-table` was a second root on the same <table> element that
|
|
533
|
+
// `table` names; themes styling it keep working until the next
|
|
534
|
+
// major.
|
|
535
|
+
legacyNames: ['base-table'],
|
|
536
|
+
}),
|
|
532
537
|
stylex.props(...tableRenderProps.xstyle, xstyle),
|
|
533
538
|
[tableRenderProps.htmlProps.className, className]
|
|
534
539
|
.filter(Boolean)
|
package/src/Table/Table.doc.mjs
CHANGED
|
@@ -24,7 +24,6 @@ export const docs = {
|
|
|
24
24
|
},
|
|
25
25
|
theming: {
|
|
26
26
|
targets: [
|
|
27
|
-
{className: 'astryx-base-table'},
|
|
28
27
|
{className: 'astryx-table'},
|
|
29
28
|
{className: 'astryx-table-scroll-wrapper'},
|
|
30
29
|
{className: 'astryx-table-header'},
|
|
@@ -33,6 +32,9 @@ export const docs = {
|
|
|
33
32
|
{className: 'astryx-table-row'},
|
|
34
33
|
{className: 'astryx-table-cell', visualProps: ['density']},
|
|
35
34
|
{className: 'astryx-table-header-cell', visualProps: ['density']},
|
|
35
|
+
// Still emitted beside the names above, so themes written against
|
|
36
|
+
// them keep working. Drop in the next major.
|
|
37
|
+
{className: 'astryx-base-table', deprecatedFor: 'table'},
|
|
36
38
|
],
|
|
37
39
|
},
|
|
38
40
|
description: 'Styled, data-driven table with density, dividers, hover highlight, striped rows, and named plugin support. T must extend Record<string, unknown>.',
|
|
@@ -107,7 +109,7 @@ export const docs = {
|
|
|
107
109
|
{
|
|
108
110
|
name: 'children',
|
|
109
111
|
type: 'ReactNode',
|
|
110
|
-
description: 'Children mode: compose the table yourself from TableHeader / TableBody / TableFooter, each holding TableRow and TableCell, instead of using data-driven rendering. The children are passed straight to the <table>, so the section is yours to supply
|
|
112
|
+
description: 'Children mode: compose the table yourself from TableHeader / TableBody / TableFooter, each holding TableRow and TableCell, instead of using data-driven rendering. The children are passed straight to the <table>, so the section is yours to supply. A TableRow placed directly in Table emits <table><tr>, which is invalid HTML and mismatches on hydration (the parser inserts an implied <tbody> for server-rendered markup; React does not on the client). Data-driven mode renders the sections for you.',
|
|
111
113
|
},
|
|
112
114
|
{
|
|
113
115
|
name: 'xstyle',
|
|
@@ -187,7 +189,7 @@ export const docsDense = {
|
|
|
187
189
|
bestPractices: [
|
|
188
190
|
{ guidance: true, description: 'Use density and divider variants to match the information density and scanning needs of your data.' },
|
|
189
191
|
{ guidance: true, description: 'Compose rich cell content with Astryx components like Badge, StatusDot, and Avatar via renderCell.' },
|
|
190
|
-
{ guidance: true, description: 'Children mode: wrap rows in TableHeader/TableBody/TableFooter. <table> cannot hold a <tr> directly
|
|
192
|
+
{ guidance: true, description: 'Children mode: wrap rows in TableHeader/TableBody/TableFooter. <table> cannot hold a <tr> directly; the parser adds an implied <tbody> for SSR markup, React does not on the client, so unwrapped rows mismatch on hydration.' },
|
|
191
193
|
{ guidance: true, description: 'Set explicit width on every column via proportional() or pixel(). proportional(1) = equal flex w/ 120px min preventing collapse on narrow viewports. Omitting width skips the minimum.' },
|
|
192
194
|
{ guidance: true, description: 'Data-driven API is RSC-safe: proportional(), pixel(), column defs w/o function props work in Server Components. renderCell (any function prop) requires a "use client" wrapper.' },
|
|
193
195
|
{ guidance: false, description: 'Use a table for data without consistent columns. Use a list or card layout for heterogeneous content.' },
|
package/src/Table/Table.tsx
CHANGED
|
@@ -186,16 +186,11 @@ function buildTableStylePlugin<
|
|
|
186
186
|
>(): TablePlugin<T> {
|
|
187
187
|
return {
|
|
188
188
|
transformTable(props: TableRenderProps): TableRenderProps {
|
|
189
|
-
|
|
190
|
-
|
|
189
|
+
// The `astryx-table` class itself comes from BaseTable, which renders
|
|
190
|
+
// the <table> element and now names it `table` (with `base-table` as its
|
|
191
|
+
// legacy name). Adding it here too would put the token on twice.
|
|
191
192
|
return {
|
|
192
193
|
...props,
|
|
193
|
-
htmlProps: {
|
|
194
|
-
...props.htmlProps,
|
|
195
|
-
className: existingClass
|
|
196
|
-
? `${existingClass} ${tableClass}`
|
|
197
|
-
: tableClass,
|
|
198
|
-
},
|
|
199
194
|
xstyle: [...props.xstyle, tableStyles.base],
|
|
200
195
|
};
|
|
201
196
|
},
|
|
@@ -8,7 +8,7 @@ export const docs = {
|
|
|
8
8
|
displayName: 'Table Body',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
10
|
description:
|
|
11
|
-
'<tbody> wrapper for children mode. Holds the data rows. A row must sit inside a section
|
|
11
|
+
'<tbody> wrapper for children mode. Holds the data rows. A row must sit inside a section: <table> cannot contain a <tr> directly, because the HTML parser inserts an implied <tbody> when it parses server-rendered markup and React does not when it renders on the client, so rows written straight into Table mismatch on hydration. The data-driven data={...} mode renders this element itself; in children mode it is yours to supply.',
|
|
12
12
|
props: [
|
|
13
13
|
{
|
|
14
14
|
name: 'children',
|
|
@@ -32,7 +32,7 @@ export const docsDense = {
|
|
|
32
32
|
name: 'TableBody',
|
|
33
33
|
isHiddenFromOverview: true,
|
|
34
34
|
displayName: 'Table Body',
|
|
35
|
-
description: '<tbody> wrapper for children mode; holds the data rows
|
|
35
|
+
description: '<tbody> wrapper for children mode; holds the data rows; children mode does not add one for you',
|
|
36
36
|
propDescriptions: {
|
|
37
37
|
children: 'The <tbody> rows.',
|
|
38
38
|
xstyle: 'StyleX styles for layout customization',
|
|
@@ -8,7 +8,7 @@ export const docs = {
|
|
|
8
8
|
displayName: 'Table Footer',
|
|
9
9
|
isHiddenFromOverview: true,
|
|
10
10
|
description:
|
|
11
|
-
'<tfoot> wrapper for children mode. Holds summary or total rows beneath the body. A row must sit inside a section
|
|
11
|
+
'<tfoot> wrapper for children mode. Holds summary or total rows beneath the body. A row must sit inside a section: <table> cannot contain a <tr> directly, because the HTML parser inserts an implied <tbody> when it parses server-rendered markup and React does not when it renders on the client, so the two trees mismatch on hydration. Children mode only: the data-driven data={...} path renders a header and a body, never a footer.',
|
|
12
12
|
props: [
|
|
13
13
|
{
|
|
14
14
|
name: 'children',
|