@astryxdesign/core 0.5.0 → 0.5.1-canary.70169cd
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 +222 -0
- 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/AspectRatio/AspectRatio.d.ts +6 -6
- package/dist/Avatar/Avatar.d.ts +25 -1
- package/dist/Avatar/Avatar.d.ts.map +1 -1
- package/dist/Avatar/Avatar.js +43 -9
- 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 +5 -2
- 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 +11 -7
- package/dist/Badge/Badge.d.ts.map +1 -1
- package/dist/Badge/Badge.js +26 -2
- package/dist/Banner/Banner.d.ts +10 -1
- package/dist/Banner/Banner.d.ts.map +1 -1
- package/dist/Banner/Banner.js +11 -2
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +8 -7
- package/dist/Calendar/Calendar.d.ts +4 -2
- package/dist/Calendar/Calendar.d.ts.map +1 -1
- package/dist/Calendar/Calendar.js +15 -21
- package/dist/Calendar/hooks/useCalendarDays.js +4 -6
- package/dist/Calendar/hooks/useCalendarNavigation.js +4 -6
- package/dist/Calendar/styles.d.ts +5 -20
- package/dist/Calendar/styles.d.ts.map +1 -1
- package/dist/Calendar/styles.js +15 -17
- 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 +108 -7
- package/dist/CheckboxInput/CheckboxInput.d.ts.map +1 -1
- package/dist/CheckboxInput/CheckboxInput.js +7 -1
- 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/CommandPaletteItem.d.ts.map +1 -1
- package/dist/CommandPalette/CommandPaletteItem.js +2 -7
- package/dist/ComplexSelector/ComplexSelector.d.ts +10 -2
- package/dist/ComplexSelector/ComplexSelector.d.ts.map +1 -1
- package/dist/ComplexSelector/ComplexSelector.js +14 -7
- package/dist/DateInput/DateInput.d.ts +43 -0
- package/dist/DateInput/DateInput.d.ts.map +1 -1
- package/dist/DateInput/DateInput.js +22 -5
- package/dist/DateInput/MonthScroller.d.ts.map +1 -1
- package/dist/DateInput/MonthScroller.js +5 -3
- package/dist/DateInput/MonthYearWheels.d.ts.map +1 -1
- package/dist/DateInput/MonthYearWheels.js +6 -4
- 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 +52 -25
- package/dist/DateInput/Wheel.d.ts.map +1 -1
- package/dist/DateInput/Wheel.js +1 -0
- 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/DateRangeInput/DateRangeInput.js +3 -5
- package/dist/DateTimeInput/DateTimeInput.d.ts +23 -24
- package/dist/DateTimeInput/DateTimeInput.d.ts.map +1 -1
- package/dist/DateTimeInput/DateTimeInput.js +35 -10
- package/dist/DateTimeInput/TouchDateTimeField.d.ts +6 -0
- package/dist/DateTimeInput/TouchDateTimeField.d.ts.map +1 -0
- package/dist/DateTimeInput/TouchDateTimeField.js +1021 -0
- package/dist/Dialog/Dialog.d.ts +16 -2
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js +28 -7
- package/dist/DropdownMenu/DropdownMenu.d.ts.map +1 -1
- package/dist/DropdownMenu/DropdownMenu.js +4 -13
- 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/Heading/Heading.d.ts.map +1 -1
- package/dist/Heading/Heading.js +0 -1
- package/dist/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/HoverCard/HoverCard.js +104 -3
- package/dist/HoverCard/useHoverCard.d.ts +14 -2
- package/dist/HoverCard/useHoverCard.d.ts.map +1 -1
- package/dist/HoverCard/useHoverCard.js +7 -1
- package/dist/Icon/Icon.d.ts +4 -2
- package/dist/Icon/Icon.d.ts.map +1 -1
- package/dist/Icon/defaultIcons.d.ts +3 -2
- package/dist/Icon/defaultIcons.d.ts.map +1 -1
- package/dist/Icon/defaultIcons.js +7 -0
- package/dist/Icon/globalIconRegistry.d.ts +13 -0
- package/dist/Icon/globalIconRegistry.d.ts.map +1 -1
- package/dist/Icon/globalIconRegistry.js +34 -6
- package/dist/Icon/index.d.ts +1 -1
- package/dist/Icon/index.d.ts.map +1 -1
- package/dist/Icon/useIcon.d.ts +5 -2
- package/dist/Icon/useIcon.d.ts.map +1 -1
- package/dist/Icon/useIcon.js +3 -0
- 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 +2 -2
- package/dist/Kbd/Kbd.d.ts.map +1 -1
- package/dist/Kbd/Kbd.js +2 -26
- 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/useLayer.d.ts +23 -13
- package/dist/Layer/useLayer.d.ts.map +1 -1
- package/dist/Layer/useLayer.js +146 -24
- 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/parser.d.ts.map +1 -1
- package/dist/Markdown/parser.js +5 -3
- 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/MultiSelector/MultiSelector.d.ts +18 -1
- package/dist/MultiSelector/MultiSelector.d.ts.map +1 -1
- package/dist/MultiSelector/MultiSelector.js +58 -11
- 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/NavIcon/NavIcon.d.ts.map +1 -1
- package/dist/NavIcon/NavIcon.js +5 -1
- package/dist/NavItem/navItemStyles.stylex.d.ts +0 -8
- package/dist/NavItem/navItemStyles.stylex.d.ts.map +1 -1
- package/dist/NavItem/navItemStyles.stylex.js +0 -2
- package/dist/NavMenu/NavHeadingMenu.d.ts +1 -1
- package/dist/NavMenu/NavHeadingMenu.d.ts.map +1 -1
- package/dist/NavMenu/NavHeadingMenu.js +7 -4
- package/dist/NumberInput/NumberInput.d.ts +6 -1
- package/dist/NumberInput/NumberInput.d.ts.map +1 -1
- package/dist/NumberInput/NumberInput.js +95 -126
- 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 +2 -3
- package/dist/OverflowList/OverflowList.d.ts +41 -1
- package/dist/OverflowList/OverflowList.d.ts.map +1 -1
- package/dist/OverflowList/OverflowList.js +43 -2
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +8 -14
- package/dist/Popover/usePopover.d.ts +15 -41
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +26 -7
- package/dist/PowerSearch/PowerSearchValueEditor.d.ts.map +1 -1
- package/dist/PowerSearch/PowerSearchValueEditor.js +91 -18
- package/dist/PowerSearch/formatFilterValue.d.ts.map +1 -1
- package/dist/PowerSearch/formatFilterValue.js +4 -2
- package/dist/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar/ProgressBar.js +18 -5
- package/dist/Resizable/useResizable.d.ts +19 -1
- package/dist/Resizable/useResizable.d.ts.map +1 -1
- package/dist/Resizable/useResizable.js +104 -38
- package/dist/SelectableCard/SelectableCard.d.ts.map +1 -1
- package/dist/SelectableCard/SelectableCard.js +9 -0
- package/dist/Selector/Selector.d.ts +18 -1
- package/dist/Selector/Selector.d.ts.map +1 -1
- package/dist/Selector/Selector.js +92 -21
- 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 +6 -1
- package/dist/SideNav/SideNav.d.ts.map +1 -1
- package/dist/SideNav/SideNav.js +57 -27
- package/dist/SideNav/SideNavHeading.d.ts.map +1 -1
- package/dist/SideNav/SideNavHeading.js +5 -4
- package/dist/SideNav/SideNavItem.d.ts +29 -4
- package/dist/SideNav/SideNavItem.d.ts.map +1 -1
- package/dist/SideNav/SideNavItem.js +75 -20
- package/dist/Slider/Slider.d.ts.map +1 -1
- package/dist/Slider/Slider.js +34 -2
- package/dist/Spinner/Spinner.d.ts +3 -1
- package/dist/Spinner/Spinner.d.ts.map +1 -1
- package/dist/Spinner/Spinner.js +199 -20
- package/dist/StatusDot/StatusDot.d.ts.map +1 -1
- package/dist/StatusDot/StatusDot.js +6 -1
- package/dist/Stepper/Step.d.ts.map +1 -1
- package/dist/Stepper/Step.js +7 -6
- package/dist/Switch/Switch.d.ts.map +1 -1
- package/dist/Switch/Switch.js +5 -1
- package/dist/Table/BaseTable.d.ts.map +1 -1
- package/dist/Table/BaseTable.js +6 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +3 -6
- 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 +34 -3
- package/dist/Table/plugins/selection/useTableSelection.d.ts.map +1 -1
- package/dist/Table/plugins/selection/useTableSelection.js +25 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.d.ts.map +1 -1
- package/dist/Table/plugins/stickyColumns/useTableStickyColumns.js +3 -4
- package/dist/Text/Text.d.ts.map +1 -1
- package/dist/Text/Text.js +0 -1
- package/dist/TextArea/TextArea.d.ts.map +1 -1
- package/dist/TextArea/TextArea.js +13 -8
- package/dist/Timestamp/Timestamp.d.ts +1 -1
- package/dist/Timestamp/Timestamp.d.ts.map +1 -1
- package/dist/Timestamp/Timestamp.js +10 -18
- package/dist/Timestamp/formatInstant.d.ts.map +1 -1
- package/dist/Timestamp/formatInstant.js +10 -5
- package/dist/Toast/Toast.d.ts +17 -2
- package/dist/Toast/Toast.d.ts.map +1 -1
- package/dist/Toast/Toast.js +77 -11
- package/dist/Toast/ToastViewport.d.ts +1 -0
- package/dist/Toast/ToastViewport.d.ts.map +1 -1
- package/dist/Toast/ToastViewport.js +76 -21
- package/dist/Toast/index.d.ts +1 -1
- package/dist/Toast/index.d.ts.map +1 -1
- package/dist/Toast/types.d.ts +38 -0
- package/dist/Toast/types.d.ts.map +1 -1
- package/dist/Toast/useToastGesture.d.ts +26 -0
- package/dist/Toast/useToastGesture.d.ts.map +1 -0
- package/dist/Toast/useToastGesture.js +223 -0
- package/dist/Token/Token.d.ts +1 -1
- package/dist/Token/Token.d.ts.map +1 -1
- package/dist/Token/Token.js +23 -12
- package/dist/Token/TokenLink.d.ts +1 -1
- package/dist/Token/TokenLink.d.ts.map +1 -1
- package/dist/Token/TokenLink.js +5 -2
- package/dist/Tokenizer/Tokenizer.d.ts +12 -1
- package/dist/Tokenizer/Tokenizer.d.ts.map +1 -1
- package/dist/Tokenizer/Tokenizer.js +31 -21
- package/dist/TopNav/TopNavHeading.js +2 -2
- package/dist/TopNav/TopNavItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavItem.js +3 -3
- package/dist/TopNav/TopNavMegaMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMegaMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenu.js +30 -9
- package/dist/TopNav/TopNavMegaMenuItem.d.ts.map +1 -1
- package/dist/TopNav/TopNavMegaMenuItem.js +3 -3
- package/dist/TopNav/TopNavMenu.d.ts +1 -1
- package/dist/TopNav/TopNavMenu.d.ts.map +1 -1
- package/dist/TopNav/TopNavMenu.js +21 -6
- 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/TreeList/TreeListItem.d.ts.map +1 -1
- package/dist/TreeList/TreeListItem.js +2 -2
- package/dist/Typeahead/BaseTypeahead.d.ts +33 -0
- package/dist/Typeahead/BaseTypeahead.d.ts.map +1 -1
- package/dist/Typeahead/BaseTypeahead.js +51 -8
- package/dist/Typeahead/Typeahead.d.ts +8 -1
- package/dist/Typeahead/Typeahead.d.ts.map +1 -1
- package/dist/Typeahead/Typeahead.js +2 -0
- 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 +87 -22
- package/dist/hooks/useHotkeys.d.ts.map +1 -1
- package/dist/hooks/useHotkeys.js +3 -25
- package/dist/hooks/useOverflow.d.ts.map +1 -1
- package/dist/hooks/useOverflow.js +14 -4
- package/dist/i18n/InternationalizationContext.d.ts +2 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +3 -1
- package/dist/i18n/resolve.d.ts +1 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +37 -38
- package/dist/i18n/useTranslator.d.ts.map +1 -1
- package/dist/i18n/useTranslator.js +2 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/theme/Theme.d.ts.map +1 -1
- package/dist/theme/Theme.js +46 -10
- package/dist/theme/defineTheme.d.ts +9 -3
- package/dist/theme/defineTheme.d.ts.map +1 -1
- package/dist/theme/defineTheme.js +5 -0
- 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/theme/useTheme.d.ts.map +1 -1
- package/dist/theme/useTheme.js +6 -7
- package/dist/utils/dateParser.d.ts +5 -8
- package/dist/utils/dateParser.d.ts.map +1 -1
- package/dist/utils/dateParser.js +10 -11
- package/dist/utils/focusOutline.stylex.d.ts +25 -0
- package/dist/utils/focusOutline.stylex.d.ts.map +1 -1
- package/dist/utils/focusOutline.stylex.js +15 -0
- package/dist/utils/interactionOverlay.stylex.d.ts +26 -0
- package/dist/utils/interactionOverlay.stylex.d.ts.map +1 -0
- package/dist/utils/interactionOverlay.stylex.js +42 -0
- 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/plainDate.d.ts +11 -0
- package/dist/utils/plainDate.d.ts.map +1 -1
- package/dist/utils/plainDate.js +20 -4
- package/locales/af-ZA.json +7 -7
- package/locales/ar-SA.json +7 -7
- package/locales/ca-ES.json +6 -6
- package/locales/cs-CZ.json +7 -7
- package/locales/da-DK.json +7 -7
- package/locales/de-DE.json +7 -7
- package/locales/el-GR.json +7 -7
- package/locales/en.json +178 -6
- package/locales/es-ES.json +6 -6
- package/locales/fi-FI.json +7 -7
- package/locales/fr-FR.json +7 -7
- package/locales/he-IL.json +7 -7
- package/locales/hu-HU.json +7 -7
- package/locales/it-IT.json +7 -7
- package/locales/ja-JP.json +7 -7
- package/locales/ko-KR.json +7 -7
- package/locales/nl-NL.json +7 -7
- package/locales/no-NO.json +7 -7
- package/locales/pl-PL.json +7 -7
- package/locales/pseudo.json +130 -1
- package/locales/pt-BR.json +7 -7
- package/locales/pt-PT.json +7 -7
- package/locales/ro-RO.json +7 -7
- package/locales/ru-RU.json +7 -7
- package/locales/sr-SP.json +7 -7
- package/locales/sv-SE.json +7 -7
- package/locales/tr-TR.json +7 -7
- package/locales/uk-UA.json +7 -7
- package/locales/vi-VN.json +7 -7
- package/locales/zh-CN.json +7 -7
- package/locales/zh-TW.json +7 -7
- package/package.json +4 -5
- 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/AspectRatio/AspectRatio.doc.mjs +3 -3
- package/src/AspectRatio/AspectRatio.tsx +6 -6
- package/src/Avatar/Avatar.doc.mjs +12 -2
- package/src/Avatar/Avatar.test.tsx +80 -0
- package/src/Avatar/Avatar.tsx +64 -14
- 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 +12 -4
- package/src/AvatarGroup/AvatarGroupContext.ts +5 -3
- package/src/AvatarGroup/AvatarGroupOverflow.tsx +12 -12
- package/src/Badge/Badge.doc.mjs +3 -2
- package/src/Badge/Badge.test.tsx +32 -3
- package/src/Badge/Badge.tsx +42 -1
- package/src/Banner/Banner.doc.mjs +9 -0
- package/src/Banner/Banner.test.tsx +76 -11
- package/src/Banner/Banner.tsx +21 -2
- package/src/Button/Button.doc.mjs +2 -1
- package/src/Button/Button.test.tsx +19 -4
- package/src/Button/Button.tsx +9 -29
- package/src/ButtonGroup/ButtonGroup.doc.mjs +2 -2
- package/src/ButtonGroup/ButtonGroup.test.tsx +13 -0
- package/src/Calendar/Calendar.doc.mjs +4 -4
- package/src/Calendar/Calendar.test.tsx +112 -0
- package/src/Calendar/Calendar.tsx +18 -16
- package/src/Calendar/hooks/useCalendarDays.ts +4 -4
- package/src/Calendar/hooks/useCalendarNavigation.ts +4 -4
- package/src/Calendar/styles.ts +48 -42
- 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.doc.mjs +3 -0
- package/src/Carousel/Carousel.test.tsx +360 -0
- package/src/Carousel/Carousel.tsx +116 -15
- package/src/CheckboxInput/CheckboxInput.doc.mjs +3 -1
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +5 -0
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/CodeBlock/CodeBlock.doc.mjs +10 -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/CommandPaletteItem.tsx +2 -12
- package/src/ComplexSelector/ComplexSelector.doc.mjs +9 -2
- package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
- package/src/ComplexSelector/ComplexSelector.tsx +22 -12
- package/src/DateInput/DateInput.doc.mjs +17 -1
- package/src/DateInput/DateInput.test.tsx +9 -4
- package/src/DateInput/DateInput.tsx +54 -3
- package/src/DateInput/DateInputTouch.test.tsx +146 -32
- package/src/DateInput/MonthScroller.tsx +5 -1
- package/src/DateInput/MonthYearWheels.tsx +7 -4
- package/src/DateInput/NativeDateField.test.tsx +635 -0
- package/src/DateInput/NativeDateField.tsx +641 -0
- package/src/DateInput/TouchDateField.tsx +83 -33
- package/src/DateInput/Wheel.tsx +1 -0
- package/src/DateInput/index.ts +1 -0
- package/src/DateInput/nativeDateSegments.ts +127 -0
- package/src/DateRangeInput/DateRangeInput.doc.mjs +3 -3
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
- package/src/DateRangeInput/DateRangeInput.tsx +8 -13
- package/src/DateTimeInput/DateTimeInput.doc.mjs +39 -22
- package/src/DateTimeInput/DateTimeInput.test.tsx +76 -0
- package/src/DateTimeInput/DateTimeInput.tsx +54 -20
- package/src/DateTimeInput/DateTimeInputTouch.test.tsx +980 -0
- package/src/DateTimeInput/TouchDateTimeField.tsx +1437 -0
- package/src/Dialog/Dialog.test.tsx +185 -18
- package/src/Dialog/Dialog.tsx +35 -11
- package/src/DropdownMenu/DropdownMenu.test.tsx +44 -10
- package/src/DropdownMenu/DropdownMenu.tsx +4 -13
- package/src/Field/Field.doc.mjs +1 -1
- 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/FieldStatus/FieldStatus.doc.mjs +1 -1
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/Heading/Heading.tsx +0 -1
- package/src/HoverCard/HoverCard.doc.mjs +8 -2
- package/src/HoverCard/HoverCard.test.tsx +154 -4
- package/src/HoverCard/HoverCard.tsx +137 -3
- package/src/HoverCard/useHoverCard.tsx +23 -3
- package/src/Icon/Icon.test.tsx +55 -1
- package/src/Icon/Icon.tsx +5 -3
- package/src/Icon/defaultIcons.tsx +11 -2
- package/src/Icon/globalIconRegistry.test.tsx +16 -3
- package/src/Icon/globalIconRegistry.tsx +37 -6
- package/src/Icon/index.ts +1 -0
- package/src/Icon/useIcon.ts +9 -2
- package/src/Indicator/CheckboxIndicator.tsx +14 -8
- package/src/Indicator/Indicator.doc.mjs +3 -1
- package/src/InputGroup/InputGroup.doc.mjs +1 -1
- package/src/Item/Item.tsx +2 -7
- package/src/Kbd/Kbd.test.tsx +0 -17
- package/src/Kbd/Kbd.tsx +2 -26
- package/src/Layer/gestureCounter.ts +57 -0
- package/src/Layer/useLayer.test.tsx +368 -16
- package/src/Layer/useLayer.tsx +208 -35
- package/src/Layout/__tests__/edgeCompensation.test.tsx +1 -1
- package/src/List/List.test.tsx +38 -0
- package/src/List/List.tsx +8 -1
- package/src/Markdown/Markdown.test.tsx +37 -0
- package/src/Markdown/Markdown.tsx +16 -5
- package/src/Markdown/parser.test.ts +33 -0
- package/src/Markdown/parser.ts +9 -3
- package/src/MetadataList/MetadataList.test.tsx +75 -2
- package/src/MetadataList/MetadataListItem.tsx +5 -2
- package/src/MultiSelector/MultiSelector.doc.mjs +23 -2
- package/src/MultiSelector/MultiSelector.test.tsx +205 -0
- package/src/MultiSelector/MultiSelector.tsx +103 -16
- package/src/MultiSelector/hooks.ts +9 -2
- 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/NavItem/navItemStyles.stylex.ts +0 -8
- package/src/NavMenu/NavHeadingMenu.test.tsx +30 -0
- package/src/NavMenu/NavHeadingMenu.tsx +7 -4
- package/src/NumberInput/NumberInput.doc.mjs +27 -8
- package/src/NumberInput/NumberInput.test.tsx +563 -8
- package/src/NumberInput/NumberInput.tsx +77 -131
- 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 +2 -4
- package/src/OverflowList/OverflowList.doc.mjs +102 -21
- package/src/OverflowList/OverflowList.test.tsx +550 -4
- package/src/OverflowList/OverflowList.tsx +100 -2
- package/src/Pagination/Pagination.test.tsx +3 -2
- package/src/Popover/Popover.doc.mjs +2 -2
- package/src/Popover/Popover.test.tsx +38 -0
- package/src/Popover/Popover.tsx +28 -66
- package/src/Popover/usePopover.tsx +44 -5
- package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
- package/src/PowerSearch/PowerSearchEditPopover.test.tsx +87 -0
- package/src/PowerSearch/PowerSearchValueEditor.test.tsx +64 -0
- package/src/PowerSearch/PowerSearchValueEditor.tsx +109 -10
- package/src/PowerSearch/formatFilterValue.test.ts +16 -1
- package/src/PowerSearch/formatFilterValue.ts +2 -0
- 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/RadioList/RadioList.doc.mjs +1 -1
- package/src/Resizable/Resizable.doc.mjs +2 -2
- package/src/Resizable/useResizable.doc.mjs +21 -2
- package/src/Resizable/useResizable.test.ts +421 -0
- package/src/Resizable/useResizable.ts +133 -48
- package/src/SelectableCard/SelectableCard.doc.mjs +3 -0
- package/src/SelectableCard/SelectableCard.tsx +16 -0
- package/src/Selector/Selector.doc.mjs +15 -1
- package/src/Selector/Selector.source-build.test.mjs +65 -0
- package/src/Selector/Selector.test.tsx +301 -0
- package/src/Selector/Selector.tsx +145 -32
- package/src/Selector/hooks.ts +17 -2
- package/src/SideNav/SideNav.doc.mjs +2 -2
- package/src/SideNav/SideNav.test.tsx +1069 -6
- package/src/SideNav/SideNav.tsx +109 -38
- package/src/SideNav/SideNavHeading.tsx +5 -2
- package/src/SideNav/SideNavItem.doc.mjs +24 -3
- package/src/SideNav/SideNavItem.tsx +134 -44
- package/src/Slider/Slider.doc.mjs +2 -2
- package/src/Slider/Slider.test.tsx +106 -1
- package/src/Slider/Slider.tsx +52 -1
- package/src/Spinner/Spinner.doc.mjs +17 -5
- package/src/Spinner/Spinner.test.tsx +164 -0
- package/src/Spinner/Spinner.tsx +252 -22
- 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 +1 -1
- package/src/Stepper/Step.tsx +7 -14
- package/src/Switch/Switch.doc.mjs +3 -1
- package/src/Switch/Switch.test.tsx +10 -0
- package/src/Switch/Switch.tsx +3 -0
- package/src/Table/BaseTable.tsx +6 -1
- package/src/Table/Table.doc.mjs +5 -3
- package/src/Table/Table.tsx +3 -8
- package/src/Table/TableBody.doc.mjs +2 -2
- package/src/Table/TableFooter.doc.mjs +1 -1
- package/src/Table/TableHeader.doc.mjs +1 -1
- 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.tsx +50 -4
- package/src/Table/plugins/selection/useTableSelection.test.tsx +62 -0
- package/src/Table/plugins/selection/useTableSelection.tsx +25 -2
- package/src/Table/plugins/stickyColumns/useTableStickyColumns.tsx +1 -2
- package/src/Table/useTableGroupedRows.doc.mjs +3 -3
- package/src/Table/useTablePagination.doc.mjs +1 -1
- package/src/Table/useTableSelection.doc.mjs +1 -1
- package/src/Text/Text.test.tsx +44 -0
- package/src/Text/Text.tsx +0 -1
- package/src/TextArea/TextArea.doc.mjs +13 -3
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +34 -22
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.doc.mjs +1 -1
- package/src/Timestamp/Timestamp.test.tsx +89 -0
- package/src/Timestamp/Timestamp.tsx +8 -8
- package/src/Timestamp/formatInstant.ts +5 -0
- package/src/Toast/Toast.doc.mjs +213 -44
- package/src/Toast/Toast.tsx +118 -23
- package/src/Toast/ToastViewport.test.tsx +1434 -8
- package/src/Toast/ToastViewport.tsx +85 -14
- package/src/Toast/index.ts +2 -0
- package/src/Toast/types.ts +43 -5
- package/src/Toast/useToastGesture.ts +361 -0
- package/src/Token/Token.test.tsx +95 -0
- package/src/Token/Token.tsx +19 -17
- package/src/Token/TokenLink.tsx +12 -3
- package/src/Tokenizer/Tokenizer.doc.mjs +17 -4
- package/src/Tokenizer/Tokenizer.test.tsx +161 -0
- package/src/Tokenizer/Tokenizer.tsx +49 -24
- package/src/TopNav/TopNavHeading.tsx +2 -2
- package/src/TopNav/TopNavItem.tsx +3 -7
- package/src/TopNav/TopNavMegaMenu.test.tsx +104 -0
- package/src/TopNav/TopNavMegaMenu.tsx +47 -4
- package/src/TopNav/TopNavMegaMenuItem.tsx +10 -9
- package/src/TopNav/TopNavMenu.test.tsx +133 -1
- package/src/TopNav/TopNavMenu.tsx +38 -5
- package/src/TreeList/TreeList.test.tsx +49 -0
- package/src/TreeList/TreeList.tsx +7 -2
- package/src/TreeList/TreeListItem.tsx +2 -7
- package/src/Typeahead/BaseTypeahead.doc.mjs +13 -0
- package/src/Typeahead/BaseTypeahead.tsx +96 -6
- package/src/Typeahead/Typeahead.doc.mjs +7 -1
- package/src/Typeahead/Typeahead.test.tsx +154 -0
- package/src/Typeahead/Typeahead.tsx +9 -0
- package/src/Typeahead/TypeaheadItem.test.tsx +43 -0
- package/src/Typeahead/TypeaheadItem.tsx +8 -1
- package/src/hooks/useAnnounce.doc.mjs +96 -0
- package/src/hooks/useDevWarning.doc.mjs +96 -0
- package/src/hooks/useHotkeys.test.ts +0 -18
- package/src/hooks/useHotkeys.ts +3 -25
- 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/useOverflow.doc.mjs +58 -17
- package/src/hooks/useOverflow.ts +16 -4
- package/src/hooks/useTypeahead.doc.mjs +153 -0
- package/src/i18n/InternationalizationContext.ts +3 -0
- package/src/i18n/InternationalizationProvider.tsx +8 -1
- package/src/i18n/__tests__/resolve.test.ts +23 -1
- package/src/i18n/resolve.ts +46 -49
- package/src/i18n/useTranslator.ts +2 -7
- package/src/index.ts +2 -0
- package/src/raw-import.d.ts +14 -0
- 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/defineTheme.ts +12 -3
- package/src/theme/derivedVarRegistry.test.ts +87 -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/theme/useTheme.test.tsx +10 -0
- package/src/theme/useTheme.ts +16 -10
- package/src/utils/dateParser.test.ts +34 -2
- package/src/utils/dateParser.ts +11 -14
- package/src/utils/focusOutline.stylex.ts +50 -0
- package/src/utils/interactionOverlay.stylex.ts +74 -0
- package/src/utils/isApplePlatform.test.ts +61 -0
- package/src/utils/isApplePlatform.ts +37 -0
- package/src/utils/plainDate.test.ts +46 -0
- package/src/utils/plainDate.ts +18 -3
|
@@ -9,12 +9,65 @@
|
|
|
9
9
|
* SYNC: When AlertDialog.tsx changes, update tests to match new behavior
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
-
import {describe, it, expect, vi, beforeEach} from 'vitest';
|
|
13
|
-
import {
|
|
12
|
+
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
|
+
import {
|
|
14
|
+
render,
|
|
15
|
+
screen,
|
|
16
|
+
fireEvent,
|
|
17
|
+
waitFor,
|
|
18
|
+
within,
|
|
19
|
+
} from '@testing-library/react';
|
|
14
20
|
import userEvent from '@testing-library/user-event';
|
|
15
21
|
import {AlertDialog} from './AlertDialog';
|
|
16
22
|
import {useImperativeAlertDialog} from './useImperativeAlertDialog';
|
|
17
23
|
|
|
24
|
+
function stubAlertDialogMedia({
|
|
25
|
+
smallScreen,
|
|
26
|
+
coarsePointer,
|
|
27
|
+
noHover,
|
|
28
|
+
reduceMotion = false,
|
|
29
|
+
}: {
|
|
30
|
+
smallScreen: boolean;
|
|
31
|
+
coarsePointer: boolean;
|
|
32
|
+
noHover: boolean;
|
|
33
|
+
reduceMotion?: boolean;
|
|
34
|
+
}): void {
|
|
35
|
+
vi.stubGlobal(
|
|
36
|
+
'matchMedia',
|
|
37
|
+
vi.fn((query: string) => {
|
|
38
|
+
let matches = false;
|
|
39
|
+
if (query.includes('max-width: 640px')) {
|
|
40
|
+
matches = smallScreen;
|
|
41
|
+
} else if (query.includes('pointer: coarse')) {
|
|
42
|
+
matches = coarsePointer;
|
|
43
|
+
} else if (query.includes('pointer: fine')) {
|
|
44
|
+
matches = !coarsePointer;
|
|
45
|
+
} else if (query.includes('hover: none')) {
|
|
46
|
+
matches = noHover;
|
|
47
|
+
} else if (query.includes('hover: hover')) {
|
|
48
|
+
matches = !noHover;
|
|
49
|
+
} else if (query.includes('prefers-reduced-motion: reduce')) {
|
|
50
|
+
matches = reduceMotion;
|
|
51
|
+
} else if (query.includes('prefers-reduced-motion: no-preference')) {
|
|
52
|
+
matches = !reduceMotion;
|
|
53
|
+
} else if (query.includes('prefers-reduced-motion')) {
|
|
54
|
+
matches = reduceMotion;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
matches,
|
|
59
|
+
media: query,
|
|
60
|
+
onchange: null,
|
|
61
|
+
addEventListener: vi.fn(),
|
|
62
|
+
removeEventListener: vi.fn(),
|
|
63
|
+
addListener: vi.fn(),
|
|
64
|
+
removeListener: vi.fn(),
|
|
65
|
+
dispatchEvent: vi.fn(),
|
|
66
|
+
};
|
|
67
|
+
}),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
18
71
|
beforeEach(() => {
|
|
19
72
|
HTMLDialogElement.prototype.showModal = vi.fn(function (
|
|
20
73
|
this: HTMLDialogElement,
|
|
@@ -26,6 +79,10 @@ beforeEach(() => {
|
|
|
26
79
|
});
|
|
27
80
|
});
|
|
28
81
|
|
|
82
|
+
afterEach(() => {
|
|
83
|
+
vi.unstubAllGlobals();
|
|
84
|
+
});
|
|
85
|
+
|
|
29
86
|
describe('AlertDialog', () => {
|
|
30
87
|
const defaultProps = {
|
|
31
88
|
isOpen: true,
|
|
@@ -109,6 +166,158 @@ describe('AlertDialog', () => {
|
|
|
109
166
|
expect(screen.getByRole('alertdialog')).toBeInTheDocument();
|
|
110
167
|
});
|
|
111
168
|
|
|
169
|
+
describe('responsive actions', () => {
|
|
170
|
+
const longCancelLabel = 'Keep this workspace and all of its dashboards';
|
|
171
|
+
const longActionLabel =
|
|
172
|
+
'Permanently delete this workspace and all dashboards';
|
|
173
|
+
|
|
174
|
+
it('preserves the preferred width and horizontal order above the small breakpoint', () => {
|
|
175
|
+
stubAlertDialogMedia({
|
|
176
|
+
smallScreen: false,
|
|
177
|
+
coarsePointer: false,
|
|
178
|
+
noHover: false,
|
|
179
|
+
});
|
|
180
|
+
render(<AlertDialog {...defaultProps} />);
|
|
181
|
+
|
|
182
|
+
expect(window.matchMedia).toHaveBeenCalledWith('(max-width: 640px)');
|
|
183
|
+
expect(window.matchMedia).not.toHaveBeenCalledWith('(pointer: coarse)');
|
|
184
|
+
expect(window.matchMedia).not.toHaveBeenCalledWith('(hover: none)');
|
|
185
|
+
const dialog = screen.getByRole('alertdialog');
|
|
186
|
+
const buttons = within(dialog).getAllByRole('button');
|
|
187
|
+
const footerStack = buttons[0].parentElement!;
|
|
188
|
+
expect(dialog.getAttribute('style')).toContain('--x-width: 400px');
|
|
189
|
+
expect(dialog.getAttribute('style')).toContain(
|
|
190
|
+
'--x-maxWidth: min(100%, calc(100dvw - var(--spacing-4) - var(--spacing-4)))',
|
|
191
|
+
);
|
|
192
|
+
expect(buttons.map(button => button.textContent)).toEqual([
|
|
193
|
+
'Cancel',
|
|
194
|
+
'Delete',
|
|
195
|
+
]);
|
|
196
|
+
expect(getComputedStyle(footerStack).flexWrap).toBe('wrap');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it('keeps long action buttons within the wide horizontal footer without changing Button sizing', () => {
|
|
200
|
+
stubAlertDialogMedia({
|
|
201
|
+
smallScreen: false,
|
|
202
|
+
coarsePointer: false,
|
|
203
|
+
noHover: false,
|
|
204
|
+
});
|
|
205
|
+
render(
|
|
206
|
+
<AlertDialog
|
|
207
|
+
{...defaultProps}
|
|
208
|
+
cancelLabel={longCancelLabel}
|
|
209
|
+
actionLabel={longActionLabel}
|
|
210
|
+
/>,
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
const dialog = screen.getByRole('alertdialog');
|
|
214
|
+
const buttons = within(dialog).getAllByRole('button');
|
|
215
|
+
const footerStack = buttons[0].parentElement!;
|
|
216
|
+
expect(buttons.map(button => button.textContent)).toEqual([
|
|
217
|
+
longCancelLabel,
|
|
218
|
+
longActionLabel,
|
|
219
|
+
]);
|
|
220
|
+
expect(getComputedStyle(footerStack).flexWrap).toBe('wrap');
|
|
221
|
+
for (const button of buttons) {
|
|
222
|
+
const computed = getComputedStyle(button);
|
|
223
|
+
expect(computed.whiteSpace).toBe('nowrap');
|
|
224
|
+
expect(computed.height).toBe('var(--size-element-md)');
|
|
225
|
+
expect(computed.maxWidth).toBe('100%');
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it('stacks long destructive action labels above cancel on a narrow fine-pointer screen', () => {
|
|
230
|
+
stubAlertDialogMedia({
|
|
231
|
+
smallScreen: true,
|
|
232
|
+
coarsePointer: false,
|
|
233
|
+
noHover: false,
|
|
234
|
+
});
|
|
235
|
+
render(
|
|
236
|
+
<AlertDialog
|
|
237
|
+
{...defaultProps}
|
|
238
|
+
cancelLabel={longCancelLabel}
|
|
239
|
+
actionLabel={longActionLabel}
|
|
240
|
+
/>,
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
expect(window.matchMedia).toHaveBeenCalledWith('(max-width: 640px)');
|
|
244
|
+
expect(window.matchMedia).not.toHaveBeenCalledWith('(pointer: coarse)');
|
|
245
|
+
expect(window.matchMedia).not.toHaveBeenCalledWith('(hover: none)');
|
|
246
|
+
const dialog = screen.getByRole('alertdialog');
|
|
247
|
+
const buttons = within(dialog).getAllByRole('button');
|
|
248
|
+
const footerStack = buttons[0].parentElement!;
|
|
249
|
+
expect(dialog.getAttribute('style')).toContain('--x-width: 400px');
|
|
250
|
+
expect(buttons.map(button => button.textContent)).toEqual([
|
|
251
|
+
longActionLabel,
|
|
252
|
+
longCancelLabel,
|
|
253
|
+
]);
|
|
254
|
+
expect(getComputedStyle(footerStack).flexDirection).toBe('column');
|
|
255
|
+
for (const button of buttons) {
|
|
256
|
+
const computed = getComputedStyle(button);
|
|
257
|
+
expect(computed.whiteSpace).toBe('nowrap');
|
|
258
|
+
expect(computed.width).toBe('100%');
|
|
259
|
+
expect(computed.maxWidth).toBe('100%');
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
it('uses the same stacked layout on a mobile touch screen', () => {
|
|
264
|
+
stubAlertDialogMedia({
|
|
265
|
+
smallScreen: true,
|
|
266
|
+
coarsePointer: true,
|
|
267
|
+
noHover: true,
|
|
268
|
+
});
|
|
269
|
+
render(
|
|
270
|
+
<AlertDialog
|
|
271
|
+
{...defaultProps}
|
|
272
|
+
cancelLabel="Keep this workspace"
|
|
273
|
+
actionLabel="Permanently delete workspace"
|
|
274
|
+
/>,
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
expect(window.matchMedia).toHaveBeenCalledWith('(max-width: 640px)');
|
|
278
|
+
expect(window.matchMedia).not.toHaveBeenCalledWith('(pointer: coarse)');
|
|
279
|
+
expect(window.matchMedia).not.toHaveBeenCalledWith('(hover: none)');
|
|
280
|
+
const dialog = screen.getByRole('alertdialog');
|
|
281
|
+
const buttons = within(dialog).getAllByRole('button');
|
|
282
|
+
expect(dialog.getAttribute('style')).toContain('--x-width: 400px');
|
|
283
|
+
expect(buttons.map(button => button.textContent)).toEqual([
|
|
284
|
+
'Permanently delete workspace',
|
|
285
|
+
'Keep this workspace',
|
|
286
|
+
]);
|
|
287
|
+
expect(getComputedStyle(buttons[0]).whiteSpace).toBe('nowrap');
|
|
288
|
+
expect(getComputedStyle(buttons[0]).width).toBe('100%');
|
|
289
|
+
expect(getComputedStyle(buttons[1]).whiteSpace).toBe('nowrap');
|
|
290
|
+
expect(getComputedStyle(buttons[1]).width).toBe('100%');
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it('keeps narrow visual, DOM, and tab order aligned while autofocus stays on cancel', async () => {
|
|
294
|
+
const user = userEvent.setup();
|
|
295
|
+
stubAlertDialogMedia({
|
|
296
|
+
smallScreen: true,
|
|
297
|
+
coarsePointer: false,
|
|
298
|
+
noHover: false,
|
|
299
|
+
});
|
|
300
|
+
render(
|
|
301
|
+
<AlertDialog
|
|
302
|
+
{...defaultProps}
|
|
303
|
+
cancelLabel={longCancelLabel}
|
|
304
|
+
actionLabel={longActionLabel}
|
|
305
|
+
/>,
|
|
306
|
+
);
|
|
307
|
+
|
|
308
|
+
const action = screen.getByRole('button', {name: longActionLabel});
|
|
309
|
+
const cancel = screen.getByRole('button', {name: longCancelLabel});
|
|
310
|
+
expect(
|
|
311
|
+
action.compareDocumentPosition(cancel) &
|
|
312
|
+
Node.DOCUMENT_POSITION_FOLLOWING,
|
|
313
|
+
).toBeTruthy();
|
|
314
|
+
expect(cancel).toHaveAttribute('data-autofocus');
|
|
315
|
+
action.focus();
|
|
316
|
+
await user.tab();
|
|
317
|
+
expect(cancel).toHaveFocus();
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
|
|
112
321
|
it('defaults cancel label to Cancel', () => {
|
|
113
322
|
render(<AlertDialog {...defaultProps} />);
|
|
114
323
|
expect(screen.getByText('Cancel')).toBeInTheDocument();
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file AlertDialog.tsx
|
|
7
|
-
* @input Uses React, Dialog, Layout, Heading, Text, Button
|
|
7
|
+
* @input Uses React, StyleX, Dialog, Layout, Heading, Text, Button
|
|
8
8
|
* @output Exports AlertDialog component, AlertDialogProps type
|
|
9
9
|
* @position Core implementation; consumed by index.ts, tested by AlertDialog.test.tsx
|
|
10
10
|
*
|
|
@@ -17,11 +17,12 @@
|
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
19
|
import React, {useId, useCallback} from 'react';
|
|
20
|
+
import * as stylex from '@stylexjs/stylex';
|
|
20
21
|
import {Dialog} from '../Dialog';
|
|
21
22
|
import {Layout} from '../Layout/Layout';
|
|
22
23
|
import {LayoutContent} from '../Layout/LayoutContent';
|
|
23
24
|
import {LayoutFooter} from '../Layout/LayoutFooter';
|
|
24
|
-
import {
|
|
25
|
+
import {Stack} from '../Stack';
|
|
25
26
|
import {Heading} from '../Heading/Heading';
|
|
26
27
|
import {Text} from '../Text/Text';
|
|
27
28
|
import {Button, type ButtonVariant} from '../Button';
|
|
@@ -29,6 +30,19 @@ import type {BaseProps} from '../BaseProps';
|
|
|
29
30
|
import {mergeProps} from '../utils';
|
|
30
31
|
import {themeProps} from '../utils/themeProps';
|
|
31
32
|
import {useTranslator} from '../i18n';
|
|
33
|
+
import {useMediaQuery} from '../hooks';
|
|
34
|
+
|
|
35
|
+
const SMALL_SCREEN_QUERY = '(max-width: 640px)';
|
|
36
|
+
|
|
37
|
+
const styles = stylex.create({
|
|
38
|
+
action: {
|
|
39
|
+
maxWidth: '100%',
|
|
40
|
+
minWidth: 0,
|
|
41
|
+
},
|
|
42
|
+
stackedAction: {
|
|
43
|
+
width: '100%',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
32
46
|
|
|
33
47
|
export interface AlertDialogProps extends BaseProps<HTMLDialogElement> {
|
|
34
48
|
ref?: React.Ref<HTMLDialogElement>;
|
|
@@ -147,11 +161,44 @@ export function AlertDialog({
|
|
|
147
161
|
const cancelLabel = cancelLabelFromProps ?? t('@astryx.alertDialog.cancel');
|
|
148
162
|
const titleId = useId();
|
|
149
163
|
const descriptionId = useId();
|
|
164
|
+
// Width stays delegated to Dialog: this query exists only so AlertDialog can
|
|
165
|
+
// keep narrow visual, DOM, and tab order aligned for its destructive/cancel
|
|
166
|
+
// semantics without coupling action order to pointer or hover capability.
|
|
167
|
+
const isSmallScreen = useMediaQuery(SMALL_SCREEN_QUERY);
|
|
150
168
|
|
|
151
169
|
const handleCancel = useCallback(() => {
|
|
152
170
|
onOpenChange(false);
|
|
153
171
|
}, [onOpenChange]);
|
|
154
172
|
|
|
173
|
+
const buttonActionStyle = [
|
|
174
|
+
styles.action,
|
|
175
|
+
isSmallScreen && styles.stackedAction,
|
|
176
|
+
];
|
|
177
|
+
const cancelButton = (
|
|
178
|
+
<Button
|
|
179
|
+
key="cancel"
|
|
180
|
+
variant="ghost"
|
|
181
|
+
label={cancelLabel}
|
|
182
|
+
onClick={handleCancel}
|
|
183
|
+
xstyle={buttonActionStyle}
|
|
184
|
+
// Dialog focuses [data-autofocus] itself after showModal(), because
|
|
185
|
+
// React's autoFocus runs during commit while the dialog is invisible.
|
|
186
|
+
// Cancel is least destructive, so it remains the autofocus target even
|
|
187
|
+
// when small-screen visual order places the destructive action above it.
|
|
188
|
+
data-autofocus
|
|
189
|
+
/>
|
|
190
|
+
);
|
|
191
|
+
const actionButton = (
|
|
192
|
+
<Button
|
|
193
|
+
key="action"
|
|
194
|
+
variant={actionVariant}
|
|
195
|
+
label={actionLabel}
|
|
196
|
+
onClick={onAction}
|
|
197
|
+
isLoading={isActionLoading}
|
|
198
|
+
xstyle={buttonActionStyle}
|
|
199
|
+
/>
|
|
200
|
+
);
|
|
201
|
+
|
|
155
202
|
return (
|
|
156
203
|
<Dialog
|
|
157
204
|
{...rest}
|
|
@@ -185,24 +232,19 @@ export function AlertDialog({
|
|
|
185
232
|
}
|
|
186
233
|
footer={
|
|
187
234
|
<LayoutFooter>
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
label={actionLabel}
|
|
202
|
-
onClick={onAction}
|
|
203
|
-
isLoading={isActionLoading}
|
|
204
|
-
/>
|
|
205
|
-
</HStack>
|
|
235
|
+
{/* Generic Dialog footers should wrap, but their consumers own
|
|
236
|
+
action semantics and order. AlertDialog keeps this
|
|
237
|
+
destructive-above-Cancel narrow order because confirmation
|
|
238
|
+
actions have component-specific meaning here. */}
|
|
239
|
+
<Stack
|
|
240
|
+
direction={isSmallScreen ? 'vertical' : 'horizontal'}
|
|
241
|
+
gap={2}
|
|
242
|
+
hAlign={isSmallScreen ? 'stretch' : 'end'}
|
|
243
|
+
wrap={isSmallScreen ? 'nowrap' : 'wrap'}>
|
|
244
|
+
{isSmallScreen
|
|
245
|
+
? [actionButton, cancelButton]
|
|
246
|
+
: [cancelButton, actionButton]}
|
|
247
|
+
</Stack>
|
|
206
248
|
</LayoutFooter>
|
|
207
249
|
}
|
|
208
250
|
/>
|
|
@@ -16,7 +16,7 @@ export const docs = {
|
|
|
16
16
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
17
17
|
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
18
18
|
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
19
|
-
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule
|
|
19
|
+
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule; component styles live in the `astryx-base` cascade layer, so unlayered consumer CSS wins. Give an `xstyle` rule a `default` branch alongside the conditional one (`{default: 3, \'@container ...\': \'3 / 2\'}`); with only the conditional branch the ratio is unset outside the query and the box collapses.'},
|
|
20
20
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
21
21
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
22
22
|
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
@@ -84,7 +84,7 @@ export const docsZh = {
|
|
|
84
84
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
85
85
|
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
86
86
|
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
87
|
-
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule
|
|
87
|
+
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule; component styles live in the `astryx-base` cascade layer, so unlayered consumer CSS wins. Give an `xstyle` rule a `default` branch alongside the conditional one (`{default: 3, \'@container ...\': \'3 / 2\'}`); with only the conditional branch the ratio is unset outside the query and the box collapses.'},
|
|
88
88
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
89
89
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
90
90
|
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
@@ -135,7 +135,7 @@ export const docsDense = {
|
|
|
135
135
|
{guidance: true, description: 'Use `fit="cover"` for images and video so the component sizes the child; the child should not repeat `width`/`height`/`objectFit` styles.'},
|
|
136
136
|
{guidance: true, description: 'Pass one child. With `fit` set, every direct child is stretched to fill the box, so put an overlay or caption inside a single wrapper child rather than passing it as a second child.'},
|
|
137
137
|
{guidance: true, description: 'Describe media children with `alt`, or `alt=""` when the image is decorative. AspectRatio adds no role and no accessible name of its own, so the child carries the whole accessible description.'},
|
|
138
|
-
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule
|
|
138
|
+
{guidance: true, description: 'For a breakpoint-dependent ratio, override the ratio responsively: pass an `aspectRatio` rule via `xstyle` (StyleX), or override `aspect-ratio` from your own unlayered CSS under a `@media`/`@container` rule; component styles live in the `astryx-base` cascade layer, so unlayered consumer CSS wins. Give an `xstyle` rule a `default` branch alongside the conditional one (`{default: 3, \'@container ...\': \'3 / 2\'}`); with only the conditional branch the ratio is unset outside the query and the box collapses.'},
|
|
139
139
|
{guidance: false, description: 'Use for general layout containers; use standard layout components instead.'},
|
|
140
140
|
{guidance: false, description: 'Nest AspectRatio containers; one level is sufficient.'},
|
|
141
141
|
{guidance: false, description: 'Constrain the height on its own. The width comes from the container, so a `height` or `maxHeight` by itself clamps the box off ratio; pair it with `width: "auto"` to size from the height instead.'},
|
|
@@ -53,14 +53,14 @@ export interface AspectRatioProps extends BaseProps<HTMLDivElement> {
|
|
|
53
53
|
* `astryx-base` cascade layer, and unlayered CSS wins over layered
|
|
54
54
|
* rules regardless of specificity.
|
|
55
55
|
*
|
|
56
|
+
* A responsive ratio is set in CSS, not on the component. For example, a 3:1
|
|
57
|
+
* hero can become 3:2 when its container narrows by targeting the element's
|
|
58
|
+
* class from a container query:
|
|
59
|
+
* `@container gallery (max-width: 720px) { .gallery-hero { aspect-ratio: 3 / 2; } }`.
|
|
60
|
+
*
|
|
56
61
|
* @example
|
|
57
62
|
* ```
|
|
58
|
-
*
|
|
59
|
-
* <AspectRatio ratio={3 / 1} className="gallery-hero">…</AspectRatio>
|
|
60
|
-
*
|
|
61
|
-
* // CSS: @container gallery (max-width: 720px) {
|
|
62
|
-
* // .gallery-hero { aspect-ratio: 3 / 2; }
|
|
63
|
-
* // }
|
|
63
|
+
* <AspectRatio ratio={3 / 1} className="gallery-hero">...</AspectRatio>
|
|
64
64
|
* ```
|
|
65
65
|
*/
|
|
66
66
|
ratio: number;
|
|
@@ -19,7 +19,7 @@ export const docs = {
|
|
|
19
19
|
{guidance: true, description: 'Give every interactive avatar (href or onClick) a name or alt. It is the control\'s accessible name, and it warns in development when it is missing.'},
|
|
20
20
|
{guidance: false, description: 'Rely on a status label to name an interactive avatar. "Online" says nothing about where the link goes.'},
|
|
21
21
|
{guidance: false, description: 'Use Avatar for logos, product images, or anything that isn\'t a person or team. Use an image or icon instead.'},
|
|
22
|
-
{guidance: false, description: '
|
|
22
|
+
{guidance: false, description: 'Use xstyle or className to override shape. Use the shape prop instead so themes can control it globally.'},
|
|
23
23
|
],
|
|
24
24
|
anatomy: [
|
|
25
25
|
{name: 'Photo', required: false, description: 'The profile image, loaded from the src URL. Shown when available.'},
|
|
@@ -30,13 +30,17 @@ export const docs = {
|
|
|
30
30
|
},
|
|
31
31
|
theming: {
|
|
32
32
|
targets: [
|
|
33
|
-
{className: 'astryx-avatar', visualProps: ['size']},
|
|
33
|
+
{className: 'astryx-avatar', visualProps: ['size', 'shape']},
|
|
34
34
|
{className: 'astryx-avatar-fallback', visualProps: ['size']},
|
|
35
35
|
{className: 'astryx-avatar-status-dot', visualProps: ['variant']},
|
|
36
36
|
{className: 'astryx-avatar-status-dot-glyph', visualProps: ['shape']},
|
|
37
37
|
],
|
|
38
38
|
vars: [
|
|
39
39
|
{name: '--_avatar-group-overlap', description: 'Negative inline offset applied to every avatar after the first when avatars are stacked in an AvatarGroup. Set from the group size; a more negative value tightens the stack.', default: 'set at runtime from the group avatar size (px)', private: true},
|
|
40
|
+
{name: '--_avatar-radius', description: 'Border radius of the avatar wrapper, content, focus ring, and the AvatarGroupOverflow "+N" chip. Set per shape variant by shapeStyles.', default: 'var(--radius-full)', private: true},
|
|
41
|
+
],
|
|
42
|
+
derived: [
|
|
43
|
+
{property: 'borderRadius', vars: ['--_avatar-radius']},
|
|
40
44
|
],
|
|
41
45
|
},
|
|
42
46
|
description: 'Displays a user avatar with image, initials fallback, and optional status indicator.',
|
|
@@ -67,6 +71,12 @@ export const docs = {
|
|
|
67
71
|
description: "Avatar size. Use a named size ('xsm' 20px, 'sm' 24px, 'md' 36px, 'lg' 48px, 'xl' 128px) or a numeric pixel value. Avatar shares Icon's abbreviated scale, but its tiers are larger because avatars align with media rather than glyphs. Inside an AvatarGroup the group's size wins and this prop is ignored.",
|
|
68
72
|
default: "'md'",
|
|
69
73
|
},
|
|
74
|
+
{
|
|
75
|
+
name: 'shape',
|
|
76
|
+
type: "'circle' | 'rounded' | 'square'",
|
|
77
|
+
description: "Shape variant of the avatar. 'circle' (default) stays fully round. 'rounded' uses the element radius token so it matches UI corner rounding and can be set globally via theme. 'square' has no radius. Status dot positioning adapts automatically: 4-o'clock on circle, bottom-right corner on rounded/square.",
|
|
78
|
+
default: "'circle'",
|
|
79
|
+
},
|
|
70
80
|
{
|
|
71
81
|
name: 'status',
|
|
72
82
|
type: 'ReactNode',
|
|
@@ -6,6 +6,7 @@ import {act, render, screen, fireEvent} from '@testing-library/react';
|
|
|
6
6
|
import userEvent from '@testing-library/user-event';
|
|
7
7
|
import {Avatar} from './Avatar';
|
|
8
8
|
import {AvatarStatusDot} from './AvatarStatusDot';
|
|
9
|
+
import {AvatarGroup} from '../AvatarGroup';
|
|
9
10
|
|
|
10
11
|
describe('Avatar', () => {
|
|
11
12
|
it('exposes role="img" with the name as accessible name', () => {
|
|
@@ -416,6 +417,85 @@ describe('Avatar', () => {
|
|
|
416
417
|
expect(img).toHaveAttribute('src', 'https://example.com/ada.jpg');
|
|
417
418
|
});
|
|
418
419
|
|
|
420
|
+
it('renders without error for all shape variants', () => {
|
|
421
|
+
const shapes = ['circle', 'rounded', 'square'] as const;
|
|
422
|
+
for (const shape of shapes) {
|
|
423
|
+
const {unmount} = render(
|
|
424
|
+
<Avatar
|
|
425
|
+
name="Ana Thomas"
|
|
426
|
+
shape={shape}
|
|
427
|
+
data-testid={`avatar-${shape}`}
|
|
428
|
+
/>,
|
|
429
|
+
);
|
|
430
|
+
expect(screen.getByTestId(`avatar-${shape}`)).toBeInTheDocument();
|
|
431
|
+
unmount();
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
it('defaults to circle shape (no shape prop)', () => {
|
|
436
|
+
render(<Avatar name="Lee" data-testid="avatar-default" />);
|
|
437
|
+
// Should still render with role="img" using the name as the accessible label.
|
|
438
|
+
expect(screen.getByRole('img', {name: 'Lee'})).toBeInTheDocument();
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
it('renders status dot for all shape variants', () => {
|
|
442
|
+
const shapes = ['circle', 'rounded', 'square'] as const;
|
|
443
|
+
const StatusDot = () => <span data-testid="status-dot" />;
|
|
444
|
+
for (const shape of shapes) {
|
|
445
|
+
const {unmount} = render(
|
|
446
|
+
<Avatar
|
|
447
|
+
name="Ana"
|
|
448
|
+
shape={shape}
|
|
449
|
+
status={<StatusDot />}
|
|
450
|
+
data-testid={`avatar-${shape}-status`}
|
|
451
|
+
/>,
|
|
452
|
+
);
|
|
453
|
+
expect(screen.getByTestId('status-dot')).toBeInTheDocument();
|
|
454
|
+
unmount();
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
it('applies shapeStyles to wrapper when rendered inside AvatarGroup', () => {
|
|
459
|
+
render(
|
|
460
|
+
<AvatarGroup>
|
|
461
|
+
<Avatar name="Alice" shape="rounded" data-testid="group-avatar" />
|
|
462
|
+
</AvatarGroup>,
|
|
463
|
+
);
|
|
464
|
+
expect(screen.getByTestId('group-avatar')).toBeInTheDocument();
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
it("an AvatarGroup's shape overrides an individual Avatar's own shape prop, matching how size already works", () => {
|
|
468
|
+
render(
|
|
469
|
+
<AvatarGroup shape="square">
|
|
470
|
+
<Avatar name="Alice" shape="rounded" data-testid="group-avatar" />
|
|
471
|
+
</AvatarGroup>,
|
|
472
|
+
);
|
|
473
|
+
expect(screen.getByTestId('group-avatar')).toHaveAttribute(
|
|
474
|
+
'data-shape',
|
|
475
|
+
'square',
|
|
476
|
+
);
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
it("an Avatar's own shape prop applies outside any AvatarGroup", () => {
|
|
480
|
+
render(<Avatar name="Ana" shape="rounded" data-testid="solo-avatar" />);
|
|
481
|
+
expect(screen.getByTestId('solo-avatar')).toHaveAttribute(
|
|
482
|
+
'data-shape',
|
|
483
|
+
'rounded',
|
|
484
|
+
);
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
it('defaults to circle shape inside an AvatarGroup with no explicit shape', () => {
|
|
488
|
+
render(
|
|
489
|
+
<AvatarGroup>
|
|
490
|
+
<Avatar name="Alice" shape="square" data-testid="group-avatar" />
|
|
491
|
+
</AvatarGroup>,
|
|
492
|
+
);
|
|
493
|
+
expect(screen.getByTestId('group-avatar')).toHaveAttribute(
|
|
494
|
+
'data-shape',
|
|
495
|
+
'circle',
|
|
496
|
+
);
|
|
497
|
+
});
|
|
498
|
+
|
|
419
499
|
// --- Name tooltip (tooltip?: string | boolean) ---
|
|
420
500
|
describe('name tooltip', () => {
|
|
421
501
|
const originalShowPopover = HTMLElement.prototype.showPopover;
|