@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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file AlertDialog.tsx
|
|
7
|
-
* @input Uses React, Dialog, Layout, Heading, Text, Button
|
|
7
|
+
* @input Uses React, StyleX, Dialog, Layout, Heading, Text, Button
|
|
8
8
|
* @output Exports AlertDialog component, AlertDialogProps type
|
|
9
9
|
* @position Core implementation; consumed by index.ts, tested by AlertDialog.test.tsx
|
|
10
10
|
*
|
|
@@ -17,11 +17,12 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import React, {useId, useCallback} from 'react';
|
|
20
|
+
import * as stylex from '@stylexjs/stylex';
|
|
20
21
|
import {Dialog} from '../Dialog';
|
|
21
22
|
import {Layout} from '../Layout/Layout';
|
|
22
23
|
import {LayoutContent} from '../Layout/LayoutContent';
|
|
23
24
|
import {LayoutFooter} from '../Layout/LayoutFooter';
|
|
24
|
-
import {
|
|
25
|
+
import {Stack} from '../Stack';
|
|
25
26
|
import {Heading} from '../Heading/Heading';
|
|
26
27
|
import {Text} from '../Text/Text';
|
|
27
28
|
import {Button, type ButtonVariant} from '../Button';
|
|
@@ -29,6 +30,19 @@ import type {BaseProps} from '../BaseProps';
|
|
|
29
30
|
import {mergeProps} from '../utils';
|
|
30
31
|
import {themeProps} from '../utils/themeProps';
|
|
31
32
|
import {useTranslator} from '../i18n';
|
|
33
|
+
import {useMediaQuery} from '../hooks';
|
|
34
|
+
|
|
35
|
+
const SMALL_SCREEN_QUERY = '(max-width: 640px)';
|
|
36
|
+
|
|
37
|
+
const styles = stylex.create({
|
|
38
|
+
action: {
|
|
39
|
+
maxWidth: '100%',
|
|
40
|
+
minWidth: 0,
|
|
41
|
+
},
|
|
42
|
+
stackedAction: {
|
|
43
|
+
width: '100%',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
32
46
|
|
|
33
47
|
export interface AlertDialogProps extends BaseProps<HTMLDialogElement> {
|
|
34
48
|
ref?: React.Ref<HTMLDialogElement>;
|
|
@@ -147,11 +161,44 @@ export function AlertDialog({
|
|
|
147
161
|
const cancelLabel = cancelLabelFromProps ?? t('@astryx.alertDialog.cancel');
|
|
148
162
|
const titleId = useId();
|
|
149
163
|
const descriptionId = useId();
|
|
164
|
+
// Width stays delegated to Dialog: this query exists only so AlertDialog can
|
|
165
|
+
// keep narrow visual, DOM, and tab order aligned for its destructive/cancel
|
|
166
|
+
// semantics without coupling action order to pointer or hover capability.
|
|
167
|
+
const isSmallScreen = useMediaQuery(SMALL_SCREEN_QUERY);
|
|
150
168
|
|
|
151
169
|
const handleCancel = useCallback(() => {
|
|
152
170
|
onOpenChange(false);
|
|
153
171
|
}, [onOpenChange]);
|
|
154
172
|
|
|
173
|
+
const buttonActionStyle = [
|
|
174
|
+
styles.action,
|
|
175
|
+
isSmallScreen && styles.stackedAction,
|
|
176
|
+
];
|
|
177
|
+
const cancelButton = (
|
|
178
|
+
<Button
|
|
179
|
+
key="cancel"
|
|
180
|
+
variant="ghost"
|
|
181
|
+
label={cancelLabel}
|
|
182
|
+
onClick={handleCancel}
|
|
183
|
+
xstyle={buttonActionStyle}
|
|
184
|
+
// Dialog focuses [data-autofocus] itself after showModal(), because
|
|
185
|
+
// React's autoFocus runs during commit while the dialog is invisible.
|
|
186
|
+
// Cancel is least destructive, so it remains the autofocus target even
|
|
187
|
+
// when small-screen visual order places the destructive action above it.
|
|
188
|
+
data-autofocus
|
|
189
|
+
/>
|
|
190
|
+
);
|
|
191
|
+
const actionButton = (
|
|
192
|
+
<Button
|
|
193
|
+
key="action"
|
|
194
|
+
variant={actionVariant}
|
|
195
|
+
label={actionLabel}
|
|
196
|
+
onClick={onAction}
|
|
197
|
+
isLoading={isActionLoading}
|
|
198
|
+
xstyle={buttonActionStyle}
|
|
199
|
+
/>
|
|
200
|
+
);
|
|
201
|
+
|
|
155
202
|
return (
|
|
156
203
|
<Dialog
|
|
157
204
|
{...rest}
|
|
@@ -185,24 +232,19 @@ export function AlertDialog({
|
|
|
185
232
|
}
|
|
186
233
|
footer={
|
|
187
234
|
<LayoutFooter>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
label={actionLabel}
|
|
202
|
-
onClick={onAction}
|
|
203
|
-
isLoading={isActionLoading}
|
|
204
|
-
/>
|
|
205
|
-
</HStack>
|
|
235
|
+
{/* Generic Dialog footers should wrap, but their consumers own
|
|
236
|
+
action semantics and order. AlertDialog keeps this
|
|
237
|
+
destructive-above-Cancel narrow order because confirmation
|
|
238
|
+
actions have component-specific meaning here. */}
|
|
239
|
+
<Stack
|
|
240
|
+
direction={isSmallScreen ? 'vertical' : 'horizontal'}
|
|
241
|
+
gap={2}
|
|
242
|
+
hAlign={isSmallScreen ? 'stretch' : 'end'}
|
|
243
|
+
wrap={isSmallScreen ? 'nowrap' : 'wrap'}>
|
|
244
|
+
{isSmallScreen
|
|
245
|
+
? [actionButton, cancelButton]
|
|
246
|
+
: [cancelButton, actionButton]}
|
|
247
|
+
</Stack>
|
|
206
248
|
</LayoutFooter>
|
|
207
249
|
}
|
|
208
250
|
/>
|
|
@@ -50,7 +50,7 @@ import {AppShellMobileContext} from './AppShellMobileContext';
|
|
|
50
50
|
import type {AppShellMobileContextValue} from './AppShellMobileContext';
|
|
51
51
|
import type {SpacingStep} from '../utils/types';
|
|
52
52
|
import type {BaseProps} from '../BaseProps';
|
|
53
|
-
import {mergeProps,
|
|
53
|
+
import {mergeProps, isRenderable} from '../utils';
|
|
54
54
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
55
55
|
import {useMediaQuery} from '../hooks/useMediaQuery';
|
|
56
56
|
import {observeResize, unobserveResize} from '../utils/sharedResizeObserver';
|
|
@@ -58,6 +58,7 @@ import {themeProps} from '../utils/themeProps';
|
|
|
58
58
|
import {useTranslator} from '../i18n';
|
|
59
59
|
import type {AppShellVariantMap} from './index';
|
|
60
60
|
|
|
61
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
61
62
|
const HasActivity = typeof React.Activity !== 'undefined';
|
|
62
63
|
const ActivityWrapper = HasActivity
|
|
63
64
|
? ({
|
|
@@ -792,7 +793,7 @@ export function AppShell({
|
|
|
792
793
|
<AppShellMobileContext value={mobileContextValue}>
|
|
793
794
|
<div
|
|
794
795
|
{...rest}
|
|
795
|
-
ref={
|
|
796
|
+
ref={useMergedRefs(ref, shellRef)}
|
|
796
797
|
data-testid={dataTestId}
|
|
797
798
|
{...mergeProps(
|
|
798
799
|
themeProps('app-shell', {variant}),
|
|
@@ -16,6 +16,7 @@ export const docs = {
|
|
|
16
16
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
17
17
|
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
18
18
|
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
19
|
+
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule; component styles live in the `astryx-base` cascade layer, so unlayered consumer CSS wins. Give an `xstyle` rule a `default` branch alongside the conditional one (`{default: 3, \'@container ...\': \'3 / 2\'}`); with only the conditional branch the ratio is unset outside the query and the box collapses.'},
|
|
19
20
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
20
21
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
21
22
|
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
@@ -30,7 +31,7 @@ export const docs = {
|
|
|
30
31
|
{
|
|
31
32
|
name: 'ratio',
|
|
32
33
|
type: 'number',
|
|
33
|
-
description: 'Aspect ratio as width/height (e.g. 16/9, 1).',
|
|
34
|
+
description: 'Aspect ratio as width/height (e.g. 16/9, 1). Emitted as a class-level declaration (never inline), so `xstyle` rules or unlayered consumer CSS can override it responsively.',
|
|
34
35
|
required: true,
|
|
35
36
|
},
|
|
36
37
|
{
|
|
@@ -83,6 +84,7 @@ export const docsZh = {
|
|
|
83
84
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
84
85
|
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
85
86
|
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
87
|
+
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule; component styles live in the `astryx-base` cascade layer, so unlayered consumer CSS wins. Give an `xstyle` rule a `default` branch alongside the conditional one (`{default: 3, \'@container ...\': \'3 / 2\'}`); with only the conditional branch the ratio is unset outside the query and the box collapses.'},
|
|
86
88
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
87
89
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
88
90
|
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
@@ -94,7 +96,7 @@ export const docsZh = {
|
|
|
94
96
|
],
|
|
95
97
|
},
|
|
96
98
|
props: [
|
|
97
|
-
{name: 'ratio', type: 'number', description: '宽高比,以宽/高表示(例如 16/9、1
|
|
99
|
+
{name: 'ratio', type: 'number', description: '宽高比,以宽/高表示(例如 16/9、1)。以类级声明输出(非内联样式),可通过 `xstyle` 规则或未分层的(unlayered)消费者 CSS 做响应式覆盖。', required: true},
|
|
98
100
|
{
|
|
99
101
|
name: 'shape',
|
|
100
102
|
type: "'rectangle' | 'ellipse'",
|
|
@@ -133,6 +135,7 @@ export const docsDense = {
|
|
|
133
135
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
134
136
|
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
135
137
|
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
138
|
+
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule; component styles live in the `astryx-base` cascade layer, so unlayered consumer CSS wins. Give an `xstyle` rule a `default` branch alongside the conditional one (`{default: 3, \'@container ...\': \'3 / 2\'}`); with only the conditional branch the ratio is unset outside the query and the box collapses.'},
|
|
136
139
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
137
140
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
138
141
|
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
@@ -144,7 +147,7 @@ export const docsDense = {
|
|
|
144
147
|
],
|
|
145
148
|
},
|
|
146
149
|
propDescriptions: {
|
|
147
|
-
ratio: 'width/height ratio (e.g. 16/9, 1)',
|
|
150
|
+
ratio: 'width/height ratio (e.g. 16/9, 1); class-level declaration (never inline) so xstyle/unlayered-CSS @container overrides win',
|
|
148
151
|
shape: "container shape: 'rectangle' (default) | 'ellipse' (circle at ratio 1)",
|
|
149
152
|
fit: "child layout: 'cover' fill+crop | 'contain' fill+letterbox | 'center' natural size; omitted = child styles itself",
|
|
150
153
|
children: 'content positioned absolutely to fill container',
|
|
@@ -13,6 +13,20 @@ import {describe, it, expect, vi, beforeAll} from 'vitest';
|
|
|
13
13
|
import {render, screen} from '@testing-library/react';
|
|
14
14
|
import {AspectRatio} from './AspectRatio';
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* The ratio compiles to a class-level `aspect-ratio: var(--x-aspectRatio)`
|
|
18
|
+
* declaration with the value carried by a CSS variable (so xstyle/@media
|
|
19
|
+
* and unlayered consumer CSS overrides can win). `--x-aspectRatio` is the
|
|
20
|
+
* debug-mode variable name emitted for the `aspectRatio` property.
|
|
21
|
+
*/
|
|
22
|
+
function ratioVar(el: HTMLElement): string {
|
|
23
|
+
return el.style.getPropertyValue('--x-aspectRatio');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function ratioValue(ratio: number): string {
|
|
27
|
+
return String(ratio);
|
|
28
|
+
}
|
|
29
|
+
|
|
16
30
|
describe('AspectRatio', () => {
|
|
17
31
|
it('renders with correct aspect ratio', () => {
|
|
18
32
|
render(
|
|
@@ -22,7 +36,7 @@ describe('AspectRatio', () => {
|
|
|
22
36
|
);
|
|
23
37
|
const element = screen.getByTestId('aspect-ratio');
|
|
24
38
|
expect(element).toBeInTheDocument();
|
|
25
|
-
expect(element
|
|
39
|
+
expect(ratioVar(element)).toBe(ratioValue(16 / 9));
|
|
26
40
|
});
|
|
27
41
|
|
|
28
42
|
it('children fill the container', () => {
|
|
@@ -47,7 +61,7 @@ describe('AspectRatio', () => {
|
|
|
47
61
|
</AspectRatio>,
|
|
48
62
|
);
|
|
49
63
|
const element = screen.getByTestId('aspect-ratio');
|
|
50
|
-
expect(element
|
|
64
|
+
expect(ratioVar(element)).toBe(ratioValue(ratio));
|
|
51
65
|
});
|
|
52
66
|
|
|
53
67
|
it('renders with 4:3 ratio', () => {
|
|
@@ -58,7 +72,7 @@ describe('AspectRatio', () => {
|
|
|
58
72
|
</AspectRatio>,
|
|
59
73
|
);
|
|
60
74
|
const element = screen.getByTestId('aspect-ratio');
|
|
61
|
-
expect(element
|
|
75
|
+
expect(ratioVar(element)).toBe(ratioValue(ratio));
|
|
62
76
|
});
|
|
63
77
|
|
|
64
78
|
it('renders with 1:1 square ratio', () => {
|
|
@@ -68,7 +82,7 @@ describe('AspectRatio', () => {
|
|
|
68
82
|
</AspectRatio>,
|
|
69
83
|
);
|
|
70
84
|
const element = screen.getByTestId('aspect-ratio');
|
|
71
|
-
expect(element
|
|
85
|
+
expect(ratioVar(element)).toBe(ratioValue(1));
|
|
72
86
|
});
|
|
73
87
|
|
|
74
88
|
it('renders with 21:9 ultrawide ratio', () => {
|
|
@@ -79,7 +93,7 @@ describe('AspectRatio', () => {
|
|
|
79
93
|
</AspectRatio>,
|
|
80
94
|
);
|
|
81
95
|
const element = screen.getByTestId('aspect-ratio');
|
|
82
|
-
expect(element
|
|
96
|
+
expect(ratioVar(element)).toBe(ratioValue(ratio));
|
|
83
97
|
});
|
|
84
98
|
|
|
85
99
|
it('renders an ellipse that respects the ratio (circle at 1:1)', () => {
|
|
@@ -89,7 +103,7 @@ describe('AspectRatio', () => {
|
|
|
89
103
|
</AspectRatio>,
|
|
90
104
|
);
|
|
91
105
|
const element = screen.getByTestId('aspect-ratio');
|
|
92
|
-
expect(element
|
|
106
|
+
expect(ratioVar(element)).toBe(ratioValue(1));
|
|
93
107
|
expect(element.className).toContain('ellipse');
|
|
94
108
|
});
|
|
95
109
|
|
|
@@ -101,7 +115,7 @@ describe('AspectRatio', () => {
|
|
|
101
115
|
);
|
|
102
116
|
const element = screen.getByTestId('aspect-ratio');
|
|
103
117
|
// Ratio is preserved — the ellipse does not force 1:1.
|
|
104
|
-
expect(element
|
|
118
|
+
expect(ratioVar(element)).toBe(ratioValue(16 / 9));
|
|
105
119
|
expect(element.className).toContain('ellipse');
|
|
106
120
|
});
|
|
107
121
|
|
|
@@ -112,7 +126,7 @@ describe('AspectRatio', () => {
|
|
|
112
126
|
</AspectRatio>,
|
|
113
127
|
);
|
|
114
128
|
const element = screen.getByTestId('aspect-ratio');
|
|
115
|
-
expect(element
|
|
129
|
+
expect(ratioVar(element)).toBe(ratioValue(1));
|
|
116
130
|
expect(element.className).toContain('rectangle');
|
|
117
131
|
// No ellipse border-radius when shape is the default rectangle
|
|
118
132
|
expect(element.style.borderRadius).toBe('');
|
|
@@ -177,6 +191,38 @@ describe('AspectRatio', () => {
|
|
|
177
191
|
expect(video).toBeInTheDocument();
|
|
178
192
|
});
|
|
179
193
|
|
|
194
|
+
describe('responsive ratio', () => {
|
|
195
|
+
it('emits the ratio as a class-level declaration, not an inline style', () => {
|
|
196
|
+
render(
|
|
197
|
+
<AspectRatio ratio={3 / 1} data-testid="aspect-ratio">
|
|
198
|
+
<div>Hero</div>
|
|
199
|
+
</AspectRatio>,
|
|
200
|
+
);
|
|
201
|
+
const element = screen.getByTestId('aspect-ratio');
|
|
202
|
+
// No inline aspect-ratio — the declaration lives in a class reading a
|
|
203
|
+
// CSS variable, so @media/@container rules (via xstyle, or via
|
|
204
|
+
// unlayered consumer CSS beating the astryx-base layer) can override
|
|
205
|
+
// it.
|
|
206
|
+
expect(element.style.aspectRatio).toBe('');
|
|
207
|
+
expect(ratioVar(element)).toBe(ratioValue(3 / 1));
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('lets a consumer inline style win over the class-level ratio', () => {
|
|
211
|
+
render(
|
|
212
|
+
<AspectRatio
|
|
213
|
+
ratio={3 / 1}
|
|
214
|
+
style={{aspectRatio: '3 / 2'}}
|
|
215
|
+
data-testid="aspect-ratio">
|
|
216
|
+
<div>Hero</div>
|
|
217
|
+
</AspectRatio>,
|
|
218
|
+
);
|
|
219
|
+
const element = screen.getByTestId('aspect-ratio');
|
|
220
|
+
// The consumer's style prop passes through untouched (it is no longer
|
|
221
|
+
// merged with a component-owned inline aspect-ratio).
|
|
222
|
+
expect(element.style.aspectRatio).toBe('3 / 2');
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
|
|
180
226
|
describe('fit', () => {
|
|
181
227
|
it('marks the child\'s direct parent with data-astryx-aspect-ratio-override for fit="cover"', () => {
|
|
182
228
|
render(
|
|
@@ -277,7 +323,7 @@ describe('AspectRatio', () => {
|
|
|
277
323
|
});
|
|
278
324
|
|
|
279
325
|
describe('style merging', () => {
|
|
280
|
-
it('keeps the consumer style and
|
|
326
|
+
it('keeps the consumer style and lets an inline ratio win', () => {
|
|
281
327
|
render(
|
|
282
328
|
<AspectRatio
|
|
283
329
|
ratio={16 / 9}
|
|
@@ -288,7 +334,8 @@ describe('AspectRatio', () => {
|
|
|
288
334
|
);
|
|
289
335
|
const element = screen.getByTestId('aspect-ratio');
|
|
290
336
|
expect(element.style.opacity).toBe('0.5');
|
|
291
|
-
expect(element.style.aspectRatio).toBe(
|
|
337
|
+
expect(element.style.aspectRatio).toBe('3 / 1');
|
|
338
|
+
expect(ratioVar(element)).toBe(ratioValue(16 / 9));
|
|
292
339
|
});
|
|
293
340
|
|
|
294
341
|
it('keeps a consumer className beside the theme target', () => {
|
|
@@ -43,6 +43,25 @@ export interface AspectRatioProps extends BaseProps<HTMLDivElement> {
|
|
|
43
43
|
ref?: React.Ref<HTMLDivElement>;
|
|
44
44
|
/**
|
|
45
45
|
* The aspect ratio as width/height (e.g., 16/9 = 1.777..., 4/3 = 1.333..., 1 for square).
|
|
46
|
+
*
|
|
47
|
+
* The ratio is emitted as a class-level declaration — never an inline
|
|
48
|
+
* style — so it can be made responsive:
|
|
49
|
+
* - StyleX consumers pass an `aspect-ratio` rule via `xstyle`, including
|
|
50
|
+
* under `@media`/`@container` conditions.
|
|
51
|
+
* - Plain-CSS/Tailwind consumers override `aspect-ratio` from their own
|
|
52
|
+
* (unlayered) rules: the compiled component styles live in the
|
|
53
|
+
* `astryx-base` cascade layer, and unlayered CSS wins over layered
|
|
54
|
+
* rules regardless of specificity.
|
|
55
|
+
*
|
|
56
|
+
* A responsive ratio is set in CSS, not on the component. For example, a 3:1
|
|
57
|
+
* hero can become 3:2 when its container narrows by targeting the element's
|
|
58
|
+
* class from a container query:
|
|
59
|
+
* `@container gallery (max-width: 720px) { .gallery-hero { aspect-ratio: 3 / 2; } }`.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```
|
|
63
|
+
* <AspectRatio ratio={3 / 1} className="gallery-hero">...</AspectRatio>
|
|
64
|
+
* ```
|
|
46
65
|
*/
|
|
47
66
|
ratio: number;
|
|
48
67
|
|
|
@@ -132,6 +151,20 @@ const styles = stylex.create({
|
|
|
132
151
|
},
|
|
133
152
|
});
|
|
134
153
|
|
|
154
|
+
// The ratio compiles to a CSS variable + a class-level declaration
|
|
155
|
+
// (aspect-ratio: var(--x)) instead of a raw inline style, so consumer
|
|
156
|
+
// overrides — `xstyle` rules, including ones inside @media/@container
|
|
157
|
+
// queries — can still win. A raw inline `aspect-ratio` would beat any class
|
|
158
|
+
// (same rationale as Grid's dynamic track values). Non-StyleX consumers
|
|
159
|
+
// don't need a dedicated hook: the compiled declaration sits in the
|
|
160
|
+
// `astryx-base` cascade layer, so any unlayered consumer rule wins
|
|
161
|
+
// regardless of specificity.
|
|
162
|
+
const dynamicStyles = stylex.create({
|
|
163
|
+
ratio: (ratio: number) => ({
|
|
164
|
+
aspectRatio: ratio,
|
|
165
|
+
}),
|
|
166
|
+
});
|
|
167
|
+
|
|
135
168
|
/**
|
|
136
169
|
* AspectRatio component for maintaining a specific aspect ratio for its children.
|
|
137
170
|
*
|
|
@@ -147,6 +180,11 @@ const styles = stylex.create({
|
|
|
147
180
|
* `ratio={1}` or an oval at other ratios. Both shapes respect the provided
|
|
148
181
|
* `ratio`.
|
|
149
182
|
*
|
|
183
|
+
* The ratio is a class-level declaration (not an inline style), so it can be
|
|
184
|
+
* overridden responsively — via `xstyle` for StyleX consumers, or with a
|
|
185
|
+
* plain unlayered `aspect-ratio` rule for plain-CSS consumers (component
|
|
186
|
+
* styles live in the `astryx-base` cascade layer, which unlayered CSS beats).
|
|
187
|
+
*
|
|
150
188
|
* Sizing: the box takes its width from its container and derives its height
|
|
151
189
|
* from the ratio, so it needs an ancestor with a definite width. Two
|
|
152
190
|
* consequences are worth knowing. Constraining only the height (`height` or
|
|
@@ -188,11 +226,12 @@ export function AspectRatio({
|
|
|
188
226
|
themeProps('aspect-ratio', {shape}),
|
|
189
227
|
stylex.props(
|
|
190
228
|
styles.container,
|
|
229
|
+
dynamicStyles.ratio(ratio),
|
|
191
230
|
shape === 'ellipse' && styles.ellipse,
|
|
192
231
|
xstyle,
|
|
193
232
|
),
|
|
194
233
|
className,
|
|
195
|
-
|
|
234
|
+
style,
|
|
196
235
|
)}
|
|
197
236
|
{...props}>
|
|
198
237
|
{/* The marker attribute carries the fit value so the reset.css child
|
|
@@ -19,7 +19,7 @@ export const docs = {
|
|
|
19
19
|
{guidance: true, description: 'Give every interactive avatar (href or onClick) a name or alt. It is the control\'s accessible name, and it warns in development when it is missing.'},
|
|
20
20
|
{guidance: false, description: 'Rely on a status label to name an interactive avatar. "Online" says nothing about where the link goes.'},
|
|
21
21
|
{guidance: false, description: 'Use Avatar for logos, product images, or anything that isn\'t a person or team. Use an image or icon instead.'},
|
|
22
|
-
{guidance: false, description: '
|
|
22
|
+
{guidance: false, description: 'Use xstyle or className to override shape. Use the shape prop instead so themes can control it globally.'},
|
|
23
23
|
],
|
|
24
24
|
anatomy: [
|
|
25
25
|
{name: 'Photo', required: false, description: 'The profile image, loaded from the src URL. Shown when available.'},
|
|
@@ -30,13 +30,17 @@ export const docs = {
|
|
|
30
30
|
},
|
|
31
31
|
theming: {
|
|
32
32
|
targets: [
|
|
33
|
-
{className: 'astryx-avatar', visualProps: ['size']},
|
|
33
|
+
{className: 'astryx-avatar', visualProps: ['size', 'shape']},
|
|
34
34
|
{className: 'astryx-avatar-fallback', visualProps: ['size']},
|
|
35
35
|
{className: 'astryx-avatar-status-dot', visualProps: ['variant']},
|
|
36
36
|
{className: 'astryx-avatar-status-dot-glyph', visualProps: ['shape']},
|
|
37
37
|
],
|
|
38
38
|
vars: [
|
|
39
39
|
{name: '--_avatar-group-overlap', description: 'Negative inline offset applied to every avatar after the first when avatars are stacked in an AvatarGroup. Set from the group size; a more negative value tightens the stack.', default: 'set at runtime from the group avatar size (px)', private: true},
|
|
40
|
+
{name: '--_avatar-radius', description: 'Border radius of the avatar wrapper, content, focus ring, and the AvatarGroupOverflow "+N" chip. Set per shape variant by shapeStyles.', default: 'var(--radius-full)', private: true},
|
|
41
|
+
],
|
|
42
|
+
derived: [
|
|
43
|
+
{property: 'borderRadius', vars: ['--_avatar-radius']},
|
|
40
44
|
],
|
|
41
45
|
},
|
|
42
46
|
description: 'Displays a user avatar with image, initials fallback, and optional status indicator.',
|
|
@@ -67,6 +71,12 @@ export const docs = {
|
|
|
67
71
|
description: "Avatar size. Use a named size ('xsm' 20px, 'sm' 24px, 'md' 36px, 'lg' 48px, 'xl' 128px) or a numeric pixel value. Avatar shares Icon's abbreviated scale, but its tiers are larger because avatars align with media rather than glyphs. Inside an AvatarGroup the group's size wins and this prop is ignored.",
|
|
68
72
|
default: "'md'",
|
|
69
73
|
},
|
|
74
|
+
{
|
|
75
|
+
name: 'shape',
|
|
76
|
+
type: "'circle' | 'rounded' | 'square'",
|
|
77
|
+
description: "Shape variant of the avatar. 'circle' (default) stays fully round. 'rounded' uses the element radius token so it matches UI corner rounding and can be set globally via theme. 'square' has no radius. Status dot positioning adapts automatically: 4-o'clock on circle, bottom-right corner on rounded/square.",
|
|
78
|
+
default: "'circle'",
|
|
79
|
+
},
|
|
70
80
|
{
|
|
71
81
|
name: 'status',
|
|
72
82
|
type: 'ReactNode',
|
|
@@ -148,7 +158,8 @@ export const docsDense = {
|
|
|
148
158
|
{guidance: true, description: 'Match size to context: xsm/sm inline, md/lg in lists, xl for profiles.'},
|
|
149
159
|
{guidance: true, description: 'Add a status dot in chat or team views where availability matters.'},
|
|
150
160
|
{guidance: true, description: 'When wrapping Avatar in your own Tooltip or HoverCard, set tooltip={false} so the built-in name tooltip does not overlap yours.'},
|
|
151
|
-
{guidance: true, description: 'Interactive avatars (href/onClick) need name or alt; without one they warn in development.
|
|
161
|
+
{guidance: true, description: 'Interactive avatars (href/onClick) need name or alt; without one they warn in development.'},
|
|
162
|
+
{guidance: false, description: 'Rely on a status label to name an interactive avatar. "Online" says nothing about where the link goes.'},
|
|
152
163
|
{guidance: false, description: 'Use for logos or product images. Use an image or icon instead.'},
|
|
153
164
|
{guidance: false, description: 'Force a square or custom shape. Avatars are always circular.'},
|
|
154
165
|
],
|
|
@@ -6,6 +6,7 @@ import {act, render, screen, fireEvent} from '@testing-library/react';
|
|
|
6
6
|
import userEvent from '@testing-library/user-event';
|
|
7
7
|
import {Avatar} from './Avatar';
|
|
8
8
|
import {AvatarStatusDot} from './AvatarStatusDot';
|
|
9
|
+
import {AvatarGroup} from '../AvatarGroup';
|
|
9
10
|
|
|
10
11
|
describe('Avatar', () => {
|
|
11
12
|
it('exposes role="img" with the name as accessible name', () => {
|
|
@@ -416,6 +417,85 @@ describe('Avatar', () => {
|
|
|
416
417
|
expect(img).toHaveAttribute('src', 'https://example.com/ada.jpg');
|
|
417
418
|
});
|
|
418
419
|
|
|
420
|
+
it('renders without error for all shape variants', () => {
|
|
421
|
+
const shapes = ['circle', 'rounded', 'square'] as const;
|
|
422
|
+
for (const shape of shapes) {
|
|
423
|
+
const {unmount} = render(
|
|
424
|
+
<Avatar
|
|
425
|
+
name="Ana Thomas"
|
|
426
|
+
shape={shape}
|
|
427
|
+
data-testid={`avatar-${shape}`}
|
|
428
|
+
/>,
|
|
429
|
+
);
|
|
430
|
+
expect(screen.getByTestId(`avatar-${shape}`)).toBeInTheDocument();
|
|
431
|
+
unmount();
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
it('defaults to circle shape (no shape prop)', () => {
|
|
436
|
+
render(<Avatar name="Lee" data-testid="avatar-default" />);
|
|
437
|
+
// Should still render with role="img" using the name as the accessible label.
|
|
438
|
+
expect(screen.getByRole('img', {name: 'Lee'})).toBeInTheDocument();
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
it('renders status dot for all shape variants', () => {
|
|
442
|
+
const shapes = ['circle', 'rounded', 'square'] as const;
|
|
443
|
+
const StatusDot = () => <span data-testid="status-dot" />;
|
|
444
|
+
for (const shape of shapes) {
|
|
445
|
+
const {unmount} = render(
|
|
446
|
+
<Avatar
|
|
447
|
+
name="Ana"
|
|
448
|
+
shape={shape}
|
|
449
|
+
status={<StatusDot />}
|
|
450
|
+
data-testid={`avatar-${shape}-status`}
|
|
451
|
+
/>,
|
|
452
|
+
);
|
|
453
|
+
expect(screen.getByTestId('status-dot')).toBeInTheDocument();
|
|
454
|
+
unmount();
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
it('applies shapeStyles to wrapper when rendered inside AvatarGroup', () => {
|
|
459
|
+
render(
|
|
460
|
+
<AvatarGroup>
|
|
461
|
+
<Avatar name="Alice" shape="rounded" data-testid="group-avatar" />
|
|
462
|
+
</AvatarGroup>,
|
|
463
|
+
);
|
|
464
|
+
expect(screen.getByTestId('group-avatar')).toBeInTheDocument();
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
it("an AvatarGroup's shape overrides an individual Avatar's own shape prop, matching how size already works", () => {
|
|
468
|
+
render(
|
|
469
|
+
<AvatarGroup shape="square">
|
|
470
|
+
<Avatar name="Alice" shape="rounded" data-testid="group-avatar" />
|
|
471
|
+
</AvatarGroup>,
|
|
472
|
+
);
|
|
473
|
+
expect(screen.getByTestId('group-avatar')).toHaveAttribute(
|
|
474
|
+
'data-shape',
|
|
475
|
+
'square',
|
|
476
|
+
);
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
it("an Avatar's own shape prop applies outside any AvatarGroup", () => {
|
|
480
|
+
render(<Avatar name="Ana" shape="rounded" data-testid="solo-avatar" />);
|
|
481
|
+
expect(screen.getByTestId('solo-avatar')).toHaveAttribute(
|
|
482
|
+
'data-shape',
|
|
483
|
+
'rounded',
|
|
484
|
+
);
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
it('defaults to circle shape inside an AvatarGroup with no explicit shape', () => {
|
|
488
|
+
render(
|
|
489
|
+
<AvatarGroup>
|
|
490
|
+
<Avatar name="Alice" shape="square" data-testid="group-avatar" />
|
|
491
|
+
</AvatarGroup>,
|
|
492
|
+
);
|
|
493
|
+
expect(screen.getByTestId('group-avatar')).toHaveAttribute(
|
|
494
|
+
'data-shape',
|
|
495
|
+
'circle',
|
|
496
|
+
);
|
|
497
|
+
});
|
|
498
|
+
|
|
419
499
|
// --- Name tooltip (tooltip?: string | boolean) ---
|
|
420
500
|
describe('name tooltip', () => {
|
|
421
501
|
const originalShowPopover = HTMLElement.prototype.showPopover;
|
|
@@ -569,6 +649,23 @@ describe('Avatar', () => {
|
|
|
569
649
|
render(<Avatar name="Ada Lovelace" ref={ref} data-testid="a" />);
|
|
570
650
|
expect(ref.current).toBe(screen.getByTestId('a'));
|
|
571
651
|
});
|
|
652
|
+
|
|
653
|
+
it('keeps its merged ref attached across unrelated rerenders', () => {
|
|
654
|
+
const ref = vi.fn();
|
|
655
|
+
const {rerender} = render(
|
|
656
|
+
<Avatar name="Ada Lovelace" size="sm" tooltip={false} ref={ref} />,
|
|
657
|
+
);
|
|
658
|
+
const avatar = screen.getByRole('img', {name: 'Ada Lovelace'});
|
|
659
|
+
expect(ref).toHaveBeenLastCalledWith(avatar);
|
|
660
|
+
ref.mockClear();
|
|
661
|
+
|
|
662
|
+
rerender(
|
|
663
|
+
<Avatar name="Ada Lovelace" size="lg" tooltip={false} ref={ref} />,
|
|
664
|
+
);
|
|
665
|
+
|
|
666
|
+
expect(ref).not.toHaveBeenCalled();
|
|
667
|
+
expect(screen.getByRole('img', {name: 'Ada Lovelace'})).toBe(avatar);
|
|
668
|
+
});
|
|
572
669
|
});
|
|
573
670
|
});
|
|
574
671
|
|