@astryxdesign/core 0.4.7 → 0.5.0-canary.009bcb3
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 +49 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +62 -20
- 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 +7 -3
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +21 -23
- 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 +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 +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/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +1 -3
- 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/DateRangeInput/DateRangeInput.d.ts +4 -2
- package/dist/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- 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/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- 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/Field/InputClearButton.d.ts +9 -3
- package/dist/Field/InputClearButton.d.ts.map +1 -1
- package/dist/Field/InputClearButton.js +14 -3
- 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 -3
- 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/gestureCounter.d.ts +8 -0
- package/dist/Layer/gestureCounter.d.ts.map +1 -0
- package/dist/Layer/gestureCounter.js +53 -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/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +128 -8
- 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/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/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/MetadataList/MetadataListItem.d.ts +1 -1
- package/dist/MetadataList/MetadataListItem.d.ts.map +1 -1
- package/dist/MetadataList/MetadataListItem.js +4 -1
- 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 +73 -15
- 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/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 +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +9 -5
- 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/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +1 -9
- package/dist/Popover/usePopover.d.ts +7 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +40 -21
- 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 +12 -3
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +91 -18
- 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.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 +26 -0
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +54 -11
- 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 +43 -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 -3
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +16 -10
- 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 +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +15 -21
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +22 -7
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +71 -18
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +20 -9
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +7 -4
- package/dist/Tokenizer/Tokenizer.d.ts +14 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +33 -21
- 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 +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +31 -11
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +22 -7
- 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/Typeahead/BaseTypeahead.d.ts +35 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +119 -37
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +5 -2
- 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 +113 -11
- 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/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- 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/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/af-ZA.json +6 -6
- package/locales/ar-SA.json +6 -6
- package/locales/ca-ES.json +5 -5
- package/locales/cs-CZ.json +6 -6
- package/locales/da-DK.json +6 -6
- package/locales/de-DE.json +6 -6
- package/locales/el-GR.json +6 -6
- package/locales/en.json +163 -11
- package/locales/es-ES.json +5 -5
- package/locales/fi-FI.json +6 -6
- package/locales/fr-FR.json +6 -6
- package/locales/he-IL.json +6 -6
- package/locales/hu-HU.json +6 -6
- package/locales/it-IT.json +6 -6
- package/locales/ja-JP.json +6 -6
- package/locales/ko-KR.json +6 -6
- package/locales/nl-NL.json +6 -6
- package/locales/no-NO.json +6 -6
- package/locales/pl-PL.json +6 -6
- package/locales/pseudo.json +114 -0
- package/locales/pt-BR.json +6 -6
- package/locales/pt-PT.json +6 -6
- package/locales/ro-RO.json +6 -6
- package/locales/ru-RU.json +6 -6
- package/locales/sr-SP.json +6 -6
- package/locales/sv-SE.json +6 -6
- package/locales/tr-TR.json +6 -6
- package/locales/uk-UA.json +6 -6
- package/locales/vi-VN.json +6 -6
- package/locales/zh-CN.json +6 -6
- package/locales/zh-TW.json +6 -6
- 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 +22 -11
- package/src/Banner/Banner.test.tsx +177 -25
- package/src/Banner/Banner.tsx +93 -27
- 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 +7 -6
- package/src/Calendar/Calendar.test.tsx +143 -0
- package/src/Calendar/Calendar.tsx +30 -26
- 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 +113 -19
- package/src/Card/Card.tsx +67 -89
- package/src/Card/index.ts +36 -1
- 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/ComplexSelector/ComplexSelector.test.tsx +32 -0
- package/src/ComplexSelector/ComplexSelector.tsx +1 -3
- 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/DateRangeInput/DateRangeInput.doc.mjs +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +22 -0
- package/src/DateRangeInput/DateRangeInput.tsx +4 -2
- 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/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- 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/Field/InputClearButton.test.tsx +15 -1
- package/src/Field/InputClearButton.tsx +28 -4
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -3
- 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/gestureCounter.ts +57 -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 +324 -15
- package/src/Layer/useLayer.tsx +164 -8
- 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/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- 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/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- 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/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- 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 +311 -0
- package/src/MultiSelector/MultiSelector.tsx +151 -15
- package/src/MultiSelector/hooks.ts +9 -2
- 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.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +9 -5
- 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/Popover.test.tsx +14 -0
- package/src/Popover/Popover.tsx +1 -9
- package/src/Popover/usePopover.tsx +57 -32
- 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.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +19 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +346 -1
- package/src/Selector/Selector.tsx +148 -21
- package/src/Selector/hooks.ts +17 -2
- 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 +67 -12
- 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 +138 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +63 -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 +67 -1
- package/src/Text/Text.tsx +6 -3
- package/src/TextArea/TextArea.doc.mjs +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +37 -24
- 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 +58 -0
- package/src/Timestamp/Timestamp.tsx +12 -10
- package/src/Toast/Toast.doc.mjs +26 -12
- package/src/Toast/Toast.tsx +28 -4
- package/src/Toast/ToastViewport.test.tsx +536 -8
- package/src/Toast/ToastViewport.tsx +81 -12
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +15 -10
- package/src/Token/TokenLink.tsx +14 -5
- package/src/Tokenizer/Tokenizer.doc.mjs +43 -3
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +53 -24
- 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.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -5
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -7
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/Typeahead/BaseTypeahead.doc.mjs +24 -0
- package/src/Typeahead/BaseTypeahead.tsx +181 -39
- package/src/Typeahead/Typeahead.doc.mjs +11 -0
- package/src/Typeahead/Typeahead.test.tsx +203 -0
- package/src/Typeahead/Typeahead.tsx +12 -2
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- 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/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/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/hooks/useTypeahead.doc.mjs +153 -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/Theme.test.tsx +104 -2
- package/src/theme/Theme.tsx +49 -14
- package/src/theme/defineTheme.test.ts +23 -0
- package/src/theme/derivedVarRegistry.test.ts +26 -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/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
package/src/Text/Text.tsx
CHANGED
|
@@ -48,7 +48,8 @@ import {
|
|
|
48
48
|
} from './text.stylex';
|
|
49
49
|
import {useTruncation} from './useTruncation';
|
|
50
50
|
import type {LayerPlacement} from '../Layer';
|
|
51
|
-
import {mergeProps
|
|
51
|
+
import {mergeProps} from '../utils';
|
|
52
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
52
53
|
import type {BaseProps} from '../BaseProps';
|
|
53
54
|
import {themeProps} from '../utils/themeProps';
|
|
54
55
|
|
|
@@ -271,13 +272,16 @@ export function Text({
|
|
|
271
272
|
// Ref for the text element (used as tooltip anchor)
|
|
272
273
|
const textRef = useRef<HTMLElement>(null);
|
|
273
274
|
|
|
275
|
+
// Keep the merged ref stable across rerenders.
|
|
276
|
+
const mergedRef = useMergedRefs(ref, truncation.ref, textRef);
|
|
277
|
+
|
|
274
278
|
// Build inline style for -webkit-line-clamp (dynamic value)
|
|
275
279
|
const inlineStyle = maxLines > 1 ? {WebkitLineClamp: maxLines} : undefined;
|
|
276
280
|
|
|
277
281
|
return (
|
|
278
282
|
<>
|
|
279
283
|
<Component
|
|
280
|
-
ref={
|
|
284
|
+
ref={mergedRef}
|
|
281
285
|
{...mergeProps(
|
|
282
286
|
themeProps('text', {type, size, color: resolvedColor}),
|
|
283
287
|
stylex.props(
|
|
@@ -309,7 +313,6 @@ export function Text({
|
|
|
309
313
|
className,
|
|
310
314
|
{...style, ...inlineStyle},
|
|
311
315
|
)}
|
|
312
|
-
title={tooltipEnabled ? truncation.fullText : undefined}
|
|
313
316
|
{...props}>
|
|
314
317
|
{children}
|
|
315
318
|
</Component>
|
|
@@ -186,7 +186,12 @@ export const docs = {
|
|
|
186
186
|
],
|
|
187
187
|
theming: {
|
|
188
188
|
targets: [
|
|
189
|
-
{className: 'astryx-
|
|
189
|
+
{className: 'astryx-text-area', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
|
|
190
|
+
{className: 'astryx-text-area-control'},
|
|
191
|
+
{className: 'astryx-text-area-counter'},
|
|
192
|
+
// Still emitted beside the names above, so themes written against
|
|
193
|
+
// them keep working. Drop in the next major.
|
|
194
|
+
{className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly'], deprecatedFor: 'text-area'},
|
|
190
195
|
],
|
|
191
196
|
vars: [
|
|
192
197
|
{
|
|
@@ -381,7 +386,12 @@ export const docsZh = {
|
|
|
381
386
|
],
|
|
382
387
|
theming: {
|
|
383
388
|
targets: [
|
|
384
|
-
{className: 'astryx-
|
|
389
|
+
{className: 'astryx-text-area', visualProps: ['size', 'status'], states: ['disabled', 'readonly']},
|
|
390
|
+
{className: 'astryx-text-area-control'},
|
|
391
|
+
{className: 'astryx-text-area-counter'},
|
|
392
|
+
// Still emitted beside the names above, so themes written against
|
|
393
|
+
// them keep working. Drop in the next major.
|
|
394
|
+
{className: 'astryx-textarea', visualProps: ['size', 'status'], states: ['disabled', 'readonly'], deprecatedFor: 'text-area'},
|
|
385
395
|
],
|
|
386
396
|
vars: [
|
|
387
397
|
{
|
|
@@ -1155,3 +1155,14 @@ describe('TextArea readonly theme state', () => {
|
|
|
1155
1155
|
expect(root).not.toHaveAttribute('data-readonly');
|
|
1156
1156
|
});
|
|
1157
1157
|
});
|
|
1158
|
+
|
|
1159
|
+
describe('TextArea theme target names', () => {
|
|
1160
|
+
it('renders the deprecated class beside the current one', () => {
|
|
1161
|
+
const {container} = render(
|
|
1162
|
+
<TextArea label="Notes" value="" onChange={() => {}} />,
|
|
1163
|
+
);
|
|
1164
|
+
const root = container.querySelector('.astryx-text-area');
|
|
1165
|
+
expect(root).not.toBeNull();
|
|
1166
|
+
expect(root).toHaveClass('astryx-textarea');
|
|
1167
|
+
});
|
|
1168
|
+
});
|
|
@@ -46,7 +46,7 @@ import {
|
|
|
46
46
|
import {Icon, renderIconSlot, type IconType} from '../Icon';
|
|
47
47
|
import {Spinner} from '../Spinner';
|
|
48
48
|
import {useTooltip} from '../Tooltip';
|
|
49
|
-
import {mergeProps
|
|
49
|
+
import {mergeProps} from '../utils';
|
|
50
50
|
import type {BaseProps} from '../BaseProps';
|
|
51
51
|
import type {SizeValue} from '../utils/types';
|
|
52
52
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
@@ -58,6 +58,7 @@ import {themeProps} from '../utils/themeProps';
|
|
|
58
58
|
import {characterCount} from '../utils/characters';
|
|
59
59
|
import {useTranslator} from '../i18n';
|
|
60
60
|
|
|
61
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
61
62
|
const COUNTER_WARNING_THRESHOLD = 0.8;
|
|
62
63
|
|
|
63
64
|
const styles = stylex.create({
|
|
@@ -555,12 +556,18 @@ export function TextArea({
|
|
|
555
556
|
onClick={handleWrapperClick}
|
|
556
557
|
onMouseUp={handleWrapperMouseUp}
|
|
557
558
|
{...mergeProps(
|
|
558
|
-
themeProps(
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
559
|
+
themeProps(
|
|
560
|
+
'text-area',
|
|
561
|
+
{
|
|
562
|
+
size,
|
|
563
|
+
status: status?.type ?? null,
|
|
564
|
+
disabled: isDisabled ? 'disabled' : null,
|
|
565
|
+
readonly: isReadOnly ? 'readonly' : null,
|
|
566
|
+
},
|
|
567
|
+
// `textarea` ran the compound name together; themes styling it
|
|
568
|
+
// keep working until the next major.
|
|
569
|
+
{legacyNames: ['textarea']},
|
|
570
|
+
),
|
|
564
571
|
stylex.props(
|
|
565
572
|
inputWrapperStyles.base,
|
|
566
573
|
styles.wrapper,
|
|
@@ -580,7 +587,7 @@ export function TextArea({
|
|
|
580
587
|
)}
|
|
581
588
|
<textarea
|
|
582
589
|
{...rest}
|
|
583
|
-
ref={
|
|
590
|
+
ref={useMergedRefs(ref, textareaRef)}
|
|
584
591
|
id={id}
|
|
585
592
|
name={isDisabled ? undefined : htmlName}
|
|
586
593
|
value={optimisticValue}
|
|
@@ -608,19 +615,22 @@ export function TextArea({
|
|
|
608
615
|
: undefined
|
|
609
616
|
}
|
|
610
617
|
aria-busy={isBusy || undefined}
|
|
611
|
-
{...
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
618
|
+
{...mergeProps(
|
|
619
|
+
themeProps('text-area-control'),
|
|
620
|
+
stylex.props(
|
|
621
|
+
styles.textarea,
|
|
622
|
+
textareaSizeStyles[size],
|
|
623
|
+
isDisabled && styles.textareaDisabled,
|
|
624
|
+
Boolean(startIcon) && styles.textareaWithStartIcon,
|
|
625
|
+
// Reserve trailing space only when the end slot actually renders
|
|
626
|
+
// something (spinner or on-field status icon). The `detached`
|
|
627
|
+
// status variant suppresses the on-field icon — its glyph lives
|
|
628
|
+
// in the message box below — so reserving here would inset the
|
|
629
|
+
// text for an icon that never appears.
|
|
630
|
+
(isBusy || statusIcon != null) && styles.textareaWithStatus,
|
|
631
|
+
isBusy && statusIcon != null && styles.textareaWithBusyStatus,
|
|
632
|
+
maxLength != null && styles.textareaWithCounter,
|
|
633
|
+
),
|
|
624
634
|
)}
|
|
625
635
|
/>
|
|
626
636
|
{(isBusy || statusIcon) && (
|
|
@@ -632,9 +642,12 @@ export function TextArea({
|
|
|
632
642
|
{maxLength != null && (
|
|
633
643
|
<div
|
|
634
644
|
id={counterID}
|
|
635
|
-
{...
|
|
636
|
-
|
|
637
|
-
|
|
645
|
+
{...mergeProps(
|
|
646
|
+
themeProps('text-area-counter'),
|
|
647
|
+
stylex.props(
|
|
648
|
+
styles.counter,
|
|
649
|
+
valueLength > maxLength && styles.counterError,
|
|
650
|
+
),
|
|
638
651
|
)}>
|
|
639
652
|
{valueLength > maxLength && (
|
|
640
653
|
// Non-color cue so the over-limit state isn't conveyed by the red
|
|
@@ -71,6 +71,16 @@ export const docs = {
|
|
|
71
71
|
'Displays a "Required" indicator next to the label and sets aria-required. Mutually exclusive with isOptional.',
|
|
72
72
|
default: 'false',
|
|
73
73
|
},
|
|
74
|
+
{
|
|
75
|
+
name: 'onEnter',
|
|
76
|
+
type: '() => void',
|
|
77
|
+
description: 'Callback fired when the user presses the Enter key.',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'onKeyDown',
|
|
81
|
+
type: '(e: KeyboardEvent<HTMLInputElement>) => void',
|
|
82
|
+
description: 'Callback fired on keydown events on the input.',
|
|
83
|
+
},
|
|
74
84
|
{
|
|
75
85
|
name: 'isDisabled',
|
|
76
86
|
type: 'boolean',
|
|
@@ -97,7 +97,7 @@ export type {
|
|
|
97
97
|
InputStatus as TextInputStatus,
|
|
98
98
|
InputStatusType as TextInputStatusType,
|
|
99
99
|
} from '../Field';
|
|
100
|
-
import {mergeProps
|
|
100
|
+
import {mergeProps} from '../utils';
|
|
101
101
|
import {useSize} from '../SizeContext/SizeContext';
|
|
102
102
|
import {useInputContainer} from '../hooks/useInputContainer';
|
|
103
103
|
import {useInputStatusIcon} from '../hooks/useInputStatusIcon';
|
|
@@ -108,6 +108,7 @@ import type {SizeValue} from '../utils/types';
|
|
|
108
108
|
import {themeProps} from '../utils/themeProps';
|
|
109
109
|
import {useTranslator} from '../i18n';
|
|
110
110
|
|
|
111
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
111
112
|
export type TextInputType = 'text' | 'password' | 'email';
|
|
112
113
|
|
|
113
114
|
export interface TextInputProps extends Omit<
|
|
@@ -421,7 +422,7 @@ export function TextInput({
|
|
|
421
422
|
{inputGroup && <VisuallyHidden id={inputLabelID}>{label}</VisuallyHidden>}
|
|
422
423
|
<input
|
|
423
424
|
{...rest}
|
|
424
|
-
ref={
|
|
425
|
+
ref={useMergedRefs(ref, inputRef)}
|
|
425
426
|
id={id}
|
|
426
427
|
name={isDisabled ? undefined : htmlName}
|
|
427
428
|
type={type}
|
|
@@ -78,7 +78,7 @@ export const docs = {
|
|
|
78
78
|
{className: 'astryx-thumbnail'},
|
|
79
79
|
],
|
|
80
80
|
vars: [
|
|
81
|
-
{name: '--_thumbnail-hit-inset', description: 'Outset of the remove button\
|
|
81
|
+
{name: '--_thumbnail-hit-inset', description: 'Outset of the remove button\'s invisible hit area, applied to a ::after overlay. 0 on a fine pointer; negative on a coarse one, which grows the 20px button to the 24px touch target without changing what is drawn.', default: '0px', private: true},
|
|
82
82
|
],
|
|
83
83
|
},
|
|
84
84
|
usage: {
|
|
@@ -58,7 +58,6 @@ import {
|
|
|
58
58
|
isImeKeyEvent,
|
|
59
59
|
isTimeInRange,
|
|
60
60
|
mergeProps,
|
|
61
|
-
mergeRefs,
|
|
62
61
|
getInputARIA,
|
|
63
62
|
} from '../utils';
|
|
64
63
|
import type {BaseProps} from '../BaseProps';
|
|
@@ -74,6 +73,7 @@ import {useTooltip} from '../Tooltip';
|
|
|
74
73
|
import {themeProps} from '../utils/themeProps';
|
|
75
74
|
import {useTranslator} from '../i18n';
|
|
76
75
|
|
|
76
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
77
77
|
const styles = stylex.create({
|
|
78
78
|
icon: {
|
|
79
79
|
display: 'flex',
|
|
@@ -648,7 +648,7 @@ export function TimeInput({
|
|
|
648
648
|
</VisuallyHidden>
|
|
649
649
|
)}
|
|
650
650
|
<input
|
|
651
|
-
ref={
|
|
651
|
+
ref={useMergedRefs(ref, inputRef)}
|
|
652
652
|
id={id}
|
|
653
653
|
type="text"
|
|
654
654
|
value={displayValue}
|
|
@@ -673,6 +673,24 @@ describe('Timestamp', () => {
|
|
|
673
673
|
expect(screen.getByTestId('ts')).toHaveAttribute('tabindex', '0');
|
|
674
674
|
});
|
|
675
675
|
|
|
676
|
+
it('does not put aria-expanded on the role-less hover-card trigger', async () => {
|
|
677
|
+
render(
|
|
678
|
+
<Timestamp
|
|
679
|
+
value={Date.now() / 1000 - 3600}
|
|
680
|
+
format="relative"
|
|
681
|
+
data-testid="ts"
|
|
682
|
+
/>,
|
|
683
|
+
);
|
|
684
|
+
const trigger = screen.getByTestId('ts').parentElement;
|
|
685
|
+
// The trigger is Text's <span>, which has no role, so aria-expanded is
|
|
686
|
+
// invalid on it (axe aria-allowed-attr, critical). aria-haspopup is
|
|
687
|
+
// global and still advertises the dialog.
|
|
688
|
+
await waitFor(() => {
|
|
689
|
+
expect(trigger).toHaveAttribute('aria-haspopup', 'dialog');
|
|
690
|
+
});
|
|
691
|
+
expect(trigger).not.toHaveAttribute('aria-expanded');
|
|
692
|
+
});
|
|
693
|
+
|
|
676
694
|
it('shows the hover card when the timestamp receives keyboard focus', async () => {
|
|
677
695
|
const user = userEvent.setup();
|
|
678
696
|
render(
|
|
@@ -1305,3 +1323,43 @@ describe('Timestamp', () => {
|
|
|
1305
1323
|
});
|
|
1306
1324
|
});
|
|
1307
1325
|
});
|
|
1326
|
+
|
|
1327
|
+
describe('Timestamp pass-through props', () => {
|
|
1328
|
+
it('forwards pass-through props to the time element', () => {
|
|
1329
|
+
render(
|
|
1330
|
+
<Timestamp
|
|
1331
|
+
value="2024-01-15T10:30:00Z"
|
|
1332
|
+
format="date_time"
|
|
1333
|
+
aria-label="Published"
|
|
1334
|
+
id="published-at"
|
|
1335
|
+
data-source="cms"
|
|
1336
|
+
data-testid="stamp"
|
|
1337
|
+
/>,
|
|
1338
|
+
);
|
|
1339
|
+
const time = screen.getByTestId('stamp');
|
|
1340
|
+
expect(time.tagName).toBe('TIME');
|
|
1341
|
+
expect(time).toHaveAttribute('aria-label', 'Published');
|
|
1342
|
+
expect(time).toHaveAttribute('id', 'published-at');
|
|
1343
|
+
expect(time).toHaveAttribute('data-source', 'cms');
|
|
1344
|
+
});
|
|
1345
|
+
|
|
1346
|
+
it('keeps its own spelled-out label on a relative timestamp', () => {
|
|
1347
|
+
render(
|
|
1348
|
+
<Timestamp
|
|
1349
|
+
value={Date.now()}
|
|
1350
|
+
format="relative"
|
|
1351
|
+
aria-label="Caller label"
|
|
1352
|
+
data-source="cms"
|
|
1353
|
+
data-testid="stamp"
|
|
1354
|
+
/>,
|
|
1355
|
+
);
|
|
1356
|
+
const stamp = screen.getByTestId('stamp');
|
|
1357
|
+
expect({
|
|
1358
|
+
ariaLabel: stamp.getAttribute('aria-label'),
|
|
1359
|
+
dataSource: stamp.getAttribute('data-source'),
|
|
1360
|
+
}).toEqual({
|
|
1361
|
+
ariaLabel: expect.not.stringMatching(/^Caller label$/),
|
|
1362
|
+
dataSource: 'cms',
|
|
1363
|
+
});
|
|
1364
|
+
});
|
|
1365
|
+
});
|
|
@@ -20,7 +20,7 @@ import {lazy, Suspense, useEffect, useRef, useState} from 'react';
|
|
|
20
20
|
import * as stylex from '@stylexjs/stylex';
|
|
21
21
|
import {Text} from '../Text';
|
|
22
22
|
import type {TextType, TextSize, TextColor, TextWeight} from '../theme/types';
|
|
23
|
-
import {mergeProps
|
|
23
|
+
import {mergeProps} from '../utils';
|
|
24
24
|
import {useDevWarning} from '../hooks/useDevWarning';
|
|
25
25
|
import {useTranslator} from '../i18n';
|
|
26
26
|
import {useLocale} from '../i18n/useLocale';
|
|
@@ -33,6 +33,7 @@ import type {
|
|
|
33
33
|
TimestampTooltipLine,
|
|
34
34
|
} from './tooltipEntries';
|
|
35
35
|
|
|
36
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
36
37
|
// Load the overlay lazily so a card-less Timestamp — the default — never
|
|
37
38
|
// bundles HoverCard or the copy affordance's Icon/IconButton. Mirrors the code
|
|
38
39
|
// split the read-only Tooltip path used before it.
|
|
@@ -418,10 +419,12 @@ export function Timestamp({
|
|
|
418
419
|
style,
|
|
419
420
|
ref,
|
|
420
421
|
'data-testid': testId,
|
|
422
|
+
...rest
|
|
421
423
|
}: TimestampProps) {
|
|
422
424
|
const t = useTranslator();
|
|
423
425
|
const locale = useLocale();
|
|
424
426
|
const timeRef = useRef<HTMLTimeElement>(null);
|
|
427
|
+
const mergedTimeRef = useMergedRefs(ref, timeRef);
|
|
425
428
|
const [now, setNow] = useState(() => new Date());
|
|
426
429
|
|
|
427
430
|
const date = parseValue(value);
|
|
@@ -526,17 +529,18 @@ export function Timestamp({
|
|
|
526
529
|
xstyle={xstyle}
|
|
527
530
|
{...timestampProps}>
|
|
528
531
|
<time
|
|
529
|
-
ref={
|
|
532
|
+
ref={mergedTimeRef}
|
|
530
533
|
dateTime={isoString}
|
|
534
|
+
data-testid={testId}
|
|
535
|
+
{...stylex.props(styles.time)}
|
|
536
|
+
{...rest}
|
|
531
537
|
// `ariaLabelText` is '' only for an invalid date, which bails out
|
|
532
538
|
// before rendering — but keep the guard local: an empty aria-label
|
|
533
539
|
// must be omitted entirely (not rendered as aria-label="") so AT
|
|
534
540
|
// falls back to reading the visible <time> content.
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
: undefined
|
|
539
|
-
}
|
|
541
|
+
{...(isRelativeFormat(effectiveFormat) && ariaLabelText !== ''
|
|
542
|
+
? {'aria-label': ariaLabelText}
|
|
543
|
+
: {})}
|
|
540
544
|
// The hover card is anchored here with focusTrigger="always", which
|
|
541
545
|
// attaches focus listeners but does not itself make the anchor
|
|
542
546
|
// focusable. A bare <time> is not focusable, so without a tab stop
|
|
@@ -545,9 +549,7 @@ export function Timestamp({
|
|
|
545
549
|
// gratuitous tab stops otherwise. The card carries its own
|
|
546
550
|
// dashed-underline hover indication as the affordance, so the anchor
|
|
547
551
|
// needs no separate focus outline.
|
|
548
|
-
|
|
549
|
-
data-testid={testId}
|
|
550
|
-
{...stylex.props(styles.time)}>
|
|
552
|
+
{...(showTooltip ? {tabIndex: 0} : {})}>
|
|
551
553
|
{displayText}
|
|
552
554
|
</time>
|
|
553
555
|
</Text>
|
package/src/Toast/Toast.doc.mjs
CHANGED
|
@@ -32,13 +32,13 @@ export const docs = {
|
|
|
32
32
|
{
|
|
33
33
|
name: 'autoHideDuration',
|
|
34
34
|
type: 'number',
|
|
35
|
-
description: 'Duration in ms before auto-dismiss.',
|
|
35
|
+
description: 'Duration in ms before auto-dismiss. Timed content must satisfy WCAG 2.2.1.',
|
|
36
36
|
default: '5000',
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
name: 'endContent',
|
|
40
40
|
type: 'ReactNode',
|
|
41
|
-
description: 'Content rendered at the trailing end (e.g. Undo button, link).',
|
|
41
|
+
description: 'Content rendered at the trailing end (e.g. Undo button, link). Keep action labels short.',
|
|
42
42
|
slotElements: [
|
|
43
43
|
{__element: 'Icon', props: {icon: 'chevronDown', size: 'sm'}},
|
|
44
44
|
{__element: 'Badge', props: {label: '3'}},
|
|
@@ -60,18 +60,32 @@ export const docs = {
|
|
|
60
60
|
type: '(reason: "auto" | "manual") => void',
|
|
61
61
|
description: 'Callback fired when the toast is removed.',
|
|
62
62
|
},
|
|
63
|
+
{
|
|
64
|
+
name: 'onDismiss',
|
|
65
|
+
type: '(reason: "auto" | "manual") => void',
|
|
66
|
+
description: 'Callback fired when the toast is dismissed.',
|
|
67
|
+
required: true,
|
|
68
|
+
},
|
|
63
69
|
], theming: {
|
|
64
70
|
targets: [
|
|
65
71
|
{className: 'astryx-toast', visualProps: ['type']},
|
|
66
72
|
],
|
|
73
|
+
vars: [
|
|
74
|
+
{
|
|
75
|
+
name: '--_toast-slide-y',
|
|
76
|
+
description: 'Private block-axis offset inherited from ToastViewport for entry and exit motion',
|
|
77
|
+
default: 'var(--spacing-2)',
|
|
78
|
+
private: true,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
67
81
|
},
|
|
68
82
|
|
|
69
83
|
usage: {
|
|
70
84
|
description:
|
|
71
|
-
'Toast shows a brief, non-blocking notification to confirm an action or present temporary information. Use it for scenarios where the user needs feedback but not a decision, such as saving, deleting, or changing a status.\n\nFor production use, prefer the `useToast()` hook; it handles positioning, stacking, auto-dismiss, and deduplication via `ToastViewport`. The `Toast` component renders the visual toast element inline and is useful for previews, documentation, and static showcases where the viewport lifecycle is not needed.',
|
|
85
|
+
'Toast shows a brief, non-blocking notification to confirm an action or present temporary information. Use it for scenarios where the user needs feedback but not a decision, such as saving, deleting, or changing a status.\n\nFor production use, prefer the `useToast()` hook; it handles positioning, stacking, auto-dismiss, and deduplication via `ToastViewport`. Toasts stay within viewport and safe-area gutters, wrap long message content, and enter or exit toward their configured top or bottom edge. Set `isAutoHide: false` explicitly when an action or message must remain available. The `Toast` component renders the visual toast element inline and is useful for previews, documentation, and static showcases where the viewport lifecycle is not needed.',
|
|
72
86
|
bestPractices: [
|
|
73
87
|
{guidance: true, description: 'Keep messages short: only a few words that tell the user what happened, like "Changes saved" or "Message sent".'},
|
|
74
|
-
{guidance: true, description: 'Add
|
|
88
|
+
{guidance: true, description: 'Add a short undo action in the endContent slot for reversible operations. Set isAutoHide to false when the action must remain available.'},
|
|
75
89
|
{guidance: true, description: 'Use uniqueID to deduplicate toasts that fire from repeated actions, like clicking a save button multiple times.'},
|
|
76
90
|
{guidance: true, description: 'Use error type for failures that need attention but not immediate action; it persists until dismissed so the user won\'t miss it.'},
|
|
77
91
|
{guidance: false, description: 'Don\'t use a toast for critical errors that block the user. Use Banner for persistent, in-context messaging that requires acknowledgment.'},
|
|
@@ -98,18 +112,18 @@ export const docsZh = {
|
|
|
98
112
|
body: '主要消息内容。',
|
|
99
113
|
type: 'Toast 类型,控制背景颜色。error toast 持续显示直到关闭。',
|
|
100
114
|
isAutoHide: '是否自动关闭。info 默认为 true,error 默认为 false。',
|
|
101
|
-
autoHideDuration: '
|
|
102
|
-
endContent: '
|
|
115
|
+
autoHideDuration: '自动关闭前的持续时间(毫秒)。定时内容必须符合 WCAG 2.2.1。',
|
|
116
|
+
endContent: '尾部渲染的内容(如撤销按钮、链接)。操作标签应保持简短。',
|
|
103
117
|
uniqueID: '用于去重的唯一标识符。',
|
|
104
118
|
collisionBehavior: '当已存在相同 uniqueID 的 toast 时的行为。',
|
|
105
119
|
onHide: '当 toast 被移除时触发的回调。',
|
|
106
120
|
},
|
|
107
121
|
usage: {
|
|
108
122
|
description:
|
|
109
|
-
'Toast 显示简短的非阻塞通知,用于确认操作或呈现临时信息。适用于用户需要反馈但不需要做决定的场景,如保存、删除或状态变更。\n\n生产环境中推荐使用 `useToast()` hook,它通过 `ToastViewport`
|
|
123
|
+
'Toast 显示简短的非阻塞通知,用于确认操作或呈现临时信息。适用于用户需要反馈但不需要做决定的场景,如保存、删除或状态变更。\n\n生产环境中推荐使用 `useToast()` hook,它通过 `ToastViewport` 处理定位、堆叠、自动关闭和去重。Toast 会保持在视口和安全区域边距内,较长的消息会换行,并根据配置的顶部或底部边缘进入或退出。当操作或消息必须持续可用时,请显式设置 `isAutoHide: false`。`Toast` 组件以内联方式渲染 toast 视觉元素,适用于不需要视口生命周期的预览、文档和静态展示。',
|
|
110
124
|
bestPractices: [
|
|
111
125
|
{guidance: true, description: '保持消息简短,只需几个词告诉用户发生了什么,如"更改已保存"或"消息已发送"。'},
|
|
112
|
-
{guidance: true, description: '在 endContent
|
|
126
|
+
{guidance: true, description: '在 endContent 插槽中添加简短的撤销操作,用于可逆操作。当操作必须持续可用时,将 isAutoHide 设置为 false。'},
|
|
113
127
|
{guidance: true, description: '使用 uniqueID 去重重复操作触发的 toast,如多次点击保存按钮。'},
|
|
114
128
|
{guidance: true, description: '对需要关注但不需要立即操作的错误使用 error 类型,它会持续显示直到关闭。'},
|
|
115
129
|
{guidance: false, description: '不要对阻塞用户的严重错误使用 toast,使用 Banner 进行持久的上下文消息传递。'},
|
|
@@ -130,10 +144,10 @@ export const docsDense = {
|
|
|
130
144
|
'toast notification w/ auto-dismiss, stacking, dedup, smooth animations; MediaTheme inverted surface',
|
|
131
145
|
usage: {
|
|
132
146
|
description:
|
|
133
|
-
'Brief non-blocking notification for action confirmations and temporary info. Use where user needs feedback not decisions: saves, deletes, status changes. useToast() hook for production (positioning, stacking, auto-dismiss, dedup via ToastViewport). Toast renders inline for previews/docs/static showcases.',
|
|
147
|
+
'Brief non-blocking notification for action confirmations and temporary info. Use where user needs feedback not decisions: saves, deletes, status changes. useToast() hook for production (safe-area positioning, responsive message wrapping, stacking, auto-dismiss, dedup via ToastViewport). Set isAutoHide false explicitly for must-remain actions/messages. Toast renders inline for previews/docs/static showcases.',
|
|
134
148
|
bestPractices: [
|
|
135
149
|
{guidance: true, description: 'Short messages, a few words: "Changes saved", "Message sent".'},
|
|
136
|
-
{guidance: true, description: 'Undo action in endContent for reversible ops
|
|
150
|
+
{guidance: true, description: 'Short Undo action in endContent for reversible ops; set isAutoHide false when it must remain available.'},
|
|
137
151
|
{guidance: true, description: 'uniqueID to dedup repeated action toasts.'},
|
|
138
152
|
{guidance: true, description: 'Error type for failures needing attention; persists until dismissed.'},
|
|
139
153
|
{guidance: false, description: 'Don\'t use for critical blocking errors. Use Banner for persistent in-context messaging.'},
|
|
@@ -145,8 +159,8 @@ export const docsDense = {
|
|
|
145
159
|
body: 'primary message content',
|
|
146
160
|
type: 'toast type; controls bg color; error persists until dismissed',
|
|
147
161
|
isAutoHide: 'auto-dismiss; true for info, false for error',
|
|
148
|
-
autoHideDuration: 'ms before auto-dismiss',
|
|
149
|
-
endContent: 'trailing end content (undo btn, link)',
|
|
162
|
+
autoHideDuration: 'ms before auto-dismiss; timed content must satisfy WCAG 2.2.1',
|
|
163
|
+
endContent: 'trailing end content (undo btn, link); keep action labels short',
|
|
150
164
|
uniqueID: 'unique id for dedup',
|
|
151
165
|
collisionBehavior: 'behavior when matching uniqueID exists',
|
|
152
166
|
onHide: 'callback when toast removed',
|
package/src/Toast/Toast.tsx
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
'use client';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @file Toast.tsx
|
|
7
|
+
* @input Uses React timers, Toast options, Button/Icon, MediaTheme, tokens, and
|
|
8
|
+
* placement-derived motion variables inherited from ToastViewport
|
|
9
|
+
* @output Exports the rendered Toast surface and its pause/dismiss behavior
|
|
10
|
+
* @position Core implementation; rendered by ToastViewport and documented by Toast.doc.mjs
|
|
11
|
+
*
|
|
12
|
+
* SYNC: When Toast layout, timer pause, media theme, or dismissal behavior changes,
|
|
13
|
+
* update these files to stay in sync:
|
|
14
|
+
* - /packages/core/src/Toast/ToastViewport.test.tsx
|
|
15
|
+
* - /packages/core/src/Toast/Toast.doc.mjs
|
|
16
|
+
* - /apps/storybook/stories/Toast.stories.tsx
|
|
17
|
+
* - /packages/cli/assets/templates/blocks/components/Toast/ (showcase blocks)
|
|
18
|
+
*/
|
|
19
|
+
|
|
5
20
|
import {useCallback, useEffect, useRef} from 'react';
|
|
6
21
|
import type {ReactNode} from 'react';
|
|
7
22
|
import * as stylex from '@stylexjs/stylex';
|
|
@@ -24,13 +39,15 @@ import type {ToastType, ToastDismissReason} from './types';
|
|
|
24
39
|
import {themeProps} from '../utils/themeProps';
|
|
25
40
|
import {useTranslator} from '../i18n';
|
|
26
41
|
|
|
42
|
+
const TOAST_EDGE_DRIFT = spacingVars['--spacing-2'];
|
|
27
43
|
const styles = stylex.create({
|
|
28
44
|
root: {
|
|
29
45
|
paddingBlock: spacingVars['--spacing-4'],
|
|
30
46
|
paddingInline: spacingVars['--spacing-4'],
|
|
31
47
|
borderRadius: radiusVars['--radius-container'],
|
|
48
|
+
boxSizing: 'border-box',
|
|
32
49
|
width: 400,
|
|
33
|
-
maxWidth: '
|
|
50
|
+
maxWidth: '100%',
|
|
34
51
|
boxShadow: shadowVars['--shadow-med'],
|
|
35
52
|
opacity: 1,
|
|
36
53
|
fontFamily: typographyVars['--font-family-body'],
|
|
@@ -45,15 +62,17 @@ const styles = stylex.create({
|
|
|
45
62
|
transitionTimingFunction: easeVars['--ease-standard'],
|
|
46
63
|
'@starting-style': {
|
|
47
64
|
opacity: 0,
|
|
48
|
-
transform:
|
|
65
|
+
transform: `translateY(var(--_toast-slide-y, ${TOAST_EDGE_DRIFT}))`,
|
|
49
66
|
},
|
|
50
67
|
},
|
|
51
68
|
variantDefault: {
|
|
52
69
|
backgroundColor: colorVars['--color-background-inverted'],
|
|
53
70
|
},
|
|
71
|
+
|
|
54
72
|
inner: {
|
|
55
73
|
display: 'flex',
|
|
56
74
|
alignItems: 'flex-start',
|
|
75
|
+
flexWrap: 'nowrap',
|
|
57
76
|
gap: spacingVars['--spacing-3'],
|
|
58
77
|
width: '100%',
|
|
59
78
|
},
|
|
@@ -63,17 +82,22 @@ const styles = stylex.create({
|
|
|
63
82
|
content: {
|
|
64
83
|
flex: 1,
|
|
65
84
|
minWidth: 0,
|
|
85
|
+
overflowWrap: 'anywhere',
|
|
66
86
|
},
|
|
67
87
|
exiting: {
|
|
68
88
|
opacity: 0,
|
|
69
|
-
transform:
|
|
89
|
+
transform: `translateY(var(--_toast-slide-y, ${TOAST_EDGE_DRIFT}))`,
|
|
70
90
|
},
|
|
71
91
|
endContent: {
|
|
72
92
|
flexShrink: 0,
|
|
73
93
|
display: 'flex',
|
|
74
94
|
alignItems: 'center',
|
|
75
95
|
gap: spacingVars['--spacing-2'],
|
|
76
|
-
|
|
96
|
+
// Keep every trailing control centered on the first 20px body line, even
|
|
97
|
+
// when the body wraps or a consumer supplies a control taller than the
|
|
98
|
+
// built-in 28px dismiss button. The action label should still stay short;
|
|
99
|
+
// the wrappers above let it break rather than widen the Toast.
|
|
100
|
+
blockSize: `calc(${typeScaleDefaults['--text-body-size']} * ${typeScaleDefaults['--text-body-leading']})`,
|
|
77
101
|
marginInlineEnd: `calc(${spacingVars['--spacing-1']} * -1)`,
|
|
78
102
|
},
|
|
79
103
|
});
|