@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f
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 +161 -1
- 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/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- 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 +8 -4
- 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 +10 -6
- package/dist/Banner/Banner.d.ts +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +14 -15
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +6 -9
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +6 -6
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- 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/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- 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 +82 -23
- 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/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -2
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- 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 +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +9 -4
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +63 -11
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- 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 +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -3
- package/dist/Selector/Selector.d.ts +17 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +81 -14
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- 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.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +9 -3
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +27 -8
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +98 -7
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- 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/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- 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/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/en.json +154 -10
- package/locales/pseudo.json +108 -0
- package/package.json +8 -3
- 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/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- 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 +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +103 -0
- package/src/Calendar/Calendar.tsx +19 -16
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +44 -19
- package/src/Card/Card.tsx +12 -32
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -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/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +62 -14
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.tsx +9 -4
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +277 -0
- package/src/MultiSelector/MultiSelector.tsx +142 -11
- package/src/MultiSelector/index.ts +1 -0
- 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/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- 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 +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- 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/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +311 -1
- package/src/Selector/Selector.tsx +139 -16
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- 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 +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- 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-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +18 -0
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Toast/ToastViewport.tsx +17 -1
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -0
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
|
@@ -275,7 +275,10 @@ export function MultiSelector({
|
|
|
275
275
|
selectAllLabel: selectAllLabelFromProps,
|
|
276
276
|
hasSearch = false,
|
|
277
277
|
searchPlaceholder: searchPlaceholderFromProps,
|
|
278
|
+
emptyText: emptyTextFromProps,
|
|
279
|
+
emptySearchText: emptySearchTextFromProps,
|
|
278
280
|
triggerDisplay = 'count',
|
|
281
|
+
formatValue,
|
|
279
282
|
maxBadges = 3,
|
|
280
283
|
renderOption,
|
|
281
284
|
indicatorPosition = 'start',
|
|
@@ -295,6 +298,8 @@ export function MultiSelector({
|
|
|
295
298
|
const placeholder = placeholderFromProps ?? t('@astryx.multiSelector.selectPlaceholder');
|
|
296
299
|
const selectAllLabel = selectAllLabelFromProps ?? t('@astryx.multiSelector.selectAll');
|
|
297
300
|
const searchPlaceholder = searchPlaceholderFromProps ?? t('@astryx.multiSelector.searchPlaceholder');
|
|
301
|
+
const emptyText = emptyTextFromProps ?? t('@astryx.multiSelector.empty');
|
|
302
|
+
const emptySearchText = emptySearchTextFromProps ?? t('@astryx.multiSelector.emptySearchResults');
|
|
298
303
|
const size = useSize(sizeProp, 'md');
|
|
299
304
|
const effectiveStatusVariant = variant === 'ghost' && statusVariant === 'attached' ? 'detached' : statusVariant;
|
|
300
305
|
const triggerId = useId();
|
|
@@ -347,6 +352,13 @@ export function MultiSelector({
|
|
|
347
352
|
// Announce selection-count changes politely (comboboxes-7 announce path).
|
|
348
353
|
// Toggling options / select-all previously produced no audible feedback.
|
|
349
354
|
const announce = useAnnounce();
|
|
355
|
+
|
|
356
|
+
// The panel's empty message is role="presentation" and reaches assistive tech
|
|
357
|
+
// only through this live region, so the region has to speak whatever the
|
|
358
|
+
// panel shows. A ReactNode override cannot be spoken; fall back to the
|
|
359
|
+
// catalog copy for that case rather than announcing nothing.
|
|
360
|
+
const emptyAnnouncement = typeof emptyText === 'string' ? emptyText : t('@astryx.multiSelector.empty');
|
|
361
|
+
const emptySearchAnnouncement = typeof emptySearchText === 'string' ? emptySearchText : t('@astryx.multiSelector.emptySearchResults');
|
|
350
362
|
const announceSelection = useCallback(nextValue => {
|
|
351
363
|
const total = selectableItems.length;
|
|
352
364
|
const selectableSet = new Set(selectableItems.map(item => item.value));
|
|
@@ -453,11 +465,38 @@ export function MultiSelector({
|
|
|
453
465
|
announce('');
|
|
454
466
|
return;
|
|
455
467
|
}
|
|
468
|
+
// While isLoading the panel deliberately shows nothing, so announcing a
|
|
469
|
+
// result would put a claim in the one channel the screen has gone quiet
|
|
470
|
+
// for.
|
|
471
|
+
if (isLoading) {
|
|
472
|
+
announce('');
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
456
475
|
const count = filterOptionsByQuery(selectableItems, nextQuery).length;
|
|
457
|
-
announce(count === 0 ?
|
|
476
|
+
announce(count === 0 ? emptySearchAnnouncement : t('@astryx.multiSelector.resultCount', {
|
|
458
477
|
count
|
|
459
478
|
}));
|
|
460
|
-
}, [announce, selectableItems, t]);
|
|
479
|
+
}, [announce, isLoading, selectableItems, emptySearchAnnouncement, t]);
|
|
480
|
+
|
|
481
|
+
// The panel's empty message is role="presentation", so this region is the
|
|
482
|
+
// only route to assistive tech. It has to watch the STATE rather than the
|
|
483
|
+
// open event: the panel can become empty either on open or when a fetch
|
|
484
|
+
// lands with nothing in it, and an open-only announcement leaves the second
|
|
485
|
+
// case silent while the message sits on screen. The ref makes it fire once
|
|
486
|
+
// per arrival at that state rather than on every re-render.
|
|
487
|
+
const announcedEmptyRef = useRef(null);
|
|
488
|
+
useEffect(() => {
|
|
489
|
+
const isPanelEmpty = popover.isOpen && !isLoading && searchQuery === '' && selectableItems.length === 0;
|
|
490
|
+
if (!isPanelEmpty) {
|
|
491
|
+
announcedEmptyRef.current = null;
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
if (announcedEmptyRef.current === emptyAnnouncement) {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
announcedEmptyRef.current = emptyAnnouncement;
|
|
498
|
+
announce(emptyAnnouncement);
|
|
499
|
+
}, [popover.isOpen, isLoading, searchQuery, selectableItems.length, emptyAnnouncement, announce]);
|
|
461
500
|
|
|
462
501
|
// Handle toggle
|
|
463
502
|
// Clear all selected values. Shared by the clear button and the keyboard
|
|
@@ -576,12 +615,16 @@ export function MultiSelector({
|
|
|
576
615
|
}, [popover.isOpen, highlightedIndex, getItemId]);
|
|
577
616
|
|
|
578
617
|
// Build trigger display content
|
|
579
|
-
const
|
|
618
|
+
const selectedItems = useMemo(() => {
|
|
580
619
|
return optimisticValue.map(v => {
|
|
581
620
|
const item = selectableItems.find(i => i.value === v);
|
|
582
|
-
return
|
|
621
|
+
return {
|
|
622
|
+
value: v,
|
|
623
|
+
label: item?.label ?? v
|
|
624
|
+
};
|
|
583
625
|
});
|
|
584
626
|
}, [optimisticValue, selectableItems]);
|
|
627
|
+
const selectedLabels = useMemo(() => selectedItems.map(item => item.label), [selectedItems]);
|
|
585
628
|
const renderTriggerContent = useCallback(() => {
|
|
586
629
|
if (optimisticValue.length === 0) {
|
|
587
630
|
return /*#__PURE__*/_jsx("span", {
|
|
@@ -593,11 +636,11 @@ export function MultiSelector({
|
|
|
593
636
|
}
|
|
594
637
|
switch (triggerDisplay) {
|
|
595
638
|
case 'count':
|
|
596
|
-
return /*#__PURE__*/
|
|
639
|
+
return /*#__PURE__*/_jsx("span", {
|
|
597
640
|
...{
|
|
598
641
|
className: "xb3r6kr xlyipyv xuxw1ft"
|
|
599
642
|
},
|
|
600
|
-
children:
|
|
643
|
+
children: formatValue?.(selectedItems) ?? `${optimisticValue.length} selected`
|
|
601
644
|
});
|
|
602
645
|
case 'labels':
|
|
603
646
|
{
|
|
@@ -608,7 +651,7 @@ export function MultiSelector({
|
|
|
608
651
|
...{
|
|
609
652
|
className: "xb3r6kr xlyipyv xuxw1ft"
|
|
610
653
|
},
|
|
611
|
-
children: text
|
|
654
|
+
children: formatValue?.(selectedItems) ?? text
|
|
612
655
|
});
|
|
613
656
|
}
|
|
614
657
|
case 'badges':
|
|
@@ -631,7 +674,7 @@ export function MultiSelector({
|
|
|
631
674
|
});
|
|
632
675
|
}
|
|
633
676
|
}
|
|
634
|
-
}, [optimisticValue, triggerDisplay, selectedLabels, placeholder, maxBadges]);
|
|
677
|
+
}, [optimisticValue, triggerDisplay, selectedItems, selectedLabels, placeholder, formatValue, maxBadges]);
|
|
635
678
|
|
|
636
679
|
// Render search input
|
|
637
680
|
const renderSearch = useCallback(() => {
|
|
@@ -795,13 +838,16 @@ export function MultiSelector({
|
|
|
795
838
|
// message out of the listbox's accessibility tree (role="listbox" only
|
|
796
839
|
// permits option/group children); the no-results outcome is announced
|
|
797
840
|
// via the result-count live region instead.
|
|
798
|
-
|
|
841
|
+
// While isLoading the options have not arrived yet, so asserting either
|
|
842
|
+
// message would be a claim the component cannot make; the trigger's
|
|
843
|
+
// spinner covers it.
|
|
844
|
+
if (realItemCount === 0 && !isLoading) {
|
|
799
845
|
elements.push(/*#__PURE__*/_jsx("div", {
|
|
800
846
|
role: "presentation",
|
|
801
847
|
...mergeProps(themeProps('multi-selector-empty-state'), {
|
|
802
848
|
className: "x1b2ylru x2b8uid xv1l7n4 x9ynric xcr08ib"
|
|
803
849
|
}),
|
|
804
|
-
children:
|
|
850
|
+
children: searchQuery ? emptySearchText : emptyText
|
|
805
851
|
}, "empty"));
|
|
806
852
|
return elements;
|
|
807
853
|
}
|
|
@@ -827,7 +873,13 @@ export function MultiSelector({
|
|
|
827
873
|
// A standalone divider between groups would orphan itself once its
|
|
828
874
|
// neighbors are filtered out, so skip it while searching.
|
|
829
875
|
if (!isSearching) {
|
|
876
|
+
// role="listbox" only permits option/group children; the divider
|
|
877
|
+
// carries no information the options don't, so it's hidden from
|
|
878
|
+
// the accessibility tree entirely rather than exposing
|
|
879
|
+
// role="separator" as a disallowed listbox child (axe
|
|
880
|
+
// aria-required-children).
|
|
830
881
|
elements.push(/*#__PURE__*/_jsx(Divider, {
|
|
882
|
+
"aria-hidden": "true",
|
|
831
883
|
xstyle: styles.divider
|
|
832
884
|
}, `divider-${i}`));
|
|
833
885
|
}
|
|
@@ -866,7 +918,7 @@ export function MultiSelector({
|
|
|
866
918
|
}
|
|
867
919
|
flushPending();
|
|
868
920
|
return elements;
|
|
869
|
-
}, [options, renderItem, sortedItems, searchQuery, hasSelectAll]);
|
|
921
|
+
}, [options, renderItem, sortedItems, searchQuery, hasSelectAll, isLoading, emptyText, emptySearchText]);
|
|
870
922
|
|
|
871
923
|
// The detached message box renders its own leading status icon, so the
|
|
872
924
|
// on-field icon would duplicate it — keep the chevron indicator instead.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @output Exports MultiSelector and types
|
|
4
4
|
* @position Public API entry point
|
|
5
5
|
*/
|
|
6
|
-
export { MultiSelector, type MultiSelectorProps, type MultiSelectorSize, type MultiSelectorStatusType, } from './MultiSelector';
|
|
6
|
+
export { MultiSelector, type MultiSelectorProps, type MultiSelectorSize, type MultiSelectorStatusType, type MultiSelectorSelectedItem, } from './MultiSelector';
|
|
7
7
|
export type { MultiSelectorOptionType, MultiSelectorOptionData, MultiSelectorDivider, MultiSelectorSection, MultiSelectorStatus, } from './types';
|
|
8
8
|
export { useMultiCombobox } from './hooks';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MultiSelector/index.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/MultiSelector/index.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavIcon.d.ts","sourceRoot":"","sources":["../../src/NavIcon/NavIcon.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAuB5C,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,eAAe,CAAC;IAC9D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC;;;OAGG;IACH,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,YAAY,+
|
|
1
|
+
{"version":3,"file":"NavIcon.d.ts","sourceRoot":"","sources":["../../src/NavIcon/NavIcon.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAuB5C,MAAM,WAAW,YAAa,SAAQ,SAAS,CAAC,eAAe,CAAC;IAC9D,wCAAwC;IACxC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC;;;OAGG;IACH,IAAI,EAAE,SAAS,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,EACtB,IAAI,EACJ,MAAM,EACN,SAAS,EACT,KAAK,EACL,GAAG,EACH,GAAG,KAAK,EACT,EAAE,YAAY,+BAkBd;yBAzBe,OAAO"}
|
package/dist/NavIcon/NavIcon.js
CHANGED
|
@@ -67,7 +67,11 @@ export function NavIcon({
|
|
|
67
67
|
}) {
|
|
68
68
|
return /*#__PURE__*/_jsx("span", {
|
|
69
69
|
ref: ref,
|
|
70
|
-
...mergeProps(themeProps('
|
|
70
|
+
...mergeProps(themeProps('nav-icon', undefined, {
|
|
71
|
+
// `navicon` ran the compound name together; themes styling it keep
|
|
72
|
+
// working until the next major.
|
|
73
|
+
legacyNames: ['navicon']
|
|
74
|
+
}), stylex.props(styles.base, xstyle), className, style),
|
|
71
75
|
...props,
|
|
72
76
|
children: icon
|
|
73
77
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NavHeadingMenu.d.ts","sourceRoot":"","sources":["../../src/NavMenu/NavHeadingMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAuB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAIlE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAI5C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"NavHeadingMenu.d.ts","sourceRoot":"","sources":["../../src/NavMenu/NavHeadingMenu.tsx"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAuB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAIlE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAI5C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAuB1B,MAAM,WAAW,mBAAoB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACpE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,iEAAiE;IACjE,QAAQ,EAAE,SAAS,CAAC;IAEpB;;;OAGG;IACH,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,GAAG,EACH,QAAQ,EACR,IAAW,EACX,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,MAAM,GACtB,EAAE,mBAAmB,qBAiFrB;yBA1Fe,cAAc"}
|
|
@@ -15,11 +15,12 @@ import React, { useCallback, useMemo } from 'react';
|
|
|
15
15
|
import * as stylex from '@stylexjs/stylex';
|
|
16
16
|
import "../theme/tokens.stylex.js";
|
|
17
17
|
import { spacingVars } from "../theme/tokens.stylex.js";
|
|
18
|
-
import { mergeProps
|
|
18
|
+
import { mergeProps } from "../utils/index.js";
|
|
19
19
|
import { useListFocus } from "../hooks/useListFocus.js";
|
|
20
20
|
import { useTypeahead } from "../hooks/useTypeahead.js";
|
|
21
21
|
import { themeProps } from "../utils/themeProps.js";
|
|
22
22
|
import { NavHeadingMenuContext, useNavHeadingCloseContext } from "./NavMenuContext.js";
|
|
23
|
+
import { useMergedRefs } from "../hooks/useMergedRefs.js";
|
|
23
24
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
24
25
|
const styles = {
|
|
25
26
|
root: {
|
|
@@ -125,7 +126,7 @@ export function NavHeadingMenu({
|
|
|
125
126
|
return /*#__PURE__*/_jsx(NavHeadingMenuContext, {
|
|
126
127
|
value: ctx,
|
|
127
128
|
children: /*#__PURE__*/_jsx("div", {
|
|
128
|
-
ref:
|
|
129
|
+
ref: useMergedRefs(ref, listRef),
|
|
129
130
|
role: "menu",
|
|
130
131
|
onKeyDown: listKeyDown,
|
|
131
132
|
"data-testid": testId,
|
|
@@ -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)
|
|
@@ -91,43 +93,15 @@ import { groupStyles } from "../InputGroup/groupStyles.js";
|
|
|
91
93
|
|
|
92
94
|
import { isImeKeyEvent, mergeProps, mergeRefs } from "../utils/index.js";
|
|
93
95
|
import { themeProps } from "../utils/themeProps.js";
|
|
94
|
-
import { useTranslator } from "../i18n/index.js";
|
|
96
|
+
import { useTranslator, useLocale } from "../i18n/index.js";
|
|
97
|
+
import { formatEditableNumber } from "./numberParser.js";
|
|
98
|
+
import { parseNumberInput, resolveNumberInputCommit } from "./numberInputCommit.js";
|
|
95
99
|
|
|
96
100
|
/**
|
|
97
101
|
* Without `hasClear`, onChange only receives valid numbers.
|
|
98
102
|
* With `hasClear`, onChange also receives `null` when the user clears the input.
|
|
99
103
|
*/
|
|
100
104
|
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
105
|
function getDecimalPlaces(value) {
|
|
132
106
|
const [coefficient, exponentText] = String(value).toLowerCase().split('e');
|
|
133
107
|
const fractionLength = coefficient.split('.')[1]?.length ?? 0;
|
|
@@ -181,7 +155,8 @@ function getSteppedValue({
|
|
|
181
155
|
|
|
182
156
|
/**
|
|
183
157
|
* A number input component for collecting numeric user input.
|
|
184
|
-
*
|
|
158
|
+
* Commits text edits on blur or Enter and only calls onChange when the whole
|
|
159
|
+
* draft passes validation.
|
|
185
160
|
*
|
|
186
161
|
* @example
|
|
187
162
|
* ```
|
|
@@ -231,6 +206,7 @@ export function NumberInput({
|
|
|
231
206
|
...rest
|
|
232
207
|
}) {
|
|
233
208
|
const t = useTranslator();
|
|
209
|
+
const locale = useLocale();
|
|
234
210
|
const isEffectivelyRequired = useResolvedRequired({
|
|
235
211
|
isRequired,
|
|
236
212
|
isOptional
|
|
@@ -280,6 +256,12 @@ export function NumberInput({
|
|
|
280
256
|
// The tooltip variant renders no message box; describe the input by the
|
|
281
257
|
// tooltip's content instead so the status is still announced.
|
|
282
258
|
statusTooltipDescribedBy, units ? unitsID : null, showsDisabledMessage ? disabledMessageTooltip.describedBy : null], inputGroup);
|
|
259
|
+
const parseInput = useCallback(text => parseNumberInput(text, {
|
|
260
|
+
min,
|
|
261
|
+
max,
|
|
262
|
+
isIntegerOnly,
|
|
263
|
+
locale
|
|
264
|
+
}), [isIntegerOnly, locale, max, min]);
|
|
283
265
|
const formattedValue = useMemo(() => {
|
|
284
266
|
if (value == null) {
|
|
285
267
|
return '';
|
|
@@ -296,75 +278,62 @@ export function NumberInput({
|
|
|
296
278
|
if (value == null) {
|
|
297
279
|
return '';
|
|
298
280
|
}
|
|
299
|
-
return isFocused ?
|
|
300
|
-
}, [formattedValue, isFocused, pendingInput, value]);
|
|
281
|
+
return isFocused ? formatEditableNumber(value, locale) : formattedValue;
|
|
282
|
+
}, [formattedValue, isFocused, locale, pendingInput, value]);
|
|
301
283
|
|
|
302
284
|
// Check if current pending input is valid (for styling purposes)
|
|
303
285
|
const isInputValid = useMemo(() => {
|
|
304
286
|
if (pendingInput === null || !pendingInput.trim()) {
|
|
305
287
|
return true;
|
|
306
288
|
}
|
|
307
|
-
return
|
|
308
|
-
|
|
309
|
-
max,
|
|
310
|
-
isIntegerOnly
|
|
311
|
-
}) !== null;
|
|
312
|
-
}, [pendingInput, min, max, isIntegerOnly]);
|
|
289
|
+
return parseInput(pendingInput) !== null;
|
|
290
|
+
}, [pendingInput, parseInput]);
|
|
313
291
|
|
|
314
|
-
//
|
|
292
|
+
// Keep the whole text edit as a draft until an explicit commit boundary.
|
|
315
293
|
const handleInputChange = useCallback(e => {
|
|
316
294
|
// Value can't change while showing a disabled message (the field is
|
|
317
295
|
// read-only and non-native-disabled), but guard the handler too so the
|
|
318
|
-
// pending value
|
|
296
|
+
// pending value never changes.
|
|
319
297
|
if (isDisabled || isReadOnly) {
|
|
320
298
|
return;
|
|
321
299
|
}
|
|
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]);
|
|
300
|
+
setPendingInput(e.target.value);
|
|
301
|
+
}, [isDisabled, isReadOnly]);
|
|
335
302
|
|
|
336
303
|
// Handle focus
|
|
337
304
|
const handleFocus = useCallback(e => {
|
|
338
305
|
setIsFocused(true);
|
|
339
306
|
onFocus?.(e);
|
|
340
307
|
}, [onFocus]);
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
onChange(parsed);
|
|
359
|
-
}
|
|
308
|
+
const commitPendingInput = useCallback(trigger => {
|
|
309
|
+
if (pendingInput === null) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const decision = resolveNumberInputCommit(pendingInput, {
|
|
313
|
+
min,
|
|
314
|
+
max,
|
|
315
|
+
isIntegerOnly,
|
|
316
|
+
locale,
|
|
317
|
+
hasClear: !!hasClear
|
|
318
|
+
});
|
|
319
|
+
if (trigger === 'blur' || decision.type === 'commit' && decision.didClamp) {
|
|
320
|
+
setPendingInput(null);
|
|
321
|
+
}
|
|
322
|
+
if (decision.type === 'clear') {
|
|
323
|
+
if (hasClear && value != null) {
|
|
324
|
+
onChange(null);
|
|
360
325
|
}
|
|
326
|
+
} else if (decision.type === 'commit' && decision.value !== value) {
|
|
327
|
+
onChange(decision.value);
|
|
361
328
|
}
|
|
329
|
+
}, [hasClear, isIntegerOnly, locale, max, min, onChange, pendingInput, value]);
|
|
362
330
|
|
|
363
|
-
|
|
364
|
-
|
|
331
|
+
// Blur ends the edit and displays the resulting committed value.
|
|
332
|
+
const handleBlur = useCallback(e => {
|
|
333
|
+
commitPendingInput('blur');
|
|
365
334
|
setIsFocused(false);
|
|
366
335
|
onBlur?.(e);
|
|
367
|
-
}, [
|
|
336
|
+
}, [commitPendingInput, onBlur]);
|
|
368
337
|
const valueForStepping = useMemo(() => {
|
|
369
338
|
if (pendingInput === null) {
|
|
370
339
|
return value ?? null;
|
|
@@ -372,12 +341,8 @@ export function NumberInput({
|
|
|
372
341
|
if (pendingInput.trim() === '') {
|
|
373
342
|
return null;
|
|
374
343
|
}
|
|
375
|
-
return
|
|
376
|
-
|
|
377
|
-
max,
|
|
378
|
-
isIntegerOnly
|
|
379
|
-
}) ?? value ?? null;
|
|
380
|
-
}, [isIntegerOnly, max, min, pendingInput, value]);
|
|
344
|
+
return parseInput(pendingInput) ?? value ?? null;
|
|
345
|
+
}, [parseInput, pendingInput, value]);
|
|
381
346
|
const getNextValue = useCallback(direction => getSteppedValue({
|
|
382
347
|
currentValue: valueForStepping,
|
|
383
348
|
direction,
|
|
@@ -423,29 +388,11 @@ export function NumberInput({
|
|
|
423
388
|
return;
|
|
424
389
|
}
|
|
425
390
|
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
|
-
}
|
|
391
|
+
commitPendingInput('Enter');
|
|
445
392
|
onEnter?.();
|
|
446
393
|
}
|
|
447
394
|
onKeyDown?.(e);
|
|
448
|
-
}, [
|
|
395
|
+
}, [commitPendingInput, onEnter, onKeyDown, stepValue]);
|
|
449
396
|
|
|
450
397
|
// React's delegated wheel listener can be passive, so use a native,
|
|
451
398
|
// explicitly non-passive listener to prevent page scrolling only when this
|
|
@@ -538,7 +485,10 @@ export function NumberInput({
|
|
|
538
485
|
autoFocus: hasAutoFocus,
|
|
539
486
|
"data-autofocus": hasAutoFocus || undefined,
|
|
540
487
|
"aria-valuemin": min ?? undefined,
|
|
541
|
-
"aria-valuemax": max ?? undefined
|
|
488
|
+
"aria-valuemax": max ?? undefined
|
|
489
|
+
// The ARIA value and hidden form input expose the committed value;
|
|
490
|
+
// pendingInput is still an uncommitted edit and may be invalid.
|
|
491
|
+
,
|
|
542
492
|
"aria-valuenow": value ?? undefined,
|
|
543
493
|
"aria-valuetext": value == null || !formatValue ? undefined : formattedValue,
|
|
544
494
|
"aria-describedby": ariaDescribedBy,
|
|
@@ -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
|
+
}
|