@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
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file useResizable.ts
|
|
7
|
-
* @input Resize configuration (defaultSize, minSizePx, maxSizePx,
|
|
7
|
+
* @input Resize configuration (defaultSize, minSizePx, maxSizePx, snaps) and
|
|
8
|
+
* collapse configuration (collapsible, defaultIsCollapsed, isCollapsed)
|
|
8
9
|
* @output Hook return: size, isCollapsed, collapse/expand/resize methods, props for handle
|
|
9
10
|
* @position Public hook; consumed by layout components via `resizable` prop
|
|
10
11
|
*/
|
|
@@ -51,16 +52,48 @@ function clampSize(size, min, max, snaps) {
|
|
|
51
52
|
}
|
|
52
53
|
return clamped;
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Reads a persisted entry. Three formats exist in storage:
|
|
57
|
+
* - `{size, isCollapsed}` — the current format; `size` is the expanded size,
|
|
58
|
+
* so the pre-collapse width survives a collapsed session
|
|
59
|
+
* - a plain non-zero number — a legacy width-only entry that never recorded
|
|
60
|
+
* collapse, so `isCollapsed` is null (unknown)
|
|
61
|
+
* - a plain `0` — written by legacy collapse, which restored the region as a
|
|
62
|
+
* zero-width expanded panel (#4790); read as "collapsed, no saved size"
|
|
63
|
+
*/
|
|
64
|
+
function loadPersistedState(key) {
|
|
55
65
|
if (typeof window === 'undefined') {
|
|
56
66
|
return null;
|
|
57
67
|
}
|
|
58
68
|
try {
|
|
59
69
|
const raw = localStorage.getItem(STORAGE_PREFIX + key);
|
|
60
|
-
if (raw
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
70
|
+
if (raw == null) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const parsed = JSON.parse(raw);
|
|
74
|
+
if (typeof parsed === 'number') {
|
|
75
|
+
if (!Number.isFinite(parsed)) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return parsed === 0 ? {
|
|
79
|
+
size: null,
|
|
80
|
+
isCollapsed: true
|
|
81
|
+
} : {
|
|
82
|
+
size: parsed,
|
|
83
|
+
isCollapsed: null
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (typeof parsed === 'object' && parsed != null) {
|
|
87
|
+
const {
|
|
88
|
+
size,
|
|
89
|
+
isCollapsed
|
|
90
|
+
} = parsed;
|
|
91
|
+
const hasSize = typeof size === 'number' && Number.isFinite(size) && size > 0;
|
|
92
|
+
if (hasSize || isCollapsed === true) {
|
|
93
|
+
return {
|
|
94
|
+
size: hasSize ? size : null,
|
|
95
|
+
isCollapsed: isCollapsed === true
|
|
96
|
+
};
|
|
64
97
|
}
|
|
65
98
|
}
|
|
66
99
|
} catch {
|
|
@@ -68,12 +101,12 @@ function loadPersistedSize(key) {
|
|
|
68
101
|
}
|
|
69
102
|
return null;
|
|
70
103
|
}
|
|
71
|
-
function
|
|
104
|
+
function persistState(key, state) {
|
|
72
105
|
if (typeof window === 'undefined') {
|
|
73
106
|
return;
|
|
74
107
|
}
|
|
75
108
|
try {
|
|
76
|
-
localStorage.setItem(STORAGE_PREFIX + key, JSON.stringify(
|
|
109
|
+
localStorage.setItem(STORAGE_PREFIX + key, JSON.stringify(state));
|
|
77
110
|
} catch {
|
|
78
111
|
/* ignore */
|
|
79
112
|
}
|
|
@@ -106,70 +139,103 @@ function useSingleResizable(config) {
|
|
|
106
139
|
maxSizePx = Infinity,
|
|
107
140
|
collapsible = false,
|
|
108
141
|
collapsedSize = DEFAULT_COLLAPSED_SIZE,
|
|
109
|
-
snaps
|
|
142
|
+
snaps: configuredSnaps,
|
|
110
143
|
autoSaveId,
|
|
144
|
+
defaultIsCollapsed,
|
|
145
|
+
isCollapsed: controlledIsCollapsed,
|
|
111
146
|
onSizeChange,
|
|
112
147
|
onCollapseChange
|
|
113
148
|
} = config;
|
|
149
|
+
const emptySnapsRef = useRef([]);
|
|
150
|
+
const snaps = configuredSnaps ?? emptySnapsRef.current;
|
|
114
151
|
const resolvedDefault = resolveDefaultSize(defaultSize);
|
|
115
|
-
const persisted = autoSaveId ?
|
|
116
|
-
const initial = persisted ?? resolvedDefault;
|
|
152
|
+
const persisted = autoSaveId ? loadPersistedState(autoSaveId) : null;
|
|
153
|
+
const initial = persisted?.size ?? resolvedDefault;
|
|
154
|
+
|
|
155
|
+
// `size` is always the *expanded* size: collapse hides it behind the
|
|
156
|
+
// isCollapsed gate below rather than zeroing it, so the width the user had
|
|
157
|
+
// survives a collapse, a persist round-trip, and an expand.
|
|
117
158
|
const [size, setSize] = useState(() => clampSize(initial, minSizePx, maxSizePx, snaps));
|
|
118
|
-
const [
|
|
119
|
-
const
|
|
159
|
+
const [uncontrolledIsCollapsed, setUncontrolledIsCollapsed] = useState(() => persisted?.isCollapsed ?? defaultIsCollapsed ?? false);
|
|
160
|
+
const isControlled = controlledIsCollapsed !== undefined;
|
|
161
|
+
const isCollapsed = collapsible && (isControlled ? controlledIsCollapsed : uncontrolledIsCollapsed);
|
|
120
162
|
const dragStartSizeRef = useRef(size);
|
|
163
|
+
|
|
164
|
+
// Mirrors isCollapsed so the callbacks below read the live value instead of
|
|
165
|
+
// the one their last render captured. Two cases reach them from a stale
|
|
166
|
+
// closure: two imperative calls in one tick, and a drag — ResizeHandle
|
|
167
|
+
// registers its pointermove listener once at pointer down, so a whole
|
|
168
|
+
// gesture runs against one props snapshot.
|
|
169
|
+
const isCollapsedRef = useRef(isCollapsed);
|
|
170
|
+
isCollapsedRef.current = isCollapsed;
|
|
171
|
+
|
|
172
|
+
// Controlled callers own the state; collapse() and a drag past the
|
|
173
|
+
// threshold report through onCollapseChange and change nothing here.
|
|
174
|
+
const setCollapsed = useCallback(value => {
|
|
175
|
+
if (!isControlled) {
|
|
176
|
+
isCollapsedRef.current = value;
|
|
177
|
+
setUncontrolledIsCollapsed(value);
|
|
178
|
+
}
|
|
179
|
+
}, [isControlled]);
|
|
121
180
|
useEffect(() => {
|
|
122
181
|
if (autoSaveId) {
|
|
123
|
-
|
|
182
|
+
persistState(autoSaveId, {
|
|
183
|
+
size,
|
|
184
|
+
isCollapsed
|
|
185
|
+
});
|
|
124
186
|
}
|
|
125
187
|
}, [size, isCollapsed, autoSaveId]);
|
|
126
188
|
const collapse = useCallback(() => {
|
|
127
|
-
|
|
189
|
+
// The already-collapsed guard keeps a repeated call from re-notifying a
|
|
190
|
+
// transition that already happened.
|
|
191
|
+
if (!collapsible || isCollapsedRef.current) {
|
|
128
192
|
return;
|
|
129
193
|
}
|
|
130
|
-
|
|
131
|
-
setIsCollapsed(true);
|
|
132
|
-
setSize(0);
|
|
194
|
+
setCollapsed(true);
|
|
133
195
|
onCollapseChange?.(true);
|
|
134
196
|
onSizeChange?.(0);
|
|
135
|
-
}, [collapsible,
|
|
197
|
+
}, [collapsible, setCollapsed, onCollapseChange, onSizeChange]);
|
|
136
198
|
const expand = useCallback(() => {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
onSizeChange?.(
|
|
143
|
-
}, [
|
|
199
|
+
const wasCollapsed = isCollapsedRef.current;
|
|
200
|
+
setCollapsed(false);
|
|
201
|
+
if (wasCollapsed) {
|
|
202
|
+
onCollapseChange?.(false);
|
|
203
|
+
}
|
|
204
|
+
onSizeChange?.(size);
|
|
205
|
+
}, [setCollapsed, size, onCollapseChange, onSizeChange]);
|
|
144
206
|
const resize = useCallback(newSize => {
|
|
145
207
|
const clamped = clampSize(newSize, minSizePx, maxSizePx, snaps);
|
|
208
|
+
const wasCollapsed = isCollapsedRef.current;
|
|
146
209
|
setSize(clamped);
|
|
147
|
-
|
|
210
|
+
setCollapsed(false);
|
|
211
|
+
// Resizing out of the collapsed state is an implicit expand — notify
|
|
212
|
+
// like the drag path does when it crosses back over the threshold.
|
|
213
|
+
if (wasCollapsed) {
|
|
214
|
+
onCollapseChange?.(false);
|
|
215
|
+
}
|
|
148
216
|
onSizeChange?.(clamped);
|
|
149
|
-
}, [minSizePx, maxSizePx, snaps, onSizeChange]);
|
|
217
|
+
}, [minSizePx, maxSizePx, snaps, setCollapsed, onCollapseChange, onSizeChange]);
|
|
150
218
|
const onResizeStart = useCallback(() => {
|
|
151
|
-
dragStartSizeRef.current =
|
|
152
|
-
}, [size
|
|
219
|
+
dragStartSizeRef.current = isCollapsedRef.current ? 0 : size;
|
|
220
|
+
}, [size]);
|
|
153
221
|
const onResizeMove = useCallback(delta => {
|
|
154
222
|
const raw = dragStartSizeRef.current + delta;
|
|
155
223
|
if (collapsible && raw < collapsedSize) {
|
|
156
|
-
if (!
|
|
157
|
-
|
|
224
|
+
if (!isCollapsedRef.current) {
|
|
225
|
+
setCollapsed(true);
|
|
158
226
|
onCollapseChange?.(true);
|
|
227
|
+
onSizeChange?.(0);
|
|
159
228
|
}
|
|
160
|
-
setIsCollapsed(true);
|
|
161
|
-
setSize(0);
|
|
162
|
-
onSizeChange?.(0);
|
|
163
229
|
return;
|
|
164
230
|
}
|
|
165
|
-
if (
|
|
166
|
-
|
|
231
|
+
if (isCollapsedRef.current && raw >= collapsedSize) {
|
|
232
|
+
setCollapsed(false);
|
|
167
233
|
onCollapseChange?.(false);
|
|
168
234
|
}
|
|
169
235
|
const clamped = clampSize(raw, minSizePx, maxSizePx, snaps);
|
|
170
236
|
setSize(clamped);
|
|
171
237
|
onSizeChange?.(clamped);
|
|
172
|
-
}, [collapsible, collapsedSize,
|
|
238
|
+
}, [collapsible, collapsedSize, setCollapsed, minSizePx, maxSizePx, snaps, onSizeChange, onCollapseChange]);
|
|
173
239
|
const onResizeEnd = useCallback(() => {
|
|
174
240
|
// Sizes already committed during move
|
|
175
241
|
}, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectableCard.d.ts","sourceRoot":"","sources":["../../src/SelectableCard/SelectableCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EACL,KAAK,SAAS,EAKd,KAAK,GAAG,EACT,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAGtE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"SelectableCard.d.ts","sourceRoot":"","sources":["../../src/SelectableCard/SelectableCard.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EACL,KAAK,SAAS,EAKd,KAAK,GAAG,EACT,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAGtE,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAgK5C,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IACtE,yCAAyC;IACzC,GAAG,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAE1B;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,UAAU,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,QAAQ,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAExC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IAEtB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,yBAAyB;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,UAAU,EACV,QAAQ,EACR,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,UAAkB,EAClB,QAAQ,EACR,OAAO,EACP,OAAmB,EACnB,SAAkB,EAClB,KAAK,EACL,MAAM,EACN,QAAQ,EACR,GAAG,EACH,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,aAAa,EACxB,KAAK,EACL,GAAG,KAAK,EACT,EAAE,mBAAmB,+BA2FrB;yBA9Ge,cAAc"}
|
|
@@ -43,6 +43,7 @@ import { useMergedRefs } from "../hooks/useMergedRefs.js";
|
|
|
43
43
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
44
44
|
const styles = {
|
|
45
45
|
interactive: {
|
|
46
|
+
"--selectable-card-ring-color": "x11rj6l1",
|
|
46
47
|
kVAEAm: "x1n2onr6",
|
|
47
48
|
kkrTdU: "x1ypdohk x16khyan",
|
|
48
49
|
k1ekBW: "x16mfhj0",
|
|
@@ -126,6 +127,10 @@ const styles = {
|
|
|
126
127
|
kVAM5u: "x1kpnwn1",
|
|
127
128
|
"--_card-ring": "x1glw7ee",
|
|
128
129
|
$$css: true
|
|
130
|
+
},
|
|
131
|
+
selectedUnknown: {
|
|
132
|
+
"--_card-ring": "x3zsw4j",
|
|
133
|
+
$$css: true
|
|
129
134
|
}
|
|
130
135
|
};
|
|
131
136
|
const selectedStyleForVariant = variant => {
|
|
@@ -154,6 +159,10 @@ const selectedStyleForVariant = variant => {
|
|
|
154
159
|
return styles.selectedTeal;
|
|
155
160
|
case 'yellow':
|
|
156
161
|
return styles.selectedYellow;
|
|
162
|
+
// CardVariant is open — a theme can add a variant this switch has never
|
|
163
|
+
// seen, and it still has to look selected.
|
|
164
|
+
default:
|
|
165
|
+
return styles.selectedUnknown;
|
|
157
166
|
}
|
|
158
167
|
};
|
|
159
168
|
|
|
@@ -16,7 +16,7 @@ import React, { type ReactNode } from 'react';
|
|
|
16
16
|
import { type IconType } from '../Icon';
|
|
17
17
|
import type { IndicatorPosition } from '../Indicator';
|
|
18
18
|
import { type FieldStatusVariant } from '../Field';
|
|
19
|
-
import type
|
|
19
|
+
import { type LayerPlacement } from '../Layer/useLayer';
|
|
20
20
|
import type { SelectorOptionType, SelectorOptionData } from './types';
|
|
21
21
|
import type { BaseProps } from '../BaseProps';
|
|
22
22
|
import type { SizeValue } from '../utils/types';
|
|
@@ -189,6 +189,23 @@ interface SelectorPropsBase<T extends SelectorOptionType = SelectorOptionType> e
|
|
|
189
189
|
* @default 'Search...'
|
|
190
190
|
*/
|
|
191
191
|
searchPlaceholder?: string;
|
|
192
|
+
/**
|
|
193
|
+
* Content shown in the panel when there are no options to show, and
|
|
194
|
+
* announced in a polite live region when the panel opens. Not shown while
|
|
195
|
+
* `isLoading` — the options have not arrived yet.
|
|
196
|
+
* @default 'No options'
|
|
197
|
+
*/
|
|
198
|
+
emptyText?: ReactNode;
|
|
199
|
+
/**
|
|
200
|
+
* Content shown in the panel when a search query matches no options, and
|
|
201
|
+
* announced in a polite live region at the same time.
|
|
202
|
+
*
|
|
203
|
+
* The panel message is `role="presentation"`, so the live region is the only
|
|
204
|
+
* route to assistive tech: a string is announced verbatim, a richer node
|
|
205
|
+
* falls back to the default text since it cannot be spoken.
|
|
206
|
+
* @default 'No results found'
|
|
207
|
+
*/
|
|
208
|
+
emptySearchText?: ReactNode;
|
|
192
209
|
/**
|
|
193
210
|
* Position placement relative to the trigger.
|
|
194
211
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Selector.d.ts","sourceRoot":"","sources":["../../src/Selector/Selector.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EASZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,EAAuB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAEpD,OAAO,
|
|
1
|
+
{"version":3,"file":"Selector.d.ts","sourceRoot":"","sources":["../../src/Selector/Selector.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EASZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,EAAuB,KAAK,QAAQ,EAAC,MAAM,SAAS,CAAC;AAE5D,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAEpD,OAAO,EAKL,KAAK,kBAAkB,EACxB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAwB,KAAK,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAiB7E,OAAO,KAAK,EAAC,kBAAkB,EAAE,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAepE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAiX9C,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,kBAAkB,CAAC;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,iBAAiB,CACzB,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,CACjD,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,cAAc,CAAC;IACpD;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,OAAO,EAAE,CAAC,EAAE,CAAC;IAIb;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,YAAY,CAAC;IAEpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IAEnC;;;;OAIG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IAEjC;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,SAAS,CAAC;IAEzD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,SAAS,CAAC;IAExD;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAEtC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,KAAK,yBAAyB,CAC5B,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC/C,iBAAiB,CAAC,CAAC,CAAC,GAAG;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD,CAAC;AAEF,KAAK,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IAC3E,iBAAiB,CAAC,CAAC,CAAC,GAAG;IACrB;;;;;OAKG;IACH,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1C,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D,CAAC;AAEJ,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,IACzE,yBAAyB,CAAC,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAC;AA4C3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,kBAAkB,EACnD,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,qBA+/BxB;yBAhgCe,QAAQ"}
|
|
@@ -18,13 +18,15 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import React, { useCallback, useEffect, useId, useMemo, useOptimistic, useRef, useState, useTransition } from 'react';
|
|
20
20
|
import * as stylex from '@stylexjs/stylex';
|
|
21
|
-
import {
|
|
21
|
+
import { usePopoverInternal } from "../Popover/usePopover.js";
|
|
22
22
|
import { useTooltip } from "../Tooltip/index.js";
|
|
23
23
|
import { Icon, renderIconSlot } from "../Icon/index.js";
|
|
24
24
|
import { useIndicator } from "../Indicator/index.js";
|
|
25
|
-
import { Field,
|
|
25
|
+
import { Field, inputStatusBorderStyles, inputStatusHoverShadowStyles, inputWrapperStyles } from "../Field/index.js";
|
|
26
26
|
import { Divider } from "../Divider/index.js";
|
|
27
27
|
import { layerAnimations } from "../Layer/layerAnimations.stylex.js";
|
|
28
|
+
import { useKeepLayerOpenProps } from "../Layer/useLayer.js";
|
|
29
|
+
import { InternalInputClearButton } from "../Field/InputClearButton.js";
|
|
28
30
|
import { Spinner } from "../Spinner/index.js";
|
|
29
31
|
import { PanelSearchInput } from "../Field/PanelSearchInput.js";
|
|
30
32
|
import { useAnnounce } from "../hooks/useAnnounce.js";
|
|
@@ -40,6 +42,7 @@ import { getInputARIA, isImeKeyEvent, mergeProps } from "../utils/index.js";
|
|
|
40
42
|
import { useSize } from "../SizeContext/SizeContext.js";
|
|
41
43
|
import { themeProps } from "../utils/themeProps.js";
|
|
42
44
|
import { focusOutlineStyles } from "../utils/focusOutline.stylex.js";
|
|
45
|
+
import { interactionOverlayStyles } from "../utils/interactionOverlay.stylex.js";
|
|
43
46
|
import { stableClassName } from "../naming.js";
|
|
44
47
|
import { groupStyles } from "../InputGroup/groupStyles.js";
|
|
45
48
|
import { useInputGroup } from "../InputGroup/InputGroupContext.js";
|
|
@@ -91,7 +94,6 @@ const styles = {
|
|
|
91
94
|
kzqmXN: "x14atkfc",
|
|
92
95
|
kMzoRj: "xc342km",
|
|
93
96
|
kWkggS: "xjbqb8w",
|
|
94
|
-
kKwaWg: "xmvprkv xq8i9tn",
|
|
95
97
|
kGVxlE: "x1gnnqk1 x1s17dad x15ysqaf",
|
|
96
98
|
k63SB2: "x1e4wzip",
|
|
97
99
|
k1ekBW: "xrafxwg",
|
|
@@ -172,7 +174,10 @@ const styles = {
|
|
|
172
174
|
// `--spacing-5` is one line here because `triggerContainer` pins its
|
|
173
175
|
// line-height to exactly that; the two must stay in step, which is why both
|
|
174
176
|
// read the same token rather than one hardcoding 20px.
|
|
175
|
-
|
|
177
|
+
// Keep these calculations inline: a consumer's Babel preset can lower a
|
|
178
|
+
// module-scope helper to a function expression before StyleX evaluates this
|
|
179
|
+
// object, and StyleX cannot constant-evaluate that transformed helper.
|
|
180
|
+
|
|
176
181
|
const sizeStyles = {
|
|
177
182
|
sm: {
|
|
178
183
|
kAzted: "x1gdqauq",
|
|
@@ -308,6 +313,8 @@ export function Selector(props) {
|
|
|
308
313
|
indicatorPosition = 'end',
|
|
309
314
|
hasSearch = false,
|
|
310
315
|
searchPlaceholder: searchPlaceholderFromProps,
|
|
316
|
+
emptyText: emptyTextFromProps,
|
|
317
|
+
emptySearchText: emptySearchTextFromProps,
|
|
311
318
|
placement,
|
|
312
319
|
isDefaultOpen = false,
|
|
313
320
|
'data-testid': testId,
|
|
@@ -316,6 +323,7 @@ export function Selector(props) {
|
|
|
316
323
|
className,
|
|
317
324
|
style,
|
|
318
325
|
hasClear: hasClearProp,
|
|
326
|
+
id,
|
|
319
327
|
...rest
|
|
320
328
|
} = props;
|
|
321
329
|
const isEffectivelyRequired = useResolvedRequired({
|
|
@@ -324,13 +332,18 @@ export function Selector(props) {
|
|
|
324
332
|
});
|
|
325
333
|
const placeholder = placeholderFromProps ?? t('@astryx.selector.placeholder');
|
|
326
334
|
const searchPlaceholder = searchPlaceholderFromProps ?? t('@astryx.selector.searchPlaceholder');
|
|
335
|
+
const emptyText = emptyTextFromProps ?? t('@astryx.selector.empty');
|
|
336
|
+
const emptySearchText = emptySearchTextFromProps ?? t('@astryx.selector.emptySearchResults');
|
|
327
337
|
const hasClear = hasClearProp === true;
|
|
328
338
|
const size = useSize(sizeProp, 'md');
|
|
329
339
|
const effectiveStatusVariant = variant === 'ghost' && statusVariant === 'attached' ? 'detached' : statusVariant;
|
|
330
340
|
|
|
331
341
|
// Normalize null to undefined for internal use (null is the clear sentinel)
|
|
332
342
|
const normalizedValue = value === null ? undefined : value;
|
|
333
|
-
const
|
|
343
|
+
const generatedTriggerId = useId();
|
|
344
|
+
// A caller's `id` lands on the trigger either way, so the internal identity
|
|
345
|
+
// has to be that same value or the label and listbox point at nothing.
|
|
346
|
+
const triggerId = id ?? generatedTriggerId;
|
|
334
347
|
const listboxId = useId();
|
|
335
348
|
const descriptionId = useId();
|
|
336
349
|
const statusMessageId = useId();
|
|
@@ -343,6 +356,9 @@ export function Selector(props) {
|
|
|
343
356
|
const searchRef = useRef(null);
|
|
344
357
|
const inputGroup = useInputGroup();
|
|
345
358
|
const [searchQuery, setSearchQuery] = useState('');
|
|
359
|
+
// Mirrors searchQuery for the seed path, which runs before focus reaches the
|
|
360
|
+
// input and so cannot read the rendered state.
|
|
361
|
+
const searchQueryRef = useRef('');
|
|
346
362
|
// A typed query shows the search row's clear (✕) button, which becomes
|
|
347
363
|
// the next tab stop after the search input.
|
|
348
364
|
const hasQuery = searchQuery.length > 0;
|
|
@@ -351,6 +367,13 @@ export function Selector(props) {
|
|
|
351
367
|
const isBusy = isLoading || optimisticValue !== normalizedValue;
|
|
352
368
|
const announce = useAnnounce();
|
|
353
369
|
|
|
370
|
+
// The panel's empty message is role="presentation" and reaches assistive tech
|
|
371
|
+
// only through this live region, so the region has to speak whatever the
|
|
372
|
+
// panel shows. A ReactNode override cannot be spoken; fall back to the
|
|
373
|
+
// catalog copy for that case rather than announcing nothing.
|
|
374
|
+
const emptyAnnouncement = typeof emptyText === 'string' ? emptyText : t('@astryx.selector.empty');
|
|
375
|
+
const emptySearchAnnouncement = typeof emptySearchText === 'string' ? emptySearchText : t('@astryx.selector.emptySearchResults');
|
|
376
|
+
|
|
354
377
|
// Disabled-reason tooltip. Disabled controls swallow pointer events, so the
|
|
355
378
|
// tooltip listeners attach to the trigger container (which already exists)
|
|
356
379
|
// and the trigger button stays perceivable via aria-disabled instead of the
|
|
@@ -398,13 +421,14 @@ export function Selector(props) {
|
|
|
398
421
|
// Layer for dropdown positioning
|
|
399
422
|
const handleLayerHide = useCallback(() => {
|
|
400
423
|
setSearchQuery('');
|
|
424
|
+
searchQueryRef.current = '';
|
|
401
425
|
resetTypeaheadRef.current();
|
|
402
426
|
// Clear any lingering result count when the popover closes so stale status
|
|
403
427
|
// text does not linger in the a11y tree.
|
|
404
428
|
announce('');
|
|
405
429
|
triggerRef.current?.focus();
|
|
406
430
|
}, [announce]);
|
|
407
|
-
const popover =
|
|
431
|
+
const popover = usePopoverInternal({
|
|
408
432
|
onHide: handleLayerHide,
|
|
409
433
|
hasLightDismiss: true,
|
|
410
434
|
hasCloseButton: false,
|
|
@@ -416,6 +440,7 @@ export function Selector(props) {
|
|
|
416
440
|
// `usePopover` owns — not on the scrolling list inside it.
|
|
417
441
|
surfaceTarget: 'selector-popup'
|
|
418
442
|
});
|
|
443
|
+
const keepOpenProps = useKeepLayerOpenProps(popover.id, popover.isOpen);
|
|
419
444
|
|
|
420
445
|
// Open dropdown on mount when isDefaultOpen is true
|
|
421
446
|
useEffect(() => {
|
|
@@ -425,22 +450,55 @@ export function Selector(props) {
|
|
|
425
450
|
// eslint-disable-next-line @eslint-react/exhaustive-deps -- mount-only: isDefaultOpen is not reactive
|
|
426
451
|
}, []);
|
|
427
452
|
|
|
428
|
-
// Announce the filtered result count from the query-change
|
|
453
|
+
// Announce the filtered result count from the query-change handlers (matching
|
|
429
454
|
// BaseTypeahead) rather than a reactive effect: computing the count for the
|
|
430
455
|
// next query here fires the announcement exactly once per keystroke and does
|
|
431
|
-
// not re-speak on unrelated re-renders.
|
|
432
|
-
|
|
433
|
-
|
|
456
|
+
// not re-speak on unrelated re-renders. Split out from handleSearchChange so
|
|
457
|
+
// the type-to-open seed below reaches the same live region — a query the user
|
|
458
|
+
// typed is a query however it arrived.
|
|
459
|
+
const announceSearchResults = useCallback(nextQuery => {
|
|
434
460
|
if (nextQuery.length === 0) {
|
|
435
461
|
// Emptying the query clears the region rather than announcing a count.
|
|
436
462
|
announce('');
|
|
437
463
|
return;
|
|
438
464
|
}
|
|
465
|
+
// While isLoading the panel deliberately shows nothing, so announcing a
|
|
466
|
+
// result would put a claim in the one channel the screen has gone quiet
|
|
467
|
+
// for.
|
|
468
|
+
if (isLoading) {
|
|
469
|
+
announce('');
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
439
472
|
const count = filterOptionsByQuery(selectableItems, nextQuery).length;
|
|
440
|
-
announce(count === 0 ?
|
|
473
|
+
announce(count === 0 ? emptySearchAnnouncement : t('@astryx.selector.resultCount', {
|
|
441
474
|
count
|
|
442
475
|
}));
|
|
443
|
-
}, [announce, selectableItems, t]);
|
|
476
|
+
}, [announce, isLoading, selectableItems, emptySearchAnnouncement, t]);
|
|
477
|
+
const handleSearchChange = useCallback(nextQuery => {
|
|
478
|
+
setSearchQuery(nextQuery);
|
|
479
|
+
searchQueryRef.current = nextQuery;
|
|
480
|
+
announceSearchResults(nextQuery);
|
|
481
|
+
}, [announceSearchResults]);
|
|
482
|
+
|
|
483
|
+
// The panel's empty message is role="presentation", so this region is the
|
|
484
|
+
// only route to assistive tech. It has to watch the STATE rather than the
|
|
485
|
+
// open event: the panel can become empty either on open or when a fetch
|
|
486
|
+
// lands with nothing in it, and an open-only announcement leaves the second
|
|
487
|
+
// case silent while the message sits on screen. The ref makes it fire once
|
|
488
|
+
// per arrival at that state rather than on every re-render.
|
|
489
|
+
const announcedEmptyRef = useRef(null);
|
|
490
|
+
useEffect(() => {
|
|
491
|
+
const isPanelEmpty = popover.isOpen && !isLoading && searchQuery === '' && selectableItems.length === 0;
|
|
492
|
+
if (!isPanelEmpty) {
|
|
493
|
+
announcedEmptyRef.current = null;
|
|
494
|
+
return;
|
|
495
|
+
}
|
|
496
|
+
if (announcedEmptyRef.current === emptyAnnouncement) {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
announcedEmptyRef.current = emptyAnnouncement;
|
|
500
|
+
announce(emptyAnnouncement);
|
|
501
|
+
}, [popover.isOpen, isLoading, searchQuery, selectableItems.length, emptyAnnouncement, announce]);
|
|
444
502
|
|
|
445
503
|
// Calculate offset to position selected item over trigger. Explicit
|
|
446
504
|
// placement opts out of the selector-specific overlay behavior and uses the
|
|
@@ -477,10 +535,17 @@ export function Selector(props) {
|
|
|
477
535
|
}, [onChange, changeAction, startTransition, setOptimisticValue]);
|
|
478
536
|
|
|
479
537
|
// Type-to-find appends to the query rather than replacing it: characters
|
|
480
|
-
// typed before focus reaches the search input must not be dropped.
|
|
538
|
+
// typed before focus reaches the search input must not be dropped. The ref
|
|
539
|
+
// is what makes that safe without a state updater — it advances
|
|
540
|
+
// synchronously, so a second character seeded in the same tick still sees
|
|
541
|
+
// the first, and the announcement can be computed here rather than inside a
|
|
542
|
+
// setState callback.
|
|
481
543
|
const appendSearchQuery = useCallback(char => {
|
|
482
|
-
|
|
483
|
-
|
|
544
|
+
const nextQuery = searchQueryRef.current + char;
|
|
545
|
+
searchQueryRef.current = nextQuery;
|
|
546
|
+
setSearchQuery(nextQuery);
|
|
547
|
+
announceSearchResults(nextQuery);
|
|
548
|
+
}, [announceSearchResults]);
|
|
484
549
|
const commitValue = useCallback(newValue => {
|
|
485
550
|
onChange?.(newValue);
|
|
486
551
|
if (changeAction) {
|
|
@@ -502,6 +567,7 @@ export function Selector(props) {
|
|
|
502
567
|
onItemMouseEnter
|
|
503
568
|
} = useCombobox({
|
|
504
569
|
selectableItems: filteredItems,
|
|
570
|
+
wasJustDismissed: popover.wasJustDismissed,
|
|
505
571
|
// The optimistic value, not the raw prop: with a pending changeAction the
|
|
506
572
|
// prop still holds the old selection, so the popup would open with the
|
|
507
573
|
// highlight on it and Delete/Backspace could clear a value the action has
|
|
@@ -732,8 +798,11 @@ export function Selector(props) {
|
|
|
732
798
|
const renderOptions = useCallback(() => {
|
|
733
799
|
const isSearching = hasSearch && Boolean(searchQuery);
|
|
734
800
|
|
|
735
|
-
// Nothing
|
|
736
|
-
|
|
801
|
+
// Nothing to show — either the query matched nothing, or no options were
|
|
802
|
+
// given at all. Both render the same slot with different copy. While
|
|
803
|
+
// isLoading the options have not arrived yet, so asserting either would be
|
|
804
|
+
// a claim the component cannot make; the trigger's spinner covers it.
|
|
805
|
+
if (filteredItems.length === 0 && !isLoading) {
|
|
737
806
|
// role="presentation" keeps the message out of the listbox's
|
|
738
807
|
// accessibility tree (role="listbox" only permits option/group
|
|
739
808
|
// children); the no-results outcome is announced via the
|
|
@@ -743,7 +812,7 @@ export function Selector(props) {
|
|
|
743
812
|
...mergeProps(themeProps('selector-empty-state'), {
|
|
744
813
|
className: "x1b2ylru x2b8uid xv1l7n4 x9ynric xcr08ib"
|
|
745
814
|
}),
|
|
746
|
-
children:
|
|
815
|
+
children: isSearching ? emptySearchText : emptyText
|
|
747
816
|
}, "empty")];
|
|
748
817
|
}
|
|
749
818
|
let flatIndex = 0;
|
|
@@ -805,7 +874,7 @@ export function Selector(props) {
|
|
|
805
874
|
}
|
|
806
875
|
}
|
|
807
876
|
return elements;
|
|
808
|
-
}, [options, renderItem, hasSearch, searchQuery, filteredItems]);
|
|
877
|
+
}, [options, renderItem, hasSearch, searchQuery, filteredItems, isLoading, emptyText, emptySearchText]);
|
|
809
878
|
|
|
810
879
|
// The detached message box renders its own leading status icon, so the
|
|
811
880
|
// on-field icon would duplicate it — keep the chevron indicator instead.
|
|
@@ -865,7 +934,7 @@ export function Selector(props) {
|
|
|
865
934
|
size,
|
|
866
935
|
status: status?.type ?? null,
|
|
867
936
|
disabled: isDisabled ? 'disabled' : null
|
|
868
|
-
}), stylex.props(inputWrapperStyles.base, styles.triggerContainer, sizeStyles[size], variant === 'ghost' && styles.triggerGhost, variant === 'ghost' && focusOutlineStyles.focusWithin, isDisabled && inputWrapperStyles.disabled, variant === 'ghost' && isDisabled && styles.triggerGhostDisabled, !selectedItem && styles.triggerPlaceholder, variant !== 'ghost' && status && inputStatusBorderStyles[status.type], variant !== 'ghost' && status && !isDisabled && inputStatusHoverShadowStyles[status.type], variant !== 'ghost' && inputGroup && groupStyles.inGroup, inputGroup && styles.triggerInGroup, xstyle), className, style),
|
|
937
|
+
}), stylex.props(inputWrapperStyles.base, styles.triggerContainer, sizeStyles[size], variant === 'ghost' && styles.triggerGhost, variant === 'ghost' && interactionOverlayStyles.backgroundImage, variant === 'ghost' && focusOutlineStyles.focusWithin, isDisabled && inputWrapperStyles.disabled, variant === 'ghost' && isDisabled && styles.triggerGhostDisabled, !selectedItem && styles.triggerPlaceholder, variant !== 'ghost' && status && inputStatusBorderStyles[status.type], variant !== 'ghost' && status && !isDisabled && inputStatusHoverShadowStyles[status.type], variant !== 'ghost' && inputGroup && groupStyles.inGroup, inputGroup && styles.triggerInGroup, xstyle), className, style),
|
|
869
938
|
children: [startIcon && renderIconSlot(startIcon, {
|
|
870
939
|
size: 'sm',
|
|
871
940
|
color: 'secondary'
|
|
@@ -918,7 +987,8 @@ export function Selector(props) {
|
|
|
918
987
|
disabled: isDisabled
|
|
919
988
|
}), isBusy && /*#__PURE__*/_jsx(Spinner, {
|
|
920
989
|
size: "sm"
|
|
921
|
-
}), hasClear && value != null && !isDisabled && /*#__PURE__*/_jsx(
|
|
990
|
+
}), hasClear && value != null && !isDisabled && /*#__PURE__*/_jsx(InternalInputClearButton, {
|
|
991
|
+
...keepOpenProps,
|
|
922
992
|
label: t('@astryx.selector.clearLabel', {
|
|
923
993
|
label
|
|
924
994
|
}),
|
|
@@ -929,6 +999,7 @@ export function Selector(props) {
|
|
|
929
999
|
type: "button",
|
|
930
1000
|
"aria-label": t(STATUS_BUTTON_LABEL_KEY[status.type]),
|
|
931
1001
|
"aria-describedby": statusTooltip.describedBy,
|
|
1002
|
+
...keepOpenProps,
|
|
932
1003
|
onClick: e => e.stopPropagation(),
|
|
933
1004
|
...stylex.props(focusOutlineStyles.focusVisible, styles.statusButton),
|
|
934
1005
|
children: /*#__PURE__*/_jsx(Icon, {
|
package/dist/Selector/hooks.d.ts
CHANGED
|
@@ -45,6 +45,12 @@ interface UseComboboxOptions {
|
|
|
45
45
|
* lands in the search input, which then owns its own typing.
|
|
46
46
|
*/
|
|
47
47
|
onSearchSeed?: (char: string) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Whether the browser's light dismiss just closed the popup. The trigger
|
|
50
|
+
* click that follows belongs to that same press, so acting on it would
|
|
51
|
+
* reopen the popup the user just closed.
|
|
52
|
+
*/
|
|
53
|
+
wasJustDismissed?: () => boolean;
|
|
48
54
|
listboxId: string;
|
|
49
55
|
}
|
|
50
56
|
interface UseComboboxResult {
|
|
@@ -64,6 +70,6 @@ interface UseComboboxResult {
|
|
|
64
70
|
* keeps matching consistent with the other collections and leaves consumers
|
|
65
71
|
* whose own input already filters the items (CommandPalette) untouched.
|
|
66
72
|
*/
|
|
67
|
-
export declare function useCombobox({ selectableItems, value, isDisabled, isOpen, hasSearch, onOpen, onClose, onSelect, onClear, onSearchSeed, listboxId, }: UseComboboxOptions): UseComboboxResult;
|
|
73
|
+
export declare function useCombobox({ selectableItems, value, isDisabled, isOpen, hasSearch, onOpen, onClose, onSelect, onClear, onSearchSeed, wasJustDismissed, listboxId, }: UseComboboxOptions): UseComboboxResult;
|
|
68
74
|
export {};
|
|
69
75
|
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/Selector/hooks.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAyBhD,UAAU,4BAA4B;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7C,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,UAAU,2BAA2B;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,SAAS,GACV,EAAE,4BAA4B,GAAG,2BAA2B,CAgF5D;AAMD,UAAU,kBAAkB;IAC1B,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,eAAe,EACf,KAAK,EACL,UAAkB,EAClB,MAAM,EACN,SAAiB,EACjB,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,GACV,EAAE,kBAAkB,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/Selector/hooks.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,OAAO,CAAC;AACrC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAyBhD,UAAU,4BAA4B;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC7C,SAAS,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC1C;AAED,UAAU,2BAA2B;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,iBAAiB,EACjB,SAAS,EACT,UAAU,EACV,SAAS,GACV,EAAE,4BAA4B,GAAG,2BAA2B,CAgF5D;AAMD,UAAU,kBAAkB;IAC1B,eAAe,EAAE,kBAAkB,EAAE,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,iBAAiB;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,eAAe,EACf,KAAK,EACL,UAAkB,EAClB,MAAM,EACN,SAAiB,EACjB,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,SAAS,GACV,EAAE,kBAAkB,GAAG,iBAAiB,CAmOxC"}
|
package/dist/Selector/hooks.js
CHANGED
|
@@ -136,6 +136,7 @@ export function useCombobox({
|
|
|
136
136
|
onSelect,
|
|
137
137
|
onClear,
|
|
138
138
|
onSearchSeed,
|
|
139
|
+
wasJustDismissed,
|
|
139
140
|
listboxId
|
|
140
141
|
}) {
|
|
141
142
|
const [highlightedIndex, setHighlightedIndex] = useState(-1);
|
|
@@ -158,7 +159,7 @@ export function useCombobox({
|
|
|
158
159
|
closeAndReset();
|
|
159
160
|
}, [onSelect, closeAndReset]);
|
|
160
161
|
const onTriggerClick = useCallback(() => {
|
|
161
|
-
if (isDisabled) {
|
|
162
|
+
if (isDisabled || wasJustDismissed?.()) {
|
|
162
163
|
return;
|
|
163
164
|
}
|
|
164
165
|
if (isOpen) {
|
|
@@ -170,7 +171,7 @@ export function useCombobox({
|
|
|
170
171
|
setHighlightedIndex(selectedIndex >= 0 ? selectedIndex : 0);
|
|
171
172
|
}
|
|
172
173
|
}
|
|
173
|
-
}, [isDisabled, isOpen, onOpen, closeAndReset, findSelectedIndex, hasSearch]);
|
|
174
|
+
}, [isDisabled, wasJustDismissed, isOpen, onOpen, closeAndReset, findSelectedIndex, hasSearch]);
|
|
174
175
|
const onItemMouseEnter = useCallback((item, index) => {
|
|
175
176
|
if (!item.disabled) {
|
|
176
177
|
setHighlightedIndex(index);
|
|
@@ -88,8 +88,13 @@ export interface SideNavProps extends BaseProps<HTMLElement> {
|
|
|
88
88
|
* - `defaultWidth` — initial width in pixels (default: 260)
|
|
89
89
|
* - `minWidth` — minimum width in pixels (default: 180)
|
|
90
90
|
* - `maxWidth` — maximum width in pixels (default: 480)
|
|
91
|
-
* - `autoSaveId` — localStorage key for persisting width
|
|
91
|
+
* - `autoSaveId` — localStorage key for persisting width and collapse state
|
|
92
92
|
* - `onWidthChange` — called when the width changes
|
|
93
|
+
* - `defaultIsCollapsed` / `isCollapsed` / `onCollapseChange` — collapse
|
|
94
|
+
* state, when `resizable` should own it rather than `collapsible`
|
|
95
|
+
*
|
|
96
|
+
* When both props carry collapse state, `resizable` wins and a dev warning
|
|
97
|
+
* names the conflicting keys.
|
|
93
98
|
*
|
|
94
99
|
* @default false
|
|
95
100
|
*/
|