@astryxdesign/core 0.4.7 → 0.5.0-canary.055e75f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +161 -1
- package/dist/AlertDialog/AlertDialog.d.ts +1 -1
- package/dist/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/AlertDialog/AlertDialog.js +45 -20
- package/dist/AppShell/AppShell.d.ts.map +1 -1
- package/dist/AppShell/AppShell.js +3 -2
- package/dist/AspectRatio/AspectRatio.d.ts +24 -0
- package/dist/AspectRatio/AspectRatio.d.ts.map +1 -1
- package/dist/AspectRatio/AspectRatio.js +23 -4
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +58 -19
- package/dist/Avatar/index.d.ts +2 -2
- package/dist/Avatar/index.d.ts.map +1 -1
- package/dist/Avatar/index.js +1 -1
- package/dist/AvatarGroup/AvatarGroup.d.ts +9 -2
- package/dist/AvatarGroup/AvatarGroup.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroup.js +8 -4
- package/dist/AvatarGroup/AvatarGroupContext.d.ts +2 -1
- package/dist/AvatarGroup/AvatarGroupContext.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.d.ts.map +1 -1
- package/dist/AvatarGroup/AvatarGroupOverflow.js +10 -6
- package/dist/Banner/Banner.d.ts +40 -15
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +51 -18
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +17 -4
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +3 -2
- package/dist/Breadcrumbs/BreadcrumbItem.d.ts.map +1 -1
- package/dist/Breadcrumbs/BreadcrumbItem.js +11 -10
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -6
- package/dist/ButtonGroup/ButtonGroup.d.ts +5 -1
- package/dist/ButtonGroup/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup/ButtonGroup.js +26 -7
- package/dist/Calendar/Calendar.d.ts +3 -1
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +14 -15
- package/dist/Calendar/getInitialFocusDate.d.ts +46 -0
- package/dist/Calendar/getInitialFocusDate.d.ts.map +1 -0
- package/dist/Calendar/getInitialFocusDate.js +62 -0
- package/dist/Calendar/styles.d.ts +5 -14
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -15
- package/dist/Card/Card.d.ts +6 -9
- package/dist/Card/Card.d.ts.map +1 -1
- package/dist/Card/Card.js +6 -6
- package/dist/Carousel/Carousel.d.ts.map +1 -1
- package/dist/Carousel/Carousel.js +3 -3
- package/dist/Chat/ChatComposerInput.d.ts.map +1 -1
- package/dist/Chat/ChatComposerInput.js +2 -3
- package/dist/Chat/ChatLayout.d.ts.map +1 -1
- package/dist/Chat/ChatLayout.js +3 -3
- package/dist/Chat/ChatMessageList.d.ts +22 -3
- package/dist/Chat/ChatMessageList.d.ts.map +1 -1
- package/dist/Chat/ChatMessageList.js +6 -3
- package/dist/Chat/ChatTokenizedText.d.ts +2 -0
- package/dist/Chat/ChatTokenizedText.d.ts.map +1 -1
- package/dist/Chat/ChatTokenizedText.js +11 -6
- package/dist/Chat/useChatComposerTokens.js +1 -1
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +10 -3
- package/dist/ClickableCard/ClickableCard.d.ts.map +1 -1
- package/dist/ClickableCard/ClickableCard.js +3 -3
- package/dist/CodeBlock/CodeBlock.d.ts.map +1 -1
- package/dist/CodeBlock/CodeBlock.js +15 -4
- package/dist/CodeBlock/highlightRanges.js +1 -1
- package/dist/CodeBlock/highlightStyles.js +13 -13
- package/dist/CommandPalette/CommandPaletteInput.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteInput.js +3 -2
- package/dist/CommandPalette/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +3 -2
- package/dist/ContextMenu/ContextMenu.d.ts.map +1 -1
- package/dist/ContextMenu/ContextMenu.js +4 -3
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -2
- package/dist/DateInput/NativeDateField.d.ts +10 -0
- package/dist/DateInput/NativeDateField.d.ts.map +1 -0
- package/dist/DateInput/NativeDateField.js +494 -0
- package/dist/DateInput/TouchDateField.d.ts.map +1 -1
- package/dist/DateInput/TouchDateField.js +82 -23
- package/dist/DateInput/index.d.ts +1 -1
- package/dist/DateInput/index.d.ts.map +1 -1
- package/dist/DateInput/nativeDateSegments.d.ts +22 -0
- package/dist/DateInput/nativeDateSegments.d.ts.map +1 -0
- package/dist/DateInput/nativeDateSegments.js +111 -0
- package/dist/DateTimeInput/DateTimeInput.d.ts +21 -1
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +406 -12
- package/dist/DateTimeInput/index.d.ts +1 -1
- package/dist/DateTimeInput/index.d.ts.map +1 -1
- package/dist/Dialog/Dialog.d.ts +21 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +110 -58
- package/dist/DropdownMenu/DropdownMenuSubMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenuSubMenu.js +6 -5
- package/dist/Field/FieldLabel.d.ts.map +1 -1
- package/dist/Field/FieldLabel.js +9 -1
- package/dist/FileInput/FileInput.d.ts.map +1 -1
- package/dist/FileInput/FileInput.js +3 -2
- package/dist/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +6 -2
- package/dist/HoverCard/HoverCard.d.ts +6 -0
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +19 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +74 -26
- package/dist/Indicator/CheckboxIndicator.d.ts.map +1 -1
- package/dist/Indicator/CheckboxIndicator.js +6 -2
- package/dist/Item/Item.d.ts.map +1 -1
- package/dist/Item/Item.js +4 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -19
- package/dist/Layer/LayerDepthContext.d.ts +52 -0
- package/dist/Layer/LayerDepthContext.d.ts.map +1 -0
- package/dist/Layer/LayerDepthContext.js +66 -0
- package/dist/Layer/index.d.ts +3 -0
- package/dist/Layer/index.d.ts.map +1 -1
- package/dist/Layer/index.js +4 -0
- package/dist/Layer/layerStack.d.ts +98 -0
- package/dist/Layer/layerStack.d.ts.map +1 -0
- package/dist/Layer/layerStack.js +306 -0
- package/dist/Layer/useLayerDismissal.d.ts +93 -0
- package/dist/Layer/useLayerDismissal.d.ts.map +1 -0
- package/dist/Layer/useLayerDismissal.js +91 -0
- package/dist/Lightbox/Lightbox.d.ts +1 -0
- package/dist/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/Lightbox/Lightbox.js +103 -81
- package/dist/Markdown/Markdown.d.ts.map +1 -1
- package/dist/Markdown/Markdown.js +9 -4
- package/dist/Markdown/index.d.ts +1 -1
- package/dist/Markdown/index.d.ts.map +1 -1
- package/dist/Markdown/parser.d.ts +38 -1
- package/dist/Markdown/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +182 -32
- package/dist/MobileNav/MobileNav.d.ts +6 -1
- package/dist/MobileNav/MobileNav.d.ts.map +1 -1
- package/dist/MobileNav/MobileNav.js +61 -36
- package/dist/MultiSelector/MultiSelector.d.ts +32 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +63 -11
- package/dist/MultiSelector/index.d.ts +1 -1
- package/dist/MultiSelector/index.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +3 -2
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +54 -104
- package/dist/NumberInput/numberInputCommit.d.ts +34 -0
- package/dist/NumberInput/numberInputCommit.d.ts.map +1 -0
- package/dist/NumberInput/numberInputCommit.js +71 -0
- package/dist/NumberInput/numberParser.d.ts +64 -0
- package/dist/NumberInput/numberParser.d.ts.map +1 -0
- package/dist/NumberInput/numberParser.js +350 -0
- package/dist/Outline/Outline.d.ts.map +1 -1
- package/dist/Outline/Outline.js +3 -2
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +3 -2
- package/dist/Overlay/Overlay.d.ts.map +1 -1
- package/dist/Overlay/Overlay.js +3 -2
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +20 -17
- package/dist/PowerSearch/PowerSearch.d.ts +8 -2
- package/dist/PowerSearch/PowerSearch.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearch.js +19 -6
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchEditPopover.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchEditPopover.js +28 -6
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts +3 -1
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +110 -27
- package/dist/PowerSearch/types.d.ts +2 -0
- package/dist/PowerSearch/types.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts +6 -1
- package/dist/PowerSearch/usePowerSearchSource.d.ts.map +1 -1
- package/dist/PowerSearch/usePowerSearchSource.js +14 -5
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/ResizeHandle.d.ts.map +1 -1
- package/dist/Resizable/ResizeHandle.js +3 -2
- package/dist/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/SegmentedControl/SegmentedControl.js +3 -2
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +3 -3
- package/dist/Selector/Selector.d.ts +17 -0
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +81 -14
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +4 -3
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +8 -7
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +4 -3
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +37 -5
- package/dist/Spinner/Spinner.d.ts +3 -3
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +130 -78
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts +140 -0
- package/dist/Stepper/Step.d.ts.map +1 -0
- package/dist/Stepper/Step.js +1045 -0
- package/dist/Stepper/StepStatus.d.ts +24 -0
- package/dist/Stepper/StepStatus.d.ts.map +1 -0
- package/dist/Stepper/StepStatus.js +1 -0
- package/dist/Stepper/Stepper.d.ts +93 -0
- package/dist/Stepper/Stepper.d.ts.map +1 -0
- package/dist/Stepper/Stepper.js +184 -0
- package/dist/Stepper/StepperContext.d.ts +41 -0
- package/dist/Stepper/StepperContext.d.ts.map +1 -0
- package/dist/Stepper/StepperContext.js +34 -0
- package/dist/Stepper/index.d.ts +8 -0
- package/dist/Stepper/index.d.ts.map +1 -0
- package/dist/Stepper/index.js +7 -0
- package/dist/Stepper/stepper.stylex.d.ts +15 -0
- package/dist/Stepper/stepper.stylex.d.ts.map +1 -0
- package/dist/Stepper/stepper.stylex.js +20 -0
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +8 -3
- package/dist/TabList/Tab.d.ts +15 -2
- package/dist/TabList/Tab.d.ts.map +1 -1
- package/dist/TabList/Tab.js +32 -7
- package/dist/TabList/TabList.d.ts +46 -7
- package/dist/TabList/TabList.d.ts.map +1 -1
- package/dist/TabList/TabList.js +353 -23
- package/dist/TabList/TabListContext.d.ts +11 -1
- package/dist/TabList/TabListContext.d.ts.map +1 -1
- package/dist/TabList/TabListContext.js +11 -2
- package/dist/TabList/TabMenu.d.ts.map +1 -1
- package/dist/TabList/TabMenu.js +3 -2
- package/dist/TabList/index.d.ts +2 -2
- package/dist/TabList/index.d.ts.map +1 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +10 -2
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- package/dist/Table/TableRow.d.ts +16 -5
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js +16 -5
- package/dist/Table/plugins/filtering/useTableFiltering.d.ts.map +1 -1
- package/dist/Table/plugins/filtering/useTableFiltering.js +73 -4
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.d.ts.map +1 -1
- package/dist/Table/plugins/groupedRows/useTableGroupedRows.js +20 -8
- package/dist/Table/plugins/pagination/useTablePagination.d.ts +3 -0
- package/dist/Table/plugins/pagination/useTablePagination.d.ts.map +1 -1
- package/dist/Table/plugins/pagination/useTablePagination.js +21 -4
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.d.ts.map +1 -1
- package/dist/Table/plugins/rowExpansion/useTableRowExpansion.js +7 -2
- package/dist/Table/plugins/rowStatus/useTableRowStatus.d.ts.map +1 -1
- package/dist/Table/plugins/rowStatus/useTableRowStatus.js +10 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts +16 -0
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +19 -5
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Table/types.d.ts +22 -4
- package/dist/Table/types.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.d.ts.map +1 -1
- package/dist/Table/useBaseTablePlugins.js +5 -0
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +6 -2
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +9 -3
- package/dist/TextInput/TextInput.d.ts.map +1 -1
- package/dist/TextInput/TextInput.js +3 -2
- package/dist/TimeInput/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput/TimeInput.js +3 -2
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +5 -3
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +27 -8
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +2 -2
- package/dist/Tokenizer/Tokenizer.d.ts +3 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +2 -0
- package/dist/Tooltip/Tooltip.d.ts +5 -0
- package/dist/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.d.ts +5 -0
- package/dist/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/Tooltip/useTooltip.js +39 -24
- package/dist/TopNav/TopNavHeading.d.ts.map +1 -1
- package/dist/TopNav/TopNavHeading.js +5 -4
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +4 -3
- package/dist/Typeahead/BaseTypeahead.d.ts +2 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +68 -29
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +3 -2
- package/dist/astryx.css +98 -7
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useFocusTrap.d.ts +7 -4
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +60 -95
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -18
- package/dist/hooks/useMergedRefs.d.ts +18 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +25 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/theme/derivedVarRegistry.d.ts.map +1 -1
- package/dist/theme/derivedVarRegistry.js +24 -4
- package/dist/theme/syntax/tokens.d.ts +1 -1
- package/dist/theme/syntax/tokens.d.ts.map +1 -1
- package/dist/theme/syntax/tokens.js +5 -2
- package/dist/utils/groupItems.d.ts +5 -1
- package/dist/utils/groupItems.d.ts.map +1 -1
- package/dist/utils/groupItems.js +9 -9
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/isApplePlatform.d.ts +18 -0
- package/dist/utils/isApplePlatform.d.ts.map +1 -0
- package/dist/utils/isApplePlatform.js +37 -0
- package/dist/utils/sharedResizeObserver.d.ts.map +1 -1
- package/dist/utils/sharedResizeObserver.js +10 -1
- package/dist/utils/timeParser.d.ts +1 -1
- package/dist/utils/timeParser.d.ts.map +1 -1
- package/dist/utils/timeParser.js +26 -12
- package/locales/en.json +154 -10
- package/locales/pseudo.json +108 -0
- package/package.json +8 -3
- package/src/AlertDialog/AlertDialog.doc.mjs +114 -30
- package/src/AlertDialog/AlertDialog.test.tsx +211 -2
- package/src/AlertDialog/AlertDialog.tsx +62 -20
- package/src/AppShell/AppShell.tsx +3 -2
- package/src/AspectRatio/AspectRatio.doc.mjs +6 -3
- package/src/AspectRatio/AspectRatio.test.tsx +57 -10
- package/src/AspectRatio/AspectRatio.tsx +40 -1
- package/src/Avatar/Avatar.doc.mjs +14 -3
- package/src/Avatar/Avatar.test.tsx +97 -0
- package/src/Avatar/Avatar.tsx +125 -52
- package/src/Avatar/index.ts +2 -2
- package/src/AvatarGroup/AvatarGroup.doc.mjs +8 -2
- package/src/AvatarGroup/AvatarGroup.test.tsx +24 -0
- package/src/AvatarGroup/AvatarGroup.tsx +15 -6
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +10 -4
- package/src/Banner/Banner.doc.mjs +13 -11
- package/src/Banner/Banner.test.tsx +102 -15
- package/src/Banner/Banner.tsx +72 -25
- package/src/BottomSheet/BottomSheet.test.tsx +123 -0
- package/src/BottomSheet/BottomSheet.tsx +17 -4
- package/src/BottomSheet/BottomSheetSwitcher.tsx +3 -2
- package/src/Breadcrumbs/BreadcrumbItem.tsx +9 -5
- package/src/Button/Button.doc.mjs +24 -1
- package/src/Button/Button.test.tsx +32 -4
- package/src/Button/Button.tsx +12 -5
- package/src/ButtonGroup/ButtonGroup.doc.mjs +10 -1
- package/src/ButtonGroup/ButtonGroup.test.tsx +404 -1
- package/src/ButtonGroup/ButtonGroup.tsx +23 -5
- package/src/Calendar/Calendar.doc.mjs +4 -3
- package/src/Calendar/Calendar.test.tsx +103 -0
- package/src/Calendar/Calendar.tsx +19 -16
- package/src/Calendar/getInitialFocusDate.test.ts +94 -0
- package/src/Calendar/getInitialFocusDate.ts +93 -0
- package/src/Calendar/styles.ts +49 -31
- package/src/Card/Card.doc.mjs +10 -7
- package/src/Card/Card.test.tsx +44 -19
- package/src/Card/Card.tsx +12 -32
- package/src/Carousel/Carousel.tsx +3 -2
- package/src/Chat/ChatComposerInput.tsx +5 -1
- package/src/Chat/ChatLayout.tsx +3 -2
- package/src/Chat/ChatMessageList.doc.mjs +9 -1
- package/src/Chat/ChatMessageList.test.tsx +46 -0
- package/src/Chat/ChatMessageList.tsx +28 -4
- package/src/Chat/ChatTokenizedText.tsx +17 -10
- package/src/Chat/useChatComposerTokens.ts +1 -1
- package/src/CheckboxInput/CheckboxInput.doc.mjs +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +8 -2
- package/src/ClickableCard/ClickableCard.tsx +3 -2
- package/src/CodeBlock/CodeBlock.doc.mjs +16 -4
- package/src/CodeBlock/CodeBlock.test.tsx +37 -0
- package/src/CodeBlock/CodeBlock.tsx +20 -4
- package/src/CodeBlock/highlightRanges.ts +1 -1
- package/src/CodeBlock/highlightStyles.ts +13 -13
- package/src/CommandPalette/CommandPaletteInput.tsx +3 -2
- package/src/CommandPalette/CommandPaletteItem.tsx +3 -2
- package/src/ContextMenu/ContextMenu.doc.mjs +5 -0
- package/src/ContextMenu/ContextMenu.tsx +4 -3
- package/src/DateInput/DateInput.doc.mjs +16 -0
- package/src/DateInput/DateInput.tsx +55 -2
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +108 -24
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateTimeInput/DateTimeInput.doc.mjs +18 -0
- package/src/DateTimeInput/DateTimeInput.test.tsx +1088 -0
- package/src/DateTimeInput/DateTimeInput.tsx +556 -24
- package/src/DateTimeInput/index.ts +1 -0
- package/src/Dialog/Dialog.doc.mjs +8 -3
- package/src/Dialog/Dialog.test.tsx +429 -2
- package/src/Dialog/Dialog.tsx +133 -58
- package/src/DropdownMenu/DropdownMenu.doc.mjs +6 -0
- package/src/DropdownMenu/DropdownMenuSubMenu.test.tsx +8 -5
- package/src/DropdownMenu/DropdownMenuSubMenu.tsx +8 -11
- package/src/Field/Field.doc.mjs +13 -2
- package/src/Field/FieldLabel.test.tsx +29 -0
- package/src/Field/FieldLabel.tsx +7 -0
- package/src/FileInput/FileInput.tsx +3 -2
- package/src/Heading/Heading.test.tsx +23 -1
- package/src/Heading/Heading.tsx +6 -2
- package/src/HoverCard/HoverCard.doc.mjs +13 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +143 -3
- package/src/HoverCard/useHoverCard.tsx +104 -33
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +2 -0
- package/src/Item/Item.tsx +5 -4
- package/src/Kbd/Kbd.tsx +2 -19
- package/src/Layer/LayerDepthContext.tsx +62 -0
- package/src/Layer/index.ts +9 -0
- package/src/Layer/layerDismissalFamilies.test.tsx +359 -0
- package/src/Layer/layerDismissalInvariants.test.tsx +417 -0
- package/src/Layer/layerStack.ts +362 -0
- package/src/Layer/useLayer.test.tsx +62 -14
- package/src/Layer/useLayerDismissal.test.tsx +469 -0
- package/src/Layer/useLayerDismissal.ts +173 -0
- package/src/Layout/Layout.doc.mjs +2 -2
- package/src/Lightbox/Lightbox.doc.mjs +12 -0
- package/src/Lightbox/Lightbox.tsx +124 -102
- package/src/Link/Link.doc.mjs +39 -0
- package/src/Markdown/Markdown.doc.mjs +5 -0
- package/src/Markdown/Markdown.tsx +9 -4
- package/src/Markdown/incremental.test.ts +16 -2
- package/src/Markdown/index.ts +1 -0
- package/src/Markdown/parser.perf.test.ts +96 -1
- package/src/Markdown/parser.test.ts +178 -2
- package/src/Markdown/parser.ts +253 -32
- package/src/MobileNav/MobileNav.tsx +62 -36
- package/src/MoreMenu/MoreMenu.doc.mjs +7 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +49 -1
- package/src/MultiSelector/MultiSelector.test.tsx +277 -0
- package/src/MultiSelector/MultiSelector.tsx +142 -11
- package/src/MultiSelector/index.ts +1 -0
- package/src/NavIcon/NavIcon.doc.mjs +8 -2
- package/src/NavIcon/NavIcon.test.tsx +9 -0
- package/src/NavIcon/NavIcon.tsx +5 -1
- package/src/NavMenu/NavHeadingMenu.tsx +3 -2
- package/src/NumberInput/NumberInput.doc.mjs +31 -7
- package/src/NumberInput/NumberInput.test.tsx +436 -8
- package/src/NumberInput/NumberInput.tsx +62 -114
- package/src/NumberInput/numberInputCommit.test.ts +72 -0
- package/src/NumberInput/numberInputCommit.ts +103 -0
- package/src/NumberInput/numberParser.docblock.test.ts +234 -0
- package/src/NumberInput/numberParser.test.ts +222 -0
- package/src/NumberInput/numberParser.ts +403 -0
- package/src/Outline/Outline.tsx +3 -2
- package/src/OverflowList/OverflowList.tsx +3 -2
- package/src/Overlay/Overlay.tsx +3 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/usePopover.tsx +31 -28
- package/src/PowerSearch/PowerSearch.doc.mjs +160 -28
- package/src/PowerSearch/PowerSearch.test.tsx +240 -1
- package/src/PowerSearch/PowerSearch.tsx +34 -5
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +288 -0
- package/src/PowerSearch/PowerSearchEditPopover.tsx +29 -2
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +111 -1
- package/src/PowerSearch/PowerSearchValueEditor.tsx +124 -10
- package/src/PowerSearch/types.ts +2 -0
- package/src/PowerSearch/usePowerSearchSource.test.ts +82 -2
- package/src/PowerSearch/usePowerSearchSource.ts +13 -3
- package/src/ProgressBar/ProgressBar.doc.mjs +42 -6
- package/src/ProgressBar/ProgressBar.test.tsx +24 -0
- package/src/ProgressBar/ProgressBar.tsx +28 -8
- package/src/Resizable/ResizeHandle.tsx +3 -2
- package/src/SegmentedControl/SegmentedControl.tsx +3 -2
- package/src/SelectableCard/SelectableCard.tsx +3 -2
- package/src/Selector/Selector.doc.mjs +26 -1
- package/src/Selector/Selector.test.tsx +311 -1
- package/src/Selector/Selector.tsx +139 -16
- package/src/SideNav/SideNav.doc.mjs +6 -6
- package/src/SideNav/SideNav.tsx +4 -2
- package/src/SideNav/SideNavHeading.tsx +12 -12
- package/src/SideNav/SideNavItem.tsx +4 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +55 -3
- package/src/Spinner/Spinner.test.tsx +147 -1
- package/src/Spinner/Spinner.tsx +120 -101
- package/src/StatusDot/StatusDot.doc.mjs +8 -2
- package/src/StatusDot/StatusDot.test.tsx +9 -0
- package/src/StatusDot/StatusDot.tsx +7 -1
- package/src/Stepper/Step.doc.mjs +98 -0
- package/src/Stepper/Step.tsx +1638 -0
- package/src/Stepper/StepStatus.ts +26 -0
- package/src/Stepper/Stepper.doc.mjs +370 -0
- package/src/Stepper/Stepper.test.tsx +1024 -0
- package/src/Stepper/Stepper.tsx +258 -0
- package/src/Stepper/StepperContext.ts +71 -0
- package/src/Stepper/index.ts +18 -0
- package/src/Stepper/stepper.stylex.ts +19 -0
- package/src/Switch/Switch.doc.mjs +2 -0
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +6 -2
- package/src/TabList/Tab.doc.mjs +13 -1
- package/src/TabList/Tab.tsx +67 -7
- package/src/TabList/TabList.doc.mjs +22 -6
- package/src/TabList/TabList.test.tsx +559 -0
- package/src/TabList/TabList.tsx +490 -22
- package/src/TabList/TabListContext.ts +13 -2
- package/src/TabList/TabMenu.tsx +3 -2
- package/src/TabList/index.ts +6 -2
- package/src/Table/BaseTable.tsx +12 -4
- package/src/Table/Table.doc.mjs +9 -2
- package/src/Table/Table.test.tsx +132 -14
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +40 -0
- package/src/Table/TableFooter.doc.mjs +40 -0
- package/src/Table/TableHeader.doc.mjs +40 -0
- package/src/Table/TableRow.tsx +16 -5
- package/src/Table/plugins/filtering/useTableFiltering.test.tsx +44 -6
- package/src/Table/plugins/filtering/useTableFiltering.tsx +100 -4
- package/src/Table/plugins/groupedRows/useTableGroupedRows-perf.test.tsx +112 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.test.tsx +100 -0
- package/src/Table/plugins/groupedRows/useTableGroupedRows.tsx +17 -8
- package/src/Table/plugins/pagination/useTablePagination.test.tsx +34 -4
- package/src/Table/plugins/pagination/useTablePagination.tsx +35 -3
- package/src/Table/plugins/rowExpansion/useTableRowExpansion.tsx +9 -2
- package/src/Table/plugins/rowStatus/useTableRowStatus.test.tsx +13 -7
- package/src/Table/plugins/rowStatus/useTableRowStatus.tsx +12 -3
- package/src/Table/plugins/selection/useTableSelection.test.tsx +76 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +40 -7
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/types.ts +22 -4
- package/src/Table/useBaseTablePlugins.ts +5 -0
- package/src/Table/useTableGroupedRows.doc.mjs +5 -4
- package/src/Table/useTablePagination.doc.mjs +7 -0
- package/src/Table/useTableRowStatus.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +31 -0
- package/src/Text/Text.test.tsx +23 -1
- package/src/Text/Text.tsx +6 -2
- package/src/TextArea/TextArea.doc.mjs +8 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +15 -8
- package/src/TextInput/TextInput.doc.mjs +10 -0
- package/src/TextInput/TextInput.tsx +3 -2
- package/src/Thumbnail/Thumbnail.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.tsx +2 -2
- package/src/Timestamp/Timestamp.test.tsx +18 -0
- package/src/Timestamp/Timestamp.tsx +4 -2
- package/src/Toast/Toast.doc.mjs +6 -0
- package/src/Toast/ToastViewport.tsx +17 -1
- package/src/Token/TokenLink.tsx +2 -2
- package/src/Tokenizer/Tokenizer.doc.mjs +27 -0
- package/src/Tokenizer/Tokenizer.tsx +4 -0
- package/src/Toolbar/Toolbar.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.doc.mjs +5 -0
- package/src/Tooltip/Tooltip.test.tsx +32 -0
- package/src/Tooltip/Tooltip.tsx +5 -0
- package/src/Tooltip/useTooltip.tsx +47 -24
- package/src/TopNav/TopNavHeading.tsx +5 -4
- package/src/TopNav/TopNavMegaMenu.tsx +3 -2
- package/src/TopNav/TopNavMenu.tsx +4 -3
- package/src/Typeahead/BaseTypeahead.doc.mjs +11 -0
- package/src/Typeahead/BaseTypeahead.tsx +85 -33
- package/src/Typeahead/Typeahead.doc.mjs +5 -0
- package/src/Typeahead/Typeahead.test.tsx +49 -0
- package/src/Typeahead/Typeahead.tsx +3 -2
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useContainerReveal.doc.mjs +2 -2
- package/src/hooks/useFocusTrap.test.tsx +14 -0
- package/src/hooks/useFocusTrap.ts +62 -111
- package/src/hooks/useFocusTrapEscapeShim.test.tsx +165 -0
- package/src/hooks/useHotkeys.ts +3 -18
- package/src/hooks/useMergedRefs.doc.mjs +79 -0
- package/src/hooks/useMergedRefs.test.tsx +62 -0
- package/src/hooks/useMergedRefs.ts +36 -0
- package/src/index.ts +1 -0
- package/src/raw-import.d.ts +14 -0
- package/src/theme/MediaTheme.doc.mjs +5 -5
- package/src/theme/derivedVarRegistry.test.ts +19 -3
- package/src/theme/derivedVarRegistry.ts +23 -4
- package/src/theme/generateThemeRules.test.ts +37 -0
- package/src/theme/syntax/tokens.ts +5 -2
- package/src/utils/groupItems.ts +12 -6
- package/src/utils/index.ts +1 -1
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/sharedResizeObserver.ts +10 -2
- package/src/utils/timeParser.test.ts +6 -1
- package/src/utils/timeParser.ts +35 -13
- package/src/__tests__/inputWidthContract.test.tsx +0 -69
package/src/Avatar/Avatar.tsx
CHANGED
|
@@ -19,7 +19,14 @@
|
|
|
19
19
|
* Last synced props: alt, fallbackSrc, name, size, src, status, href, as, target, rel, onClick
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import {
|
|
22
|
+
import {
|
|
23
|
+
isValidElement,
|
|
24
|
+
useCallback,
|
|
25
|
+
useMemo,
|
|
26
|
+
useRef,
|
|
27
|
+
useState,
|
|
28
|
+
type ReactNode,
|
|
29
|
+
} from 'react';
|
|
23
30
|
import type {BaseProps} from '../BaseProps';
|
|
24
31
|
import * as stylex from '@stylexjs/stylex';
|
|
25
32
|
import {
|
|
@@ -34,7 +41,8 @@ import {
|
|
|
34
41
|
type AvatarStatusLabelTarget,
|
|
35
42
|
} from './AvatarStatusLabelContext';
|
|
36
43
|
import {useAvatarGroup} from '../AvatarGroup/AvatarGroupContext';
|
|
37
|
-
import {mergeProps
|
|
44
|
+
import {mergeProps} from '../utils';
|
|
45
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
38
46
|
import {themeProps} from '../utils/themeProps';
|
|
39
47
|
import {firstCharacter} from '../utils/characters';
|
|
40
48
|
import {focusOutlineProps} from '../utils/focusOutline.stylex';
|
|
@@ -89,6 +97,11 @@ type AvatarNumericSize =
|
|
|
89
97
|
*/
|
|
90
98
|
export type AvatarSize = AvatarNamedSize | AvatarNumericSize;
|
|
91
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Avatar shape options
|
|
102
|
+
*/
|
|
103
|
+
export type AvatarShape = 'circle' | 'rounded' | 'square';
|
|
104
|
+
|
|
92
105
|
/**
|
|
93
106
|
* Resolves named sizes to their numeric pixel values
|
|
94
107
|
*/
|
|
@@ -110,6 +123,25 @@ export function resolveSize(size: AvatarSize): number {
|
|
|
110
123
|
}
|
|
111
124
|
}
|
|
112
125
|
|
|
126
|
+
// Sets one local custom property rather than `borderRadius` directly, so
|
|
127
|
+
// every clipping/ring surface that needs the shape's radius (the wrapper,
|
|
128
|
+
// the interactive focus ring, the content div that actually clips via
|
|
129
|
+
// `overflow: hidden`, and AvatarGroupOverflow's "+N" indicator) reads the
|
|
130
|
+
// same value instead of each hardcoding its own borderRadius independently.
|
|
131
|
+
// A theme override only has to reach this one property, not fight the
|
|
132
|
+
// per-surface StyleX class order to change the shape everywhere at once.
|
|
133
|
+
export const shapeStyles = stylex.create({
|
|
134
|
+
circle: {
|
|
135
|
+
'--_avatar-radius': radiusVars['--radius-full'],
|
|
136
|
+
},
|
|
137
|
+
rounded: {
|
|
138
|
+
'--_avatar-radius': radiusVars['--radius-element'],
|
|
139
|
+
},
|
|
140
|
+
square: {
|
|
141
|
+
'--_avatar-radius': radiusVars['--radius-none'],
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
|
|
113
145
|
/**
|
|
114
146
|
* Base styles for the avatar
|
|
115
147
|
* Uses a wrapper/content structure so status isn't clipped by overflow:hidden
|
|
@@ -119,10 +151,10 @@ const styles = stylex.create({
|
|
|
119
151
|
position: 'relative',
|
|
120
152
|
display: 'inline-flex',
|
|
121
153
|
flexShrink: 0,
|
|
122
|
-
//
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
borderRadius:
|
|
154
|
+
// Reads the shape variant's `--_avatar-radius` (set by `shapeStyles`
|
|
155
|
+
// below) rather than a hardcoded value, so `shape` actually changes the
|
|
156
|
+
// wrapper's own radius instead of only the content div's clip.
|
|
157
|
+
borderRadius: 'var(--_avatar-radius)',
|
|
126
158
|
},
|
|
127
159
|
content: {
|
|
128
160
|
display: 'flex',
|
|
@@ -130,9 +162,14 @@ const styles = stylex.create({
|
|
|
130
162
|
justifyContent: 'center',
|
|
131
163
|
width: '100%',
|
|
132
164
|
height: '100%',
|
|
133
|
-
borderRadius: radiusVars['--radius-full'],
|
|
134
165
|
overflow: 'hidden',
|
|
135
166
|
userSelect: 'none',
|
|
167
|
+
// The content div is the one that actually clips (via overflow: hidden
|
|
168
|
+
// above), so it needs its own border-radius matching the wrapper's.
|
|
169
|
+
// It inherits `--_avatar-radius` from the wrapper, since custom
|
|
170
|
+
// properties cascade to descendants even though border-radius itself
|
|
171
|
+
// does not.
|
|
172
|
+
borderRadius: 'var(--_avatar-radius)',
|
|
136
173
|
},
|
|
137
174
|
image: {
|
|
138
175
|
width: '100%',
|
|
@@ -159,9 +196,6 @@ const styles = stylex.create({
|
|
|
159
196
|
status: {
|
|
160
197
|
position: 'absolute',
|
|
161
198
|
},
|
|
162
|
-
// Visible focus ring for the name-tooltip tab stop, matching the repo-wide
|
|
163
|
-
// focus-visible outline treatment (see Timestamp, Token, Thumbnail). Only
|
|
164
|
-
// applied when a tooltip is active so keyboard users can reveal it.
|
|
165
199
|
// Reset the intrinsic styling of the interactive element (<a>/<button>) so it
|
|
166
200
|
// is a transparent, correctly-sized wrapper around the avatar visuals. The
|
|
167
201
|
// element carries the focus-visible accent ring for keyboard users.
|
|
@@ -179,8 +213,9 @@ const styles = stylex.create({
|
|
|
179
213
|
default: 'pointer',
|
|
180
214
|
':is(:disabled,[aria-disabled="true"])': 'default',
|
|
181
215
|
},
|
|
182
|
-
// Match the avatar's
|
|
183
|
-
|
|
216
|
+
// Match the avatar's shape (via `--_avatar-radius`) so the focus ring
|
|
217
|
+
// hugs it, whichever shape variant is in effect.
|
|
218
|
+
borderRadius: 'var(--_avatar-radius)',
|
|
184
219
|
},
|
|
185
220
|
});
|
|
186
221
|
|
|
@@ -199,7 +234,7 @@ const dynamicStyles = stylex.create({
|
|
|
199
234
|
fontSize: (size: number) => ({
|
|
200
235
|
fontSize: `${size * INITIALS_FONT_SIZE_RATIO}px`,
|
|
201
236
|
}),
|
|
202
|
-
|
|
237
|
+
statusPositionCircle: (size: number) => ({
|
|
203
238
|
bottom: size * CIRCLE_EDGE_OFFSET_RATIO,
|
|
204
239
|
insetInlineEnd: size * CIRCLE_EDGE_OFFSET_RATIO,
|
|
205
240
|
// `insetInlineEnd` anchors to the right edge in LTR / left in RTL, so the
|
|
@@ -209,13 +244,23 @@ const dynamicStyles = stylex.create({
|
|
|
209
244
|
':is([dir="rtl"] *)': 'translate(-50%, 50%)',
|
|
210
245
|
},
|
|
211
246
|
}),
|
|
247
|
+
statusPositionCorner: {
|
|
248
|
+
bottom: 0,
|
|
249
|
+
insetInlineEnd: 0,
|
|
250
|
+
// Same RTL mirroring as statusPositionCircle above: insetInlineEnd
|
|
251
|
+
// anchors to the right edge in LTR / left in RTL, so the outward push
|
|
252
|
+
// must flip sign too.
|
|
253
|
+
transform: {
|
|
254
|
+
default: 'translate(25%, 25%)',
|
|
255
|
+
':is([dir="rtl"] *)': 'translate(-25%, 25%)',
|
|
256
|
+
},
|
|
257
|
+
},
|
|
212
258
|
});
|
|
213
259
|
|
|
214
260
|
const BORDER_WIDTH = 2;
|
|
215
261
|
|
|
216
262
|
const groupStyles = stylex.create({
|
|
217
263
|
ring: {
|
|
218
|
-
borderRadius: radiusVars['--radius-full'],
|
|
219
264
|
borderWidth: BORDER_WIDTH,
|
|
220
265
|
borderStyle: 'solid',
|
|
221
266
|
borderColor: colorVars['--color-background-surface'],
|
|
@@ -268,6 +313,14 @@ export interface AvatarProps extends BaseProps<HTMLDivElement> {
|
|
|
268
313
|
* @default 'md'
|
|
269
314
|
*/
|
|
270
315
|
size?: AvatarSize;
|
|
316
|
+
/**
|
|
317
|
+
* Shape variant of the avatar.
|
|
318
|
+
* - 'circle': Full circle (default)
|
|
319
|
+
* - 'rounded': Rounded square
|
|
320
|
+
* - 'square': Sharp square
|
|
321
|
+
* @default 'circle'
|
|
322
|
+
*/
|
|
323
|
+
shape?: AvatarShape;
|
|
271
324
|
/**
|
|
272
325
|
* The primary image source for the avatar.
|
|
273
326
|
*/
|
|
@@ -471,6 +524,7 @@ export function Avatar({
|
|
|
471
524
|
fallbackSrc,
|
|
472
525
|
name,
|
|
473
526
|
size = 'md',
|
|
527
|
+
shape = 'circle',
|
|
474
528
|
src,
|
|
475
529
|
status,
|
|
476
530
|
tooltip = true,
|
|
@@ -530,6 +584,7 @@ export function Avatar({
|
|
|
530
584
|
: undefined;
|
|
531
585
|
const avatarGroup = useAvatarGroup();
|
|
532
586
|
const resolvedSize = avatarGroup?.size ?? size;
|
|
587
|
+
const resolvedShape = avatarGroup?.shape ?? shape;
|
|
533
588
|
const numericSize = useMemo(() => resolveSize(resolvedSize), [resolvedSize]);
|
|
534
589
|
|
|
535
590
|
// Resolve the tooltip content:
|
|
@@ -608,47 +663,62 @@ export function Avatar({
|
|
|
608
663
|
label: undefined,
|
|
609
664
|
update: null,
|
|
610
665
|
});
|
|
611
|
-
|
|
612
|
-
|
|
666
|
+
const {
|
|
667
|
+
'aria-hidden': consumerAriaHidden,
|
|
668
|
+
'aria-label': consumerAriaLabel,
|
|
669
|
+
role: consumerRole,
|
|
670
|
+
} = props;
|
|
671
|
+
// Recompose the name after React has written any relevant prop changes.
|
|
613
672
|
// `update` covers the other direction: a label that changes while the avatar
|
|
614
673
|
// itself does not re-render.
|
|
615
|
-
const nameRef = (
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
const target = statusLabelRef.current;
|
|
620
|
-
target.update = () => {
|
|
621
|
-
const composed = composeAccessibleName(
|
|
622
|
-
t,
|
|
623
|
-
nameLabel,
|
|
624
|
-
meaningful(target.label) ?? getStatusLabel(status),
|
|
625
|
-
);
|
|
626
|
-
// A consumer's own ARIA wins here exactly as it does in render, where
|
|
627
|
-
// the derived props spread before `{...props}`.
|
|
628
|
-
if (props['aria-label'] == null) {
|
|
629
|
-
setAttributeOrRemove(element, 'aria-label', composed);
|
|
674
|
+
const nameRef = useCallback(
|
|
675
|
+
(element: HTMLElement | null) => {
|
|
676
|
+
if (element == null) {
|
|
677
|
+
return;
|
|
630
678
|
}
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
679
|
+
const target = statusLabelRef.current;
|
|
680
|
+
target.update = () => {
|
|
681
|
+
const composed = composeAccessibleName(
|
|
682
|
+
t,
|
|
683
|
+
nameLabel,
|
|
684
|
+
meaningful(target.label) ?? getStatusLabel(status),
|
|
685
|
+
);
|
|
686
|
+
// A consumer's own ARIA wins here exactly as it does in render, where
|
|
687
|
+
// the derived props spread before `{...props}`.
|
|
688
|
+
if (consumerAriaLabel == null) {
|
|
689
|
+
setAttributeOrRemove(element, 'aria-label', composed);
|
|
636
690
|
}
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
composed ?
|
|
642
|
-
|
|
691
|
+
// An `<a>`/`<button>` root carries its own role and must not be hidden,
|
|
692
|
+
// so only the name transfers there.
|
|
693
|
+
if (!isInteractive) {
|
|
694
|
+
if (consumerRole == null) {
|
|
695
|
+
element.setAttribute('role', composed ? 'img' : 'presentation');
|
|
696
|
+
}
|
|
697
|
+
if (consumerAriaHidden == null) {
|
|
698
|
+
setAttributeOrRemove(
|
|
699
|
+
element,
|
|
700
|
+
'aria-hidden',
|
|
701
|
+
composed ? undefined : 'true',
|
|
702
|
+
);
|
|
703
|
+
}
|
|
643
704
|
}
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
|
|
705
|
+
};
|
|
706
|
+
target.update();
|
|
707
|
+
return () => {
|
|
708
|
+
target.update = null;
|
|
709
|
+
};
|
|
710
|
+
},
|
|
711
|
+
[
|
|
712
|
+
consumerAriaHidden,
|
|
713
|
+
consumerAriaLabel,
|
|
714
|
+
consumerRole,
|
|
715
|
+
isInteractive,
|
|
716
|
+
nameLabel,
|
|
717
|
+
status,
|
|
718
|
+
t,
|
|
719
|
+
],
|
|
720
|
+
);
|
|
721
|
+
const rootRef = useMergedRefs(
|
|
652
722
|
ref,
|
|
653
723
|
showTooltip ? tooltipHook.ref : undefined,
|
|
654
724
|
nameRef,
|
|
@@ -700,7 +770,9 @@ export function Avatar({
|
|
|
700
770
|
<div
|
|
701
771
|
{...stylex.props(
|
|
702
772
|
styles.status,
|
|
703
|
-
|
|
773
|
+
resolvedShape === 'circle'
|
|
774
|
+
? dynamicStyles.statusPositionCircle(numericSize)
|
|
775
|
+
: dynamicStyles.statusPositionCorner,
|
|
704
776
|
)}>
|
|
705
777
|
{status}
|
|
706
778
|
</div>
|
|
@@ -713,7 +785,7 @@ export function Avatar({
|
|
|
713
785
|
// tooltip tab-stop focus ring all live here so the interactive
|
|
714
786
|
// `<a>`/`<button>` and the static `<div>` carry the exact same box.
|
|
715
787
|
const rootStylexProps = mergeProps(
|
|
716
|
-
themeProps('avatar', {size: resolvedSize}),
|
|
788
|
+
themeProps('avatar', {size: resolvedSize, shape: resolvedShape}),
|
|
717
789
|
focusOutlineProps.focusVisible(
|
|
718
790
|
styles.wrapper,
|
|
719
791
|
dynamicStyles.size(numericSize),
|
|
@@ -721,6 +793,7 @@ export function Avatar({
|
|
|
721
793
|
avatarGroup && groupStyles.ring,
|
|
722
794
|
avatarGroup && groupStyles.overlap,
|
|
723
795
|
avatarGroup && groupDynamicStyles.overlap(-avatarGroup.overlap),
|
|
796
|
+
shapeStyles[resolvedShape],
|
|
724
797
|
xstyle,
|
|
725
798
|
),
|
|
726
799
|
className,
|
package/src/Avatar/index.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
/**
|
|
6
6
|
* @file index.ts
|
|
7
7
|
* @input Imports Avatar component and types from Avatar.tsx, AvatarStatusDot from AvatarStatusDot.tsx
|
|
8
|
-
* @output Exports Avatar, AvatarProps, AvatarSize, AvatarStatusDot, AvatarStatusDotProps, AvatarStatusDotVariant
|
|
8
|
+
* @output Exports Avatar, AvatarProps, AvatarSize, AvatarShape, resolveSize, AvatarStatusDot, AvatarStatusDotProps, AvatarStatusDotVariant
|
|
9
9
|
* @position Component entry point; re-exported by /packages/core/src/index.ts
|
|
10
10
|
*
|
|
11
11
|
* SYNC: When modified, update this header and /packages/core/src/Avatar/Avatar.doc.mjs
|
|
@@ -38,7 +38,7 @@ export interface AvatarStatusDotVariantMap {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
export {Avatar, resolveSize} from './Avatar';
|
|
41
|
-
export type {AvatarProps, AvatarSize} from './Avatar';
|
|
41
|
+
export type {AvatarProps, AvatarSize, AvatarShape} from './Avatar';
|
|
42
42
|
export {AvatarStatusDot} from './AvatarStatusDot';
|
|
43
43
|
export type {
|
|
44
44
|
AvatarStatusDotProps,
|
|
@@ -25,8 +25,8 @@ export const docs = {
|
|
|
25
25
|
},
|
|
26
26
|
theming: {
|
|
27
27
|
targets: [
|
|
28
|
-
{className: 'astryx-avatar-group', visualProps: ['size']},
|
|
29
|
-
{className: 'astryx-avatar-group-overflow', visualProps: ['size']},
|
|
28
|
+
{className: 'astryx-avatar-group', visualProps: ['size', 'shape']},
|
|
29
|
+
{className: 'astryx-avatar-group-overflow', visualProps: ['size', 'shape']},
|
|
30
30
|
],
|
|
31
31
|
},
|
|
32
32
|
description: 'Stacked avatar display with overlapping layout and optional overflow indicator. Children are Avatar elements.',
|
|
@@ -52,6 +52,12 @@ export const docs = {
|
|
|
52
52
|
"Size applied to all avatars via context. This wins over each child Avatar's own size prop, including when it is left at the default, so set the size here rather than on the children.",
|
|
53
53
|
default: "'md'",
|
|
54
54
|
},
|
|
55
|
+
{
|
|
56
|
+
name: 'shape',
|
|
57
|
+
type: "'circle' | 'rounded' | 'square'",
|
|
58
|
+
description: "Shape applied to all avatars via context, overriding each avatar's own shape prop. Also applied to AvatarGroupOverflow's \"+N\" indicator.",
|
|
59
|
+
default: "'circle'",
|
|
60
|
+
},
|
|
55
61
|
{
|
|
56
62
|
name: 'ref',
|
|
57
63
|
type: 'React.Ref<HTMLDivElement>',
|
|
@@ -118,6 +118,30 @@ describe('AvatarGroupOverflow', () => {
|
|
|
118
118
|
expect(overflow).toHaveAttribute('data-size', 'lg');
|
|
119
119
|
});
|
|
120
120
|
|
|
121
|
+
it('applies the group shape to the overflow chip, matching its avatars', () => {
|
|
122
|
+
render(
|
|
123
|
+
<AvatarGroup shape="square">
|
|
124
|
+
<Avatar name="Alice" />
|
|
125
|
+
<AvatarGroupOverflow count={5} />
|
|
126
|
+
</AvatarGroup>,
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const overflow = screen.getByLabelText('5 more');
|
|
130
|
+
expect(overflow).toHaveAttribute('data-shape', 'square');
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it('defaults the overflow chip to circle shape with no explicit AvatarGroup shape', () => {
|
|
134
|
+
render(
|
|
135
|
+
<AvatarGroup>
|
|
136
|
+
<Avatar name="Alice" />
|
|
137
|
+
<AvatarGroupOverflow count={5} />
|
|
138
|
+
</AvatarGroup>,
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
const overflow = screen.getByLabelText('5 more');
|
|
142
|
+
expect(overflow).toHaveAttribute('data-shape', 'circle');
|
|
143
|
+
});
|
|
144
|
+
|
|
121
145
|
it('renders as button when onClick is provided', () => {
|
|
122
146
|
render(
|
|
123
147
|
<AvatarGroup>
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
|
|
27
27
|
import {useId, useMemo, useState, type ReactNode} from 'react';
|
|
28
28
|
import type {BaseProps} from '../BaseProps';
|
|
29
|
-
import {resolveSize, type AvatarSize} from '../Avatar';
|
|
29
|
+
import {resolveSize, type AvatarShape, type AvatarSize} from '../Avatar';
|
|
30
30
|
import * as stylex from '@stylexjs/stylex';
|
|
31
|
-
import {mergeProps
|
|
31
|
+
import {mergeProps} from '../utils';
|
|
32
32
|
import {composeEventHandlers} from '../utils/composeEventHandlers';
|
|
33
33
|
import {AvatarGroupContext} from './AvatarGroupContext';
|
|
34
34
|
import {themeProps} from '../utils/themeProps';
|
|
@@ -37,6 +37,7 @@ import {useListFocus} from '../hooks/useListFocus';
|
|
|
37
37
|
import {useIsomorphicLayoutEffect} from '../hooks/useIsomorphicLayoutEffect';
|
|
38
38
|
import {VisuallyHidden} from '../VisuallyHidden';
|
|
39
39
|
|
|
40
|
+
import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
40
41
|
const OVERLAP_RATIO = 0.25;
|
|
41
42
|
|
|
42
43
|
export interface AvatarGroupProps extends BaseProps<HTMLDivElement> {
|
|
@@ -54,6 +55,13 @@ export interface AvatarGroupProps extends BaseProps<HTMLDivElement> {
|
|
|
54
55
|
* @default 'md'
|
|
55
56
|
*/
|
|
56
57
|
size?: AvatarSize;
|
|
58
|
+
/**
|
|
59
|
+
* Shape applied to all avatars via context, overriding each avatar's own
|
|
60
|
+
* `shape` prop so a group stays visually uniform. Also applied to the
|
|
61
|
+
* `AvatarGroupOverflow` "+N" indicator, so it matches the group.
|
|
62
|
+
* @default 'circle'
|
|
63
|
+
*/
|
|
64
|
+
shape?: AvatarShape;
|
|
57
65
|
/**
|
|
58
66
|
* Test ID for integration testing.
|
|
59
67
|
*/
|
|
@@ -88,6 +96,7 @@ const styles = stylex.create({
|
|
|
88
96
|
export function AvatarGroup({
|
|
89
97
|
children,
|
|
90
98
|
size = 'md',
|
|
99
|
+
shape = 'circle',
|
|
91
100
|
'data-testid': testId,
|
|
92
101
|
'aria-label': ariaLabelFromProps,
|
|
93
102
|
'aria-describedby': ariaDescribedByFromProps,
|
|
@@ -105,8 +114,8 @@ export function AvatarGroup({
|
|
|
105
114
|
const overlap = Math.round(numericSize * OVERLAP_RATIO);
|
|
106
115
|
|
|
107
116
|
const contextValue = useMemo(
|
|
108
|
-
() => ({size, overlap, numericSize}),
|
|
109
|
-
[size, overlap, numericSize],
|
|
117
|
+
() => ({size, shape, overlap, numericSize}),
|
|
118
|
+
[size, shape, overlap, numericSize],
|
|
110
119
|
);
|
|
111
120
|
|
|
112
121
|
// The keyboard hint and roving tab stop only make sense once the group has
|
|
@@ -143,7 +152,7 @@ export function AvatarGroup({
|
|
|
143
152
|
<AvatarGroupContext value={contextValue}>
|
|
144
153
|
<div
|
|
145
154
|
{...props}
|
|
146
|
-
ref={
|
|
155
|
+
ref={useMergedRefs(ref, listRef)}
|
|
147
156
|
role="group"
|
|
148
157
|
aria-label={ariaLabel}
|
|
149
158
|
aria-describedby={describedBy}
|
|
@@ -151,7 +160,7 @@ export function AvatarGroup({
|
|
|
151
160
|
onKeyDown={composeEventHandlers(onKeyDown, handleKeyDown)}
|
|
152
161
|
onFocus={composeEventHandlers(onFocus, handleFocus)}
|
|
153
162
|
{...mergeProps(
|
|
154
|
-
themeProps('avatar-group', {size}),
|
|
163
|
+
themeProps('avatar-group', {size, shape}),
|
|
155
164
|
stylex.props(styles.root, xstyle),
|
|
156
165
|
className,
|
|
157
166
|
style,
|
|
@@ -9,16 +9,18 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import {createContext, use} from 'react';
|
|
12
|
-
import type {AvatarSize} from '../Avatar';
|
|
12
|
+
import type {AvatarShape, AvatarSize} from '../Avatar';
|
|
13
13
|
|
|
14
14
|
export interface AvatarGroupContextValue {
|
|
15
15
|
size: AvatarSize;
|
|
16
|
+
shape: AvatarShape;
|
|
16
17
|
overlap: number;
|
|
17
18
|
numericSize: number;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
export const AvatarGroupContext =
|
|
21
|
-
|
|
21
|
+
export const AvatarGroupContext = createContext<AvatarGroupContextValue | null>(
|
|
22
|
+
null,
|
|
23
|
+
);
|
|
22
24
|
AvatarGroupContext.displayName = 'AvatarGroupContext';
|
|
23
25
|
|
|
24
26
|
export function useAvatarGroup(): AvatarGroupContextValue | null {
|
|
@@ -20,9 +20,9 @@ import {
|
|
|
20
20
|
typographyVars,
|
|
21
21
|
typeScaleVars,
|
|
22
22
|
fontWeightVars,
|
|
23
|
-
radiusVars,
|
|
24
23
|
spacingVars,
|
|
25
24
|
} from '../theme/tokens.stylex';
|
|
25
|
+
import {shapeStyles} from '../Avatar/Avatar';
|
|
26
26
|
import {mergeProps} from '../utils';
|
|
27
27
|
import {resolveSize} from '../Avatar';
|
|
28
28
|
import {useAvatarGroup} from './AvatarGroupContext';
|
|
@@ -65,7 +65,10 @@ const styles = stylex.create({
|
|
|
65
65
|
display: 'inline-flex',
|
|
66
66
|
alignItems: 'center',
|
|
67
67
|
justifyContent: 'center',
|
|
68
|
-
|
|
68
|
+
// Reads the shape variant's `--_avatar-radius` (set via `shapeStyles`,
|
|
69
|
+
// shared with Avatar) so the overflow indicator matches the group's
|
|
70
|
+
// shape instead of always staying a circle.
|
|
71
|
+
borderRadius: 'var(--_avatar-radius)',
|
|
69
72
|
// Use opaque background to prevent avatar bleed-through
|
|
70
73
|
backgroundColor: colorVars['--color-background-surface'],
|
|
71
74
|
color: colorVars['--color-text-secondary'],
|
|
@@ -166,6 +169,7 @@ export function AvatarGroupOverflow({
|
|
|
166
169
|
const t = useTranslator();
|
|
167
170
|
const group = useAvatarGroup();
|
|
168
171
|
const size = group?.size ?? 'md';
|
|
172
|
+
const shape = group?.shape ?? 'circle';
|
|
169
173
|
const numericSize = group?.numericSize ?? resolveSize('md');
|
|
170
174
|
const overlap = group?.overlap ?? 0;
|
|
171
175
|
|
|
@@ -186,7 +190,7 @@ export function AvatarGroupOverflow({
|
|
|
186
190
|
aria-label={label}
|
|
187
191
|
data-avatar-item=""
|
|
188
192
|
{...mergeProps(
|
|
189
|
-
themeProps('avatar-group-overflow', {size}),
|
|
193
|
+
themeProps('avatar-group-overflow', {size, shape}),
|
|
190
194
|
focusOutlineProps.focusVisible(
|
|
191
195
|
styles.base,
|
|
192
196
|
styles.button,
|
|
@@ -194,6 +198,7 @@ export function AvatarGroupOverflow({
|
|
|
194
198
|
dynamicStyles.size(numericSize),
|
|
195
199
|
dynamicStyles.fontSize(numericSize),
|
|
196
200
|
dynamicStyles.overlap(-overlap),
|
|
201
|
+
shapeStyles[shape],
|
|
197
202
|
xstyle,
|
|
198
203
|
),
|
|
199
204
|
className,
|
|
@@ -210,13 +215,14 @@ export function AvatarGroupOverflow({
|
|
|
210
215
|
{...rest}
|
|
211
216
|
aria-label={label}
|
|
212
217
|
{...mergeProps(
|
|
213
|
-
themeProps('avatar-group-overflow', {size}),
|
|
218
|
+
themeProps('avatar-group-overflow', {size, shape}),
|
|
214
219
|
stylex.props(
|
|
215
220
|
styles.base,
|
|
216
221
|
styles.overlap,
|
|
217
222
|
dynamicStyles.size(numericSize),
|
|
218
223
|
dynamicStyles.fontSize(numericSize),
|
|
219
224
|
dynamicStyles.overlap(-overlap),
|
|
225
|
+
shapeStyles[shape],
|
|
220
226
|
xstyle,
|
|
221
227
|
),
|
|
222
228
|
className,
|
|
@@ -17,6 +17,7 @@ export const docs = {
|
|
|
17
17
|
{guidance: true, description: 'Keep titles short and scannable: "Payment failed" not "There was a problem processing your most recent payment."'},
|
|
18
18
|
{guidance: false, description: 'Use Banner for short-lived messages that disappear on their own; use Toast instead.'},
|
|
19
19
|
{guidance: false, description: 'Stack multiple banners with the same status; combine related messages into one banner.'},
|
|
20
|
+
{guidance: true, description: 'Set collapsible={false} when the user needs the content to act on the message, like the list of fields that failed validation. Keep the default toggle when the detail is long enough to bury the banner\u2019s own message.'},
|
|
20
21
|
{guidance: true, description: 'Error and warning banners render as role="alert"; info and success render as role="status". Mount an alert banner in response to an event rather than on first paint, so assistive tech has a change to report.'},
|
|
21
22
|
{guidance: false, description: 'Rely on the status color or icon alone to carry meaning; say which status it is in the title text, because the icon is decorative to a screen reader.'},
|
|
22
23
|
],
|
|
@@ -26,7 +27,7 @@ export const docs = {
|
|
|
26
27
|
{name: 'Description', required: false, description: 'Additional detail below the title.'},
|
|
27
28
|
{name: 'Action button', required: false, description: 'A button for the user to act on the message, like "Review" or "Retry".'},
|
|
28
29
|
{name: 'Dismiss button', required: false, description: 'Lets the user close the banner. Enabled by setting isDismissable.'},
|
|
29
|
-
{name: '
|
|
30
|
+
{name: 'Content', required: false, description: 'Extra detail below the banner header, like a list of errors. Sits behind an expand/collapse toggle by default; set collapsible={false} to keep it visible.'},
|
|
30
31
|
],
|
|
31
32
|
},
|
|
32
33
|
|
|
@@ -94,14 +95,14 @@ export const docs = {
|
|
|
94
95
|
name: 'children',
|
|
95
96
|
type: 'ReactNode',
|
|
96
97
|
description:
|
|
97
|
-
'Content rendered in the card-background area below the colored header.',
|
|
98
|
+
'Content rendered in the card-background area below the colored header. Sits behind an expand/collapse toggle unless `collapsible={false}`.',
|
|
98
99
|
},
|
|
99
100
|
{
|
|
100
|
-
name: '
|
|
101
|
-
type: 'boolean',
|
|
101
|
+
name: 'collapsible',
|
|
102
|
+
type: 'boolean | {defaultIsOpen?: boolean; isOpen?: boolean; onOpenChange?: (isOpen: boolean) => void}',
|
|
102
103
|
description:
|
|
103
|
-
'Whether the content area (children)
|
|
104
|
-
default: '
|
|
104
|
+
'Whether the content area (children) sits behind an expand/collapse toggle in the header. On by default, starting collapsed. `false` opts out: children are always visible with no toggle. `{defaultIsOpen: true}` starts open; `{isOpen, onOpenChange}` is controlled. Takes the same CollapsibleConfig as Collapsible.',
|
|
105
|
+
default: 'true',
|
|
105
106
|
},
|
|
106
107
|
{
|
|
107
108
|
name: 'xstyle',
|
|
@@ -154,7 +155,7 @@ export const docsZh = {
|
|
|
154
155
|
{name: 'Description', required: false, description: 'Additional detail below the title.'},
|
|
155
156
|
{name: 'Action button', required: false, description: 'A button for the user to act on the message, like "Review" or "Retry".'},
|
|
156
157
|
{name: 'Dismiss button', required: false, description: 'Lets the user close the banner. Enabled by setting isDismissable.'},
|
|
157
|
-
{name: '
|
|
158
|
+
{name: 'Content', required: false, description: 'Extra detail below the banner header, like a list of errors. Sits behind an expand/collapse toggle by default; set collapsible={false} to keep it visible.'},
|
|
158
159
|
],
|
|
159
160
|
},
|
|
160
161
|
props: [
|
|
@@ -167,8 +168,8 @@ export const docsZh = {
|
|
|
167
168
|
{name: 'endContent', type: 'ReactNode', description: '渲染在头部区域末端对齐的操作内容,通常是按钮或链接。头部过窄时会整体换行到文本下方,自成一行。'},
|
|
168
169
|
{name: 'container', type: "'card' | 'section'", description: '视觉变体:card 带圆角;section 无圆角全宽,适用于页面级场景。', default: "'card'"},
|
|
169
170
|
{name: 'elevation', type: "'none' | 'low' | 'med' | 'high'", description: '静止阴影深度。用于悬浮于内容之上的浮动横幅;none 为默认内联横幅。', default: "'none'"},
|
|
170
|
-
{name: 'children', type: 'ReactNode', description: '
|
|
171
|
-
{name: '
|
|
171
|
+
{name: 'children', type: 'ReactNode', description: '渲染在彩色头部下方卡片背景区域的内容。默认位于展开/折叠开关之后,除非设置 collapsible={false}。'},
|
|
172
|
+
{name: 'collapsible', type: 'boolean | {defaultIsOpen?: boolean; isOpen?: boolean; onOpenChange?: (isOpen: boolean) => void}', description: '内容区域(children)是否位于头部的展开/折叠开关之后。默认开启,且初始为折叠状态。false 表示关闭:内容始终可见且没有开关。{defaultIsOpen: true} 表示初始展开;{isOpen, onOpenChange} 为受控模式。与 Collapsible 使用同一套 CollapsibleConfig。', default: 'true'},
|
|
172
173
|
{
|
|
173
174
|
name: 'xstyle',
|
|
174
175
|
type: 'StyleXStyles',
|
|
@@ -230,7 +231,7 @@ export const docsDense = {
|
|
|
230
231
|
{name: 'Description', required: false, description: 'Detail below title.'},
|
|
231
232
|
{name: 'Action button', required: false, description: 'CTA like Review or Retry.'},
|
|
232
233
|
{name: 'Dismiss button', required: false, description: 'Close button via isDismissable.'},
|
|
233
|
-
{name: '
|
|
234
|
+
{name: 'Content', required: false, description: 'Detail area; behind a toggle unless collapsible={false}.'},
|
|
234
235
|
],
|
|
235
236
|
},
|
|
236
237
|
propDescriptions: {
|
|
@@ -243,7 +244,8 @@ export const docsDense = {
|
|
|
243
244
|
endContent: 'end-aligned action in header, typically button/link; wraps to its own row when the header is too narrow',
|
|
244
245
|
container: 'card=border-radius; section=full-width no radius for page-level',
|
|
245
246
|
elevation: 'resting shadow depth: none|low|med|high; raise for a floating banner',
|
|
246
|
-
children: 'content in card-bg area below colored header',
|
|
247
|
+
children: 'content in card-bg area below colored header; behind a toggle unless collapsible={false}',
|
|
248
|
+
collapsible: 'children behind a header toggle; default true=collapsed. false=always visible, no toggle. {defaultIsOpen:true}=starts open, {isOpen,onOpenChange}=controlled',
|
|
247
249
|
xstyle: 'StyleX layout customization via stylex.create()',
|
|
248
250
|
},
|
|
249
251
|
};
|