@astryxdesign/core 0.5.0 → 0.5.1-canary.f64186a
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/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 +3 -3
- 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 +2 -0
- package/src/CheckboxInput/CheckboxInput.test.tsx +15 -0
- package/src/CheckboxInput/CheckboxInput.tsx +5 -0
- 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 +7 -0
- package/src/ComplexSelector/ComplexSelector.test.tsx +183 -0
- package/src/ComplexSelector/ComplexSelector.tsx +22 -12
- package/src/DateInput/DateInput.doc.mjs +16 -0
- 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 +2 -2
- package/src/DateRangeInput/DateRangeInput.test.tsx +46 -0
- package/src/DateRangeInput/DateRangeInput.tsx +8 -13
- package/src/DateTimeInput/DateTimeInput.doc.mjs +38 -21
- 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/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/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 +2 -0
- 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 +22 -1
- 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 +26 -7
- 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/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/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 +14 -0
- 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.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 +2 -0
- 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 +12 -2
- package/src/TextArea/TextArea.test.tsx +11 -0
- package/src/TextArea/TextArea.tsx +34 -22
- 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 +16 -3
- 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 +6 -0
- 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/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
|
@@ -37,6 +37,9 @@ export const docs = {
|
|
|
37
37
|
theming: {
|
|
38
38
|
container: true,
|
|
39
39
|
targets: [{className: 'astryx-selectable-card', visualProps: ['selected', 'variant']}],
|
|
40
|
+
vars: [
|
|
41
|
+
{name: '--selectable-card-ring-color', description: 'Colour of the selection ring drawn for a variant a theme added. The built-in variants each ring in their own border token and ignore this; a theme that adds a variant sets it in the same rule as that variant\'s `backgroundColor`, because no token the component could pick is guaranteed to contrast with a fill it cannot know.', default: 'var(--color-accent)'},
|
|
42
|
+
],
|
|
40
43
|
},
|
|
41
44
|
playground: {
|
|
42
45
|
defaults: {
|
|
@@ -55,6 +55,10 @@ import {useMergedRefs} from '../hooks/useMergedRefs';
|
|
|
55
55
|
|
|
56
56
|
const styles = stylex.create({
|
|
57
57
|
interactive: {
|
|
58
|
+
// Declared here, on the element that carries the `astryx-selectable-card`
|
|
59
|
+
// target, so a theme has something to override — the ring for a variant
|
|
60
|
+
// only the theme knows about reads it (see selectedUnknown).
|
|
61
|
+
'--selectable-card-ring-color': colorVars['--color-accent'],
|
|
58
62
|
position: 'relative',
|
|
59
63
|
cursor: {
|
|
60
64
|
default: 'pointer',
|
|
@@ -153,6 +157,14 @@ const styles = stylex.create({
|
|
|
153
157
|
borderColor: colorVars['--color-border-yellow'],
|
|
154
158
|
'--_card-ring': `inset 0 0 0 2px ${colorVars['--color-border-yellow']}`,
|
|
155
159
|
},
|
|
160
|
+
// A theme-added variant paints with colours the component cannot know, so no
|
|
161
|
+
// token is guaranteed to contrast with it — an accent ring disappears against
|
|
162
|
+
// an accent fill, and an outset one is no better. The theme that supplied the
|
|
163
|
+
// fill is the only thing that can pick a ring, so it gets a lever beside it;
|
|
164
|
+
// the var defaults to the accent, keeping every built-in unchanged.
|
|
165
|
+
selectedUnknown: {
|
|
166
|
+
'--_card-ring': 'inset 0 0 0 2px var(--selectable-card-ring-color)',
|
|
167
|
+
},
|
|
156
168
|
});
|
|
157
169
|
|
|
158
170
|
const selectedStyleForVariant = (variant: CardVariant) => {
|
|
@@ -181,6 +193,10 @@ const selectedStyleForVariant = (variant: CardVariant) => {
|
|
|
181
193
|
return styles.selectedTeal;
|
|
182
194
|
case 'yellow':
|
|
183
195
|
return styles.selectedYellow;
|
|
196
|
+
// CardVariant is open — a theme can add a variant this switch has never
|
|
197
|
+
// seen, and it still has to look selected.
|
|
198
|
+
default:
|
|
199
|
+
return styles.selectedUnknown;
|
|
184
200
|
}
|
|
185
201
|
};
|
|
186
202
|
|
|
@@ -89,6 +89,20 @@ export const docs = {
|
|
|
89
89
|
description: 'Placeholder text for the search input.',
|
|
90
90
|
default: "'Search...'",
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
name: 'emptyText',
|
|
94
|
+
type: 'ReactNode',
|
|
95
|
+
description:
|
|
96
|
+
'Content shown in the dropdown panel when there are no options to show, and announced in a polite live region when the panel opens (a string override is announced verbatim; a richer node falls back to the default text). Not shown while isLoading.',
|
|
97
|
+
default: "'No options'",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'emptySearchText',
|
|
101
|
+
type: 'ReactNode',
|
|
102
|
+
description:
|
|
103
|
+
'Content shown in the dropdown panel when a search query matches no options, and announced in a polite live region at the same time (a string override is announced verbatim; a richer node falls back to the default text).',
|
|
104
|
+
default: "'No results found'",
|
|
105
|
+
},
|
|
92
106
|
{
|
|
93
107
|
name: 'placeholder',
|
|
94
108
|
type: 'string',
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @file Selector.source-build.test.mjs
|
|
5
|
+
* @input Uses Babel, next/babel, the StyleX compiler, and Selector source
|
|
6
|
+
* @output Verifies raw Selector source survives a consumer's Babel pipeline
|
|
7
|
+
* @position Regression test for Selector source-build compatibility
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import fs from 'node:fs/promises';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import {fileURLToPath} from 'node:url';
|
|
13
|
+
import {transformAsync} from '@babel/core';
|
|
14
|
+
import stylexBabelPlugin from '@stylexjs/babel-plugin';
|
|
15
|
+
import {describe, expect, it} from 'vitest';
|
|
16
|
+
|
|
17
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const ROOT = path.resolve(__dirname, '../../../..');
|
|
19
|
+
const SELECTOR_SOURCE = path.join(__dirname, 'Selector.tsx');
|
|
20
|
+
|
|
21
|
+
const EXPECTED_PADDING_DECLARATIONS = [
|
|
22
|
+
'padding-block:calc((var(--size-element-sm) - var(--spacing-5) - 2 * var(--border-width)) / 2)',
|
|
23
|
+
'padding-block:calc((var(--size-element-md) - var(--spacing-5) - 2 * var(--border-width)) / 2)',
|
|
24
|
+
'padding-block:calc((var(--size-element-lg) - var(--spacing-5) - 2 * var(--border-width)) / 2)',
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
describe('Selector source-build compatibility (#5464)', () => {
|
|
28
|
+
it('compiles after next/babel lowers module-scope arrows', async () => {
|
|
29
|
+
const source = await fs.readFile(SELECTOR_SOURCE, 'utf8');
|
|
30
|
+
const result = await transformAsync(source, {
|
|
31
|
+
babelrc: false,
|
|
32
|
+
caller: {
|
|
33
|
+
name: 'selector-source-build-test',
|
|
34
|
+
isDev: false,
|
|
35
|
+
isServer: false,
|
|
36
|
+
supportsStaticESM: false,
|
|
37
|
+
},
|
|
38
|
+
configFile: false,
|
|
39
|
+
envName: 'production',
|
|
40
|
+
filename: SELECTOR_SOURCE,
|
|
41
|
+
presets: ['next/babel'],
|
|
42
|
+
plugins: [
|
|
43
|
+
[
|
|
44
|
+
stylexBabelPlugin,
|
|
45
|
+
{
|
|
46
|
+
dev: false,
|
|
47
|
+
runtimeInjection: false,
|
|
48
|
+
genConditionalClasses: true,
|
|
49
|
+
treeshakeCompensation: true,
|
|
50
|
+
unstable_moduleResolution: {
|
|
51
|
+
type: 'commonJS',
|
|
52
|
+
rootDir: ROOT,
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const declarations = (result?.metadata?.stylex ?? [])
|
|
60
|
+
.map(([, rule]) => rule.ltr.match(/^\.[^{]+\{(.+)\}$/)?.[1])
|
|
61
|
+
.filter(declaration => declaration?.startsWith('padding-block:calc'));
|
|
62
|
+
|
|
63
|
+
expect(declarations).toEqual(EXPECTED_PADDING_DECLARATIONS);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
import {describe, it, expect, vi, beforeEach, afterEach} from 'vitest';
|
|
13
13
|
import {
|
|
14
|
+
act,
|
|
14
15
|
render,
|
|
15
16
|
screen,
|
|
16
17
|
fireEvent,
|
|
@@ -943,6 +944,222 @@ describe('Selector', () => {
|
|
|
943
944
|
expect(empty).toHaveAttribute('role', 'presentation');
|
|
944
945
|
});
|
|
945
946
|
|
|
947
|
+
it('renders emptySearchText in place of the default message', async () => {
|
|
948
|
+
const user = userEvent.setup();
|
|
949
|
+
render(
|
|
950
|
+
<Selector
|
|
951
|
+
label="Fruit"
|
|
952
|
+
options={OPTIONS}
|
|
953
|
+
value="Apple"
|
|
954
|
+
onChange={() => {}}
|
|
955
|
+
hasSearch
|
|
956
|
+
emptySearchText="Nothing like that here"
|
|
957
|
+
/>,
|
|
958
|
+
);
|
|
959
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
960
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
961
|
+
|
|
962
|
+
const listbox = screen.getByRole('listbox', h);
|
|
963
|
+
expect(
|
|
964
|
+
within(listbox).getByText('Nothing like that here'),
|
|
965
|
+
).toBeInTheDocument();
|
|
966
|
+
expect(
|
|
967
|
+
within(listbox).queryByText('No results found'),
|
|
968
|
+
).not.toBeInTheDocument();
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
it('renders emptyText, not emptySearchText, with no options and no query', async () => {
|
|
972
|
+
const user = userEvent.setup();
|
|
973
|
+
render(
|
|
974
|
+
<Selector
|
|
975
|
+
label="Fruit"
|
|
976
|
+
options={[]}
|
|
977
|
+
onChange={() => {}}
|
|
978
|
+
hasSearch
|
|
979
|
+
emptySearchText="Nothing like that here"
|
|
980
|
+
/>,
|
|
981
|
+
);
|
|
982
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
983
|
+
|
|
984
|
+
const listbox = screen.getByRole('listbox', h);
|
|
985
|
+
expect(within(listbox).getByText('No options')).toBeInTheDocument();
|
|
986
|
+
expect(
|
|
987
|
+
within(listbox).queryByText('Nothing like that here'),
|
|
988
|
+
).not.toBeInTheDocument();
|
|
989
|
+
});
|
|
990
|
+
|
|
991
|
+
it('announces emptySearchText, not the catalog default', async () => {
|
|
992
|
+
const user = userEvent.setup();
|
|
993
|
+
render(
|
|
994
|
+
<Selector
|
|
995
|
+
label="Fruit"
|
|
996
|
+
options={OPTIONS}
|
|
997
|
+
value="Apple"
|
|
998
|
+
onChange={() => {}}
|
|
999
|
+
hasSearch
|
|
1000
|
+
emptySearchText="Nothing like that here"
|
|
1001
|
+
/>,
|
|
1002
|
+
);
|
|
1003
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
1004
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
1005
|
+
|
|
1006
|
+
// The panel message is role="presentation", so the live region is the
|
|
1007
|
+
// only thing a screen reader gets — it has to say the same words.
|
|
1008
|
+
await waitFor(() =>
|
|
1009
|
+
expect(politeRegion()?.textContent).toBe('Nothing like that here'),
|
|
1010
|
+
);
|
|
1011
|
+
});
|
|
1012
|
+
|
|
1013
|
+
it('announces the empty state when opened with no options', async () => {
|
|
1014
|
+
const user = userEvent.setup();
|
|
1015
|
+
render(
|
|
1016
|
+
<Selector
|
|
1017
|
+
label="Fruit"
|
|
1018
|
+
options={[]}
|
|
1019
|
+
onChange={() => {}}
|
|
1020
|
+
emptyText="Add a fruit first"
|
|
1021
|
+
/>,
|
|
1022
|
+
);
|
|
1023
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1024
|
+
|
|
1025
|
+
await waitFor(() =>
|
|
1026
|
+
expect(politeRegion()?.textContent).toBe('Add a fruit first'),
|
|
1027
|
+
);
|
|
1028
|
+
});
|
|
1029
|
+
|
|
1030
|
+
it('shows and announces nothing while isLoading', async () => {
|
|
1031
|
+
const user = userEvent.setup();
|
|
1032
|
+
render(
|
|
1033
|
+
<Selector label="Fruit" options={[]} onChange={() => {}} isLoading />,
|
|
1034
|
+
);
|
|
1035
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1036
|
+
|
|
1037
|
+
// useAnnounce writes on the next animation frame, so an immediate read
|
|
1038
|
+
// would pass whether or not anything was announced.
|
|
1039
|
+
await act(
|
|
1040
|
+
async () =>
|
|
1041
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1042
|
+
);
|
|
1043
|
+
|
|
1044
|
+
// The options have not arrived, so "No options" would be a claim the
|
|
1045
|
+
// component cannot make; the trigger's spinner carries the state.
|
|
1046
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1047
|
+
expect(within(listbox).queryByText('No options')).not.toBeInTheDocument();
|
|
1048
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1049
|
+
});
|
|
1050
|
+
|
|
1051
|
+
it('announces nothing while isLoading, matching the silent panel', async () => {
|
|
1052
|
+
const user = userEvent.setup();
|
|
1053
|
+
render(
|
|
1054
|
+
<Selector
|
|
1055
|
+
label="Fruit"
|
|
1056
|
+
options={OPTIONS}
|
|
1057
|
+
value="Apple"
|
|
1058
|
+
onChange={() => {}}
|
|
1059
|
+
hasSearch
|
|
1060
|
+
isLoading
|
|
1061
|
+
emptySearchText="Nothing like that here"
|
|
1062
|
+
/>,
|
|
1063
|
+
);
|
|
1064
|
+
await user.click(screen.getByRole('button', {name: 'Fruit'}));
|
|
1065
|
+
await user.type(screen.getByRole('combobox', h), 'xyz');
|
|
1066
|
+
|
|
1067
|
+
// useAnnounce writes on the next animation frame, so an immediate read
|
|
1068
|
+
// would pass whether or not anything was announced.
|
|
1069
|
+
await act(
|
|
1070
|
+
async () =>
|
|
1071
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1072
|
+
);
|
|
1073
|
+
|
|
1074
|
+
// The panel is deliberately blank while loading; the live region is the
|
|
1075
|
+
// only channel left, so a result there would be a claim the screen
|
|
1076
|
+
// refuses to make.
|
|
1077
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1078
|
+
expect(
|
|
1079
|
+
within(listbox).queryByText('Nothing like that here'),
|
|
1080
|
+
).not.toBeInTheDocument();
|
|
1081
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1082
|
+
});
|
|
1083
|
+
|
|
1084
|
+
it('announces the seeded query from type-to-open', async () => {
|
|
1085
|
+
render(
|
|
1086
|
+
<Selector
|
|
1087
|
+
label="Fruit"
|
|
1088
|
+
options={OPTIONS}
|
|
1089
|
+
value="Apple"
|
|
1090
|
+
onChange={() => {}}
|
|
1091
|
+
hasSearch
|
|
1092
|
+
emptySearchText="Nothing like that here"
|
|
1093
|
+
/>,
|
|
1094
|
+
);
|
|
1095
|
+
// Typing on the closed trigger opens the popup and seeds the query. That
|
|
1096
|
+
// path bypasses the search input's own change handler, so it has to
|
|
1097
|
+
// announce for itself.
|
|
1098
|
+
const trigger = screen.getByRole('button', {name: 'Fruit'});
|
|
1099
|
+
trigger.focus();
|
|
1100
|
+
fireEvent.keyDown(trigger, {key: 'z'});
|
|
1101
|
+
|
|
1102
|
+
await waitFor(() =>
|
|
1103
|
+
expect(politeRegion()?.textContent).toBe('Nothing like that here'),
|
|
1104
|
+
);
|
|
1105
|
+
});
|
|
1106
|
+
|
|
1107
|
+
it('announces the empty state when a load finishes with no options', async () => {
|
|
1108
|
+
const user = userEvent.setup();
|
|
1109
|
+
function Fetching() {
|
|
1110
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
1111
|
+
return (
|
|
1112
|
+
<>
|
|
1113
|
+
<button type="button" onClick={() => setIsLoading(false)}>
|
|
1114
|
+
land
|
|
1115
|
+
</button>
|
|
1116
|
+
<Selector
|
|
1117
|
+
label="Fruit"
|
|
1118
|
+
options={[]}
|
|
1119
|
+
onChange={() => {}}
|
|
1120
|
+
isLoading={isLoading}
|
|
1121
|
+
emptyText="Add a fruit first"
|
|
1122
|
+
/>
|
|
1123
|
+
</>
|
|
1124
|
+
);
|
|
1125
|
+
}
|
|
1126
|
+
render(<Fetching />);
|
|
1127
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1128
|
+
|
|
1129
|
+
// Open while loading: nothing on screen, nothing spoken.
|
|
1130
|
+
await act(
|
|
1131
|
+
async () =>
|
|
1132
|
+
void (await new Promise(resolve => requestAnimationFrame(resolve))),
|
|
1133
|
+
);
|
|
1134
|
+
expect(politeRegion()?.textContent ?? '').toBe('');
|
|
1135
|
+
|
|
1136
|
+
// The fetch lands empty while the panel is open. The message appears, so
|
|
1137
|
+
// the region owes the same words — an open-only announcement misses this.
|
|
1138
|
+
await user.click(screen.getByRole('button', {name: 'land'}));
|
|
1139
|
+
await waitFor(() =>
|
|
1140
|
+
expect(politeRegion()?.textContent).toBe('Add a fruit first'),
|
|
1141
|
+
);
|
|
1142
|
+
});
|
|
1143
|
+
|
|
1144
|
+
it('renders emptyText when there are no options and no search input', async () => {
|
|
1145
|
+
const user = userEvent.setup();
|
|
1146
|
+
render(
|
|
1147
|
+
<Selector
|
|
1148
|
+
label="Fruit"
|
|
1149
|
+
options={[]}
|
|
1150
|
+
onChange={() => {}}
|
|
1151
|
+
emptyText="Add a fruit first"
|
|
1152
|
+
/>,
|
|
1153
|
+
);
|
|
1154
|
+
// Without hasSearch the trigger itself is the combobox.
|
|
1155
|
+
await user.click(screen.getByRole('combobox', {name: 'Fruit'}));
|
|
1156
|
+
|
|
1157
|
+
const listbox = screen.getByRole('listbox', h);
|
|
1158
|
+
expect(
|
|
1159
|
+
within(listbox).getByText('Add a fruit first'),
|
|
1160
|
+
).toBeInTheDocument();
|
|
1161
|
+
});
|
|
1162
|
+
|
|
946
1163
|
it('calls onChange when selecting a filtered option', async () => {
|
|
947
1164
|
const user = userEvent.setup();
|
|
948
1165
|
const onChange = vi.fn();
|
|
@@ -2127,6 +2344,55 @@ describe('Selector', () => {
|
|
|
2127
2344
|
});
|
|
2128
2345
|
});
|
|
2129
2346
|
|
|
2347
|
+
describe('Selector caller-supplied id', () => {
|
|
2348
|
+
it('names the listbox with the id the caller put on the trigger', () => {
|
|
2349
|
+
render(<Selector label="Fruit" options={OPTIONS} id="fruit-picker" />);
|
|
2350
|
+
|
|
2351
|
+
const trigger = screen.getByRole('combobox');
|
|
2352
|
+
expect(trigger).toHaveAttribute('id', 'fruit-picker');
|
|
2353
|
+
|
|
2354
|
+
const labelledBy = screen
|
|
2355
|
+
.getByRole('listbox', h)
|
|
2356
|
+
.getAttribute('aria-labelledby');
|
|
2357
|
+
expect(document.getElementById(labelledBy!)).toBe(trigger);
|
|
2358
|
+
});
|
|
2359
|
+
|
|
2360
|
+
it('names the search-variant listbox with the caller id', () => {
|
|
2361
|
+
render(
|
|
2362
|
+
<Selector label="Fruit" options={OPTIONS} id="fruit-picker" hasSearch />,
|
|
2363
|
+
);
|
|
2364
|
+
|
|
2365
|
+
const trigger = document.getElementById('fruit-picker');
|
|
2366
|
+
expect(trigger?.tagName).toBe('BUTTON');
|
|
2367
|
+
|
|
2368
|
+
const labelledBy = screen
|
|
2369
|
+
.getByRole('listbox', h)
|
|
2370
|
+
.getAttribute('aria-labelledby');
|
|
2371
|
+
expect(document.getElementById(labelledBy!)).toBe(trigger);
|
|
2372
|
+
});
|
|
2373
|
+
|
|
2374
|
+
it('points the field label at the caller id', () => {
|
|
2375
|
+
render(<Selector label="Fruit" options={OPTIONS} id="fruit-picker" />);
|
|
2376
|
+
|
|
2377
|
+
const trigger = screen.getByRole('combobox', {name: 'Fruit'});
|
|
2378
|
+
expect(trigger).toHaveAttribute('id', 'fruit-picker');
|
|
2379
|
+
expect(screen.getByLabelText('Fruit')).toBe(trigger);
|
|
2380
|
+
});
|
|
2381
|
+
|
|
2382
|
+
it('generates the trigger id when the caller supplies none', () => {
|
|
2383
|
+
render(<Selector label="Fruit" options={OPTIONS} />);
|
|
2384
|
+
|
|
2385
|
+
const trigger = screen.getByRole('combobox', {name: 'Fruit'});
|
|
2386
|
+
expect(trigger.id).not.toBe('');
|
|
2387
|
+
expect(screen.getByLabelText('Fruit')).toBe(trigger);
|
|
2388
|
+
|
|
2389
|
+
const labelledBy = screen
|
|
2390
|
+
.getByRole('listbox', h)
|
|
2391
|
+
.getAttribute('aria-labelledby');
|
|
2392
|
+
expect(document.getElementById(labelledBy!)).toBe(trigger);
|
|
2393
|
+
});
|
|
2394
|
+
});
|
|
2395
|
+
|
|
2130
2396
|
describe('Selector statusVariant forwarding', () => {
|
|
2131
2397
|
it('defaults to attached (status renders with data-variant="attached")', () => {
|
|
2132
2398
|
const {container} = render(
|
|
@@ -3039,6 +3305,41 @@ describe('Selector popup theme target', () => {
|
|
|
3039
3305
|
expect(popup?.querySelector('[role="listbox"]')).not.toBeNull();
|
|
3040
3306
|
},
|
|
3041
3307
|
);
|
|
3308
|
+
|
|
3309
|
+
it('stays closed when the trigger click follows its own light dismiss (#5004)', async () => {
|
|
3310
|
+
const user = userEvent.setup();
|
|
3311
|
+
render(
|
|
3312
|
+
<Selector
|
|
3313
|
+
label="Fruit"
|
|
3314
|
+
options={OPTIONS}
|
|
3315
|
+
value="Banana"
|
|
3316
|
+
onChange={() => {}}
|
|
3317
|
+
placement="below"
|
|
3318
|
+
/>,
|
|
3319
|
+
);
|
|
3320
|
+
const trigger = screen.getByRole('combobox');
|
|
3321
|
+
await user.click(trigger);
|
|
3322
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'true');
|
|
3323
|
+
|
|
3324
|
+
// The browser dismissed the popup on pointerup and queued the toggle. When
|
|
3325
|
+
// that event lands before the click — WebKit, or any engine under load —
|
|
3326
|
+
// the click used to read a closed popup and reopen it.
|
|
3327
|
+
fireEvent.pointerDown(trigger);
|
|
3328
|
+
const popover = document.querySelector('[popover]') as HTMLElement;
|
|
3329
|
+
act(() => {
|
|
3330
|
+
popover.dispatchEvent(
|
|
3331
|
+
Object.assign(new Event('toggle'), {
|
|
3332
|
+
oldState: 'open',
|
|
3333
|
+
newState: 'closed',
|
|
3334
|
+
}),
|
|
3335
|
+
);
|
|
3336
|
+
});
|
|
3337
|
+
// Synchronously: the click falls inside the one gesture the guard covers,
|
|
3338
|
+
// as it does in a browser a few milliseconds behind the dismissal.
|
|
3339
|
+
fireEvent.click(trigger);
|
|
3340
|
+
|
|
3341
|
+
expect(trigger).toHaveAttribute('aria-expanded', 'false');
|
|
3342
|
+
});
|
|
3042
3343
|
});
|
|
3043
3344
|
|
|
3044
3345
|
describe('Selector option-row theme target', () => {
|