@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.
Files changed (456) hide show
  1. package/README.md +19 -2
  2. package/package.json +6 -1
  3. package/src/AccessibleIcon/AccessibleIcon.tsx +32 -9
  4. package/src/AccessibleIcon/__tests__/AccessibleIcon.test.tsx +5 -0
  5. package/src/AccessibleIcon/types.ts +15 -2
  6. package/src/Accordion/Accordion.tsx +32 -11
  7. package/src/Accordion/README.md +2 -2
  8. package/src/Accordion/__tests__/Accordion.asChild.test.tsx +46 -0
  9. package/src/Accordion/__tests__/Accordion.basic-rendering.test.tsx +15 -0
  10. package/src/Accordion/__tests__/Accordion.disabled-items.test.tsx +42 -0
  11. package/src/Accordion/__tests__/Accordion.error-handling.test.tsx +33 -0
  12. package/src/Accordion/hooks/useAccordionRoot.ts +44 -7
  13. package/src/Accordion/hooks/useAccordionTrigger.ts +9 -1
  14. package/src/Accordion/types.ts +72 -21
  15. package/src/Alert/Alert.tsx +36 -7
  16. package/src/Alert/__tests__/Alert.test.tsx +5 -0
  17. package/src/Alert/types.ts +18 -2
  18. package/src/Avatar/Avatar.tsx +99 -15
  19. package/src/Avatar/__tests__/Avatar.basic-rendering.test.tsx +10 -0
  20. package/src/Avatar/__tests__/Avatar.fallback.test.tsx +30 -0
  21. package/src/Avatar/__tests__/Avatar.image-loading.test.tsx +35 -0
  22. package/src/Avatar/hooks/useAvatarImage.ts +16 -0
  23. package/src/Avatar/types.ts +15 -3
  24. package/src/Breadcrumb/Breadcrumb.tsx +139 -21
  25. package/src/Breadcrumb/README.md +47 -0
  26. package/src/Breadcrumb/__tests__/Breadcrumb.basic-rendering.test.tsx +11 -0
  27. package/src/Breadcrumb/__tests__/Breadcrumb.ellipsis.test.tsx +110 -0
  28. package/src/Breadcrumb/types.ts +73 -7
  29. package/src/Button/Button.tsx +2 -0
  30. package/src/Button/__tests__/Button.basic-rendering.test.tsx +6 -0
  31. package/src/Button/__tests__/Button.contract.test.tsx +1 -1
  32. package/src/Button/types.ts +21 -0
  33. package/src/Carousel/Carousel.tsx +268 -20
  34. package/src/Carousel/README.md +764 -87
  35. package/src/Carousel/__tests__/Carousel.autoplay-status.test.tsx +239 -0
  36. package/src/Carousel/__tests__/Carousel.drag-status.test.tsx +292 -0
  37. package/src/Carousel/__tests__/Carousel.dynamic-slides.test.tsx +38 -0
  38. package/src/Carousel/__tests__/Carousel.indicators.test.tsx +101 -0
  39. package/src/Carousel/__tests__/Carousel.infinite.test.tsx +1453 -0
  40. package/src/Carousel/__tests__/Carousel.instant-scroll.test.tsx +124 -0
  41. package/src/Carousel/__tests__/Carousel.intersection-observer.test.tsx +90 -2
  42. package/src/Carousel/__tests__/Carousel.loop.test.tsx +163 -0
  43. package/src/Carousel/__tests__/Carousel.loopEngine.test.ts +77 -0
  44. package/src/Carousel/__tests__/Carousel.mouse-drag.test.tsx +504 -0
  45. package/src/Carousel/__tests__/Carousel.multi-slide-bounds.test.tsx +91 -0
  46. package/src/Carousel/__tests__/Carousel.orientation.test.tsx +207 -0
  47. package/src/Carousel/__tests__/Carousel.overscroll.test.tsx +532 -0
  48. package/src/Carousel/__tests__/Carousel.page-snap-points.test.tsx +50 -0
  49. package/src/Carousel/__tests__/Carousel.progress-text.test.tsx +76 -0
  50. package/src/Carousel/__tests__/Carousel.reduced-motion.test.tsx +3 -6
  51. package/src/Carousel/__tests__/Carousel.refresh-progress.test.tsx +2 -5
  52. package/src/Carousel/__tests__/Carousel.scroll-margin.test.tsx +167 -0
  53. package/src/Carousel/__tests__/Carousel.scroll-progress.test.tsx +518 -0
  54. package/src/Carousel/__tests__/Carousel.scroll-snap-change.test.tsx +32 -11
  55. package/src/Carousel/__tests__/Carousel.scroll-sync.test.tsx +237 -24
  56. package/src/Carousel/__tests__/Carousel.scroll-to-index.test.tsx +115 -0
  57. package/src/Carousel/__tests__/Carousel.slide-snap.test.tsx +172 -0
  58. package/src/Carousel/__tests__/Carousel.slides-per-move.test.tsx +179 -1
  59. package/src/Carousel/__tests__/Carousel.slides-per-page.test.tsx +91 -7
  60. package/src/Carousel/__tests__/Carousel.snap-type.test.tsx +35 -0
  61. package/src/Carousel/__tests__/Carousel.transition-modes.test.tsx +30 -5
  62. package/src/Carousel/__tests__/Carousel.translations.test.tsx +23 -0
  63. package/src/Carousel/__tests__/Carousel.wheel.test.tsx +160 -0
  64. package/src/Carousel/hooks/index.ts +1 -0
  65. package/src/Carousel/hooks/useCarouselLoop.ts +869 -0
  66. package/src/Carousel/hooks/useCarouselRoot.ts +338 -42
  67. package/src/Carousel/hooks/useCarouselSlide.ts +44 -9
  68. package/src/Carousel/hooks/useCarouselViewport.ts +649 -46
  69. package/src/Carousel/loopEngine.ts +54 -0
  70. package/src/Carousel/types.ts +458 -36
  71. package/src/Checkbox/Checkbox.tsx +11 -3
  72. package/src/Checkbox/__tests__/Checkbox.basic-rendering.test.tsx +14 -0
  73. package/src/Checkbox/hooks/useCheckboxInput.ts +4 -0
  74. package/src/Checkbox/types.ts +19 -0
  75. package/src/CheckboxCard/CheckboxCard.tsx +14 -5
  76. package/src/CheckboxCard/README.md +1 -1
  77. package/src/CheckboxCard/__tests__/CheckboxCard.basic-rendering.test.tsx +7 -0
  78. package/src/CheckboxCard/types.ts +65 -17
  79. package/src/Collapsible/Collapsible.tsx +49 -3
  80. package/src/Collapsible/README.md +41 -1
  81. package/src/Collapsible/__tests__/Collapsible.asChild.test.tsx +89 -0
  82. package/src/Collapsible/__tests__/Collapsible.basic-rendering.test.tsx +27 -0
  83. package/src/Collapsible/__tests__/Collapsible.collapsedHeight.test.tsx +140 -0
  84. package/src/Collapsible/hooks/useCollapsibleTrigger.ts +3 -1
  85. package/src/Collapsible/types.ts +89 -22
  86. package/src/Combobox/Combobox.tsx +508 -0
  87. package/src/Combobox/ComboboxContext.ts +23 -0
  88. package/src/Combobox/README.md +170 -0
  89. package/src/Combobox/__tests__/Combobox.asChild.test.tsx +62 -0
  90. package/src/Combobox/__tests__/Combobox.basic-rendering.test.tsx +16 -0
  91. package/src/Combobox/__tests__/Combobox.content.test.tsx +36 -0
  92. package/src/Combobox/__tests__/Combobox.controlled-state.test.tsx +88 -0
  93. package/src/Combobox/__tests__/Combobox.empty.test.tsx +42 -0
  94. package/src/Combobox/__tests__/Combobox.ids.test.tsx +66 -0
  95. package/src/Combobox/__tests__/Combobox.item.test.tsx +76 -0
  96. package/src/Combobox/__tests__/Combobox.keyboard-interaction.test.tsx +196 -0
  97. package/src/Combobox/__tests__/Combobox.light-dismiss.test.tsx +101 -0
  98. package/src/Combobox/__tests__/Combobox.query.test.tsx +105 -0
  99. package/src/Combobox/hooks/index.ts +1 -0
  100. package/src/Combobox/hooks/useComboboxRoot.ts +2 -0
  101. package/src/Combobox/index.ts +3 -0
  102. package/src/Combobox/types.ts +133 -0
  103. package/src/ContextMenu/ContextMenu.tsx +270 -4
  104. package/src/ContextMenu/README.md +1 -1
  105. package/src/ContextMenu/types.ts +148 -6
  106. package/src/DirectionProvider/DirectionProvider.tsx +41 -9
  107. package/src/DirectionProvider/README.md +4 -4
  108. package/src/DirectionProvider/__tests__/DirectionProvider.test.tsx +5 -0
  109. package/src/DirectionProvider/types.ts +28 -3
  110. package/src/Divider/Divider.tsx +24 -10
  111. package/src/Divider/__tests__/Divider.contract.test.tsx +1 -1
  112. package/src/Divider/__tests__/Divider.test.tsx +5 -0
  113. package/src/Divider/types.ts +10 -3
  114. package/src/Drawer/Drawer.tsx +315 -0
  115. package/src/Drawer/README.md +124 -0
  116. package/src/Drawer/__tests__/Drawer.behavior.test.tsx +100 -0
  117. package/src/Drawer/__tests__/Drawer.focus-trap.test.tsx +55 -0
  118. package/src/Drawer/__tests__/Drawer.rendering.test.tsx +111 -0
  119. package/src/Drawer/__tests__/Drawer.side.test.tsx +69 -0
  120. package/src/Drawer/__tests__/dialog-polyfill.ts +39 -0
  121. package/src/Drawer/index.ts +2 -0
  122. package/src/Drawer/types.ts +66 -0
  123. package/src/Dropdown/Dropdown.tsx +119 -2
  124. package/src/Dropdown/README.md +7 -5
  125. package/src/Dropdown/types.ts +241 -11
  126. package/src/EmptyState/EmptyState.tsx +74 -4
  127. package/src/EmptyState/README.md +2 -2
  128. package/src/EmptyState/__tests__/EmptyState.Actions.test.tsx +7 -2
  129. package/src/EmptyState/__tests__/EmptyState.Description.test.tsx +3 -1
  130. package/src/EmptyState/__tests__/EmptyState.Root.test.tsx +10 -0
  131. package/src/EmptyState/__tests__/EmptyState.Title.test.tsx +3 -1
  132. package/src/EmptyState/types.ts +49 -6
  133. package/src/Field/Field.tsx +23 -0
  134. package/src/Field/README.md +1 -1
  135. package/src/Field/__tests__/Field.basic-rendering.test.tsx +11 -0
  136. package/src/Field/__tests__/Field.error-handling.test.tsx +23 -0
  137. package/src/Field/__tests__/Field.state-cascade.test.tsx +21 -0
  138. package/src/Field/hooks/__tests__/useFieldProps.test.tsx +104 -9
  139. package/src/Field/hooks/useFieldProps.ts +1 -1
  140. package/src/Field/types.ts +60 -12
  141. package/src/Fieldset/Fieldset.tsx +55 -19
  142. package/src/Fieldset/README.md +2 -2
  143. package/src/Fieldset/__tests__/Fieldset.basic-rendering.test.tsx +9 -0
  144. package/src/Fieldset/types.ts +20 -2
  145. package/src/Input/Input.tsx +15 -10
  146. package/src/Input/README.md +2 -2
  147. package/src/Input/__tests__/Input.basic-rendering.test.tsx +5 -0
  148. package/src/Input/types.ts +19 -2
  149. package/src/InputGroup/InputGroup.tsx +11 -3
  150. package/src/InputGroup/__tests__/InputGroup.basic-rendering.test.tsx +14 -0
  151. package/src/InputGroup/types.ts +26 -5
  152. package/src/Listbox/Listbox.tsx +475 -0
  153. package/src/Listbox/ListboxContext.ts +48 -0
  154. package/src/Listbox/README.md +248 -0
  155. package/src/Listbox/__tests__/Listbox.active-descendant.test.tsx +128 -0
  156. package/src/Listbox/__tests__/Listbox.asChild.test.tsx +91 -0
  157. package/src/Listbox/__tests__/Listbox.basic-rendering.test.tsx +16 -0
  158. package/src/Listbox/__tests__/Listbox.controlled-state.test.tsx +114 -0
  159. package/src/Listbox/__tests__/Listbox.disabled.test.tsx +90 -0
  160. package/src/Listbox/__tests__/Listbox.fixtures.ts +27 -0
  161. package/src/Listbox/__tests__/Listbox.group-label.test.tsx +97 -0
  162. package/src/Listbox/__tests__/Listbox.group.test.tsx +45 -0
  163. package/src/Listbox/__tests__/Listbox.keyboard-edge-cases.test.tsx +144 -0
  164. package/src/Listbox/__tests__/Listbox.keyboard-interaction.test.tsx +112 -0
  165. package/src/Listbox/__tests__/Listbox.modifier-keys.test.tsx +86 -0
  166. package/src/Listbox/__tests__/Listbox.multi-select-keyboard.test.tsx +368 -0
  167. package/src/Listbox/__tests__/Listbox.multiple-mode.test.tsx +91 -0
  168. package/src/Listbox/__tests__/Listbox.mutation-hardening.test.tsx +480 -0
  169. package/src/Listbox/__tests__/Listbox.orientation.test.tsx +59 -0
  170. package/src/Listbox/__tests__/Listbox.reading-direction.test.tsx +65 -0
  171. package/src/Listbox/__tests__/Listbox.reorder.test.tsx +78 -0
  172. package/src/Listbox/__tests__/Listbox.selection-follows-focus.test.tsx +64 -0
  173. package/src/Listbox/__tests__/Listbox.strict-context.test.tsx +21 -0
  174. package/src/Listbox/__tests__/Listbox.typeahead.test.tsx +123 -0
  175. package/src/Listbox/__tests__/Listbox.uncontrolled-state.test.tsx +48 -0
  176. package/src/Listbox/constants.ts +2 -0
  177. package/src/Listbox/hooks/index.ts +1 -0
  178. package/src/Listbox/hooks/useListboxRoot.ts +407 -0
  179. package/src/Listbox/index.ts +3 -0
  180. package/src/Listbox/types.ts +238 -0
  181. package/src/MillerColumns/MillerColumns.tsx +186 -45
  182. package/src/MillerColumns/README.md +90 -20
  183. package/src/MillerColumns/__tests__/MillerColumns.aria.test.tsx +45 -0
  184. package/src/MillerColumns/__tests__/MillerColumns.auto-scroll.test.tsx +4 -2
  185. package/src/MillerColumns/__tests__/MillerColumns.basic-rendering.test.tsx +18 -3
  186. package/src/MillerColumns/__tests__/MillerColumns.data-attributes.test.tsx +48 -0
  187. package/src/MillerColumns/__tests__/MillerColumns.keyboard-interaction.test.tsx +35 -2
  188. package/src/MillerColumns/__tests__/MillerColumns.keyboard-selection-state.test.tsx +96 -0
  189. package/src/MillerColumns/__tests__/MillerColumns.preview-panel.test.tsx +29 -4
  190. package/src/MillerColumns/__tests__/MillerColumns.preview-visibility.test.tsx +79 -0
  191. package/src/MillerColumns/__tests__/MillerColumns.resize.test.tsx +189 -0
  192. package/src/MillerColumns/__tests__/MillerColumns.styled-parts.test.tsx +143 -0
  193. package/src/MillerColumns/__tests__/MillerColumns.typeahead.test.tsx +104 -0
  194. package/src/MillerColumns/constants.ts +2 -0
  195. package/src/MillerColumns/hooks/useMillerColumnsColumn.ts +5 -2
  196. package/src/MillerColumns/hooks/useMillerColumnsItem.ts +29 -7
  197. package/src/MillerColumns/hooks/useMillerColumnsResizeHandle.ts +80 -10
  198. package/src/MillerColumns/hooks/useMillerColumnsRoot.ts +0 -0
  199. package/src/MillerColumns/index.ts +4 -0
  200. package/src/MillerColumns/types.ts +136 -30
  201. package/src/MillerColumns/utils.ts +69 -3
  202. package/src/Modal/Modal.tsx +35 -8
  203. package/src/Modal/README.md +24 -15
  204. package/src/Modal/__tests__/Modal.focus-trap.test.tsx +162 -0
  205. package/src/Modal/hooks/useModalContent.ts +32 -0
  206. package/src/Modal/types.ts +110 -29
  207. package/src/NavigationMenu/NavigationMenu.tsx +890 -0
  208. package/src/NavigationMenu/NavigationMenuContext.ts +67 -0
  209. package/src/NavigationMenu/README.md +355 -0
  210. package/src/NavigationMenu/__tests__/NavigationMenu.anchor-positioning.test.tsx +132 -0
  211. package/src/NavigationMenu/__tests__/NavigationMenu.asChild.test.tsx +73 -0
  212. package/src/NavigationMenu/__tests__/NavigationMenu.basic-rendering.test.tsx +92 -0
  213. package/src/NavigationMenu/__tests__/NavigationMenu.contract.test.tsx +45 -0
  214. package/src/NavigationMenu/__tests__/NavigationMenu.controlled-state.test.tsx +134 -0
  215. package/src/NavigationMenu/__tests__/NavigationMenu.error-handling.test.tsx +62 -0
  216. package/src/NavigationMenu/__tests__/NavigationMenu.fixtures.tsx +79 -0
  217. package/src/NavigationMenu/__tests__/NavigationMenu.forceMount.test.tsx +52 -0
  218. package/src/NavigationMenu/__tests__/NavigationMenu.hover-interaction.test.tsx +254 -0
  219. package/src/NavigationMenu/__tests__/NavigationMenu.indicator.test.tsx +252 -0
  220. package/src/NavigationMenu/__tests__/NavigationMenu.keyboard-interaction.test.tsx +294 -0
  221. package/src/NavigationMenu/__tests__/NavigationMenu.keyboard-navigation.test.tsx +126 -0
  222. package/src/NavigationMenu/__tests__/NavigationMenu.link.test.tsx +139 -0
  223. package/src/NavigationMenu/__tests__/NavigationMenu.motion.test.tsx +568 -0
  224. package/src/NavigationMenu/__tests__/NavigationMenu.mouse-interaction.test.tsx +76 -0
  225. package/src/NavigationMenu/__tests__/NavigationMenu.uncontrolled-state.test.tsx +30 -0
  226. package/src/NavigationMenu/__tests__/NavigationMenu.viewport.test.tsx +113 -0
  227. package/src/NavigationMenu/constants.ts +5 -0
  228. package/src/NavigationMenu/hooks/index.ts +7 -0
  229. package/src/NavigationMenu/hooks/useNavigationMenuEntry.ts +33 -0
  230. package/src/NavigationMenu/hooks/useNavigationMenuIndicator.ts +70 -0
  231. package/src/NavigationMenu/hooks/useNavigationMenuLink.ts +72 -0
  232. package/src/NavigationMenu/hooks/useNavigationMenuRoot.ts +301 -0
  233. package/src/NavigationMenu/hooks/useNavigationMenuTopLevelEntry.ts +65 -0
  234. package/src/NavigationMenu/hooks/useNavigationMenuTrigger.ts +158 -0
  235. package/src/NavigationMenu/hooks/useNavigationMenuViewport.ts +101 -0
  236. package/src/NavigationMenu/index.ts +3 -0
  237. package/src/NavigationMenu/types.ts +259 -0
  238. package/src/NavigationMenu/utils.ts +89 -0
  239. package/src/Popover/Popover.tsx +427 -0
  240. package/src/Popover/PopoverContext.ts +13 -0
  241. package/src/Popover/README.md +106 -0
  242. package/src/Popover/__tests__/Popover.anchor.test.tsx +38 -0
  243. package/src/Popover/__tests__/Popover.asChild.test.tsx +160 -0
  244. package/src/Popover/__tests__/Popover.basic-rendering.test.tsx +106 -0
  245. package/src/Popover/__tests__/Popover.click-outside.test.tsx +149 -0
  246. package/src/Popover/__tests__/Popover.close.test.tsx +70 -0
  247. package/src/Popover/__tests__/Popover.content.test.tsx +58 -0
  248. package/src/Popover/__tests__/Popover.controlled-state.test.tsx +45 -0
  249. package/src/Popover/__tests__/Popover.error-handling.test.tsx +51 -0
  250. package/src/Popover/__tests__/Popover.focus.test.tsx +43 -0
  251. package/src/Popover/__tests__/Popover.keyboard-interaction.test.tsx +71 -0
  252. package/src/Popover/__tests__/Popover.mouse-interaction.test.tsx +69 -0
  253. package/src/Popover/__tests__/Popover.uncontrolled-state.test.tsx +44 -0
  254. package/src/Popover/hooks/index.ts +3 -0
  255. package/src/Popover/hooks/usePopoverContent.ts +98 -0
  256. package/src/Popover/hooks/usePopoverRoot.ts +84 -0
  257. package/src/Popover/hooks/usePopoverTrigger.ts +33 -0
  258. package/src/Popover/index.ts +2 -0
  259. package/src/Popover/types.ts +197 -0
  260. package/src/Portal/Portal.tsx +50 -10
  261. package/src/Portal/README.md +2 -2
  262. package/src/Portal/__tests__/Portal.basic-rendering.test.tsx +5 -0
  263. package/src/Portal/types.ts +5 -0
  264. package/src/Progress/Progress.tsx +33 -1
  265. package/src/Progress/README.md +1 -1
  266. package/src/Progress/__tests__/Progress.basic-rendering.test.tsx +10 -0
  267. package/src/Progress/__tests__/Progress.value.test.tsx +21 -0
  268. package/src/Progress/types.ts +20 -4
  269. package/src/Radio/Radio.tsx +10 -2
  270. package/src/Radio/__tests__/Radio.basic-rendering.test.tsx +14 -0
  271. package/src/Radio/hooks/useRadioRoot.ts +3 -0
  272. package/src/Radio/types.ts +20 -0
  273. package/src/RadioCard/RadioCard.tsx +11 -0
  274. package/src/RadioCard/__tests__/RadioCard.basic-rendering.test.tsx +8 -0
  275. package/src/RadioCard/__tests__/RadioCard.disabled-items.test.tsx +27 -0
  276. package/src/RadioCard/__tests__/RadioCard.keyboard-interaction.test.tsx +53 -0
  277. package/src/RadioCard/__tests__/RadioCard.ref-forwarding.test.tsx +54 -0
  278. package/src/RadioCard/__tests__/RadioCard.uncontrolled-state.test.tsx +21 -0
  279. package/src/RadioCard/hooks/useRadioCardRoot.ts +11 -0
  280. package/src/RadioCard/types.ts +95 -22
  281. package/src/RadioGroup/README.md +2 -2
  282. package/src/RadioGroup/RadioGroup.tsx +12 -1
  283. package/src/RadioGroup/__tests__/RadioGroup.basic-rendering.test.tsx +8 -0
  284. package/src/RadioGroup/__tests__/RadioGroup.disabled.test.tsx +27 -0
  285. package/src/RadioGroup/__tests__/RadioGroup.ref-forwarding.test.tsx +29 -0
  286. package/src/RadioGroup/__tests__/RadioGroup.roving-tabindex.test.tsx +31 -0
  287. package/src/RadioGroup/hooks/useRadioGroupRoot.ts +11 -0
  288. package/src/RadioGroup/types.ts +73 -9
  289. package/src/SegmentedControl/README.md +154 -0
  290. package/src/SegmentedControl/SegmentedControl.tsx +309 -0
  291. package/src/SegmentedControl/SegmentedControlContext.ts +28 -0
  292. package/src/SegmentedControl/__tests__/SegmentedControl.asChild.test.tsx +50 -0
  293. package/src/SegmentedControl/__tests__/SegmentedControl.basic-rendering.test.tsx +100 -0
  294. package/src/SegmentedControl/__tests__/SegmentedControl.controlled-state.test.tsx +107 -0
  295. package/src/SegmentedControl/__tests__/SegmentedControl.disabled-keydown-guards.test.tsx +62 -0
  296. package/src/SegmentedControl/__tests__/SegmentedControl.disabled.test.tsx +151 -0
  297. package/src/SegmentedControl/__tests__/SegmentedControl.error-handling.test.tsx +17 -0
  298. package/src/SegmentedControl/__tests__/SegmentedControl.keyboard-interaction.test.tsx +117 -0
  299. package/src/SegmentedControl/__tests__/SegmentedControl.orientation.test.tsx +54 -0
  300. package/src/SegmentedControl/__tests__/SegmentedControl.reading-direction.test.tsx +56 -0
  301. package/src/SegmentedControl/__tests__/SegmentedControl.ref-forwarding.test.tsx +45 -0
  302. package/src/SegmentedControl/__tests__/SegmentedControl.roving-tabindex.test.tsx +104 -0
  303. package/src/SegmentedControl/__tests__/SegmentedControl.uncontrolled-state.test.tsx +94 -0
  304. package/src/SegmentedControl/hooks/index.ts +2 -0
  305. package/src/SegmentedControl/hooks/useSegmentedControlContext.ts +1 -0
  306. package/src/SegmentedControl/hooks/useSegmentedControlRoot.ts +87 -0
  307. package/src/SegmentedControl/index.ts +2 -0
  308. package/src/SegmentedControl/types.ts +138 -0
  309. package/src/Select/README.md +122 -157
  310. package/src/Select/Select.tsx +596 -69
  311. package/src/Select/SelectContext.ts +38 -0
  312. package/src/Select/SelectItemIndicatorContext.ts +29 -0
  313. package/src/Select/__tests__/Select.asChild.test.tsx +2 -2
  314. package/src/Select/__tests__/Select.basic-rendering.test.tsx +22 -3
  315. package/src/Select/__tests__/Select.controlled-state.test.tsx +6 -6
  316. package/src/Select/__tests__/Select.data-attributes.test.tsx +4 -4
  317. package/src/Select/__tests__/Select.field-integration.test.tsx +11 -11
  318. package/src/Select/__tests__/Select.form.test.tsx +38 -0
  319. package/src/Select/__tests__/Select.group.test.tsx +6 -6
  320. package/src/Select/__tests__/Select.keyboard-edge.test.tsx +95 -0
  321. package/src/Select/__tests__/Select.keyboard.test.tsx +124 -0
  322. package/src/Select/__tests__/Select.mutation-hardening.test.tsx +317 -0
  323. package/src/Select/__tests__/Select.native-item.test.tsx +30 -0
  324. package/src/Select/__tests__/Select.open-close.test.tsx +57 -0
  325. package/src/Select/__tests__/Select.placeholder.test.tsx +7 -7
  326. package/src/Select/__tests__/Select.rich-asChild.test.tsx +60 -0
  327. package/src/Select/__tests__/Select.rich-mode.test.tsx +16 -0
  328. package/src/Select/__tests__/Select.selection.test.tsx +104 -0
  329. package/src/Select/__tests__/Select.separator.test.tsx +71 -0
  330. package/src/Select/__tests__/Select.strict-context.test.tsx +36 -0
  331. package/src/Select/__tests__/Select.typeahead.test.tsx +156 -0
  332. package/src/Select/__tests__/Select.value-mirror.test.tsx +240 -0
  333. package/src/Select/constants.ts +8 -0
  334. package/src/Select/hooks/index.ts +2 -0
  335. package/src/Select/hooks/useSelectContent.ts +149 -0
  336. package/src/Select/hooks/useSelectRoot.ts +149 -0
  337. package/src/Select/types.ts +199 -31
  338. package/src/SkipNav/README.md +3 -3
  339. package/src/SkipNav/SkipNav.tsx +72 -32
  340. package/src/SkipNav/__tests__/SkipNav.basic-rendering.test.tsx +6 -0
  341. package/src/SkipNav/types.ts +17 -9
  342. package/src/Slider/README.md +37 -7
  343. package/src/Slider/Slider.tsx +42 -4
  344. package/src/Slider/SliderContext.ts +28 -1
  345. package/src/Slider/types.ts +157 -9
  346. package/src/Slot/Slot.tsx +94 -19
  347. package/src/Slot/__tests__/Slot.test.tsx +112 -2
  348. package/src/Slot/composeEventHandlers.ts +26 -2
  349. package/src/Slot/types.ts +16 -0
  350. package/src/SplitButton/README.md +225 -0
  351. package/src/SplitButton/SplitButton.tsx +457 -0
  352. package/src/SplitButton/SplitButtonContext.ts +26 -0
  353. package/src/SplitButton/__tests__/SplitButton.accessibility.test.tsx +55 -0
  354. package/src/SplitButton/__tests__/SplitButton.asChild.test.tsx +51 -0
  355. package/src/SplitButton/__tests__/SplitButton.basic-rendering.test.tsx +57 -0
  356. package/src/SplitButton/__tests__/SplitButton.data-attributes.test.tsx +28 -0
  357. package/src/SplitButton/__tests__/SplitButton.disabled.test.tsx +79 -0
  358. package/src/SplitButton/__tests__/SplitButton.error-handling.test.tsx +29 -0
  359. package/src/SplitButton/__tests__/SplitButton.keyboard-interaction.test.tsx +56 -0
  360. package/src/SplitButton/__tests__/SplitButton.state-modes.test.tsx +68 -0
  361. package/src/SplitButton/index.ts +2 -0
  362. package/src/SplitButton/types.ts +186 -0
  363. package/src/Status/Status.tsx +36 -15
  364. package/src/Status/__tests__/Status.test.tsx +5 -0
  365. package/src/Status/types.ts +12 -1
  366. package/src/Switch/README.md +1 -1
  367. package/src/Switch/Switch.tsx +17 -4
  368. package/src/Switch/__tests__/Switch.basic-rendering.test.tsx +7 -0
  369. package/src/Switch/hooks/useSwitchRoot.ts +3 -0
  370. package/src/Switch/types.ts +49 -22
  371. package/src/Table/README.md +110 -8
  372. package/src/Table/Table.tsx +246 -16
  373. package/src/Table/TableExpandableContext.ts +7 -0
  374. package/src/Table/__tests__/Table.DetailRow.test.tsx +83 -0
  375. package/src/Table/__tests__/Table.ExpandTrigger.test.tsx +102 -0
  376. package/src/Table/__tests__/Table.Expandable.test.tsx +121 -0
  377. package/src/Table/types.ts +191 -17
  378. package/src/Tabs/README.md +4 -4
  379. package/src/Tabs/Tabs.tsx +13 -4
  380. package/src/Tabs/__tests__/Tabs.activation-mode.test.tsx +58 -0
  381. package/src/Tabs/__tests__/Tabs.basic-rendering.test.tsx +15 -0
  382. package/src/Tabs/__tests__/Tabs.change-event-callbacks.test.tsx +24 -0
  383. package/src/Tabs/__tests__/Tabs.disabled-tabs.test.tsx +36 -0
  384. package/src/Tabs/__tests__/Tabs.lazy-mount.test.tsx +17 -0
  385. package/src/Tabs/hooks/useTabsContent.ts +5 -0
  386. package/src/Tabs/hooks/useTabsRoot.ts +29 -5
  387. package/src/Tabs/hooks/useTabsTrigger.ts +7 -2
  388. package/src/Tabs/types.ts +29 -4
  389. package/src/Textarea/Textarea.tsx +9 -1
  390. package/src/Textarea/__tests__/Textarea.basic-rendering.test.tsx +5 -0
  391. package/src/Textarea/types.ts +20 -3
  392. package/src/Toggle/Toggle.tsx +51 -13
  393. package/src/Toggle/__tests__/Toggle.basic-rendering.test.tsx +5 -0
  394. package/src/Toggle/types.ts +54 -4
  395. package/src/ToggleGroup/README.md +4 -4
  396. package/src/ToggleGroup/ToggleGroup.tsx +14 -1
  397. package/src/ToggleGroup/__tests__/ToggleGroup.asChild.test.tsx +20 -0
  398. package/src/ToggleGroup/__tests__/ToggleGroup.basic-rendering.test.tsx +9 -0
  399. package/src/ToggleGroup/__tests__/ToggleGroup.dynamic-items.test.tsx +70 -0
  400. package/src/ToggleGroup/__tests__/ToggleGroup.error-handling.test.tsx +23 -0
  401. package/src/ToggleGroup/__tests__/ToggleGroup.keyboard-interaction.test.tsx +23 -1
  402. package/src/ToggleGroup/__tests__/ToggleGroup.ref-forwarding.test.tsx +58 -0
  403. package/src/ToggleGroup/hooks/useToggleGroupRoot.ts +21 -1
  404. package/src/ToggleGroup/types.ts +55 -2
  405. package/src/Tooltip/README.md +7 -7
  406. package/src/Tooltip/Tooltip.tsx +100 -22
  407. package/src/Tooltip/__tests__/Tooltip.basic-rendering.test.tsx +50 -0
  408. package/src/Tooltip/__tests__/Tooltip.error-handling.test.tsx +37 -0
  409. package/src/Tooltip/__tests__/Tooltip.escape-hatches.test.tsx +73 -0
  410. package/src/Tooltip/__tests__/Tooltip.keyboard-interaction.test.tsx +134 -0
  411. package/src/Tooltip/__tests__/Tooltip.skip-delay.test.tsx +216 -0
  412. package/src/Tooltip/__tests__/Tooltip.timer-coordination.test.tsx +223 -0
  413. package/src/Tooltip/hooks/__tests__/useTooltipProvider.test.tsx +40 -0
  414. package/src/Tooltip/hooks/useTooltipContent.ts +3 -0
  415. package/src/Tooltip/hooks/useTooltipProvider.ts +46 -8
  416. package/src/Tooltip/hooks/useTooltipRoot.ts +30 -6
  417. package/src/Tooltip/types.ts +89 -8
  418. package/src/Tree/README.md +69 -5
  419. package/src/Tree/Tree.tsx +188 -34
  420. package/src/Tree/__tests__/Tree.styled-wrapper.test.tsx +159 -0
  421. package/src/Tree/hooks/useTreePath.ts +33 -1
  422. package/src/Tree/index.ts +6 -1
  423. package/src/Tree/types.ts +54 -12
  424. package/src/Tree/utils.ts +46 -4
  425. package/src/VisuallyHidden/VisuallyHidden.tsx +33 -8
  426. package/src/VisuallyHidden/__tests__/VisuallyHidden.test.tsx +15 -1
  427. package/src/VisuallyHidden/types.ts +11 -1
  428. package/src/hooks/index.ts +1 -0
  429. package/src/hooks/useTypeahead.ts +95 -0
  430. package/src/index.ts +10 -0
  431. package/src/test/intersectionObserverPolyfill.ts +7 -0
  432. package/src/test/resizeObserverPolyfill.ts +80 -0
  433. package/src/useLocalStorage/__tests__/useLocalStorage.reading.test.tsx +31 -0
  434. package/src/useLocalStorage/__tests__/useLocalStorage.resilience.test.tsx +97 -0
  435. package/src/useLocalStorage/__tests__/useLocalStorage.ssr.test.tsx +20 -0
  436. package/src/useLocalStorage/__tests__/useLocalStorage.writing.test.tsx +72 -0
  437. package/src/useLocalStorage/index.ts +1 -0
  438. package/src/useLocalStorage/useLocalStorage.ts +140 -0
  439. package/src/useMediaQuery/README.md +66 -0
  440. package/src/useMediaQuery/__tests__/useMediaQuery.matching.test.tsx +42 -0
  441. package/src/useMediaQuery/__tests__/useMediaQuery.ssr.test.tsx +19 -0
  442. package/src/useMediaQuery/__tests__/useMediaQuery.subscription.test.tsx +89 -0
  443. package/src/useMediaQuery/index.ts +1 -0
  444. package/src/useMediaQuery/useMediaQuery.ts +49 -0
  445. package/src/usePagination/README.md +170 -0
  446. package/src/usePagination/__tests__/usePagination.navigation.test.tsx +109 -0
  447. package/src/usePagination/__tests__/usePagination.page-count.test.tsx +56 -0
  448. package/src/usePagination/__tests__/usePagination.page-state.test.tsx +87 -0
  449. package/src/usePagination/__tests__/usePagination.range.test.tsx +82 -0
  450. package/src/usePagination/__tests__/usePagination.slice.test.tsx +59 -0
  451. package/src/usePagination/__tests__/usePagination.windowing.test.tsx +68 -0
  452. package/src/usePagination/index.ts +1 -0
  453. package/src/usePagination/usePagination.ts +292 -0
  454. package/src/utils/focusable.ts +15 -0
  455. package/src/utils/getKeyToActionMap.ts +1 -1
  456. package/src/utils/index.ts +1 -0
