@astryxdesign/core 0.7.5 → 0.7.6-canary.5cd7a15
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/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +5 -5
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +12 -3
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +7 -1
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetPanel.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetPanel.js +2 -1
- package/dist/BottomSheet/useSheetGestures.d.ts +12 -0
- package/dist/BottomSheet/useSheetGestures.d.ts.map +1 -1
- package/dist/BottomSheet/useSheetGestures.js +30 -3
- package/dist/Button/Button.js +4 -4
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +6 -5
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +12 -4
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +101 -15
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +8 -3
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/DateRangeInput/DateRangeInput.js +1 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts +5 -2
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +23 -12
- package/dist/DateTimeInput/NativeTimeSegment.d.ts.map +1 -1
- package/dist/DateTimeInput/NativeTimeSegment.js +5 -4
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -1
- package/dist/DateTimeInput/TouchDateTimeField.js +4 -3
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +34 -9
- package/dist/Dialog/DialogHeader.d.ts.map +1 -1
- package/dist/Dialog/DialogHeader.js +5 -4
- package/dist/Divider/Divider.d.ts.map +1 -1
- package/dist/Divider/Divider.js +2 -1
- package/dist/Drawer/Drawer.d.ts +1 -0
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js +7 -2
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.d.ts.map +1 -1
- package/dist/DropdownMenu/MenuBottomSheetActionList.js +6 -5
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts +10 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.d.ts.map +1 -1
- package/dist/DropdownMenu/lazyMenuBottomSheet.js +16 -2
- package/dist/DropdownMenu/renderDropdownItems.d.ts.map +1 -1
- package/dist/DropdownMenu/renderDropdownItems.js +21 -16
- package/dist/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/EmptyState/EmptyState.js +2 -1
- package/dist/Field/FieldLabel.d.ts +1 -1
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +4 -4
- package/dist/Field/InputClearButton.js +3 -3
- package/dist/Field/PanelSearchInput.js +2 -2
- package/dist/FieldStatus/FieldStatus.js +2 -2
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +7 -1
- package/dist/Heading/Heading.js +1 -1
- package/dist/Icon/Icon.js +1 -1
- package/dist/Indicator/CheckIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckIndicator.js +2 -1
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +3 -1
- package/dist/Indicator/RadioIndicator.d.ts.map +1 -1
- package/dist/Indicator/RadioIndicator.js +3 -1
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +2 -1
- package/dist/Item/ItemSwipeLayer.js +1 -1
- package/dist/Layout/Layout.js +1 -1
- package/dist/Layout/LayoutContent.js +1 -1
- package/dist/Layout/LayoutFooter.js +1 -1
- package/dist/Layout/LayoutHeader.js +1 -1
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +5 -0
- package/dist/Lightbox/LightboxViewport.a11y.browser.spec.js +5 -4
- package/dist/List/List.js +1 -1
- package/dist/List/ListItem.js +3 -3
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +7 -2
- package/dist/MultiSelector/MultiSelector.d.ts +1 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +5 -2
- package/dist/NumberInput/NumberInput.d.ts +3 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +3 -3
- package/dist/NumberInput/numberParser.d.ts +3 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -1
- package/dist/NumberInput/numberParser.js +7 -44
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +16 -12
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +28 -2
- package/dist/SegmentedControl/SegmentedControlItem.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControlItem.js +4 -1
- package/dist/Selector/useSelectorPresentation.d.ts +8 -1
- package/dist/Selector/useSelectorPresentation.d.ts.map +1 -1
- package/dist/Selector/useSelectorPresentation.js +20 -4
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +7 -1
- package/dist/Spinner/Spinner.js +2 -2
- package/dist/Stack/Stack.js +1 -1
- package/dist/Stack/StackItem.js +1 -1
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +16 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.d.ts.map +1 -1
- package/dist/Table/plugins/columnResize/useTableColumnResize.js +9 -1
- package/dist/Text/Text.js +1 -1
- package/dist/Text/useTruncation.d.ts.map +1 -1
- package/dist/Text/useTruncation.js +23 -5
- package/dist/TextArea/TextArea.d.ts +1 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -2
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -3
- package/dist/TimeInput/TimeInput.d.ts +6 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +21 -14
- package/dist/TimeInput/TouchTimeField.d.ts.map +1 -1
- package/dist/TimeInput/TouchTimeField.js +5 -4
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +2 -2
- package/dist/Timestamp/TimestampHoverCard.js +4 -4
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +60 -20
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +82 -51
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +13 -2
- package/dist/Tokenizer/TokenizerBottomSheet.js +3 -3
- package/dist/Toolbar/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar/Toolbar.js +2 -1
- package/dist/Typeahead/Typeahead.d.ts +1 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +9 -1
- package/dist/astryx.css +15 -1
- package/dist/gestures/GestureArena.d.ts +6 -0
- package/dist/gestures/GestureArena.d.ts.map +1 -1
- package/dist/gestures/GestureArena.js +39 -0
- package/dist/gestures/GestureHost.d.ts +352 -0
- package/dist/gestures/GestureHost.d.ts.map +1 -0
- package/dist/gestures/GestureHost.js +1773 -0
- package/dist/gestures/GestureRecognizer.d.ts +10 -0
- package/dist/gestures/GestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/GestureRecognizer.js +16 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts +1 -0
- package/dist/gestures/LongPressGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/LongPressGestureRecognizer.js +3 -0
- package/dist/gestures/PanGestureRecognizer.d.ts +1 -0
- package/dist/gestures/PanGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/PanGestureRecognizer.js +3 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts +31 -0
- package/dist/gestures/PinchGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/PinchGestureRecognizer.js +128 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts +71 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/ScreenEdgePanGestureRecognizer.js +223 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts +37 -0
- package/dist/gestures/SwipeGestureRecognizer.d.ts.map +1 -0
- package/dist/gestures/SwipeGestureRecognizer.js +148 -0
- package/dist/gestures/TapGestureRecognizer.d.ts +1 -0
- package/dist/gestures/TapGestureRecognizer.d.ts.map +1 -1
- package/dist/gestures/TapGestureRecognizer.js +3 -0
- package/dist/gestures/VelocityTracker.d.ts +6 -2
- package/dist/gestures/VelocityTracker.d.ts.map +1 -1
- package/dist/gestures/VelocityTracker.js +7 -3
- package/dist/gestures/haptics.d.ts +65 -0
- package/dist/gestures/haptics.d.ts.map +1 -0
- package/dist/gestures/haptics.js +182 -0
- package/dist/gestures/nativeScroll.d.ts +42 -0
- package/dist/gestures/nativeScroll.d.ts.map +1 -0
- package/dist/gestures/nativeScroll.js +228 -0
- package/dist/gestures/touchAction.d.ts +60 -0
- package/dist/gestures/touchAction.d.ts.map +1 -0
- package/dist/gestures/touchAction.js +157 -0
- package/dist/gestures/touchActionRule.d.ts +34 -0
- package/dist/gestures/touchActionRule.d.ts.map +1 -0
- package/dist/gestures/touchActionRule.js +140 -0
- package/dist/gestures/types.d.ts +18 -7
- package/dist/gestures/types.d.ts.map +1 -1
- package/dist/gestures/types.js +22 -2
- package/dist/hooks/useAdaptivePresentation.d.ts.map +1 -1
- package/dist/hooks/useAdaptivePresentation.js +4 -1
- package/dist/hooks/useMenuHover.d.ts.map +1 -1
- package/dist/hooks/useMenuHover.js +12 -1
- package/dist/i18n/generated-locales/en.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/en.generated.js +3 -0
- package/dist/i18n/generated-locales/pseudo.generated.d.ts.map +1 -1
- package/dist/i18n/generated-locales/pseudo.generated.js +3 -0
- package/dist/motion/animator.d.ts +7 -1
- package/dist/motion/animator.d.ts.map +1 -1
- package/dist/motion/animator.js +119 -27
- package/dist/theme/defineTheme.js +1 -1
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts +3 -0
- package/dist/theme/domainTokens/domainTokenDefaults.d.ts.map +1 -0
- package/dist/theme/domainTokens/domainTokenDefaults.js +19 -0
- package/dist/theme/domainTokens/index.d.ts +5 -4
- package/dist/theme/domainTokens/index.d.ts.map +1 -1
- package/dist/theme/domainTokens/index.js +5 -9
- package/dist/utils/focusReturn.d.ts +17 -1
- package/dist/utils/focusReturn.d.ts.map +1 -1
- package/dist/utils/focusReturn.js +11 -4
- package/dist/utils/getNodeText.d.ts +8 -0
- package/dist/utils/getNodeText.d.ts.map +1 -0
- package/dist/utils/getNodeText.js +37 -0
- package/dist/utils/interactionModality.d.ts +11 -2
- package/dist/utils/interactionModality.d.ts.map +1 -1
- package/dist/utils/interactionModality.js +58 -5
- package/dist/utils/plainDate.d.ts +2 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +46 -3
- package/dist/utils/presentation.d.ts +50 -0
- package/dist/utils/presentation.d.ts.map +1 -0
- package/dist/utils/presentation.js +125 -0
- package/dist/utils/primaryClick.d.ts +11 -0
- package/dist/utils/primaryClick.d.ts.map +1 -0
- package/dist/utils/primaryClick.js +25 -0
- package/dist/utils/timeFormat.d.ts +47 -0
- package/dist/utils/timeFormat.d.ts.map +1 -0
- package/dist/utils/timeFormat.js +240 -0
- package/dist/utils/touchPresentation.d.ts.map +1 -1
- package/dist/utils/touchPresentation.js +5 -3
- package/dist/utils/touchPresentation.stylex.d.ts +15 -0
- package/dist/utils/touchPresentation.stylex.d.ts.map +1 -0
- package/dist/utils/touchPresentation.stylex.js +33 -0
- package/dist/utils/unicodeDigits.d.ts +20 -0
- package/dist/utils/unicodeDigits.d.ts.map +1 -0
- package/dist/utils/unicodeDigits.js +70 -0
- package/locales/en.json +15 -3
- package/locales/pseudo.json +9 -0
- package/package.json +5 -4
- package/src/AlertDialog/AlertDialog.tsx +6 -5
- package/src/AlertDialog/__tests__/AlertDialog.a11y.chromium.spec.ts +18 -6
- package/src/Avatar/Avatar.spec.md +22 -22
- package/src/Avatar/Avatar.tsx +18 -1
- package/src/Avatar/__tests__/AvatarForcedColors.a11y.chromium.spec.ts +126 -0
- package/src/Badge/Badge.doc.mjs +1 -1
- package/src/Badge/Badge.tsx +19 -2
- package/src/Badge/__tests__/BadgeLargerText.a11y.chromium.spec.ts +260 -0
- package/src/BottomSheet/BottomSheet.test.tsx +46 -0
- package/src/BottomSheet/BottomSheet.tsx +1 -1
- package/src/BottomSheet/BottomSheetPanel.tsx +2 -1
- package/src/BottomSheet/useSheetGestures.test.ts +52 -0
- package/src/BottomSheet/useSheetGestures.ts +37 -6
- package/src/Breadcrumbs/__tests__/Breadcrumbs.a11y.chromium.spec.ts +18 -6
- package/src/Button/Button.tsx +4 -4
- package/src/Calendar/Calendar.spec.md +87 -48
- package/src/Calendar/__tests__/Calendar.a11y.chromium.spec.ts +21 -7
- package/src/Carousel/__tests__/Carousel.a11y.chromium.spec.ts +21 -7
- package/src/CheckboxInput/CheckboxInput.tsx +6 -5
- package/src/Collapsible/Collapsible.spec.md +2 -0
- package/src/Collapsible/CollapsibleGroup.spec.md +57 -29
- package/src/Collapsible/__tests__/Collapsible.a11y.chromium.spec.ts +18 -7
- package/src/Collapsible/__tests__/CollapsibleGroupAccordion.a11y.chromium.spec.ts +18 -6
- package/src/ComplexSelector/ComplexSelector.test.tsx +37 -0
- package/src/ContextMenu/ContextMenu.test.tsx +35 -0
- package/src/DateInput/DateInput.test.tsx +115 -3
- package/src/DateInput/DateInput.tsx +29 -14
- package/src/DateInput/DateInputTouch.test.tsx +76 -0
- package/src/DateInput/MonthScroller.tsx +106 -20
- package/src/DateInput/MonthScrollerSettle.test.tsx +165 -0
- package/src/DateInput/TouchDateField.tsx +14 -3
- package/src/DateInput/__tests__/MonthScrollerSteps.interaction.browser.spec.ts +312 -0
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -3
- package/src/DateRangeInput/DateRangeInput.tsx +16 -12
- package/src/DateTimeInput/DateTimeInput.doc.mjs +10 -8
- package/src/DateTimeInput/DateTimeInput.spec.md +75 -51
- package/src/DateTimeInput/DateTimeInput.test.tsx +81 -0
- package/src/DateTimeInput/DateTimeInput.tsx +46 -24
- package/src/DateTimeInput/NativeTimeSegment.tsx +4 -6
- package/src/DateTimeInput/TouchDateTimeField.tsx +3 -7
- package/src/Dialog/Dialog.test.tsx +216 -2
- package/src/Dialog/Dialog.tsx +42 -9
- package/src/Dialog/DialogHeader.tsx +5 -4
- package/src/Dialog/__tests__/DialogSecondDocument.a11y.browser.spec.ts +202 -0
- package/src/Divider/Divider.tsx +2 -1
- package/src/Drawer/Drawer.spec.md +111 -80
- package/src/Drawer/Drawer.test.tsx +35 -0
- package/src/Drawer/Drawer.tsx +13 -2
- package/src/Drawer/DrawerHeader.spec.md +181 -0
- package/src/Drawer/__tests__/DrawerNonModalPageScroll.a11y.chromium.spec.ts +267 -0
- package/src/DropdownMenu/DropdownMenu.test.tsx +41 -0
- package/src/DropdownMenu/DropdownMenu.tsx +7 -1
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +34 -0
- package/src/DropdownMenu/MenuBottomSheetActionList.tsx +6 -5
- package/src/DropdownMenu/__tests__/Menu.a11y.chromium.spec.ts +19 -7
- package/src/DropdownMenu/__tests__/MenuButton.a11y.chromium.spec.ts +21 -9
- package/src/DropdownMenu/lazyMenuBottomSheet.test.ts +53 -0
- package/src/DropdownMenu/lazyMenuBottomSheet.ts +23 -6
- package/src/DropdownMenu/renderDropdownItems.tsx +24 -19
- package/src/EmptyState/EmptyState.tsx +2 -1
- package/src/Field/FieldLabel.tsx +5 -4
- package/src/Field/InputClearButton.tsx +3 -3
- package/src/Field/PanelSearchInput.tsx +2 -2
- package/src/FieldStatus/FieldStatus.tsx +2 -2
- package/src/FileInput/FileInput.test.tsx +21 -0
- package/src/FileInput/FileInput.tsx +4 -1
- package/src/FormLayout/FormLayout.spec.md +7 -8
- package/src/Heading/Heading.tsx +1 -1
- package/src/Icon/Icon.tsx +1 -1
- package/src/Indicator/CheckIndicator.spec.md +47 -42
- package/src/Indicator/CheckIndicator.tsx +2 -1
- package/src/Indicator/CheckboxIndicator.spec.md +40 -37
- package/src/Indicator/CheckboxIndicator.tsx +3 -1
- package/src/Indicator/Indicator.spec.md +188 -0
- package/src/Indicator/RadioIndicator.tsx +3 -1
- package/src/Item/Item.tsx +2 -1
- package/src/Item/ItemSwipeLayer.tsx +1 -1
- package/src/Layout/Layout.spec.md +127 -131
- package/src/Layout/Layout.tsx +1 -1
- package/src/Layout/LayoutContent.spec.md +205 -0
- package/src/Layout/LayoutContent.tsx +1 -1
- package/src/Layout/LayoutFooter.spec.md +190 -0
- package/src/Layout/LayoutFooter.tsx +1 -1
- package/src/Layout/LayoutHeader.spec.md +193 -0
- package/src/Layout/LayoutHeader.tsx +1 -1
- package/src/Layout/LayoutPanel.spec.md +194 -0
- package/src/Layout/__tests__/Layout.a11y.chromium.spec.ts +18 -6
- package/src/Lightbox/Lightbox.test.tsx +18 -0
- package/src/Lightbox/Lightbox.tsx +5 -0
- package/src/Lightbox/LightboxViewport.a11y.browser.spec.ts +8 -4
- package/src/Link/__tests__/Link.a11y.chromium.spec.ts +18 -8
- package/src/List/List.tsx +1 -1
- package/src/List/ListItem.spec.md +205 -0
- package/src/List/ListItem.tsx +3 -3
- package/src/MobileNav/MobileNav.test.tsx +15 -0
- package/src/MobileNav/MobileNav.tsx +9 -1
- package/src/MobileNav/__tests__/MobileNavHeader.a11y.chromium.spec.ts +89 -0
- package/src/MoreMenu/MoreMenu.test.tsx +11 -0
- package/src/MultiSelector/MultiSelector.spec.md +7 -4
- package/src/MultiSelector/MultiSelector.test.tsx +118 -1
- package/src/MultiSelector/MultiSelector.tsx +6 -2
- package/src/MultiSelector/__tests__/MultiSelector.listbox.a11y.test.tsx +8 -1
- package/src/NavMenu/NavHeadingMenu.spec.md +1 -5
- package/src/NumberInput/NumberInput.doc.mjs +13 -7
- package/src/NumberInput/NumberInput.spec.md +59 -37
- package/src/NumberInput/NumberInput.tsx +13 -3
- package/src/NumberInput/__tests__/NumberInput.coarse-pointer.a11y.chromium.spec.ts +102 -0
- package/src/NumberInput/numberParser.ts +7 -45
- package/src/ProgressBar/ProgressBar.test.tsx +108 -32
- package/src/ProgressBar/ProgressBar.tsx +58 -10
- package/src/ProgressBar/__tests__/ProgressBar.a11y.chromium.spec.ts +21 -9
- package/src/ProgressBar/__tests__/ProgressBarMotion.a11y.chromium.spec.ts +831 -0
- package/src/Resizable/__tests__/ResizeHandle.a11y.chromium.spec.ts +21 -14
- package/src/Resizable/useResizable.test.ts +43 -0
- package/src/Resizable/useResizable.ts +32 -9
- package/src/SegmentedControl/SegmentedControl.test.tsx +84 -0
- package/src/SegmentedControl/SegmentedControlItem.tsx +11 -5
- package/src/Selector/Selector.test.tsx +90 -1
- package/src/Selector/__tests__/Selector.combobox.a11y.test.tsx +8 -1
- package/src/Selector/__tests__/Selector.listbox.a11y.test.tsx +8 -1
- package/src/Selector/useSelectorPresentation.ts +31 -3
- package/src/SideNav/SideNav.test.tsx +27 -0
- package/src/SideNav/__tests__/SideNavRailMotion.interaction.browser.spec.ts +176 -51
- package/src/Slider/Slider.test.tsx +12 -0
- package/src/Slider/Slider.tsx +4 -1
- package/src/Slider/__tests__/Slider.a11y.chromium.spec.ts +19 -7
- package/src/Spinner/Spinner.tsx +2 -2
- package/src/Stack/Stack.tsx +1 -1
- package/src/Stack/StackItem.tsx +1 -1
- package/src/TabList/TabList.test.tsx +58 -4
- package/src/TabList/TabList.tsx +16 -1
- package/src/TabList/__tests__/TabPressPointer.interaction.browser.spec.ts +163 -0
- package/src/Table/__tests__/Table.a11y.chromium.spec.ts +18 -6
- package/src/Table/plugins/columnResize/useTableColumnResize.test.tsx +22 -0
- package/src/Table/plugins/columnResize/useTableColumnResize.tsx +8 -4
- package/src/Text/Text.tsx +1 -1
- package/src/Text/useTruncation.test.tsx +128 -1
- package/src/Text/useTruncation.ts +23 -5
- package/src/TextArea/TextArea.spec.md +10 -13
- package/src/TextArea/TextArea.test.tsx +60 -0
- package/src/TextArea/TextArea.tsx +15 -1
- package/src/TextInput/TextInput.test.tsx +21 -0
- package/src/TextInput/TextInput.tsx +3 -1
- package/src/TimeInput/NativeTimeInput.test.tsx +17 -0
- package/src/TimeInput/Presentation.test.tsx +21 -0
- package/src/TimeInput/TimeInput.doc.mjs +8 -8
- package/src/TimeInput/TimeInput.spec.md +45 -48
- package/src/TimeInput/TimeInput.test.tsx +76 -0
- package/src/TimeInput/TimeInput.tsx +36 -18
- package/src/TimeInput/TouchTimeField.tsx +4 -6
- package/src/Timestamp/Timestamp.spec.md +6 -12
- package/src/Timestamp/Timestamp.test.tsx +30 -5
- package/src/Timestamp/Timestamp.tsx +6 -2
- package/src/Timestamp/TimestampHoverCard.tsx +4 -4
- package/src/Toast/Toast.spec.md +14 -20
- package/src/Toast/Toast.tsx +104 -36
- package/src/Toast/ToastViewport.test.tsx +719 -1
- package/src/Toast/ToastViewport.tsx +100 -50
- package/src/Tokenizer/Tokenizer.spec.md +5 -3
- package/src/Tokenizer/Tokenizer.test.tsx +68 -0
- package/src/Tokenizer/Tokenizer.tsx +14 -2
- package/src/Tokenizer/TokenizerBottomSheet.test.tsx +15 -4
- package/src/Tokenizer/TokenizerBottomSheet.tsx +3 -3
- package/src/Toolbar/Toolbar.spec.md +5 -6
- package/src/Toolbar/Toolbar.test.tsx +30 -0
- package/src/Toolbar/Toolbar.tsx +2 -1
- package/src/Toolbar/__tests__/Toolbar.a11y.chromium.spec.ts +18 -6
- package/src/Tooltip/__tests__/Tooltip.a11y.chromium.spec.ts +18 -7
- package/src/TopNav/TopNav.test.tsx +27 -0
- package/src/Typeahead/Typeahead.test.tsx +40 -0
- package/src/Typeahead/Typeahead.tsx +12 -1
- package/src/gestures/GestureArena.ts +35 -0
- package/src/gestures/GestureHost.ts +2065 -0
- package/src/gestures/GestureRecognizer.ts +18 -0
- package/src/gestures/LongPressGestureRecognizer.ts +4 -0
- package/src/gestures/PanGestureRecognizer.ts +4 -0
- package/src/gestures/PinchGestureRecognizer.ts +148 -0
- package/src/gestures/ScreenEdgePanGestureRecognizer.ts +256 -0
- package/src/gestures/SwipeGestureRecognizer.ts +197 -0
- package/src/gestures/TapGestureRecognizer.ts +4 -0
- package/src/gestures/VelocityTracker.ts +10 -3
- package/src/gestures/__tests__/GestureHost.test.ts +2087 -0
- package/src/gestures/__tests__/PanGestureRecognizer.test.ts +4 -4
- package/src/gestures/__tests__/PinchGestureRecognizer.test.ts +74 -0
- package/src/gestures/__tests__/ScreenEdgePanGestureRecognizer.test.ts +498 -0
- package/src/gestures/__tests__/SwipeGestureRecognizer.test.ts +108 -0
- package/src/gestures/__tests__/arena.test.ts +5 -0
- package/src/gestures/__tests__/arenaPinchSwipeEdge.test.ts +193 -0
- package/src/gestures/__tests__/browser/build-fixture.mjs +46 -0
- package/src/gestures/__tests__/browser/fixture.ts +307 -0
- package/src/gestures/__tests__/browser/gestures.interaction.browser.spec.ts +1137 -0
- package/src/gestures/__tests__/browserNegotiation.test.ts +293 -0
- package/src/gestures/__tests__/haptics.test.ts +187 -0
- package/src/gestures/__tests__/harness.ts +21 -2
- package/src/gestures/__tests__/recognizerKind.test.ts +78 -0
- package/src/gestures/__tests__/touchActionRule.test.ts +54 -0
- package/src/gestures/haptics.ts +203 -0
- package/src/gestures/nativeScroll.ts +277 -0
- package/src/gestures/touchAction.ts +191 -0
- package/src/gestures/touchActionRule.ts +157 -0
- package/src/gestures/types.ts +30 -9
- package/src/hooks/useAdaptivePresentation.ts +4 -1
- package/src/hooks/useMenuHover.ts +15 -1
- package/src/i18n/generated-locales/en.generated.ts +4 -0
- package/src/i18n/generated-locales/pseudo.generated.ts +4 -0
- package/src/motion/README.md +11 -1
- package/src/motion/animator.test.ts +151 -3
- package/src/motion/animator.ts +149 -33
- package/src/theme/defineTheme.ts +1 -1
- package/src/theme/derivedVarRegistry.test.ts +4 -0
- package/src/theme/domainTokens/domainTokenDefaults.ts +19 -0
- package/src/theme/domainTokens/index.ts +6 -10
- package/src/utils/focusReturn.ts +17 -6
- package/src/utils/getNodeText.test.ts +24 -0
- package/src/utils/getNodeText.ts +37 -0
- package/src/utils/interactionModality.test.ts +45 -1
- package/src/utils/interactionModality.ts +64 -5
- package/src/utils/plainDate.test.ts +90 -0
- package/src/utils/plainDate.ts +58 -3
- package/src/utils/presentation.test.ts +380 -0
- package/src/utils/presentation.ts +180 -0
- package/src/utils/pressPaintPriority.test.ts +80 -0
- package/src/utils/primaryClick.test.ts +38 -0
- package/src/utils/primaryClick.ts +28 -0
- package/src/utils/timeFormat.test.ts +204 -0
- package/src/utils/timeFormat.ts +314 -0
- package/src/utils/touchPresentation.stylex.ts +43 -0
- package/src/utils/touchPresentation.test.ts +140 -1
- package/src/utils/touchPresentation.ts +5 -3
- package/src/utils/unicodeDigits.test.ts +44 -0
- package/src/utils/unicodeDigits.ts +71 -0
|
@@ -41,14 +41,21 @@ export function isFocusDetached(doc = document) {
|
|
|
41
41
|
* autofocus target, the control that opened a Dialog, or a menu trigger the
|
|
42
42
|
* caller renders. Pass `options` (for example `preventScroll`) as to `focus()`.
|
|
43
43
|
*
|
|
44
|
+
* `modality` defaults to the page's last input. A caller moving focus inside a
|
|
45
|
+
* second document (a same-origin iframe, a Document Picture-in-Picture window)
|
|
46
|
+
* passes that document's, which it tracks with `trackInteractionModalityIn`.
|
|
47
|
+
*
|
|
44
48
|
* Make sure modality tracking is active (`useInteractionModalityTracking()`)
|
|
45
49
|
* in the component that calls this.
|
|
46
50
|
*/
|
|
47
|
-
export function focusForLastInput(element, options) {
|
|
51
|
+
export function focusForLastInput(element, options, modality = getInteractionModality()) {
|
|
48
52
|
// A text-entry field paints its own focus treatment to show where typing
|
|
49
|
-
// goes, and an extra blur there can run validation or mark it touched.
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
// goes, and an extra blur there can run validation or mark it touched. The
|
|
54
|
+
// field's own window: one in an iframe or a Picture-in-Picture window is
|
|
55
|
+
// never an instance of the page's constructors.
|
|
56
|
+
const view = element.ownerDocument.defaultView ?? window;
|
|
57
|
+
const isTextEntry = element instanceof view.HTMLInputElement || element instanceof view.HTMLTextAreaElement || element instanceof view.HTMLSelectElement || element.isContentEditable;
|
|
58
|
+
if (isTextEntry || modality !== 'pointer') {
|
|
52
59
|
if (options === undefined) {
|
|
53
60
|
element.focus();
|
|
54
61
|
} else {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The plain text a node renders through strings, numbers and element
|
|
4
|
+
* children, joined with spaces. Text a component renders internally, from
|
|
5
|
+
* props other than `children`, is not reachable and yields `''`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getNodeText(node: ReactNode): string;
|
|
8
|
+
//# sourceMappingURL=getNodeText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getNodeText.d.ts","sourceRoot":"","sources":["../../src/utils/getNodeText.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AAErC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAkBnD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file getNodeText.ts
|
|
5
|
+
* @input Receives a React node
|
|
6
|
+
* @output Exports getNodeText, the node's plain text
|
|
7
|
+
* @position Shared utility; consumed where a rendered node also needs a
|
|
8
|
+
* spoken name (Toast announcements, Table column-resize handle names)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { isValidElement } from 'react';
|
|
12
|
+
/**
|
|
13
|
+
* The plain text a node renders through strings, numbers and element
|
|
14
|
+
* children, joined with spaces. Text a component renders internally, from
|
|
15
|
+
* props other than `children`, is not reachable and yields `''`.
|
|
16
|
+
*/
|
|
17
|
+
export function getNodeText(node) {
|
|
18
|
+
if (node == null || typeof node === 'boolean') {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
if (typeof node === 'string') {
|
|
22
|
+
return node;
|
|
23
|
+
}
|
|
24
|
+
if (typeof node === 'number') {
|
|
25
|
+
return String(node);
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(node)) {
|
|
28
|
+
return node.map(getNodeText).filter(Boolean).join(' ');
|
|
29
|
+
}
|
|
30
|
+
if (/*#__PURE__*/isValidElement(node)) {
|
|
31
|
+
const {
|
|
32
|
+
children
|
|
33
|
+
} = node.props;
|
|
34
|
+
return getNodeText(children);
|
|
35
|
+
}
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
@@ -2,8 +2,17 @@ export type InteractionModality = 'keyboard' | 'pointer';
|
|
|
2
2
|
declare function trackInteractionModality(): () => void;
|
|
3
3
|
/** Activate shared modality tracking when the first consumer mounts. */
|
|
4
4
|
export declare function useInteractionModalityTracking(): void;
|
|
5
|
-
/**
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Track a second document while a consumer there is mounted: a component an
|
|
7
|
+
* app renders into a same-origin iframe or a Document Picture-in-Picture
|
|
8
|
+
* window gets input there that never reaches the page's listeners. The first
|
|
9
|
+
* consumer installs the document's listener pair and the last one's cleanup
|
|
10
|
+
* removes it. Read the value with `getInteractionModality(doc)`. The page's
|
|
11
|
+
* own document keeps its document-lifetime listeners.
|
|
12
|
+
*/
|
|
13
|
+
export declare function trackInteractionModalityIn(targetDocument: Document): () => void;
|
|
14
|
+
/** How the user last interacted with the page, or with `targetDocument`. */
|
|
15
|
+
export declare function getInteractionModality(targetDocument?: Document): InteractionModality;
|
|
7
16
|
/** Test-only: restore the initial state between cases. */
|
|
8
17
|
export declare function __resetInteractionModalityForTest(): void;
|
|
9
18
|
/** Test-only: activate the tracker without rendering a hook. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactionModality.d.ts","sourceRoot":"","sources":["../../src/utils/interactionModality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactionModality.d.ts","sourceRoot":"","sources":["../../src/utils/interactionModality.ts"],"names":[],"mappings":"AAwCA,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,CAAC;AAgDzD,iBAAS,wBAAwB,IAAI,MAAM,IAAI,CAsB9C;AAED,wEAAwE;AACxE,wBAAgB,8BAA8B,IAAI,IAAI,CAErD;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,QAAQ,GACvB,MAAM,IAAI,CAkCZ;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,CACpC,cAAc,CAAC,EAAE,QAAQ,GACxB,mBAAmB,CAOrB;AAED,0DAA0D;AAC1D,wBAAgB,iCAAiC,IAAI,IAAI,CAIxD;AAED,gEAAgE;AAChE,eAAO,MAAM,yCAAyC,iCAC5B,CAAC"}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
* @file interactionModality.ts
|
|
7
7
|
* @input Global pointerdown/keydown events
|
|
8
8
|
* @output `useInteractionModalityTracking()` activates document-lifetime tracking;
|
|
9
|
-
* `getInteractionModality()` reads how the user last interacted
|
|
9
|
+
* `getInteractionModality()` reads how the user last interacted;
|
|
10
|
+
* `trackInteractionModalityIn(doc)` and `getInteractionModality(doc)` do the
|
|
11
|
+
* same for a second document
|
|
10
12
|
* @position Internal document-wide singleton; used where `:focus-visible` alone
|
|
11
13
|
* is too broad
|
|
12
14
|
*
|
|
@@ -26,8 +28,12 @@
|
|
|
26
28
|
* The store lives on `document`, so duplicate Astryx bundles share one state
|
|
27
29
|
* value and one listener pair. The first mounted consumer activates tracking;
|
|
28
30
|
* the listeners then remain for the document lifetime so input during a gap
|
|
29
|
-
* between consumers is not lost.
|
|
30
|
-
*
|
|
31
|
+
* between consumers is not lost. A second document (a same-origin iframe, a
|
|
32
|
+
* Document Picture-in-Picture window) gets its own store when a component
|
|
33
|
+
* tracks it, since input there never reaches the page's listeners; its
|
|
34
|
+
* listeners stay only while a consumer there is mounted. Importing this module
|
|
35
|
+
* has no DOM side effects, and server rendering keeps the keyboard-safe
|
|
36
|
+
* default.
|
|
31
37
|
*/
|
|
32
38
|
import { useEffect } from 'react';
|
|
33
39
|
const interactionModalityStoreKey = Symbol.for('@astryxdesign/core/interaction-modality/v1');
|
|
@@ -89,8 +95,55 @@ export function useInteractionModalityTracking() {
|
|
|
89
95
|
useEffect(() => trackInteractionModality(), []);
|
|
90
96
|
}
|
|
91
97
|
|
|
92
|
-
/**
|
|
93
|
-
|
|
98
|
+
/**
|
|
99
|
+
* Track a second document while a consumer there is mounted: a component an
|
|
100
|
+
* app renders into a same-origin iframe or a Document Picture-in-Picture
|
|
101
|
+
* window gets input there that never reaches the page's listeners. The first
|
|
102
|
+
* consumer installs the document's listener pair and the last one's cleanup
|
|
103
|
+
* removes it. Read the value with `getInteractionModality(doc)`. The page's
|
|
104
|
+
* own document keeps its document-lifetime listeners.
|
|
105
|
+
*/
|
|
106
|
+
export function trackInteractionModalityIn(targetDocument) {
|
|
107
|
+
if (typeof document !== 'undefined' && targetDocument === document) {
|
|
108
|
+
return trackInteractionModality();
|
|
109
|
+
}
|
|
110
|
+
const store = getStore(targetDocument);
|
|
111
|
+
store.consumers = (store.consumers ?? 0) + 1;
|
|
112
|
+
if (store.consumers === 1) {
|
|
113
|
+
store.isListening = true;
|
|
114
|
+
targetDocument.addEventListener('pointerdown', store.onPointerDown, {
|
|
115
|
+
capture: true,
|
|
116
|
+
passive: true
|
|
117
|
+
});
|
|
118
|
+
targetDocument.addEventListener('keydown', store.onKeyDown, {
|
|
119
|
+
capture: true,
|
|
120
|
+
passive: true
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
let isReleased = false;
|
|
124
|
+
return () => {
|
|
125
|
+
if (isReleased) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
isReleased = true;
|
|
129
|
+
store.consumers = (store.consumers ?? 1) - 1;
|
|
130
|
+
if (store.consumers === 0) {
|
|
131
|
+
store.isListening = false;
|
|
132
|
+
targetDocument.removeEventListener('pointerdown', store.onPointerDown, {
|
|
133
|
+
capture: true
|
|
134
|
+
});
|
|
135
|
+
targetDocument.removeEventListener('keydown', store.onKeyDown, {
|
|
136
|
+
capture: true
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** How the user last interacted with the page, or with `targetDocument`. */
|
|
143
|
+
export function getInteractionModality(targetDocument) {
|
|
144
|
+
if (targetDocument != null) {
|
|
145
|
+
return getStore(targetDocument).modality;
|
|
146
|
+
}
|
|
94
147
|
return typeof document === 'undefined' ? 'keyboard' : getStore(document).modality;
|
|
95
148
|
}
|
|
96
149
|
|
|
@@ -72,6 +72,8 @@ export declare const DATE_FORMAT_SHORT_WITH_YEAR: Intl.DateTimeFormatOptions;
|
|
|
72
72
|
* serialization, or any Astryx component's calendar semantics.
|
|
73
73
|
*/
|
|
74
74
|
export declare function plainDateFormat(pd: PlainDate, options: Intl.DateTimeFormatOptions, locale?: Locale): string;
|
|
75
|
+
/** @internal plainDateFormat's formatter cache; not part of the public API. */
|
|
76
|
+
export declare function dateTimeFormatFor(locale: Locale, options: Intl.DateTimeFormatOptions): Intl.DateTimeFormat;
|
|
75
77
|
/**
|
|
76
78
|
* The locale's name for the "week of year" date field ("week", "Woche", "週"),
|
|
77
79
|
* from CLDR through `Intl.DisplayNames`. Calendar names its week-number
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plainDate.d.ts","sourceRoot":"","sources":["../../src/utils/plainDate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plainDate.d.ts","sourceRoot":"","sources":["../../src/utils/plainDate.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAC,aAAa,EAAE,SAAS,EAAC,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAE1C,YAAY,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAE3C,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACV,SAAS,CAcX;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,CAG9D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,aAAa,CAK3D;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAMnD;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,GAAG,SAAS,CAMpD;AAED,wBAAgB,cAAc,IAAI,SAAS,CAE1C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAExD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAStE;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAIpE;AAoBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,MAAM,CAKpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB;IACD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CA2BA;AAkBD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,SAAI,EACR,MAAM,SAAI,GACT,MAAM,CAsBR;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,SAAS,CAGX;AAYD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAErE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAEpE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CAElE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CAElE;AAED,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,GAC5B,OAAO,CAET;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAEjE;AAED,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,SAAS,EACb,YAAY,EAAE,MAAM,GACnB,SAAS,CAIX;AAED,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,SAAS,EACb,YAAY,EAAE,MAAM,GACnB,SAAS,CAEX;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAgB5D;AAGD,eAAO,MAAM,wBAAwB,EAAE,IAAI,CAAC,qBAK3C,CAAC;AAIF,eAAO,MAAM,8BAA8B,EAAE,IAAI,CAAC,qBAKjD,CAAC;AAGF,eAAO,MAAM,gBAAgB,EAAE,IAAI,CAAC,qBAInC,CAAC;AAGF,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,qBAGzC,CAAC;AAQF,eAAO,MAAM,wBAAwB,EAAE,IAAI,CAAC,qBAE3C,CAAC;AAIF,eAAO,MAAM,sBAAsB,EAAE,IAAI,CAAC,qBAEzC,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,IAAI,CAAC,qBAGpC,CAAC;AAGF,eAAO,MAAM,2BAA2B,EAAE,IAAI,CAAC,qBAI9C,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,SAAS,EACb,OAAO,EAAE,IAAI,CAAC,qBAAqB,EACnC,MAAM,GAAE,MAAa,GACpB,MAAM,CAuBR;AAsBD,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,IAAI,CAAC,qBAAqB,GAClC,IAAI,CAAC,cAAc,CAWrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,MAAa,GAAG,MAAM,CAYpE;AAMD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAC1B,MAAM,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,CAAC;AAExD;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAC7C,OAAO,CAAC,gBAAgB,EAAE,aAAa,CAAC,EACxC,IAAI,CAAC,qBAAqB,CAK3B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,MAAa,GACpB,MAAM,CAKR"}
|
package/dist/utils/plainDate.js
CHANGED
|
@@ -290,10 +290,53 @@ export const DATE_FORMAT_SHORT_WITH_YEAR = {
|
|
|
290
290
|
* serialization, or any Astryx component's calendar semantics.
|
|
291
291
|
*/
|
|
292
292
|
export function plainDateFormat(pd, options, locale = 'en') {
|
|
293
|
-
|
|
293
|
+
const calendar = options.calendar ?? 'gregory';
|
|
294
|
+
if (options.timeZone != null) {
|
|
295
|
+
return dateTimeFormatFor(locale, {
|
|
296
|
+
...options,
|
|
297
|
+
calendar
|
|
298
|
+
}).format(plainDateToDate(pd));
|
|
299
|
+
}
|
|
300
|
+
if (TIME_OF_DAY_FIELDS.some(field => options[field] != null)) {
|
|
301
|
+
// A zone name or a time of day reads local midnight in the zone current
|
|
302
|
+
// at the call. A cached formatter would keep the zone it was built in,
|
|
303
|
+
// so this one is built for the call.
|
|
304
|
+
return new Intl.DateTimeFormat(locale, {
|
|
305
|
+
...options,
|
|
306
|
+
calendar
|
|
307
|
+
}).format(plainDateToDate(pd));
|
|
308
|
+
}
|
|
309
|
+
// Date fields alone: UTC midnight formatted in UTC, so neither the cached
|
|
310
|
+
// formatter nor the date depends on the host's zone, which can change while
|
|
311
|
+
// a page is open.
|
|
312
|
+
return dateTimeFormatFor(locale, {
|
|
294
313
|
...options,
|
|
295
|
-
calendar
|
|
296
|
-
|
|
314
|
+
calendar,
|
|
315
|
+
timeZone: 'UTC'
|
|
316
|
+
}).format(utcTime(pd.year, pd.month - 1, pd.day));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/** Options that print a time of day or a zone, which a PlainDate lacks. */
|
|
320
|
+
const TIME_OF_DAY_FIELDS = ['timeZoneName', 'hour', 'minute', 'second', 'fractionalSecondDigits', 'dayPeriod', 'timeStyle'];
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* One `Intl.DateTimeFormat` per locale and options, built on first use.
|
|
324
|
+
* Building a formatter costs far more than formatting with it, and a calendar
|
|
325
|
+
* formats each of a month's 42 day labels with the same options on every
|
|
326
|
+
* render. The options are keyed in a fixed order, so the same options written
|
|
327
|
+
* in another order share a formatter.
|
|
328
|
+
*/
|
|
329
|
+
const dateTimeFormats = new Map();
|
|
330
|
+
|
|
331
|
+
/** @internal plainDateFormat's formatter cache; not part of the public API. */
|
|
332
|
+
export function dateTimeFormatFor(locale, options) {
|
|
333
|
+
const key = JSON.stringify([locale, Object.entries(options).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)]);
|
|
334
|
+
let format = dateTimeFormats.get(key);
|
|
335
|
+
if (format == null) {
|
|
336
|
+
format = new Intl.DateTimeFormat(locale, options);
|
|
337
|
+
dateTimeFormats.set(key, format);
|
|
338
|
+
}
|
|
339
|
+
return format;
|
|
297
340
|
}
|
|
298
341
|
|
|
299
342
|
/**
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AdaptivePresentation } from '../hooks/useAdaptivePresentation.js';
|
|
2
|
+
import type { CompactDefinition } from '../theme/themeAdaptations.js';
|
|
3
|
+
import { type TouchPresentation } from './touchPresentation.js';
|
|
4
|
+
/** What a component does when the caller omits `presentation`. */
|
|
5
|
+
export type PresentationDefault = 'popover' | 'touch';
|
|
6
|
+
export interface ResolvedPresentation {
|
|
7
|
+
/** The surface to render. */
|
|
8
|
+
readonly surface: 'popover' | 'bottom-sheet';
|
|
9
|
+
/**
|
|
10
|
+
* The component's touch input modes apply: a finger, and `presentation`
|
|
11
|
+
* not pinned to `'popover'`.
|
|
12
|
+
*/
|
|
13
|
+
readonly touchModes: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface PresentationOptions {
|
|
16
|
+
/** What an omitted `presentation` means. @default 'popover' */
|
|
17
|
+
readonly whenOmitted?: PresentationDefault;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* usePresentation's options. There is no server hint: the server and
|
|
21
|
+
* hydrating render never present touch modes (`spec:AST-094` FR13).
|
|
22
|
+
*/
|
|
23
|
+
export type UsePresentationOptions = PresentationOptions;
|
|
24
|
+
export interface ReadPresentationOptions extends PresentationOptions {
|
|
25
|
+
/** The window to read; the global one by default. */
|
|
26
|
+
readonly view?: Window | null;
|
|
27
|
+
/**
|
|
28
|
+
* The active theme's compact definition (`useCompactDefinition()`, read
|
|
29
|
+
* while rendering), so a theme that moves `md` moves the sheet too
|
|
30
|
+
* (`spec:AST-012` FR9).
|
|
31
|
+
*/
|
|
32
|
+
readonly compact: CompactDefinition;
|
|
33
|
+
}
|
|
34
|
+
/** The decision, from a presentation request and a touch presentation. */
|
|
35
|
+
export declare function resolvePresentation(presentation: AdaptivePresentation | undefined, touch: TouchPresentation, whenOmitted?: PresentationDefault): ResolvedPresentation;
|
|
36
|
+
/**
|
|
37
|
+
* The presentation now, following the pointer and the size as they change
|
|
38
|
+
* (a tablet docking a trackpad). SSR-safe: renders the server default (not
|
|
39
|
+
* touch, not compact) until hydrated (`spec:AST-094` FR13). It subscribes
|
|
40
|
+
* only to what the request reads: a pinned `'popover'` to neither query,
|
|
41
|
+
* `'bottom-sheet'` and the omitted `'touch'` default to the pointer, and
|
|
42
|
+
* `'adaptive'` to the pointer and the compact size.
|
|
43
|
+
*/
|
|
44
|
+
export declare function usePresentation(presentation: AdaptivePresentation | undefined, { whenOmitted }?: UsePresentationOptions): ResolvedPresentation;
|
|
45
|
+
/**
|
|
46
|
+
* The presentation at this moment, for a decision taken once (a menu
|
|
47
|
+
* deciding how it follows the finger that opened it).
|
|
48
|
+
*/
|
|
49
|
+
export declare function readPresentation(presentation: AdaptivePresentation | undefined, { whenOmitted, view, compact }: ReadPresentationOptions): ResolvedPresentation;
|
|
50
|
+
//# sourceMappingURL=presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/utils/presentation.ts"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,kCAAkC,CAAC;AAC3E,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,kEAAkE;AAClE,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,6BAA6B;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,cAAc,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;CAC5C;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAEzD,MAAM,WAAW,uBAAwB,SAAQ,mBAAmB;IAClE,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,oBAAoB,GAAG,SAAS,EAC9C,KAAK,EAAE,iBAAiB,EACxB,WAAW,GAAE,mBAA+B,GAC3C,oBAAoB,CAStB;AA8BD;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,oBAAoB,GAAG,SAAS,EAC9C,EAAC,WAAuB,EAAC,GAAE,sBAA2B,GACrD,oBAAoB,CAWtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,oBAAoB,GAAG,SAAS,EAC9C,EAAC,WAAuB,EAAE,IAAI,EAAE,OAAO,EAAC,EAAE,uBAAuB,GAChE,oBAAoB,CAQtB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file presentation.ts
|
|
7
|
+
* @input A component's `presentation` prop (a caller's value, or omitted),
|
|
8
|
+
* what the component does when it is omitted, and the touch presentation
|
|
9
|
+
* (utils/touchPresentation.ts)
|
|
10
|
+
* @output usePresentation and readPresentation (and the pure
|
|
11
|
+
* resolvePresentation): the surface to render and whether the component's
|
|
12
|
+
* touch input modes apply
|
|
13
|
+
* @position Internal resolver for stable components that, under a finger,
|
|
14
|
+
* present a different surface or switch how an open surface follows input
|
|
15
|
+
* (architecture:public-component-api INV16)
|
|
16
|
+
*
|
|
17
|
+
* A caller's explicit `presentation` always wins over the touch default:
|
|
18
|
+
*
|
|
19
|
+
* - `'popover'`: the fine-pointer surface AND input modes, on every device;
|
|
20
|
+
* - `'bottom-sheet'`: the sheet everywhere, with touch input modes under a
|
|
21
|
+
* finger;
|
|
22
|
+
* - `'adaptive'`: the sheet on a compact touch screen and the popover
|
|
23
|
+
* elsewhere, with touch input modes under a finger;
|
|
24
|
+
* - omitted: the component's default. `whenOmitted: 'popover'` answers as
|
|
25
|
+
* `'popover'` (today's components). `whenOmitted: 'touch'` keeps the
|
|
26
|
+
* popover surface and turns the component's touch input modes on under a
|
|
27
|
+
* finger, as UIMenu tracks a finger in an anchored menu. Making `'touch'`
|
|
28
|
+
* a released component's default is a functional default change
|
|
29
|
+
* (`spec:AST-017` FR3) whose Changeset names `presentation="popover"`.
|
|
30
|
+
*
|
|
31
|
+
* One touch model on every touch device: the modes depend on the pointer,
|
|
32
|
+
* never on the platform. Touch styling (press paint, the text-size floor)
|
|
33
|
+
* and touch-only behavior that a component's own record defines (a row
|
|
34
|
+
* swipe, a slider's thumb) do not read this: they keep the touch
|
|
35
|
+
* presentation.
|
|
36
|
+
*
|
|
37
|
+
* CSS: a style that implements a touch surface or input mode is applied with
|
|
38
|
+
* `touchModes` (`stylex.props(touchModes && styles.touchMode)`), never as a
|
|
39
|
+
* bare media key on a base style, so a pinned `'popover'` keeps none of it.
|
|
40
|
+
* A rule inside it that needs the touch query uses the touch presentation's
|
|
41
|
+
* touch key; the iOS `@supports` gate is only for the one style iOS WebKit
|
|
42
|
+
* itself requires (the 16px text-size floor), never for a touch mode. On the
|
|
43
|
+
* server and while hydrating, `touchModes` is false and `'adaptive'` is the
|
|
44
|
+
* popover: a touch surface or mode opens only after hydration
|
|
45
|
+
* (`spec:AST-094` FR13), and no hint changes that. usePresentation listens
|
|
46
|
+
* only to the queries a request reads (`architecture:react-component-runtime`
|
|
47
|
+
* INV5): none for a pinned `'popover'`.
|
|
48
|
+
*
|
|
49
|
+
* SYNC: When modified, update presentation.test.ts.
|
|
50
|
+
*/
|
|
51
|
+
import { useCallback, useMemo, useSyncExternalStore } from 'react';
|
|
52
|
+
import { readTouchPresentation, TOUCH_QUERY, useCompactDefinition } from "./touchPresentation.js";
|
|
53
|
+
|
|
54
|
+
/** What a component does when the caller omits `presentation`. */
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* usePresentation's options. There is no server hint: the server and
|
|
58
|
+
* hydrating render never present touch modes (`spec:AST-094` FR13).
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/** The decision, from a presentation request and a touch presentation. */
|
|
62
|
+
export function resolvePresentation(presentation, touch, whenOmitted = 'popover') {
|
|
63
|
+
const request = presentation ?? whenOmitted;
|
|
64
|
+
const surface = request === 'bottom-sheet' || request === 'adaptive' && touch.isTouch && touch.isCompact ? 'bottom-sheet' : 'popover';
|
|
65
|
+
const touchModes = request !== 'popover' && touch.isTouch;
|
|
66
|
+
return {
|
|
67
|
+
surface,
|
|
68
|
+
touchModes
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const noSubscription = () => () => {};
|
|
72
|
+
/** The server and hydrating render match no query (`spec:AST-094` FR13). */
|
|
73
|
+
const matchesNothing = () => false;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* A media query's match, subscribed only while `query` is given
|
|
77
|
+
* (`architecture:react-component-runtime` INV5); false on the server and
|
|
78
|
+
* while hydrating (`spec:AST-094` FR13).
|
|
79
|
+
*/
|
|
80
|
+
function useMatchWhileRead(query) {
|
|
81
|
+
const subscribe = useCallback(onStoreChange => {
|
|
82
|
+
if (query == null) {
|
|
83
|
+
return noSubscription();
|
|
84
|
+
}
|
|
85
|
+
const mql = window.matchMedia(query);
|
|
86
|
+
mql.addEventListener('change', onStoreChange);
|
|
87
|
+
return () => mql.removeEventListener('change', onStoreChange);
|
|
88
|
+
}, [query]);
|
|
89
|
+
const getSnapshot = useCallback(() => query != null && window.matchMedia(query).matches, [query]);
|
|
90
|
+
return useSyncExternalStore(subscribe, getSnapshot, matchesNothing);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* The presentation now, following the pointer and the size as they change
|
|
95
|
+
* (a tablet docking a trackpad). SSR-safe: renders the server default (not
|
|
96
|
+
* touch, not compact) until hydrated (`spec:AST-094` FR13). It subscribes
|
|
97
|
+
* only to what the request reads: a pinned `'popover'` to neither query,
|
|
98
|
+
* `'bottom-sheet'` and the omitted `'touch'` default to the pointer, and
|
|
99
|
+
* `'adaptive'` to the pointer and the compact size.
|
|
100
|
+
*/
|
|
101
|
+
export function usePresentation(presentation, {
|
|
102
|
+
whenOmitted = 'popover'
|
|
103
|
+
} = {}) {
|
|
104
|
+
const request = presentation ?? whenOmitted;
|
|
105
|
+
const compact = useCompactDefinition();
|
|
106
|
+
const isTouch = useMatchWhileRead(request === 'popover' ? null : TOUCH_QUERY);
|
|
107
|
+
const isCompact = useMatchWhileRead(request === 'adaptive' ? compact.query : null);
|
|
108
|
+
return useMemo(() => resolvePresentation(presentation, {
|
|
109
|
+
isTouch,
|
|
110
|
+
isCompact
|
|
111
|
+
}, whenOmitted), [presentation, isTouch, isCompact, whenOmitted]);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The presentation at this moment, for a decision taken once (a menu
|
|
116
|
+
* deciding how it follows the finger that opened it).
|
|
117
|
+
*/
|
|
118
|
+
export function readPresentation(presentation, {
|
|
119
|
+
whenOmitted = 'popover',
|
|
120
|
+
view,
|
|
121
|
+
compact
|
|
122
|
+
}) {
|
|
123
|
+
const target = view === undefined ? typeof window === 'undefined' ? null : window : view;
|
|
124
|
+
return resolvePresentation(presentation, readTouchPresentation(target, compact), whenOmitted);
|
|
125
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a button press is a primary click: the main button, and not a
|
|
3
|
+
* ctrl-click on macOS or iPadOS, which is that platform's context click
|
|
4
|
+
* (`spec:AST-094` FR43). A right click, a pen's barrel button and a macOS
|
|
5
|
+
* ctrl-click start no press.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isPrimaryClick(event: {
|
|
8
|
+
readonly button: number;
|
|
9
|
+
readonly ctrlKey: boolean;
|
|
10
|
+
}): boolean;
|
|
11
|
+
//# sourceMappingURL=primaryClick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primaryClick.d.ts","sourceRoot":"","sources":["../../src/utils/primaryClick.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAEV"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file primaryClick.ts
|
|
5
|
+
* @input A mouse or pen button press: its `button` and `ctrlKey`
|
|
6
|
+
* @output Exports isPrimaryClick
|
|
7
|
+
* @position Internal util, the one primary-click rule: the gesture host
|
|
8
|
+
* starts a press only for one, and the press controller paints only one;
|
|
9
|
+
* platform detection is utils/isApplePlatform.ts
|
|
10
|
+
*
|
|
11
|
+
* Deliberately absent from utils/index.ts: packages/core/src/index.ts does
|
|
12
|
+
* `export * from './utils'`, so naming it there would publish it as API.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { isApplePlatform } from "./isApplePlatform.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Whether a button press is a primary click: the main button, and not a
|
|
19
|
+
* ctrl-click on macOS or iPadOS, which is that platform's context click
|
|
20
|
+
* (`spec:AST-094` FR43). A right click, a pen's barrel button and a macOS
|
|
21
|
+
* ctrl-click start no press.
|
|
22
|
+
*/
|
|
23
|
+
export function isPrimaryClick(event) {
|
|
24
|
+
return event.button === 0 && !(event.ctrlKey && isApplePlatform());
|
|
25
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file timeFormat.ts
|
|
3
|
+
* @input An ISO time or typed text, plus the provider's BCP 47 locale
|
|
4
|
+
* @output Exports resolveHourFormat, formatLocaleTime, and parseLocaleTime
|
|
5
|
+
* @position Internal shared helper for TimeInput and DateTimeInput; not part
|
|
6
|
+
* of the public surface
|
|
7
|
+
*
|
|
8
|
+
* Time of day as the locale writes it. The hour cycle, digits, separator, and
|
|
9
|
+
* day-period words all come from Intl rather than a table, so a field reads
|
|
10
|
+
* the same way `Timestamp` does beside it.
|
|
11
|
+
*
|
|
12
|
+
* The hour cycle is the locale's own: `en-US` and `ko-KR` read twelve-hour,
|
|
13
|
+
* `en-GB`, `de-DE`, and `vi-VN` read twenty-four-hour. A `-u-hc-` extension
|
|
14
|
+
* on the provider locale (`en-US-u-hc-h23`) carries an app's per-user
|
|
15
|
+
* preference through the same path, so every Astryx time honors it.
|
|
16
|
+
*
|
|
17
|
+
* The parser reads back what the formatter writes: the locale's digits, its
|
|
18
|
+
* hour-minute separator, and its day-period words, on either side of the time.
|
|
19
|
+
* Whatever is left goes through the shared English-tolerant parser, so "2:30
|
|
20
|
+
* PM" and "14:30" keep working in every locale.
|
|
21
|
+
*
|
|
22
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
23
|
+
* - /packages/core/src/utils/timeFormat.test.ts
|
|
24
|
+
* - /packages/core/src/TimeInput/TimeInput.tsx
|
|
25
|
+
* - /packages/core/src/DateTimeInput/DateTimeInput.tsx
|
|
26
|
+
*/
|
|
27
|
+
import type { Locale } from '../i18n/types.js';
|
|
28
|
+
import { type ISOTimeString } from './timeParser.js';
|
|
29
|
+
export type HourFormat = '12h' | '24h';
|
|
30
|
+
/**
|
|
31
|
+
* The hour format a field shows: the caller's explicit choice, else the
|
|
32
|
+
* locale's hour cycle (including a `-u-hc-` extension on the tag).
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveHourFormat(locale: Locale, hourFormat?: HourFormat): HourFormat;
|
|
35
|
+
/**
|
|
36
|
+
* Formats an ISO time as the locale writes it, in the given hour format.
|
|
37
|
+
* en-US: "14:30" → "2:30 PM"; de-DE 24h: "14:30"; ko-KR 12h: "오후 2:30".
|
|
38
|
+
* Returns '' for an empty or malformed time.
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatLocaleTime(time: ISOTimeString | undefined, locale: Locale, hourFormat: HourFormat, includeSeconds?: boolean): string;
|
|
41
|
+
/**
|
|
42
|
+
* Parses typed text into an ISO time, accepting the locale's digits,
|
|
43
|
+
* separator, and day-period words as well as everything `parseTimeInput`
|
|
44
|
+
* accepts. Returns null when no reading fits.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseLocaleTime(input: string, locale: Locale, includeSeconds?: boolean): ISOTimeString | null;
|
|
47
|
+
//# sourceMappingURL=timeFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeFormat.d.ts","sourceRoot":"","sources":["../../src/utils/timeFormat.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AAC1C,OAAO,EAA+B,KAAK,aAAa,EAAC,MAAM,cAAc,CAAC;AAG9E,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;AAsLvC;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,UAAU,GACtB,UAAU,CAEZ;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,GAAG,SAAS,EAC/B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,UAAU,EACtB,cAAc,GAAE,OAAe,GAC9B,MAAM,CAeR;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,OAAe,GAC9B,aAAa,GAAG,IAAI,CAmDtB"}
|