@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
package/src/Fieldset/types.ts
CHANGED
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import { ComponentProps } from "react";
|
|
2
2
|
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Props for {@link FieldsetRoot | `Fieldset.Root`} — all native `<fieldset>`
|
|
5
|
+
* attributes plus the `data-disabled` styling hook.
|
|
6
|
+
*
|
|
7
|
+
* No custom props narrow any native attribute, so the full `ComponentProps<"fieldset">`
|
|
8
|
+
* surface is passed through unchanged, including `ref` (forwarded to the
|
|
9
|
+
* underlying `HTMLFieldSetElement`).
|
|
10
|
+
*
|
|
11
|
+
* The one behaviour addition over a bare `<fieldset>` is `data-disabled=""`:
|
|
12
|
+
* when `disabled` is truthy the component sets this attribute alongside the
|
|
13
|
+
* native `disabled`, so CSS can target `[data-disabled]` without relying on
|
|
14
|
+
* the `:disabled` pseudo-class.
|
|
15
|
+
*/
|
|
4
16
|
export type FieldsetProps = ComponentProps<"fieldset">;
|
|
5
17
|
|
|
6
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Props for {@link FieldsetLegend | `Fieldset.Legend`} — all native `<legend>`
|
|
20
|
+
* attributes, including `ref` (forwarded to the underlying `HTMLLegendElement`).
|
|
21
|
+
*
|
|
22
|
+
* `<legend>` has no interactive state, so no additional `data-*` attributes
|
|
23
|
+
* are emitted beyond what is passed explicitly by the consumer.
|
|
24
|
+
*/
|
|
7
25
|
export type FieldsetLegendProps = ComponentProps<"legend">;
|
package/src/Input/Input.tsx
CHANGED
|
@@ -5,16 +5,13 @@ import { Slot } from "../Slot/index.ts";
|
|
|
5
5
|
import { InputProps } from "./types";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* A headless, accessible single-line text input.
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* straight through to the DOM — `value` / `defaultValue`, `placeholder`,
|
|
12
|
-
* `type`, `name`, `required`, `pattern`, `min`, `max`, `step`,
|
|
13
|
-
* `maxLength`, and so on. No styles ship with the component.
|
|
8
|
+
* A headless, accessible single-line text input. Renders a native
|
|
9
|
+
* `<input>` element and passes every standard attribute straight through
|
|
10
|
+
* to the DOM. No styles ship with the component.
|
|
14
11
|
*
|
|
15
12
|
* **Default type.** `type="text"` is set by default. Override with the
|
|
16
13
|
* `type` prop for any native variant (`"email"`, `"password"`,
|
|
17
|
-
* `"number"`, `"search"`, `"tel"`, `"url"`, `"date"`,
|
|
14
|
+
* `"number"`, `"search"`, `"tel"`, `"url"`, `"date"`, ...). Future
|
|
18
15
|
* composite primitives (`PasswordInput`, `NumberInput`, `DatePicker`)
|
|
19
16
|
* will layer richer interaction on top of those types.
|
|
20
17
|
*
|
|
@@ -45,6 +42,11 @@ import { InputProps } from "./types";
|
|
|
45
42
|
* ids first, then field-supplied description / error ids). Outside a
|
|
46
43
|
* `<Field.Root>`, behaviour is unchanged.
|
|
47
44
|
*
|
|
45
|
+
* **Styling hooks.**
|
|
46
|
+
* - `data-disabled=""` — present when `disabled` is `true`; absent
|
|
47
|
+
* otherwise. Lets CSS target `[data-disabled]` without depending on
|
|
48
|
+
* the `:disabled` pseudo-class.
|
|
49
|
+
*
|
|
48
50
|
* **Ref forwarding.** Pass a `ref` prop to access the underlying
|
|
49
51
|
* `HTMLInputElement`:
|
|
50
52
|
*
|
|
@@ -62,14 +64,17 @@ import { InputProps } from "./types";
|
|
|
62
64
|
* ```
|
|
63
65
|
*
|
|
64
66
|
* **`asChild` composition.** Renders the consumer's element instead of
|
|
65
|
-
* `<input>`, merging all props (aria
|
|
66
|
-
* via the {@link Slot} utility.
|
|
67
|
-
*
|
|
67
|
+
* `<input>`, merging all props (`aria-*`, `data-*`, event handlers,
|
|
68
|
+
* `ref`) via the {@link Slot} utility. Event handlers compose with the
|
|
69
|
+
* child's own handlers (child runs first). `type` is **not** forwarded
|
|
70
|
+
* in this mode — the child element owns its own type semantics.
|
|
68
71
|
*
|
|
69
72
|
* **Adornments** live in the separate `InputGroup` primitive — leading
|
|
70
73
|
* / trailing icons, currency symbols, clear buttons, password-reveal
|
|
71
74
|
* toggles.
|
|
72
75
|
*
|
|
76
|
+
* @extends HTMLInputElement
|
|
77
|
+
*
|
|
73
78
|
* @example Basic usage
|
|
74
79
|
* ```tsx
|
|
75
80
|
* <label htmlFor="email">Email</label>
|
package/src/Input/README.md
CHANGED
|
@@ -14,11 +14,11 @@ import { Input } from "@primitiv-ui/react";
|
|
|
14
14
|
|
|
15
15
|
| Prop | Type | Default | Notes |
|
|
16
16
|
| ---------- | -------------------------- | -------- | -------------------------------------------------------------- |
|
|
17
|
-
| `type` | `string` | `"text"` | Any native `<input>` type (`"email"`, `"password"`,
|
|
17
|
+
| `type` | `string` | `"text"` | Any native `<input>` type (`"email"`, `"password"`, ...) |
|
|
18
18
|
| `disabled` | `boolean` | — | Native `disabled` + `data-disabled=""` styling hook |
|
|
19
19
|
| `asChild` | `boolean` | `false` | Delegate rendering to the child element via Slot |
|
|
20
20
|
| `ref` | `Ref<HTMLInputElement>` | — | Forwarded to the underlying input element |
|
|
21
|
-
| `...rest` | `ComponentProps<"input">` | — | All other `<input>` props (`value`, `placeholder`, `aria-*`,
|
|
21
|
+
| `...rest` | `ComponentProps<"input">` | — | All other `<input>` props (`value`, `placeholder`, `aria-*`, ...) |
|
|
22
22
|
|
|
23
23
|
## Default type
|
|
24
24
|
|
|
@@ -115,4 +115,9 @@ describe("Input basic rendering", () => {
|
|
|
115
115
|
// Assert
|
|
116
116
|
expect(onChange).toHaveBeenCalledTimes(2);
|
|
117
117
|
});
|
|
118
|
+
|
|
119
|
+
it('sets displayName to "Input" for React DevTools and stack traces', () => {
|
|
120
|
+
// Assert — an empty displayName would render it as an anonymous component.
|
|
121
|
+
expect(Input.displayName).toBe("Input");
|
|
122
|
+
});
|
|
118
123
|
});
|
package/src/Input/types.ts
CHANGED
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
import { ComponentProps, ReactNode, Ref } from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Props for {@link Input} — all native `<input>` attributes
|
|
5
|
-
* `asChild` escape hatch and a typed `ref`.
|
|
4
|
+
* Props for {@link Input} — all native `<input>` attributes (with `type`
|
|
5
|
+
* defaulting to `"text"`) plus the `asChild` escape hatch and a typed `ref`.
|
|
6
6
|
*/
|
|
7
7
|
export type InputProps = ComponentProps<"input"> & {
|
|
8
|
+
/**
|
|
9
|
+
* Renders the child element instead of a native `<input>`, merging all
|
|
10
|
+
* props — `aria-*`, `data-*`, event handlers, `ref` — onto it via
|
|
11
|
+
* {@link Slot}. Event handlers compose (child runs first). `type` is
|
|
12
|
+
* not forwarded in this mode; the child owns its own type semantics.
|
|
13
|
+
* See the `asChild` example on {@link Input}.
|
|
14
|
+
* @default false
|
|
15
|
+
*/
|
|
8
16
|
asChild?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Forwarded to the underlying `HTMLInputElement`. Under `asChild`,
|
|
19
|
+
* merged onto the rendered child via {@link Slot}.
|
|
20
|
+
*/
|
|
9
21
|
ref?: Ref<HTMLInputElement>;
|
|
22
|
+
/**
|
|
23
|
+
* Under `asChild`, becomes the single child element `Slot` merges props
|
|
24
|
+
* onto. Not rendered by the native `<input>` path (inputs are void
|
|
25
|
+
* elements in HTML).
|
|
26
|
+
*/
|
|
10
27
|
children?: ReactNode;
|
|
11
28
|
};
|
|
@@ -19,6 +19,8 @@ import { InputGroupAdornmentProps, InputGroupRootProps } from "./types";
|
|
|
19
19
|
* element instead of `<div>` — e.g. a `<label>` so a click anywhere on
|
|
20
20
|
* the frame focuses the wrapped input.
|
|
21
21
|
*
|
|
22
|
+
* @extends HTMLDivElement
|
|
23
|
+
*
|
|
22
24
|
* @example Basic frame with no adornments
|
|
23
25
|
* ```tsx
|
|
24
26
|
* <InputGroup>
|
|
@@ -56,6 +58,7 @@ export function InputGroupRoot({
|
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
/** @internal */
|
|
61
|
+
// Stryker disable next-line StringLiteral: overwritten by the compound alias — an equivalent mutant.
|
|
59
62
|
InputGroupRoot.displayName = "InputGroupRoot";
|
|
60
63
|
|
|
61
64
|
/**
|
|
@@ -76,6 +79,8 @@ InputGroupRoot.displayName = "InputGroupRoot";
|
|
|
76
79
|
* search, opens a colour picker, or any other action. Event handlers
|
|
77
80
|
* compose (child runs first); refs forward to the consumer element.
|
|
78
81
|
*
|
|
82
|
+
* @extends HTMLSpanElement
|
|
83
|
+
*
|
|
79
84
|
* @example Decorative leading icon
|
|
80
85
|
* ```tsx
|
|
81
86
|
* <InputGroup.LeadingAdornment>
|
|
@@ -131,6 +136,8 @@ InputGroupLeadingAdornment.displayName = "InputGroupLeadingAdornment";
|
|
|
131
136
|
* element such as `<button>`. Event handlers compose (child runs
|
|
132
137
|
* first); refs forward to the consumer element.
|
|
133
138
|
*
|
|
139
|
+
* @extends HTMLSpanElement
|
|
140
|
+
*
|
|
134
141
|
* @example Trailing clear button via asChild
|
|
135
142
|
* ```tsx
|
|
136
143
|
* <InputGroup.TrailingAdornment asChild>
|
|
@@ -191,9 +198,10 @@ export type TInputGroupCompound = typeof InputGroupRoot & {
|
|
|
191
198
|
* trailing slot, `data-input-group-adornment="trailing"`.
|
|
192
199
|
*
|
|
193
200
|
* **State coordination.** None. CSS handles disabled / invalid /
|
|
194
|
-
* focus-within styling via `:has()` and `:focus-within`.
|
|
195
|
-
*
|
|
196
|
-
*
|
|
201
|
+
* focus-within styling via `:has()` and `:focus-within`. {@link Field}
|
|
202
|
+
* sits *outside* `InputGroup` and owns the label / error / description
|
|
203
|
+
* wiring, so the two compose without `InputGroup` needing to know about
|
|
204
|
+
* it — wrap the `Input` in an `InputGroup` inside a `Field.Root`.
|
|
197
205
|
*
|
|
198
206
|
* @example Leading search icon
|
|
199
207
|
* ```tsx
|
|
@@ -103,4 +103,18 @@ describe("InputGroup basic rendering", () => {
|
|
|
103
103
|
expect(screen.getByTestId("lead")).toHaveClass("lead");
|
|
104
104
|
expect(screen.getByTestId("trail")).toHaveClass("trail");
|
|
105
105
|
});
|
|
106
|
+
|
|
107
|
+
it("sets a displayName on the compound and each adornment", () => {
|
|
108
|
+
// Assert — empty displayNames would render each as anonymous in DevTools.
|
|
109
|
+
// `InputGroup`, `InputGroup.Root`, and the underlying function are one
|
|
110
|
+
// object (Object.assign compound), so the compound's "InputGroup" alias is
|
|
111
|
+
// the observable Root displayName; the adornments are distinct objects.
|
|
112
|
+
expect(InputGroup.displayName).toBe("InputGroup");
|
|
113
|
+
expect(InputGroup.LeadingAdornment.displayName).toBe(
|
|
114
|
+
"InputGroupLeadingAdornment",
|
|
115
|
+
);
|
|
116
|
+
expect(InputGroup.TrailingAdornment.displayName).toBe(
|
|
117
|
+
"InputGroupTrailingAdornment",
|
|
118
|
+
);
|
|
119
|
+
});
|
|
106
120
|
});
|
package/src/InputGroup/types.ts
CHANGED
|
@@ -1,22 +1,43 @@
|
|
|
1
1
|
import { ComponentProps, ReactNode, Ref } from "react";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Props for {@link InputGroup.Root} —
|
|
5
|
-
*
|
|
4
|
+
* Props for {@link InputGroupRoot | `InputGroup.Root`} — the frame
|
|
5
|
+
* wrapper. Extends the native `<div>` attributes plus the `asChild`
|
|
6
|
+
* escape hatch and a typed `ref`.
|
|
6
7
|
*/
|
|
7
8
|
export type InputGroupRootProps = ComponentProps<"div"> & {
|
|
9
|
+
/** Render the consumer's element instead of `<div>` via the
|
|
10
|
+
* {@link Slot} pattern — e.g. a `<label>` so the whole frame is
|
|
11
|
+
* clickable. The `data-input-group` hook is preserved.
|
|
12
|
+
* @default false */
|
|
8
13
|
asChild?: boolean;
|
|
14
|
+
/** Forwarded to the underlying `HTMLDivElement` (or the `asChild`
|
|
15
|
+
* element). */
|
|
9
16
|
ref?: Ref<HTMLDivElement>;
|
|
17
|
+
/** The wrapped control and its optional leading / trailing
|
|
18
|
+
* adornments. */
|
|
10
19
|
children?: ReactNode;
|
|
11
20
|
};
|
|
12
21
|
|
|
13
22
|
/**
|
|
14
|
-
* Props
|
|
15
|
-
* {@link InputGroup.
|
|
16
|
-
*
|
|
23
|
+
* Props shared by
|
|
24
|
+
* {@link InputGroupLeadingAdornment | `InputGroup.LeadingAdornment`} and
|
|
25
|
+
* {@link InputGroupTrailingAdornment | `InputGroup.TrailingAdornment`} —
|
|
26
|
+
* the positioned adornment slots. Extends the native `<span>` attributes
|
|
27
|
+
* plus the `asChild` escape hatch and a typed `ref`.
|
|
17
28
|
*/
|
|
18
29
|
export type InputGroupAdornmentProps = ComponentProps<"span"> & {
|
|
30
|
+
/** Render the consumer's element instead of `<span>` via the
|
|
31
|
+
* {@link Slot} pattern — e.g. an interactive `<button>`. Event
|
|
32
|
+
* handlers compose (child runs first) and the `data-input-group-adornment`
|
|
33
|
+
* hook is preserved.
|
|
34
|
+
* @default false */
|
|
19
35
|
asChild?: boolean;
|
|
36
|
+
/** Forwarded to the underlying `HTMLSpanElement` (or the `asChild`
|
|
37
|
+
* element). */
|
|
20
38
|
ref?: Ref<HTMLSpanElement>;
|
|
39
|
+
/** The adornment content — a decorative icon (mark it
|
|
40
|
+
* `aria-hidden="true"`), suffix text, or an interactive control with an
|
|
41
|
+
* accessible name. */
|
|
21
42
|
children?: ReactNode;
|
|
22
43
|
};
|