@@ -67,6 +67,30 @@ import { MENUITEM_SELECTOR, TYPEAHEAD_RESET_MS } from "./constants";
67
67
  * set `"ltr"` or `"rtl"`, which inverts the submenu open / close arrow
68
68
  * keys (`ArrowRight` ↔ `ArrowLeft`). When omitted, the component reads
69
69
  * the inherited {@link DirectionProvider} value, falling back to `"ltr"`.
70
+ *
71
+ * Renders no DOM of its own — no extended host element — it is purely a
72
+ * context provider around its `children`.
73
+ *
74
+ * @example Uncontrolled
75
+ * ```tsx
76
+ * <ContextMenu.Root>
77
+ * <ContextMenu.Trigger>
78
+ * <div className="canvas">Right-click here</div>
79
+ * </ContextMenu.Trigger>
80
+ * <ContextMenu.Content>
81
+ * <ContextMenu.Item onSelect={paste}>Paste</ContextMenu.Item>
82
+ * </ContextMenu.Content>
83
+ * </ContextMenu.Root>
84
+ * ```
85
+ *
86
+ * @example Controlled
87
+ * ```tsx
88
+ * const [open, setOpen] = useState(false);
89
+ *
90
+ * <ContextMenu.Root open={open} onOpenChange={setOpen}>
91
+ * ...
92
+ * </ContextMenu.Root>
93
+ * ```
70
94
  */
