@astryxdesign/core 0.5.0 → 0.5.1-canary.046f6ea
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/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
|
+
};
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
import {createContext} from 'react';
|
|
26
|
+
import {getResolve} from './resolve';
|
|
26
27
|
import type {Locale, MessagesByLocale, Overrides} from './types';
|
|
27
28
|
|
|
28
29
|
export interface InternationalizationContextValue {
|
|
@@ -30,6 +31,7 @@ export interface InternationalizationContextValue {
|
|
|
30
31
|
direction: 'ltr' | 'rtl';
|
|
31
32
|
messages: MessagesByLocale;
|
|
32
33
|
overrides?: Overrides;
|
|
34
|
+
translate: ReturnType<typeof getResolve>;
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
/**
|
|
@@ -41,5 +43,6 @@ export const InternationalizationContext =
|
|
|
41
43
|
locale: 'en',
|
|
42
44
|
direction: 'ltr',
|
|
43
45
|
messages: {},
|
|
46
|
+
translate: getResolve('en', {}),
|
|
44
47
|
});
|
|
45
48
|
InternationalizationContext.displayName = 'InternationalizationContext';
|
|
@@ -23,6 +23,7 @@ import {useMemo, type ReactNode} from 'react';
|
|
|
23
23
|
import {InternationalizationContext} from './InternationalizationContext';
|
|
24
24
|
import {getLocaleDirection} from './getLocaleDirection';
|
|
25
25
|
import type {Locale, MessagesByLocale, Overrides} from './types';
|
|
26
|
+
import {getResolve} from './resolve';
|
|
26
27
|
|
|
27
28
|
export interface InternationalizationProviderProps {
|
|
28
29
|
/**
|
|
@@ -85,7 +86,13 @@ export function InternationalizationProvider({
|
|
|
85
86
|
}: InternationalizationProviderProps) {
|
|
86
87
|
const direction = dir ?? getLocaleDirection(locale);
|
|
87
88
|
const value = useMemo(
|
|
88
|
-
() => ({
|
|
89
|
+
() => ({
|
|
90
|
+
locale,
|
|
91
|
+
direction,
|
|
92
|
+
messages: messages ?? {},
|
|
93
|
+
overrides,
|
|
94
|
+
translate: getResolve(locale, messages ?? {}, overrides),
|
|
95
|
+
}),
|
|
89
96
|
[locale, direction, messages, overrides],
|
|
90
97
|
);
|
|
91
98
|
return (
|
|
@@ -9,9 +9,16 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import {describe, expect, test, beforeEach, vi} from 'vitest';
|
|
12
|
-
import {__resetForTests,
|
|
12
|
+
import {__resetForTests, getResolve, resolveLocaleChain} from '../resolve';
|
|
13
13
|
import type {Catalog, MessagesByLocale, Overrides} from '../types';
|
|
14
14
|
|
|
15
|
+
const resolve = (
|
|
16
|
+
...[key, values, locale, messages, overrides]: [
|
|
17
|
+
...Parameters<ReturnType<typeof getResolve>>,
|
|
18
|
+
...Parameters<typeof getResolve>,
|
|
19
|
+
]
|
|
20
|
+
) => getResolve(locale, messages, overrides)(key, values);
|
|
21
|
+
|
|
15
22
|
// Reset caches between tests so warn-once and formatter cache don't bleed.
|
|
16
23
|
beforeEach(() => {
|
|
17
24
|
__resetForTests();
|
|
@@ -209,6 +216,21 @@ describe('resolve — overrides', () => {
|
|
|
209
216
|
// Should fall through to en since fr has no messages and es override doesn't apply
|
|
210
217
|
expect(out).toBe('Go to next page');
|
|
211
218
|
});
|
|
219
|
+
|
|
220
|
+
test('override `pt` should take precedence over message `pt-BR`', () => {
|
|
221
|
+
const overrides: Overrides = {
|
|
222
|
+
pt: {key: 'override'},
|
|
223
|
+
};
|
|
224
|
+
const messages: MessagesByLocale = {
|
|
225
|
+
'pt-BR': {
|
|
226
|
+
key: {
|
|
227
|
+
defaultMessage: 'shipped',
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
const out = resolve('key', undefined, 'pt-BR', messages, overrides);
|
|
232
|
+
expect(out).toBe('override');
|
|
233
|
+
});
|
|
212
234
|
});
|
|
213
235
|
|
|
214
236
|
describe('resolve — ICU MessageFormat', () => {
|
package/src/i18n/resolve.ts
CHANGED
|
@@ -73,74 +73,71 @@ export function resolveLocaleChain(locale: Locale): Locale[] {
|
|
|
73
73
|
return chain;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
function
|
|
77
|
-
key: string,
|
|
76
|
+
function getLookup(
|
|
78
77
|
locale: Locale,
|
|
79
78
|
messages: MessagesByLocale,
|
|
80
|
-
overrides
|
|
81
|
-
): string
|
|
79
|
+
overrides?: Overrides,
|
|
80
|
+
): Record<string, string> {
|
|
81
|
+
const lookup: Record<string, string> = {};
|
|
82
82
|
const chain = resolveLocaleChain(locale);
|
|
83
|
-
|
|
84
83
|
// 1 + 2. Overrides (most specific to least specific in the chain)
|
|
85
84
|
if (overrides !== undefined) {
|
|
86
85
|
for (const tag of chain) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
if (overrides[tag]) {
|
|
87
|
+
for (const [key, value] of Object.entries(overrides[tag])) {
|
|
88
|
+
if (lookup[key] === undefined && value !== null) {
|
|
89
|
+
lookup[key] = value;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
90
92
|
}
|
|
91
93
|
}
|
|
92
94
|
}
|
|
93
|
-
|
|
94
|
-
// 3 + 4. Shipped catalogs (most specific to least specific)
|
|
95
95
|
for (const tag of chain) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
if (messages[tag]) {
|
|
97
|
+
for (const [key, value] of Object.entries(messages[tag])) {
|
|
98
|
+
if (lookup[key] === undefined && value?.defaultMessage !== null) {
|
|
99
|
+
lookup[key] = value?.defaultMessage;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
99
102
|
}
|
|
100
103
|
}
|
|
101
104
|
|
|
102
|
-
|
|
103
|
-
const enEntry = EN_CATALOG[key];
|
|
104
|
-
if (enEntry !== undefined) {
|
|
105
|
-
return enEntry.defaultMessage;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// 6. Nothing found
|
|
109
|
-
return null;
|
|
105
|
+
return lookup;
|
|
110
106
|
}
|
|
111
107
|
|
|
112
|
-
export function
|
|
113
|
-
key: string,
|
|
114
|
-
values: Record<string, unknown> | undefined,
|
|
108
|
+
export function getResolve(
|
|
115
109
|
locale: Locale,
|
|
116
110
|
messages: MessagesByLocale,
|
|
117
|
-
overrides
|
|
118
|
-
)
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
111
|
+
overrides?: Overrides,
|
|
112
|
+
) {
|
|
113
|
+
const lookup = getLookup(locale, messages, overrides);
|
|
114
|
+
|
|
115
|
+
return (key: string, values: Record<string, unknown> | undefined) => {
|
|
116
|
+
const result = lookup[key] ?? EN_CATALOG[key]?.defaultMessage;
|
|
117
|
+
if (result === undefined) {
|
|
118
|
+
// Fires ONLY when a key is missing from every source including the
|
|
119
|
+
// shipped `en` catalog — a real bug (typo, stale catalog, deleted key).
|
|
120
|
+
// Fallback to `en` from a non-en locale is expected and stays silent,
|
|
121
|
+
// matching the FormatJS / i18next default.
|
|
122
|
+
warnOnce(
|
|
123
|
+
`astryx-i18n:${locale}::${key}`,
|
|
124
|
+
'astryx-i18n',
|
|
125
|
+
`missing key: ${key} (locale: ${locale})`,
|
|
126
|
+
);
|
|
127
|
+
return key;
|
|
128
|
+
}
|
|
133
129
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
130
|
+
if (values === undefined) {
|
|
131
|
+
// Static string — skip the parser entirely for the common case
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
138
134
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
135
|
+
const formatted = getFormatter(result, locale).format(values);
|
|
136
|
+
// IntlMessageFormat.format returns string | (string | React elements) — we
|
|
137
|
+
// only ever pass string values so it will be a string; assert for the type
|
|
138
|
+
// system.
|
|
139
|
+
return formatted as string;
|
|
140
|
+
};
|
|
144
141
|
}
|
|
145
142
|
|
|
146
143
|
/**
|
|
@@ -19,9 +19,8 @@
|
|
|
19
19
|
* - /packages/core/src/i18n/t.client.ts
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import {use
|
|
22
|
+
import {use} from 'react';
|
|
23
23
|
import {InternationalizationContext} from './InternationalizationContext';
|
|
24
|
-
import {resolve} from './resolve';
|
|
25
24
|
|
|
26
25
|
export type TranslatorFn = (
|
|
27
26
|
key: string,
|
|
@@ -42,9 +41,5 @@ export type TranslatorFn = (
|
|
|
42
41
|
*/
|
|
43
42
|
export function useTranslator(): TranslatorFn {
|
|
44
43
|
const ctx = use(InternationalizationContext);
|
|
45
|
-
return
|
|
46
|
-
(key: string, values?: Record<string, unknown>) =>
|
|
47
|
-
resolve(key, values, ctx.locale, ctx.messages, ctx.overrides),
|
|
48
|
-
[ctx.locale, ctx.messages, ctx.overrides],
|
|
49
|
-
);
|
|
44
|
+
return ctx.translate;
|
|
50
45
|
}
|
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
|
});
|