@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
|
@@ -15,6 +15,7 @@ import {render, screen} from '@testing-library/react';
|
|
|
15
15
|
import userEvent from '@testing-library/user-event';
|
|
16
16
|
import {Banner} from './Banner';
|
|
17
17
|
import {registerIcons, resetIcons} from '../Icon';
|
|
18
|
+
import {InternationalizationProvider} from '../i18n';
|
|
18
19
|
|
|
19
20
|
describe('Banner', () => {
|
|
20
21
|
afterEach(() => {
|
|
@@ -97,7 +98,9 @@ describe('Banner', () => {
|
|
|
97
98
|
|
|
98
99
|
it('renders dismiss button when isDismissable', () => {
|
|
99
100
|
render(<Banner status="info" title="Dismissable" isDismissable />);
|
|
100
|
-
expect(
|
|
101
|
+
expect(
|
|
102
|
+
screen.getByRole('button', {name: 'Dismiss Dismissable'}),
|
|
103
|
+
).toBeInTheDocument();
|
|
101
104
|
});
|
|
102
105
|
|
|
103
106
|
it('calls onDismiss when dismiss button is clicked', async () => {
|
|
@@ -111,7 +114,7 @@ describe('Banner', () => {
|
|
|
111
114
|
onDismiss={onDismiss}
|
|
112
115
|
/>,
|
|
113
116
|
);
|
|
114
|
-
await user.click(screen.getByRole('button', {name: 'Dismiss'}));
|
|
117
|
+
await user.click(screen.getByRole('button', {name: 'Dismiss Dismissable'}));
|
|
115
118
|
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
116
119
|
});
|
|
117
120
|
|
|
@@ -126,7 +129,9 @@ describe('Banner', () => {
|
|
|
126
129
|
/>,
|
|
127
130
|
);
|
|
128
131
|
expect(screen.getByTestId('banner')).toBeInTheDocument();
|
|
129
|
-
await user.click(
|
|
132
|
+
await user.click(
|
|
133
|
+
screen.getByRole('button', {name: 'Dismiss Self Dismissing'}),
|
|
134
|
+
);
|
|
130
135
|
expect(screen.queryByTestId('banner')).not.toBeInTheDocument();
|
|
131
136
|
});
|
|
132
137
|
|
|
@@ -142,16 +147,14 @@ describe('Banner', () => {
|
|
|
142
147
|
data-testid="banner"
|
|
143
148
|
/>,
|
|
144
149
|
);
|
|
145
|
-
await user.click(screen.getByRole('button', {name: 'Dismiss'}));
|
|
150
|
+
await user.click(screen.getByRole('button', {name: 'Dismiss Dismissable'}));
|
|
146
151
|
expect(screen.queryByTestId('banner')).not.toBeInTheDocument();
|
|
147
152
|
expect(onDismiss).toHaveBeenCalledTimes(1);
|
|
148
153
|
});
|
|
149
154
|
|
|
150
155
|
it('does not render dismiss button when isDismissable is false', () => {
|
|
151
156
|
render(<Banner status="info" title="Not Dismissable" />);
|
|
152
|
-
expect(
|
|
153
|
-
screen.queryByRole('button', {name: 'Dismiss'}),
|
|
154
|
-
).not.toBeInTheDocument();
|
|
157
|
+
expect(screen.queryByRole('button', {name: /^Dismiss/})).toBeNull();
|
|
155
158
|
});
|
|
156
159
|
|
|
157
160
|
it('renders endContent', () => {
|
|
@@ -184,33 +187,86 @@ describe('Banner', () => {
|
|
|
184
187
|
});
|
|
185
188
|
|
|
186
189
|
// =========================================================================
|
|
187
|
-
//
|
|
190
|
+
// Content area — collapsible by default, `collapsible={false}` opts out
|
|
188
191
|
// =========================================================================
|
|
189
192
|
|
|
190
|
-
it('hides children by default
|
|
193
|
+
it('hides children behind a toggle by default', () => {
|
|
191
194
|
render(
|
|
192
195
|
<Banner status="info" title="Collapsible">
|
|
193
196
|
<div data-testid="child-content">Extra content</div>
|
|
194
197
|
</Banner>,
|
|
195
198
|
);
|
|
199
|
+
// The historical default, unchanged: chevron present, content collapsed.
|
|
196
200
|
expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
|
|
201
|
+
expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
|
|
197
202
|
});
|
|
198
203
|
|
|
199
|
-
it('
|
|
204
|
+
it('treats an explicit collapsible={true} as the default', () => {
|
|
200
205
|
render(
|
|
201
|
-
<Banner status="info" title="
|
|
206
|
+
<Banner status="info" title="Explicit" collapsible>
|
|
207
|
+
<div data-testid="child-content">Extra content</div>
|
|
208
|
+
</Banner>,
|
|
209
|
+
);
|
|
210
|
+
expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
|
|
211
|
+
expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('shows children with no toggle for collapsible={false}', () => {
|
|
215
|
+
render(
|
|
216
|
+
<Banner status="info" title="Opted out" collapsible={false}>
|
|
202
217
|
<div data-testid="child-content">Extra content</div>
|
|
203
218
|
</Banner>,
|
|
204
219
|
);
|
|
205
220
|
expect(screen.getByTestId('child-content')).toBeInTheDocument();
|
|
221
|
+
expect(
|
|
222
|
+
screen.queryByRole('button', {name: 'Expand'}),
|
|
223
|
+
).not.toBeInTheDocument();
|
|
224
|
+
expect(
|
|
225
|
+
screen.queryByRole('button', {name: 'Collapse'}),
|
|
226
|
+
).not.toBeInTheDocument();
|
|
206
227
|
});
|
|
207
228
|
|
|
208
|
-
it('
|
|
229
|
+
it('leaves non-collapsible content out of the disclosure wiring', () => {
|
|
209
230
|
render(
|
|
210
|
-
<Banner
|
|
211
|
-
|
|
231
|
+
<Banner
|
|
232
|
+
status="info"
|
|
233
|
+
title="Plain content"
|
|
234
|
+
isDismissable
|
|
235
|
+
collapsible={false}>
|
|
236
|
+
<div data-testid="child-content">Extra content</div>
|
|
237
|
+
</Banner>,
|
|
238
|
+
);
|
|
239
|
+
// No toggle exists, so nothing should carry disclosure state, and the
|
|
240
|
+
// region needs no id for a button to point at.
|
|
241
|
+
const dismiss = screen.getByRole('button', {
|
|
242
|
+
name: 'Dismiss Plain content',
|
|
243
|
+
});
|
|
244
|
+
expect(dismiss).not.toHaveAttribute('aria-expanded');
|
|
245
|
+
expect(dismiss).not.toHaveAttribute('aria-controls');
|
|
246
|
+
expect(
|
|
247
|
+
screen.getByTestId('child-content').parentElement,
|
|
248
|
+
).not.toHaveAttribute('id');
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('starts open for collapsible={{defaultIsOpen: true}}', () => {
|
|
252
|
+
render(
|
|
253
|
+
<Banner status="info" title="Open" collapsible={{defaultIsOpen: true}}>
|
|
254
|
+
<div data-testid="child-content">Content</div>
|
|
255
|
+
</Banner>,
|
|
256
|
+
);
|
|
257
|
+
expect(screen.getByTestId('child-content')).toBeInTheDocument();
|
|
258
|
+
expect(screen.getByRole('button', {name: 'Collapse'})).toBeInTheDocument();
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it('treats a null collapsible as the default', () => {
|
|
262
|
+
render(
|
|
263
|
+
// @ts-expect-error null is outside the prop's type, but JS callers and a
|
|
264
|
+
// value widened to `| null` still reach this.
|
|
265
|
+
<Banner status="info" title="Nullish" collapsible={null}>
|
|
266
|
+
<div data-testid="child-content">Content</div>
|
|
212
267
|
</Banner>,
|
|
213
268
|
);
|
|
269
|
+
expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
|
|
214
270
|
expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
|
|
215
271
|
});
|
|
216
272
|
|
|
@@ -247,13 +303,38 @@ describe('Banner', () => {
|
|
|
247
303
|
expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
|
|
248
304
|
});
|
|
249
305
|
|
|
250
|
-
it('
|
|
306
|
+
it('reports open-state changes through onOpenChange', async () => {
|
|
307
|
+
const user = userEvent.setup();
|
|
308
|
+
const onOpenChange = vi.fn();
|
|
251
309
|
render(
|
|
252
|
-
<Banner status="info" title="
|
|
253
|
-
<div>
|
|
310
|
+
<Banner status="info" title="Notify" collapsible={{onOpenChange}}>
|
|
311
|
+
<div data-testid="child-content">Extra content</div>
|
|
254
312
|
</Banner>,
|
|
255
313
|
);
|
|
256
|
-
|
|
314
|
+
|
|
315
|
+
await user.click(screen.getByRole('button', {name: 'Expand'}));
|
|
316
|
+
expect(onOpenChange).toHaveBeenCalledWith(true);
|
|
317
|
+
await user.click(screen.getByRole('button', {name: 'Collapse'}));
|
|
318
|
+
expect(onOpenChange).toHaveBeenLastCalledWith(false);
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('defers to the consumer when collapsible is controlled', async () => {
|
|
322
|
+
const user = userEvent.setup();
|
|
323
|
+
const onOpenChange = vi.fn();
|
|
324
|
+
render(
|
|
325
|
+
<Banner
|
|
326
|
+
status="info"
|
|
327
|
+
title="Controlled"
|
|
328
|
+
collapsible={{isOpen: false, onOpenChange}}>
|
|
329
|
+
<div data-testid="child-content">Extra content</div>
|
|
330
|
+
</Banner>,
|
|
331
|
+
);
|
|
332
|
+
|
|
333
|
+
// A controlled banner must not move on its own: the click reports, the
|
|
334
|
+
// content stays hidden until the consumer re-renders with isOpen.
|
|
335
|
+
await user.click(screen.getByRole('button', {name: 'Expand'}));
|
|
336
|
+
expect(onOpenChange).toHaveBeenCalledWith(true);
|
|
337
|
+
expect(screen.queryByTestId('child-content')).not.toBeInTheDocument();
|
|
257
338
|
});
|
|
258
339
|
|
|
259
340
|
it('renders expand button to the left of dismiss button', () => {
|
|
@@ -267,13 +348,16 @@ describe('Banner', () => {
|
|
|
267
348
|
b => b.getAttribute('aria-label') || b.textContent,
|
|
268
349
|
);
|
|
269
350
|
const expandIndex = buttonNames.indexOf('Expand');
|
|
270
|
-
const dismissIndex = buttonNames.indexOf('Dismiss');
|
|
351
|
+
const dismissIndex = buttonNames.indexOf('Dismiss Order Test');
|
|
271
352
|
expect(expandIndex).toBeLessThan(dismissIndex);
|
|
272
353
|
});
|
|
273
354
|
|
|
274
355
|
it('links the expand toggle to its content region via aria-controls', () => {
|
|
275
356
|
render(
|
|
276
|
-
<Banner
|
|
357
|
+
<Banner
|
|
358
|
+
status="info"
|
|
359
|
+
title="Controls Test"
|
|
360
|
+
collapsible={{defaultIsOpen: true}}>
|
|
277
361
|
<div data-testid="region-content">Region content</div>
|
|
278
362
|
</Banner>,
|
|
279
363
|
);
|
|
@@ -469,7 +553,9 @@ describe('Banner', () => {
|
|
|
469
553
|
before.focus();
|
|
470
554
|
|
|
471
555
|
await user.tab();
|
|
472
|
-
expect(
|
|
556
|
+
expect(
|
|
557
|
+
screen.getByRole('button', {name: 'Dismiss Heads up'}),
|
|
558
|
+
).toHaveFocus();
|
|
473
559
|
|
|
474
560
|
await user.keyboard('{Enter}');
|
|
475
561
|
|
|
@@ -486,7 +572,7 @@ describe('Banner', () => {
|
|
|
486
572
|
<Banner status="info" title="Heads up" isDismissable />
|
|
487
573
|
</>,
|
|
488
574
|
);
|
|
489
|
-
await user.click(screen.getByRole('button', {name: 'Dismiss'}));
|
|
575
|
+
await user.click(screen.getByRole('button', {name: 'Dismiss Heads up'}));
|
|
490
576
|
expect(screen.queryByRole('status')).not.toBeInTheDocument();
|
|
491
577
|
});
|
|
492
578
|
});
|
|
@@ -509,9 +595,17 @@ describe('Banner', () => {
|
|
|
509
595
|
<p>Detail</p>
|
|
510
596
|
</Banner>,
|
|
511
597
|
);
|
|
512
|
-
expect(
|
|
513
|
-
|
|
514
|
-
|
|
598
|
+
expect(screen.getByRole('button', {name: 'Expand'})).toBeInTheDocument();
|
|
599
|
+
});
|
|
600
|
+
|
|
601
|
+
it('renders no content area for children that render nothing', () => {
|
|
602
|
+
const {container} = render(
|
|
603
|
+
<Banner status="info" title="Heads up" collapsible={false}>
|
|
604
|
+
{false}
|
|
605
|
+
</Banner>,
|
|
606
|
+
);
|
|
607
|
+
// Header only — an empty slot must not draw the card-background area.
|
|
608
|
+
expect(container.firstElementChild?.children).toHaveLength(1);
|
|
515
609
|
});
|
|
516
610
|
|
|
517
611
|
it('renders no description node for a description that renders nothing', () => {
|
|
@@ -563,4 +657,62 @@ describe('Banner', () => {
|
|
|
563
657
|
expect(getComputedStyle(textColumn).flexBasis).not.toBe('8rem');
|
|
564
658
|
});
|
|
565
659
|
});
|
|
660
|
+
|
|
661
|
+
describe('dismiss control naming', () => {
|
|
662
|
+
it('names stacked string-title banners distinctly', () => {
|
|
663
|
+
render(
|
|
664
|
+
<>
|
|
665
|
+
<Banner status="error" title="Upload invoice failed" isDismissable />
|
|
666
|
+
<Banner status="error" title="Delete report failed" isDismissable />
|
|
667
|
+
</>,
|
|
668
|
+
);
|
|
669
|
+
const buttons = screen.getAllByRole('button');
|
|
670
|
+
expect(buttons.map(button => button.getAttribute('aria-label'))).toEqual([
|
|
671
|
+
'Dismiss Upload invoice failed',
|
|
672
|
+
'Dismiss Delete report failed',
|
|
673
|
+
]);
|
|
674
|
+
for (const button of buttons) {
|
|
675
|
+
expect(button).toHaveAccessibleDescription('Dismiss');
|
|
676
|
+
}
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
it('keeps the bare name and tooltip for a rich title', () => {
|
|
680
|
+
render(
|
|
681
|
+
<Banner status="info" title={<span>Rich title</span>} isDismissable />,
|
|
682
|
+
);
|
|
683
|
+
const button = screen.getByRole('button', {name: 'Dismiss'});
|
|
684
|
+
expect(button).toHaveAccessibleDescription('Dismiss');
|
|
685
|
+
});
|
|
686
|
+
|
|
687
|
+
it('uses a translated dismissLabel for a rich title and its tooltip', () => {
|
|
688
|
+
render(
|
|
689
|
+
<Banner
|
|
690
|
+
status="info"
|
|
691
|
+
title={<span>Wartungshinweis</span>}
|
|
692
|
+
isDismissable
|
|
693
|
+
dismissLabel="Wartungshinweis schließen"
|
|
694
|
+
/>,
|
|
695
|
+
);
|
|
696
|
+
const button = screen.getByRole('button', {
|
|
697
|
+
name: 'Wartungshinweis schließen',
|
|
698
|
+
});
|
|
699
|
+
expect(button).toHaveAccessibleDescription('Wartungshinweis schließen');
|
|
700
|
+
});
|
|
701
|
+
|
|
702
|
+
it('keeps a translated verb when the titled message falls back to English', () => {
|
|
703
|
+
render(
|
|
704
|
+
<InternationalizationProvider
|
|
705
|
+
locale="de-DE"
|
|
706
|
+
overrides={{
|
|
707
|
+
'de-DE': {'@astryx.banner.dismiss': 'Schließen'},
|
|
708
|
+
}}>
|
|
709
|
+
<Banner status="info" title="Wartungshinweis" isDismissable />
|
|
710
|
+
</InternationalizationProvider>,
|
|
711
|
+
);
|
|
712
|
+
const button = screen.getByRole('button', {
|
|
713
|
+
name: 'Schließen Wartungshinweis',
|
|
714
|
+
});
|
|
715
|
+
expect(button).toHaveAccessibleDescription('Schließen');
|
|
716
|
+
});
|
|
717
|
+
});
|
|
566
718
|
});
|
package/src/Banner/Banner.tsx
CHANGED
|
@@ -4,20 +4,24 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Banner.tsx
|
|
7
|
-
* @input Uses React useState/useRef/useId, Button, Icon (with registry string names), StyleX
|
|
7
|
+
* @input Uses React useState/useRef/useId, useCollapsible, Button, Icon (with registry string names), StyleX
|
|
8
8
|
* @output Exports Banner component, BannerProps, BannerStatus, BannerContainer types
|
|
9
9
|
* @position Core implementation; consumed by index.ts, tested by Banner.test.tsx
|
|
10
10
|
*
|
|
11
11
|
* Visual structure:
|
|
12
12
|
* - Root container: layout-only wrapper (flex column), no visual styling, no theme target
|
|
13
13
|
* - Header area (themeProps 'banner'): colored status background with icon, title, description, actions, dismiss
|
|
14
|
-
* - Content area (themeProps 'banner-content'):
|
|
14
|
+
* - Content area (themeProps 'banner-content'): card background for additional content (children)
|
|
15
15
|
* - Status icon (themeProps 'banner-icon'): the target rides on the default
|
|
16
16
|
* <Icon> itself — the element that paints — so 'status:X' overrides reach
|
|
17
17
|
* the glyph (#4166); for a custom `icon` node it stays on the layout wrapper
|
|
18
18
|
* - No left border accent — color is expressed through the full header background
|
|
19
19
|
* - Each visual area owns its own border-radius (no overflow:clip on the container)
|
|
20
|
-
* -
|
|
20
|
+
* - Children are collapsible by default: a toggle appears in the header end
|
|
21
|
+
* area and the content starts closed. `collapsible={false}` opts out and
|
|
22
|
+
* pins the content open with no toggle. The whole collapse axis (enabled /
|
|
23
|
+
* default / controlled) lives on that one prop and is driven by the shared
|
|
24
|
+
* `useCollapsible` hook rather than local state.
|
|
21
25
|
*
|
|
22
26
|
* A status added through `BannerStatusMap` augmentation has no entry in the
|
|
23
27
|
* status lookups, so it renders with no status fill, no default glyph and the
|
|
@@ -55,6 +59,8 @@ import {
|
|
|
55
59
|
easeVars,
|
|
56
60
|
shadowVars,
|
|
57
61
|
} from '../theme/tokens.stylex';
|
|
62
|
+
import {useCollapsible} from '../Collapsible/useCollapsible';
|
|
63
|
+
import type {CollapsibleConfig} from '../Collapsible/useCollapsible';
|
|
58
64
|
import {composeEventHandlers, isRenderable, mergeProps} from '../utils';
|
|
59
65
|
import type {Elevation} from '../utils/types';
|
|
60
66
|
import {edgeCompSlot} from '../Layout/edgeCompensation.stylex';
|
|
@@ -112,6 +118,15 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
|
|
|
112
118
|
* The banner will hide itself regardless of whether this callback is provided.
|
|
113
119
|
*/
|
|
114
120
|
onDismiss?: () => void;
|
|
121
|
+
/**
|
|
122
|
+
* Accessible name and visible tooltip for the dismiss button, replacing the default.
|
|
123
|
+
* Pass an already-translated string.
|
|
124
|
+
*
|
|
125
|
+
* The default is "Dismiss {title}" when `title` is a string, so stacked
|
|
126
|
+
* banners are told apart by a screen reader; a non-string `title` falls back
|
|
127
|
+
* to "Dismiss" and should set this.
|
|
128
|
+
*/
|
|
129
|
+
dismissLabel?: string;
|
|
115
130
|
/**
|
|
116
131
|
* Action button rendered in the header area (end-aligned).
|
|
117
132
|
* Typically an Button with a secondary or ghost variant.
|
|
@@ -140,15 +155,29 @@ export interface BannerProps extends BaseProps<HTMLDivElement> {
|
|
|
140
155
|
*/
|
|
141
156
|
elevation?: Elevation;
|
|
142
157
|
/**
|
|
143
|
-
* Whether the content area (children)
|
|
144
|
-
*
|
|
145
|
-
*
|
|
158
|
+
* Whether the content area (children) sits behind an expand/collapse toggle
|
|
159
|
+
* in the header. On by default, so a banner with children behaves as it
|
|
160
|
+
* always has.
|
|
161
|
+
*
|
|
162
|
+
* - omitted / `true` — collapsible, starts collapsed
|
|
163
|
+
* - `{defaultIsOpen: true}` — collapsible, starts open
|
|
164
|
+
* - `{isOpen, onOpenChange}` — controlled by the consumer
|
|
165
|
+
* - `false` — not collapsible: children are always visible, with no toggle,
|
|
166
|
+
* no `aria-expanded`, and a content region that stays mounted
|
|
167
|
+
*
|
|
168
|
+
* Takes the shared `CollapsibleConfig` so a banner's disclosure is
|
|
169
|
+
* configured exactly like `Collapsible`'s, rather than through a
|
|
170
|
+
* Banner-only vocabulary. Banner's default differs from the hook's on one
|
|
171
|
+
* point — it starts closed, not open — because a banner's message lives in
|
|
172
|
+
* its header and the content is supplementary.
|
|
173
|
+
*
|
|
174
|
+
* @default true
|
|
146
175
|
*/
|
|
147
|
-
|
|
176
|
+
collapsible?: boolean | CollapsibleConfig;
|
|
148
177
|
/**
|
|
149
|
-
* Extra content rendered below the header in a
|
|
178
|
+
* Extra content rendered below the header in a card-background area.
|
|
150
179
|
* Use for rich content like lists, links, or detailed information.
|
|
151
|
-
*
|
|
180
|
+
* Collapsed behind a toggle unless `collapsible={false}`.
|
|
152
181
|
*/
|
|
153
182
|
children?: ReactNode;
|
|
154
183
|
}
|
|
@@ -367,11 +396,12 @@ const elevationStyles = stylex.create({
|
|
|
367
396
|
*
|
|
368
397
|
* Two-part visual structure:
|
|
369
398
|
* - Header: colored status background with icon, title, description, and actions
|
|
370
|
-
* - Content (optional):
|
|
399
|
+
* - Content (optional): card background area for additional rich content
|
|
371
400
|
*
|
|
372
|
-
* When children are provided, a
|
|
373
|
-
*
|
|
374
|
-
*
|
|
401
|
+
* When children are provided, a chevron toggle appears in the header end area
|
|
402
|
+
* (to the left of the dismiss button if present) and the content starts
|
|
403
|
+
* collapsed. Pass `collapsible={false}` for content that is always visible,
|
|
404
|
+
* or a config object to change the initial state or control it.
|
|
375
405
|
*
|
|
376
406
|
* Manages its own dismissed state internally — the banner hides on dismiss
|
|
377
407
|
* even if `onDismiss` is not provided, so product teams don't need to wire
|
|
@@ -402,9 +432,14 @@ const elevationStyles = stylex.create({
|
|
|
402
432
|
* <Banner
|
|
403
433
|
* status="warning"
|
|
404
434
|
* title="Configuration changes"
|
|
405
|
-
*
|
|
435
|
+
* collapsible={{defaultIsOpen: true}}>
|
|
406
436
|
* <p>Details here...</p>
|
|
407
437
|
* </Banner>
|
|
438
|
+
* <Banner status="error" title="3 fields need attention" collapsible={false}>
|
|
439
|
+
* <ul>
|
|
440
|
+
* <li>Email address is invalid</li>
|
|
441
|
+
* </ul>
|
|
442
|
+
* </Banner>
|
|
408
443
|
* ```
|
|
409
444
|
*/
|
|
410
445
|
export function Banner({
|
|
@@ -414,10 +449,11 @@ export function Banner({
|
|
|
414
449
|
icon,
|
|
415
450
|
isDismissable = false,
|
|
416
451
|
onDismiss,
|
|
452
|
+
dismissLabel,
|
|
417
453
|
endContent,
|
|
418
454
|
container = 'card',
|
|
419
455
|
elevation = 'none',
|
|
420
|
-
|
|
456
|
+
collapsible = true,
|
|
421
457
|
children,
|
|
422
458
|
xstyle,
|
|
423
459
|
className,
|
|
@@ -429,7 +465,26 @@ export function Banner({
|
|
|
429
465
|
}: BannerProps) {
|
|
430
466
|
const t = useTranslator();
|
|
431
467
|
const [isDismissed, setIsDismissed] = useState(false);
|
|
432
|
-
|
|
468
|
+
// The disclosure state machine is the shared one — Banner owns no collapse
|
|
469
|
+
// state of its own. `collapsible={false}` disables it, and that is what
|
|
470
|
+
// makes the content permanently visible.
|
|
471
|
+
//
|
|
472
|
+
// The one place Banner departs from the hook's defaults: `useCollapsible`
|
|
473
|
+
// opens by default, a banner starts closed. Its header already carries the
|
|
474
|
+
// message, so the content is supplementary — and this is the behaviour
|
|
475
|
+
// Banner has always had.
|
|
476
|
+
const collapsibleConfig =
|
|
477
|
+
collapsible != null && typeof collapsible === 'object' ? collapsible : {};
|
|
478
|
+
const {
|
|
479
|
+
isEnabled: isCollapsible,
|
|
480
|
+
isOpen: isExpanded,
|
|
481
|
+
toggle: handleToggleExpand,
|
|
482
|
+
} = useCollapsible({
|
|
483
|
+
isCollapsible: collapsible !== false && {
|
|
484
|
+
...collapsibleConfig,
|
|
485
|
+
defaultIsOpen: collapsibleConfig.defaultIsOpen ?? false,
|
|
486
|
+
},
|
|
487
|
+
});
|
|
433
488
|
// The element focus came from before it entered the banner. Dismissing
|
|
434
489
|
// unmounts the whole banner, dismiss button included, so without a handoff
|
|
435
490
|
// the browser drops focus to <body> and a keyboard user loses their place.
|
|
@@ -438,12 +493,22 @@ export function Banner({
|
|
|
438
493
|
// Links the expand/collapse toggle to the content region it shows/hides so
|
|
439
494
|
// assistive tech can move from the button to its controlled content
|
|
440
495
|
// (disclosure pattern). The region is conditionally rendered, so aria-controls
|
|
441
|
-
// below is set only while it's mounted to avoid a dangling reference.
|
|
496
|
+
// below is set only while it's mounted to avoid a dangling reference. A
|
|
497
|
+
// non-collapsible banner has no toggle, so neither end of the link is used.
|
|
442
498
|
const contentId = useId();
|
|
443
499
|
const defaultIconName = defaultIconNames[status];
|
|
444
500
|
const role = statusRole[status] ?? FALLBACK_ROLE;
|
|
445
501
|
const iconColor = statusIconColor[status];
|
|
446
502
|
const hasChildren = isRenderable(children);
|
|
503
|
+
// Keep the default tooltip concise while the accessible name identifies
|
|
504
|
+
// the banner; an explicit translated override names both surfaces.
|
|
505
|
+
const dismiss = t('@astryx.banner.dismiss');
|
|
506
|
+
const dismissTooltip = dismissLabel ?? dismiss;
|
|
507
|
+
const dismissName =
|
|
508
|
+
dismissLabel ??
|
|
509
|
+
(typeof title === 'string'
|
|
510
|
+
? t('@astryx.banner.dismissTitled', {dismiss, title})
|
|
511
|
+
: dismiss);
|
|
447
512
|
|
|
448
513
|
if (isDismissed) {
|
|
449
514
|
return null;
|
|
@@ -482,18 +547,19 @@ export function Banner({
|
|
|
482
547
|
}
|
|
483
548
|
};
|
|
484
549
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
550
|
+
// The toggle exists only for a collapsible banner that actually has content
|
|
551
|
+
// to disclose.
|
|
552
|
+
const hasToggle = isCollapsible && hasChildren;
|
|
489
553
|
// Show the end area if there are actions, dismiss, or a collapsible toggle
|
|
490
|
-
const showEndArea = isRenderable(endContent) || isDismissable ||
|
|
554
|
+
const showEndArea = isRenderable(endContent) || isDismissable || hasToggle;
|
|
491
555
|
// Center items vertically when there's only a title (no description)
|
|
492
556
|
// and the banner has action buttons
|
|
493
557
|
const hasActions = isRenderable(endContent) || isDismissable;
|
|
494
558
|
const isSingleLine = !isRenderable(description) && hasActions;
|
|
495
559
|
|
|
496
|
-
|
|
560
|
+
// Non-collapsible children are always shown; collapsible ones follow the
|
|
561
|
+
// hook's open state.
|
|
562
|
+
const showContent = hasChildren && (!isCollapsible || isExpanded);
|
|
497
563
|
const isCard = container === 'card';
|
|
498
564
|
|
|
499
565
|
return (
|
|
@@ -575,7 +641,7 @@ export function Banner({
|
|
|
575
641
|
edgeCompSlot.inset(spacingVars['--spacing-2']),
|
|
576
642
|
)}>
|
|
577
643
|
{endContent}
|
|
578
|
-
{
|
|
644
|
+
{hasToggle && (
|
|
579
645
|
<Button
|
|
580
646
|
variant="ghost"
|
|
581
647
|
size="sm"
|
|
@@ -610,8 +676,8 @@ export function Banner({
|
|
|
610
676
|
<Button
|
|
611
677
|
variant="ghost"
|
|
612
678
|
size="sm"
|
|
613
|
-
label={
|
|
614
|
-
tooltip={
|
|
679
|
+
label={dismissName}
|
|
680
|
+
tooltip={dismissTooltip}
|
|
615
681
|
icon={<Icon icon="close" size="sm" color="inherit" />}
|
|
616
682
|
onClick={handleDismiss}
|
|
617
683
|
isIconOnly
|
|
@@ -623,7 +689,7 @@ export function Banner({
|
|
|
623
689
|
{/* Content area: collapsible card background — theme target ('banner-content') */}
|
|
624
690
|
{showContent && (
|
|
625
691
|
<div
|
|
626
|
-
id={contentId}
|
|
692
|
+
id={hasToggle ? contentId : undefined}
|
|
627
693
|
{...mergeProps(
|
|
628
694
|
themeProps('banner-content', {container, status}),
|
|
629
695
|
stylex.props(styles.contentArea, isCard && styles.contentAreaCard),
|