@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
|
@@ -0,0 +1,1045 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
'use client';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @file Step.tsx
|
|
7
|
+
* @input Uses React, stylex, theme tokens (including the motion duration token
|
|
8
|
+
* the connector fill animates on), StepperContext
|
|
9
|
+
* @output Exports Step component and StepProps
|
|
10
|
+
* @position Individual step item; used inside Stepper
|
|
11
|
+
*
|
|
12
|
+
* Every connector this file draws — the separated progress bars and the
|
|
13
|
+
* on-track segments alike — paints its accent fill as a scaled ::before rather
|
|
14
|
+
* than by swapping a background color, so a step the flow advances into grows
|
|
15
|
+
* its line along the track. See the CONNECTOR FILL block in the styles below
|
|
16
|
+
* for the axis/RTL/reduced-motion rules that go with it.
|
|
17
|
+
*
|
|
18
|
+
* Exactly one change animates: advancing a single step. Going back, jumping
|
|
19
|
+
* forward by more than one, and mounting mid-flow all land at once. The rule
|
|
20
|
+
* and the reasoning behind it sit above the styles; the arithmetic that keeps
|
|
21
|
+
* the one animated span reading as a single front — an on-track span is drawn
|
|
22
|
+
* by two steps, three where a content slot splits it — is in the component.
|
|
23
|
+
* Nothing about it is public API: Stepper hands each Step the step it came
|
|
24
|
+
* from through context, and the rest is derived.
|
|
25
|
+
*
|
|
26
|
+
* SYNC: When modified, update these files to stay in sync:
|
|
27
|
+
* - /packages/core/src/Stepper/Stepper.doc.mjs
|
|
28
|
+
* - /packages/core/src/Stepper/Stepper.test.tsx
|
|
29
|
+
* - /packages/core/src/Stepper/index.ts
|
|
30
|
+
* - /apps/storybook/stories/Stepper.stories.tsx
|
|
31
|
+
* - /packages/cli/assets/templates/blocks/components/Stepper/ (showcase blocks)
|
|
32
|
+
* - /packages/cli/assets/templates/blocks/components/Step/ (showcase blocks)
|
|
33
|
+
*/
|
|
34
|
+
import { useEffect } from 'react';
|
|
35
|
+
import * as stylex from '@stylexjs/stylex';
|
|
36
|
+
import "../theme/tokens.stylex.js";
|
|
37
|
+
import { colorVars, spacingVars, radiusVars, fontWeightVars, typeScaleVars, textSizeVars, durationVars, easeVars } from "../theme/tokens.stylex.js";
|
|
38
|
+
import { focusOutlineStyles, mergeProps, isRenderable, themeProps } from "../utils/index.js";
|
|
39
|
+
import { Icon } from "../Icon/index.js";
|
|
40
|
+
import { VisuallyHidden } from "../VisuallyHidden/index.js";
|
|
41
|
+
import { useTranslator } from "../i18n/index.js";
|
|
42
|
+
import { useStepperContext } from "./StepperContext.js";
|
|
43
|
+
import "./stepper.stylex.js";
|
|
44
|
+
import { stepMarker } from "./stepper.stylex.js";
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Built-in indicator presets. Anything other than these strings passed to
|
|
48
|
+
* `indicator` is treated as a custom ReactNode (e.g. an `<Icon />`).
|
|
49
|
+
* - 'auto': numbered badge for not-yet-reached steps, a check once completed
|
|
50
|
+
* (default)
|
|
51
|
+
* - 'number': always a numbered badge
|
|
52
|
+
* - 'none': no indicator — just the progress bar and label
|
|
53
|
+
*/
|
|
54
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
55
|
+
// --- Default progress icons (16px) ---
|
|
56
|
+
//
|
|
57
|
+
// The `completed` progress state and the current-step ring are drawn as local
|
|
58
|
+
// <svg> glyphs rather than sourced from the Icon registry. This is a deliberate
|
|
59
|
+
// exception to the "glyphs come from the registry" convention (audit rule T17),
|
|
60
|
+
// for two reasons:
|
|
61
|
+
//
|
|
62
|
+
// 1. `CurrentIcon` (a dot inside a ring) has no registry equivalent — it is a
|
|
63
|
+
// progress affordance, not a general-purpose icon.
|
|
64
|
+
// 2. `CheckCircleIcon` (a filled circle with a check) is intentionally NOT the
|
|
65
|
+
// registry `success` glyph, even though the two look similar. They mean
|
|
66
|
+
// different things and must stay independently restyleable: `completed`
|
|
67
|
+
// marks *progress through the sequence* (every step you've passed), while
|
|
68
|
+
// the semantic `success` status marks a step's *outcome*. A stepper can
|
|
69
|
+
// show a completed step that also carries a `warning`/`error` status, so
|
|
70
|
+
// collapsing the two glyphs would conflate progress with outcome. The
|
|
71
|
+
// semantic `success`/`warning`/`error` STATUS glyphs DO defer to the themed
|
|
72
|
+
// registry (see the status branch below), so those share one visual
|
|
73
|
+
// language; only the progress marks are local.
|
|
74
|
+
//
|
|
75
|
+
// Both glyphs paint via `currentColor`, so the indicator's color is still
|
|
76
|
+
// controlled by tokens on the wrapper (never hardcoded), and the wrapper
|
|
77
|
+
// carries the `astryx-step-indicator` theme target.
|
|
78
|
+
|
|
79
|
+
/** Filled circle with a check — shown for a completed step in 'auto' mode. */
|
|
80
|
+
function CheckCircleIcon() {
|
|
81
|
+
return /*#__PURE__*/_jsxs("svg", {
|
|
82
|
+
width: "16",
|
|
83
|
+
height: "16",
|
|
84
|
+
viewBox: "0 0 16 16",
|
|
85
|
+
fill: "none",
|
|
86
|
+
children: [/*#__PURE__*/_jsx("circle", {
|
|
87
|
+
cx: "8",
|
|
88
|
+
cy: "8",
|
|
89
|
+
r: "8",
|
|
90
|
+
fill: "currentColor"
|
|
91
|
+
}), /*#__PURE__*/_jsx("path", {
|
|
92
|
+
d: "M4.75 8.25 7 10.5l4.25-4.5",
|
|
93
|
+
stroke: colorVars['--color-background-surface'],
|
|
94
|
+
strokeWidth: "1.75",
|
|
95
|
+
strokeLinecap: "round",
|
|
96
|
+
strokeLinejoin: "round"
|
|
97
|
+
})]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Filled dot in a ring — shown for the active step in 'auto' mode. */
|
|
102
|
+
function CurrentIcon() {
|
|
103
|
+
return /*#__PURE__*/_jsxs("svg", {
|
|
104
|
+
width: "16",
|
|
105
|
+
height: "16",
|
|
106
|
+
viewBox: "0 0 16 16",
|
|
107
|
+
fill: "none",
|
|
108
|
+
children: [/*#__PURE__*/_jsx("circle", {
|
|
109
|
+
cx: "8",
|
|
110
|
+
cy: "8",
|
|
111
|
+
r: "7",
|
|
112
|
+
stroke: "currentColor",
|
|
113
|
+
strokeWidth: "2"
|
|
114
|
+
}), /*#__PURE__*/_jsx("circle", {
|
|
115
|
+
cx: "8",
|
|
116
|
+
cy: "8",
|
|
117
|
+
r: "4",
|
|
118
|
+
fill: "currentColor"
|
|
119
|
+
})]
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// --- Styles ---
|
|
124
|
+
|
|
125
|
+
const BAR_WIDTH = spacingVars['--spacing-1'];
|
|
126
|
+
// Every indicator — check, ring, custom icon, number badge — occupies the same
|
|
127
|
+
// box, so the `auto` mode swapping a number for a check as a step completes
|
|
128
|
+
// never nudges the label or the track.
|
|
129
|
+
const INDICATOR_SIZE = spacingVars['--spacing-4'];
|
|
130
|
+
// Indicator (16px) + the label-row gap (8px). The indent that lines a
|
|
131
|
+
// description or a content slot up with the label above it.
|
|
132
|
+
const INDICATOR_GUTTER = spacingVars['--spacing-6'];
|
|
133
|
+
|
|
134
|
+
// --- Connector fill motion ---
|
|
135
|
+
//
|
|
136
|
+
// One change animates: advancing exactly one step. Going back, jumping
|
|
137
|
+
// forward by more than one, and mounting mid-flow all apply at once.
|
|
138
|
+
//
|
|
139
|
+
// Animating the others was tried and read worse than not animating them. A
|
|
140
|
+
// retreat is the clearest case: run forward, the transition ends with a bar
|
|
141
|
+
// that is nearly full, and nearly full is indistinguishable from full, so the
|
|
142
|
+
// eye calls it arrived well before it settles. Run backward, the same curve
|
|
143
|
+
// ends with a shrinking stub of accent still on the track, and a remnant that
|
|
144
|
+
// is still there reads unmistakably as not finished. Identical arithmetic in
|
|
145
|
+
// both directions — measurably so — and the backward one still feels slow,
|
|
146
|
+
// because the tail is what is visible rather than what is hidden. No easing
|
|
147
|
+
// fixes that; only not animating it does. A multi-step jump fails differently:
|
|
148
|
+
// it is a navigation rather than a progression, and sweeping a front across
|
|
149
|
+
// four segments makes the user sit through a journey they asked to skip.
|
|
150
|
+
//
|
|
151
|
+
// What is left is the one gesture where the movement carries the meaning: the
|
|
152
|
+
// flow went forward one step, and the line grows to show it. That span takes
|
|
153
|
+
// the medium band — a fill crossing a whole segment is a spatial change, not a
|
|
154
|
+
// micro-interaction, so per `astryx docs motion` it sits above the fast band
|
|
155
|
+
// reserved for high-frequency states like hover.
|
|
156
|
+
const FILL_SPAN_TIME = durationVars['--duration-medium'];
|
|
157
|
+
|
|
158
|
+
// Share of one node-to-node span owned by the segment *arriving* at the far
|
|
159
|
+
// node; the segment leaving the near node takes the rest. On-track spans are
|
|
160
|
+
// drawn by two steps (see the ON-TRACK section), and the time has to be split
|
|
161
|
+
// the way the length is or the two halves sweep at visibly different speeds.
|
|
162
|
+
//
|
|
163
|
+
// Horizontal: both halves are `flex: 1` inside equal-width steps, so an even
|
|
164
|
+
// split is the proportional one.
|
|
165
|
+
//
|
|
166
|
+
// Vertical: the halves are nothing like equal, and no constant can be right
|
|
167
|
+
// for all of them. The arriving half is otSegLeadV, a cap fixed at one density
|
|
168
|
+
// space; the leaving half is otSegFlexV, grown to whatever is left of the step
|
|
169
|
+
// row, so its length turns on label and description lengths this file cannot
|
|
170
|
+
// see. Measured in the browser the cap is 40% of a plain balanced span (8 of
|
|
171
|
+
// 20px) but 21% once the step carries a description (8 of 38px). 0.3 is the
|
|
172
|
+
// value that minimises the worse of those two: it leaves the cap ~1.6x off the
|
|
173
|
+
// rail's speed either way, where tuning to one case puts the other past 2x.
|
|
174
|
+
// Matching each case exactly would mean measuring the rendered rail, a layout
|
|
175
|
+
// read this system avoids.
|
|
176
|
+
const OT_ARRIVAL_SHARE_H = 0.5;
|
|
177
|
+
const OT_ARRIVAL_SHARE_V = 0.3;
|
|
178
|
+
// A vertical step carrying a content slot draws a third segment down the side
|
|
179
|
+
// of it (otContentSegV) which continues the leaving half past the row, so the
|
|
180
|
+
// leaving half's time splits again. A slot runs several times the rail left
|
|
181
|
+
// above it — 34px of rail to 108px of slot in the spacious content story — and
|
|
182
|
+
// this is the middle of that range. Matching it exactly would mean measuring
|
|
183
|
+
// the rendered slot; the ordering is what keeps the front contiguous, and this
|
|
184
|
+
// keeps its speed in the right neighbourhood.
|
|
185
|
+
const OT_RAIL_SHARE_OF_LEAVING = 0.25;
|
|
186
|
+
|
|
187
|
+
/** Scale a CSS `<time>` by a unitless factor, collapsing the trivial cases. */
|
|
188
|
+
function fillTimeSlice(time, factor) {
|
|
189
|
+
if (factor <= 0) {
|
|
190
|
+
return '0s';
|
|
191
|
+
}
|
|
192
|
+
if (factor === 1) {
|
|
193
|
+
return time;
|
|
194
|
+
}
|
|
195
|
+
// Rounded because the factors are sums of shares, and float noise would
|
|
196
|
+
// otherwise reach the emitted custom property as `calc(... * 0.7000000001)`.
|
|
197
|
+
return `calc(${time} * ${Number(factor.toFixed(4))})`;
|
|
198
|
+
}
|
|
199
|
+
const _temp = {
|
|
200
|
+
kKXxxB: "x196sc62 " + "x13sdc92",
|
|
201
|
+
k5BDGz: "xizoc3 " + "xhhm9v0",
|
|
202
|
+
"$$css": true
|
|
203
|
+
};
|
|
204
|
+
const _temp2 = {
|
|
205
|
+
kZCmMZ: "xnvo3vl",
|
|
206
|
+
"$$css": true
|
|
207
|
+
};
|
|
208
|
+
const _temp3 = {
|
|
209
|
+
kVAEAm: "x10l6tqk",
|
|
210
|
+
kYYq5F: "x10no89f",
|
|
211
|
+
kLqNvP: "x1lxsm33",
|
|
212
|
+
kzqmXN: "xx9zwd3",
|
|
213
|
+
"$$css": true
|
|
214
|
+
};
|
|
215
|
+
const _temp4 = {
|
|
216
|
+
kqGvvJ: "x1oqu0vw",
|
|
217
|
+
"$$css": true
|
|
218
|
+
};
|
|
219
|
+
const _temp5 = {
|
|
220
|
+
keoZOQ: "x1vhfslr",
|
|
221
|
+
"$$css": true
|
|
222
|
+
};
|
|
223
|
+
const styles = {
|
|
224
|
+
verticalRoot: {
|
|
225
|
+
k1xSpc: "x78zum5",
|
|
226
|
+
kXwgrk: "x1q0g3np",
|
|
227
|
+
kGNEyG: "x1qjc9v5",
|
|
228
|
+
kVAEAm: "x1n2onr6",
|
|
229
|
+
kOIVth: "x1lsbc85",
|
|
230
|
+
$$css: true
|
|
231
|
+
},
|
|
232
|
+
verticalBar: {
|
|
233
|
+
kzqmXN: "xx9zwd3",
|
|
234
|
+
kaIpWk: "xjspbzw",
|
|
235
|
+
kmuXW: "x2lah0s",
|
|
236
|
+
kSGwAc: "xkh2ocl",
|
|
237
|
+
$$css: true
|
|
238
|
+
},
|
|
239
|
+
horizontalStep: {
|
|
240
|
+
k1xSpc: "x78zum5",
|
|
241
|
+
kXwgrk: "xdt5ytf",
|
|
242
|
+
kGNEyG: "x1qjc9v5",
|
|
243
|
+
kUk6DE: "x98rzlu",
|
|
244
|
+
k7Eaqz: "xeuugli",
|
|
245
|
+
$$css: true
|
|
246
|
+
},
|
|
247
|
+
horizontalBar: {
|
|
248
|
+
kzqmXN: "xh8yej3",
|
|
249
|
+
kZKoxP: "x11c6zpc",
|
|
250
|
+
kaIpWk: "xjspbzw",
|
|
251
|
+
kmuXW: "x2lah0s",
|
|
252
|
+
k1K539: "xlstkdb",
|
|
253
|
+
$$css: true
|
|
254
|
+
},
|
|
255
|
+
connectorTrack: {
|
|
256
|
+
kVAEAm: "x1n2onr6",
|
|
257
|
+
kWkggS: "x1m4xfpy",
|
|
258
|
+
kgeoSG: "x1cpjm7i",
|
|
259
|
+
kEoFBp: "x1hmns74",
|
|
260
|
+
kFcpXp: "xxx281p",
|
|
261
|
+
kPB484: "xxyica1",
|
|
262
|
+
kLkRvE: "x1tzqye7",
|
|
263
|
+
k7KCAZ: "x1hu8v7x",
|
|
264
|
+
kKXxxB: "xuhr57t x13sdc92",
|
|
265
|
+
kqUdNP: "xyt8op7",
|
|
266
|
+
$$css: true
|
|
267
|
+
},
|
|
268
|
+
connectorTiming: (duration, delay) => [_temp, {
|
|
269
|
+
"--x-1dd27dc": (val => typeof val === "number" ? val + "ms" : val != null ? val : undefined)(duration),
|
|
270
|
+
"--x-owu7oy": (val => typeof val === "number" ? val + "ms" : val != null ? val : undefined)(delay)
|
|
271
|
+
}],
|
|
272
|
+
connectorFillV: {
|
|
273
|
+
kEdqc7: "x1fgylwi",
|
|
274
|
+
kcTAPf: "xd30wvy",
|
|
275
|
+
$$css: true
|
|
276
|
+
},
|
|
277
|
+
connectorEmptyV: {
|
|
278
|
+
kEdqc7: "x1fgylwi",
|
|
279
|
+
kcTAPf: "xb5f74o",
|
|
280
|
+
$$css: true
|
|
281
|
+
},
|
|
282
|
+
connectorFillH: {
|
|
283
|
+
kEdqc7: "xgu12d xdq8fwl",
|
|
284
|
+
kcTAPf: "xp1ps4y",
|
|
285
|
+
$$css: true
|
|
286
|
+
},
|
|
287
|
+
connectorEmptyH: {
|
|
288
|
+
kEdqc7: "xgu12d xdq8fwl",
|
|
289
|
+
kcTAPf: "x1e8txe",
|
|
290
|
+
$$css: true
|
|
291
|
+
},
|
|
292
|
+
icon: {
|
|
293
|
+
k1xSpc: "x78zum5",
|
|
294
|
+
kGNEyG: "x6s0dn4",
|
|
295
|
+
kjj79g: "xl56j7k",
|
|
296
|
+
kzqmXN: "x12xnipv",
|
|
297
|
+
kZKoxP: "x6b6gus",
|
|
298
|
+
kmuXW: "x2lah0s",
|
|
299
|
+
$$css: true
|
|
300
|
+
},
|
|
301
|
+
iconCompleted: {
|
|
302
|
+
kMwMTN: "xqwr325",
|
|
303
|
+
$$css: true
|
|
304
|
+
},
|
|
305
|
+
iconInProgress: {
|
|
306
|
+
kMwMTN: "xqwr325",
|
|
307
|
+
$$css: true
|
|
308
|
+
},
|
|
309
|
+
iconNotStarted: {
|
|
310
|
+
kMwMTN: "xv9yike",
|
|
311
|
+
$$css: true
|
|
312
|
+
},
|
|
313
|
+
iconDisabled: {
|
|
314
|
+
kMwMTN: "xqa6c3m",
|
|
315
|
+
kSiTet: "xbyyjgo",
|
|
316
|
+
$$css: true
|
|
317
|
+
},
|
|
318
|
+
iconAccent: {
|
|
319
|
+
kMwMTN: "xqwr325",
|
|
320
|
+
$$css: true
|
|
321
|
+
},
|
|
322
|
+
iconSuccess: {
|
|
323
|
+
kMwMTN: "xtjic6",
|
|
324
|
+
$$css: true
|
|
325
|
+
},
|
|
326
|
+
iconWarning: {
|
|
327
|
+
kMwMTN: "xs3pv69",
|
|
328
|
+
$$css: true
|
|
329
|
+
},
|
|
330
|
+
iconError: {
|
|
331
|
+
kMwMTN: "xjt36v0",
|
|
332
|
+
$$css: true
|
|
333
|
+
},
|
|
334
|
+
numberBadge: {
|
|
335
|
+
k1xSpc: "xrvj5dj",
|
|
336
|
+
kgQiWS: "x1ku5rj1",
|
|
337
|
+
kzqmXN: "x12xnipv",
|
|
338
|
+
kZKoxP: "x6b6gus",
|
|
339
|
+
kaIpWk: "xjspbzw",
|
|
340
|
+
kGuDYH: "x51wmvv",
|
|
341
|
+
k63SB2: "x2mo6ok",
|
|
342
|
+
kmuXW: "x2lah0s",
|
|
343
|
+
k9WMMc: "x2b8uid",
|
|
344
|
+
$$css: true
|
|
345
|
+
},
|
|
346
|
+
numberCompleted: {
|
|
347
|
+
kWkggS: "x1ewilqj",
|
|
348
|
+
kMwMTN: "xrkvqaz",
|
|
349
|
+
$$css: true
|
|
350
|
+
},
|
|
351
|
+
numberInProgress: {
|
|
352
|
+
kWkggS: "x1ewilqj",
|
|
353
|
+
kMwMTN: "xrkvqaz",
|
|
354
|
+
$$css: true
|
|
355
|
+
},
|
|
356
|
+
numberNotStarted: {
|
|
357
|
+
kWkggS: "xwmxj5m",
|
|
358
|
+
kMwMTN: "xv1l7n4",
|
|
359
|
+
$$css: true
|
|
360
|
+
},
|
|
361
|
+
numberDisabled: {
|
|
362
|
+
kWkggS: "xwmxj5m",
|
|
363
|
+
kMwMTN: "xnbbluu",
|
|
364
|
+
kSiTet: "xbyyjgo",
|
|
365
|
+
$$css: true
|
|
366
|
+
},
|
|
367
|
+
numberAccent: {
|
|
368
|
+
kWkggS: "x1ewilqj",
|
|
369
|
+
kMwMTN: "x17wrial",
|
|
370
|
+
$$css: true
|
|
371
|
+
},
|
|
372
|
+
numberSuccess: {
|
|
373
|
+
kWkggS: "xdsz4j9",
|
|
374
|
+
kMwMTN: "xri61p4",
|
|
375
|
+
$$css: true
|
|
376
|
+
},
|
|
377
|
+
numberWarning: {
|
|
378
|
+
kWkggS: "x1q8g9m5",
|
|
379
|
+
kMwMTN: "xrebv38",
|
|
380
|
+
$$css: true
|
|
381
|
+
},
|
|
382
|
+
numberError: {
|
|
383
|
+
kWkggS: "x1pjz0fi",
|
|
384
|
+
kMwMTN: "x1m024r3",
|
|
385
|
+
$$css: true
|
|
386
|
+
},
|
|
387
|
+
label: {
|
|
388
|
+
kGuDYH: "xjm74w1",
|
|
389
|
+
kLWn49: "xw6l6zx",
|
|
390
|
+
k63SB2: "x1sodnla",
|
|
391
|
+
kMwMTN: "x1tgivj0",
|
|
392
|
+
k7Eaqz: "xeuugli",
|
|
393
|
+
kHjlTd: "x1mzt3pk",
|
|
394
|
+
$$css: true
|
|
395
|
+
},
|
|
396
|
+
labelInProgress: {
|
|
397
|
+
k63SB2: "x2mo6ok",
|
|
398
|
+
$$css: true
|
|
399
|
+
},
|
|
400
|
+
labelNotStarted: {
|
|
401
|
+
kMwMTN: "xv1l7n4",
|
|
402
|
+
$$css: true
|
|
403
|
+
},
|
|
404
|
+
labelDisabled: {
|
|
405
|
+
kMwMTN: "xnbbluu",
|
|
406
|
+
$$css: true
|
|
407
|
+
},
|
|
408
|
+
stepContent: {
|
|
409
|
+
kLKAdn: "x1xye8es",
|
|
410
|
+
$$css: true
|
|
411
|
+
},
|
|
412
|
+
contentIndent: (inlinePad, gutter) => [_temp2, {
|
|
413
|
+
kwRFfy: inlinePad != null ? "x120eax6" : inlinePad,
|
|
414
|
+
$$css: true
|
|
415
|
+
}, {
|
|
416
|
+
"--x-paddingInlineStart": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(`calc(${inlinePad} + ${gutter})`),
|
|
417
|
+
"--x-paddingInlineEnd": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(inlinePad)
|
|
418
|
+
}],
|
|
419
|
+
densityCompact: {
|
|
420
|
+
k8WAf4: "xu0wf1k",
|
|
421
|
+
$$css: true
|
|
422
|
+
},
|
|
423
|
+
densityBalanced: {
|
|
424
|
+
k8WAf4: "xce4md1",
|
|
425
|
+
$$css: true
|
|
426
|
+
},
|
|
427
|
+
densitySpacious: {
|
|
428
|
+
k8WAf4: "x8o8v82",
|
|
429
|
+
$$css: true
|
|
430
|
+
},
|
|
431
|
+
densityInline: value => [{
|
|
432
|
+
kg3NbH: value != null ? "x30g6up" : value,
|
|
433
|
+
$$css: true
|
|
434
|
+
}, {
|
|
435
|
+
"--x-paddingInline": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(value)
|
|
436
|
+
}],
|
|
437
|
+
buttonReset: {
|
|
438
|
+
k9WMMc: "x1yc453h",
|
|
439
|
+
kGNEyG: "x1qjc9v5",
|
|
440
|
+
k1xSpc: "x78zum5",
|
|
441
|
+
kXwgrk: "xdt5ytf",
|
|
442
|
+
kzqmXN: "xh8yej3",
|
|
443
|
+
kkrTdU: "x1ypdohk x16khyan",
|
|
444
|
+
kaIpWk: "xh6dtrn",
|
|
445
|
+
k1ekBW: "x15406qy",
|
|
446
|
+
kIyJzY: "xkvfbh3 x12w9bfk",
|
|
447
|
+
kAMwcw: "xlr8y92",
|
|
448
|
+
kWkggS: "xjbqb8w xoevpu5 xyxi2l3",
|
|
449
|
+
$$css: true
|
|
450
|
+
},
|
|
451
|
+
otVerticalRoot: {
|
|
452
|
+
k1xSpc: "x78zum5",
|
|
453
|
+
kXwgrk: "xdt5ytf",
|
|
454
|
+
kVAEAm: "x1n2onr6",
|
|
455
|
+
$$css: true
|
|
456
|
+
},
|
|
457
|
+
otHorizontalRoot: {
|
|
458
|
+
k1xSpc: "x78zum5",
|
|
459
|
+
kXwgrk: "xdt5ytf",
|
|
460
|
+
kUk6DE: "x98rzlu",
|
|
461
|
+
k7Eaqz: "xeuugli",
|
|
462
|
+
$$css: true
|
|
463
|
+
},
|
|
464
|
+
otInteractive: {
|
|
465
|
+
kB7OPa: "x9f619",
|
|
466
|
+
k9WMMc: "x1yc453h",
|
|
467
|
+
kkrTdU: "x1ypdohk x16khyan",
|
|
468
|
+
kaIpWk: "xh6dtrn",
|
|
469
|
+
k1ekBW: "x15406qy",
|
|
470
|
+
kIyJzY: "xkvfbh3 x12w9bfk",
|
|
471
|
+
kAMwcw: "xlr8y92",
|
|
472
|
+
kWkggS: "xjbqb8w xoevpu5 xyxi2l3",
|
|
473
|
+
$$css: true
|
|
474
|
+
},
|
|
475
|
+
otRowWrap: {
|
|
476
|
+
k1xSpc: "x78zum5",
|
|
477
|
+
kXwgrk: "x1q0g3np",
|
|
478
|
+
kGNEyG: "x1qjc9v5",
|
|
479
|
+
kOIVth: "x1txdalj",
|
|
480
|
+
kzqmXN: "xh8yej3",
|
|
481
|
+
$$css: true
|
|
482
|
+
},
|
|
483
|
+
otColWrap: {
|
|
484
|
+
k1xSpc: "x78zum5",
|
|
485
|
+
kXwgrk: "xdt5ytf",
|
|
486
|
+
kGNEyG: "x1qjc9v5",
|
|
487
|
+
kzqmXN: "xh8yej3",
|
|
488
|
+
$$css: true
|
|
489
|
+
},
|
|
490
|
+
otIndicatorColV: {
|
|
491
|
+
k1xSpc: "x78zum5",
|
|
492
|
+
kXwgrk: "xdt5ytf",
|
|
493
|
+
kGNEyG: "x6s0dn4",
|
|
494
|
+
kzqmXN: "x12xnipv",
|
|
495
|
+
kmuXW: "x2lah0s",
|
|
496
|
+
kSGwAc: "xkh2ocl",
|
|
497
|
+
$$css: true
|
|
498
|
+
},
|
|
499
|
+
otSegBaseV: {
|
|
500
|
+
kzqmXN: "xx9zwd3",
|
|
501
|
+
kmuXW: "x2lah0s",
|
|
502
|
+
kaIpWk: "x2u8bby",
|
|
503
|
+
$$css: true
|
|
504
|
+
},
|
|
505
|
+
otSegFlexV: {
|
|
506
|
+
kUk6DE: "x98rzlu",
|
|
507
|
+
kAzted: "x175cymr",
|
|
508
|
+
$$css: true
|
|
509
|
+
},
|
|
510
|
+
otSegLeadV: value => [{
|
|
511
|
+
kZKoxP: value != null ? "x16ye13r" : value,
|
|
512
|
+
$$css: true
|
|
513
|
+
}, {
|
|
514
|
+
"--x-height": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(value)
|
|
515
|
+
}],
|
|
516
|
+
otSegH: {
|
|
517
|
+
kZKoxP: "x11c6zpc",
|
|
518
|
+
kUk6DE: "x98rzlu",
|
|
519
|
+
k7Eaqz: "x18ki04u",
|
|
520
|
+
kaIpWk: "x2u8bby",
|
|
521
|
+
$$css: true
|
|
522
|
+
},
|
|
523
|
+
otSegHiddenIfFirst: {
|
|
524
|
+
k33iCy: "xnpuxes x5um2zc",
|
|
525
|
+
$$css: true
|
|
526
|
+
},
|
|
527
|
+
otSegHiddenIfLast: {
|
|
528
|
+
k33iCy: "xnpuxes x1se5z8o",
|
|
529
|
+
$$css: true
|
|
530
|
+
},
|
|
531
|
+
otLabelWrapH: {
|
|
532
|
+
k1xSpc: "x78zum5",
|
|
533
|
+
kXwgrk: "xdt5ytf",
|
|
534
|
+
kGNEyG: "x1qjc9v5",
|
|
535
|
+
kOIVth: "x1lsbc85",
|
|
536
|
+
k9WMMc: "x2b8uid",
|
|
537
|
+
$$css: true
|
|
538
|
+
},
|
|
539
|
+
otContent: {
|
|
540
|
+
kLKAdn: "x1xye8es",
|
|
541
|
+
$$css: true
|
|
542
|
+
},
|
|
543
|
+
otContentSegV: inlinePad => [_temp3, {
|
|
544
|
+
"--x-insetInlineStart": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(`calc(${inlinePad} + (${INDICATOR_SIZE} - ${BAR_WIDTH}) / 2)`)
|
|
545
|
+
}],
|
|
546
|
+
otRowPadV: value => [{
|
|
547
|
+
k8WAf4: value != null ? "x1giekp1" : value,
|
|
548
|
+
kg3NbH: value != null ? "x30g6up" : value,
|
|
549
|
+
$$css: true
|
|
550
|
+
}, {
|
|
551
|
+
"--x-paddingBlock": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(value),
|
|
552
|
+
"--x-paddingInline": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(value)
|
|
553
|
+
}],
|
|
554
|
+
otRailBridgeV: value => [_temp4, {
|
|
555
|
+
"--x-marginBlock": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(`calc(-1 * ${value})`)
|
|
556
|
+
}],
|
|
557
|
+
otPadBlock: value => [{
|
|
558
|
+
k8WAf4: value != null ? "x1giekp1" : value,
|
|
559
|
+
$$css: true
|
|
560
|
+
}, {
|
|
561
|
+
"--x-paddingBlock": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(value)
|
|
562
|
+
}],
|
|
563
|
+
otMarginTop: value => [_temp5, {
|
|
564
|
+
"--x-marginBlockStart": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(value)
|
|
565
|
+
}]
|
|
566
|
+
};
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* An individual step within an Stepper. Renders a 4px progress-bar segment,
|
|
570
|
+
* an indicator (numbered badge, check, or any custom icon), a label with
|
|
571
|
+
* optional description, and an optional content slot.
|
|
572
|
+
*
|
|
573
|
+
* Progress (completed / active / not-started) is derived from the parent's
|
|
574
|
+
* `activeStep` and this step's `step` prop. The optional `status` prop layers a
|
|
575
|
+
* semantic meaning on top: in the default `auto` indicator mode it recolors the
|
|
576
|
+
* indicator and swaps in a matching glyph (`success` → green check-circle,
|
|
577
|
+
* `warning`/`error` → the shared Input status icons). The current step always
|
|
578
|
+
* keeps its current-step ring. `status` never recolors the connector/track.
|
|
579
|
+
*
|
|
580
|
+
* @example
|
|
581
|
+
* ```
|
|
582
|
+
* <Step step={0} label="Account details" description="Enter your email" />
|
|
583
|
+
* ```
|
|
584
|
+
*
|
|
585
|
+
* @example
|
|
586
|
+
* ```
|
|
587
|
+
* <Step step={1} label="Payment" status="error" />
|
|
588
|
+
* ```
|
|
589
|
+
*/
|
|
590
|
+
export function Step({
|
|
591
|
+
step,
|
|
592
|
+
label,
|
|
593
|
+
description,
|
|
594
|
+
children,
|
|
595
|
+
status,
|
|
596
|
+
isDisabled = false,
|
|
597
|
+
isOptional = false,
|
|
598
|
+
endContent,
|
|
599
|
+
indicator: indicatorProp,
|
|
600
|
+
density: densityProp,
|
|
601
|
+
xstyle,
|
|
602
|
+
className,
|
|
603
|
+
style,
|
|
604
|
+
ref,
|
|
605
|
+
'data-testid': dataTestId,
|
|
606
|
+
...rest
|
|
607
|
+
}) {
|
|
608
|
+
const t = useTranslator();
|
|
609
|
+
const ctx = useStepperContext();
|
|
610
|
+
const {
|
|
611
|
+
activeStep,
|
|
612
|
+
previousActiveStep,
|
|
613
|
+
orientation,
|
|
614
|
+
onStepClick,
|
|
615
|
+
density: ctxDensity,
|
|
616
|
+
indicatorPosition,
|
|
617
|
+
registerStep
|
|
618
|
+
} = ctx;
|
|
619
|
+
|
|
620
|
+
// Register this step index with the parent Stepper for duplicate detection.
|
|
621
|
+
useEffect(() => registerStep(step), [registerStep, step]);
|
|
622
|
+
const density = densityProp ?? ctxDensity;
|
|
623
|
+
// Inline padding of a separated step's hover target. Density varies the block
|
|
624
|
+
// padding freely, but the inline value has to be readable from out here: the
|
|
625
|
+
// content slot renders outside that target and re-applies it to stay aligned
|
|
626
|
+
// (see contentIndent), so keeping it in one place is what stops the two
|
|
627
|
+
// drifting apart.
|
|
628
|
+
const separatedDensityInline = density === 'spacious' ? spacingVars['--spacing-3'] : spacingVars['--spacing-2'];
|
|
629
|
+
|
|
630
|
+
// Resolve indicator prop — may be a preset string or a custom ReactNode.
|
|
631
|
+
const isCustomIndicator = indicatorProp != null && typeof indicatorProp !== 'string';
|
|
632
|
+
const indicator = isCustomIndicator ? 'auto' : indicatorProp ?? 'auto';
|
|
633
|
+
|
|
634
|
+
// Internal progress, derived from the parent's activeStep. This is NOT the
|
|
635
|
+
// public `status` prop — `status` controls semantic color only.
|
|
636
|
+
const progress = step === activeStep ? 'in-progress' : step < activeStep ? 'completed' : 'not-started';
|
|
637
|
+
const isVertical = orientation === 'vertical';
|
|
638
|
+
const isActive = progress === 'in-progress';
|
|
639
|
+
// Any non-disabled step is navigable when an onStepClick handler is provided,
|
|
640
|
+
// including not-started steps (free navigation across the flow).
|
|
641
|
+
const isClickable = !isDisabled && onStepClick != null;
|
|
642
|
+
const handleClick = () => {
|
|
643
|
+
if (isClickable && onStepClick) {
|
|
644
|
+
onStepClick(step);
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
|
|
648
|
+
// Bar fill is purely progress-based. `status` never recolors the bar — it
|
|
649
|
+
// only recolors the indicator (icon / number badge) below.
|
|
650
|
+
const isBarFilled = progress === 'completed' || progress === 'in-progress';
|
|
651
|
+
|
|
652
|
+
// --- This step's slice of the animated span ---
|
|
653
|
+
// Both layouts are measured in the same unit, the node-to-node span: on-track
|
|
654
|
+
// span k runs from node k to node k+1, and a separated step's lone bar is the
|
|
655
|
+
// span arriving at it (bar s fills on exactly the condition span s-1 does).
|
|
656
|
+
// So one rule serves both, and neither needs to know the step count.
|
|
657
|
+
//
|
|
658
|
+
// Only a single forward step animates, and the span it crosses is the one
|
|
659
|
+
// leaving the step the flow came from. Every other segment — the untouched
|
|
660
|
+
// ones, and every segment of a jump or a retreat — is handed a zero
|
|
661
|
+
// duration, so it lands at once and carries no stale delay into a later
|
|
662
|
+
// change.
|
|
663
|
+
const isSingleAdvance = activeStep === previousActiveStep + 1;
|
|
664
|
+
const animatedSpan = previousActiveStep;
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Timing for the segment covering `[offset, offset + share)` of span
|
|
668
|
+
* `spanIndex`, both expressed as fractions of that span.
|
|
669
|
+
*/
|
|
670
|
+
const fillTiming = (spanIndex, offset, share) => {
|
|
671
|
+
if (!isSingleAdvance || spanIndex !== animatedSpan) {
|
|
672
|
+
return styles.connectorTiming('0s', '0s');
|
|
673
|
+
}
|
|
674
|
+
return styles.connectorTiming(fillTimeSlice(FILL_SPAN_TIME, share), fillTimeSlice(FILL_SPAN_TIME, offset));
|
|
675
|
+
};
|
|
676
|
+
|
|
677
|
+
// A separated step draws the whole span arriving at it, so it fills for the
|
|
678
|
+
// span's entire slice with nothing to sequence against.
|
|
679
|
+
const barTiming = fillTiming(step - 1, 0, 1);
|
|
680
|
+
|
|
681
|
+
// --- Build indicator node ---
|
|
682
|
+
// 'auto': number for not-started, check/dot icon once reached
|
|
683
|
+
// 'number': always number badge
|
|
684
|
+
// 'none': nothing
|
|
685
|
+
// custom ReactNode (or `icon` prop): render as-is
|
|
686
|
+
let indicatorNode = null;
|
|
687
|
+
const customIcon = isCustomIndicator ? indicatorProp : null;
|
|
688
|
+
|
|
689
|
+
// Semantic `status` drives a distinct indicator glyph (default 'auto' mode,
|
|
690
|
+
// no custom icon), all sourced from the themed Icon registry so a step reads
|
|
691
|
+
// the same as the rest of the system:
|
|
692
|
+
// - success → the themed `success` glyph (same check-circle as a completed
|
|
693
|
+
// step), tinted success — i.e. a green check
|
|
694
|
+
// - warning → the themed `warning` glyph
|
|
695
|
+
// - error → the themed `error` glyph
|
|
696
|
+
// The current (in-progress) step always shows the current-step ring — its
|
|
697
|
+
// indicator "replaces" any status glyph. `accent` has no distinct glyph and
|
|
698
|
+
// falls through to the progress-derived default.
|
|
699
|
+
const statusGlyph = indicator === 'auto' && customIcon == null && !isActive && (status === 'success' || status === 'warning' || status === 'error') ? status : null;
|
|
700
|
+
if (indicator !== 'none') {
|
|
701
|
+
const showNumber = customIcon == null && statusGlyph == null && (indicator === 'number' || indicator === 'auto' && progress === 'not-started');
|
|
702
|
+
if (showNumber) {
|
|
703
|
+
// Status only fills the badge once the step is reached. A not-started
|
|
704
|
+
// step stays neutral — otherwise `accent` (which has no glyph to swap in)
|
|
705
|
+
// would paint an inverted accent badge on an upcoming step, making it
|
|
706
|
+
// read as active/completed.
|
|
707
|
+
const isReached = progress === 'completed' || progress === 'in-progress';
|
|
708
|
+
const numberColorStyle = isDisabled ? styles.numberDisabled : isReached && status === 'accent' ? styles.numberAccent : isReached && status === 'success' ? styles.numberSuccess : isReached && status === 'warning' ? styles.numberWarning : isReached && status === 'error' ? styles.numberError : progress === 'completed' ? styles.numberCompleted : progress === 'in-progress' ? styles.numberInProgress : styles.numberNotStarted;
|
|
709
|
+
indicatorNode = /*#__PURE__*/_jsx("div", {
|
|
710
|
+
"aria-hidden": "true",
|
|
711
|
+
...mergeProps(themeProps('step-indicator', {
|
|
712
|
+
progress,
|
|
713
|
+
status: status ?? undefined
|
|
714
|
+
}), stylex.props(styles.numberBadge, numberColorStyle)),
|
|
715
|
+
children: step + 1
|
|
716
|
+
});
|
|
717
|
+
} else {
|
|
718
|
+
// Priority: explicit custom icon → status glyph (non-current steps) →
|
|
719
|
+
// progress-derived default (check when completed, ring when current).
|
|
720
|
+
const iconContent = customIcon != null ? customIcon : statusGlyph === 'success' ? /*#__PURE__*/_jsx(Icon, {
|
|
721
|
+
icon: "success",
|
|
722
|
+
size: "sm",
|
|
723
|
+
color: isDisabled ? 'disabled' : 'success'
|
|
724
|
+
}) : statusGlyph === 'warning' ? /*#__PURE__*/_jsx(Icon, {
|
|
725
|
+
icon: "warning",
|
|
726
|
+
size: "sm",
|
|
727
|
+
color: isDisabled ? 'disabled' : 'warning'
|
|
728
|
+
}) : statusGlyph === 'error' ? /*#__PURE__*/_jsx(Icon, {
|
|
729
|
+
icon: "error",
|
|
730
|
+
size: "sm",
|
|
731
|
+
color: isDisabled ? 'disabled' : 'error'
|
|
732
|
+
}) : progress === 'completed' ? /*#__PURE__*/_jsx(CheckCircleIcon, {}) : /*#__PURE__*/_jsx(CurrentIcon, {});
|
|
733
|
+
|
|
734
|
+
// Wrapper tint drives the currentColor glyphs (check-circle / ring /
|
|
735
|
+
// custom icon). The <Icon> status glyphs set their own color, but we tint
|
|
736
|
+
// the wrapper to match so the indicator's color reflects `status` too.
|
|
737
|
+
const iconColorStyle = isDisabled ? styles.iconDisabled : customIcon != null ? status === 'accent' ? styles.iconAccent : status === 'success' ? styles.iconSuccess : status === 'warning' ? styles.iconWarning : status === 'error' ? styles.iconError : progress === 'completed' ? styles.iconCompleted : progress === 'in-progress' ? styles.iconInProgress : styles.iconNotStarted : statusGlyph === 'success' ? styles.iconSuccess : statusGlyph === 'warning' ? styles.iconWarning : statusGlyph === 'error' ? styles.iconError : progress === 'completed' ? styles.iconCompleted : progress === 'in-progress' ? styles.iconInProgress : styles.iconNotStarted;
|
|
738
|
+
indicatorNode = /*#__PURE__*/_jsx("div", {
|
|
739
|
+
"aria-hidden": "true",
|
|
740
|
+
...mergeProps(themeProps('step-indicator', {
|
|
741
|
+
progress,
|
|
742
|
+
status: status ?? undefined
|
|
743
|
+
}), stylex.props(styles.icon, iconColorStyle)),
|
|
744
|
+
children: iconContent
|
|
745
|
+
});
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
// Every indicator glyph above is aria-hidden (pure decoration), so the
|
|
750
|
+
// step's progress/status must also reach assistive tech as text
|
|
751
|
+
// (WCAG 1.4.1 / 1.3.1). `error`/`warning` announce the semantic status;
|
|
752
|
+
// `success` and a completed step both announce "completed". The current
|
|
753
|
+
// step is announced via aria-current="step" instead, and not-started steps
|
|
754
|
+
// stay silent (the default state needs no qualifier).
|
|
755
|
+
const statusText = status === 'error' ? t('@astryx.step.status.error') : status === 'warning' ? t('@astryx.step.status.warning') : status === 'success' || progress === 'completed' ? t('@astryx.step.status.completed') : null;
|
|
756
|
+
|
|
757
|
+
// Rendered next to the label: hidden text for static steps, and composed
|
|
758
|
+
// into the button's accessible name for clickable ones (an aria-label on
|
|
759
|
+
// the button would otherwise override the hidden text). Two separate keys
|
|
760
|
+
// rather than string concatenation so translations control the joiner.
|
|
761
|
+
const statusTextNode = isRenderable(statusText) ? /*#__PURE__*/_jsx(VisuallyHidden, {
|
|
762
|
+
children: statusText
|
|
763
|
+
}) : null;
|
|
764
|
+
const stepAriaLabel = statusText != null ? t('@astryx.step.goToStepWithStatus', {
|
|
765
|
+
stepNumber: step + 1,
|
|
766
|
+
label,
|
|
767
|
+
status: statusText
|
|
768
|
+
}) : t('@astryx.step.goToStep', {
|
|
769
|
+
stepNumber: step + 1,
|
|
770
|
+
label
|
|
771
|
+
});
|
|
772
|
+
const hasIndicator = indicator !== 'none';
|
|
773
|
+
const labelColorStyle = isDisabled ? styles.labelDisabled : progress === 'not-started' ? styles.labelNotStarted : isActive ? styles.labelInProgress : undefined;
|
|
774
|
+
|
|
775
|
+
// Indicator + Label row
|
|
776
|
+
const iconLabelNode = /*#__PURE__*/_jsxs("div", {
|
|
777
|
+
...{
|
|
778
|
+
className: "x78zum5 x1q0g3np x6s0dn4 x1txdalj"
|
|
779
|
+
},
|
|
780
|
+
children: [indicatorNode, /*#__PURE__*/_jsx("span", {
|
|
781
|
+
...stylex.props(styles.label, labelColorStyle),
|
|
782
|
+
children: label
|
|
783
|
+
}), statusTextNode, isOptional && /*#__PURE__*/_jsxs(_Fragment, {
|
|
784
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
785
|
+
...{
|
|
786
|
+
className: "xjm74w1 xv1l7n4"
|
|
787
|
+
},
|
|
788
|
+
children: "\u2022"
|
|
789
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
790
|
+
...{
|
|
791
|
+
className: "xjm74w1 xv1l7n4"
|
|
792
|
+
},
|
|
793
|
+
children: t('@astryx.step.optional')
|
|
794
|
+
})]
|
|
795
|
+
}), endContent]
|
|
796
|
+
});
|
|
797
|
+
const descriptionNode = isRenderable(description) ? /*#__PURE__*/_jsx("div", {
|
|
798
|
+
...{
|
|
799
|
+
0: {
|
|
800
|
+
className: "x18gyask"
|
|
801
|
+
},
|
|
802
|
+
1: {
|
|
803
|
+
className: "x31w388"
|
|
804
|
+
}
|
|
805
|
+
}[!!hasIndicator << 0],
|
|
806
|
+
children: /*#__PURE__*/_jsx("span", {
|
|
807
|
+
...{
|
|
808
|
+
className: "x1lliihq x141an7d x1ojctns xv1l7n4"
|
|
809
|
+
},
|
|
810
|
+
children: description
|
|
811
|
+
})
|
|
812
|
+
}) : null;
|
|
813
|
+
const contentNode = isRenderable(children) ? /*#__PURE__*/_jsx("div", {
|
|
814
|
+
...stylex.props(styles.stepContent, styles.contentIndent(separatedDensityInline, hasIndicator ? INDICATOR_GUTTER : '0px')),
|
|
815
|
+
children: children
|
|
816
|
+
}) : null;
|
|
817
|
+
|
|
818
|
+
// Theme data attributes reflect progress + optional semantic status.
|
|
819
|
+
const stepThemeProps = themeProps('step', {
|
|
820
|
+
progress,
|
|
821
|
+
status: status ?? undefined
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
// ======= ON-TRACK: indicator is a node on the connector =======
|
|
825
|
+
if (indicatorPosition === 'on-track') {
|
|
826
|
+
// Connector fill is purely progress-based (matches the separated bar):
|
|
827
|
+
// the segment before the indicator is "reached" once we're at/past this
|
|
828
|
+
// step; the segment after is filled only once this step is completed.
|
|
829
|
+
// `status` never recolors the connector — only the indicator.
|
|
830
|
+
const beforeFilled = step <= activeStep;
|
|
831
|
+
const afterFilled = step < activeStep;
|
|
832
|
+
// Both segments animate their fill along the track (see connectorTrack), so
|
|
833
|
+
// the pair is picked by orientation: the vertical column scales down its
|
|
834
|
+
// block axis, the horizontal row along the reading direction.
|
|
835
|
+
const segFilledStyle = isVertical ? styles.connectorFillV : styles.connectorFillH;
|
|
836
|
+
const segEmptyStyle = isVertical ? styles.connectorEmptyV : styles.connectorEmptyH;
|
|
837
|
+
const beforeSegStyle = beforeFilled ? segFilledStyle : segEmptyStyle;
|
|
838
|
+
const afterSegStyle = afterFilled ? segFilledStyle : segEmptyStyle;
|
|
839
|
+
// First/last connector visibility is decided structurally from the step's
|
|
840
|
+
// own <li> position (see otSegHiddenIfFirst/Last), not by counting children
|
|
841
|
+
// in the parent — so grouping steps in a fragment can't break it.
|
|
842
|
+
|
|
843
|
+
// A node-to-node span is drawn by two steps: this one's trailing segments
|
|
844
|
+
// leave its own node, the next one's leading cap arrives at the next node.
|
|
845
|
+
// Both flip on the same condition, so left to themselves they fill together
|
|
846
|
+
// and one gap between two nodes reads as two dashes converging on the space
|
|
847
|
+
// between them. Handing each its own slice of the span's time, in track
|
|
848
|
+
// order — the leaving half first, then the arriving one — is what closes
|
|
849
|
+
// that into a single line growing.
|
|
850
|
+
const arrivalShare = isVertical ? OT_ARRIVAL_SHARE_V : OT_ARRIVAL_SHARE_H;
|
|
851
|
+
const leavingShare = 1 - arrivalShare;
|
|
852
|
+
// A content slot's segment continues the leaving half below the row, so the
|
|
853
|
+
// two divide the leaving time between them; with no slot the rail segment
|
|
854
|
+
// takes all of it. Each step can work this out for its own trailing side
|
|
855
|
+
// alone: the arriving cap always takes the span's last `arrivalShare`, so
|
|
856
|
+
// the step drawing it never has to know whether the step before it carries
|
|
857
|
+
// a slot.
|
|
858
|
+
const hasContentSeg = isVertical && isRenderable(children);
|
|
859
|
+
const railShare = leavingShare * (hasContentSeg ? OT_RAIL_SHARE_OF_LEAVING : 1);
|
|
860
|
+
const contentShare = leavingShare - railShare;
|
|
861
|
+
const beforeTiming = fillTiming(step - 1, leavingShare, arrivalShare);
|
|
862
|
+
const railTiming = fillTiming(step, 0, railShare);
|
|
863
|
+
const contentTiming = fillTiming(step, railShare, contentShare);
|
|
864
|
+
const densitySpace = density === 'compact' ? spacingVars['--spacing-1'] : density === 'spacious' ? spacingVars['--spacing-3'] : spacingVars['--spacing-2'];
|
|
865
|
+
const labelLineNode = /*#__PURE__*/_jsxs("div", {
|
|
866
|
+
...{
|
|
867
|
+
0: {
|
|
868
|
+
className: "x78zum5 x1q0g3np x6s0dn4 xl56j7k x1a02dak xzye2dw"
|
|
869
|
+
},
|
|
870
|
+
1: {
|
|
871
|
+
className: "x78zum5 x1q0g3np x6s0dn4 x1txdalj"
|
|
872
|
+
}
|
|
873
|
+
}[!!isVertical << 0],
|
|
874
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
875
|
+
...stylex.props(styles.label, labelColorStyle),
|
|
876
|
+
children: label
|
|
877
|
+
}), statusTextNode, isOptional && /*#__PURE__*/_jsxs(_Fragment, {
|
|
878
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
879
|
+
...{
|
|
880
|
+
className: "xjm74w1 xv1l7n4"
|
|
881
|
+
},
|
|
882
|
+
children: "\u2022"
|
|
883
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
884
|
+
...{
|
|
885
|
+
className: "xjm74w1 xv1l7n4"
|
|
886
|
+
},
|
|
887
|
+
children: t('@astryx.step.optional')
|
|
888
|
+
})]
|
|
889
|
+
}), endContent]
|
|
890
|
+
});
|
|
891
|
+
const otDescriptionNode = isRenderable(description) ? /*#__PURE__*/_jsx("span", {
|
|
892
|
+
...{
|
|
893
|
+
className: "x1lliihq x141an7d x1ojctns xv1l7n4"
|
|
894
|
+
},
|
|
895
|
+
children: description
|
|
896
|
+
}) : null;
|
|
897
|
+
const otContentNode = !isRenderable(children) ? null : isVertical ? /*#__PURE__*/_jsxs("div", {
|
|
898
|
+
...{
|
|
899
|
+
className: "x1n2onr6"
|
|
900
|
+
},
|
|
901
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
902
|
+
"aria-hidden": "true",
|
|
903
|
+
...mergeProps(themeProps('step-connector'), stylex.props(
|
|
904
|
+
// connectorTrack first: it declares `position: relative` to
|
|
905
|
+
// anchor its fill layer, but this segment is absolutely placed
|
|
906
|
+
// on the rail beside the content slot and must keep that. An
|
|
907
|
+
// absolute box is a containing block too, so the fill still
|
|
908
|
+
// pins to it.
|
|
909
|
+
styles.connectorTrack, styles.otContentSegV(densitySpace), afterSegStyle, contentTiming, styles.otSegHiddenIfLast))
|
|
910
|
+
}), /*#__PURE__*/_jsx("div", {
|
|
911
|
+
...stylex.props(styles.otContent, styles.contentIndent(densitySpace, INDICATOR_GUTTER)),
|
|
912
|
+
children: children
|
|
913
|
+
})]
|
|
914
|
+
}) : /*#__PURE__*/_jsx("div", {
|
|
915
|
+
...{
|
|
916
|
+
className: "x1xye8es"
|
|
917
|
+
},
|
|
918
|
+
children: children
|
|
919
|
+
});
|
|
920
|
+
if (isVertical) {
|
|
921
|
+
const inner = /*#__PURE__*/_jsxs(_Fragment, {
|
|
922
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
923
|
+
...stylex.props(styles.otIndicatorColV, styles.otRailBridgeV(densitySpace)),
|
|
924
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
925
|
+
"aria-hidden": "true",
|
|
926
|
+
...mergeProps(themeProps('step-connector'), stylex.props(styles.otSegBaseV, styles.otSegLeadV(densitySpace), styles.connectorTrack, beforeSegStyle, beforeTiming, styles.otSegHiddenIfFirst))
|
|
927
|
+
}), indicatorNode, /*#__PURE__*/_jsx("div", {
|
|
928
|
+
"aria-hidden": "true",
|
|
929
|
+
...mergeProps(themeProps('step-connector'), stylex.props(styles.otSegBaseV, styles.otSegFlexV, styles.connectorTrack, afterSegStyle, railTiming, styles.otSegHiddenIfLast))
|
|
930
|
+
})]
|
|
931
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
932
|
+
...{
|
|
933
|
+
className: "x78zum5 xdt5ytf x1nhvcw1 x98rzlu x1lsbc85 xeuugli"
|
|
934
|
+
},
|
|
935
|
+
children: [labelLineNode, otDescriptionNode]
|
|
936
|
+
})]
|
|
937
|
+
});
|
|
938
|
+
return /*#__PURE__*/_jsxs("li", {
|
|
939
|
+
ref: ref,
|
|
940
|
+
...mergeProps(stepThemeProps, stylex.props(stepMarker, styles.otVerticalRoot, xstyle), className, style),
|
|
941
|
+
"aria-current": isActive ? 'step' : undefined,
|
|
942
|
+
"data-testid": dataTestId,
|
|
943
|
+
...rest,
|
|
944
|
+
children: [isClickable ? /*#__PURE__*/_jsx("button", {
|
|
945
|
+
type: "button",
|
|
946
|
+
onClick: handleClick,
|
|
947
|
+
"aria-label": stepAriaLabel,
|
|
948
|
+
...stylex.props(styles.otInteractive, styles.otRowWrap, styles.otRowPadV(densitySpace), focusOutlineStyles.focusVisible),
|
|
949
|
+
children: inner
|
|
950
|
+
}) : /*#__PURE__*/_jsx("div", {
|
|
951
|
+
...stylex.props(styles.otRowWrap, styles.otRowPadV(densitySpace)),
|
|
952
|
+
children: inner
|
|
953
|
+
}), otContentNode]
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
// Horizontal on-track
|
|
958
|
+
const innerH = /*#__PURE__*/_jsxs(_Fragment, {
|
|
959
|
+
children: [/*#__PURE__*/_jsxs("div", {
|
|
960
|
+
...{
|
|
961
|
+
className: "x78zum5 x1q0g3np x6s0dn4 xh8yej3"
|
|
962
|
+
},
|
|
963
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
964
|
+
"aria-hidden": "true",
|
|
965
|
+
...mergeProps(themeProps('step-connector'), stylex.props(styles.otSegH, styles.connectorTrack, beforeSegStyle, beforeTiming, styles.otSegHiddenIfFirst))
|
|
966
|
+
}), indicatorNode, /*#__PURE__*/_jsx("div", {
|
|
967
|
+
"aria-hidden": "true",
|
|
968
|
+
...mergeProps(themeProps('step-connector'), stylex.props(styles.otSegH, styles.connectorTrack, afterSegStyle, railTiming, styles.otSegHiddenIfLast))
|
|
969
|
+
})]
|
|
970
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
971
|
+
...stylex.props(styles.otLabelWrapH, styles.otMarginTop(densitySpace)),
|
|
972
|
+
children: [labelLineNode, otDescriptionNode]
|
|
973
|
+
})]
|
|
974
|
+
});
|
|
975
|
+
return /*#__PURE__*/_jsxs("li", {
|
|
976
|
+
ref: ref,
|
|
977
|
+
...mergeProps(stepThemeProps, stylex.props(stepMarker, styles.otHorizontalRoot, xstyle), className, style),
|
|
978
|
+
"aria-current": isActive ? 'step' : undefined,
|
|
979
|
+
"data-testid": dataTestId,
|
|
980
|
+
...rest,
|
|
981
|
+
children: [isClickable ? /*#__PURE__*/_jsx("button", {
|
|
982
|
+
type: "button",
|
|
983
|
+
onClick: handleClick,
|
|
984
|
+
"aria-label": stepAriaLabel,
|
|
985
|
+
...stylex.props(styles.otInteractive, styles.otColWrap, styles.otPadBlock(densitySpace), focusOutlineStyles.focusVisible),
|
|
986
|
+
children: innerH
|
|
987
|
+
}) : /*#__PURE__*/_jsx("div", {
|
|
988
|
+
...stylex.props(styles.otColWrap, styles.otPadBlock(densitySpace)),
|
|
989
|
+
children: innerH
|
|
990
|
+
}), otContentNode]
|
|
991
|
+
});
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
// ======= VERTICAL =======
|
|
995
|
+
if (isVertical) {
|
|
996
|
+
return /*#__PURE__*/_jsxs("li", {
|
|
997
|
+
ref: ref,
|
|
998
|
+
...mergeProps(stepThemeProps, stylex.props(stepMarker, styles.verticalRoot, xstyle), className, style),
|
|
999
|
+
"aria-current": isActive ? 'step' : undefined,
|
|
1000
|
+
"data-testid": dataTestId,
|
|
1001
|
+
...rest,
|
|
1002
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
1003
|
+
...mergeProps(themeProps('step-bar'), stylex.props(styles.verticalBar, styles.connectorTrack, isBarFilled ? styles.connectorFillV : styles.connectorEmptyV, barTiming)),
|
|
1004
|
+
"aria-hidden": "true"
|
|
1005
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
1006
|
+
...{
|
|
1007
|
+
className: "x78zum5 xdt5ytf x98rzlu"
|
|
1008
|
+
},
|
|
1009
|
+
children: [isClickable ? /*#__PURE__*/_jsxs("button", {
|
|
1010
|
+
type: "button",
|
|
1011
|
+
onClick: handleClick,
|
|
1012
|
+
"aria-label": stepAriaLabel,
|
|
1013
|
+
...stylex.props(styles.buttonReset, focusOutlineStyles.focusVisible, density === 'compact' && styles.densityCompact, density === 'balanced' && styles.densityBalanced, density === 'spacious' && styles.densitySpacious, styles.densityInline(separatedDensityInline)),
|
|
1014
|
+
children: [iconLabelNode, descriptionNode]
|
|
1015
|
+
}) : /*#__PURE__*/_jsxs("div", {
|
|
1016
|
+
...stylex.props(density === 'compact' && styles.densityCompact, density === 'balanced' && styles.densityBalanced, density === 'spacious' && styles.densitySpacious, styles.densityInline(separatedDensityInline)),
|
|
1017
|
+
children: [iconLabelNode, descriptionNode]
|
|
1018
|
+
}), contentNode]
|
|
1019
|
+
})]
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
|
|
1023
|
+
// ======= HORIZONTAL =======
|
|
1024
|
+
return /*#__PURE__*/_jsxs("li", {
|
|
1025
|
+
ref: ref,
|
|
1026
|
+
...mergeProps(stepThemeProps, stylex.props(stepMarker, styles.horizontalStep, xstyle), className, style),
|
|
1027
|
+
"aria-current": isActive ? 'step' : undefined,
|
|
1028
|
+
"data-testid": dataTestId,
|
|
1029
|
+
...rest,
|
|
1030
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
1031
|
+
...mergeProps(themeProps('step-bar'), stylex.props(styles.horizontalBar, styles.connectorTrack, isBarFilled ? styles.connectorFillH : styles.connectorEmptyH, barTiming)),
|
|
1032
|
+
"aria-hidden": "true"
|
|
1033
|
+
}), isClickable ? /*#__PURE__*/_jsxs("button", {
|
|
1034
|
+
type: "button",
|
|
1035
|
+
onClick: handleClick,
|
|
1036
|
+
"aria-label": stepAriaLabel,
|
|
1037
|
+
...stylex.props(styles.buttonReset, focusOutlineStyles.focusVisible, density === 'compact' && styles.densityCompact, density === 'balanced' && styles.densityBalanced, density === 'spacious' && styles.densitySpacious, styles.densityInline(separatedDensityInline)),
|
|
1038
|
+
children: [iconLabelNode, descriptionNode]
|
|
1039
|
+
}) : /*#__PURE__*/_jsxs("div", {
|
|
1040
|
+
...stylex.props(density === 'compact' && styles.densityCompact, density === 'balanced' && styles.densityBalanced, density === 'spacious' && styles.densitySpacious, styles.densityInline(separatedDensityInline)),
|
|
1041
|
+
children: [iconLabelNode, descriptionNode]
|
|
1042
|
+
}), contentNode]
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1045
|
+
Step.displayName = 'Step';
|