@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
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* @position Core implementation; consumed by index.ts, tested by NumberInput.test.tsx
|
|
6
6
|
*
|
|
7
7
|
* SYNC: When modified, update these files to stay in sync:
|
|
8
|
+
* - /packages/core/src/NumberInput/numberParser.ts (locale-aware parsing)
|
|
9
|
+
* - /packages/core/src/NumberInput/numberInputCommit.ts (draft commit policy)
|
|
8
10
|
* - /packages/core/src/NumberInput/NumberInput.doc.mjs (props table, features, implementation notes)
|
|
9
11
|
* - /packages/core/src/NumberInput/NumberInput.test.tsx (tests for new/changed behavior)
|
|
10
12
|
* - /packages/core/src/NumberInput/index.ts (exports if types change)
|
|
@@ -159,10 +161,12 @@ interface NumberInputPropsBase extends Omit<BaseProps, 'onChange' | 'defaultValu
|
|
|
159
161
|
autoComplete?: string;
|
|
160
162
|
/**
|
|
161
163
|
* The minimum value allowed.
|
|
164
|
+
* A smaller entry commits at this value on blur or Enter.
|
|
162
165
|
*/
|
|
163
166
|
min?: number | null;
|
|
164
167
|
/**
|
|
165
168
|
* The maximum value allowed.
|
|
169
|
+
* A larger entry commits at this value on blur or Enter.
|
|
166
170
|
*/
|
|
167
171
|
max?: number | null;
|
|
168
172
|
/**
|
|
@@ -233,7 +237,8 @@ type NumberInputPropsClearable = NumberInputPropsBase & {
|
|
|
233
237
|
export type NumberInputProps = NumberInputPropsNonClearable | NumberInputPropsClearable;
|
|
234
238
|
/**
|
|
235
239
|
* A number input component for collecting numeric user input.
|
|
236
|
-
*
|
|
240
|
+
* Commits text edits on blur or Enter and only calls onChange when the whole
|
|
241
|
+
* draft passes validation.
|
|
237
242
|
*
|
|
238
243
|
* @example
|
|
239
244
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/NumberInput/NumberInput.tsx"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/NumberInput/NumberInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* @position Core implementation; consumed by index.ts, tested by NumberInput.test.tsx
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update these files to stay in sync:
|
|
12
|
+
* - /packages/core/src/NumberInput/numberParser.ts (locale-aware parsing)
|
|
13
|
+
* - /packages/core/src/NumberInput/numberInputCommit.ts (draft commit policy)
|
|
12
14
|
* - /packages/core/src/NumberInput/NumberInput.doc.mjs (props table, features, implementation notes)
|
|
13
15
|
* - /packages/core/src/NumberInput/NumberInput.test.tsx (tests for new/changed behavior)
|
|
14
16
|
* - /packages/core/src/NumberInput/index.ts (exports if types change)
|
|
@@ -24,6 +26,7 @@ import { Icon, renderIconSlot } from "../Icon/index.js";
|
|
|
24
26
|
import { VisuallyHidden } from "../VisuallyHidden/index.js";
|
|
25
27
|
import { useTooltip } from "../Tooltip/index.js";
|
|
26
28
|
import { getInputARIA } from "../utils/index.js";
|
|
29
|
+
import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
|
|
27
30
|
import { useSize } from "../SizeContext/SizeContext.js";
|
|
28
31
|
import { useInputContainer } from "../hooks/useInputContainer.js";
|
|
29
32
|
import { useInputStatusIcon } from "../hooks/useInputStatusIcon.js";
|
|
@@ -66,6 +69,35 @@ const styles = {
|
|
|
66
69
|
kwRFfy: "xyri2b",
|
|
67
70
|
$$css: true
|
|
68
71
|
},
|
|
72
|
+
numberStepperButton: {
|
|
73
|
+
kB7OPa: "x9f619",
|
|
74
|
+
k1xSpc: "x78zum5",
|
|
75
|
+
kGNEyG: "x6s0dn4",
|
|
76
|
+
kjj79g: "xl56j7k",
|
|
77
|
+
kUk6DE: "x98rzlu",
|
|
78
|
+
kAzted: "x2lwn1j",
|
|
79
|
+
kmVPX3: "x1717udv",
|
|
80
|
+
kogj98: "x1ghz6dp",
|
|
81
|
+
kMzoRj: "xc342km",
|
|
82
|
+
ksu8eU: "xng3xce",
|
|
83
|
+
kMwMTN: "xv9yike",
|
|
84
|
+
kWkggS: "x10xzikg",
|
|
85
|
+
kkrTdU: "x1ypdohk x16khyan",
|
|
86
|
+
kI3sdo: "x1a2a7pz",
|
|
87
|
+
$$css: true
|
|
88
|
+
},
|
|
89
|
+
numberStepperButtonDisabled: {
|
|
90
|
+
kMwMTN: "xqa6c3m",
|
|
91
|
+
kkrTdU: "xt0e3qv",
|
|
92
|
+
kKwaWg: "x18o3ruo",
|
|
93
|
+
$$css: true
|
|
94
|
+
},
|
|
95
|
+
decrementButton: {
|
|
96
|
+
kEafiO: "x11xkdxz",
|
|
97
|
+
kPef9Z: "x13fuv20",
|
|
98
|
+
kLZC3w: "x1mly77v",
|
|
99
|
+
$$css: true
|
|
100
|
+
},
|
|
69
101
|
incrementIcon: {
|
|
70
102
|
k3aq6I: "x19jd1h0",
|
|
71
103
|
$$css: true
|
|
@@ -91,43 +123,15 @@ import { groupStyles } from "../InputGroup/groupStyles.js";
|
|
|
91
123
|
|
|
92
124
|
import { isImeKeyEvent, mergeProps, mergeRefs } from "../utils/index.js";
|
|
93
125
|
import { themeProps } from "../utils/themeProps.js";
|
|
94
|
-
import { useTranslator } from "../i18n/index.js";
|
|
126
|
+
import { useTranslator, useLocale } from "../i18n/index.js";
|
|
127
|
+
import { formatEditableNumber } from "./numberParser.js";
|
|
128
|
+
import { parseNumberInput, resolveNumberInputCommit } from "./numberInputCommit.js";
|
|
95
129
|
|
|
96
130
|
/**
|
|
97
131
|
* Without `hasClear`, onChange only receives valid numbers.
|
|
98
132
|
* With `hasClear`, onChange also receives `null` when the user clears the input.
|
|
99
133
|
*/
|
|
100
134
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
101
|
-
/**
|
|
102
|
-
* Parse and validate a string input as a number.
|
|
103
|
-
* Returns null if the input is not a valid number or fails validation.
|
|
104
|
-
*/
|
|
105
|
-
function parseNumberInput(input, options) {
|
|
106
|
-
const trimmed = input.trim();
|
|
107
|
-
if (trimmed === '' || trimmed === '-') {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
const num = Number(trimmed);
|
|
111
|
-
if (!Number.isFinite(num)) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Check integer constraint
|
|
116
|
-
if (options.isIntegerOnly && !Number.isInteger(num)) {
|
|
117
|
-
return null;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Check min constraint
|
|
121
|
-
if (options.min != null && num < options.min) {
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Check max constraint
|
|
126
|
-
if (options.max != null && num > options.max) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
return num;
|
|
130
|
-
}
|
|
131
135
|
function getDecimalPlaces(value) {
|
|
132
136
|
const [coefficient, exponentText] = String(value).toLowerCase().split('e');
|
|
133
137
|
const fractionLength = coefficient.split('.')[1]?.length ?? 0;
|
|
@@ -162,6 +166,11 @@ function getSteppedValue({
|
|
|
162
166
|
const nextStepPosition = direction === 1 ? Math.floor(stepPosition + tolerance) + 1 : Math.ceil(stepPosition - tolerance) - 1;
|
|
163
167
|
nextValue = stepBase + nextStepPosition * effectiveStep;
|
|
164
168
|
}
|
|
169
|
+
const precision = Math.min(12, Math.max(getDecimalPlaces(effectiveStep), getDecimalPlaces(stepBase)));
|
|
170
|
+
nextValue = Number(nextValue.toFixed(precision));
|
|
171
|
+
|
|
172
|
+
// Clamp after rounding so a bound with finer precision than the step cannot
|
|
173
|
+
// be rounded back out of its own range.
|
|
165
174
|
if (min != null) {
|
|
166
175
|
nextValue = Math.max(min, nextValue);
|
|
167
176
|
}
|
|
@@ -171,17 +180,16 @@ function getSteppedValue({
|
|
|
171
180
|
if (!Number.isFinite(nextValue)) {
|
|
172
181
|
return currentValue;
|
|
173
182
|
}
|
|
174
|
-
|
|
175
|
-
const roundedValue = Number(nextValue.toFixed(precision));
|
|
176
|
-
if (isIntegerOnly && !Number.isInteger(roundedValue)) {
|
|
183
|
+
if (isIntegerOnly && !Number.isInteger(nextValue)) {
|
|
177
184
|
return currentValue;
|
|
178
185
|
}
|
|
179
|
-
return Object.is(
|
|
186
|
+
return Object.is(nextValue, -0) ? 0 : nextValue;
|
|
180
187
|
}
|
|
181
188
|
|
|
182
189
|
/**
|
|
183
190
|
* A number input component for collecting numeric user input.
|
|
184
|
-
*
|
|
191
|
+
* Commits text edits on blur or Enter and only calls onChange when the whole
|
|
192
|
+
* draft passes validation.
|
|
185
193
|
*
|
|
186
194
|
* @example
|
|
187
195
|
* ```
|
|
@@ -231,6 +239,7 @@ export function NumberInput({
|
|
|
231
239
|
...rest
|
|
232
240
|
}) {
|
|
233
241
|
const t = useTranslator();
|
|
242
|
+
const locale = useLocale();
|
|
234
243
|
const isEffectivelyRequired = useResolvedRequired({
|
|
235
244
|
isRequired,
|
|
236
245
|
isOptional
|
|
@@ -280,6 +289,12 @@ export function NumberInput({
|
|
|
280
289
|
// The tooltip variant renders no message box; describe the input by the
|
|
281
290
|
// tooltip's content instead so the status is still announced.
|
|
282
291
|
statusTooltipDescribedBy, units ? unitsID : null, showsDisabledMessage ? disabledMessageTooltip.describedBy : null], inputGroup);
|
|
292
|
+
const parseInput = useCallback(text => parseNumberInput(text, {
|
|
293
|
+
min,
|
|
294
|
+
max,
|
|
295
|
+
isIntegerOnly,
|
|
296
|
+
locale
|
|
297
|
+
}), [isIntegerOnly, locale, max, min]);
|
|
283
298
|
const formattedValue = useMemo(() => {
|
|
284
299
|
if (value == null) {
|
|
285
300
|
return '';
|
|
@@ -296,75 +311,62 @@ export function NumberInput({
|
|
|
296
311
|
if (value == null) {
|
|
297
312
|
return '';
|
|
298
313
|
}
|
|
299
|
-
return isFocused ?
|
|
300
|
-
}, [formattedValue, isFocused, pendingInput, value]);
|
|
314
|
+
return isFocused ? formatEditableNumber(value, locale) : formattedValue;
|
|
315
|
+
}, [formattedValue, isFocused, locale, pendingInput, value]);
|
|
301
316
|
|
|
302
317
|
// Check if current pending input is valid (for styling purposes)
|
|
303
318
|
const isInputValid = useMemo(() => {
|
|
304
319
|
if (pendingInput === null || !pendingInput.trim()) {
|
|
305
320
|
return true;
|
|
306
321
|
}
|
|
307
|
-
return
|
|
308
|
-
|
|
309
|
-
max,
|
|
310
|
-
isIntegerOnly
|
|
311
|
-
}) !== null;
|
|
312
|
-
}, [pendingInput, min, max, isIntegerOnly]);
|
|
322
|
+
return parseInput(pendingInput) !== null;
|
|
323
|
+
}, [pendingInput, parseInput]);
|
|
313
324
|
|
|
314
|
-
//
|
|
325
|
+
// Keep the whole text edit as a draft until an explicit commit boundary.
|
|
315
326
|
const handleInputChange = useCallback(e => {
|
|
316
327
|
// Value can't change while showing a disabled message (the field is
|
|
317
328
|
// read-only and non-native-disabled), but guard the handler too so the
|
|
318
|
-
// pending value
|
|
329
|
+
// pending value never changes.
|
|
319
330
|
if (isDisabled || isReadOnly) {
|
|
320
331
|
return;
|
|
321
332
|
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
// If the input is valid, update immediately
|
|
326
|
-
const parsed = parseNumberInput(newValue, {
|
|
327
|
-
min,
|
|
328
|
-
max,
|
|
329
|
-
isIntegerOnly
|
|
330
|
-
});
|
|
331
|
-
if (parsed !== null && parsed !== value) {
|
|
332
|
-
onChange(parsed);
|
|
333
|
-
}
|
|
334
|
-
}, [value, onChange, min, max, isIntegerOnly, isDisabled, isReadOnly]);
|
|
333
|
+
setPendingInput(e.target.value);
|
|
334
|
+
}, [isDisabled, isReadOnly]);
|
|
335
335
|
|
|
336
336
|
// Handle focus
|
|
337
337
|
const handleFocus = useCallback(e => {
|
|
338
338
|
setIsFocused(true);
|
|
339
339
|
onFocus?.(e);
|
|
340
340
|
}, [onFocus]);
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
onChange(parsed);
|
|
359
|
-
}
|
|
341
|
+
const commitPendingInput = useCallback(trigger => {
|
|
342
|
+
if (pendingInput === null) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const decision = resolveNumberInputCommit(pendingInput, {
|
|
346
|
+
min,
|
|
347
|
+
max,
|
|
348
|
+
isIntegerOnly,
|
|
349
|
+
locale,
|
|
350
|
+
hasClear: !!hasClear
|
|
351
|
+
});
|
|
352
|
+
if (trigger === 'blur' || decision.type === 'commit' && decision.didClamp) {
|
|
353
|
+
setPendingInput(null);
|
|
354
|
+
}
|
|
355
|
+
if (decision.type === 'clear') {
|
|
356
|
+
if (hasClear && value != null) {
|
|
357
|
+
onChange(null);
|
|
360
358
|
}
|
|
359
|
+
} else if (decision.type === 'commit' && decision.value !== value) {
|
|
360
|
+
onChange(decision.value);
|
|
361
361
|
}
|
|
362
|
+
}, [hasClear, isIntegerOnly, locale, max, min, onChange, pendingInput, value]);
|
|
362
363
|
|
|
363
|
-
|
|
364
|
-
|
|
364
|
+
// Blur ends the edit and displays the resulting committed value.
|
|
365
|
+
const handleBlur = useCallback(e => {
|
|
366
|
+
commitPendingInput('blur');
|
|
365
367
|
setIsFocused(false);
|
|
366
368
|
onBlur?.(e);
|
|
367
|
-
}, [
|
|
369
|
+
}, [commitPendingInput, onBlur]);
|
|
368
370
|
const valueForStepping = useMemo(() => {
|
|
369
371
|
if (pendingInput === null) {
|
|
370
372
|
return value ?? null;
|
|
@@ -372,12 +374,8 @@ export function NumberInput({
|
|
|
372
374
|
if (pendingInput.trim() === '') {
|
|
373
375
|
return null;
|
|
374
376
|
}
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
max,
|
|
378
|
-
isIntegerOnly
|
|
379
|
-
}) ?? value ?? null;
|
|
380
|
-
}, [isIntegerOnly, max, min, pendingInput, value]);
|
|
377
|
+
return parseInput(pendingInput) ?? value ?? null;
|
|
378
|
+
}, [parseInput, pendingInput, value]);
|
|
381
379
|
const getNextValue = useCallback(direction => getSteppedValue({
|
|
382
380
|
currentValue: valueForStepping,
|
|
383
381
|
direction,
|
|
@@ -423,29 +421,11 @@ export function NumberInput({
|
|
|
423
421
|
return;
|
|
424
422
|
}
|
|
425
423
|
if (e.key === 'Enter') {
|
|
426
|
-
|
|
427
|
-
if (pendingInput !== null) {
|
|
428
|
-
if (hasClear && pendingInput.trim() === '') {
|
|
429
|
-
// Same clearable contract as blur: Enter on an emptied input
|
|
430
|
-
// commits null instead of reverting.
|
|
431
|
-
if (value != null) {
|
|
432
|
-
onChange(null);
|
|
433
|
-
}
|
|
434
|
-
} else {
|
|
435
|
-
const parsed = parseNumberInput(pendingInput, {
|
|
436
|
-
min,
|
|
437
|
-
max,
|
|
438
|
-
isIntegerOnly
|
|
439
|
-
});
|
|
440
|
-
if (parsed !== null && parsed !== value) {
|
|
441
|
-
onChange(parsed);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
424
|
+
commitPendingInput('Enter');
|
|
445
425
|
onEnter?.();
|
|
446
426
|
}
|
|
447
427
|
onKeyDown?.(e);
|
|
448
|
-
}, [
|
|
428
|
+
}, [commitPendingInput, onEnter, onKeyDown, stepValue]);
|
|
449
429
|
|
|
450
430
|
// React's delegated wheel listener can be passive, so use a native,
|
|
451
431
|
// explicitly non-passive listener to prevent page scrolling only when this
|
|
@@ -538,7 +518,10 @@ export function NumberInput({
|
|
|
538
518
|
autoFocus: hasAutoFocus,
|
|
539
519
|
"data-autofocus": hasAutoFocus || undefined,
|
|
540
520
|
"aria-valuemin": min ?? undefined,
|
|
541
|
-
"aria-valuemax": max ?? undefined
|
|
521
|
+
"aria-valuemax": max ?? undefined
|
|
522
|
+
// The ARIA value and hidden form input expose the committed value;
|
|
523
|
+
// pendingInput is still an uncommitted edit and may be invalid.
|
|
524
|
+
,
|
|
542
525
|
"aria-valuenow": value ?? undefined,
|
|
543
526
|
"aria-valuetext": value == null || !formatValue ? undefined : formattedValue,
|
|
544
527
|
"aria-describedby": ariaDescribedBy,
|
|
@@ -595,16 +578,9 @@ export function NumberInput({
|
|
|
595
578
|
inputRef.current?.focus();
|
|
596
579
|
stepValue(1);
|
|
597
580
|
},
|
|
598
|
-
...
|
|
599
|
-
0: {
|
|
600
|
-
className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce xv9yike x10xzikg xmvprkv xq8i9tn x1ypdohk x16khyan x1a2a7pz"
|
|
601
|
-
},
|
|
602
|
-
1: {
|
|
603
|
-
className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce x10xzikg x1a2a7pz xqa6c3m xt0e3qv x18o3ruo"
|
|
604
|
-
}
|
|
605
|
-
}[!!(isDisabled || isReadOnly || !canIncrement) << 0],
|
|
581
|
+
...stylex.props(styles.numberStepperButton, interactionOverlayStyles.backgroundImage, (isDisabled || isReadOnly || !canIncrement) && styles.numberStepperButtonDisabled),
|
|
606
582
|
children: /*#__PURE__*/_jsx(Icon, {
|
|
607
|
-
icon: "
|
|
583
|
+
icon: "numberInput:stepperDown",
|
|
608
584
|
size: "xsm",
|
|
609
585
|
color: "inherit",
|
|
610
586
|
xstyle: styles.incrementIcon
|
|
@@ -621,16 +597,9 @@ export function NumberInput({
|
|
|
621
597
|
inputRef.current?.focus();
|
|
622
598
|
stepValue(-1);
|
|
623
599
|
},
|
|
624
|
-
...
|
|
625
|
-
0: {
|
|
626
|
-
className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce xv9yike x10xzikg xmvprkv xq8i9tn x1ypdohk x16khyan x1a2a7pz x11xkdxz x13fuv20 x1mly77v"
|
|
627
|
-
},
|
|
628
|
-
1: {
|
|
629
|
-
className: "x9f619 x78zum5 x6s0dn4 xl56j7k x98rzlu x2lwn1j x1717udv x1ghz6dp xc342km xng3xce x10xzikg x1a2a7pz x11xkdxz x13fuv20 x1mly77v xqa6c3m xt0e3qv x18o3ruo"
|
|
630
|
-
}
|
|
631
|
-
}[!!(isDisabled || isReadOnly || !canDecrement) << 0],
|
|
600
|
+
...stylex.props(styles.numberStepperButton, interactionOverlayStyles.backgroundImage, styles.decrementButton, (isDisabled || isReadOnly || !canDecrement) && styles.numberStepperButtonDisabled),
|
|
632
601
|
children: /*#__PURE__*/_jsx(Icon, {
|
|
633
|
-
icon: "
|
|
602
|
+
icon: "numberInput:stepperDown",
|
|
634
603
|
size: "xsm",
|
|
635
604
|
color: "inherit"
|
|
636
605
|
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file numberInputCommit.ts
|
|
3
|
+
* @input A NumberInput draft and the field's validation constraints
|
|
4
|
+
* @output A single commit, clear, or revert decision for the whole draft
|
|
5
|
+
* @position Shared internal draft validation and commit policy for NumberInput and its live consumers
|
|
6
|
+
*
|
|
7
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
8
|
+
* - /packages/core/src/NumberInput/NumberInput.tsx
|
|
9
|
+
* - /packages/core/src/NumberInput/numberInputCommit.test.ts
|
|
10
|
+
* - /packages/core/src/Table/plugins/filtering/useTableFiltering.tsx
|
|
11
|
+
* - /packages/core/src/PowerSearch/PowerSearchValueEditor.tsx
|
|
12
|
+
*/
|
|
13
|
+
import type { Locale } from '../i18n';
|
|
14
|
+
interface NumberInputValidationOptions {
|
|
15
|
+
min?: number | null;
|
|
16
|
+
max?: number | null;
|
|
17
|
+
isIntegerOnly?: boolean;
|
|
18
|
+
locale?: Locale;
|
|
19
|
+
}
|
|
20
|
+
export type NumberInputCommitDecision = {
|
|
21
|
+
type: 'commit';
|
|
22
|
+
value: number;
|
|
23
|
+
didClamp: boolean;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'clear';
|
|
26
|
+
} | {
|
|
27
|
+
type: 'revert';
|
|
28
|
+
};
|
|
29
|
+
export declare function parseNumberInput(input: string, options: NumberInputValidationOptions): number | null;
|
|
30
|
+
export declare function resolveNumberInputCommit(input: string, options: NumberInputValidationOptions & {
|
|
31
|
+
hasClear: boolean;
|
|
32
|
+
}): NumberInputCommitDecision;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=numberInputCommit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numberInputCommit.d.ts","sourceRoot":"","sources":["../../src/NumberInput/numberInputCommit.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAGpC,UAAU,4BAA4B;IACpC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GAClD;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,GACf;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,CAAC;AAqBrB,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,4BAA4B,GACpC,MAAM,GAAG,IAAI,CAYf;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,4BAA4B,GAAG;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,GAC1D,yBAAyB,CAiC3B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file numberInputCommit.ts
|
|
5
|
+
* @input A NumberInput draft and the field's validation constraints
|
|
6
|
+
* @output A single commit, clear, or revert decision for the whole draft
|
|
7
|
+
* @position Shared internal draft validation and commit policy for NumberInput and its live consumers
|
|
8
|
+
*
|
|
9
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
10
|
+
* - /packages/core/src/NumberInput/NumberInput.tsx
|
|
11
|
+
* - /packages/core/src/NumberInput/numberInputCommit.test.ts
|
|
12
|
+
* - /packages/core/src/Table/plugins/filtering/useTableFiltering.tsx
|
|
13
|
+
* - /packages/core/src/PowerSearch/PowerSearchValueEditor.tsx
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { parseLocaleNumber } from "./numberParser.js";
|
|
17
|
+
function parseNumericInput(input, options) {
|
|
18
|
+
const trimmed = input.trim();
|
|
19
|
+
if (trimmed === '') {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const value = parseLocaleNumber(trimmed, options.locale);
|
|
23
|
+
if (value == null || !Number.isFinite(value)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
if (options.isIntegerOnly && !Number.isInteger(value)) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
export function parseNumberInput(input, options) {
|
|
32
|
+
const value = parseNumericInput(input, options);
|
|
33
|
+
if (value === null) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (options.min != null && value < options.min) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (options.max != null && value > options.max) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
export function resolveNumberInputCommit(input, options) {
|
|
45
|
+
if (input.trim() === '') {
|
|
46
|
+
return options.hasClear ? {
|
|
47
|
+
type: 'clear'
|
|
48
|
+
} : {
|
|
49
|
+
type: 'revert'
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const value = parseNumericInput(input, options);
|
|
53
|
+
if (value === null) {
|
|
54
|
+
return {
|
|
55
|
+
type: 'revert'
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const min = options.min == null ? null : options.isIntegerOnly ? Math.ceil(options.min) : options.min;
|
|
59
|
+
const max = options.max == null ? null : options.isIntegerOnly ? Math.floor(options.max) : options.max;
|
|
60
|
+
if (min != null && max != null && min > max) {
|
|
61
|
+
return {
|
|
62
|
+
type: 'revert'
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const committedValue = min != null && value < min ? min : max != null && value > max ? max : value;
|
|
66
|
+
return {
|
|
67
|
+
type: 'commit',
|
|
68
|
+
value: committedValue,
|
|
69
|
+
didClamp: committedValue !== value
|
|
70
|
+
};
|
|
71
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file numberParser.ts
|
|
3
|
+
* @input Text a person typed or pasted, plus the resolved BCP 47 locale
|
|
4
|
+
* @output Exports parseLocaleNumber and formatEditableNumber
|
|
5
|
+
* @position Internal to NumberInput; not part of the public surface
|
|
6
|
+
*
|
|
7
|
+
* People paste numbers out of spreadsheets, and a spreadsheet writes them
|
|
8
|
+
* grouped, signed, and decorated. This reads those back. Everything locale
|
|
9
|
+
* specific — the grouping and decimal separators, the group sizes, the digit
|
|
10
|
+
* script — is derived from Intl and Unicode rather than a table, and text that
|
|
11
|
+
* no reading fits returns null so the field stays visibly invalid instead of
|
|
12
|
+
* committing a guess. Where both readings are well formed the locale's wins,
|
|
13
|
+
* the way utils/dateParser.ts settles an ambiguous date by locale preference.
|
|
14
|
+
* Grouping is well formed only when every group fits the locale's own sizes:
|
|
15
|
+
* the last exactly the primary size, each inner one exactly the secondary, the
|
|
16
|
+
* first no longer than that. So de-DE `1.234` is 1234, while `1.2345` (last
|
|
17
|
+
* group too long) and `1234.567` (too much ahead of it) keep the full stop as
|
|
18
|
+
* a decimal point. Groups of three fit every locale, so a separator repeated
|
|
19
|
+
* with three-digit groups is grouping in all of them and `1,234,567` reads the
|
|
20
|
+
* same everywhere; for a space or apostrophe, which no locale writes as a
|
|
21
|
+
* decimal point, one occurrence is enough, so en-US `1 234` is 1234.
|
|
22
|
+
*
|
|
23
|
+
* That paragraph is executable: numberParser.docblock.test.ts implements it as
|
|
24
|
+
* code, quote by quote, and fails when the parser and the words disagree.
|
|
25
|
+
*
|
|
26
|
+
* Which characters may separate digits at all is the one thing that is NOT
|
|
27
|
+
* read off the input: SEPARATOR_CHARS below is a bounded alphabet, the same
|
|
28
|
+
* shape utils/dateParser.ts uses for its `[-/.]` date separators.
|
|
29
|
+
*
|
|
30
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
31
|
+
* - /packages/core/src/NumberInput/NumberInput.tsx
|
|
32
|
+
* - /packages/core/src/NumberInput/numberParser.test.ts
|
|
33
|
+
* - /packages/core/src/NumberInput/numberParser.docblock.test.ts
|
|
34
|
+
*/
|
|
35
|
+
import type { Locale } from '../i18n';
|
|
36
|
+
/**
|
|
37
|
+
* Read a number out of text the way a person in `locale` writes one: their
|
|
38
|
+
* grouping and decimal separators, their group sizes, their digit script, an
|
|
39
|
+
* optional currency symbol, and the shapes a spreadsheet pastes.
|
|
40
|
+
*
|
|
41
|
+
* Returns null rather than a guess. Grouping is validated, so en-US `1,23` —
|
|
42
|
+
* a comma that is neither a decimal point nor a well-formed group — is not
|
|
43
|
+
* silently read as 123, and neither is a number written for another locale.
|
|
44
|
+
* Only the characters some locale writes between digits count as separators,
|
|
45
|
+
* so `123-456-789` is not a number at all.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```
|
|
49
|
+
* parseLocaleNumber('1,234,234,234', 'en-US') // 1234234234
|
|
50
|
+
* parseLocaleNumber('1,234,234,234', 'de-DE') // 1234234234
|
|
51
|
+
* parseLocaleNumber('1,5', 'de-DE') // 1.5
|
|
52
|
+
* parseLocaleNumber('1.5', 'de-DE') // 1.5
|
|
53
|
+
* parseLocaleNumber('1,5', 'en-US') // null
|
|
54
|
+
* parseLocaleNumber('123-456-789', 'en-US') // null
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseLocaleNumber(text: string, locale?: Locale): number | null;
|
|
58
|
+
/**
|
|
59
|
+
* The text shown while the field is focused: the plain machine number in the
|
|
60
|
+
* locale's decimal separator, so what a person sees mid-edit is what the
|
|
61
|
+
* parser reads back on blur.
|
|
62
|
+
*/
|
|
63
|
+
export declare function formatEditableNumber(value: number, locale?: Locale): string;
|
|
64
|
+
//# sourceMappingURL=numberParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numberParser.d.ts","sourceRoot":"","sources":["../../src/NumberInput/numberParser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,SAAS,CAAC;AAiPpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CA8Ef;AAaD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3E"}
|