@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
|
@@ -353,6 +353,7 @@ describe('ComplexSelector', () => {
|
|
|
353
353
|
.closest('[popover]');
|
|
354
354
|
expect(popover).not.toBeNull();
|
|
355
355
|
|
|
356
|
+
fireEvent.pointerDown(trigger);
|
|
356
357
|
const closeEvent = new Event('toggle');
|
|
357
358
|
Object.defineProperty(closeEvent, 'newState', {value: 'closed'});
|
|
358
359
|
fireEvent(popover as HTMLElement, closeEvent);
|
|
@@ -417,4 +418,186 @@ describe('ComplexSelector popup theme target', () => {
|
|
|
417
418
|
document.querySelector('.astryx-complex-selector-popup'),
|
|
418
419
|
).not.toBeNull();
|
|
419
420
|
});
|
|
421
|
+
|
|
422
|
+
it('stays closed when the trigger click follows its own light dismiss (#5004)', async () => {
|
|
423
|
+
const user = userEvent.setup();
|
|
424
|
+
render(
|
|
425
|
+
<ComplexSelector label="Fruit blend" value="Apple" triggerLabel="Apple">
|
|
426
|
+
{() => <button type="button">Done</button>}
|
|
427
|
+
</ComplexSelector>,
|
|
428
|
+
);
|
|
429
|
+
const trigger = screen.getByRole('button', {name: 'Fruit blend'});
|
|
430
|
+
await user.click(trigger);
|
|
431
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
432
|
+
|
|
433
|
+
// The browser dismissed the popup on pointerup and queued the toggle. When
|
|
434
|
+
// that event lands before the click — WebKit, or any engine under load —
|
|
435
|
+
// the click used to read a closed popup and reopen it.
|
|
436
|
+
fireEvent.pointerDown(trigger);
|
|
437
|
+
const popover = document.querySelector('[popover]') as HTMLElement;
|
|
438
|
+
act(() => {
|
|
439
|
+
popover.dispatchEvent(
|
|
440
|
+
Object.assign(new Event('toggle'), {
|
|
441
|
+
oldState: 'open',
|
|
442
|
+
newState: 'closed',
|
|
443
|
+
}),
|
|
444
|
+
);
|
|
445
|
+
});
|
|
446
|
+
// Synchronously: the click falls inside the one gesture the guard covers,
|
|
447
|
+
// as it does in a browser a few milliseconds behind the dismissal.
|
|
448
|
+
fireEvent.click(trigger);
|
|
449
|
+
|
|
450
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
451
|
+
});
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
describe('ComplexSelector onOpenChange', () => {
|
|
455
|
+
function renderSelector(onOpenChange: (isOpen: boolean) => void) {
|
|
456
|
+
render(
|
|
457
|
+
<ComplexSelector
|
|
458
|
+
label="View options"
|
|
459
|
+
value={[]}
|
|
460
|
+
onOpenChange={onOpenChange}>
|
|
461
|
+
{(_value, _onChange, close) => (
|
|
462
|
+
<button type="button" onClick={close}>
|
|
463
|
+
Apply
|
|
464
|
+
</button>
|
|
465
|
+
)}
|
|
466
|
+
</ComplexSelector>,
|
|
467
|
+
);
|
|
468
|
+
return screen.getByRole('button', {name: 'View options'});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
it('reports the open and the close of a trigger toggle', async () => {
|
|
472
|
+
const user = userEvent.setup();
|
|
473
|
+
const onOpenChange = vi.fn();
|
|
474
|
+
const trigger = renderSelector(onOpenChange);
|
|
475
|
+
|
|
476
|
+
await user.click(trigger);
|
|
477
|
+
expect(onOpenChange.mock.calls).toEqual([[true]]);
|
|
478
|
+
|
|
479
|
+
await user.click(trigger);
|
|
480
|
+
expect(onOpenChange.mock.calls).toEqual([[true], [false]]);
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
it('reports an open from ArrowDown', async () => {
|
|
484
|
+
const user = userEvent.setup();
|
|
485
|
+
const onOpenChange = vi.fn();
|
|
486
|
+
const trigger = renderSelector(onOpenChange);
|
|
487
|
+
|
|
488
|
+
trigger.focus();
|
|
489
|
+
await user.keyboard('{ArrowDown}');
|
|
490
|
+
|
|
491
|
+
expect(onOpenChange.mock.calls).toEqual([[true]]);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
it('reports a close from Escape', async () => {
|
|
495
|
+
const user = userEvent.setup();
|
|
496
|
+
const onOpenChange = vi.fn();
|
|
497
|
+
const trigger = renderSelector(onOpenChange);
|
|
498
|
+
|
|
499
|
+
await user.click(trigger);
|
|
500
|
+
onOpenChange.mockClear();
|
|
501
|
+
await user.keyboard('{Escape}');
|
|
502
|
+
|
|
503
|
+
expect(onOpenChange.mock.calls).toEqual([[false]]);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
it('reports a close the browser performed (light dismiss)', async () => {
|
|
507
|
+
const user = userEvent.setup();
|
|
508
|
+
const onOpenChange = vi.fn();
|
|
509
|
+
const trigger = renderSelector(onOpenChange);
|
|
510
|
+
|
|
511
|
+
await user.click(trigger);
|
|
512
|
+
onOpenChange.mockClear();
|
|
513
|
+
|
|
514
|
+
const popover = screen
|
|
515
|
+
.getByRole('dialog', {hidden: true})
|
|
516
|
+
.closest('[popover]') as HTMLElement;
|
|
517
|
+
const closeEvent = new Event('toggle');
|
|
518
|
+
Object.defineProperty(closeEvent, 'newState', {value: 'closed'});
|
|
519
|
+
fireEvent(popover, closeEvent);
|
|
520
|
+
|
|
521
|
+
expect(onOpenChange.mock.calls).toEqual([[false]]);
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
it('reports a gesture light dismiss once without reopening from its click', async () => {
|
|
525
|
+
const user = userEvent.setup();
|
|
526
|
+
const onOpenChange = vi.fn();
|
|
527
|
+
const trigger = renderSelector(onOpenChange);
|
|
528
|
+
|
|
529
|
+
await user.click(trigger);
|
|
530
|
+
onOpenChange.mockClear();
|
|
531
|
+
|
|
532
|
+
const popover = screen
|
|
533
|
+
.getByRole('dialog', {hidden: true})
|
|
534
|
+
.closest('[popover]') as HTMLElement;
|
|
535
|
+
fireEvent.pointerDown(trigger);
|
|
536
|
+
fireEvent(
|
|
537
|
+
popover,
|
|
538
|
+
Object.assign(new Event('toggle'), {
|
|
539
|
+
oldState: 'open',
|
|
540
|
+
newState: 'closed',
|
|
541
|
+
}),
|
|
542
|
+
);
|
|
543
|
+
fireEvent.click(trigger);
|
|
544
|
+
|
|
545
|
+
expect(onOpenChange.mock.calls).toEqual([[false]]);
|
|
546
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
547
|
+
});
|
|
548
|
+
|
|
549
|
+
it('reports a close from content calling close()', async () => {
|
|
550
|
+
const user = userEvent.setup();
|
|
551
|
+
const onOpenChange = vi.fn();
|
|
552
|
+
const trigger = renderSelector(onOpenChange);
|
|
553
|
+
|
|
554
|
+
await user.click(trigger);
|
|
555
|
+
onOpenChange.mockClear();
|
|
556
|
+
await user.click(screen.getByRole('button', {name: 'Apply', ...h}));
|
|
557
|
+
|
|
558
|
+
expect(onOpenChange.mock.calls).toEqual([[false]]);
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
it('reports opens and closes driven through the imperative handle', () => {
|
|
562
|
+
const onOpenChange = vi.fn();
|
|
563
|
+
const handleRef = React.createRef<ComplexSelectorHandle>();
|
|
564
|
+
render(
|
|
565
|
+
<ComplexSelector
|
|
566
|
+
label="View options"
|
|
567
|
+
value={[]}
|
|
568
|
+
handleRef={handleRef}
|
|
569
|
+
onOpenChange={onOpenChange}>
|
|
570
|
+
{() => <button type="button">Apply</button>}
|
|
571
|
+
</ComplexSelector>,
|
|
572
|
+
);
|
|
573
|
+
|
|
574
|
+
act(() => handleRef.current?.open());
|
|
575
|
+
act(() => handleRef.current?.close());
|
|
576
|
+
act(() => handleRef.current?.toggle());
|
|
577
|
+
|
|
578
|
+
expect(onOpenChange.mock.calls).toEqual([[true], [false], [true]]);
|
|
579
|
+
});
|
|
580
|
+
|
|
581
|
+
it('does not report a state it is already in', async () => {
|
|
582
|
+
const user = userEvent.setup();
|
|
583
|
+
const onOpenChange = vi.fn();
|
|
584
|
+
const handleRef = React.createRef<ComplexSelectorHandle>();
|
|
585
|
+
render(
|
|
586
|
+
<ComplexSelector
|
|
587
|
+
label="View options"
|
|
588
|
+
value={[]}
|
|
589
|
+
handleRef={handleRef}
|
|
590
|
+
onOpenChange={onOpenChange}>
|
|
591
|
+
{() => <button type="button">Apply</button>}
|
|
592
|
+
</ComplexSelector>,
|
|
593
|
+
);
|
|
594
|
+
const trigger = screen.getByRole('button', {name: 'View options'});
|
|
595
|
+
|
|
596
|
+
act(() => handleRef.current?.close());
|
|
597
|
+
expect(onOpenChange).not.toHaveBeenCalled();
|
|
598
|
+
|
|
599
|
+
await user.click(trigger);
|
|
600
|
+
act(() => handleRef.current?.open());
|
|
601
|
+
expect(onOpenChange.mock.calls).toEqual([[true]]);
|
|
602
|
+
});
|
|
420
603
|
});
|
|
@@ -50,6 +50,7 @@ import {
|
|
|
50
50
|
import {isRenderable, mergeProps} from '../utils';
|
|
51
51
|
import {composeEventHandlers} from '../utils/composeEventHandlers';
|
|
52
52
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
53
|
+
import {interactionOverlayStyles} from '../utils/interactionOverlay.stylex';
|
|
53
54
|
import type {SizeValue} from '../utils/types';
|
|
54
55
|
import {themeProps} from '../utils/themeProps';
|
|
55
56
|
|
|
@@ -115,13 +116,6 @@ const styles = stylex.create({
|
|
|
115
116
|
width: 'auto',
|
|
116
117
|
borderWidth: 0,
|
|
117
118
|
backgroundColor: 'transparent',
|
|
118
|
-
backgroundImage: {
|
|
119
|
-
default: null,
|
|
120
|
-
':hover:where(:not(:disabled,[aria-disabled="true"]))': {
|
|
121
|
-
'@media (hover: hover)': `linear-gradient(${colorVars['--color-overlay-hover']}, ${colorVars['--color-overlay-hover']})`,
|
|
122
|
-
},
|
|
123
|
-
':active': `linear-gradient(${colorVars['--color-overlay-pressed']}, ${colorVars['--color-overlay-pressed']})`,
|
|
124
|
-
},
|
|
125
119
|
boxShadow: {
|
|
126
120
|
default: 'none',
|
|
127
121
|
':hover:not(:focus-within):where(:not(:disabled,[aria-disabled="true"]))':
|
|
@@ -209,7 +203,8 @@ export interface ComplexSelectorRenderState {
|
|
|
209
203
|
* they respect focus restoration, light dismiss, and Escape. Prefer these
|
|
210
204
|
* callbacks over mirroring open state in the parent — the selector owns its
|
|
211
205
|
* visibility, and imperative calls avoid the focus-management pitfalls of
|
|
212
|
-
* syncing an external `isOpen` prop.
|
|
206
|
+
* syncing an external `isOpen` prop. Pair with `onOpenChange` to observe every
|
|
207
|
+
* open and close, including the ones the selector performs itself.
|
|
213
208
|
*/
|
|
214
209
|
export interface ComplexSelectorHandle {
|
|
215
210
|
/** Open the selector surface. No-op when disabled or already open. */
|
|
@@ -286,6 +281,13 @@ export interface ComplexSelectorProps<Value> extends Omit<
|
|
|
286
281
|
* state in the parent — the selector owns its visibility.
|
|
287
282
|
*/
|
|
288
283
|
handleRef?: React.Ref<ComplexSelectorHandle>;
|
|
284
|
+
/**
|
|
285
|
+
* Called whenever the selector surface opens or closes, however it happened
|
|
286
|
+
* — the trigger, the keyboard, a light dismiss, Escape, content that calls
|
|
287
|
+
* `close()`, or the imperative handle. Pair it with `handleRef` to drive the
|
|
288
|
+
* surface from outside without mirroring its state.
|
|
289
|
+
*/
|
|
290
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
289
291
|
/** StyleX styles for the popup content container. */
|
|
290
292
|
contentXstyle?: StyleXStyles;
|
|
291
293
|
/** Test ID for the trigger container. */
|
|
@@ -343,6 +345,7 @@ export function ComplexSelector<Value>({
|
|
|
343
345
|
placement = 'below',
|
|
344
346
|
alignment = 'start',
|
|
345
347
|
handleRef,
|
|
348
|
+
onOpenChange,
|
|
346
349
|
contentXstyle,
|
|
347
350
|
xstyle,
|
|
348
351
|
className,
|
|
@@ -373,29 +376,35 @@ export function ComplexSelector<Value>({
|
|
|
373
376
|
.join(' ') || undefined;
|
|
374
377
|
|
|
375
378
|
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
376
|
-
const lastHideTimeRef = useRef(0);
|
|
377
379
|
|
|
378
380
|
const [isPending, startTransition] = useTransition();
|
|
379
381
|
const [optimisticValue, setOptimisticValue] = useOptimistic(value);
|
|
380
382
|
const isBusy = isLoading || isPending;
|
|
381
383
|
|
|
384
|
+
const handlePopoverShow = useCallback(() => {
|
|
385
|
+
onOpenChange?.(true);
|
|
386
|
+
}, [onOpenChange]);
|
|
387
|
+
|
|
382
388
|
const handlePopoverHide = useCallback(() => {
|
|
383
|
-
|
|
389
|
+
// Focus is restored first so a consumer that moves focus elsewhere from
|
|
390
|
+
// the callback wins, instead of being overwritten a line later.
|
|
384
391
|
triggerRef.current?.focus();
|
|
385
|
-
|
|
392
|
+
onOpenChange?.(false);
|
|
393
|
+
}, [onOpenChange]);
|
|
386
394
|
|
|
387
395
|
const popover = usePopover({
|
|
388
396
|
dialogLabel: label,
|
|
389
397
|
hasCloseButton: false,
|
|
390
398
|
hasAutoFocus: true,
|
|
391
399
|
surfaceTarget: 'complex-selector-popup',
|
|
400
|
+
onShow: handlePopoverShow,
|
|
392
401
|
onHide: handlePopoverHide,
|
|
393
402
|
});
|
|
394
403
|
|
|
395
404
|
const isOpen = popover.isOpen;
|
|
396
405
|
|
|
397
406
|
const handleTriggerClick = useCallback(() => {
|
|
398
|
-
if (isDisabled
|
|
407
|
+
if (isDisabled) {
|
|
399
408
|
return;
|
|
400
409
|
}
|
|
401
410
|
if (popover.isOpen) {
|
|
@@ -487,6 +496,7 @@ export function ComplexSelector<Value>({
|
|
|
487
496
|
// pointer users too. `focusWithin` here is `:has(:focus-visible)`.
|
|
488
497
|
focusOutlineStyles.focusWithin,
|
|
489
498
|
variant === 'ghost' && styles.triggerGhost,
|
|
499
|
+
variant === 'ghost' && interactionOverlayStyles.backgroundImage,
|
|
490
500
|
isDisabled && inputWrapperStyles.disabled,
|
|
491
501
|
variant === 'ghost' && isDisabled && styles.triggerGhostDisabled,
|
|
492
502
|
isDisabled && styles.disabled,
|
|
@@ -6,7 +6,7 @@ export const docs = {
|
|
|
6
6
|
name: 'DateInput',
|
|
7
7
|
displayName: 'Date Input',
|
|
8
8
|
group: 'DateInput',
|
|
9
|
-
category: '
|
|
9
|
+
category: 'Form Controls',
|
|
10
10
|
keywords: [
|
|
11
11
|
'dateinput',
|
|
12
12
|
'datepicker',
|
|
@@ -156,6 +156,13 @@ export const docs = {
|
|
|
156
156
|
"How the committed date value is displayed. Named values are reused from Timestamp's format vocabulary: 'date' shows 'Mar 21, 2026', 'date_long' shows 'March 21, 2026', 'date_weekday' shows 'Wed, Mar 21, 2026', 'system_date' shows '2026-03-21'. A function receives the ISO value and returns a custom string. Applies only to the committed value, never to text being typed.",
|
|
157
157
|
default: "'date_long'",
|
|
158
158
|
},
|
|
159
|
+
{
|
|
160
|
+
name: 'nativePicker',
|
|
161
|
+
type: "'touch' | 'always' | 'never'",
|
|
162
|
+
description:
|
|
163
|
+
"Which surface draws the date picker. 'touch' (the default) hands a touch device to the browser/OS: the field becomes an input type=date and the platform draws the picker (the iOS wheel, the Android calendar dialog); 'always' does that wherever the browser supports input type=date; 'never' keeps Astryx's own pickers everywhere (the bottom-sheet picker on a finger, the calendar popover on a mouse). Use 'never' for a field that needs weekStartsOn, numberOfMonths or dateConstraints, none of which a native picker can express. format and placeholder still apply in native mode; min and max are forwarded, but a native picker may not show them (on iOS an out-of-range date can be selected and is refused on commit rather than greyed out).",
|
|
164
|
+
default: "'touch'",
|
|
165
|
+
},
|
|
159
166
|
{
|
|
160
167
|
name: 'width',
|
|
161
168
|
type: 'SizeValue',
|
|
@@ -437,6 +444,13 @@ export const docsZh = {
|
|
|
437
444
|
"已选日期的显示格式。命名值复用 Timestamp 的格式词汇:'date' 显示 'Mar 21, 2026','date_long' 显示 'March 21, 2026','date_weekday' 显示 'Wed, Mar 21, 2026','system_date' 显示 '2026-03-21'。函数接收 ISO 值并返回自定义字符串。仅作用于已提交的值,不影响正在输入的文本。",
|
|
438
445
|
default: "'date_long'",
|
|
439
446
|
},
|
|
447
|
+
{
|
|
448
|
+
name: 'nativePicker',
|
|
449
|
+
type: "'touch' | 'always' | 'never'",
|
|
450
|
+
description:
|
|
451
|
+
"由哪个界面绘制日期选择器。'touch'(默认)在触摸设备上交给浏览器/操作系统:字段变为 input type=date,由平台绘制选择器(iOS 滚轮、Android 日历对话框);'always' 在所有支持 input type=date 的浏览器上都这样做;'never' 始终使用 Astryx 自带的选择器(触摸设备用底部弹出选择器,鼠标设备用日历弹出层)。需要 weekStartsOn、numberOfMonths 或 dateConstraints 的字段应使用 'never',原生选择器无法表达这些。原生模式下 format 和 placeholder 仍然生效;min 和 max 会传递给原生控件,但原生选择器可能不会显示这些限制(在 iOS 上仍可选中超出范围的日期,会在提交时被拒绝,而不是变灰)。",
|
|
452
|
+
default: "'touch'",
|
|
453
|
+
},
|
|
440
454
|
{
|
|
441
455
|
name: 'xstyle',
|
|
442
456
|
type: 'StyleXStyles',
|
|
@@ -537,6 +551,8 @@ export const docsDense = {
|
|
|
537
551
|
weekStartsOn: 'first day of week in calendar (0=Sunday, or name e.g. "mon")',
|
|
538
552
|
format:
|
|
539
553
|
"committed-value display: 'date_long' (default, March 21, 2026), 'date' (Mar 21, 2026), 'date_weekday' (Wed, Mar 21, 2026), 'system_date' (2026-03-21), or (iso)=>string; reuses Timestamp vocabulary. Committed value only, not while typing.",
|
|
554
|
+
nativePicker:
|
|
555
|
+
"which surface draws the picker: 'touch' (default) = browser/OS on a coarse pointer, 'always', 'never' = Astryx's own everywhere. use 'never' for weekStartsOn/numberOfMonths/dateConstraints. format+placeholder still apply; min/max forwarded but not necessarily shown by the OS picker, refused on commit instead.",
|
|
540
556
|
xstyle: 'StyleX styles for layout; must be stylex.create() value',
|
|
541
557
|
},
|
|
542
558
|
};
|
|
@@ -917,17 +917,22 @@ describe('DateInput', () => {
|
|
|
917
917
|
expect(screen.getByDisplayValue('Jan 25, 2026')).toBeInTheDocument();
|
|
918
918
|
});
|
|
919
919
|
|
|
920
|
-
it('
|
|
921
|
-
|
|
922
|
-
<InternationalizationProvider locale=
|
|
920
|
+
it('updates when the InternationalizationProvider locale changes (#5074)', () => {
|
|
921
|
+
const renderDateInput = (locale: 'en-US' | 'es-ES') => (
|
|
922
|
+
<InternationalizationProvider locale={locale}>
|
|
923
923
|
<DateInput
|
|
924
924
|
label="Date"
|
|
925
925
|
value="2026-01-25"
|
|
926
926
|
onChange={() => {}}
|
|
927
927
|
format="date_long"
|
|
928
928
|
/>
|
|
929
|
-
</InternationalizationProvider
|
|
929
|
+
</InternationalizationProvider>
|
|
930
930
|
);
|
|
931
|
+
const {rerender} = render(renderDateInput('en-US'));
|
|
932
|
+
|
|
933
|
+
expect(screen.getByDisplayValue('January 25, 2026')).toBeInTheDocument();
|
|
934
|
+
|
|
935
|
+
rerender(renderDateInput('es-ES'));
|
|
931
936
|
expect(
|
|
932
937
|
screen.getByDisplayValue('25 de enero de 2026'),
|
|
933
938
|
).toBeInTheDocument();
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import {
|
|
20
|
-
use,
|
|
21
20
|
useId,
|
|
22
21
|
useState,
|
|
23
22
|
useCallback,
|
|
@@ -62,6 +61,7 @@ import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
|
62
61
|
import {useMediaQuery} from '../hooks/useMediaQuery';
|
|
63
62
|
import {useResolvedRequired} from '../hooks/useResolvedRequired';
|
|
64
63
|
import {usePopover} from '../Popover';
|
|
64
|
+
import {NativeDateField} from './NativeDateField';
|
|
65
65
|
import {TouchDateField} from './TouchDateField';
|
|
66
66
|
import {useTooltip} from '../Tooltip';
|
|
67
67
|
import {getInputARIA, isImeKeyEvent, parseDateInput} from '../utils';
|
|
@@ -150,6 +150,17 @@ export type DateInputSize = keyof typeof sizeStyles;
|
|
|
150
150
|
* types stay in compile-time lockstep: renaming or removing one of these
|
|
151
151
|
* members from `TimestampFormat` breaks this type at build time.
|
|
152
152
|
*/
|
|
153
|
+
/**
|
|
154
|
+
* When DateInput hands date picking to the browser/OS instead of its own
|
|
155
|
+
* surfaces.
|
|
156
|
+
*
|
|
157
|
+
* - `'touch'`: native on touch devices (coarse pointer), Astryx's calendar
|
|
158
|
+
* popover on mouse-driven ones
|
|
159
|
+
* - `'always'`: native wherever the browser supports `<input type="date">`
|
|
160
|
+
* - `'never'`: Astryx's own pickers everywhere
|
|
161
|
+
*/
|
|
162
|
+
export type DateInputNativePicker = 'touch' | 'always' | 'never';
|
|
163
|
+
|
|
153
164
|
export type DateInputFormat = Extract<
|
|
154
165
|
TimestampFormat,
|
|
155
166
|
'date' | 'date_long' | 'date_weekday' | 'system_date'
|
|
@@ -167,7 +178,7 @@ import type {SizeValue} from '../utils/types';
|
|
|
167
178
|
import {themeProps} from '../utils/themeProps';
|
|
168
179
|
import {focusOutlineStyles} from '../utils/focusOutline.stylex';
|
|
169
180
|
import {stableClassName} from '../naming';
|
|
170
|
-
import {
|
|
181
|
+
import {useLocale, useTranslator} from '../i18n';
|
|
171
182
|
|
|
172
183
|
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
173
184
|
export interface DateInputProps extends Omit<
|
|
@@ -361,6 +372,40 @@ export interface DateInputProps extends Omit<
|
|
|
361
372
|
* ```
|
|
362
373
|
*/
|
|
363
374
|
format?: DateInputFormat | ((value: ISODateString) => string);
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* When date picking is handed to the browser/OS instead of Astryx's own
|
|
378
|
+
* surfaces: the field becomes an `<input type="date">` and the platform
|
|
379
|
+
* draws the picker — the iOS wheel, the Android calendar dialog — with the
|
|
380
|
+
* OS's own hit areas, momentum scrolling, locale and accessibility
|
|
381
|
+
* settings.
|
|
382
|
+
*
|
|
383
|
+
* - `'touch'` (default): native on touch devices (coarse pointer), the text
|
|
384
|
+
* field and calendar popover on mouse-driven ones
|
|
385
|
+
* - `'always'`: native wherever the browser supports `<input type="date">`
|
|
386
|
+
* - `'never'`: Astryx's own pickers everywhere — the touch picker on a
|
|
387
|
+
* finger, the calendar popover on a mouse
|
|
388
|
+
*
|
|
389
|
+
* `format` and `placeholder` still apply in native mode: DateInput paints
|
|
390
|
+
* the closed field's text itself, over the control. `numberOfMonths` and
|
|
391
|
+
* `weekStartsOn` do not — they describe a calendar grid the native picker
|
|
392
|
+
* does not have — so a field that needs either should pass `'never'`.
|
|
393
|
+
*
|
|
394
|
+
* `min` and `max` are forwarded, but note that a native picker may not
|
|
395
|
+
* *show* them: on iOS they are constraint-validation flags rather than
|
|
396
|
+
* clamps, so an out-of-range date can be selected and is refused on commit
|
|
397
|
+
* (announced to assistive technology) rather than being greyed out in the
|
|
398
|
+
* picker. `dateConstraints` is enforced the same way, on commit, and is
|
|
399
|
+
* reason enough to prefer `'never'` on a field that uses it.
|
|
400
|
+
*
|
|
401
|
+
* @default 'touch'
|
|
402
|
+
* @example
|
|
403
|
+
* ```
|
|
404
|
+
* // Astryx's own touch picker instead of the platform's
|
|
405
|
+
* <DateInput label="Event date" value={date} onChange={setDate} nativePicker="never" />
|
|
406
|
+
* ```
|
|
407
|
+
*/
|
|
408
|
+
nativePicker?: DateInputNativePicker;
|
|
364
409
|
}
|
|
365
410
|
|
|
366
411
|
/**
|
|
@@ -419,8 +464,8 @@ function PointerDateField({
|
|
|
419
464
|
...rest
|
|
420
465
|
}: DateInputProps) {
|
|
421
466
|
const t = useTranslator();
|
|
467
|
+
const locale = useLocale();
|
|
422
468
|
const isEffectivelyRequired = useResolvedRequired({isRequired, isOptional});
|
|
423
|
-
const {locale} = use(InternationalizationContext);
|
|
424
469
|
const placeholder =
|
|
425
470
|
placeholderFromProps ?? t('@astryx.dateInput.placeholder');
|
|
426
471
|
const size = useSize(sizeProp, 'md');
|
|
@@ -887,7 +932,13 @@ PointerDateField.displayName = 'PointerDateField';
|
|
|
887
932
|
*/
|
|
888
933
|
export function DateInput(props: DateInputProps) {
|
|
889
934
|
const isTouch = useMediaQuery(TOUCH_POINTER_QUERY);
|
|
935
|
+
const nativePicker = props.nativePicker ?? 'touch';
|
|
890
936
|
|
|
937
|
+
// The platform's picker, where the consumer asked for it — see the
|
|
938
|
+
// `nativePicker` prop for what that trades away.
|
|
939
|
+
if (nativePicker === 'always' || (nativePicker === 'touch' && isTouch)) {
|
|
940
|
+
return <NativeDateField {...props} />;
|
|
941
|
+
}
|
|
891
942
|
return isTouch ? (
|
|
892
943
|
<TouchDateField {...props} />
|
|
893
944
|
) : (
|