71
95
  export function ContextMenuRoot({
72
96
  defaultOpen = false,
@@ -141,6 +165,26 @@ function useCloseSiblingSub() {
141
165
  * right-click, long-press on touch, or the keyboard context-menu key),
142
166
  * the native menu is suppressed and the ContextMenu opens, positioned at
143
167
  * the pointer.
168
+ *
169
+ * A `disabled` Trigger ignores the gesture entirely, letting the native
170
+ * browser menu through. `data-disabled=""` and `data-state="closed"` are
171
+ * exposed for styling.
172
+ *
173
+ * @extends HTMLSpanElement
174
+ *
175
+ * @example Default `<span>` host
176
+ * ```tsx
177
+ * <ContextMenu.Trigger>
178
+ * <div className="canvas">Right-click anywhere</div>
179
+ * </ContextMenu.Trigger>
180
+ * ```
181
+ *
182
+ * @example asChild — attach the gesture to any element
183
+ * ```tsx
184
+ * <ContextMenu.Trigger asChild>
185
+ * <ImageCard src="..." alt="..." />
186
+ * </ContextMenu.Trigger>
187
+ * ```
144
188
  */
145
189
  export function ContextMenuTrigger({
146
190
  children,
@@ -197,6 +241,27 @@ ContextMenuTrigger.displayName = "ContextMenuTrigger";
197
241
  * custom properties so consumer CSS can write `@position-try` fallbacks
198
242
  * that flip the menu to the opposite side when it would overflow the
199
243
  * viewport. Pass `asChild` to render any element with menu semantics.
244
+ *
245
+ * **Focus & keyboard.** On open, focus moves to the first enabled item.
246
+ * `ArrowDown` / `ArrowUp` move between items (wrapping), `Home` / `End`
247
+ * jump to the first / last, `Enter` / `Space` activate the focused item,
248
+ * `Escape` closes and returns focus to the Trigger, and any printable
249
+ * character starts a typeahead search (accumulated within a 500 ms window;
250
+ * repeating a character cycles items sharing that first letter). Disabled
251
+ * items are skipped throughout. `data-state="open" | "closed"` is exposed
252
+ * for state-driven styling.
253
+ *
254
+ * @extends HTMLMenuElement
255
+ *
256
+ * @example
257
+ * ```tsx
258
+ * <ContextMenu.Content>
259
+ * <ContextMenu.Item onSelect={cut}>Cut</ContextMenu.Item>
260
+ * <ContextMenu.Item onSelect={copy}>Copy</ContextMenu.Item>
261
+ * <ContextMenu.Separator />
262
+ * <ContextMenu.Item disabled>Archive</ContextMenu.Item>
263
+ * </ContextMenu.Content>
264
+ * ```
200
265
  */
201
266
  export function ContextMenuContent({
202
267
  children,
@@ -388,7 +453,24 @@ ContextMenuContent.displayName = "ContextMenuContent";
388
453
  * `Event`. The menu auto-closes after selection; call
389
454
  * `event.preventDefault()` inside `onSelect` to keep it open.
390
455
  *
391
- * Disabled items receive `aria-disabled="true"` and no-op on activation.
456
+ * Disabled items receive `aria-disabled="true"` and no-op on activation;
457
+ * arrow navigation and typeahead skip them. `data-highlighted=""` is
458
+ * present while the pointer hovers the item.
459
+ *
460
+ * @extends HTMLLIElement
461
+ *
462
+ * @example
463
+ * ```tsx
464
+ * <ContextMenu.Item onSelect={() => rename()}>Rename</ContextMenu.Item>
465
+ * <ContextMenu.Item disabled>Archive (coming soon)</ContextMenu.Item>
466
+ * ```
467
+ *
468
+ * @example asChild — render a link with menuitem semantics
469
+ * ```tsx
470
+ * <ContextMenu.Item asChild>
471
+ * <a href="/rename">Rename</a>
472
+ * </ContextMenu.Item>
473
+ * ```
392
474
  */
393
475
  export function ContextMenuItem({
394
476
  children,
@@ -441,6 +523,15 @@ ContextMenuItem.displayName = "ContextMenuItem";
441
523
  * A visual separator between groups of items. Renders a `<li role="separator">`
442
524
  * by default. Non-interactive — skipped by focus, arrow navigation, and
443
525
  * typeahead.
526
+ *
527
+ * @extends HTMLLIElement
528
+ *
529
+ * @example
530
+ * ```tsx
531
+ * <ContextMenu.Item>Copy</ContextMenu.Item>
532
+ * <ContextMenu.Separator />
533
+ * <ContextMenu.Item>Delete</ContextMenu.Item>
534
+ * ```
444
535
  */
445
536
  export function ContextMenuSeparator({
446
537
  asChild = false,
@@ -466,6 +557,17 @@ ContextMenuSeparator.displayName = "ContextMenuSeparator";
466
557
  *
467
558
  * Generates a stable id for its accompanying {@link ContextMenuLabel |
468
559
  * `ContextMenu.Label`}, wired automatically via `aria-labelledby`.
560
+ *
561
+ * @extends HTMLLIElement
562
+ *
563
+ * @example
564
+ * ```tsx
565
+ * <ContextMenu.Group>
566
+ * <ContextMenu.Label>Edit</ContextMenu.Label>
567
+ * <ContextMenu.Item>Undo</ContextMenu.Item>
568
+ * <ContextMenu.Item>Redo</ContextMenu.Item>
569
+ * </ContextMenu.Group>
570
+ * ```
469
571
  */
470
572
  export function ContextMenuGroup({
471
573
  children,
@@ -502,6 +604,16 @@ ContextMenuGroup.displayName = "ContextMenuGroup";
502
604
  * a group, the label's `id` is auto-wired to the group's `aria-labelledby` —
503
605
  * consumers don't need to thread ids manually. A caller-supplied `id` takes
504
606
  * precedence over the auto-generated one.
607
+ *
608
+ * @extends HTMLLIElement
609
+ *
610
+ * @example
611
+ * ```tsx
612
+ * <ContextMenu.Group>
613
+ * <ContextMenu.Label>View</ContextMenu.Label>
614
+ * <ContextMenu.CheckboxItem>Show grid</ContextMenu.CheckboxItem>
615
+ * </ContextMenu.Group>
616
+ * ```
505
617
  */
506
618
  export function ContextMenuLabel({
507
619
  id,
@@ -532,7 +644,36 @@ ContextMenuLabel.displayName = "ContextMenuLabel";
532
644
  * {@link ContextMenuCheckboxItemProps.onSelect | `onSelect`} with a
533
645
  * cancellable `Event`. Call `event.preventDefault()` to keep the menu open.
534
646
  *
647
+ * Supports both state modes: uncontrolled via
648
+ * {@link ContextMenuCheckboxItemUncontrolledProps.defaultChecked | `defaultChecked`},
649
+ * or controlled via
650
+ * {@link ContextMenuCheckboxItemControlledProps.checked | `checked`} +
651
+ * {@link ContextMenuCheckboxItemControlledProps.onCheckedChange | `onCheckedChange`}.
652
+ * Render a {@link ContextMenuItemIndicator | `ContextMenu.ItemIndicator`}
653
+ * inside it for the visible mark.
654
+ *
535
655
  * Disabled items receive `aria-disabled="true"` and no-op on activation.
656
+ *
657
+ * @extends HTMLLIElement
658
+ *
659
+ * @example Uncontrolled, with an indicator
660
+ * ```tsx
661
+ * <ContextMenu.CheckboxItem defaultChecked>
662
+ * <ContextMenu.ItemIndicator><CheckIcon /></ContextMenu.ItemIndicator>
663
+ * Show grid
664
+ * </ContextMenu.CheckboxItem>
665
+ * ```
666
+ *
667
+ * @example Controlled, kept open for rapid toggling
668
+ * ```tsx
669
+ * <ContextMenu.CheckboxItem
670
+ * checked={showRuler}
671
+ * onCheckedChange={setShowRuler}
672
+ * onSelect={(event) => event.preventDefault()}
673
+ * >
674
+ * Show ruler
675
+ * </ContextMenu.CheckboxItem>
676
+ * ```
536
677
  */
537
678
  export function ContextMenuCheckboxItem({
538
679
  children,
@@ -612,6 +753,25 @@ ContextMenuCheckboxItem.displayName = "ContextMenuCheckboxItem";
612
753
  * By default the indicator unmounts when its parent is unchecked. Pass
613
754
  * {@link ContextMenuItemIndicatorProps.forceMount | `forceMount`} to keep
614
755
  * the DOM node mounted in both states for animation use cases.
756
+ *
757
+ * @extends HTMLSpanElement
758
+ *
759
+ * @example Compose onto an icon
760
+ * ```tsx
761
+ * <ContextMenu.CheckboxItem checked={bookmarked} onCheckedChange={setBookmarked}>
762
+ * <ContextMenu.ItemIndicator asChild>
763
+ * <CheckIcon aria-hidden />
764
+ * </ContextMenu.ItemIndicator>
765
+ * Bookmark
766
+ * </ContextMenu.CheckboxItem>
767
+ * ```
768
+ *
769
+ * @example forceMount for CSS-driven transitions
770
+ * ```tsx
771
+ * <ContextMenu.ItemIndicator forceMount>
772
+ * <CheckIcon />
773
+ * </ContextMenu.ItemIndicator>
774
+ * ```
615
775
  */
616
776
  export function ContextMenuItemIndicator({
617
777
  children,
@@ -652,6 +812,23 @@ ContextMenuItemIndicator.displayName = "ContextMenuItemIndicator";
652
812
  * A single-selection group of menu items. Children must be
653
813
  * {@link ContextMenuRadioItem | `ContextMenu.RadioItem`} elements. Renders a
654
814
  * `<li role="group">` wrapping `<ul role="none">`.
815
+ *
816
+ * Owns the selected value: uncontrolled via
817
+ * {@link ContextMenuRadioGroupUncontrolledProps.defaultValue | `defaultValue`},
818
+ * or controlled via
819
+ * {@link ContextMenuRadioGroupControlledProps.value | `value`} +
820
+ * {@link ContextMenuRadioGroupControlledProps.onValueChange | `onValueChange`}.
821
+ *
822
+ * @extends HTMLLIElement
823
+ *
824
+ * @example
825
+ * ```tsx
826
+ * <ContextMenu.RadioGroup defaultValue="system">
827
+ * <ContextMenu.RadioItem value="light">Light</ContextMenu.RadioItem>
828
+ * <ContextMenu.RadioItem value="dark">Dark</ContextMenu.RadioItem>
829
+ * <ContextMenu.RadioItem value="system">Match system</ContextMenu.RadioItem>
830
+ * </ContextMenu.RadioGroup>
831
+ * ```
655
832
  */
656
833
  export function ContextMenuRadioGroup({
657
834
  defaultValue,
@@ -696,6 +873,18 @@ ContextMenuRadioGroup.displayName = "ContextMenuRadioGroup";
696
873
  * Activation (click) selects this item, updating the group's value, then fires
697
874
  * {@link ContextMenuRadioItemProps.onSelect | `onSelect`} with a cancellable
698
875
  * `Event`. Call `event.preventDefault()` to keep the menu open.
876
+ *
877
+ * Disabled items receive `aria-disabled="true"` and no-op on activation.
878
+ *
879
+ * @extends HTMLLIElement
880
+ *
881
+ * @example
882
+ * ```tsx
883
+ * <ContextMenu.RadioItem value="dark">
884
+ * <ContextMenu.ItemIndicator><DotIcon /></ContextMenu.ItemIndicator>
885
+ * Dark
886
+ * </ContextMenu.RadioItem>
887
+ * ```
699
888
  */
700
889
  export function ContextMenuRadioItem({
701
890
  children,
@@ -767,6 +956,20 @@ ContextMenuRadioItem.displayName = "ContextMenuRadioItem";
767
956
  * `ContextMenu.Sub` to establish an independent open state for the nested
768
957
  * menu. Supports uncontrolled (`defaultOpen`) and controlled (`open` +
769
958
  * `onOpenChange`) modes.
959
+ *
960
+ * Renders no DOM of its own — no extended host element — it is purely a
961
+ * context boundary around the SubTrigger / SubContent pair.
962
+ *
963
+ * @example
964
+ * ```tsx
965
+ * <ContextMenu.Sub>
966
+ * <ContextMenu.SubTrigger>Share</ContextMenu.SubTrigger>
967
+ * <ContextMenu.SubContent>
968
+ * <ContextMenu.Item>Email</ContextMenu.Item>
969
+ * <ContextMenu.Item>Copy link</ContextMenu.Item>
970
+ * </ContextMenu.SubContent>
971
+ * </ContextMenu.Sub>
972
+ * ```
770
973
  */
771
974
  export function ContextMenuSub({
772
975
  defaultOpen,
@@ -838,7 +1041,18 @@ ContextMenuSub.displayName = "ContextMenuSub";
838
1041
  * Opens the submenu on click, the inline-forward arrow key, or pointer
839
1042
  * hover. The open key follows the resolved reading direction —
840
1043
  * `ArrowRight` in `"ltr"`, `ArrowLeft` in `"rtl"`. Disabled triggers
841
- * ignore both click and the open arrow key.
1044
+ * ignore both click and the open arrow key. `data-highlighted=""` is
1045
+ * present while hovered or while its submenu is open.
1046
+ *
1047
+ * @extends HTMLLIElement
1048
+ *
1049
+ * @example
1050
+ * ```tsx
1051
+ * <ContextMenu.Sub>
1052
+ * <ContextMenu.SubTrigger>More tools</ContextMenu.SubTrigger>
1053
+ * <ContextMenu.SubContent>...</ContextMenu.SubContent>
1054
+ * </ContextMenu.Sub>
1055
+ * ```
842
1056
  */
843
1057
  export function ContextMenuSubTrigger({
844
1058
  children,
@@ -902,6 +1116,20 @@ ContextMenuSubTrigger.displayName = "ContextMenuSubTrigger";
902
1116
  * opens, focus moves to its first enabled item. The inline-backward arrow
903
1117
  * key closes the submenu and returns focus to the SubTrigger —
904
1118
  * `ArrowLeft` in `"ltr"`, `ArrowRight` in `"rtl"`.
1119
+ *
1120
+ * Unlike {@link ContextMenuContent | `ContextMenu.Content`}, the submenu
1121
+ * panel uses `popover="auto"` — it is opened programmatically and nests
1122
+ * inside the already-open manual root popover.
1123
+ *
1124
+ * @extends HTMLMenuElement
1125
+ *
1126
+ * @example
1127
+ * ```tsx
1128
+ * <ContextMenu.SubContent>
1129
+ * <ContextMenu.Item>Email</ContextMenu.Item>
1130
+ * <ContextMenu.Item>Copy link</ContextMenu.Item>
1131
+ * </ContextMenu.SubContent>
1132
+ * ```
905
1133
  */
906
1134
  export function ContextMenuSubContent({
907
1135
  children,
@@ -1001,8 +1229,46 @@ export type TContextMenuCompound = typeof ContextMenuRoot & {
1001
1229
  * by a right-click (or long-press) on its trigger, with submenus, checkbox and
1002
1230
  * radio items, groups, labels and separators. Zero styles ship.
1003
1231
  *
1004
- * The default export is the `Root`; sub-components are attached as static
1005
- * properties (`ContextMenu.Trigger`, `ContextMenu.Content`, …).
1232
+ * `ContextMenu` is both callable (it is an alias of
1233
+ * {@link ContextMenuRoot | `ContextMenu.Root`}) and carries its
1234
+ * sub-components as static properties. Prefer the namespaced form in
1235
+ * application code for readability and grep-ability:
1236
+ *
1237
+ * - {@link ContextMenuRoot | `ContextMenu.Root`} — open-state owner and direction provider (no DOM).
1238
+ * - {@link ContextMenuTrigger | `ContextMenu.Trigger`} — the right-click target (`<span>`).
1239
+ * - {@link ContextMenuContent | `ContextMenu.Content`} — the `role="menu"` popover panel.
1240
+ * - {@link ContextMenuItem | `ContextMenu.Item`} — a `role="menuitem"` row.
1241
+ * - {@link ContextMenuCheckboxItem | `ContextMenu.CheckboxItem`} — a tri-state `role="menuitemcheckbox"`.
1242
+ * - {@link ContextMenuRadioGroup | `ContextMenu.RadioGroup`} — single-selection container.
1243
+ * - {@link ContextMenuRadioItem | `ContextMenu.RadioItem`} — a `role="menuitemradio"` choice.
1244
+ * - {@link ContextMenuItemIndicator | `ContextMenu.ItemIndicator`} — the checked-state mark.
1245
+ * - {@link ContextMenuGroup | `ContextMenu.Group`} — a `role="group"` of related items.
1246
+ * - {@link ContextMenuLabel | `ContextMenu.Label`} — a non-interactive group caption.
1247
+ * - {@link ContextMenuSeparator | `ContextMenu.Separator`} — a `role="separator"` divider.
1248
+ * - {@link ContextMenuSub | `ContextMenu.Sub`} — a submenu boundary (no DOM).
1249
+ * - {@link ContextMenuSubTrigger | `ContextMenu.SubTrigger`} — opens a submenu.
1250
+ * - {@link ContextMenuSubContent | `ContextMenu.SubContent`} — the submenu panel.
1251
+ *
1252
+ * @example Minimal usage
1253
+ * ```tsx
1254
+ * import { ContextMenu } from "@primitiv-ui/react";
1255
+ *
1256
+ * <ContextMenu.Root>
1257
+ * <ContextMenu.Trigger>
1258
+ * <div className="canvas">Right-click anywhere</div>
1259
+ * </ContextMenu.Trigger>
1260
+ * <ContextMenu.Content>
1261
+ * <ContextMenu.Item onSelect={paste}>Paste</ContextMenu.Item>
1262
+ * <ContextMenu.Separator />
1263
+ * <ContextMenu.Item disabled>Archive</ContextMenu.Item>
1264
+ * </ContextMenu.Content>
1265
+ * </ContextMenu.Root>
1266
+ * ```
1267
+ *
1268
+ * @see {@link ContextMenuRoot} for state modes and reading direction.
1269
+ * @see {@link ContextMenuContent} for the popover, positioning, and keyboard model.
1270
+ * @see {@link ContextMenuCheckboxItem} and {@link ContextMenuRadioGroup} for stateful items.
1271
+ * @see {@link ContextMenuSub} for submenus.
1006
1272
  */
1007
1273
  const ContextMenuCompound: TContextMenuCompound = Object.assign(
1008
1274
  ContextMenuRoot,
@@ -60,7 +60,7 @@ canvas, a list row, an image, etc.).
60
60
 
61
61
  ```tsx
62
62
  <ContextMenu.Trigger asChild>
63
- <ImageCard src="…" alt="…" />
63
+ <ImageCard src="..." alt="..." />
64
64
  </ContextMenu.Trigger>
65
65
  ```
66
66