@primitiv-ui/react 0.1.28 → 0.1.30
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/README.md +19 -2
- package/package.json +6 -1
- package/src/AccessibleIcon/AccessibleIcon.tsx +32 -9
- package/src/AccessibleIcon/__tests__/AccessibleIcon.test.tsx +5 -0
- package/src/AccessibleIcon/types.ts +15 -2
- package/src/Accordion/Accordion.tsx +32 -11
- package/src/Accordion/README.md +2 -2
- package/src/Accordion/__tests__/Accordion.asChild.test.tsx +46 -0
- package/src/Accordion/__tests__/Accordion.basic-rendering.test.tsx +15 -0
- package/src/Accordion/__tests__/Accordion.disabled-items.test.tsx +42 -0
- package/src/Accordion/__tests__/Accordion.error-handling.test.tsx +33 -0
- package/src/Accordion/hooks/useAccordionRoot.ts +44 -7
- package/src/Accordion/hooks/useAccordionTrigger.ts +9 -1
- package/src/Accordion/types.ts +72 -21
- package/src/Alert/Alert.tsx +36 -7
- package/src/Alert/__tests__/Alert.test.tsx +5 -0
- package/src/Alert/types.ts +18 -2
- package/src/Avatar/Avatar.tsx +99 -15
- package/src/Avatar/__tests__/Avatar.basic-rendering.test.tsx +10 -0
- package/src/Avatar/__tests__/Avatar.fallback.test.tsx +30 -0
- package/src/Avatar/__tests__/Avatar.image-loading.test.tsx +35 -0
- package/src/Avatar/hooks/useAvatarImage.ts +16 -0
- package/src/Avatar/types.ts +15 -3
- package/src/Breadcrumb/Breadcrumb.tsx +139 -21
- package/src/Breadcrumb/README.md +47 -0
- package/src/Breadcrumb/__tests__/Breadcrumb.basic-rendering.test.tsx +11 -0
- package/src/Breadcrumb/__tests__/Breadcrumb.ellipsis.test.tsx +110 -0
- package/src/Breadcrumb/types.ts +73 -7
- package/src/Button/Button.tsx +2 -0
- package/src/Button/__tests__/Button.basic-rendering.test.tsx +6 -0
- package/src/Button/__tests__/Button.contract.test.tsx +1 -1
- package/src/Button/types.ts +21 -0
- package/src/Carousel/Carousel.tsx +268 -20
- package/src/Carousel/README.md +764 -87
- package/src/Carousel/__tests__/Carousel.autoplay-status.test.tsx +239 -0
- package/src/Carousel/__tests__/Carousel.drag-status.test.tsx +292 -0
- package/src/Carousel/__tests__/Carousel.dynamic-slides.test.tsx +38 -0
- package/src/Carousel/__tests__/Carousel.indicators.test.tsx +101 -0
- package/src/Carousel/__tests__/Carousel.infinite.test.tsx +1453 -0
- package/src/Carousel/__tests__/Carousel.instant-scroll.test.tsx +124 -0
- package/src/Carousel/__tests__/Carousel.intersection-observer.test.tsx +90 -2
- package/src/Carousel/__tests__/Carousel.loop.test.tsx +163 -0
- package/src/Carousel/__tests__/Carousel.loopEngine.test.ts +77 -0
- package/src/Carousel/__tests__/Carousel.mouse-drag.test.tsx +504 -0
- package/src/Carousel/__tests__/Carousel.multi-slide-bounds.test.tsx +91 -0
- package/src/Carousel/__tests__/Carousel.orientation.test.tsx +207 -0
- package/src/Carousel/__tests__/Carousel.overscroll.test.tsx +532 -0
- package/src/Carousel/__tests__/Carousel.page-snap-points.test.tsx +50 -0
- package/src/Carousel/__tests__/Carousel.progress-text.test.tsx +76 -0
- package/src/Carousel/__tests__/Carousel.reduced-motion.test.tsx +3 -6
- package/src/Carousel/__tests__/Carousel.refresh-progress.test.tsx +2 -5
- package/src/Carousel/__tests__/Carousel.scroll-margin.test.tsx +167 -0
- package/src/Carousel/__tests__/Carousel.scroll-progress.test.tsx +518 -0
- package/src/Carousel/__tests__/Carousel.scroll-snap-change.test.tsx +32 -11
- package/src/Carousel/__tests__/Carousel.scroll-sync.test.tsx +237 -24
- package/src/Carousel/__tests__/Carousel.scroll-to-index.test.tsx +115 -0
- package/src/Carousel/__tests__/Carousel.slide-snap.test.tsx +172 -0
- package/src/Carousel/__tests__/Carousel.slides-per-move.test.tsx +179 -1
- package/src/Carousel/__tests__/Carousel.slides-per-page.test.tsx +91 -7
- package/src/Carousel/__tests__/Carousel.snap-type.test.tsx +35 -0
- package/src/Carousel/__tests__/Carousel.transition-modes.test.tsx +30 -5
- package/src/Carousel/__tests__/Carousel.translations.test.tsx +23 -0
- package/src/Carousel/__tests__/Carousel.wheel.test.tsx +160 -0
- package/src/Carousel/hooks/index.ts +1 -0
- package/src/Carousel/hooks/useCarouselLoop.ts +869 -0
- package/src/Carousel/hooks/useCarouselRoot.ts +338 -42
- package/src/Carousel/hooks/useCarouselSlide.ts +44 -9
- package/src/Carousel/hooks/useCarouselViewport.ts +649 -46
- package/src/Carousel/loopEngine.ts +54 -0
- package/src/Carousel/types.ts +458 -36
- package/src/Checkbox/Checkbox.tsx +11 -3
- package/src/Checkbox/__tests__/Checkbox.basic-rendering.test.tsx +14 -0
- package/src/Checkbox/hooks/useCheckboxInput.ts +4 -0
- package/src/Checkbox/types.ts +19 -0
- package/src/CheckboxCard/CheckboxCard.tsx +14 -5
- package/src/CheckboxCard/README.md +1 -1
- package/src/CheckboxCard/__tests__/CheckboxCard.basic-rendering.test.tsx +7 -0
- package/src/CheckboxCard/types.ts +65 -17
- package/src/Collapsible/Collapsible.tsx +49 -3
- package/src/Collapsible/README.md +41 -1
- package/src/Collapsible/__tests__/Collapsible.asChild.test.tsx +89 -0
- package/src/Collapsible/__tests__/Collapsible.basic-rendering.test.tsx +27 -0
- package/src/Collapsible/__tests__/Collapsible.collapsedHeight.test.tsx +140 -0
- package/src/Collapsible/hooks/useCollapsibleTrigger.ts +3 -1
- package/src/Collapsible/types.ts +89 -22
- package/src/Combobox/Combobox.tsx +508 -0
- package/src/Combobox/ComboboxContext.ts +23 -0
- package/src/Combobox/README.md +170 -0
- package/src/Combobox/__tests__/Combobox.asChild.test.tsx +62 -0
- package/src/Combobox/__tests__/Combobox.basic-rendering.test.tsx +16 -0
- package/src/Combobox/__tests__/Combobox.content.test.tsx +36 -0
- package/src/Combobox/__tests__/Combobox.controlled-state.test.tsx +88 -0
- package/src/Combobox/__tests__/Combobox.empty.test.tsx +42 -0
- package/src/Combobox/__tests__/Combobox.ids.test.tsx +66 -0
- package/src/Combobox/__tests__/Combobox.item.test.tsx +76 -0
- package/src/Combobox/__tests__/Combobox.keyboard-interaction.test.tsx +196 -0
- package/src/Combobox/__tests__/Combobox.light-dismiss.test.tsx +101 -0
- package/src/Combobox/__tests__/Combobox.query.test.tsx +105 -0
- package/src/Combobox/hooks/index.ts +1 -0
- package/src/Combobox/hooks/useComboboxRoot.ts +2 -0
- package/src/Combobox/index.ts +3 -0
- package/src/Combobox/types.ts +133 -0
- package/src/ContextMenu/ContextMenu.tsx +270 -4
- package/src/ContextMenu/README.md +1 -1
- package/src/ContextMenu/types.ts +148 -6
- package/src/DirectionProvider/DirectionProvider.tsx +41 -9
- package/src/DirectionProvider/README.md +4 -4
- package/src/DirectionProvider/__tests__/DirectionProvider.test.tsx +5 -0
- package/src/DirectionProvider/types.ts +28 -3
- package/src/Divider/Divider.tsx +24 -10
- package/src/Divider/__tests__/Divider.contract.test.tsx +1 -1
- package/src/Divider/__tests__/Divider.test.tsx +5 -0
- package/src/Divider/types.ts +10 -3
- package/src/Drawer/Drawer.tsx +315 -0
- package/src/Drawer/README.md +124 -0
- package/src/Drawer/__tests__/Drawer.behavior.test.tsx +100 -0
- package/src/Drawer/__tests__/Drawer.focus-trap.test.tsx +55 -0
- package/src/Drawer/__tests__/Drawer.rendering.test.tsx +111 -0
- package/src/Drawer/__tests__/Drawer.side.test.tsx +69 -0
- package/src/Drawer/__tests__/dialog-polyfill.ts +39 -0
- package/src/Drawer/index.ts +2 -0
- package/src/Drawer/types.ts +66 -0
- package/src/Dropdown/Dropdown.tsx +119 -2
- package/src/Dropdown/README.md +7 -5
- package/src/Dropdown/types.ts +241 -11
- package/src/EmptyState/EmptyState.tsx +74 -4
- package/src/EmptyState/README.md +2 -2
- package/src/EmptyState/__tests__/EmptyState.Actions.test.tsx +7 -2
- package/src/EmptyState/__tests__/EmptyState.Description.test.tsx +3 -1
- package/src/EmptyState/__tests__/EmptyState.Root.test.tsx +10 -0
- package/src/EmptyState/__tests__/EmptyState.Title.test.tsx +3 -1
- package/src/EmptyState/types.ts +49 -6
- package/src/Field/Field.tsx +23 -0
- package/src/Field/README.md +1 -1
- package/src/Field/__tests__/Field.basic-rendering.test.tsx +11 -0
- package/src/Field/__tests__/Field.error-handling.test.tsx +23 -0
- package/src/Field/__tests__/Field.state-cascade.test.tsx +21 -0
- package/src/Field/hooks/__tests__/useFieldProps.test.tsx +104 -9
- package/src/Field/hooks/useFieldProps.ts +1 -1
- package/src/Field/types.ts +60 -12
- package/src/Fieldset/Fieldset.tsx +55 -19
- package/src/Fieldset/README.md +2 -2
- package/src/Fieldset/__tests__/Fieldset.basic-rendering.test.tsx +9 -0
- package/src/Fieldset/types.ts +20 -2
- package/src/Input/Input.tsx +15 -10
- package/src/Input/README.md +2 -2
- package/src/Input/__tests__/Input.basic-rendering.test.tsx +5 -0
- package/src/Input/types.ts +19 -2
- package/src/InputGroup/InputGroup.tsx +11 -3
- package/src/InputGroup/__tests__/InputGroup.basic-rendering.test.tsx +14 -0
- package/src/InputGroup/types.ts +26 -5
- package/src/Listbox/Listbox.tsx +475 -0
- package/src/Listbox/ListboxContext.ts +48 -0
- package/src/Listbox/README.md +248 -0
- package/src/Listbox/__tests__/Listbox.active-descendant.test.tsx +128 -0
- package/src/Listbox/__tests__/Listbox.asChild.test.tsx +91 -0
- package/src/Listbox/__tests__/Listbox.basic-rendering.test.tsx +16 -0
- package/src/Listbox/__tests__/Listbox.controlled-state.test.tsx +114 -0
- package/src/Listbox/__tests__/Listbox.disabled.test.tsx +90 -0
- package/src/Listbox/__tests__/Listbox.fixtures.ts +27 -0
- package/src/Listbox/__tests__/Listbox.group-label.test.tsx +97 -0
- package/src/Listbox/__tests__/Listbox.group.test.tsx +45 -0
- package/src/Listbox/__tests__/Listbox.keyboard-edge-cases.test.tsx +144 -0
- package/src/Listbox/__tests__/Listbox.keyboard-interaction.test.tsx +112 -0
- package/src/Listbox/__tests__/Listbox.modifier-keys.test.tsx +86 -0
- package/src/Listbox/__tests__/Listbox.multi-select-keyboard.test.tsx +368 -0
- package/src/Listbox/__tests__/Listbox.multiple-mode.test.tsx +91 -0
- package/src/Listbox/__tests__/Listbox.mutation-hardening.test.tsx +480 -0
- package/src/Listbox/__tests__/Listbox.orientation.test.tsx +59 -0
- package/src/Listbox/__tests__/Listbox.reading-direction.test.tsx +65 -0
- package/src/Listbox/__tests__/Listbox.reorder.test.tsx +78 -0
- package/src/Listbox/__tests__/Listbox.selection-follows-focus.test.tsx +64 -0
- package/src/Listbox/__tests__/Listbox.strict-context.test.tsx +21 -0
- package/src/Listbox/__tests__/Listbox.typeahead.test.tsx +123 -0
- package/src/Listbox/__tests__/Listbox.uncontrolled-state.test.tsx +48 -0
- package/src/Listbox/constants.ts +2 -0
- package/src/Listbox/hooks/index.ts +1 -0
- package/src/Listbox/hooks/useListboxRoot.ts +407 -0
- package/src/Listbox/index.ts +3 -0
- package/src/Listbox/types.ts +238 -0
- package/src/MillerColumns/MillerColumns.tsx +186 -45
- package/src/MillerColumns/README.md +90 -20
- package/src/MillerColumns/__tests__/MillerColumns.aria.test.tsx +45 -0
- package/src/MillerColumns/__tests__/MillerColumns.auto-scroll.test.tsx +4 -2
- package/src/MillerColumns/__tests__/MillerColumns.basic-rendering.test.tsx +18 -3
- package/src/MillerColumns/__tests__/MillerColumns.data-attributes.test.tsx +48 -0
- package/src/MillerColumns/__tests__/MillerColumns.keyboard-interaction.test.tsx +35 -2
- package/src/MillerColumns/__tests__/MillerColumns.keyboard-selection-state.test.tsx +96 -0
- package/src/MillerColumns/__tests__/MillerColumns.preview-panel.test.tsx +29 -4
- package/src/MillerColumns/__tests__/MillerColumns.preview-visibility.test.tsx +79 -0
- package/src/MillerColumns/__tests__/MillerColumns.resize.test.tsx +189 -0
- package/src/MillerColumns/__tests__/MillerColumns.styled-parts.test.tsx +143 -0
- package/src/MillerColumns/__tests__/MillerColumns.typeahead.test.tsx +104 -0
- package/src/MillerColumns/constants.ts +2 -0
- package/src/MillerColumns/hooks/useMillerColumnsColumn.ts +5 -2
- package/src/MillerColumns/hooks/useMillerColumnsItem.ts +29 -7
- package/src/MillerColumns/hooks/useMillerColumnsResizeHandle.ts +80 -10
- package/src/MillerColumns/hooks/useMillerColumnsRoot.ts +0 -0
- package/src/MillerColumns/index.ts +4 -0
- package/src/MillerColumns/types.ts +136 -30
- package/src/MillerColumns/utils.ts +69 -3
- package/src/Modal/Modal.tsx +35 -8
- package/src/Modal/README.md +24 -15
- package/src/Modal/__tests__/Modal.focus-trap.test.tsx +162 -0
- package/src/Modal/hooks/useModalContent.ts +32 -0
- package/src/Modal/types.ts +110 -29
- package/src/NavigationMenu/NavigationMenu.tsx +890 -0
- package/src/NavigationMenu/NavigationMenuContext.ts +67 -0
- package/src/NavigationMenu/README.md +355 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.anchor-positioning.test.tsx +132 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.asChild.test.tsx +73 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.basic-rendering.test.tsx +92 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.contract.test.tsx +45 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.controlled-state.test.tsx +134 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.error-handling.test.tsx +62 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.fixtures.tsx +79 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.forceMount.test.tsx +52 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.hover-interaction.test.tsx +254 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.indicator.test.tsx +252 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.keyboard-interaction.test.tsx +294 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.keyboard-navigation.test.tsx +126 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.link.test.tsx +139 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.motion.test.tsx +568 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.mouse-interaction.test.tsx +76 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.uncontrolled-state.test.tsx +30 -0
- package/src/NavigationMenu/__tests__/NavigationMenu.viewport.test.tsx +113 -0
- package/src/NavigationMenu/constants.ts +5 -0
- package/src/NavigationMenu/hooks/index.ts +7 -0
- package/src/NavigationMenu/hooks/useNavigationMenuEntry.ts +33 -0
- package/src/NavigationMenu/hooks/useNavigationMenuIndicator.ts +70 -0
- package/src/NavigationMenu/hooks/useNavigationMenuLink.ts +72 -0
- package/src/NavigationMenu/hooks/useNavigationMenuRoot.ts +301 -0
- package/src/NavigationMenu/hooks/useNavigationMenuTopLevelEntry.ts +65 -0
- package/src/NavigationMenu/hooks/useNavigationMenuTrigger.ts +158 -0
- package/src/NavigationMenu/hooks/useNavigationMenuViewport.ts +101 -0
- package/src/NavigationMenu/index.ts +3 -0
- package/src/NavigationMenu/types.ts +259 -0
- package/src/NavigationMenu/utils.ts +89 -0
- package/src/Popover/Popover.tsx +427 -0
- package/src/Popover/PopoverContext.ts +13 -0
- package/src/Popover/README.md +106 -0
- package/src/Popover/__tests__/Popover.anchor.test.tsx +38 -0
- package/src/Popover/__tests__/Popover.asChild.test.tsx +160 -0
- package/src/Popover/__tests__/Popover.basic-rendering.test.tsx +106 -0
- package/src/Popover/__tests__/Popover.click-outside.test.tsx +149 -0
- package/src/Popover/__tests__/Popover.close.test.tsx +70 -0
- package/src/Popover/__tests__/Popover.content.test.tsx +58 -0
- package/src/Popover/__tests__/Popover.controlled-state.test.tsx +45 -0
- package/src/Popover/__tests__/Popover.error-handling.test.tsx +51 -0
- package/src/Popover/__tests__/Popover.focus.test.tsx +43 -0
- package/src/Popover/__tests__/Popover.keyboard-interaction.test.tsx +71 -0
- package/src/Popover/__tests__/Popover.mouse-interaction.test.tsx +69 -0
- package/src/Popover/__tests__/Popover.uncontrolled-state.test.tsx +44 -0
- package/src/Popover/hooks/index.ts +3 -0
- package/src/Popover/hooks/usePopoverContent.ts +98 -0
- package/src/Popover/hooks/usePopoverRoot.ts +84 -0
- package/src/Popover/hooks/usePopoverTrigger.ts +33 -0
- package/src/Popover/index.ts +2 -0
- package/src/Popover/types.ts +197 -0
- package/src/Portal/Portal.tsx +50 -10
- package/src/Portal/README.md +2 -2
- package/src/Portal/__tests__/Portal.basic-rendering.test.tsx +5 -0
- package/src/Portal/types.ts +5 -0
- package/src/Progress/Progress.tsx +33 -1
- package/src/Progress/README.md +1 -1
- package/src/Progress/__tests__/Progress.basic-rendering.test.tsx +10 -0
- package/src/Progress/__tests__/Progress.value.test.tsx +21 -0
- package/src/Progress/types.ts +20 -4
- package/src/Radio/Radio.tsx +10 -2
- package/src/Radio/__tests__/Radio.basic-rendering.test.tsx +14 -0
- package/src/Radio/hooks/useRadioRoot.ts +3 -0
- package/src/Radio/types.ts +20 -0
- package/src/RadioCard/RadioCard.tsx +11 -0
- package/src/RadioCard/__tests__/RadioCard.basic-rendering.test.tsx +8 -0
- package/src/RadioCard/__tests__/RadioCard.disabled-items.test.tsx +27 -0
- package/src/RadioCard/__tests__/RadioCard.keyboard-interaction.test.tsx +53 -0
- package/src/RadioCard/__tests__/RadioCard.ref-forwarding.test.tsx +54 -0
- package/src/RadioCard/__tests__/RadioCard.uncontrolled-state.test.tsx +21 -0
- package/src/RadioCard/hooks/useRadioCardRoot.ts +11 -0
- package/src/RadioCard/types.ts +95 -22
- package/src/RadioGroup/README.md +2 -2
- package/src/RadioGroup/RadioGroup.tsx +12 -1
- package/src/RadioGroup/__tests__/RadioGroup.basic-rendering.test.tsx +8 -0
- package/src/RadioGroup/__tests__/RadioGroup.disabled.test.tsx +27 -0
- package/src/RadioGroup/__tests__/RadioGroup.ref-forwarding.test.tsx +29 -0
- package/src/RadioGroup/__tests__/RadioGroup.roving-tabindex.test.tsx +31 -0
- package/src/RadioGroup/hooks/useRadioGroupRoot.ts +11 -0
- package/src/RadioGroup/types.ts +73 -9
- package/src/SegmentedControl/README.md +154 -0
- package/src/SegmentedControl/SegmentedControl.tsx +309 -0
- package/src/SegmentedControl/SegmentedControlContext.ts +28 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.asChild.test.tsx +50 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.basic-rendering.test.tsx +100 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.controlled-state.test.tsx +107 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.disabled-keydown-guards.test.tsx +62 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.disabled.test.tsx +151 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.error-handling.test.tsx +17 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.keyboard-interaction.test.tsx +117 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.orientation.test.tsx +54 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.reading-direction.test.tsx +56 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.ref-forwarding.test.tsx +45 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.roving-tabindex.test.tsx +104 -0
- package/src/SegmentedControl/__tests__/SegmentedControl.uncontrolled-state.test.tsx +94 -0
- package/src/SegmentedControl/hooks/index.ts +2 -0
- package/src/SegmentedControl/hooks/useSegmentedControlContext.ts +1 -0
- package/src/SegmentedControl/hooks/useSegmentedControlRoot.ts +87 -0
- package/src/SegmentedControl/index.ts +2 -0
- package/src/SegmentedControl/types.ts +138 -0
- package/src/Select/README.md +122 -157
- package/src/Select/Select.tsx +596 -69
- package/src/Select/SelectContext.ts +38 -0
- package/src/Select/SelectItemIndicatorContext.ts +29 -0
- package/src/Select/__tests__/Select.asChild.test.tsx +2 -2
- package/src/Select/__tests__/Select.basic-rendering.test.tsx +22 -3
- package/src/Select/__tests__/Select.controlled-state.test.tsx +6 -6
- package/src/Select/__tests__/Select.data-attributes.test.tsx +4 -4
- package/src/Select/__tests__/Select.field-integration.test.tsx +11 -11
- package/src/Select/__tests__/Select.form.test.tsx +38 -0
- package/src/Select/__tests__/Select.group.test.tsx +6 -6
- package/src/Select/__tests__/Select.keyboard-edge.test.tsx +95 -0
- package/src/Select/__tests__/Select.keyboard.test.tsx +124 -0
- package/src/Select/__tests__/Select.mutation-hardening.test.tsx +317 -0
- package/src/Select/__tests__/Select.native-item.test.tsx +30 -0
- package/src/Select/__tests__/Select.open-close.test.tsx +57 -0
- package/src/Select/__tests__/Select.placeholder.test.tsx +7 -7
- package/src/Select/__tests__/Select.rich-asChild.test.tsx +60 -0
- package/src/Select/__tests__/Select.rich-mode.test.tsx +16 -0
- package/src/Select/__tests__/Select.selection.test.tsx +104 -0
- package/src/Select/__tests__/Select.separator.test.tsx +71 -0
- package/src/Select/__tests__/Select.strict-context.test.tsx +36 -0
- package/src/Select/__tests__/Select.typeahead.test.tsx +156 -0
- package/src/Select/__tests__/Select.value-mirror.test.tsx +240 -0
- package/src/Select/constants.ts +8 -0
- package/src/Select/hooks/index.ts +2 -0
- package/src/Select/hooks/useSelectContent.ts +149 -0
- package/src/Select/hooks/useSelectRoot.ts +149 -0
- package/src/Select/types.ts +199 -31
- package/src/SkipNav/README.md +3 -3
- package/src/SkipNav/SkipNav.tsx +72 -32
- package/src/SkipNav/__tests__/SkipNav.basic-rendering.test.tsx +6 -0
- package/src/SkipNav/types.ts +17 -9
- package/src/Slider/README.md +37 -7
- package/src/Slider/Slider.tsx +42 -4
- package/src/Slider/SliderContext.ts +28 -1
- package/src/Slider/types.ts +157 -9
- package/src/Slot/Slot.tsx +94 -19
- package/src/Slot/__tests__/Slot.test.tsx +112 -2
- package/src/Slot/composeEventHandlers.ts +26 -2
- package/src/Slot/types.ts +16 -0
- package/src/SplitButton/README.md +225 -0
- package/src/SplitButton/SplitButton.tsx +457 -0
- package/src/SplitButton/SplitButtonContext.ts +26 -0
- package/src/SplitButton/__tests__/SplitButton.accessibility.test.tsx +55 -0
- package/src/SplitButton/__tests__/SplitButton.asChild.test.tsx +51 -0
- package/src/SplitButton/__tests__/SplitButton.basic-rendering.test.tsx +57 -0
- package/src/SplitButton/__tests__/SplitButton.data-attributes.test.tsx +28 -0
- package/src/SplitButton/__tests__/SplitButton.disabled.test.tsx +79 -0
- package/src/SplitButton/__tests__/SplitButton.error-handling.test.tsx +29 -0
- package/src/SplitButton/__tests__/SplitButton.keyboard-interaction.test.tsx +56 -0
- package/src/SplitButton/__tests__/SplitButton.state-modes.test.tsx +68 -0
- package/src/SplitButton/index.ts +2 -0
- package/src/SplitButton/types.ts +186 -0
- package/src/Status/Status.tsx +36 -15
- package/src/Status/__tests__/Status.test.tsx +5 -0
- package/src/Status/types.ts +12 -1
- package/src/Switch/README.md +1 -1
- package/src/Switch/Switch.tsx +17 -4
- package/src/Switch/__tests__/Switch.basic-rendering.test.tsx +7 -0
- package/src/Switch/hooks/useSwitchRoot.ts +3 -0
- package/src/Switch/types.ts +49 -22
- package/src/Table/README.md +110 -8
- package/src/Table/Table.tsx +246 -16
- package/src/Table/TableExpandableContext.ts +7 -0
- package/src/Table/__tests__/Table.DetailRow.test.tsx +83 -0
- package/src/Table/__tests__/Table.ExpandTrigger.test.tsx +102 -0
- package/src/Table/__tests__/Table.Expandable.test.tsx +121 -0
- package/src/Table/types.ts +191 -17
- package/src/Tabs/README.md +4 -4
- package/src/Tabs/Tabs.tsx +13 -4
- package/src/Tabs/__tests__/Tabs.activation-mode.test.tsx +58 -0
- package/src/Tabs/__tests__/Tabs.basic-rendering.test.tsx +15 -0
- package/src/Tabs/__tests__/Tabs.change-event-callbacks.test.tsx +24 -0
- package/src/Tabs/__tests__/Tabs.disabled-tabs.test.tsx +36 -0
- package/src/Tabs/__tests__/Tabs.lazy-mount.test.tsx +17 -0
- package/src/Tabs/hooks/useTabsContent.ts +5 -0
- package/src/Tabs/hooks/useTabsRoot.ts +29 -5
- package/src/Tabs/hooks/useTabsTrigger.ts +7 -2
- package/src/Tabs/types.ts +29 -4
- package/src/Textarea/Textarea.tsx +9 -1
- package/src/Textarea/__tests__/Textarea.basic-rendering.test.tsx +5 -0
- package/src/Textarea/types.ts +20 -3
- package/src/Toggle/Toggle.tsx +51 -13
- package/src/Toggle/__tests__/Toggle.basic-rendering.test.tsx +5 -0
- package/src/Toggle/types.ts +54 -4
- package/src/ToggleGroup/README.md +4 -4
- package/src/ToggleGroup/ToggleGroup.tsx +14 -1
- package/src/ToggleGroup/__tests__/ToggleGroup.asChild.test.tsx +20 -0
- package/src/ToggleGroup/__tests__/ToggleGroup.basic-rendering.test.tsx +9 -0
- package/src/ToggleGroup/__tests__/ToggleGroup.dynamic-items.test.tsx +70 -0
- package/src/ToggleGroup/__tests__/ToggleGroup.error-handling.test.tsx +23 -0
- package/src/ToggleGroup/__tests__/ToggleGroup.keyboard-interaction.test.tsx +23 -1
- package/src/ToggleGroup/__tests__/ToggleGroup.ref-forwarding.test.tsx +58 -0
- package/src/ToggleGroup/hooks/useToggleGroupRoot.ts +21 -1
- package/src/ToggleGroup/types.ts +55 -2
- package/src/Tooltip/README.md +7 -7
- package/src/Tooltip/Tooltip.tsx +100 -22
- package/src/Tooltip/__tests__/Tooltip.basic-rendering.test.tsx +50 -0
- package/src/Tooltip/__tests__/Tooltip.error-handling.test.tsx +37 -0
- package/src/Tooltip/__tests__/Tooltip.escape-hatches.test.tsx +73 -0
- package/src/Tooltip/__tests__/Tooltip.keyboard-interaction.test.tsx +134 -0
- package/src/Tooltip/__tests__/Tooltip.skip-delay.test.tsx +216 -0
- package/src/Tooltip/__tests__/Tooltip.timer-coordination.test.tsx +223 -0
- package/src/Tooltip/hooks/__tests__/useTooltipProvider.test.tsx +40 -0
- package/src/Tooltip/hooks/useTooltipContent.ts +3 -0
- package/src/Tooltip/hooks/useTooltipProvider.ts +46 -8
- package/src/Tooltip/hooks/useTooltipRoot.ts +30 -6
- package/src/Tooltip/types.ts +89 -8
- package/src/Tree/README.md +69 -5
- package/src/Tree/Tree.tsx +188 -34
- package/src/Tree/__tests__/Tree.styled-wrapper.test.tsx +159 -0
- package/src/Tree/hooks/useTreePath.ts +33 -1
- package/src/Tree/index.ts +6 -1
- package/src/Tree/types.ts +54 -12
- package/src/Tree/utils.ts +46 -4
- package/src/VisuallyHidden/VisuallyHidden.tsx +33 -8
- package/src/VisuallyHidden/__tests__/VisuallyHidden.test.tsx +15 -1
- package/src/VisuallyHidden/types.ts +11 -1
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useTypeahead.ts +95 -0
- package/src/index.ts +10 -0
- package/src/test/intersectionObserverPolyfill.ts +7 -0
- package/src/test/resizeObserverPolyfill.ts +80 -0
- package/src/useLocalStorage/__tests__/useLocalStorage.reading.test.tsx +31 -0
- package/src/useLocalStorage/__tests__/useLocalStorage.resilience.test.tsx +97 -0
- package/src/useLocalStorage/__tests__/useLocalStorage.ssr.test.tsx +20 -0
- package/src/useLocalStorage/__tests__/useLocalStorage.writing.test.tsx +72 -0
- package/src/useLocalStorage/index.ts +1 -0
- package/src/useLocalStorage/useLocalStorage.ts +140 -0
- package/src/useMediaQuery/README.md +66 -0
- package/src/useMediaQuery/__tests__/useMediaQuery.matching.test.tsx +42 -0
- package/src/useMediaQuery/__tests__/useMediaQuery.ssr.test.tsx +19 -0
- package/src/useMediaQuery/__tests__/useMediaQuery.subscription.test.tsx +89 -0
- package/src/useMediaQuery/index.ts +1 -0
- package/src/useMediaQuery/useMediaQuery.ts +49 -0
- package/src/usePagination/README.md +170 -0
- package/src/usePagination/__tests__/usePagination.navigation.test.tsx +109 -0
- package/src/usePagination/__tests__/usePagination.page-count.test.tsx +56 -0
- package/src/usePagination/__tests__/usePagination.page-state.test.tsx +87 -0
- package/src/usePagination/__tests__/usePagination.range.test.tsx +82 -0
- package/src/usePagination/__tests__/usePagination.slice.test.tsx +59 -0
- package/src/usePagination/__tests__/usePagination.windowing.test.tsx +68 -0
- package/src/usePagination/index.ts +1 -0
- package/src/usePagination/usePagination.ts +292 -0
- package/src/utils/focusable.ts +15 -0
- package/src/utils/getKeyToActionMap.ts +1 -1
- package/src/utils/index.ts +1 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { render, screen } from "@testing-library/react";
|
|
2
|
+
import userEvent from "@testing-library/user-event";
|
|
3
|
+
|
|
4
|
+
import { Collapsible } from "../Collapsible";
|
|
5
|
+
|
|
6
|
+
const VAR = "--primitiv-collapsible-collapsed-height";
|
|
7
|
+
|
|
8
|
+
describe("Collapsible collapsedHeight (clamped preview)", () => {
|
|
9
|
+
it("keeps the closed panel mounted and un-hidden (a visible preview)", () => {
|
|
10
|
+
// Arrange & Act
|
|
11
|
+
render(
|
|
12
|
+
<Collapsible.Root>
|
|
13
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
14
|
+
<Collapsible.Content collapsedHeight={64} data-testid="content">
|
|
15
|
+
Content
|
|
16
|
+
</Collapsible.Content>
|
|
17
|
+
</Collapsible.Root>,
|
|
18
|
+
);
|
|
19
|
+
const content = screen.getByTestId("content");
|
|
20
|
+
|
|
21
|
+
// Assert — visible preview, not hidden, not aria-hidden
|
|
22
|
+
expect(content).toBeInTheDocument();
|
|
23
|
+
expect(content).not.toHaveAttribute("hidden");
|
|
24
|
+
expect(content).not.toHaveAttribute("aria-hidden");
|
|
25
|
+
expect(content).toHaveAttribute("data-state", "closed");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("publishes a numeric collapsedHeight as a pixel custom property", () => {
|
|
29
|
+
// Arrange & Act
|
|
30
|
+
render(
|
|
31
|
+
<Collapsible.Root>
|
|
32
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
33
|
+
<Collapsible.Content collapsedHeight={64} data-testid="content">
|
|
34
|
+
Content
|
|
35
|
+
</Collapsible.Content>
|
|
36
|
+
</Collapsible.Root>,
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
// Assert
|
|
40
|
+
expect(
|
|
41
|
+
screen.getByTestId("content").style.getPropertyValue(VAR),
|
|
42
|
+
).toBe("64px");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("uses a string collapsedHeight verbatim as a CSS length", () => {
|
|
46
|
+
// Arrange & Act
|
|
47
|
+
render(
|
|
48
|
+
<Collapsible.Root>
|
|
49
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
50
|
+
<Collapsible.Content collapsedHeight="4rem" data-testid="content">
|
|
51
|
+
Content
|
|
52
|
+
</Collapsible.Content>
|
|
53
|
+
</Collapsible.Root>,
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
// Assert
|
|
57
|
+
expect(
|
|
58
|
+
screen.getByTestId("content").style.getPropertyValue(VAR),
|
|
59
|
+
).toBe("4rem");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("toggles data-state open/closed while staying mounted", async () => {
|
|
63
|
+
// Arrange
|
|
64
|
+
const user = userEvent.setup();
|
|
65
|
+
render(
|
|
66
|
+
<Collapsible.Root>
|
|
67
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
68
|
+
<Collapsible.Content collapsedHeight={64} data-testid="content">
|
|
69
|
+
Content
|
|
70
|
+
</Collapsible.Content>
|
|
71
|
+
</Collapsible.Root>,
|
|
72
|
+
);
|
|
73
|
+
const content = screen.getByTestId("content");
|
|
74
|
+
|
|
75
|
+
// Act
|
|
76
|
+
await user.click(screen.getByRole("button", { name: "Toggle" }));
|
|
77
|
+
|
|
78
|
+
// Assert — opened, still no hidden/aria-hidden, var still present
|
|
79
|
+
expect(content).toHaveAttribute("data-state", "open");
|
|
80
|
+
expect(content).not.toHaveAttribute("hidden");
|
|
81
|
+
expect(content).not.toHaveAttribute("aria-hidden");
|
|
82
|
+
expect(content.style.getPropertyValue(VAR)).toBe("64px");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("merges the custom property with a consumer style", () => {
|
|
86
|
+
// Arrange & Act
|
|
87
|
+
render(
|
|
88
|
+
<Collapsible.Root>
|
|
89
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
90
|
+
<Collapsible.Content
|
|
91
|
+
collapsedHeight={64}
|
|
92
|
+
style={{ color: "rgb(1, 2, 3)" }}
|
|
93
|
+
data-testid="content"
|
|
94
|
+
>
|
|
95
|
+
Content
|
|
96
|
+
</Collapsible.Content>
|
|
97
|
+
</Collapsible.Root>,
|
|
98
|
+
);
|
|
99
|
+
const content = screen.getByTestId("content");
|
|
100
|
+
|
|
101
|
+
// Assert — both the private var and the consumer's declaration survive
|
|
102
|
+
expect(content.style.getPropertyValue(VAR)).toBe("64px");
|
|
103
|
+
expect(content.style.color).toBe("rgb(1, 2, 3)");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("does not aria-hide a clamped panel even when forceMount is also set", () => {
|
|
107
|
+
// Arrange & Act — clamped wins: the preview stays readable, so no
|
|
108
|
+
// aria-hidden despite forceMount being present.
|
|
109
|
+
render(
|
|
110
|
+
<Collapsible.Root>
|
|
111
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
112
|
+
<Collapsible.Content
|
|
113
|
+
forceMount
|
|
114
|
+
collapsedHeight={64}
|
|
115
|
+
data-testid="content"
|
|
116
|
+
>
|
|
117
|
+
Content
|
|
118
|
+
</Collapsible.Content>
|
|
119
|
+
</Collapsible.Root>,
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
// Assert
|
|
123
|
+
expect(screen.getByTestId("content")).not.toHaveAttribute("aria-hidden");
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("does not set the custom property when collapsedHeight is omitted", () => {
|
|
127
|
+
// Arrange & Act
|
|
128
|
+
render(
|
|
129
|
+
<Collapsible.Root>
|
|
130
|
+
<Collapsible.Trigger>Toggle</Collapsible.Trigger>
|
|
131
|
+
<Collapsible.Content data-testid="content">Content</Collapsible.Content>
|
|
132
|
+
</Collapsible.Root>,
|
|
133
|
+
);
|
|
134
|
+
const content = screen.getByTestId("content");
|
|
135
|
+
|
|
136
|
+
// Assert — default fully-hidden behaviour is untouched
|
|
137
|
+
expect(content.style.getPropertyValue(VAR)).toBe("");
|
|
138
|
+
expect(content).toHaveAttribute("hidden");
|
|
139
|
+
});
|
|
140
|
+
});
|
|
@@ -9,7 +9,9 @@ export function useCollapsibleTrigger({
|
|
|
9
9
|
ref,
|
|
10
10
|
onClick,
|
|
11
11
|
onKeyDown,
|
|
12
|
-
|
|
12
|
+
// No default: the `CollapsibleTrigger` component always supplies a resolved
|
|
13
|
+
// `asChild` boolean, so a default here would be unreachable (dead) code.
|
|
14
|
+
asChild,
|
|
13
15
|
...rest
|
|
14
16
|
}: Omit<CollapsibleTriggerProps, "children">) {
|
|
15
17
|
const { open, disabled, toggle, triggerId, contentId } =
|
package/src/Collapsible/types.ts
CHANGED
|
@@ -1,68 +1,135 @@
|
|
|
1
1
|
import { ComponentProps, ReactNode, Ref } from "react";
|
|
2
2
|
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Shared base for both {@link CollapsibleRootProps} variants — the native
|
|
5
|
+
* `<div>` attributes (minus the conflicting `onChange`) plus the `disabled`
|
|
6
|
+
* flag common to both state modes.
|
|
7
|
+
*/
|
|
4
8
|
export type CollapsibleRootBaseProps = Omit<
|
|
5
9
|
ComponentProps<"div">,
|
|
6
10
|
"onChange"
|
|
7
11
|
> & {
|
|
8
|
-
/**
|
|
12
|
+
/**
|
|
13
|
+
* When `true`, disables the widget: the {@link CollapsibleTriggerProps |
|
|
14
|
+
* Trigger} renders `aria-disabled="true"` (staying focusable) and both
|
|
15
|
+
* click and keyboard activation are short-circuited. Mirrored as
|
|
16
|
+
* `data-disabled` onto Root, Trigger, and Content.
|
|
17
|
+
* @default false
|
|
18
|
+
*/
|
|
9
19
|
disabled?: boolean;
|
|
10
20
|
};
|
|
11
21
|
|
|
12
22
|
/**
|
|
13
|
-
*
|
|
14
|
-
* open state. Pass `defaultOpen`
|
|
23
|
+
* Uncontrolled variant of {@link CollapsibleRootProps}: the component owns
|
|
24
|
+
* the open state. Pass `defaultOpen` (or omit it); `open` is forbidden.
|
|
15
25
|
*/
|
|
16
26
|
export type CollapsibleRootUncontrolledProps = CollapsibleRootBaseProps & {
|
|
17
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* Initial open state on first render. The component owns the value
|
|
29
|
+
* thereafter.
|
|
30
|
+
* @default false
|
|
31
|
+
*/
|
|
18
32
|
defaultOpen?: boolean;
|
|
19
|
-
/** Forbidden in uncontrolled mode. */
|
|
33
|
+
/** Forbidden in uncontrolled mode — use `defaultOpen` instead. */
|
|
20
34
|
open?: never;
|
|
21
|
-
/** Called
|
|
35
|
+
/** Called with the new open state on every toggle. Optional in
|
|
36
|
+
* uncontrolled mode (Collapsible fires it in both modes). */
|
|
22
37
|
onOpenChange?: (open: boolean) => void;
|
|
23
38
|
};
|
|
24
39
|
|
|
25
40
|
/**
|
|
26
|
-
*
|
|
27
|
-
* value. Pass `open` and `onOpenChange` together; `defaultOpen` is
|
|
41
|
+
* Controlled variant of {@link CollapsibleRootProps}: the parent owns the
|
|
42
|
+
* open value. Pass `open` and `onOpenChange` together; `defaultOpen` is
|
|
43
|
+
* forbidden.
|
|
28
44
|
*/
|
|
29
45
|
export type CollapsibleRootControlledProps = CollapsibleRootBaseProps & {
|
|
30
|
-
/** The controlled open state.
|
|
46
|
+
/** The controlled open state. Must be kept in sync by the parent via
|
|
47
|
+
* `onOpenChange`. */
|
|
31
48
|
open: boolean;
|
|
32
|
-
/** Called
|
|
49
|
+
/** Called with the requested open state on every toggle. Required in
|
|
50
|
+
* controlled mode. */
|
|
33
51
|
onOpenChange: (open: boolean) => void;
|
|
34
|
-
/** Forbidden in controlled mode. */
|
|
52
|
+
/** Forbidden in controlled mode — use `open` instead. */
|
|
35
53
|
defaultOpen?: never;
|
|
36
54
|
};
|
|
37
55
|
|
|
38
|
-
/**
|
|
56
|
+
/**
|
|
57
|
+
* Props for {@link CollapsibleRoot | `Collapsible.Root`}.
|
|
58
|
+
*
|
|
59
|
+
* Resolves to either {@link CollapsibleRootUncontrolledProps} or
|
|
60
|
+
* {@link CollapsibleRootControlledProps} — only one shape is accepted by
|
|
61
|
+
* TypeScript at a time.
|
|
62
|
+
*/
|
|
39
63
|
export type CollapsibleRootProps =
|
|
40
64
|
| CollapsibleRootUncontrolledProps
|
|
41
65
|
| CollapsibleRootControlledProps;
|
|
42
66
|
|
|
43
|
-
/**
|
|
67
|
+
/**
|
|
68
|
+
* Props for {@link CollapsibleTrigger | `Collapsible.Trigger`}, the button
|
|
69
|
+
* that toggles the panel.
|
|
70
|
+
*
|
|
71
|
+
* Generic over the rendered element type so `asChild` consumers can type
|
|
72
|
+
* the forwarded `ref` (e.g. `Collapsible.Trigger<HTMLAnchorElement>`).
|
|
73
|
+
*/
|
|
44
74
|
export type CollapsibleTriggerProps<T extends HTMLElement = HTMLButtonElement> =
|
|
45
75
|
Omit<ComponentProps<"button">, "ref"> & {
|
|
46
|
-
/** Trigger content (label,
|
|
76
|
+
/** Trigger content (label, and optionally a
|
|
77
|
+
* {@link CollapsibleTriggerIconProps | TriggerIcon}). */
|
|
47
78
|
children: ReactNode;
|
|
48
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Render a single consumer-supplied child element instead of the default
|
|
81
|
+
* `<button>`, merging the Trigger's ARIA, handlers, and ref onto it via
|
|
82
|
+
* the {@link Slot} pattern. When `asChild` and the Root is `disabled`,
|
|
83
|
+
* `role="button"` is injected so `aria-disabled` is semantically valid.
|
|
84
|
+
* @default false
|
|
85
|
+
*/
|
|
49
86
|
asChild?: boolean;
|
|
50
|
-
/**
|
|
51
|
-
* `asChild`, specify the child's element type (e.g.
|
|
87
|
+
/** Forwarded to the rendered element. Defaults to `HTMLButtonElement`;
|
|
88
|
+
* when using `asChild`, specify the child's element type (e.g.
|
|
89
|
+
* `HTMLAnchorElement`). Composed with the library's internal ref. */
|
|
52
90
|
ref?: Ref<T>;
|
|
53
91
|
};
|
|
54
92
|
|
|
55
|
-
/**
|
|
93
|
+
/**
|
|
94
|
+
* Props for {@link CollapsibleContent | `Collapsible.Content`}, the panel
|
|
95
|
+
* revealed when open.
|
|
96
|
+
*/
|
|
56
97
|
export type CollapsibleContentProps = ComponentProps<"div"> & {
|
|
57
98
|
/** Panel content. */
|
|
58
99
|
children: ReactNode;
|
|
59
|
-
/**
|
|
100
|
+
/**
|
|
101
|
+
* Keep the panel mounted (and in the DOM) even when closed, so open/close
|
|
102
|
+
* transitions can be CSS-driven. When closed under `forceMount`, the panel
|
|
103
|
+
* gets `aria-hidden="true"` instead of the `hidden` attribute. Consumers
|
|
104
|
+
* may override `aria-hidden` explicitly.
|
|
105
|
+
* @default false
|
|
106
|
+
*/
|
|
60
107
|
forceMount?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Show a **clamped preview** of the panel while closed instead of hiding it
|
|
110
|
+
* entirely — the "collapsed height" / read-more pattern. A `number` is taken
|
|
111
|
+
* as pixels; a string is used verbatim as a CSS length (e.g. `"4rem"`,
|
|
112
|
+
* `"20cqi"`). When set:
|
|
113
|
+
*
|
|
114
|
+
* - the panel is always mounted and never gets the `hidden` attribute or
|
|
115
|
+
* `aria-hidden` (the preview is real, readable content), so `forceMount` is
|
|
116
|
+
* implied;
|
|
117
|
+
* - the value is emitted as the `--primitiv-collapsible-collapsed-height`
|
|
118
|
+
* custom property on the panel, which the styling layer clamps the closed
|
|
119
|
+
* height to (e.g. `max-block-size`) and anchors a bottom fade-shadow to,
|
|
120
|
+
* keyed off `data-state="closed"`.
|
|
121
|
+
*
|
|
122
|
+
* Leave unset for the default fully-hidden / grid-collapse behaviour.
|
|
123
|
+
*/
|
|
124
|
+
collapsedHeight?: number | string;
|
|
61
125
|
};
|
|
62
126
|
|
|
63
|
-
/**
|
|
127
|
+
/**
|
|
128
|
+
* Props for {@link CollapsibleTriggerIcon | `Collapsible.TriggerIcon`}, the
|
|
129
|
+
* `aria-hidden` icon wrapper carrying an open/closed `data-state` hook.
|
|
130
|
+
*/
|
|
64
131
|
export type CollapsibleTriggerIconProps = ComponentProps<"span"> & {
|
|
65
|
-
/** The icon to render (inline SVG or icon component). */
|
|
132
|
+
/** The icon to render (inline SVG or an icon component). */
|
|
66
133
|
children: ReactNode;
|
|
67
134
|
};
|
|
68
135
|
|