@primitiv-ui/react 0.1.37 → 0.1.39

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 (1495) hide show
  1. package/README.md +24 -2
  2. package/dist/AccessibleIcon/AccessibleIcon.d.ts +51 -0
  3. package/dist/AccessibleIcon/AccessibleIcon.js +55 -0
  4. package/dist/AccessibleIcon/index.d.ts +2 -0
  5. package/dist/AccessibleIcon/index.js +2 -0
  6. package/dist/AccessibleIcon/types.d.ts +24 -0
  7. package/dist/AccessibleIcon/types.js +1 -0
  8. package/dist/Accordion/Accordion.d.ts +287 -0
  9. package/dist/Accordion/Accordion.js +330 -0
  10. package/dist/Accordion/AccordionContext.d.ts +3 -0
  11. package/dist/Accordion/AccordionContext.js +4 -0
  12. package/dist/Accordion/hooks/index.d.ts +6 -0
  13. package/dist/Accordion/hooks/index.js +6 -0
  14. package/dist/Accordion/hooks/useAccordionContext.d.ts +1 -0
  15. package/dist/Accordion/hooks/useAccordionContext.js +1 -0
  16. package/dist/Accordion/hooks/useAccordionHeaderContext.d.ts +1 -0
  17. package/dist/Accordion/hooks/useAccordionHeaderContext.js +10 -0
  18. package/dist/Accordion/hooks/useAccordionItem.d.ts +8 -0
  19. package/dist/Accordion/hooks/useAccordionItem.js +15 -0
  20. package/dist/Accordion/hooks/useAccordionItemContext.d.ts +1 -0
  21. package/dist/Accordion/hooks/useAccordionItemContext.js +1 -0
  22. package/dist/Accordion/hooks/useAccordionRoot.d.ts +16 -0
  23. package/dist/Accordion/hooks/useAccordionRoot.js +133 -0
  24. package/dist/Accordion/hooks/useAccordionTrigger.d.ts +298 -0
  25. package/dist/Accordion/hooks/useAccordionTrigger.js +73 -0
  26. package/dist/Accordion/index.d.ts +2 -0
  27. package/dist/Accordion/index.js +2 -0
  28. package/dist/Accordion/types.d.ts +152 -0
  29. package/dist/Accordion/types.js +1 -0
  30. package/dist/Alert/Alert.d.ts +64 -0
  31. package/dist/Alert/Alert.js +70 -0
  32. package/dist/Alert/index.d.ts +2 -0
  33. package/dist/Alert/index.js +2 -0
  34. package/dist/Alert/types.d.ts +21 -0
  35. package/dist/Alert/types.js +1 -0
  36. package/dist/Avatar/Avatar.d.ts +144 -0
  37. package/dist/Avatar/Avatar.js +187 -0
  38. package/dist/Avatar/AvatarContext.d.ts +16 -0
  39. package/dist/Avatar/AvatarContext.js +7 -0
  40. package/dist/Avatar/hooks/index.d.ts +2 -0
  41. package/dist/Avatar/hooks/index.js +2 -0
  42. package/dist/Avatar/hooks/useAvatarContext.d.ts +1 -0
  43. package/dist/Avatar/hooks/useAvatarContext.js +1 -0
  44. package/dist/Avatar/hooks/useAvatarImage.d.ts +21 -0
  45. package/dist/Avatar/hooks/useAvatarImage.js +47 -0
  46. package/dist/Avatar/index.d.ts +3 -0
  47. package/dist/Avatar/index.js +3 -0
  48. package/dist/Avatar/types.d.ts +52 -0
  49. package/dist/Avatar/types.js +1 -0
  50. package/dist/Breadcrumb/Breadcrumb.d.ts +280 -0
  51. package/dist/Breadcrumb/Breadcrumb.js +299 -0
  52. package/dist/Breadcrumb/index.d.ts +2 -0
  53. package/dist/Breadcrumb/index.js +2 -0
  54. package/dist/Breadcrumb/types.d.ts +81 -0
  55. package/dist/Breadcrumb/types.js +1 -0
  56. package/dist/Button/Button.d.ts +73 -0
  57. package/dist/Button/Button.js +84 -0
  58. package/dist/Button/index.d.ts +2 -0
  59. package/dist/Button/index.js +2 -0
  60. package/dist/Button/types.d.ts +32 -0
  61. package/dist/Button/types.js +1 -0
  62. package/dist/Carousel/Carousel.d.ts +498 -0
  63. package/dist/Carousel/Carousel.js +660 -0
  64. package/dist/Carousel/CarouselContext.d.ts +7 -0
  65. package/dist/Carousel/CarouselContext.js +8 -0
  66. package/dist/Carousel/hooks/index.d.ts +5 -0
  67. package/dist/Carousel/hooks/index.js +5 -0
  68. package/dist/Carousel/hooks/useCarouselContext.d.ts +1 -0
  69. package/dist/Carousel/hooks/useCarouselContext.js +10 -0
  70. package/dist/Carousel/hooks/useCarouselLoop.d.ts +39 -0
  71. package/dist/Carousel/hooks/useCarouselLoop.js +735 -0
  72. package/dist/Carousel/hooks/useCarouselRoot.d.ts +97 -0
  73. package/dist/Carousel/hooks/useCarouselRoot.js +545 -0
  74. package/dist/Carousel/hooks/useCarouselSlide.d.ts +24 -0
  75. package/dist/Carousel/hooks/useCarouselSlide.js +62 -0
  76. package/dist/Carousel/hooks/useCarouselViewport.d.ts +46 -0
  77. package/dist/Carousel/hooks/useCarouselViewport.js +786 -0
  78. package/dist/Carousel/index.d.ts +3 -0
  79. package/dist/Carousel/index.js +3 -0
  80. package/dist/Carousel/loopEngine.d.ts +26 -0
  81. package/dist/Carousel/loopEngine.js +48 -0
  82. package/dist/Carousel/types.d.ts +783 -0
  83. package/dist/Carousel/types.js +1 -0
  84. package/dist/Checkbox/Checkbox.d.ts +120 -0
  85. package/dist/Checkbox/Checkbox.js +155 -0
  86. package/dist/Checkbox/CheckboxContext.d.ts +13 -0
  87. package/dist/Checkbox/CheckboxContext.js +3 -0
  88. package/dist/Checkbox/hooks/index.d.ts +3 -0
  89. package/dist/Checkbox/hooks/index.js +3 -0
  90. package/dist/Checkbox/hooks/useCheckboxContext.d.ts +1 -0
  91. package/dist/Checkbox/hooks/useCheckboxContext.js +1 -0
  92. package/dist/Checkbox/hooks/useCheckboxInput.d.ts +33 -0
  93. package/dist/Checkbox/hooks/useCheckboxInput.js +37 -0
  94. package/dist/Checkbox/hooks/useCheckboxRoot.d.ts +11 -0
  95. package/dist/Checkbox/hooks/useCheckboxRoot.js +14 -0
  96. package/dist/Checkbox/index.d.ts +2 -0
  97. package/dist/Checkbox/index.js +2 -0
  98. package/dist/Checkbox/types.d.ts +74 -0
  99. package/dist/Checkbox/types.js +1 -0
  100. package/dist/CheckboxCard/CheckboxCard.d.ts +132 -0
  101. package/dist/CheckboxCard/CheckboxCard.js +175 -0
  102. package/dist/CheckboxCard/CheckboxCardContext.d.ts +15 -0
  103. package/dist/CheckboxCard/CheckboxCardContext.js +10 -0
  104. package/dist/CheckboxCard/hooks/index.d.ts +2 -0
  105. package/dist/CheckboxCard/hooks/index.js +2 -0
  106. package/dist/CheckboxCard/hooks/useCheckboxCardContext.d.ts +1 -0
  107. package/dist/CheckboxCard/hooks/useCheckboxCardContext.js +1 -0
  108. package/dist/CheckboxCard/hooks/useCheckboxCardRoot.d.ts +11 -0
  109. package/dist/CheckboxCard/hooks/useCheckboxCardRoot.js +12 -0
  110. package/dist/CheckboxCard/index.d.ts +3 -0
  111. package/dist/CheckboxCard/index.js +3 -0
  112. package/dist/CheckboxCard/types.d.ts +87 -0
  113. package/dist/CheckboxCard/types.js +1 -0
  114. package/dist/Collapsible/Collapsible.d.ts +243 -0
  115. package/dist/Collapsible/Collapsible.js +275 -0
  116. package/dist/Collapsible/CollapsibleContext.d.ts +2 -0
  117. package/dist/Collapsible/CollapsibleContext.js +3 -0
  118. package/dist/Collapsible/hooks/index.d.ts +2 -0
  119. package/dist/Collapsible/hooks/index.js +2 -0
  120. package/dist/Collapsible/hooks/useCollapsibleRoot.d.ts +9 -0
  121. package/dist/Collapsible/hooks/useCollapsibleRoot.js +18 -0
  122. package/dist/Collapsible/hooks/useCollapsibleTrigger.d.ts +299 -0
  123. package/dist/Collapsible/hooks/useCollapsibleTrigger.js +39 -0
  124. package/dist/Collapsible/index.d.ts +2 -0
  125. package/dist/Collapsible/index.js +2 -0
  126. package/dist/Collapsible/types.d.ts +134 -0
  127. package/dist/Collapsible/types.js +1 -0
  128. package/dist/Combobox/Combobox.d.ts +149 -0
  129. package/dist/Combobox/Combobox.js +355 -0
  130. package/dist/Combobox/ComboboxContext.d.ts +10 -0
  131. package/dist/Combobox/ComboboxContext.js +13 -0
  132. package/dist/Combobox/hooks/index.d.ts +1 -0
  133. package/dist/Combobox/hooks/index.js +1 -0
  134. package/dist/Combobox/hooks/useComboboxRoot.d.ts +1 -0
  135. package/dist/Combobox/hooks/useComboboxRoot.js +1 -0
  136. package/dist/Combobox/index.d.ts +3 -0
  137. package/dist/Combobox/index.js +3 -0
  138. package/dist/Combobox/types.d.ts +126 -0
  139. package/dist/Combobox/types.js +1 -0
  140. package/dist/ContextMenu/ContextMenu.d.ts +508 -0
  141. package/dist/ContextMenu/ContextMenu.js +1005 -0
  142. package/dist/ContextMenu/ContextMenuContentContext.d.ts +12 -0
  143. package/dist/ContextMenu/ContextMenuContentContext.js +3 -0
  144. package/dist/ContextMenu/ContextMenuContext.d.ts +16 -0
  145. package/dist/ContextMenu/ContextMenuContext.js +3 -0
  146. package/dist/ContextMenu/ContextMenuGroupContext.d.ts +4 -0
  147. package/dist/ContextMenu/ContextMenuGroupContext.js +3 -0
  148. package/dist/ContextMenu/ContextMenuItemIndicatorContext.d.ts +4 -0
  149. package/dist/ContextMenu/ContextMenuItemIndicatorContext.js +3 -0
  150. package/dist/ContextMenu/ContextMenuRadioGroupContext.d.ts +5 -0
  151. package/dist/ContextMenu/ContextMenuRadioGroupContext.js +3 -0
  152. package/dist/ContextMenu/ContextMenuSubContext.d.ts +8 -0
  153. package/dist/ContextMenu/ContextMenuSubContext.js +3 -0
  154. package/dist/ContextMenu/constants.d.ts +2 -0
  155. package/dist/ContextMenu/constants.js +3 -0
  156. package/dist/ContextMenu/index.d.ts +2 -0
  157. package/dist/ContextMenu/index.js +2 -0
  158. package/dist/ContextMenu/types.d.ts +424 -0
  159. package/dist/ContextMenu/types.js +1 -0
  160. package/dist/DirectionProvider/DirectionContext.d.ts +15 -0
  161. package/dist/DirectionProvider/DirectionContext.js +18 -0
  162. package/dist/DirectionProvider/DirectionProvider.d.ts +57 -0
  163. package/dist/DirectionProvider/DirectionProvider.js +59 -0
  164. package/dist/DirectionProvider/index.d.ts +3 -0
  165. package/dist/DirectionProvider/index.js +2 -0
  166. package/dist/DirectionProvider/types.d.ts +34 -0
  167. package/dist/DirectionProvider/types.js +1 -0
  168. package/dist/Divider/Divider.d.ts +59 -0
  169. package/dist/Divider/Divider.js +60 -0
  170. package/dist/Divider/index.d.ts +2 -0
  171. package/dist/Divider/index.js +2 -0
  172. package/dist/Divider/types.d.ts +16 -0
  173. package/dist/Divider/types.js +1 -0
  174. package/dist/Drawer/Drawer.d.ts +268 -0
  175. package/dist/Drawer/Drawer.js +271 -0
  176. package/dist/Drawer/index.d.ts +2 -0
  177. package/dist/Drawer/index.js +2 -0
  178. package/dist/Drawer/types.d.ts +45 -0
  179. package/dist/Drawer/types.js +1 -0
  180. package/dist/Dropdown/Dropdown.d.ts +476 -0
  181. package/dist/Dropdown/Dropdown.js +745 -0
  182. package/dist/Dropdown/DropdownContentContext.d.ts +12 -0
  183. package/dist/Dropdown/DropdownContentContext.js +3 -0
  184. package/dist/Dropdown/DropdownContext.d.ts +10 -0
  185. package/dist/Dropdown/DropdownContext.js +3 -0
  186. package/dist/Dropdown/DropdownGroupContext.d.ts +4 -0
  187. package/dist/Dropdown/DropdownGroupContext.js +3 -0
  188. package/dist/Dropdown/DropdownItemIndicatorContext.d.ts +9 -0
  189. package/dist/Dropdown/DropdownItemIndicatorContext.js +3 -0
  190. package/dist/Dropdown/DropdownRadioGroupContext.d.ts +5 -0
  191. package/dist/Dropdown/DropdownRadioGroupContext.js +3 -0
  192. package/dist/Dropdown/DropdownSubContext.d.ts +8 -0
  193. package/dist/Dropdown/DropdownSubContext.js +3 -0
  194. package/dist/Dropdown/constants.d.ts +2 -0
  195. package/dist/Dropdown/constants.js +3 -0
  196. package/dist/Dropdown/hooks/index.d.ts +9 -0
  197. package/dist/Dropdown/hooks/index.js +9 -0
  198. package/dist/Dropdown/hooks/useCloseSiblingSub.d.ts +7 -0
  199. package/dist/Dropdown/hooks/useCloseSiblingSub.js +13 -0
  200. package/dist/Dropdown/hooks/useDropdownContent.d.ts +296 -0
  201. package/dist/Dropdown/hooks/useDropdownContent.js +149 -0
  202. package/dist/Dropdown/hooks/useDropdownContext.d.ts +1 -0
  203. package/dist/Dropdown/hooks/useDropdownContext.js +1 -0
  204. package/dist/Dropdown/hooks/useDropdownGroup.d.ts +294 -0
  205. package/dist/Dropdown/hooks/useDropdownGroup.js +12 -0
  206. package/dist/Dropdown/hooks/useDropdownItem.d.ts +13 -0
  207. package/dist/Dropdown/hooks/useDropdownItem.js +34 -0
  208. package/dist/Dropdown/hooks/useDropdownLabel.d.ts +292 -0
  209. package/dist/Dropdown/hooks/useDropdownLabel.js +8 -0
  210. package/dist/Dropdown/hooks/useDropdownRoot.d.ts +19 -0
  211. package/dist/Dropdown/hooks/useDropdownRoot.js +25 -0
  212. package/dist/Dropdown/hooks/useDropdownSubContext.d.ts +1 -0
  213. package/dist/Dropdown/hooks/useDropdownSubContext.js +1 -0
  214. package/dist/Dropdown/hooks/useDropdownTrigger.d.ts +302 -0
  215. package/dist/Dropdown/hooks/useDropdownTrigger.js +18 -0
  216. package/dist/Dropdown/index.d.ts +2 -0
  217. package/dist/Dropdown/index.js +2 -0
  218. package/dist/Dropdown/types.d.ts +496 -0
  219. package/dist/Dropdown/types.js +1 -0
  220. package/dist/EmptyState/EmptyState.d.ts +246 -0
  221. package/dist/EmptyState/EmptyState.js +268 -0
  222. package/dist/EmptyState/index.d.ts +2 -0
  223. package/dist/EmptyState/index.js +2 -0
  224. package/dist/EmptyState/types.d.ts +59 -0
  225. package/dist/EmptyState/types.js +1 -0
  226. package/dist/Field/Field.d.ts +178 -0
  227. package/dist/Field/Field.js +211 -0
  228. package/dist/Field/FieldContext.d.ts +15 -0
  229. package/dist/Field/FieldContext.js +3 -0
  230. package/dist/Field/hooks/index.d.ts +2 -0
  231. package/dist/Field/hooks/index.js +2 -0
  232. package/dist/Field/hooks/useFieldContext.d.ts +1 -0
  233. package/dist/Field/hooks/useFieldContext.js +1 -0
  234. package/dist/Field/hooks/useFieldProps.d.ts +25 -0
  235. package/dist/Field/hooks/useFieldProps.js +39 -0
  236. package/dist/Field/index.d.ts +2 -0
  237. package/dist/Field/index.js +2 -0
  238. package/dist/Field/types.d.ts +81 -0
  239. package/dist/Field/types.js +1 -0
  240. package/dist/Fieldset/Fieldset.d.ts +124 -0
  241. package/dist/Fieldset/Fieldset.js +124 -0
  242. package/dist/Fieldset/index.d.ts +2 -0
  243. package/dist/Fieldset/index.js +2 -0
  244. package/dist/Fieldset/types.d.ts +23 -0
  245. package/dist/Fieldset/types.js +1 -0
  246. package/dist/Input/Input.d.ts +104 -0
  247. package/dist/Input/Input.js +116 -0
  248. package/dist/Input/index.d.ts +2 -0
  249. package/dist/Input/index.js +2 -0
  250. package/dist/Input/types.d.ts +27 -0
  251. package/dist/Input/types.js +1 -0
  252. package/dist/InputGroup/InputGroup.d.ts +176 -0
  253. package/dist/InputGroup/InputGroup.js +205 -0
  254. package/dist/InputGroup/index.d.ts +2 -0
  255. package/dist/InputGroup/index.js +2 -0
  256. package/dist/InputGroup/types.d.ts +41 -0
  257. package/dist/InputGroup/types.js +1 -0
  258. package/dist/Listbox/Listbox.d.ts +231 -0
  259. package/dist/Listbox/Listbox.js +339 -0
  260. package/dist/Listbox/ListboxContext.d.ts +19 -0
  261. package/dist/Listbox/ListboxContext.js +25 -0
  262. package/dist/Listbox/constants.d.ts +2 -0
  263. package/dist/Listbox/constants.js +3 -0
  264. package/dist/Listbox/hooks/index.d.ts +1 -0
  265. package/dist/Listbox/hooks/index.js +1 -0
  266. package/dist/Listbox/hooks/useListboxRoot.d.ts +39 -0
  267. package/dist/Listbox/hooks/useListboxRoot.js +299 -0
  268. package/dist/Listbox/index.d.ts +3 -0
  269. package/dist/Listbox/index.js +3 -0
  270. package/dist/Listbox/types.d.ts +214 -0
  271. package/dist/Listbox/types.js +1 -0
  272. package/dist/MillerColumns/MillerColumns.d.ts +309 -0
  273. package/dist/MillerColumns/MillerColumns.js +332 -0
  274. package/dist/MillerColumns/MillerColumnsContext.d.ts +4 -0
  275. package/dist/MillerColumns/MillerColumnsContext.js +5 -0
  276. package/dist/MillerColumns/constants.d.ts +2 -0
  277. package/dist/MillerColumns/constants.js +3 -0
  278. package/dist/MillerColumns/hooks/index.d.ts +7 -0
  279. package/dist/MillerColumns/hooks/index.js +7 -0
  280. package/dist/MillerColumns/hooks/useMillerColumnsColumn.d.ts +8 -0
  281. package/dist/MillerColumns/hooks/useMillerColumnsColumn.js +16 -0
  282. package/dist/MillerColumns/hooks/useMillerColumnsColumnContext.d.ts +1 -0
  283. package/dist/MillerColumns/hooks/useMillerColumnsColumnContext.js +1 -0
  284. package/dist/MillerColumns/hooks/useMillerColumnsContext.d.ts +1 -0
  285. package/dist/MillerColumns/hooks/useMillerColumnsContext.js +1 -0
  286. package/dist/MillerColumns/hooks/useMillerColumnsItem.d.ts +295 -0
  287. package/dist/MillerColumns/hooks/useMillerColumnsItem.js +122 -0
  288. package/dist/MillerColumns/hooks/useMillerColumnsItemContext.d.ts +1 -0
  289. package/dist/MillerColumns/hooks/useMillerColumnsItemContext.js +1 -0
  290. package/dist/MillerColumns/hooks/useMillerColumnsResizeHandle.d.ts +290 -0
  291. package/dist/MillerColumns/hooks/useMillerColumnsResizeHandle.js +105 -0
  292. package/dist/MillerColumns/hooks/useMillerColumnsRoot.d.ts +9 -0
  293. package/dist/MillerColumns/hooks/useMillerColumnsRoot.js +0 -0
  294. package/dist/MillerColumns/index.d.ts +4 -0
  295. package/dist/MillerColumns/index.js +4 -0
  296. package/dist/MillerColumns/types.d.ts +224 -0
  297. package/dist/MillerColumns/types.js +1 -0
  298. package/dist/MillerColumns/useMillerColumnsSelection.d.ts +21 -0
  299. package/dist/MillerColumns/useMillerColumnsSelection.js +28 -0
  300. package/dist/MillerColumns/utils.d.ts +62 -0
  301. package/dist/MillerColumns/utils.js +102 -0
  302. package/dist/Modal/Modal.d.ts +331 -0
  303. package/dist/Modal/Modal.js +386 -0
  304. package/dist/Modal/ModalContext.d.ts +9 -0
  305. package/dist/Modal/ModalContext.js +10 -0
  306. package/dist/Modal/hooks/index.d.ts +4 -0
  307. package/dist/Modal/hooks/index.js +4 -0
  308. package/dist/Modal/hooks/useModalContent.d.ts +5 -0
  309. package/dist/Modal/hooks/useModalContent.js +94 -0
  310. package/dist/Modal/hooks/useModalContext.d.ts +1 -0
  311. package/dist/Modal/hooks/useModalContext.js +1 -0
  312. package/dist/Modal/hooks/useModalRoot.d.ts +11 -0
  313. package/dist/Modal/hooks/useModalRoot.js +39 -0
  314. package/dist/Modal/hooks/useModalTrigger.d.ts +297 -0
  315. package/dist/Modal/hooks/useModalTrigger.js +18 -0
  316. package/dist/Modal/index.d.ts +3 -0
  317. package/dist/Modal/index.js +3 -0
  318. package/dist/Modal/types.d.ts +186 -0
  319. package/dist/Modal/types.js +1 -0
  320. package/dist/NavigationMenu/NavigationMenu.d.ts +495 -0
  321. package/dist/NavigationMenu/NavigationMenu.js +645 -0
  322. package/dist/NavigationMenu/NavigationMenuContext.d.ts +31 -0
  323. package/dist/NavigationMenu/NavigationMenuContext.js +34 -0
  324. package/dist/NavigationMenu/constants.d.ts +4 -0
  325. package/dist/NavigationMenu/constants.js +5 -0
  326. package/dist/NavigationMenu/hooks/index.d.ts +7 -0
  327. package/dist/NavigationMenu/hooks/index.js +7 -0
  328. package/dist/NavigationMenu/hooks/useNavigationMenuEntry.d.ts +13 -0
  329. package/dist/NavigationMenu/hooks/useNavigationMenuEntry.js +21 -0
  330. package/dist/NavigationMenu/hooks/useNavigationMenuIndicator.d.ts +16 -0
  331. package/dist/NavigationMenu/hooks/useNavigationMenuIndicator.js +53 -0
  332. package/dist/NavigationMenu/hooks/useNavigationMenuLink.d.ts +8 -0
  333. package/dist/NavigationMenu/hooks/useNavigationMenuLink.js +37 -0
  334. package/dist/NavigationMenu/hooks/useNavigationMenuRoot.d.ts +26 -0
  335. package/dist/NavigationMenu/hooks/useNavigationMenuRoot.js +202 -0
  336. package/dist/NavigationMenu/hooks/useNavigationMenuTopLevelEntry.d.ts +21 -0
  337. package/dist/NavigationMenu/hooks/useNavigationMenuTopLevelEntry.js +54 -0
  338. package/dist/NavigationMenu/hooks/useNavigationMenuTrigger.d.ts +16 -0
  339. package/dist/NavigationMenu/hooks/useNavigationMenuTrigger.js +100 -0
  340. package/dist/NavigationMenu/hooks/useNavigationMenuViewport.d.ts +21 -0
  341. package/dist/NavigationMenu/hooks/useNavigationMenuViewport.js +85 -0
  342. package/dist/NavigationMenu/index.d.ts +3 -0
  343. package/dist/NavigationMenu/index.js +3 -0
  344. package/dist/NavigationMenu/types.d.ts +236 -0
  345. package/dist/NavigationMenu/types.js +1 -0
  346. package/dist/NavigationMenu/utils.d.ts +37 -0
  347. package/dist/NavigationMenu/utils.js +64 -0
  348. package/dist/Popover/Popover.d.ts +239 -0
  349. package/dist/Popover/Popover.js +293 -0
  350. package/dist/Popover/PopoverContext.d.ts +4 -0
  351. package/dist/Popover/PopoverContext.js +5 -0
  352. package/dist/Popover/hooks/index.d.ts +3 -0
  353. package/dist/Popover/hooks/index.js +3 -0
  354. package/dist/Popover/hooks/usePopoverContent.d.ts +19 -0
  355. package/dist/Popover/hooks/usePopoverContent.js +83 -0
  356. package/dist/Popover/hooks/usePopoverRoot.d.ts +10 -0
  357. package/dist/Popover/hooks/usePopoverRoot.js +49 -0
  358. package/dist/Popover/hooks/usePopoverTrigger.d.ts +297 -0
  359. package/dist/Popover/hooks/usePopoverTrigger.js +19 -0
  360. package/dist/Popover/index.d.ts +2 -0
  361. package/dist/Popover/index.js +2 -0
  362. package/dist/Popover/types.d.ts +183 -0
  363. package/dist/Popover/types.js +1 -0
  364. package/dist/Portal/Portal.d.ts +70 -0
  365. package/dist/Portal/Portal.js +92 -0
  366. package/dist/Portal/index.d.ts +2 -0
  367. package/dist/Portal/index.js +2 -0
  368. package/dist/Portal/types.d.ts +14 -0
  369. package/dist/Portal/types.js +1 -0
  370. package/dist/Progress/Progress.d.ts +126 -0
  371. package/dist/Progress/Progress.js +172 -0
  372. package/dist/Progress/ProgressContext.d.ts +16 -0
  373. package/dist/Progress/ProgressContext.js +7 -0
  374. package/dist/Progress/hooks/index.d.ts +2 -0
  375. package/dist/Progress/hooks/index.js +2 -0
  376. package/dist/Progress/hooks/useProgressContext.d.ts +1 -0
  377. package/dist/Progress/hooks/useProgressContext.js +1 -0
  378. package/dist/Progress/hooks/useProgressRoot.d.ts +17 -0
  379. package/dist/Progress/hooks/useProgressRoot.js +22 -0
  380. package/dist/Progress/index.d.ts +3 -0
  381. package/dist/Progress/index.js +3 -0
  382. package/dist/Progress/types.d.ts +53 -0
  383. package/dist/Progress/types.js +1 -0
  384. package/dist/Radio/Radio.d.ts +128 -0
  385. package/dist/Radio/Radio.js +153 -0
  386. package/dist/Radio/RadioContext.d.ts +13 -0
  387. package/dist/Radio/RadioContext.js +3 -0
  388. package/dist/Radio/hooks/index.d.ts +2 -0
  389. package/dist/Radio/hooks/index.js +2 -0
  390. package/dist/Radio/hooks/useRadioContext.d.ts +1 -0
  391. package/dist/Radio/hooks/useRadioContext.js +1 -0
  392. package/dist/Radio/hooks/useRadioRoot.d.ts +32 -0
  393. package/dist/Radio/hooks/useRadioRoot.js +35 -0
  394. package/dist/Radio/index.d.ts +2 -0
  395. package/dist/Radio/index.js +2 -0
  396. package/dist/Radio/types.d.ts +79 -0
  397. package/dist/Radio/types.js +1 -0
  398. package/dist/RadioCard/RadioCard.d.ts +176 -0
  399. package/dist/RadioCard/RadioCard.js +264 -0
  400. package/dist/RadioCard/RadioCardContext.d.ts +21 -0
  401. package/dist/RadioCard/RadioCardContext.js +9 -0
  402. package/dist/RadioCard/RadioCardItemContext.d.ts +14 -0
  403. package/dist/RadioCard/RadioCardItemContext.js +10 -0
  404. package/dist/RadioCard/hooks/index.d.ts +3 -0
  405. package/dist/RadioCard/hooks/index.js +3 -0
  406. package/dist/RadioCard/hooks/useRadioCardContext.d.ts +1 -0
  407. package/dist/RadioCard/hooks/useRadioCardContext.js +1 -0
  408. package/dist/RadioCard/hooks/useRadioCardItemContext.d.ts +1 -0
  409. package/dist/RadioCard/hooks/useRadioCardItemContext.js +1 -0
  410. package/dist/RadioCard/hooks/useRadioCardRoot.d.ts +14 -0
  411. package/dist/RadioCard/hooks/useRadioCardRoot.js +42 -0
  412. package/dist/RadioCard/index.d.ts +4 -0
  413. package/dist/RadioCard/index.js +4 -0
  414. package/dist/RadioCard/types.d.ts +129 -0
  415. package/dist/RadioCard/types.js +1 -0
  416. package/dist/RadioGroup/RadioGroup.d.ts +192 -0
  417. package/dist/RadioGroup/RadioGroup.js +281 -0
  418. package/dist/RadioGroup/RadioGroupContext.d.ts +12 -0
  419. package/dist/RadioGroup/RadioGroupContext.js +3 -0
  420. package/dist/RadioGroup/RadioGroupItemContext.d.ts +4 -0
  421. package/dist/RadioGroup/RadioGroupItemContext.js +3 -0
  422. package/dist/RadioGroup/hooks/index.d.ts +3 -0
  423. package/dist/RadioGroup/hooks/index.js +3 -0
  424. package/dist/RadioGroup/hooks/useRadioGroupContext.d.ts +1 -0
  425. package/dist/RadioGroup/hooks/useRadioGroupContext.js +1 -0
  426. package/dist/RadioGroup/hooks/useRadioGroupItemContext.d.ts +1 -0
  427. package/dist/RadioGroup/hooks/useRadioGroupItemContext.js +1 -0
  428. package/dist/RadioGroup/hooks/useRadioGroupRoot.d.ts +14 -0
  429. package/dist/RadioGroup/hooks/useRadioGroupRoot.js +53 -0
  430. package/dist/RadioGroup/index.d.ts +2 -0
  431. package/dist/RadioGroup/index.js +2 -0
  432. package/dist/RadioGroup/types.d.ts +130 -0
  433. package/dist/RadioGroup/types.js +1 -0
  434. package/dist/SegmentedControl/SegmentedControl.d.ts +145 -0
  435. package/dist/SegmentedControl/SegmentedControl.js +229 -0
  436. package/dist/SegmentedControl/SegmentedControlContext.d.ts +14 -0
  437. package/dist/SegmentedControl/SegmentedControlContext.js +3 -0
  438. package/dist/SegmentedControl/hooks/index.d.ts +2 -0
  439. package/dist/SegmentedControl/hooks/index.js +2 -0
  440. package/dist/SegmentedControl/hooks/useSegmentedControlContext.d.ts +1 -0
  441. package/dist/SegmentedControl/hooks/useSegmentedControlContext.js +1 -0
  442. package/dist/SegmentedControl/hooks/useSegmentedControlRoot.d.ts +14 -0
  443. package/dist/SegmentedControl/hooks/useSegmentedControlRoot.js +45 -0
  444. package/dist/SegmentedControl/index.d.ts +2 -0
  445. package/dist/SegmentedControl/index.js +2 -0
  446. package/dist/SegmentedControl/types.d.ts +121 -0
  447. package/dist/SegmentedControl/types.js +1 -0
  448. package/dist/Select/Select.d.ts +390 -0
  449. package/dist/Select/Select.js +561 -0
  450. package/dist/Select/SelectContext.d.ts +31 -0
  451. package/dist/Select/SelectContext.js +3 -0
  452. package/dist/Select/SelectItemIndicatorContext.d.ts +23 -0
  453. package/dist/Select/SelectItemIndicatorContext.js +3 -0
  454. package/dist/Select/constants.d.ts +6 -0
  455. package/dist/Select/constants.js +7 -0
  456. package/dist/Select/hooks/index.d.ts +2 -0
  457. package/dist/Select/hooks/index.js +2 -0
  458. package/dist/Select/hooks/useSelectContent.d.ts +301 -0
  459. package/dist/Select/hooks/useSelectContent.js +134 -0
  460. package/dist/Select/hooks/useSelectRoot.d.ts +23 -0
  461. package/dist/Select/hooks/useSelectRoot.js +90 -0
  462. package/dist/Select/index.d.ts +2 -0
  463. package/dist/Select/index.js +2 -0
  464. package/dist/Select/types.d.ts +246 -0
  465. package/dist/Select/types.js +1 -0
  466. package/dist/SkipNav/SkipNav.d.ts +137 -0
  467. package/dist/SkipNav/SkipNav.js +138 -0
  468. package/dist/SkipNav/index.d.ts +1 -0
  469. package/dist/SkipNav/index.js +1 -0
  470. package/dist/SkipNav/types.d.ts +32 -0
  471. package/dist/SkipNav/types.js +1 -0
  472. package/dist/Slider/Slider.d.ts +189 -0
  473. package/dist/Slider/Slider.js +253 -0
  474. package/dist/Slider/SliderContext.d.ts +48 -0
  475. package/dist/Slider/SliderContext.js +7 -0
  476. package/dist/Slider/hooks/index.d.ts +3 -0
  477. package/dist/Slider/hooks/index.js +3 -0
  478. package/dist/Slider/hooks/useSliderContext.d.ts +1 -0
  479. package/dist/Slider/hooks/useSliderContext.js +1 -0
  480. package/dist/Slider/hooks/useSliderRoot.d.ts +23 -0
  481. package/dist/Slider/hooks/useSliderRoot.js +123 -0
  482. package/dist/Slider/hooks/useSliderThumb.d.ts +11 -0
  483. package/dist/Slider/hooks/useSliderThumb.js +57 -0
  484. package/dist/Slider/index.d.ts +3 -0
  485. package/dist/Slider/index.js +3 -0
  486. package/dist/Slider/types.d.ts +194 -0
  487. package/dist/Slider/types.js +1 -0
  488. package/dist/Slider/utils.d.ts +48 -0
  489. package/dist/Slider/utils.js +105 -0
  490. package/dist/Slot/Slot.d.ts +126 -0
  491. package/dist/Slot/Slot.js +210 -0
  492. package/dist/Slot/composeEventHandlers.d.ts +50 -0
  493. package/dist/Slot/composeEventHandlers.js +57 -0
  494. package/dist/Slot/index.d.ts +3 -0
  495. package/dist/Slot/index.js +3 -0
  496. package/dist/Slot/types.d.ts +20 -0
  497. package/dist/Slot/types.js +1 -0
  498. package/dist/SplitButton/SplitButton.d.ts +286 -0
  499. package/dist/SplitButton/SplitButton.js +343 -0
  500. package/dist/SplitButton/SplitButtonContext.d.ts +11 -0
  501. package/dist/SplitButton/SplitButtonContext.js +12 -0
  502. package/dist/SplitButton/index.d.ts +2 -0
  503. package/dist/SplitButton/index.js +1 -0
  504. package/dist/SplitButton/types.d.ts +161 -0
  505. package/dist/SplitButton/types.js +1 -0
  506. package/dist/Status/Status.d.ts +57 -0
  507. package/dist/Status/Status.js +63 -0
  508. package/dist/Status/index.d.ts +2 -0
  509. package/dist/Status/index.js +2 -0
  510. package/dist/Status/types.d.ts +19 -0
  511. package/dist/Status/types.js +1 -0
  512. package/dist/Switch/Switch.d.ts +122 -0
  513. package/dist/Switch/Switch.js +143 -0
  514. package/dist/Switch/SwitchContext.d.ts +12 -0
  515. package/dist/Switch/SwitchContext.js +7 -0
  516. package/dist/Switch/hooks/index.d.ts +2 -0
  517. package/dist/Switch/hooks/index.js +2 -0
  518. package/dist/Switch/hooks/useSwitchContext.d.ts +1 -0
  519. package/dist/Switch/hooks/useSwitchContext.js +1 -0
  520. package/dist/Switch/hooks/useSwitchRoot.d.ts +30 -0
  521. package/dist/Switch/hooks/useSwitchRoot.js +33 -0
  522. package/dist/Switch/index.d.ts +3 -0
  523. package/dist/Switch/index.js +3 -0
  524. package/dist/Switch/types.d.ts +83 -0
  525. package/dist/Switch/types.js +1 -0
  526. package/dist/Table/Table.d.ts +443 -0
  527. package/dist/Table/Table.js +494 -0
  528. package/dist/Table/TableExpandableContext.d.ts +2 -0
  529. package/dist/Table/TableExpandableContext.js +3 -0
  530. package/dist/Table/index.d.ts +2 -0
  531. package/dist/Table/index.js +2 -0
  532. package/dist/Table/types.d.ts +214 -0
  533. package/dist/Table/types.js +1 -0
  534. package/dist/Tabs/Tabs.d.ts +270 -0
  535. package/dist/Tabs/Tabs.js +324 -0
  536. package/dist/Tabs/TabsContext.d.ts +11 -0
  537. package/dist/Tabs/TabsContext.js +12 -0
  538. package/dist/Tabs/hooks/index.d.ts +4 -0
  539. package/dist/Tabs/hooks/index.js +4 -0
  540. package/dist/Tabs/hooks/useTabsContent.d.ts +10 -0
  541. package/dist/Tabs/hooks/useTabsContent.js +27 -0
  542. package/dist/Tabs/hooks/useTabsContext.d.ts +1 -0
  543. package/dist/Tabs/hooks/useTabsContext.js +1 -0
  544. package/dist/Tabs/hooks/useTabsRoot.d.ts +21 -0
  545. package/dist/Tabs/hooks/useTabsRoot.js +97 -0
  546. package/dist/Tabs/hooks/useTabsTrigger.d.ts +13 -0
  547. package/dist/Tabs/hooks/useTabsTrigger.js +83 -0
  548. package/dist/Tabs/index.d.ts +3 -0
  549. package/dist/Tabs/index.js +3 -0
  550. package/dist/Tabs/types.d.ts +139 -0
  551. package/dist/Tabs/types.js +1 -0
  552. package/dist/Tabs/utils.d.ts +4 -0
  553. package/dist/Tabs/utils.js +8 -0
  554. package/dist/Textarea/Textarea.d.ts +81 -0
  555. package/dist/Textarea/Textarea.js +93 -0
  556. package/dist/Textarea/index.d.ts +2 -0
  557. package/dist/Textarea/index.js +2 -0
  558. package/dist/Textarea/types.d.ts +27 -0
  559. package/dist/Textarea/types.js +1 -0
  560. package/dist/Toggle/Toggle.d.ts +82 -0
  561. package/dist/Toggle/Toggle.js +102 -0
  562. package/dist/Toggle/index.d.ts +2 -0
  563. package/dist/Toggle/index.js +2 -0
  564. package/dist/Toggle/types.d.ts +72 -0
  565. package/dist/Toggle/types.js +1 -0
  566. package/dist/ToggleGroup/ToggleGroup.d.ts +144 -0
  567. package/dist/ToggleGroup/ToggleGroup.js +227 -0
  568. package/dist/ToggleGroup/ToggleGroupContext.d.ts +2 -0
  569. package/dist/ToggleGroup/ToggleGroupContext.js +3 -0
  570. package/dist/ToggleGroup/hooks/index.d.ts +2 -0
  571. package/dist/ToggleGroup/hooks/index.js +2 -0
  572. package/dist/ToggleGroup/hooks/useToggleGroupContext.d.ts +1 -0
  573. package/dist/ToggleGroup/hooks/useToggleGroupContext.js +1 -0
  574. package/dist/ToggleGroup/hooks/useToggleGroupRoot.d.ts +21 -0
  575. package/dist/ToggleGroup/hooks/useToggleGroupRoot.js +79 -0
  576. package/dist/ToggleGroup/index.d.ts +2 -0
  577. package/dist/ToggleGroup/index.js +2 -0
  578. package/dist/ToggleGroup/types.d.ts +141 -0
  579. package/dist/ToggleGroup/types.js +1 -0
  580. package/dist/Tooltip/Tooltip.d.ts +231 -0
  581. package/dist/Tooltip/Tooltip.js +279 -0
  582. package/dist/Tooltip/TooltipContext.d.ts +6 -0
  583. package/dist/Tooltip/TooltipContext.js +7 -0
  584. package/dist/Tooltip/hooks/index.d.ts +4 -0
  585. package/dist/Tooltip/hooks/index.js +4 -0
  586. package/dist/Tooltip/hooks/useTooltipContent.d.ts +289 -0
  587. package/dist/Tooltip/hooks/useTooltipContent.js +50 -0
  588. package/dist/Tooltip/hooks/useTooltipProvider.d.ts +9 -0
  589. package/dist/Tooltip/hooks/useTooltipProvider.js +60 -0
  590. package/dist/Tooltip/hooks/useTooltipRoot.d.ts +6 -0
  591. package/dist/Tooltip/hooks/useTooltipRoot.js +100 -0
  592. package/dist/Tooltip/hooks/useTooltipTrigger.d.ts +299 -0
  593. package/dist/Tooltip/hooks/useTooltipTrigger.js +22 -0
  594. package/dist/Tooltip/index.d.ts +2 -0
  595. package/dist/Tooltip/index.js +2 -0
  596. package/dist/Tooltip/types.d.ts +183 -0
  597. package/dist/Tooltip/types.js +1 -0
  598. package/dist/Tree/Tree.d.ts +398 -0
  599. package/dist/Tree/Tree.js +536 -0
  600. package/dist/Tree/TreeContext.d.ts +4 -0
  601. package/dist/Tree/TreeContext.js +5 -0
  602. package/dist/Tree/hooks/index.d.ts +3 -0
  603. package/dist/Tree/hooks/index.js +3 -0
  604. package/dist/Tree/hooks/useTreeItemKeyboard.d.ts +16 -0
  605. package/dist/Tree/hooks/useTreeItemKeyboard.js +71 -0
  606. package/dist/Tree/hooks/useTreePath.d.ts +88 -0
  607. package/dist/Tree/hooks/useTreePath.js +96 -0
  608. package/dist/Tree/hooks/useTreeRoot.d.ts +19 -0
  609. package/dist/Tree/hooks/useTreeRoot.js +185 -0
  610. package/dist/Tree/index.d.ts +4 -0
  611. package/dist/Tree/index.js +4 -0
  612. package/dist/Tree/types.d.ts +269 -0
  613. package/dist/Tree/types.js +1 -0
  614. package/dist/Tree/utils.d.ts +45 -0
  615. package/dist/Tree/utils.js +79 -0
  616. package/dist/VisuallyHidden/VisuallyHidden.d.ts +62 -0
  617. package/dist/VisuallyHidden/VisuallyHidden.js +83 -0
  618. package/dist/VisuallyHidden/index.d.ts +2 -0
  619. package/dist/VisuallyHidden/index.js +2 -0
  620. package/dist/VisuallyHidden/types.d.ts +18 -0
  621. package/dist/VisuallyHidden/types.js +1 -0
  622. package/dist/hooks/index.d.ts +4 -0
  623. package/dist/hooks/index.js +4 -0
  624. package/dist/hooks/useCollection.d.ts +50 -0
  625. package/dist/hooks/useCollection.js +47 -0
  626. package/dist/hooks/useControllableState.d.ts +50 -0
  627. package/dist/hooks/useControllableState.js +14 -0
  628. package/dist/hooks/useRovingTabindex.d.ts +106 -0
  629. package/dist/hooks/useRovingTabindex.js +110 -0
  630. package/dist/hooks/useTypeahead.d.ts +31 -0
  631. package/dist/hooks/useTypeahead.js +65 -0
  632. package/dist/index.d.ts +52 -0
  633. package/dist/index.js +50 -0
  634. package/dist/types.d.ts +6 -0
  635. package/dist/types.js +1 -0
  636. package/dist/useLocalStorage/index.d.ts +1 -0
  637. package/dist/useLocalStorage/index.js +1 -0
  638. package/dist/useLocalStorage/useLocalStorage.d.ts +46 -0
  639. package/dist/useLocalStorage/useLocalStorage.js +125 -0
  640. package/dist/useMediaQuery/index.d.ts +1 -0
  641. package/dist/useMediaQuery/index.js +1 -0
  642. package/dist/useMediaQuery/useMediaQuery.d.ts +30 -0
  643. package/dist/useMediaQuery/useMediaQuery.js +43 -0
  644. package/dist/usePagination/index.d.ts +1 -0
  645. package/dist/usePagination/index.js +1 -0
  646. package/dist/usePagination/usePagination.d.ts +163 -0
  647. package/dist/usePagination/usePagination.js +130 -0
  648. package/dist/utils/createStrictContext.d.ts +33 -0
  649. package/dist/utils/createStrictContext.js +47 -0
  650. package/dist/utils/deriveId.d.ts +25 -0
  651. package/dist/utils/deriveId.js +28 -0
  652. package/dist/utils/focusable.d.ts +8 -0
  653. package/dist/utils/focusable.js +16 -0
  654. package/dist/utils/getKeyToActionMap.d.ts +64 -0
  655. package/dist/utils/getKeyToActionMap.js +49 -0
  656. package/dist/utils/index.d.ts +4 -0
  657. package/dist/utils/index.js +4 -0
  658. package/package.json +7 -6
  659. package/src/AccessibleIcon/AccessibleIcon.tsx +0 -67
  660. package/src/AccessibleIcon/README.md +0 -42
  661. package/src/AccessibleIcon/__tests__/AccessibleIcon.test.tsx +0 -52
  662. package/src/AccessibleIcon/index.ts +0 -2
  663. package/src/AccessibleIcon/types.ts +0 -25
  664. package/src/Accordion/Accordion.tsx +0 -455
  665. package/src/Accordion/AccordionContext.ts +0 -12
  666. package/src/Accordion/README.md +0 -202
  667. package/src/Accordion/__tests__/Accordion.asChild.test.tsx +0 -283
  668. package/src/Accordion/__tests__/Accordion.basic-rendering.test.tsx +0 -348
  669. package/src/Accordion/__tests__/Accordion.controlled-state.test.tsx +0 -175
  670. package/src/Accordion/__tests__/Accordion.data-attributes.test.tsx +0 -272
  671. package/src/Accordion/__tests__/Accordion.disabled-items.test.tsx +0 -353
  672. package/src/Accordion/__tests__/Accordion.error-handling.test.tsx +0 -152
  673. package/src/Accordion/__tests__/Accordion.forceMount.test.tsx +0 -119
  674. package/src/Accordion/__tests__/Accordion.keyboard-interaction.test.tsx +0 -736
  675. package/src/Accordion/__tests__/Accordion.mouse-interaction.test.tsx +0 -212
  676. package/src/Accordion/__tests__/Accordion.multiple-mode.test.tsx +0 -90
  677. package/src/Accordion/__tests__/Accordion.reading-direction.test.tsx +0 -139
  678. package/src/Accordion/__tests__/Accordion.uncontrolled-state.test.tsx +0 -154
  679. package/src/Accordion/hooks/index.ts +0 -6
  680. package/src/Accordion/hooks/useAccordionContext.ts +0 -1
  681. package/src/Accordion/hooks/useAccordionHeaderContext.ts +0 -10
  682. package/src/Accordion/hooks/useAccordionItem.ts +0 -22
  683. package/src/Accordion/hooks/useAccordionItemContext.ts +0 -1
  684. package/src/Accordion/hooks/useAccordionRoot.ts +0 -188
  685. package/src/Accordion/hooks/useAccordionTrigger.ts +0 -98
  686. package/src/Accordion/index.ts +0 -2
  687. package/src/Accordion/types.ts +0 -174
  688. package/src/Alert/Alert.tsx +0 -79
  689. package/src/Alert/README.md +0 -54
  690. package/src/Alert/__tests__/Alert.test.tsx +0 -33
  691. package/src/Alert/index.ts +0 -2
  692. package/src/Alert/types.ts +0 -22
  693. package/src/Avatar/Avatar.tsx +0 -246
  694. package/src/Avatar/AvatarContext.ts +0 -26
  695. package/src/Avatar/README.md +0 -116
  696. package/src/Avatar/__tests__/Avatar.asChild.test.tsx +0 -53
  697. package/src/Avatar/__tests__/Avatar.basic-rendering.test.tsx +0 -24
  698. package/src/Avatar/__tests__/Avatar.error-handling.test.tsx +0 -30
  699. package/src/Avatar/__tests__/Avatar.fallback.test.tsx +0 -105
  700. package/src/Avatar/__tests__/Avatar.image-loading.test.tsx +0 -116
  701. package/src/Avatar/hooks/index.ts +0 -2
  702. package/src/Avatar/hooks/useAvatarContext.ts +0 -1
  703. package/src/Avatar/hooks/useAvatarImage.ts +0 -56
  704. package/src/Avatar/index.ts +0 -3
  705. package/src/Avatar/types.ts +0 -56
  706. package/src/Breadcrumb/Breadcrumb.tsx +0 -374
  707. package/src/Breadcrumb/README.md +0 -158
  708. package/src/Breadcrumb/__tests__/Breadcrumb.asChild.test.tsx +0 -33
  709. package/src/Breadcrumb/__tests__/Breadcrumb.basic-rendering.test.tsx +0 -143
  710. package/src/Breadcrumb/__tests__/Breadcrumb.ellipsis.test.tsx +0 -110
  711. package/src/Breadcrumb/index.ts +0 -2
  712. package/src/Breadcrumb/types.ts +0 -88
  713. package/src/Button/Button.tsx +0 -100
  714. package/src/Button/README.md +0 -112
  715. package/src/Button/__tests__/Button.asChild.test.tsx +0 -91
  716. package/src/Button/__tests__/Button.basic-rendering.test.tsx +0 -132
  717. package/src/Button/__tests__/Button.contract.test.tsx +0 -72
  718. package/src/Button/__tests__/Button.disabled.test.tsx +0 -52
  719. package/src/Button/__tests__/Button.icon-usage.test.tsx +0 -57
  720. package/src/Button/__tests__/Button.keyboard-interaction.test.tsx +0 -70
  721. package/src/Button/index.ts +0 -2
  722. package/src/Button/types.ts +0 -33
  723. package/src/Carousel/Carousel.tsx +0 -972
  724. package/src/Carousel/CarouselContext.ts +0 -15
  725. package/src/Carousel/README.md +0 -1447
  726. package/src/Carousel/__tests__/Carousel.asChild.test.tsx +0 -178
  727. package/src/Carousel/__tests__/Carousel.auto-play.test.tsx +0 -617
  728. package/src/Carousel/__tests__/Carousel.autoplay-status.test.tsx +0 -239
  729. package/src/Carousel/__tests__/Carousel.basic-rendering.test.tsx +0 -569
  730. package/src/Carousel/__tests__/Carousel.controlled-state.test.tsx +0 -137
  731. package/src/Carousel/__tests__/Carousel.drag-status.test.tsx +0 -292
  732. package/src/Carousel/__tests__/Carousel.dynamic-slides.test.tsx +0 -38
  733. package/src/Carousel/__tests__/Carousel.error-handling.test.tsx +0 -81
  734. package/src/Carousel/__tests__/Carousel.ids.test.tsx +0 -111
  735. package/src/Carousel/__tests__/Carousel.imperative-api.test.tsx +0 -213
  736. package/src/Carousel/__tests__/Carousel.indicators.test.tsx +0 -661
  737. package/src/Carousel/__tests__/Carousel.infinite.test.tsx +0 -1453
  738. package/src/Carousel/__tests__/Carousel.instant-scroll.test.tsx +0 -124
  739. package/src/Carousel/__tests__/Carousel.intersection-observer.test.tsx +0 -364
  740. package/src/Carousel/__tests__/Carousel.keyboard-navigation.test.tsx +0 -158
  741. package/src/Carousel/__tests__/Carousel.loop.test.tsx +0 -163
  742. package/src/Carousel/__tests__/Carousel.loopEngine.test.ts +0 -77
  743. package/src/Carousel/__tests__/Carousel.mouse-drag.test.tsx +0 -504
  744. package/src/Carousel/__tests__/Carousel.multi-slide-bounds.test.tsx +0 -91
  745. package/src/Carousel/__tests__/Carousel.orientation.test.tsx +0 -207
  746. package/src/Carousel/__tests__/Carousel.overscroll.test.tsx +0 -532
  747. package/src/Carousel/__tests__/Carousel.page-snap-points.test.tsx +0 -50
  748. package/src/Carousel/__tests__/Carousel.play-pause.test.tsx +0 -232
  749. package/src/Carousel/__tests__/Carousel.prev-next.test.tsx +0 -68
  750. package/src/Carousel/__tests__/Carousel.progress-text.test.tsx +0 -76
  751. package/src/Carousel/__tests__/Carousel.reduced-motion.test.tsx +0 -46
  752. package/src/Carousel/__tests__/Carousel.refresh-progress.test.tsx +0 -84
  753. package/src/Carousel/__tests__/Carousel.scroll-margin.test.tsx +0 -167
  754. package/src/Carousel/__tests__/Carousel.scroll-progress.test.tsx +0 -518
  755. package/src/Carousel/__tests__/Carousel.scroll-snap-change.test.tsx +0 -200
  756. package/src/Carousel/__tests__/Carousel.scroll-sync.test.tsx +0 -322
  757. package/src/Carousel/__tests__/Carousel.scroll-to-index.test.tsx +0 -115
  758. package/src/Carousel/__tests__/Carousel.slide-snap.test.tsx +0 -172
  759. package/src/Carousel/__tests__/Carousel.slides-per-move.test.tsx +0 -329
  760. package/src/Carousel/__tests__/Carousel.slides-per-page.test.tsx +0 -267
  761. package/src/Carousel/__tests__/Carousel.snap-type.test.tsx +0 -35
  762. package/src/Carousel/__tests__/Carousel.ssr.test.tsx +0 -28
  763. package/src/Carousel/__tests__/Carousel.touch-interaction.test.tsx +0 -96
  764. package/src/Carousel/__tests__/Carousel.transition-modes.test.tsx +0 -95
  765. package/src/Carousel/__tests__/Carousel.translations.test.tsx +0 -180
  766. package/src/Carousel/__tests__/Carousel.uncontrolled-state.test.tsx +0 -146
  767. package/src/Carousel/__tests__/Carousel.wheel.test.tsx +0 -160
  768. package/src/Carousel/hooks/index.ts +0 -5
  769. package/src/Carousel/hooks/useCarouselContext.ts +0 -13
  770. package/src/Carousel/hooks/useCarouselLoop.ts +0 -869
  771. package/src/Carousel/hooks/useCarouselRoot.ts +0 -746
  772. package/src/Carousel/hooks/useCarouselSlide.ts +0 -80
  773. package/src/Carousel/hooks/useCarouselViewport.ts +0 -898
  774. package/src/Carousel/index.ts +0 -3
  775. package/src/Carousel/loopEngine.ts +0 -54
  776. package/src/Carousel/types.ts +0 -830
  777. package/src/Checkbox/Checkbox.tsx +0 -217
  778. package/src/Checkbox/CheckboxContext.ts +0 -20
  779. package/src/Checkbox/README.md +0 -137
  780. package/src/Checkbox/__tests__/Checkbox.basic-rendering.test.tsx +0 -93
  781. package/src/Checkbox/__tests__/Checkbox.contract.test.tsx +0 -106
  782. package/src/Checkbox/__tests__/Checkbox.controlled-state.test.tsx +0 -74
  783. package/src/Checkbox/__tests__/Checkbox.disabled.test.tsx +0 -45
  784. package/src/Checkbox/__tests__/Checkbox.form.test.tsx +0 -53
  785. package/src/Checkbox/__tests__/Checkbox.indeterminate.test.tsx +0 -76
  786. package/src/Checkbox/__tests__/Checkbox.indicator.test.tsx +0 -92
  787. package/src/Checkbox/__tests__/Checkbox.uncontrolled-state.test.tsx +0 -105
  788. package/src/Checkbox/hooks/index.ts +0 -3
  789. package/src/Checkbox/hooks/useCheckboxContext.ts +0 -1
  790. package/src/Checkbox/hooks/useCheckboxInput.ts +0 -53
  791. package/src/Checkbox/hooks/useCheckboxRoot.ts +0 -32
  792. package/src/Checkbox/index.ts +0 -2
  793. package/src/Checkbox/types.ts +0 -86
  794. package/src/CheckboxCard/CheckboxCard.tsx +0 -219
  795. package/src/CheckboxCard/CheckboxCardContext.ts +0 -25
  796. package/src/CheckboxCard/README.md +0 -114
  797. package/src/CheckboxCard/__tests__/CheckboxCard.asChild.test.tsx +0 -54
  798. package/src/CheckboxCard/__tests__/CheckboxCard.basic-rendering.test.tsx +0 -65
  799. package/src/CheckboxCard/__tests__/CheckboxCard.controlled-state.test.tsx +0 -77
  800. package/src/CheckboxCard/__tests__/CheckboxCard.disabled.test.tsx +0 -55
  801. package/src/CheckboxCard/__tests__/CheckboxCard.error-handling.test.tsx +0 -20
  802. package/src/CheckboxCard/__tests__/CheckboxCard.indeterminate.test.tsx +0 -60
  803. package/src/CheckboxCard/__tests__/CheckboxCard.indicator.test.tsx +0 -136
  804. package/src/CheckboxCard/__tests__/CheckboxCard.uncontrolled-state.test.tsx +0 -73
  805. package/src/CheckboxCard/hooks/index.ts +0 -2
  806. package/src/CheckboxCard/hooks/useCheckboxCardContext.ts +0 -1
  807. package/src/CheckboxCard/hooks/useCheckboxCardRoot.ts +0 -30
  808. package/src/CheckboxCard/index.ts +0 -3
  809. package/src/CheckboxCard/types.ts +0 -97
  810. package/src/Collapsible/Collapsible.tsx +0 -378
  811. package/src/Collapsible/CollapsibleContext.ts +0 -7
  812. package/src/Collapsible/README.md +0 -214
  813. package/src/Collapsible/__tests__/Collapsible.asChild.test.tsx +0 -329
  814. package/src/Collapsible/__tests__/Collapsible.basic-rendering.test.tsx +0 -145
  815. package/src/Collapsible/__tests__/Collapsible.collapsedHeight.test.tsx +0 -140
  816. package/src/Collapsible/__tests__/Collapsible.controlled-state.test.tsx +0 -134
  817. package/src/Collapsible/__tests__/Collapsible.disabled.test.tsx +0 -132
  818. package/src/Collapsible/__tests__/Collapsible.error-handling.test.tsx +0 -40
  819. package/src/Collapsible/__tests__/Collapsible.forceMount.test.tsx +0 -111
  820. package/src/Collapsible/__tests__/Collapsible.triggerIcon.test.tsx +0 -93
  821. package/src/Collapsible/__tests__/Collapsible.uncontrolled-state.test.tsx +0 -125
  822. package/src/Collapsible/hooks/index.ts +0 -2
  823. package/src/Collapsible/hooks/useCollapsibleRoot.ts +0 -34
  824. package/src/Collapsible/hooks/useCollapsibleTrigger.ts +0 -51
  825. package/src/Collapsible/index.ts +0 -2
  826. package/src/Collapsible/types.ts +0 -148
  827. package/src/Combobox/Combobox.tsx +0 -508
  828. package/src/Combobox/ComboboxContext.ts +0 -23
  829. package/src/Combobox/README.md +0 -170
  830. package/src/Combobox/__tests__/Combobox.asChild.test.tsx +0 -62
  831. package/src/Combobox/__tests__/Combobox.basic-rendering.test.tsx +0 -16
  832. package/src/Combobox/__tests__/Combobox.content.test.tsx +0 -36
  833. package/src/Combobox/__tests__/Combobox.controlled-state.test.tsx +0 -88
  834. package/src/Combobox/__tests__/Combobox.empty.test.tsx +0 -42
  835. package/src/Combobox/__tests__/Combobox.ids.test.tsx +0 -66
  836. package/src/Combobox/__tests__/Combobox.item.test.tsx +0 -76
  837. package/src/Combobox/__tests__/Combobox.keyboard-interaction.test.tsx +0 -196
  838. package/src/Combobox/__tests__/Combobox.light-dismiss.test.tsx +0 -101
  839. package/src/Combobox/__tests__/Combobox.query.test.tsx +0 -105
  840. package/src/Combobox/hooks/index.ts +0 -1
  841. package/src/Combobox/hooks/useComboboxRoot.ts +0 -2
  842. package/src/Combobox/index.ts +0 -3
  843. package/src/Combobox/types.ts +0 -133
  844. package/src/ContextMenu/ContextMenu.tsx +0 -1296
  845. package/src/ContextMenu/ContextMenuContentContext.ts +0 -15
  846. package/src/ContextMenu/ContextMenuContext.ts +0 -21
  847. package/src/ContextMenu/ContextMenuGroupContext.ts +0 -8
  848. package/src/ContextMenu/ContextMenuItemIndicatorContext.ts +0 -8
  849. package/src/ContextMenu/ContextMenuRadioGroupContext.ts +0 -9
  850. package/src/ContextMenu/ContextMenuSubContext.ts +0 -15
  851. package/src/ContextMenu/README.md +0 -275
  852. package/src/ContextMenu/__tests__/ContextMenu.asChild.test.tsx +0 -186
  853. package/src/ContextMenu/__tests__/ContextMenu.basic-rendering.test.tsx +0 -39
  854. package/src/ContextMenu/__tests__/ContextMenu.checkbox-item.test.tsx +0 -168
  855. package/src/ContextMenu/__tests__/ContextMenu.error-handling.test.tsx +0 -113
  856. package/src/ContextMenu/__tests__/ContextMenu.group-label.test.tsx +0 -48
  857. package/src/ContextMenu/__tests__/ContextMenu.item-indicator.test.tsx +0 -88
  858. package/src/ContextMenu/__tests__/ContextMenu.item.test.tsx +0 -106
  859. package/src/ContextMenu/__tests__/ContextMenu.keyboard-interaction.test.tsx +0 -227
  860. package/src/ContextMenu/__tests__/ContextMenu.mouse-interaction.test.tsx +0 -268
  861. package/src/ContextMenu/__tests__/ContextMenu.radio-item.test.tsx +0 -152
  862. package/src/ContextMenu/__tests__/ContextMenu.reading-direction.test.tsx +0 -152
  863. package/src/ContextMenu/__tests__/ContextMenu.separator.test.tsx +0 -47
  864. package/src/ContextMenu/__tests__/ContextMenu.state-modes.test.tsx +0 -119
  865. package/src/ContextMenu/__tests__/ContextMenu.sub.test.tsx +0 -407
  866. package/src/ContextMenu/__tests__/ContextMenu.typeahead.test.tsx +0 -134
  867. package/src/ContextMenu/constants.ts +0 -4
  868. package/src/ContextMenu/index.ts +0 -2
  869. package/src/ContextMenu/types.ts +0 -484
  870. package/src/DirectionProvider/DirectionContext.ts +0 -21
  871. package/src/DirectionProvider/DirectionProvider.tsx +0 -69
  872. package/src/DirectionProvider/README.md +0 -62
  873. package/src/DirectionProvider/__tests__/DirectionProvider.test.tsx +0 -34
  874. package/src/DirectionProvider/index.ts +0 -3
  875. package/src/DirectionProvider/types.ts +0 -36
  876. package/src/Divider/Divider.tsx +0 -74
  877. package/src/Divider/README.md +0 -57
  878. package/src/Divider/__tests__/Divider.contract.test.tsx +0 -66
  879. package/src/Divider/__tests__/Divider.test.tsx +0 -46
  880. package/src/Divider/index.ts +0 -2
  881. package/src/Divider/types.ts +0 -17
  882. package/src/Drawer/Drawer.tsx +0 -315
  883. package/src/Drawer/README.md +0 -124
  884. package/src/Drawer/__tests__/Drawer.behavior.test.tsx +0 -100
  885. package/src/Drawer/__tests__/Drawer.focus-trap.test.tsx +0 -55
  886. package/src/Drawer/__tests__/Drawer.rendering.test.tsx +0 -111
  887. package/src/Drawer/__tests__/Drawer.side.test.tsx +0 -69
  888. package/src/Drawer/__tests__/dialog-polyfill.ts +0 -39
  889. package/src/Drawer/index.ts +0 -2
  890. package/src/Drawer/types.ts +0 -66
  891. package/src/Dropdown/Dropdown.tsx +0 -985
  892. package/src/Dropdown/DropdownContentContext.ts +0 -15
  893. package/src/Dropdown/DropdownContext.ts +0 -17
  894. package/src/Dropdown/DropdownGroupContext.ts +0 -8
  895. package/src/Dropdown/DropdownItemIndicatorContext.ts +0 -13
  896. package/src/Dropdown/DropdownRadioGroupContext.ts +0 -9
  897. package/src/Dropdown/DropdownSubContext.ts +0 -15
  898. package/src/Dropdown/README.md +0 -286
  899. package/src/Dropdown/__tests__/Dropdown.asChild.test.tsx +0 -286
  900. package/src/Dropdown/__tests__/Dropdown.basic-rendering.test.tsx +0 -43
  901. package/src/Dropdown/__tests__/Dropdown.checkbox-item.test.tsx +0 -121
  902. package/src/Dropdown/__tests__/Dropdown.disabled.test.tsx +0 -143
  903. package/src/Dropdown/__tests__/Dropdown.error-handling.test.tsx +0 -85
  904. package/src/Dropdown/__tests__/Dropdown.group-label.test.tsx +0 -68
  905. package/src/Dropdown/__tests__/Dropdown.item-indicator.test.tsx +0 -260
  906. package/src/Dropdown/__tests__/Dropdown.item.test.tsx +0 -72
  907. package/src/Dropdown/__tests__/Dropdown.keyboard-edge-cases.test.tsx +0 -77
  908. package/src/Dropdown/__tests__/Dropdown.keyboard-interaction.test.tsx +0 -310
  909. package/src/Dropdown/__tests__/Dropdown.mouse-interaction.test.tsx +0 -347
  910. package/src/Dropdown/__tests__/Dropdown.radio-item.test.tsx +0 -134
  911. package/src/Dropdown/__tests__/Dropdown.reading-direction.test.tsx +0 -153
  912. package/src/Dropdown/__tests__/Dropdown.separator.test.tsx +0 -46
  913. package/src/Dropdown/__tests__/Dropdown.state-modes.test.tsx +0 -100
  914. package/src/Dropdown/__tests__/Dropdown.sub.test.tsx +0 -185
  915. package/src/Dropdown/__tests__/Dropdown.trigger.test.tsx +0 -110
  916. package/src/Dropdown/__tests__/Dropdown.typeahead.test.tsx +0 -133
  917. package/src/Dropdown/constants.ts +0 -4
  918. package/src/Dropdown/hooks/index.ts +0 -9
  919. package/src/Dropdown/hooks/useCloseSiblingSub.ts +0 -13
  920. package/src/Dropdown/hooks/useDropdownContent.ts +0 -162
  921. package/src/Dropdown/hooks/useDropdownContext.ts +0 -1
  922. package/src/Dropdown/hooks/useDropdownGroup.ts +0 -18
  923. package/src/Dropdown/hooks/useDropdownItem.ts +0 -49
  924. package/src/Dropdown/hooks/useDropdownLabel.ts +0 -15
  925. package/src/Dropdown/hooks/useDropdownRoot.ts +0 -57
  926. package/src/Dropdown/hooks/useDropdownSubContext.ts +0 -1
  927. package/src/Dropdown/hooks/useDropdownTrigger.ts +0 -31
  928. package/src/Dropdown/index.ts +0 -2
  929. package/src/Dropdown/types.ts +0 -558
  930. package/src/EmptyState/EmptyState.tsx +0 -329
  931. package/src/EmptyState/README.md +0 -129
  932. package/src/EmptyState/__tests__/EmptyState.Actions.test.tsx +0 -37
  933. package/src/EmptyState/__tests__/EmptyState.Description.test.tsx +0 -32
  934. package/src/EmptyState/__tests__/EmptyState.Media.test.tsx +0 -34
  935. package/src/EmptyState/__tests__/EmptyState.Root.test.tsx +0 -38
  936. package/src/EmptyState/__tests__/EmptyState.Title.test.tsx +0 -28
  937. package/src/EmptyState/index.ts +0 -2
  938. package/src/EmptyState/types.ts +0 -65
  939. package/src/Field/Field.tsx +0 -276
  940. package/src/Field/FieldContext.ts +0 -22
  941. package/src/Field/README.md +0 -167
  942. package/src/Field/__tests__/Field.asChild.test.tsx +0 -83
  943. package/src/Field/__tests__/Field.basic-rendering.test.tsx +0 -115
  944. package/src/Field/__tests__/Field.contract.test.tsx +0 -91
  945. package/src/Field/__tests__/Field.error-handling.test.tsx +0 -23
  946. package/src/Field/__tests__/Field.state-cascade.test.tsx +0 -96
  947. package/src/Field/hooks/__tests__/useFieldProps.test.tsx +0 -142
  948. package/src/Field/hooks/index.ts +0 -2
  949. package/src/Field/hooks/useFieldContext.ts +0 -1
  950. package/src/Field/hooks/useFieldProps.ts +0 -57
  951. package/src/Field/index.ts +0 -2
  952. package/src/Field/types.ts +0 -85
  953. package/src/Fieldset/Fieldset.tsx +0 -156
  954. package/src/Fieldset/README.md +0 -74
  955. package/src/Fieldset/__tests__/Fieldset.basic-rendering.test.tsx +0 -90
  956. package/src/Fieldset/__tests__/Fieldset.disabled.test.tsx +0 -41
  957. package/src/Fieldset/index.ts +0 -2
  958. package/src/Fieldset/types.ts +0 -25
  959. package/src/Input/Input.tsx +0 -128
  960. package/src/Input/README.md +0 -180
  961. package/src/Input/__tests__/Input.asChild.test.tsx +0 -85
  962. package/src/Input/__tests__/Input.basic-rendering.test.tsx +0 -123
  963. package/src/Input/__tests__/Input.contract.test.tsx +0 -77
  964. package/src/Input/__tests__/Input.disabled.test.tsx +0 -49
  965. package/src/Input/__tests__/Input.field-integration.test.tsx +0 -148
  966. package/src/Input/index.ts +0 -2
  967. package/src/Input/types.ts +0 -28
  968. package/src/InputGroup/InputGroup.tsx +0 -243
  969. package/src/InputGroup/README.md +0 -178
  970. package/src/InputGroup/__tests__/InputGroup.asChild.test.tsx +0 -110
  971. package/src/InputGroup/__tests__/InputGroup.basic-rendering.test.tsx +0 -120
  972. package/src/InputGroup/__tests__/InputGroup.contract.test.tsx +0 -60
  973. package/src/InputGroup/index.ts +0 -2
  974. package/src/InputGroup/types.ts +0 -43
  975. package/src/Listbox/Listbox.tsx +0 -475
  976. package/src/Listbox/ListboxContext.ts +0 -48
  977. package/src/Listbox/README.md +0 -248
  978. package/src/Listbox/__tests__/Listbox.active-descendant.test.tsx +0 -128
  979. package/src/Listbox/__tests__/Listbox.asChild.test.tsx +0 -91
  980. package/src/Listbox/__tests__/Listbox.basic-rendering.test.tsx +0 -16
  981. package/src/Listbox/__tests__/Listbox.controlled-state.test.tsx +0 -114
  982. package/src/Listbox/__tests__/Listbox.disabled.test.tsx +0 -90
  983. package/src/Listbox/__tests__/Listbox.fixtures.ts +0 -27
  984. package/src/Listbox/__tests__/Listbox.group-label.test.tsx +0 -97
  985. package/src/Listbox/__tests__/Listbox.group.test.tsx +0 -45
  986. package/src/Listbox/__tests__/Listbox.keyboard-edge-cases.test.tsx +0 -144
  987. package/src/Listbox/__tests__/Listbox.keyboard-interaction.test.tsx +0 -112
  988. package/src/Listbox/__tests__/Listbox.modifier-keys.test.tsx +0 -86
  989. package/src/Listbox/__tests__/Listbox.multi-select-keyboard.test.tsx +0 -368
  990. package/src/Listbox/__tests__/Listbox.multiple-mode.test.tsx +0 -91
  991. package/src/Listbox/__tests__/Listbox.mutation-hardening.test.tsx +0 -480
  992. package/src/Listbox/__tests__/Listbox.orientation.test.tsx +0 -59
  993. package/src/Listbox/__tests__/Listbox.reading-direction.test.tsx +0 -65
  994. package/src/Listbox/__tests__/Listbox.reorder.test.tsx +0 -78
  995. package/src/Listbox/__tests__/Listbox.selection-follows-focus.test.tsx +0 -64
  996. package/src/Listbox/__tests__/Listbox.strict-context.test.tsx +0 -21
  997. package/src/Listbox/__tests__/Listbox.typeahead.test.tsx +0 -123
  998. package/src/Listbox/__tests__/Listbox.uncontrolled-state.test.tsx +0 -48
  999. package/src/Listbox/constants.ts +0 -2
  1000. package/src/Listbox/hooks/index.ts +0 -1
  1001. package/src/Listbox/hooks/useListboxRoot.ts +0 -407
  1002. package/src/Listbox/index.ts +0 -3
  1003. package/src/Listbox/types.ts +0 -238
  1004. package/src/MillerColumns/MillerColumns.tsx +0 -490
  1005. package/src/MillerColumns/MillerColumnsContext.ts +0 -25
  1006. package/src/MillerColumns/README.md +0 -348
  1007. package/src/MillerColumns/__tests__/MillerColumns.aria.test.tsx +0 -127
  1008. package/src/MillerColumns/__tests__/MillerColumns.asChild.test.tsx +0 -106
  1009. package/src/MillerColumns/__tests__/MillerColumns.auto-scroll.test.tsx +0 -70
  1010. package/src/MillerColumns/__tests__/MillerColumns.basic-rendering.test.tsx +0 -67
  1011. package/src/MillerColumns/__tests__/MillerColumns.column-projection.test.tsx +0 -161
  1012. package/src/MillerColumns/__tests__/MillerColumns.controlled-state.test.tsx +0 -90
  1013. package/src/MillerColumns/__tests__/MillerColumns.data-attributes.test.tsx +0 -125
  1014. package/src/MillerColumns/__tests__/MillerColumns.disabled-items.test.tsx +0 -65
  1015. package/src/MillerColumns/__tests__/MillerColumns.error-handling.test.tsx +0 -57
  1016. package/src/MillerColumns/__tests__/MillerColumns.fixtures.ts +0 -15
  1017. package/src/MillerColumns/__tests__/MillerColumns.item-indicator.test.tsx +0 -57
  1018. package/src/MillerColumns/__tests__/MillerColumns.keyboard-interaction.test.tsx +0 -214
  1019. package/src/MillerColumns/__tests__/MillerColumns.keyboard-selection-state.test.tsx +0 -96
  1020. package/src/MillerColumns/__tests__/MillerColumns.preview-panel.test.tsx +0 -72
  1021. package/src/MillerColumns/__tests__/MillerColumns.preview-visibility.test.tsx +0 -79
  1022. package/src/MillerColumns/__tests__/MillerColumns.resize.test.tsx +0 -326
  1023. package/src/MillerColumns/__tests__/MillerColumns.roving-tabindex.test.tsx +0 -91
  1024. package/src/MillerColumns/__tests__/MillerColumns.selection.test.tsx +0 -54
  1025. package/src/MillerColumns/__tests__/MillerColumns.styled-parts.test.tsx +0 -143
  1026. package/src/MillerColumns/__tests__/MillerColumns.typeahead.test.tsx +0 -104
  1027. package/src/MillerColumns/__tests__/MillerColumns.uncontrolled-state.test.tsx +0 -70
  1028. package/src/MillerColumns/constants.ts +0 -2
  1029. package/src/MillerColumns/hooks/index.ts +0 -7
  1030. package/src/MillerColumns/hooks/useMillerColumnsColumn.ts +0 -26
  1031. package/src/MillerColumns/hooks/useMillerColumnsColumnContext.ts +0 -1
  1032. package/src/MillerColumns/hooks/useMillerColumnsContext.ts +0 -1
  1033. package/src/MillerColumns/hooks/useMillerColumnsItem.ts +0 -179
  1034. package/src/MillerColumns/hooks/useMillerColumnsItemContext.ts +0 -1
  1035. package/src/MillerColumns/hooks/useMillerColumnsResizeHandle.ts +0 -146
  1036. package/src/MillerColumns/hooks/useMillerColumnsRoot.ts +0 -0
  1037. package/src/MillerColumns/index.ts +0 -7
  1038. package/src/MillerColumns/types.ts +0 -252
  1039. package/src/MillerColumns/useMillerColumnsSelection.ts +0 -31
  1040. package/src/MillerColumns/utils.ts +0 -141
  1041. package/src/Modal/Modal.tsx +0 -515
  1042. package/src/Modal/ModalContext.ts +0 -20
  1043. package/src/Modal/README.md +0 -222
  1044. package/src/Modal/__tests__/Modal.accessibility.test.tsx +0 -167
  1045. package/src/Modal/__tests__/Modal.asChild.test.tsx +0 -162
  1046. package/src/Modal/__tests__/Modal.click-outside.test.tsx +0 -115
  1047. package/src/Modal/__tests__/Modal.content.test.tsx +0 -193
  1048. package/src/Modal/__tests__/Modal.controlled-state.test.tsx +0 -120
  1049. package/src/Modal/__tests__/Modal.error-handling.test.tsx +0 -30
  1050. package/src/Modal/__tests__/Modal.escape-hatches.test.tsx +0 -99
  1051. package/src/Modal/__tests__/Modal.focus-trap.test.tsx +0 -162
  1052. package/src/Modal/__tests__/Modal.imperative-api.test.tsx +0 -119
  1053. package/src/Modal/__tests__/Modal.nested.test.tsx +0 -106
  1054. package/src/Modal/__tests__/Modal.overlay.test.tsx +0 -99
  1055. package/src/Modal/__tests__/Modal.portal.test.tsx +0 -90
  1056. package/src/Modal/__tests__/Modal.presence.test.tsx +0 -111
  1057. package/src/Modal/__tests__/Modal.trigger.test.tsx +0 -70
  1058. package/src/Modal/__tests__/Modal.uncontrolled-state.test.tsx +0 -72
  1059. package/src/Modal/__tests__/dialog-polyfill.ts +0 -40
  1060. package/src/Modal/hooks/index.ts +0 -4
  1061. package/src/Modal/hooks/useModalContent.ts +0 -94
  1062. package/src/Modal/hooks/useModalContext.ts +0 -1
  1063. package/src/Modal/hooks/useModalRoot.ts +0 -81
  1064. package/src/Modal/hooks/useModalTrigger.ts +0 -25
  1065. package/src/Modal/index.ts +0 -3
  1066. package/src/Modal/types.ts +0 -206
  1067. package/src/NavigationMenu/NavigationMenu.tsx +0 -890
  1068. package/src/NavigationMenu/NavigationMenuContext.ts +0 -67
  1069. package/src/NavigationMenu/README.md +0 -355
  1070. package/src/NavigationMenu/__tests__/NavigationMenu.anchor-positioning.test.tsx +0 -132
  1071. package/src/NavigationMenu/__tests__/NavigationMenu.asChild.test.tsx +0 -73
  1072. package/src/NavigationMenu/__tests__/NavigationMenu.basic-rendering.test.tsx +0 -92
  1073. package/src/NavigationMenu/__tests__/NavigationMenu.contract.test.tsx +0 -45
  1074. package/src/NavigationMenu/__tests__/NavigationMenu.controlled-state.test.tsx +0 -134
  1075. package/src/NavigationMenu/__tests__/NavigationMenu.error-handling.test.tsx +0 -62
  1076. package/src/NavigationMenu/__tests__/NavigationMenu.fixtures.tsx +0 -79
  1077. package/src/NavigationMenu/__tests__/NavigationMenu.forceMount.test.tsx +0 -52
  1078. package/src/NavigationMenu/__tests__/NavigationMenu.hover-interaction.test.tsx +0 -254
  1079. package/src/NavigationMenu/__tests__/NavigationMenu.indicator.test.tsx +0 -252
  1080. package/src/NavigationMenu/__tests__/NavigationMenu.keyboard-interaction.test.tsx +0 -294
  1081. package/src/NavigationMenu/__tests__/NavigationMenu.keyboard-navigation.test.tsx +0 -126
  1082. package/src/NavigationMenu/__tests__/NavigationMenu.link.test.tsx +0 -139
  1083. package/src/NavigationMenu/__tests__/NavigationMenu.motion.test.tsx +0 -568
  1084. package/src/NavigationMenu/__tests__/NavigationMenu.mouse-interaction.test.tsx +0 -76
  1085. package/src/NavigationMenu/__tests__/NavigationMenu.uncontrolled-state.test.tsx +0 -30
  1086. package/src/NavigationMenu/__tests__/NavigationMenu.viewport.test.tsx +0 -113
  1087. package/src/NavigationMenu/constants.ts +0 -5
  1088. package/src/NavigationMenu/hooks/index.ts +0 -7
  1089. package/src/NavigationMenu/hooks/useNavigationMenuEntry.ts +0 -33
  1090. package/src/NavigationMenu/hooks/useNavigationMenuIndicator.ts +0 -70
  1091. package/src/NavigationMenu/hooks/useNavigationMenuLink.ts +0 -72
  1092. package/src/NavigationMenu/hooks/useNavigationMenuRoot.ts +0 -301
  1093. package/src/NavigationMenu/hooks/useNavigationMenuTopLevelEntry.ts +0 -65
  1094. package/src/NavigationMenu/hooks/useNavigationMenuTrigger.ts +0 -158
  1095. package/src/NavigationMenu/hooks/useNavigationMenuViewport.ts +0 -101
  1096. package/src/NavigationMenu/index.ts +0 -3
  1097. package/src/NavigationMenu/types.ts +0 -259
  1098. package/src/NavigationMenu/utils.ts +0 -89
  1099. package/src/Popover/Popover.tsx +0 -427
  1100. package/src/Popover/PopoverContext.ts +0 -13
  1101. package/src/Popover/README.md +0 -106
  1102. package/src/Popover/__tests__/Popover.anchor.test.tsx +0 -38
  1103. package/src/Popover/__tests__/Popover.asChild.test.tsx +0 -160
  1104. package/src/Popover/__tests__/Popover.basic-rendering.test.tsx +0 -106
  1105. package/src/Popover/__tests__/Popover.click-outside.test.tsx +0 -149
  1106. package/src/Popover/__tests__/Popover.close.test.tsx +0 -70
  1107. package/src/Popover/__tests__/Popover.content.test.tsx +0 -58
  1108. package/src/Popover/__tests__/Popover.controlled-state.test.tsx +0 -45
  1109. package/src/Popover/__tests__/Popover.error-handling.test.tsx +0 -51
  1110. package/src/Popover/__tests__/Popover.focus.test.tsx +0 -43
  1111. package/src/Popover/__tests__/Popover.keyboard-interaction.test.tsx +0 -71
  1112. package/src/Popover/__tests__/Popover.mouse-interaction.test.tsx +0 -69
  1113. package/src/Popover/__tests__/Popover.uncontrolled-state.test.tsx +0 -44
  1114. package/src/Popover/hooks/index.ts +0 -3
  1115. package/src/Popover/hooks/usePopoverContent.ts +0 -98
  1116. package/src/Popover/hooks/usePopoverRoot.ts +0 -84
  1117. package/src/Popover/hooks/usePopoverTrigger.ts +0 -33
  1118. package/src/Popover/index.ts +0 -2
  1119. package/src/Popover/types.ts +0 -197
  1120. package/src/Portal/Portal.tsx +0 -70
  1121. package/src/Portal/README.md +0 -70
  1122. package/src/Portal/__tests__/Portal.basic-rendering.test.tsx +0 -22
  1123. package/src/Portal/index.ts +0 -2
  1124. package/src/Portal/types.ts +0 -15
  1125. package/src/Progress/Progress.tsx +0 -215
  1126. package/src/Progress/ProgressContext.ts +0 -27
  1127. package/src/Progress/README.md +0 -112
  1128. package/src/Progress/__tests__/Progress.asChild.test.tsx +0 -37
  1129. package/src/Progress/__tests__/Progress.basic-rendering.test.tsx +0 -75
  1130. package/src/Progress/__tests__/Progress.error-handling.test.tsx +0 -40
  1131. package/src/Progress/__tests__/Progress.fixtures.ts +0 -7
  1132. package/src/Progress/__tests__/Progress.value.test.tsx +0 -104
  1133. package/src/Progress/hooks/index.ts +0 -2
  1134. package/src/Progress/hooks/useProgressContext.ts +0 -1
  1135. package/src/Progress/hooks/useProgressRoot.ts +0 -45
  1136. package/src/Progress/index.ts +0 -3
  1137. package/src/Progress/types.ts +0 -59
  1138. package/src/Radio/README.md +0 -160
  1139. package/src/Radio/Radio.tsx +0 -210
  1140. package/src/Radio/RadioContext.ts +0 -19
  1141. package/src/Radio/__tests__/Radio.basic-rendering.test.tsx +0 -80
  1142. package/src/Radio/__tests__/Radio.contract.test.tsx +0 -106
  1143. package/src/Radio/__tests__/Radio.controlled-state.test.tsx +0 -79
  1144. package/src/Radio/__tests__/Radio.disabled.test.tsx +0 -48
  1145. package/src/Radio/__tests__/Radio.native-grouping.test.tsx +0 -77
  1146. package/src/Radio/__tests__/Radio.parts.test.tsx +0 -76
  1147. package/src/Radio/__tests__/Radio.uncontrolled-state.test.tsx +0 -96
  1148. package/src/Radio/hooks/index.ts +0 -2
  1149. package/src/Radio/hooks/useRadioContext.ts +0 -1
  1150. package/src/Radio/hooks/useRadioRoot.ts +0 -51
  1151. package/src/Radio/index.ts +0 -2
  1152. package/src/Radio/types.ts +0 -90
  1153. package/src/RadioCard/README.md +0 -134
  1154. package/src/RadioCard/RadioCard.tsx +0 -354
  1155. package/src/RadioCard/RadioCardContext.ts +0 -35
  1156. package/src/RadioCard/RadioCardItemContext.ts +0 -23
  1157. package/src/RadioCard/__tests__/RadioCard.asChild.test.tsx +0 -76
  1158. package/src/RadioCard/__tests__/RadioCard.basic-rendering.test.tsx +0 -95
  1159. package/src/RadioCard/__tests__/RadioCard.controlled-state.test.tsx +0 -107
  1160. package/src/RadioCard/__tests__/RadioCard.disabled-items.test.tsx +0 -111
  1161. package/src/RadioCard/__tests__/RadioCard.error-handling.test.tsx +0 -35
  1162. package/src/RadioCard/__tests__/RadioCard.indicator.test.tsx +0 -119
  1163. package/src/RadioCard/__tests__/RadioCard.keyboard-interaction.test.tsx +0 -211
  1164. package/src/RadioCard/__tests__/RadioCard.orientation.test.tsx +0 -90
  1165. package/src/RadioCard/__tests__/RadioCard.reading-direction.test.tsx +0 -65
  1166. package/src/RadioCard/__tests__/RadioCard.ref-forwarding.test.tsx +0 -54
  1167. package/src/RadioCard/__tests__/RadioCard.uncontrolled-state.test.tsx +0 -129
  1168. package/src/RadioCard/hooks/index.ts +0 -3
  1169. package/src/RadioCard/hooks/useRadioCardContext.ts +0 -1
  1170. package/src/RadioCard/hooks/useRadioCardItemContext.ts +0 -1
  1171. package/src/RadioCard/hooks/useRadioCardRoot.ts +0 -88
  1172. package/src/RadioCard/index.ts +0 -4
  1173. package/src/RadioCard/types.ts +0 -145
  1174. package/src/RadioGroup/README.md +0 -185
  1175. package/src/RadioGroup/RadioGroup.tsx +0 -370
  1176. package/src/RadioGroup/RadioGroupContext.ts +0 -23
  1177. package/src/RadioGroup/RadioGroupItemContext.ts +0 -10
  1178. package/src/RadioGroup/__tests__/RadioGroup.asChild.test.tsx +0 -105
  1179. package/src/RadioGroup/__tests__/RadioGroup.basic-rendering.test.tsx +0 -80
  1180. package/src/RadioGroup/__tests__/RadioGroup.controlled-state.test.tsx +0 -109
  1181. package/src/RadioGroup/__tests__/RadioGroup.disabled-keydown-guards.test.tsx +0 -68
  1182. package/src/RadioGroup/__tests__/RadioGroup.disabled.test.tsx +0 -106
  1183. package/src/RadioGroup/__tests__/RadioGroup.error-handling.test.tsx +0 -33
  1184. package/src/RadioGroup/__tests__/RadioGroup.indicator.test.tsx +0 -85
  1185. package/src/RadioGroup/__tests__/RadioGroup.keyboard-interaction.test.tsx +0 -135
  1186. package/src/RadioGroup/__tests__/RadioGroup.orientation.test.tsx +0 -90
  1187. package/src/RadioGroup/__tests__/RadioGroup.reading-direction.test.tsx +0 -65
  1188. package/src/RadioGroup/__tests__/RadioGroup.ref-forwarding.test.tsx +0 -74
  1189. package/src/RadioGroup/__tests__/RadioGroup.roving-tabindex.test.tsx +0 -136
  1190. package/src/RadioGroup/__tests__/RadioGroup.uncontrolled-state.test.tsx +0 -96
  1191. package/src/RadioGroup/hooks/index.ts +0 -3
  1192. package/src/RadioGroup/hooks/useRadioGroupContext.ts +0 -1
  1193. package/src/RadioGroup/hooks/useRadioGroupItemContext.ts +0 -1
  1194. package/src/RadioGroup/hooks/useRadioGroupRoot.ts +0 -98
  1195. package/src/RadioGroup/index.ts +0 -2
  1196. package/src/RadioGroup/types.ts +0 -146
  1197. package/src/SegmentedControl/README.md +0 -154
  1198. package/src/SegmentedControl/SegmentedControl.tsx +0 -309
  1199. package/src/SegmentedControl/SegmentedControlContext.ts +0 -28
  1200. package/src/SegmentedControl/__tests__/SegmentedControl.asChild.test.tsx +0 -50
  1201. package/src/SegmentedControl/__tests__/SegmentedControl.basic-rendering.test.tsx +0 -100
  1202. package/src/SegmentedControl/__tests__/SegmentedControl.controlled-state.test.tsx +0 -107
  1203. package/src/SegmentedControl/__tests__/SegmentedControl.disabled-keydown-guards.test.tsx +0 -62
  1204. package/src/SegmentedControl/__tests__/SegmentedControl.disabled.test.tsx +0 -151
  1205. package/src/SegmentedControl/__tests__/SegmentedControl.error-handling.test.tsx +0 -17
  1206. package/src/SegmentedControl/__tests__/SegmentedControl.keyboard-interaction.test.tsx +0 -117
  1207. package/src/SegmentedControl/__tests__/SegmentedControl.orientation.test.tsx +0 -54
  1208. package/src/SegmentedControl/__tests__/SegmentedControl.reading-direction.test.tsx +0 -56
  1209. package/src/SegmentedControl/__tests__/SegmentedControl.ref-forwarding.test.tsx +0 -45
  1210. package/src/SegmentedControl/__tests__/SegmentedControl.roving-tabindex.test.tsx +0 -104
  1211. package/src/SegmentedControl/__tests__/SegmentedControl.uncontrolled-state.test.tsx +0 -94
  1212. package/src/SegmentedControl/hooks/index.ts +0 -2
  1213. package/src/SegmentedControl/hooks/useSegmentedControlContext.ts +0 -1
  1214. package/src/SegmentedControl/hooks/useSegmentedControlRoot.ts +0 -87
  1215. package/src/SegmentedControl/index.ts +0 -2
  1216. package/src/SegmentedControl/types.ts +0 -138
  1217. package/src/Select/README.md +0 -168
  1218. package/src/Select/Select.tsx +0 -746
  1219. package/src/Select/SelectContext.ts +0 -38
  1220. package/src/Select/SelectItemIndicatorContext.ts +0 -29
  1221. package/src/Select/__tests__/Select.asChild.test.tsx +0 -36
  1222. package/src/Select/__tests__/Select.basic-rendering.test.tsx +0 -36
  1223. package/src/Select/__tests__/Select.controlled-state.test.tsx +0 -69
  1224. package/src/Select/__tests__/Select.data-attributes.test.tsx +0 -29
  1225. package/src/Select/__tests__/Select.field-integration.test.tsx +0 -150
  1226. package/src/Select/__tests__/Select.form.test.tsx +0 -38
  1227. package/src/Select/__tests__/Select.group.test.tsx +0 -42
  1228. package/src/Select/__tests__/Select.keyboard-edge.test.tsx +0 -95
  1229. package/src/Select/__tests__/Select.keyboard.test.tsx +0 -124
  1230. package/src/Select/__tests__/Select.mutation-hardening.test.tsx +0 -317
  1231. package/src/Select/__tests__/Select.native-item.test.tsx +0 -30
  1232. package/src/Select/__tests__/Select.open-close.test.tsx +0 -57
  1233. package/src/Select/__tests__/Select.placeholder.test.tsx +0 -50
  1234. package/src/Select/__tests__/Select.rich-asChild.test.tsx +0 -60
  1235. package/src/Select/__tests__/Select.rich-mode.test.tsx +0 -16
  1236. package/src/Select/__tests__/Select.selection.test.tsx +0 -104
  1237. package/src/Select/__tests__/Select.separator.test.tsx +0 -71
  1238. package/src/Select/__tests__/Select.strict-context.test.tsx +0 -36
  1239. package/src/Select/__tests__/Select.typeahead.test.tsx +0 -156
  1240. package/src/Select/__tests__/Select.value-mirror.test.tsx +0 -240
  1241. package/src/Select/constants.ts +0 -8
  1242. package/src/Select/hooks/index.ts +0 -2
  1243. package/src/Select/hooks/useSelectContent.ts +0 -149
  1244. package/src/Select/hooks/useSelectRoot.ts +0 -149
  1245. package/src/Select/index.ts +0 -2
  1246. package/src/Select/types.ts +0 -272
  1247. package/src/SkipNav/README.md +0 -87
  1248. package/src/SkipNav/SkipNav.tsx +0 -161
  1249. package/src/SkipNav/__tests__/SkipNav.basic-rendering.test.tsx +0 -29
  1250. package/src/SkipNav/__tests__/SkipNav.ids.test.tsx +0 -19
  1251. package/src/SkipNav/index.ts +0 -1
  1252. package/src/SkipNav/types.ts +0 -34
  1253. package/src/Slider/README.md +0 -245
  1254. package/src/Slider/Slider.tsx +0 -361
  1255. package/src/Slider/SliderContext.ts +0 -58
  1256. package/src/Slider/__tests__/Slider.asChild.test.tsx +0 -119
  1257. package/src/Slider/__tests__/Slider.basic-rendering.test.tsx +0 -157
  1258. package/src/Slider/__tests__/Slider.controlled-state.test.tsx +0 -78
  1259. package/src/Slider/__tests__/Slider.disabled.test.tsx +0 -82
  1260. package/src/Slider/__tests__/Slider.error-handling.test.tsx +0 -45
  1261. package/src/Slider/__tests__/Slider.fixtures.ts +0 -53
  1262. package/src/Slider/__tests__/Slider.form.test.tsx +0 -67
  1263. package/src/Slider/__tests__/Slider.inverted.test.tsx +0 -112
  1264. package/src/Slider/__tests__/Slider.keyboard-interaction.test.tsx +0 -118
  1265. package/src/Slider/__tests__/Slider.multiple-thumbs.test.tsx +0 -84
  1266. package/src/Slider/__tests__/Slider.orientation.test.tsx +0 -101
  1267. package/src/Slider/__tests__/Slider.pointer-interaction.test.tsx +0 -205
  1268. package/src/Slider/__tests__/Slider.reading-direction.test.tsx +0 -99
  1269. package/src/Slider/__tests__/Slider.uncontrolled-state.test.tsx +0 -69
  1270. package/src/Slider/__tests__/Slider.value-commit.test.tsx +0 -103
  1271. package/src/Slider/hooks/index.ts +0 -3
  1272. package/src/Slider/hooks/useSliderContext.ts +0 -1
  1273. package/src/Slider/hooks/useSliderRoot.ts +0 -197
  1274. package/src/Slider/hooks/useSliderThumb.ts +0 -77
  1275. package/src/Slider/index.ts +0 -3
  1276. package/src/Slider/types.ts +0 -205
  1277. package/src/Slider/utils.ts +0 -155
  1278. package/src/Slot/Slot.tsx +0 -238
  1279. package/src/Slot/__tests__/Slot.test.tsx +0 -273
  1280. package/src/Slot/__tests__/composeEventHandlers.test.ts +0 -74
  1281. package/src/Slot/composeEventHandlers.ts +0 -62
  1282. package/src/Slot/index.ts +0 -3
  1283. package/src/Slot/types.ts +0 -21
  1284. package/src/SplitButton/README.md +0 -225
  1285. package/src/SplitButton/SplitButton.tsx +0 -457
  1286. package/src/SplitButton/SplitButtonContext.ts +0 -26
  1287. package/src/SplitButton/__tests__/SplitButton.accessibility.test.tsx +0 -55
  1288. package/src/SplitButton/__tests__/SplitButton.asChild.test.tsx +0 -51
  1289. package/src/SplitButton/__tests__/SplitButton.basic-rendering.test.tsx +0 -57
  1290. package/src/SplitButton/__tests__/SplitButton.data-attributes.test.tsx +0 -28
  1291. package/src/SplitButton/__tests__/SplitButton.disabled.test.tsx +0 -79
  1292. package/src/SplitButton/__tests__/SplitButton.error-handling.test.tsx +0 -29
  1293. package/src/SplitButton/__tests__/SplitButton.keyboard-interaction.test.tsx +0 -56
  1294. package/src/SplitButton/__tests__/SplitButton.state-modes.test.tsx +0 -68
  1295. package/src/SplitButton/index.ts +0 -2
  1296. package/src/SplitButton/types.ts +0 -186
  1297. package/src/Status/README.md +0 -50
  1298. package/src/Status/Status.tsx +0 -72
  1299. package/src/Status/__tests__/Status.test.tsx +0 -33
  1300. package/src/Status/index.ts +0 -2
  1301. package/src/Status/types.ts +0 -20
  1302. package/src/Switch/README.md +0 -126
  1303. package/src/Switch/Switch.tsx +0 -203
  1304. package/src/Switch/SwitchContext.ts +0 -20
  1305. package/src/Switch/__tests__/Switch.asChild.test.tsx +0 -38
  1306. package/src/Switch/__tests__/Switch.basic-rendering.test.tsx +0 -102
  1307. package/src/Switch/__tests__/Switch.contract.test.tsx +0 -114
  1308. package/src/Switch/__tests__/Switch.controlled-state.test.tsx +0 -77
  1309. package/src/Switch/__tests__/Switch.disabled.test.tsx +0 -55
  1310. package/src/Switch/__tests__/Switch.error-handling.test.tsx +0 -20
  1311. package/src/Switch/__tests__/Switch.form.test.tsx +0 -55
  1312. package/src/Switch/__tests__/Switch.keyboard-interaction.test.tsx +0 -56
  1313. package/src/Switch/__tests__/Switch.recipe.test.ts +0 -19
  1314. package/src/Switch/__tests__/Switch.thumb.test.tsx +0 -84
  1315. package/src/Switch/__tests__/Switch.uncontrolled-state.test.tsx +0 -118
  1316. package/src/Switch/hooks/index.ts +0 -2
  1317. package/src/Switch/hooks/useSwitchContext.ts +0 -1
  1318. package/src/Switch/hooks/useSwitchRoot.ts +0 -49
  1319. package/src/Switch/index.ts +0 -3
  1320. package/src/Switch/types.ts +0 -95
  1321. package/src/Table/README.md +0 -307
  1322. package/src/Table/Table.tsx +0 -636
  1323. package/src/Table/TableExpandableContext.ts +0 -7
  1324. package/src/Table/__tests__/Table.Body.test.tsx +0 -61
  1325. package/src/Table/__tests__/Table.Caption.test.tsx +0 -70
  1326. package/src/Table/__tests__/Table.Cell.test.tsx +0 -73
  1327. package/src/Table/__tests__/Table.DetailRow.test.tsx +0 -83
  1328. package/src/Table/__tests__/Table.ExpandTrigger.test.tsx +0 -102
  1329. package/src/Table/__tests__/Table.Expandable.test.tsx +0 -121
  1330. package/src/Table/__tests__/Table.Footer.test.tsx +0 -61
  1331. package/src/Table/__tests__/Table.Head.test.tsx +0 -61
  1332. package/src/Table/__tests__/Table.Header.test.tsx +0 -73
  1333. package/src/Table/__tests__/Table.Root.test.tsx +0 -49
  1334. package/src/Table/__tests__/Table.Row.test.tsx +0 -67
  1335. package/src/Table/__tests__/Table.ScrollArea.test.tsx +0 -83
  1336. package/src/Table/__tests__/Table.contract.test.tsx +0 -80
  1337. package/src/Table/index.ts +0 -2
  1338. package/src/Table/types.ts +0 -237
  1339. package/src/Tabs/README.md +0 -111
  1340. package/src/Tabs/Tabs.tsx +0 -465
  1341. package/src/Tabs/TabsContext.ts +0 -21
  1342. package/src/Tabs/__tests__/Tabs.activation-mode.test.tsx +0 -172
  1343. package/src/Tabs/__tests__/Tabs.asChild.test.tsx +0 -91
  1344. package/src/Tabs/__tests__/Tabs.basic-rendering.test.tsx +0 -498
  1345. package/src/Tabs/__tests__/Tabs.change-event-callbacks.test.tsx +0 -157
  1346. package/src/Tabs/__tests__/Tabs.contract.test.tsx +0 -153
  1347. package/src/Tabs/__tests__/Tabs.controlled-state.test.tsx +0 -152
  1348. package/src/Tabs/__tests__/Tabs.disabled-tabs.test.tsx +0 -239
  1349. package/src/Tabs/__tests__/Tabs.error-handling.test.tsx +0 -82
  1350. package/src/Tabs/__tests__/Tabs.fixtures.ts +0 -171
  1351. package/src/Tabs/__tests__/Tabs.imperative-api.test.tsx +0 -118
  1352. package/src/Tabs/__tests__/Tabs.keyboard-interaction.test.tsx +0 -192
  1353. package/src/Tabs/__tests__/Tabs.lazy-mount.test.tsx +0 -78
  1354. package/src/Tabs/__tests__/Tabs.mouse-interaction.test.tsx +0 -216
  1355. package/src/Tabs/__tests__/Tabs.reading-direction.test.tsx +0 -58
  1356. package/src/Tabs/__tests__/Tabs.uncontrolled-state.test.tsx +0 -197
  1357. package/src/Tabs/hooks/index.ts +0 -4
  1358. package/src/Tabs/hooks/useTabsContent.ts +0 -32
  1359. package/src/Tabs/hooks/useTabsContext.ts +0 -1
  1360. package/src/Tabs/hooks/useTabsRoot.ts +0 -172
  1361. package/src/Tabs/hooks/useTabsTrigger.ts +0 -116
  1362. package/src/Tabs/index.ts +0 -3
  1363. package/src/Tabs/types.ts +0 -166
  1364. package/src/Tabs/utils.ts +0 -8
  1365. package/src/Textarea/README.md +0 -98
  1366. package/src/Textarea/Textarea.tsx +0 -104
  1367. package/src/Textarea/__tests__/Textarea.asChild.test.tsx +0 -85
  1368. package/src/Textarea/__tests__/Textarea.basic-rendering.test.tsx +0 -112
  1369. package/src/Textarea/__tests__/Textarea.disabled.test.tsx +0 -49
  1370. package/src/Textarea/__tests__/Textarea.field-integration.test.tsx +0 -134
  1371. package/src/Textarea/index.ts +0 -2
  1372. package/src/Textarea/types.ts +0 -28
  1373. package/src/Toggle/README.md +0 -97
  1374. package/src/Toggle/Toggle.tsx +0 -126
  1375. package/src/Toggle/__tests__/Toggle.asChild.test.tsx +0 -42
  1376. package/src/Toggle/__tests__/Toggle.basic-rendering.test.tsx +0 -33
  1377. package/src/Toggle/__tests__/Toggle.controlled-state.test.tsx +0 -60
  1378. package/src/Toggle/__tests__/Toggle.disabled.test.tsx +0 -34
  1379. package/src/Toggle/__tests__/Toggle.keyboard-interaction.test.tsx +0 -42
  1380. package/src/Toggle/__tests__/Toggle.uncontrolled-state.test.tsx +0 -40
  1381. package/src/Toggle/index.ts +0 -2
  1382. package/src/Toggle/types.ts +0 -77
  1383. package/src/ToggleGroup/README.md +0 -137
  1384. package/src/ToggleGroup/ToggleGroup.tsx +0 -321
  1385. package/src/ToggleGroup/ToggleGroupContext.ts +0 -9
  1386. package/src/ToggleGroup/__tests__/ToggleGroup.asChild.test.tsx +0 -85
  1387. package/src/ToggleGroup/__tests__/ToggleGroup.basic-rendering.test.tsx +0 -59
  1388. package/src/ToggleGroup/__tests__/ToggleGroup.disabled.test.tsx +0 -54
  1389. package/src/ToggleGroup/__tests__/ToggleGroup.dynamic-items.test.tsx +0 -70
  1390. package/src/ToggleGroup/__tests__/ToggleGroup.error-handling.test.tsx +0 -23
  1391. package/src/ToggleGroup/__tests__/ToggleGroup.keyboard-interaction.test.tsx +0 -173
  1392. package/src/ToggleGroup/__tests__/ToggleGroup.multiple-mode.test.tsx +0 -144
  1393. package/src/ToggleGroup/__tests__/ToggleGroup.reading-direction.test.tsx +0 -28
  1394. package/src/ToggleGroup/__tests__/ToggleGroup.ref-forwarding.test.tsx +0 -58
  1395. package/src/ToggleGroup/__tests__/ToggleGroup.single-mode.test.tsx +0 -139
  1396. package/src/ToggleGroup/hooks/index.ts +0 -2
  1397. package/src/ToggleGroup/hooks/useToggleGroupContext.ts +0 -1
  1398. package/src/ToggleGroup/hooks/useToggleGroupRoot.ts +0 -130
  1399. package/src/ToggleGroup/index.ts +0 -2
  1400. package/src/ToggleGroup/types.ts +0 -165
  1401. package/src/Tooltip/README.md +0 -214
  1402. package/src/Tooltip/Tooltip.tsx +0 -369
  1403. package/src/Tooltip/TooltipContext.ts +0 -20
  1404. package/src/Tooltip/__tests__/Tooltip.asChild.test.tsx +0 -77
  1405. package/src/Tooltip/__tests__/Tooltip.basic-rendering.test.tsx +0 -230
  1406. package/src/Tooltip/__tests__/Tooltip.controlled-state.test.tsx +0 -128
  1407. package/src/Tooltip/__tests__/Tooltip.error-handling.test.tsx +0 -37
  1408. package/src/Tooltip/__tests__/Tooltip.escape-hatches.test.tsx +0 -146
  1409. package/src/Tooltip/__tests__/Tooltip.focus-interaction.test.tsx +0 -88
  1410. package/src/Tooltip/__tests__/Tooltip.hover-interaction.test.tsx +0 -179
  1411. package/src/Tooltip/__tests__/Tooltip.keyboard-interaction.test.tsx +0 -219
  1412. package/src/Tooltip/__tests__/Tooltip.skip-delay.test.tsx +0 -232
  1413. package/src/Tooltip/__tests__/Tooltip.timer-coordination.test.tsx +0 -223
  1414. package/src/Tooltip/__tests__/Tooltip.uncontrolled-state.test.tsx +0 -67
  1415. package/src/Tooltip/hooks/__tests__/useTooltipProvider.test.tsx +0 -40
  1416. package/src/Tooltip/hooks/index.ts +0 -4
  1417. package/src/Tooltip/hooks/useTooltipContent.ts +0 -56
  1418. package/src/Tooltip/hooks/useTooltipProvider.ts +0 -79
  1419. package/src/Tooltip/hooks/useTooltipRoot.ts +0 -130
  1420. package/src/Tooltip/hooks/useTooltipTrigger.ts +0 -44
  1421. package/src/Tooltip/index.ts +0 -2
  1422. package/src/Tooltip/types.ts +0 -193
  1423. package/src/Tree/README.md +0 -403
  1424. package/src/Tree/Tree.tsx +0 -771
  1425. package/src/Tree/TreeContext.ts +0 -24
  1426. package/src/Tree/__tests__/Tree.aria.test.tsx +0 -53
  1427. package/src/Tree/__tests__/Tree.asChild.test.tsx +0 -134
  1428. package/src/Tree/__tests__/Tree.basic-rendering.test.tsx +0 -111
  1429. package/src/Tree/__tests__/Tree.branch-behaviour.test.tsx +0 -87
  1430. package/src/Tree/__tests__/Tree.controlled-expansion.test.tsx +0 -92
  1431. package/src/Tree/__tests__/Tree.data-attributes.test.tsx +0 -88
  1432. package/src/Tree/__tests__/Tree.disabled-items.test.tsx +0 -196
  1433. package/src/Tree/__tests__/Tree.error-handling.test.tsx +0 -71
  1434. package/src/Tree/__tests__/Tree.forceMount.test.tsx +0 -72
  1435. package/src/Tree/__tests__/Tree.keyboard-interaction.test.tsx +0 -150
  1436. package/src/Tree/__tests__/Tree.multiple-selection.test.tsx +0 -151
  1437. package/src/Tree/__tests__/Tree.range-selection.test.tsx +0 -200
  1438. package/src/Tree/__tests__/Tree.recursion-depth.test.tsx +0 -73
  1439. package/src/Tree/__tests__/Tree.roving-tabindex.test.tsx +0 -117
  1440. package/src/Tree/__tests__/Tree.selection-path.test.tsx +0 -404
  1441. package/src/Tree/__tests__/Tree.single-selection.test.tsx +0 -108
  1442. package/src/Tree/__tests__/Tree.styled-wrapper.test.tsx +0 -159
  1443. package/src/Tree/__tests__/Tree.uncontrolled-expansion.test.tsx +0 -69
  1444. package/src/Tree/hooks/index.ts +0 -3
  1445. package/src/Tree/hooks/useTreeItemKeyboard.ts +0 -86
  1446. package/src/Tree/hooks/useTreePath.ts +0 -100
  1447. package/src/Tree/hooks/useTreeRoot.ts +0 -279
  1448. package/src/Tree/index.ts +0 -8
  1449. package/src/Tree/types.ts +0 -298
  1450. package/src/Tree/utils.ts +0 -101
  1451. package/src/VisuallyHidden/README.md +0 -58
  1452. package/src/VisuallyHidden/VisuallyHidden.tsx +0 -94
  1453. package/src/VisuallyHidden/__tests__/VisuallyHidden.test.tsx +0 -73
  1454. package/src/VisuallyHidden/index.ts +0 -2
  1455. package/src/VisuallyHidden/types.ts +0 -19
  1456. package/src/hooks/index.ts +0 -4
  1457. package/src/hooks/useCollection.ts +0 -74
  1458. package/src/hooks/useControllableState.ts +0 -81
  1459. package/src/hooks/useRovingTabindex.ts +0 -178
  1460. package/src/hooks/useTypeahead.ts +0 -95
  1461. package/src/index.ts +0 -52
  1462. package/src/test/intersectionObserverPolyfill.ts +0 -90
  1463. package/src/test/popoverPolyfill.ts +0 -86
  1464. package/src/test/resizeObserverPolyfill.ts +0 -80
  1465. package/src/test/scrollPolyfill.ts +0 -23
  1466. package/src/types.ts +0 -14
  1467. package/src/useLocalStorage/__tests__/useLocalStorage.reading.test.tsx +0 -31
  1468. package/src/useLocalStorage/__tests__/useLocalStorage.resilience.test.tsx +0 -97
  1469. package/src/useLocalStorage/__tests__/useLocalStorage.ssr.test.tsx +0 -20
  1470. package/src/useLocalStorage/__tests__/useLocalStorage.writing.test.tsx +0 -72
  1471. package/src/useLocalStorage/index.ts +0 -1
  1472. package/src/useLocalStorage/useLocalStorage.ts +0 -140
  1473. package/src/useMediaQuery/README.md +0 -66
  1474. package/src/useMediaQuery/__tests__/useMediaQuery.matching.test.tsx +0 -42
  1475. package/src/useMediaQuery/__tests__/useMediaQuery.ssr.test.tsx +0 -19
  1476. package/src/useMediaQuery/__tests__/useMediaQuery.subscription.test.tsx +0 -89
  1477. package/src/useMediaQuery/index.ts +0 -1
  1478. package/src/useMediaQuery/useMediaQuery.ts +0 -49
  1479. package/src/usePagination/README.md +0 -170
  1480. package/src/usePagination/__tests__/usePagination.navigation.test.tsx +0 -109
  1481. package/src/usePagination/__tests__/usePagination.page-count.test.tsx +0 -56
  1482. package/src/usePagination/__tests__/usePagination.page-state.test.tsx +0 -87
  1483. package/src/usePagination/__tests__/usePagination.range.test.tsx +0 -82
  1484. package/src/usePagination/__tests__/usePagination.slice.test.tsx +0 -59
  1485. package/src/usePagination/__tests__/usePagination.windowing.test.tsx +0 -68
  1486. package/src/usePagination/index.ts +0 -1
  1487. package/src/usePagination/usePagination.ts +0 -292
  1488. package/src/utils/__tests__/createStrictContext.test.tsx +0 -69
  1489. package/src/utils/__tests__/deriveId.test.ts +0 -28
  1490. package/src/utils/__tests__/getKeyToActionMap.test.ts +0 -106
  1491. package/src/utils/createStrictContext.ts +0 -53
  1492. package/src/utils/deriveId.ts +0 -31
  1493. package/src/utils/focusable.ts +0 -15
  1494. package/src/utils/getKeyToActionMap.ts +0 -95
  1495. package/src/utils/index.ts +0 -4
@@ -1,1453 +0,0 @@
1
- import { createRef } from "react";
2
- import { render, act, fireEvent } from "@testing-library/react";
3
- import userEvent from "@testing-library/user-event";
4
-
5
- import { MockResizeObserver } from "../../test/resizeObserverPolyfill";
6
- import { Carousel } from "../index.ts";
7
- import type { CarouselImperativeApi } from "../index.ts";
8
-
9
- /**
10
- * Dispatch a pointer event with a controlled `timeStamp` (jsdom's is not
11
- * settable via fireEvent props) so drag velocity is deterministic. clientX and
12
- * clientY both carry `client` so the same helper drives either axis.
13
- */
14
- function pointer(
15
- target: Element,
16
- type: string,
17
- {
18
- client,
19
- time = 0,
20
- id = 1,
21
- pointerType = "touch",
22
- }: { client: number; time?: number; id?: number; pointerType?: string },
23
- ) {
24
- const event = new Event(type, { bubbles: true, cancelable: true });
25
- Object.assign(event, {
26
- clientX: client,
27
- clientY: client,
28
- pointerId: id,
29
- pointerType,
30
- });
31
- Object.defineProperty(event, "timeStamp", {
32
- configurable: true,
33
- value: time,
34
- });
35
- act(() => {
36
- fireEvent(target, event);
37
- });
38
- }
39
-
40
- /**
41
- * Fire the track's `transitionend` (jsdom runs no transitions, so the glide
42
- * settle that triggers the re-base is simulated). Carries `propertyName:
43
- * "transform"` — the engine ignores any other property.
44
- */
45
- function fireEnd(track: Element, propertyName = "transform") {
46
- const event = new Event("transitionend", { bubbles: true });
47
- Object.assign(event, { propertyName });
48
- act(() => {
49
- fireEvent(track, event);
50
- });
51
- }
52
-
53
- // The infinite transform engine (RFC 0018 / useCarouselLoop). Real geometry is
54
- // browser-only (jsdom lays nothing out), so these mock the layout the engine
55
- // reads (offsetLeft/Top, offsetWidth/Height, clientWidth/Height) and assert the
56
- // resulting track / per-slide transforms and the CSS transition that drives the
57
- // glide. Pixel behaviour and smoothness are verified in Playwright.
58
-
59
- const STRIDE = 100; // slide size + gap
60
- const SLIDE = 100;
61
- const VIEWPORT = 100; // → centre align offset 0, so transforms read cleanly
62
-
63
- function defineGeometry() {
64
- // A slide's layout position is its index × stride; every slide is SLIDE wide;
65
- // the viewport is VIEWPORT wide. Defined on the prototype so both axes read
66
- // the same numbers (horizontal uses left/width, vertical top/height).
67
- const indexPos = function (this: HTMLElement) {
68
- const index = this.getAttribute?.("data-index");
69
- return index != null ? Number(index) * STRIDE : 0;
70
- };
71
- const slideSize = function (this: HTMLElement) {
72
- return this.hasAttribute?.("data-carousel-slide") ? SLIDE : 0;
73
- };
74
- // The engine measures the TRACK's own content box (peek/padding is the
75
- // viewport's, kept out of the maths), so the harness sizes the track.
76
- const viewportSize = function (this: HTMLElement) {
77
- return this.hasAttribute?.("data-carousel-track") ? VIEWPORT : 0;
78
- };
79
- for (const [prop, get] of [
80
- ["offsetLeft", indexPos],
81
- ["offsetTop", indexPos],
82
- ["offsetWidth", slideSize],
83
- ["offsetHeight", slideSize],
84
- ["clientWidth", viewportSize],
85
- ["clientHeight", viewportSize],
86
- ] as const) {
87
- Object.defineProperty(HTMLElement.prototype, prop, {
88
- configurable: true,
89
- get,
90
- });
91
- }
92
- // The engine measures via getBoundingClientRect (sub-pixel). Compose the same
93
- // numbers into a rect: a slide starts at index × stride and is SLIDE big; the
94
- // track starts at 0 and is VIEWPORT big (its own content box). jsdom applies no
95
- // transform, so the mock is the pure layout the engine reads via differences.
96
- stdRect();
97
- }
98
-
99
- // Install a getBoundingClientRect that derives left/top/width/height from a
100
- // per-element { start, size } (both axes share the numbers, as the offsets do).
101
- function defineRect(
102
- layout: (this: HTMLElement) => { start: number; size: number },
103
- ) {
104
- Object.defineProperty(HTMLElement.prototype, "getBoundingClientRect", {
105
- configurable: true,
106
- value: function (this: HTMLElement) {
107
- const { start, size } = layout.call(this);
108
- return {
109
- left: start,
110
- top: start,
111
- right: start + size,
112
- bottom: start + size,
113
- width: size,
114
- height: size,
115
- x: start,
116
- y: start,
117
- toJSON() {},
118
- } as DOMRect;
119
- },
120
- });
121
- }
122
-
123
- // The standard rect layout, with per-test overrides: the track (and, by
124
- // default, the viewport around it — coincident with no peek/padding) is
125
- // `trackSize` wide, a slide is SLIDE, and a real slide (data-index) starts at
126
- // `startFor(i)` (default index × stride; negate for RTL, offset for the clone
127
- // buffer, zero to collapse the stride). Clones/other elements start at 0.
128
- function stdRect({
129
- trackSize = VIEWPORT,
130
- viewportSize = trackSize,
131
- startFor = (i: number) => i * STRIDE,
132
- }: {
133
- trackSize?: number;
134
- viewportSize?: number;
135
- startFor?: (index: number) => number;
136
- } = {}) {
137
- defineRect(function (this: HTMLElement) {
138
- const raw = this.getAttribute?.("data-index");
139
- const index = raw != null ? Number(raw) : null;
140
- const isTrack = this.hasAttribute?.("data-carousel-track");
141
- const isViewport = this.hasAttribute?.("data-carousel-viewport");
142
- const isSlide = this.hasAttribute?.("data-carousel-slide");
143
- return {
144
- start: index != null ? startFor(index) : 0,
145
- size: isTrack
146
- ? trackSize
147
- : isViewport
148
- ? viewportSize
149
- : isSlide
150
- ? SLIDE
151
- : 0,
152
- };
153
- });
154
- }
155
-
156
- beforeEach(() => {
157
- defineGeometry();
158
- });
159
-
160
- afterEach(() => {
161
- vi.restoreAllMocks();
162
- vi.unstubAllGlobals();
163
- for (const prop of [
164
- "offsetLeft",
165
- "offsetTop",
166
- "offsetWidth",
167
- "offsetHeight",
168
- "clientWidth",
169
- "clientHeight",
170
- "getBoundingClientRect",
171
- ]) {
172
- delete (HTMLElement.prototype as unknown as Record<string, unknown>)[prop];
173
- }
174
- });
175
-
176
- function renderInfinite(
177
- props: Partial<{
178
- loop: "infinite" | "wrap";
179
- orientation: "horizontal" | "vertical";
180
- snapAlign: "start" | "center" | "end";
181
- defaultPage: number;
182
- count: number;
183
- allowMouseDrag: boolean;
184
- slidesPerPage: number;
185
- apiRef: React.Ref<CarouselImperativeApi>;
186
- }> = {},
187
- ) {
188
- const {
189
- loop = "infinite",
190
- orientation = "horizontal",
191
- snapAlign = "center",
192
- defaultPage = 0,
193
- count = 4,
194
- allowMouseDrag = false,
195
- slidesPerPage = 1,
196
- apiRef,
197
- } = props;
198
- const result = render(
199
- <Carousel.Root
200
- ref={apiRef}
201
- ariaLabel="Featured products"
202
- loop={loop}
203
- orientation={orientation}
204
- snapAlign={snapAlign}
205
- defaultPage={defaultPage}
206
- allowMouseDrag={allowMouseDrag}
207
- slidesPerPage={slidesPerPage}
208
- >
209
- <Carousel.Viewport data-testid="viewport">
210
- {Array.from({ length: count }).map((_, i) => (
211
- <Carousel.Slide key={i} data-testid={`slide-${i}`} />
212
- ))}
213
- </Carousel.Viewport>
214
- <Carousel.PreviousTrigger>Previous</Carousel.PreviousTrigger>
215
- <Carousel.NextTrigger>Next</Carousel.NextTrigger>
216
- </Carousel.Root>,
217
- );
218
- const track = result.container.querySelector<HTMLElement>(
219
- "[data-carousel-track]",
220
- );
221
- return { ...result, track };
222
- }
223
-
224
- describe("Carousel infinite — transform engine", () => {
225
- it("wraps the real slides in a track for infinite, and not for other modes", () => {
226
- const infinite = renderInfinite({ loop: "infinite" });
227
- expect(infinite.track).not.toBeNull();
228
- // The real slides carry a data-index (the clones have it stripped).
229
- expect(
230
- infinite.track!.querySelectorAll("[data-carousel-slide][data-index]"),
231
- ).toHaveLength(4);
232
-
233
- const wrap = renderInfinite({ loop: "wrap" });
234
- expect(wrap.track).toBeNull();
235
- });
236
-
237
- it("flanks the real slides with a full period of aria-hidden, inert clones", () => {
238
- const { track } = renderInfinite({ count: 4 });
239
- const head = track!.querySelector('[data-carousel-clones="head"]')!;
240
- const tail = track!.querySelector('[data-carousel-clones="tail"]')!;
241
- // One period each side → a periodic strip whose every seam is painted DOM.
242
- expect(head.children).toHaveLength(4);
243
- expect(tail.children).toHaveLength(4);
244
- const clone = head.children[0] as HTMLElement;
245
- expect(clone.getAttribute("aria-hidden")).toBe("true");
246
- expect(clone.hasAttribute("inert")).toBe(true);
247
- expect(clone.hasAttribute("data-carousel-clone")).toBe(true);
248
- // A clone is presentational only — no index/state that would double-count.
249
- expect(clone.hasAttribute("data-index")).toBe(false);
250
- });
251
-
252
- it("rebuilds clones when a slide's own content changes, not just its count", async () => {
253
- // The builder toggles a slide's *content* (gradient <-> picture) without
254
- // changing the slide count/keys — the clone-rebuild effect's deps
255
- // (isInfinite, slideKeys, refreshTick) don't fire for that, so a stale
256
- // clone kept showing the OLD content until something else happened to
257
- // rebuild it. Crossing the seam then briefly shows the stale clone before
258
- // the settle re-base swaps in the fresh real slide at the same pixels —
259
- // "I still see the gradient momentarily, then it quickly changes to a
260
- // picture." Same key, same count, only the children differ.
261
- function App({ label }: { label: string }) {
262
- return (
263
- <Carousel.Root ariaLabel="Featured" loop="infinite">
264
- <Carousel.Viewport>
265
- {[0, 1, 2, 3].map((i) => (
266
- <Carousel.Slide key={i}>{label}</Carousel.Slide>
267
- ))}
268
- </Carousel.Viewport>
269
- </Carousel.Root>
270
- );
271
- }
272
- const { container, rerender } = render(<App label="gradient" />);
273
- const head = container.querySelector('[data-carousel-clones="head"]')!;
274
- expect(head.children[0]!.textContent).toBe("gradient");
275
-
276
- rerender(<App label="picture" />);
277
- // MutationObserver callbacks fire as a microtask, not synchronously
278
- // within rerender() — flush one before asserting the clone caught up.
279
- await act(async () => {
280
- await Promise.resolve();
281
- });
282
-
283
- expect(head.children[0]!.textContent).toBe("picture");
284
- });
285
-
286
- it("does not rebuild clones for the engine's own visibility/--slide-progress writes", async () => {
287
- // paint() writes `visibility` and `--slide-progress` onto every real
288
- // slide's inline style on every navigation, drag pointermove, and rAF
289
- // tick of an animated glide. The clone-content observer must not mistake
290
- // that continuous bookkeeping for a genuine consumer change, or it
291
- // thrashes rebuildClones() (full clone-strip teardown/rebuild) dozens of
292
- // times a second — exactly the DOM churn that made images flicker/blank
293
- // during a drag or glide. rebuildClones() replaces every clone with a
294
- // brand-new node (`replaceChildren` + fresh `cloneNode`s), so a rebuild
295
- // is observable as a change of node *identity* at `head.children[0]` —
296
- // comparing the node's own attributes to itself would prove nothing,
297
- // since a detached node's attributes never change after the fact.
298
- render(
299
- <Carousel.Root ariaLabel="Featured" loop="infinite">
300
- <Carousel.Viewport>
301
- {[0, 1, 2, 3].map((i) => (
302
- <Carousel.Slide key={i}>{i}</Carousel.Slide>
303
- ))}
304
- </Carousel.Viewport>
305
- </Carousel.Root>,
306
- );
307
- const head = document.querySelector('[data-carousel-clones="head"]')!;
308
- const realSlide = document.querySelector(
309
- '[data-carousel-slide][data-index="0"]',
310
- ) as HTMLElement;
311
- const cloneBefore = head.children[0];
312
-
313
- realSlide.style.visibility = "hidden";
314
- realSlide.style.setProperty("--slide-progress", "0.987654");
315
- await act(async () => {
316
- await Promise.resolve();
317
- });
318
-
319
- expect(head.children[0]).toBe(cloneBefore);
320
- });
321
-
322
- it("does not rebuild clones when a real slide's style attribute is cleared entirely", async () => {
323
- // Exercises the other half of the before/after style comparison: the
324
- // *current* side reading `null` (no style attribute at all) rather than
325
- // the *old* side. A plain slide's only inline style is the engine's own
326
- // visibility/--slide-progress, so removing the whole attribute strips to
327
- // the same "nothing" on both sides — still not a genuine content change.
328
- render(
329
- <Carousel.Root ariaLabel="Featured" loop="infinite">
330
- <Carousel.Viewport>
331
- {[0, 1, 2, 3].map((i) => (
332
- <Carousel.Slide key={i}>{i}</Carousel.Slide>
333
- ))}
334
- </Carousel.Viewport>
335
- </Carousel.Root>,
336
- );
337
- const head = document.querySelector('[data-carousel-clones="head"]')!;
338
- const realSlide = document.querySelector(
339
- '[data-carousel-slide][data-index="0"]',
340
- ) as HTMLElement;
341
- const cloneBefore = head.children[0];
342
-
343
- realSlide.removeAttribute("style");
344
- await act(async () => {
345
- await Promise.resolve();
346
- });
347
-
348
- expect(head.children[0]).toBe(cloneBefore);
349
- });
350
-
351
- it("still rebuilds clones when a slide's own inline style changes for real", async () => {
352
- // The reported bug used an inline-style content swap specifically (the
353
- // builder's gradient <-> picture toggle sets `style={{ background }}`
354
- // directly on the slide) — stripping the engine's own visibility/
355
- // --slide-progress properties out of the comparison (above) must not
356
- // also blind the observer to this genuine case.
357
- function App({ background }: { background: string }) {
358
- return (
359
- <Carousel.Root ariaLabel="Featured" loop="infinite">
360
- <Carousel.Viewport>
361
- {[0, 1, 2, 3].map((i) => (
362
- <Carousel.Slide key={i} style={{ background }} />
363
- ))}
364
- </Carousel.Viewport>
365
- </Carousel.Root>
366
- );
367
- }
368
- const { container, rerender } = render(<App background="red" />);
369
- const head = container.querySelector('[data-carousel-clones="head"]')!;
370
- expect((head.children[0] as HTMLElement).style.background).toBe("red");
371
-
372
- rerender(<App background="blue" />);
373
- await act(async () => {
374
- await Promise.resolve();
375
- });
376
-
377
- expect((head.children[0] as HTMLElement).style.background).toBe("blue");
378
- });
379
-
380
- it("rebuilds clones when a slide's own class (or any other attribute) changes", async () => {
381
- // Only "style" needs the finer before/after check (the engine and a
382
- // consumer both write it) and only data-state/data-index are routine
383
- // per-navigation noise — every other attribute a consumer might set
384
- // (className, aria-*, a data-* the app owns) still means genuinely new
385
- // clone content and must still trigger a rebuild.
386
- render(
387
- <Carousel.Root ariaLabel="Featured" loop="infinite">
388
- <Carousel.Viewport>
389
- {[0, 1, 2, 3].map((i) => (
390
- <Carousel.Slide key={i}>{i}</Carousel.Slide>
391
- ))}
392
- </Carousel.Viewport>
393
- </Carousel.Root>,
394
- );
395
- const head = document.querySelector('[data-carousel-clones="head"]')!;
396
- const realSlide = document.querySelector(
397
- '[data-carousel-slide][data-index="0"]',
398
- ) as HTMLElement;
399
- const cloneBefore = head.children[0];
400
-
401
- realSlide.className = "featured-slide";
402
- await act(async () => {
403
- await Promise.resolve();
404
- });
405
-
406
- expect(head.children[0]).not.toBe(cloneBefore);
407
- });
408
-
409
- it("keeps the offset within one period under rapid navigation (no run-off)", async () => {
410
- // Rapid Next clicks retarget the transition before it ends, so the settle
411
- // re-base never fires; without a start-of-glide re-base the offset accumulates
412
- // (+100 per click) and the track translates right off the one-period clone
413
- // buffer into unpainted space — a blank until you pause. Six Nexts on a 4-slide
414
- // loop must stay bounded to one period, not reach −600.
415
- const user = userEvent.setup();
416
- const { track, getByRole } = renderInfinite();
417
- const next = getByRole("button", { name: "Next" });
418
- for (let i = 0; i < 6; i++) await user.click(next);
419
- // 6 Nexts, re-based each glide: offset cycles 100,200,300,400→0,100,200 → −200.
420
- expect(track!.style.transform).toBe("translate(-200px, 0px)");
421
- });
422
-
423
- it("subtracts the first real slide's position so the clone buffer is offset out", () => {
424
- // In a real browser the leading clone buffer pushes real slide 0 to
425
- // offsetLeft = bufferWidth (measured track-relative). Simulate that: real
426
- // slides sit at (index + 4) × stride, so basePos = 400. The track transform
427
- // must subtract it (align − basePos − offset) so real slide 0 still rests at
428
- // `align`, not shoved off by the buffer.
429
- stdRect({ startFor: (i) => (i + 4) * STRIDE });
430
- const { track } = renderInfinite({ snapAlign: "center" });
431
- // align 0, basePos 400, offset 0 → translate(0 − 400 − 0) = −400.
432
- expect(track!.style.transform).toBe("translate(-400px, 0px)");
433
- });
434
-
435
- it("positions the track on the active page at rest, instantly (no glide on load)", () => {
436
- const { track } = renderInfinite({ snapAlign: "center" });
437
- // align (VIEWPORT−SLIDE)/2 = 0, offset 0 → translate3d(0). First paint is
438
- // instant, so no transition.
439
- expect(track!.style.transform).toBe("translate(0px, 0px)");
440
- expect(track!.style.transition).toBe("none");
441
- });
442
-
443
- it("glides forward one stride via a CSS transition when Next advances a page", async () => {
444
- const user = userEvent.setup();
445
- const { track, getByRole } = renderInfinite();
446
-
447
- await user.click(getByRole("button", { name: "Next" }));
448
-
449
- // Page 0 → 1: offset 1×stride = 100 → translate3d(align − 100) = −100, driven
450
- // by a transform transition (the smooth, GPU-composited glide).
451
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
452
- expect(track!.style.transition).toContain("transform");
453
- });
454
-
455
- it("drives the glide with the CSS custom properties when they are set", () => {
456
- // The engine reads --primitiv-carousel-glide-duration / -easing off the track
457
- // (a consumer sets them via a --glide-* preset or their own CSS) and builds the
458
- // transform transition from them, so glide timing and easing are customisable —
459
- // only for the infinite loop, which owns its JS transition (native modes glide
460
- // via browser scroll). Spy on getComputedStyle, delegating everything but the
461
- // two glide props to the real one.
462
- const real = window.getComputedStyle.bind(window);
463
- vi.spyOn(window, "getComputedStyle").mockImplementation((el: Element) => {
464
- const style = real(el);
465
- return new Proxy(style, {
466
- get(target, prop) {
467
- if (prop === "getPropertyValue")
468
- return (name: string) =>
469
- name === "--primitiv-carousel-glide-duration"
470
- ? "250ms"
471
- : name === "--primitiv-carousel-glide-easing"
472
- ? "ease-in"
473
- : target.getPropertyValue(name);
474
- const value = Reflect.get(target, prop);
475
- return typeof value === "function" ? value.bind(target) : value;
476
- },
477
- }) as CSSStyleDeclaration;
478
- });
479
- const { track, getByRole } = renderInfinite();
480
-
481
- fireEvent.click(getByRole("button", { name: "Next" }));
482
-
483
- expect(track!.style.transition).toBe("transform 250ms ease-in");
484
- });
485
-
486
- it("defaults the glide to 500ms ease-out when no custom properties are set", () => {
487
- // Fallback for the headless package with no registry stylesheet: the built-in
488
- // glide matches the default (`medium`) the stylesheet would otherwise supply.
489
- const { track, getByRole } = renderInfinite();
490
-
491
- fireEvent.click(getByRole("button", { name: "Next" }));
492
-
493
- expect(track!.style.transition).toBe(
494
- "transform 500ms cubic-bezier(0, 0, 0.2, 1)",
495
- );
496
- });
497
-
498
- it("wraps the SHORT way from the last page to the first, then re-bases", async () => {
499
- const user = userEvent.setup();
500
- // 4 slides, start on the last. The re-base normalizes the mount to offset 300
501
- // (real slide 3 at its own position) → translate3d(−300).
502
- const { track, getByRole } = renderInfinite({ defaultPage: 3 });
503
- expect(track!.style.transform).toBe("translate(-300px, 0px)");
504
-
505
- await user.click(getByRole("button", { name: "Next" }));
506
-
507
- // 3 → 0 is +1 forward: offset 300 → 400 (onto the clone of slide 0), a single
508
- // step onward, not a rewind. The glide animates to the clone...
509
- expect(track!.style.transform).toBe("translate(-400px, 0px)");
510
- expect(track!.style.transition).toContain("transform");
511
-
512
- // ...and once it settles the track re-bases by one period to the REAL slide 0
513
- // at the identical pixels (offset 0), instantly and invisibly.
514
- fireEnd(track!);
515
- expect(track!.style.transform).toBe("translate(0px, 0px)");
516
- expect(track!.style.transition).toBe("none");
517
- });
518
-
519
- it("travels the LITERAL way for a direct goTo jump, not the ring's wrap shortcut", () => {
520
- // Clicking the LAST indicator/thumbnail from the first should visibly pass
521
- // through every slide in between, matching the indicators' own reading
522
- // order — unlike Next/Previous, a direct jump has no "wrap" to shortcut.
523
- // 4 slides, start on the first (offset 0). shortestStep(0, 3, 4) would take
524
- // the ring's short way (a single step BACKWARD, onto the tail clone); the
525
- // literal distance is +3 forward instead.
526
- const ref = createRef<CarouselImperativeApi>();
527
- const { track } = renderInfinite({ apiRef: ref });
528
- expect(track!.style.transform).toBe("translate(0px, 0px)");
529
-
530
- act(() => {
531
- ref.current!.goTo(3);
532
- });
533
-
534
- // offset 0 → 300 (real slide 3's own position): +3 forward, not the -1
535
- // wrap shortcut (which would have read translate(100px, 0px)).
536
- expect(track!.style.transform).toBe("translate(-300px, 0px)");
537
- });
538
-
539
- it("travels the LITERAL way in reverse too — last page back to the first", () => {
540
- // The reverse of the above: starting on the last page and jumping to the
541
- // first should travel BACKWARD through every slide, not take the +1
542
- // wrap-forward shortcut onto the head clone.
543
- const ref = createRef<CarouselImperativeApi>();
544
- const { track } = renderInfinite({ apiRef: ref, defaultPage: 3 });
545
- expect(track!.style.transform).toBe("translate(-300px, 0px)");
546
-
547
- act(() => {
548
- ref.current!.goTo(0);
549
- });
550
-
551
- // offset 300 → 0: -3 backward, not the +1 wrap shortcut (which would have
552
- // read translate(-400px, 0px), the clone-of-0 pixel).
553
- expect(track!.style.transform).toBe("translate(0px, 0px)");
554
- });
555
-
556
- it("still wraps the SHORT way for next()/previous(), even after a direct goTo", () => {
557
- // The one-shot directJumpRef must not leak past the single navigation that
558
- // set it — a goTo() followed by a plain Next should go straight back to
559
- // using the wrap shortcut.
560
- const ref = createRef<CarouselImperativeApi>();
561
- const { track, getByRole } = renderInfinite({
562
- apiRef: ref,
563
- defaultPage: 3,
564
- });
565
- expect(track!.style.transform).toBe("translate(-300px, 0px)");
566
-
567
- act(() => {
568
- ref.current!.goTo(0);
569
- });
570
- expect(track!.style.transform).toBe("translate(0px, 0px)");
571
- fireEnd(track!);
572
-
573
- fireEvent.click(getByRole("button", { name: "Previous" }));
574
-
575
- // 0 → 3 the short way is -1 (onto the tail clone at offset -100), not the
576
- // literal -3 a leaked directJumpRef would have produced.
577
- expect(track!.style.transform).toBe("translate(100px, 0px)");
578
- });
579
-
580
- it("travels the literal way for a direct jump under slidesPerPage > 1 too", () => {
581
- // The literal-jump step is `currentPageOffset - logical` — both already
582
- // real SLIDE indices, not page indices, so the fix should compose with
583
- // slidesPerPage's own page->slide-index mapping (effectiveSlidesPerMove)
584
- // for free. Verifying it, not assuming it: 8 slides, 2 per page (pages
585
- // lead at slide index 0, 2, 4, 6). goTo(3) (last page, slide index 6)
586
- // from page 0 (slide index 0) — the ring's short way, shortestStep(0, 6,
587
- // 8), is -2 (backward onto the tail clone); the literal distance is +6
588
- // forward instead.
589
- // align shifts to -50 here (a 2-slide page span of 200 vs. the 100px
590
- // track — (100 − 200) / 2 — unlike the single-slide tests above, where
591
- // align is 0), so every transform below carries that same constant -50
592
- // offset; only the *difference* the jump produces is the point.
593
- const ref = createRef<CarouselImperativeApi>();
594
- const { track } = renderInfinite({
595
- apiRef: ref,
596
- count: 8,
597
- slidesPerPage: 2,
598
- });
599
- expect(track!.style.transform).toBe("translate(-50px, 0px)");
600
-
601
- act(() => {
602
- ref.current!.goTo(3);
603
- });
604
-
605
- // offset 0 → 600: +6 slides forward, not the -2 wrap shortcut (which
606
- // would have read translate(-50 + 200, 0px) = translate(150px, 0px)).
607
- expect(track!.style.transform).toBe("translate(-650px, 0px)");
608
- });
609
-
610
- it("never gives a real slide its own transform (all ride the track layer)", () => {
611
- // The seam is filled by clones, not by shifting individual slides, so no real
612
- // slide ever carries a transform — the whole strip paints into the track's one
613
- // compositor layer (an off-screen per-slide layer is the iOS white-flash).
614
- const { track } = renderInfinite({ defaultPage: 0 });
615
- const realSlides = track!.querySelectorAll<HTMLElement>(
616
- "[data-carousel-slide][data-index]",
617
- );
618
- expect(realSlides).toHaveLength(4);
619
- for (const slide of realSlides) expect(slide.style.transform).toBe("");
620
- });
621
-
622
- it("windows the painted set — hides slides far from the viewport at rest", () => {
623
- // The clone strip is far wider than the screen; iOS rasterises a wide
624
- // composited layer in tiles on demand, blanking the entering edge for a
625
- // frame. Windowing paints only the on-screen slides (plus a viewport of
626
- // slack) and `visibility: hidden`s the rest, so the composited surface is
627
- // ~one screen wide — a hidden slide is still laid out (measured, registered,
628
- // interactive when shown) but contributes nothing to rasterise.
629
- const { track } = renderInfinite({ count: 4 });
630
- const real = (i: number) =>
631
- track!.querySelector<HTMLElement>(
632
- `[data-carousel-slide][data-index="${i}"]`,
633
- )!;
634
- // At rest (offset 0, viewport 100) slide 0 is on-screen and slide 2 is
635
- // within the one-viewport margin; slide 3 (three strides right) is beyond
636
- // it → hidden.
637
- expect(real(0).style.visibility).toBe("");
638
- expect(real(2).style.visibility).toBe("");
639
- expect(real(3).style.visibility).toBe("hidden");
640
- });
641
-
642
- it("keeps --slide-progress live across a navigation, the way native scroll mode does", async () => {
643
- // Parallax (and any other consumer of the "Continuous scroll progress"
644
- // signal) reads --slide-progress. Native mode's effect (useCarouselViewport)
645
- // recomputes it from real scroll position — a `scroll` event fires on every
646
- // native scroll step. Under infinite, nothing ever scrolls (the engine
647
- // translates the TRACK via CSS transform instead), so that effect's
648
- // listeners never fire again after its one synchronous read on mount: the
649
- // signal is coincidentally correct at rest (mount happens to run after the
650
- // engine's own first paint) but then FROZEN forever — parallax would never
651
- // visibly drift on any subsequent navigation. Click Next and confirm the
652
- // newly-active slide (1) becomes centred (0) and the previously-active one
653
- // (0) moves off-centre (1) — this is what would stay stale without the
654
- // engine driving its own --slide-progress.
655
- const user = userEvent.setup();
656
- const { track, getByRole } = renderInfinite({ count: 4 });
657
- const real = (i: number) =>
658
- track!.querySelector<HTMLElement>(
659
- `[data-carousel-slide][data-index="${i}"]`,
660
- )!;
661
- expect(real(0).style.getPropertyValue("--slide-progress")).toBe("0");
662
-
663
- await user.click(getByRole("button", { name: "Next" }));
664
-
665
- expect(real(1).style.getPropertyValue("--slide-progress")).toBe("0");
666
- expect(real(0).style.getPropertyValue("--slide-progress")).toBe("-1");
667
- });
668
-
669
- it("defends --slide-progress against a zero-size track (divide-by-zero guard)", () => {
670
- // Mirrors the native scroll-progress signal's own defensive guard
671
- // (Carousel.scroll-progress.test.tsx) for the same reason: a 0 track (and,
672
- // by default, viewport) size — nothing measured yet — would otherwise
673
- // divide by zero. Covers both paint()'s analytic guard and the live
674
- // ticker's own copy of it (triggered by an animated glide).
675
- stdRect({ trackSize: 0 });
676
- vi.useFakeTimers();
677
- try {
678
- const { track, getByRole } = renderInfinite({ count: 4 });
679
- const real0 = track!.querySelector<HTMLElement>(
680
- '[data-carousel-slide][data-index="0"]',
681
- )!;
682
- expect(real0.style.getPropertyValue("--slide-progress")).toBe("0");
683
-
684
- fireEvent.click(getByRole("button", { name: "Next" }));
685
- expect(() => vi.advanceTimersToNextFrame()).not.toThrow();
686
- expect(real0.style.getPropertyValue("--slide-progress")).toBe("0");
687
- } finally {
688
- vi.useRealTimers();
689
- }
690
- });
691
-
692
- it("live-updates --slide-progress on the block axis for a vertical infinite loop", () => {
693
- // Same live ticker as the horizontal case, just the block-axis branch of
694
- // its viewport-center / slide-center math.
695
- vi.useFakeTimers();
696
- try {
697
- const { track, getByRole } = renderInfinite({
698
- count: 4,
699
- orientation: "vertical",
700
- });
701
- const real0 = track!.querySelector<HTMLElement>(
702
- '[data-carousel-slide][data-index="0"]',
703
- )!;
704
-
705
- fireEvent.click(getByRole("button", { name: "Next" }));
706
- expect(() => vi.advanceTimersToNextFrame()).not.toThrow();
707
- expect(real0.style.getPropertyValue("--slide-progress")).toBe("0");
708
- } finally {
709
- vi.useRealTimers();
710
- }
711
- });
712
-
713
- it("live-updates --slide-progress every frame while an animated glide is in flight, then stops on settle", () => {
714
- // Unlike paint()'s analytic value (set once, correct only for the settled
715
- // target), a button-driven glide's *visual* position is mid-transition for
716
- // its whole duration — parallax content needs to track that continuously or
717
- // it snaps to the end value instead of drifting alongside the slide. The
718
- // engine runs a rAF ticker for exactly the animated-glide duration, reading
719
- // live positions each frame. jsdom applies no real transform (this harness's
720
- // mocked rects are transform-invariant by design, like every other geometry
721
- // mock in this file), so the ticker's *value* can't be distinguished from
722
- // paint()'s here — device/Playwright confirms the visual drift — but its
723
- // code path (including the zero-guard) still runs and must not throw, and it
724
- // must stop itself once the transition ends (an indefinitely-running ticker
725
- // would burn a frame's work forever).
726
- vi.useFakeTimers();
727
- try {
728
- const { track, getByRole } = renderInfinite({ count: 4 });
729
- const real0 = track!.querySelector<HTMLElement>(
730
- '[data-carousel-slide][data-index="0"]',
731
- )!;
732
- const cancelSpy = vi.spyOn(window, "cancelAnimationFrame");
733
-
734
- fireEvent.click(getByRole("button", { name: "Next" }));
735
- expect(() => vi.advanceTimersToNextFrame()).not.toThrow();
736
- expect(real0.style.getPropertyValue("--slide-progress")).toBe("0");
737
-
738
- // The settle (transitionend) stops the ticker.
739
- fireEnd(track!);
740
- expect(cancelSpy).toHaveBeenCalled();
741
- } finally {
742
- vi.useRealTimers();
743
- }
744
- });
745
-
746
- it("strips ids from the cloned subtree so no id is duplicated", () => {
747
- const { container } = render(
748
- <Carousel.Root ariaLabel="Featured" loop="infinite">
749
- <Carousel.Viewport>
750
- <Carousel.Slide>
751
- <span id="deep-link">link</span>
752
- </Carousel.Slide>
753
- <Carousel.Slide />
754
- </Carousel.Viewport>
755
- </Carousel.Root>,
756
- );
757
- // The real subtree keeps its id; the clones (a full period each side) must not
758
- // duplicate it — exactly one #deep-link in the whole tree.
759
- expect(container.querySelectorAll("#deep-link")).toHaveLength(1);
760
- const head = container.querySelector('[data-carousel-clones="head"]')!;
761
- expect(head.querySelector("#deep-link")).toBeNull();
762
- expect(head.querySelector("span")).not.toBeNull(); // content still cloned
763
- });
764
-
765
- it("re-bases only when the settled offset is out of the real range", async () => {
766
- const user = userEvent.setup();
767
- const { track, getByRole } = renderInfinite();
768
-
769
- await user.click(getByRole("button", { name: "Next" }));
770
- // Offset 100 is already within [0, 400): the settle is a no-op, the transform
771
- // stays put (and the transition flips to none on the instant no-op repaint...
772
- // which doesn't run — the guard returns early, so the transition is untouched).
773
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
774
- fireEnd(track!);
775
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
776
- });
777
-
778
- it("ignores a transitionend for a property other than transform", async () => {
779
- const user = userEvent.setup();
780
- // defaultPage 3 rests at offset 300; Next glides to 400 (a clone) awaiting a
781
- // transform settle to re-base. A non-transform transitionend must not re-base.
782
- const { track, getByRole } = renderInfinite({ defaultPage: 3 });
783
- await user.click(getByRole("button", { name: "Next" }));
784
- expect(track!.style.transform).toBe("translate(-400px, 0px)");
785
-
786
- fireEnd(track!, "opacity");
787
- expect(track!.style.transform).toBe("translate(-400px, 0px)");
788
- // The real transform settle still re-bases.
789
- fireEnd(track!, "transform");
790
- expect(track!.style.transform).toBe("translate(0px, 0px)");
791
- });
792
-
793
- it("ignores a transform settle when there is nothing to measure", () => {
794
- // One slide → measure() bails, so a settle can't re-base (nothing to loop).
795
- const { track } = renderInfinite({ count: 1 });
796
- expect(() => fireEnd(track!)).not.toThrow();
797
- expect(track!.style.transform).toBe("");
798
- });
799
-
800
- it("jumps instantly with no transition under reduced motion", async () => {
801
- vi.stubGlobal("matchMedia", () => ({ matches: true }));
802
- const user = userEvent.setup();
803
- const { track, getByRole } = renderInfinite();
804
-
805
- await user.click(getByRole("button", { name: "Next" }));
806
-
807
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
808
- expect(track!.style.transition).toBe("none");
809
- });
810
-
811
- it("drives the block axis for a vertical infinite loop", async () => {
812
- const user = userEvent.setup();
813
- const { track, getByRole } = renderInfinite({ orientation: "vertical" });
814
-
815
- await user.click(getByRole("button", { name: "Next" }));
816
-
817
- expect(track!.style.transform).toBe("translate(0px, -100px)");
818
- });
819
-
820
- it("advances a whole page (not one slide) for multi-slide infinite", async () => {
821
- // 6 slides, 2 per page → pages lead at slide 0, 2, 4. Next must glide to the
822
- // next page's leading slide (index 2 = two strides), not one slide: the engine
823
- // has to drive off the page's leading slide index, not the page number.
824
- // The track holds the whole 2-slide page (span = stride + slide = 200), so it's
825
- // sized to 200 and the page rests flush (align 0) instead of one slide centred.
826
- stdRect({ trackSize: 200 });
827
- const user = userEvent.setup();
828
- const { track, getByRole } = renderInfinite({ count: 6, slidesPerPage: 2 });
829
-
830
- expect(track!.style.transform).toBe("translate(0px, 0px)");
831
-
832
- await user.click(getByRole("button", { name: "Next" }));
833
-
834
- // Page 0 → 1: leading slide 0 → 2, a two-stride glide (a full page), not −100.
835
- expect(track!.style.transform).toBe("translate(-200px, 0px)");
836
- });
837
-
838
- it("glides a multi-slide page back as a unit, no per-slide transform", async () => {
839
- // 6 slides, 2-up. Page forward to the last page then Previous back to page 1:
840
- // the whole track glides as one unit (offset 400 → 200) and every real slide
841
- // stays untransformed — the seam is filled by clones, so a trailing slide can
842
- // never be yanked off-screen ("disappear as the group moves").
843
- stdRect({ trackSize: 200 });
844
- const user = userEvent.setup();
845
- const { track, getByRole } = renderInfinite({ count: 6, slidesPerPage: 2 });
846
-
847
- await user.click(getByRole("button", { name: "Next" })); // page 1 (offset 200)
848
- await user.click(getByRole("button", { name: "Next" })); // page 2 (offset 400)
849
- await user.click(getByRole("button", { name: "Previous" })); // back to page 1
850
-
851
- // Page 2 → 1: the track glides back one page (offset 400 → 200)...
852
- expect(track!.style.transform).toBe("translate(-200px, 0px)");
853
- // ...and no real slide carries a transform of its own.
854
- for (const slide of track!.querySelectorAll<HTMLElement>(
855
- "[data-carousel-slide][data-index]",
856
- )) {
857
- expect(slide.style.transform).toBe("");
858
- }
859
- });
860
-
861
- it("glides a wide (4-up) page as a unit for any N-up count", async () => {
862
- // 9 slides, 4-up. A full backward page (page 1 → 0) glides the whole track and
863
- // leaves every real slide untransformed — the clone strip makes the wide-page
864
- // seam contiguous, so there's no antipode a trailing slide could teleport past.
865
- stdRect({ trackSize: 400 });
866
- const user = userEvent.setup();
867
- const { track, getByRole } = renderInfinite({ count: 9, slidesPerPage: 4 });
868
-
869
- await user.click(getByRole("button", { name: "Next" })); // page 1 (offset 400)
870
- await user.click(getByRole("button", { name: "Previous" })); // back to page 0
871
-
872
- expect(track!.style.transform).toBe("translate(0px, 0px)");
873
- for (const slide of track!.querySelectorAll<HTMLElement>(
874
- "[data-carousel-slide][data-index]",
875
- )) {
876
- expect(slide.style.transform).toBe("");
877
- }
878
- });
879
-
880
- it("lands a deep multi-slide page exactly (sub-pixel, no accumulated rounding)", () => {
881
- // offsetLeft/Width round to whole pixels; over a page several strides in that
882
- // rounding accumulates into a visible edge misalignment (one slide clipped by
883
- // the viewport, a gap at the other edge — the multi-slide bug). Fractional
884
- // geometry: slide 265.5 + gap 8 = stride 273.5, track 539 (a 2-up page). On the
885
- // LAST page (leading slide 4) the track must land at exactly 4 × 273.5, which a
886
- // whole-pixel stride (273 or 274) would miss by pixels.
887
- defineRect(function (this: HTMLElement) {
888
- const raw = this.getAttribute?.("data-index");
889
- const isTrack = this.hasAttribute?.("data-carousel-track");
890
- const isSlide = this.hasAttribute?.("data-carousel-slide");
891
- return {
892
- start: raw != null ? Number(raw) * 273.5 : 0,
893
- size: isTrack ? 539 : isSlide ? 265.5 : 0,
894
- };
895
- });
896
- const { track } = renderInfinite({
897
- count: 6,
898
- slidesPerPage: 2,
899
- defaultPage: 2,
900
- });
901
- // align (539 − pageSpan 539)/2 = 0, basePos 0, offset 4 × 273.5 = 1094.
902
- expect(track!.style.transform).toBe("translate(-1094px, 0px)");
903
- });
904
-
905
- it("mirrors the inline direction under RTL (negative stride)", async () => {
906
- // RTL reverses the flex row, so slide i's physical offsetLeft DECREASES with
907
- // i (slide 0 is rightmost). The engine reads the negative stride as dir = −1
908
- // rather than bailing, and mirrors the track translate.
909
- stdRect({ startFor: (i) => -i * STRIDE });
910
- const user = userEvent.setup();
911
- const { track, getByRole } = renderInfinite();
912
-
913
- // Page 0 rests at 0 (align 0), same as LTR.
914
- expect(track!.style.transform).toBe("translate(0px, 0px)");
915
-
916
- await user.click(getByRole("button", { name: "Next" }));
917
-
918
- // Next advances the inline-forward slide, which in RTL translates the track to
919
- // the RIGHT (+100) — the mirror of LTR's −100, still one step, no rewind.
920
- expect(track!.style.transform).toBe("translate(100px, 0px)");
921
- });
922
-
923
- it("offsets the track for start and end alignment", () => {
924
- // Widen the track so alignment is visible: redefine its clientWidth to 300.
925
- stdRect({ trackSize: 300 });
926
- const start = renderInfinite({ snapAlign: "start" });
927
- // start align = 0 → translate(0).
928
- expect(start.track!.style.transform).toBe("translate(0px, 0px)");
929
-
930
- const end = renderInfinite({ snapAlign: "end" });
931
- // end align = viewport(300) − slide(100) = 200 → translate(200).
932
- expect(end.track!.style.transform).toBe("translate(200px, 0px)");
933
- });
934
-
935
- it("mirrors start/end alignment under RTL (reading start is the right edge)", () => {
936
- // RTL: negative stride (dir −1) and a 300-wide track. The engine ignores a
937
- // slide's absolute offsetLeft (only its sign/magnitude), so the align term must
938
- // be dir-mirrored: reading "start" is the RIGHT edge (leading slide flush right,
939
- // trackShift W−slide = 200) and "end" is the LEFT edge (trackShift 0) — the
940
- // mirror of LTR. An unmirrored align swaps them.
941
- stdRect({ trackSize: 300, startFor: (i) => -i * STRIDE });
942
- const start = renderInfinite({ snapAlign: "start" });
943
- // Reading start = right: leading slide flush right → translate(300 − 100).
944
- expect(start.track!.style.transform).toBe("translate(200px, 0px)");
945
-
946
- const end = renderInfinite({ snapAlign: "end" });
947
- // Reading end = left: leading slide flush left → translate(0).
948
- expect(end.track!.style.transform).toBe("translate(0px, 0px)");
949
- });
950
-
951
- it("aligns against the track's own box, not the padded viewport (peek)", () => {
952
- // Under peek the viewport is padded and the track is inset + narrowed to the
953
- // slide (100). The engine measures the TRACK's own rect, so it aligns within
954
- // the track (100) and can't double-count the peek — it never reads the padded
955
- // viewport box at all.
956
- stdRect({ trackSize: 100 });
957
- const { track } = renderInfinite({ snapAlign: "center" });
958
- // align = (track 100 − slide 100) / 2 = 0 → no shift. (Measuring the padded
959
- // viewport 140 would read +20 and push the slide out of centre.)
960
- expect(track!.style.transform).toBe("translate(0px, 0px)");
961
- });
962
-
963
- it("does nothing when there are too few slides to loop", () => {
964
- const { track } = renderInfinite({ count: 1 });
965
- // measure() bails (count < 2) — the track renders but gets no transform.
966
- expect(track!.style.transform).toBe("");
967
- // A resize is a no-op too — the observer's re-home bails on the same measure.
968
- expect(() =>
969
- act(() => {
970
- MockResizeObserver.fireAll();
971
- }),
972
- ).not.toThrow();
973
- expect(track!.style.transform).toBe("");
974
- });
975
-
976
- it("does not loop when slides report a zero stride (not yet laid out)", () => {
977
- // Collapse every slide onto position 0 → stride 0 → measure bails.
978
- stdRect({ startFor: () => 0 });
979
- const { track } = renderInfinite();
980
- expect(track!.style.transform).toBe("");
981
- });
982
-
983
- it("re-measures and re-homes on a resize with the fresh geometry", () => {
984
- // The infinite engine gets no React signal for a CSS-driven size change (peek,
985
- // ratio, density, a container resize), so a ResizeObserver re-homes it. Mount on
986
- // page 2 at stride 100 (rests at −200); grow the stride to 150 and fire the
987
- // observer — it must re-home page 2 at the NEW stride (−300), not stay stale.
988
- const { track } = renderInfinite({ defaultPage: 2 });
989
- expect(track!.style.transform).toBe("translate(-200px, 0px)");
990
-
991
- stdRect({ startFor: (i) => i * 150 });
992
- act(() => {
993
- MockResizeObserver.fireAll();
994
- });
995
-
996
- expect(track!.style.transform).toBe("translate(-300px, 0px)");
997
- });
998
-
999
- it("ignores a spurious resize fire mid-glide instead of interrupting it", async () => {
1000
- // Real browsers fire a ResizeObserver callback once automatically right after
1001
- // `.observe()`, even with no actual size change (spec: report the initial
1002
- // size) — a mock only replicates on an explicit `.fireAll()`, but a device
1003
- // still gets this for free. An unconditional rehome would abort whatever the
1004
- // track is doing: mid-glide it kills the CSS transition, snaps to the rest
1005
- // position, and collapses the paint window to a point — hiding the slide
1006
- // still mid-transition ("current slide vanishes on Prev"). A same-geometry
1007
- // resize must be a no-op instead.
1008
- const user = userEvent.setup();
1009
- const { track, getByRole } = renderInfinite();
1010
-
1011
- await user.click(getByRole("button", { name: "Next" }));
1012
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
1013
- expect(track!.style.transition).toContain("transform");
1014
-
1015
- act(() => {
1016
- MockResizeObserver.fireAll();
1017
- });
1018
-
1019
- // The in-flight glide is untouched — not reset to the instant rest position.
1020
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
1021
- expect(track!.style.transition).toContain("transform");
1022
- });
1023
-
1024
- it("does not throw when the loop mode switches at runtime (slides reparent)", () => {
1025
- // Switching loop reparents the slides into / out of the transform track, so
1026
- // they unmount + re-register in the same commit that re-runs the native-scroll
1027
- // effects — the key is still in slideKeys but its element is momentarily out of
1028
- // slidesRef. Those effects must skip the orphaned key, not read
1029
- // getBoundingClientRect on `undefined` (white-screen crash in the builder).
1030
- function App({ loop }: { loop?: "infinite" | "wrap" }) {
1031
- return (
1032
- <Carousel.Root ariaLabel="Featured" loop={loop}>
1033
- <Carousel.Viewport>
1034
- {Array.from({ length: 4 }).map((_, i) => (
1035
- <Carousel.Slide key={i} />
1036
- ))}
1037
- </Carousel.Viewport>
1038
- </Carousel.Root>
1039
- );
1040
- }
1041
- const { rerender } = render(<App loop="infinite" />);
1042
- expect(() => rerender(<App loop="wrap" />)).not.toThrow();
1043
- expect(() => rerender(<App loop={undefined} />)).not.toThrow();
1044
- });
1045
-
1046
- it("re-homes the track without erroring when unmounted mid-interaction", async () => {
1047
- const user = userEvent.setup();
1048
- const { getByRole, unmount } = renderInfinite();
1049
- await user.click(getByRole("button", { name: "Next" }));
1050
- expect(() => act(() => unmount())).not.toThrow();
1051
- });
1052
- });
1053
-
1054
- describe("Carousel infinite — drag + fling", () => {
1055
- it("follows the pointer 1:1 while dragging, with no transition", () => {
1056
- // The repaint itself coalesces to one per animation frame (touch can
1057
- // report pointermove faster than the display refreshes), so a test
1058
- // checking the *painted* result needs to advance to that frame — offsetRef
1059
- // itself still updates synchronously (asserted separately below).
1060
- vi.useFakeTimers();
1061
- try {
1062
- const { track, getByTestId } = renderInfinite();
1063
- const viewport = getByTestId("viewport");
1064
-
1065
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1066
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1067
- vi.advanceTimersToNextFrame();
1068
-
1069
- // offset = startOffset(0) − (140 − 200) = 60 → track translate(align − 60).
1070
- // Dragging paints with no transition so the track tracks the finger.
1071
- expect(track!.style.transform).toBe("translate(-60px, 0px)");
1072
- expect(track!.style.transition).toBe("none");
1073
- } finally {
1074
- vi.useRealTimers();
1075
- }
1076
- });
1077
-
1078
- it("coalesces several pointermoves within the same frame into a single paint", () => {
1079
- // The whole point of deferring to rAF: two moves that both land before
1080
- // the browser's next frame should produce ONE repaint reflecting the
1081
- // LATEST position, not two repaints (or a stale one showing the first).
1082
- vi.useFakeTimers();
1083
- try {
1084
- const { track, getByTestId } = renderInfinite();
1085
- const viewport = getByTestId("viewport");
1086
-
1087
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1088
- pointer(viewport, "pointermove", { client: 170, time: 50 });
1089
- // No frame has run yet — still showing the pre-drag position.
1090
- expect(track!.style.transform).toBe("translate(0px, 0px)");
1091
-
1092
- // A second move, same (unflushed) frame.
1093
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1094
- expect(track!.style.transform).toBe("translate(0px, 0px)");
1095
-
1096
- vi.advanceTimersToNextFrame();
1097
-
1098
- // The single coalesced paint jumps straight to the latest offset (60),
1099
- // skipping the intermediate one (30) entirely.
1100
- expect(track!.style.transform).toBe("translate(-60px, 0px)");
1101
- } finally {
1102
- vi.useRealTimers();
1103
- }
1104
- });
1105
-
1106
- it("settles back to the current slide when the drag stays under half a stride", () => {
1107
- // Also covers flushDragFrame's no-op branch: the coalesced repaint is
1108
- // flushed by advancing to its frame *before* release, so onPointerUp's
1109
- // own flush call finds nothing pending.
1110
- vi.useFakeTimers();
1111
- try {
1112
- const { track, getByTestId } = renderInfinite();
1113
- const viewport = getByTestId("viewport");
1114
-
1115
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1116
- pointer(viewport, "pointermove", { client: 180, time: 100 });
1117
- // A second move at the same point zeroes the release velocity.
1118
- pointer(viewport, "pointermove", { client: 180, time: 200 });
1119
- vi.advanceTimersToNextFrame();
1120
- pointer(viewport, "pointerup", { client: 180, time: 220 });
1121
-
1122
- // offset 20, velocity 0 → snap to the nearest stride (0). Back home, animated.
1123
- expect(track!.style.transform).toBe("translate(0px, 0px)");
1124
- expect(track!.style.transition).toContain("transform");
1125
- } finally {
1126
- vi.useRealTimers();
1127
- }
1128
- });
1129
-
1130
- it("advances a slide when the drag passes the half-stride point", () => {
1131
- const { track, getByTestId } = renderInfinite();
1132
- const viewport = getByTestId("viewport");
1133
-
1134
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1135
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1136
- pointer(viewport, "pointermove", { client: 140, time: 200 });
1137
- pointer(viewport, "pointerup", { client: 140, time: 220 });
1138
-
1139
- // offset 60, velocity 0 → snaps forward to stride 100 (page 1).
1140
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
1141
- });
1142
-
1143
- it("flings forward when a quick flick carries the projected distance past half a stride", () => {
1144
- const { track, getByTestId } = renderInfinite();
1145
- const viewport = getByTestId("viewport");
1146
-
1147
- // Truthy timestamps: React's SyntheticEvent does `nativeEvent.timeStamp ||
1148
- // Date.now()`, so a falsy 0 on the first event would be replaced by the real
1149
- // clock and skew the first elapsed — this gesture depends on real velocity.
1150
- pointer(viewport, "pointerdown", { client: 200, time: 1000 });
1151
- // Only 30px of travel (would settle home) but at 0.6px/ms.
1152
- pointer(viewport, "pointermove", { client: 170, time: 1050 });
1153
- pointer(viewport, "pointerup", { client: 170, time: 1050 });
1154
-
1155
- // flingTarget(30, 0.6, 120, 100) = snap(30 + 72) = 100 → the flick advances.
1156
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
1157
- });
1158
-
1159
- it("keeps a seam-crossing fling's own glide animated, instead of an instant snap", () => {
1160
- // A fling's release drives the track directly via its own glideTo() call
1161
- // (which may deliberately target a clone position — the same "animate
1162
- // onto the clone, rebase on settle" pattern a click-driven glide uses),
1163
- // then separately calls goTo() to sync `currentPage`. That goTo() is a
1164
- // state update, and the SAME positioning effect that drives Next/Previous
1165
- // also reacts to it — its own boundGlideStart() rebases *before*
1166
- // computing anything, and unlike a click (which never lands off the
1167
- // clone buffer until the fling's own target does), a fling crossing the
1168
- // seam usually lands EXACTLY one trackLength past a real position — so
1169
- // without a way to tell the effect "this navigation is already handled",
1170
- // the rebase fires for real and instantly snaps the just-started
1171
- // animated glide to its settled position before the browser renders a
1172
- // single frame of it. Reported by a human tester as "the release/settle
1173
- // snaps abruptly" on touch swipes crossing the seam specifically.
1174
- // 8 slides, resting on the last (offset 700, trackLength 800). Drag
1175
- // forward with a quick, deterministic flick: flingTarget(760, 1.2, 120,
1176
- // 100) = snap(760 + 144) = 900 — one trackLength (800) past a real
1177
- // position, so normalizeOffset(900, 800) = 100 !== 900: the rebase would
1178
- // fire for real if nothing stopped it.
1179
- const { track, getByTestId } = renderInfinite({ count: 8, defaultPage: 7 });
1180
- const viewport = getByTestId("viewport");
1181
-
1182
- pointer(viewport, "pointerdown", { client: 200, time: 1000 });
1183
- pointer(viewport, "pointermove", { client: 140, time: 1050 });
1184
- pointer(viewport, "pointerup", { client: 140, time: 1050 });
1185
-
1186
- // The fling's true target (900), still animated — not an instant snap to
1187
- // the rebased equivalent (100).
1188
- expect(track!.style.transform).toBe("translate(-900px, 0px)");
1189
- expect(track!.style.transition).toContain("transform");
1190
- });
1191
-
1192
- it("keeps a seam-crossing fling animated under slidesPerPage > 1 too", () => {
1193
- // The fling snaps to a PAGE boundary (pageStride = stride *
1194
- // effectiveSlidesPerMove), not a single slide — verifying the same
1195
- // rebase-collision fix composes with that coarser granularity, not just
1196
- // the single-slide case above. 8 slides, 2 per page (pageStride 200),
1197
- // resting on the last page (slide index 6, offset 600, trackLength 800).
1198
- // flingTarget(660, 1.2, 120, 200) = snap(660 + 144) = 800 — exactly
1199
- // trackLength, so normalizeOffset(800, 800) = 0 !== 800: the rebase
1200
- // would fire for real if nothing stopped it, same as the single-slide
1201
- // case, just landing on a different boundary (a whole page-stride out).
1202
- // align is -50 here (a 2-slide page span of 200 vs. the 100px track),
1203
- // so every transform below carries that same constant offset.
1204
- const { track, getByTestId } = renderInfinite({
1205
- count: 8,
1206
- slidesPerPage: 2,
1207
- defaultPage: 3,
1208
- });
1209
- const viewport = getByTestId("viewport");
1210
-
1211
- pointer(viewport, "pointerdown", { client: 200, time: 1000 });
1212
- pointer(viewport, "pointermove", { client: 140, time: 1050 });
1213
- pointer(viewport, "pointerup", { client: 140, time: 1050 });
1214
-
1215
- // The fling's true target (800), still animated — not an instant snap
1216
- // to the rebased equivalent (0, which would have read translate(-50px,
1217
- // 0px)).
1218
- expect(track!.style.transform).toBe("translate(-850px, 0px)");
1219
- expect(track!.style.transition).toContain("transform");
1220
- });
1221
-
1222
- it("treats a press that never crosses the threshold as a tap (no move, no glide)", () => {
1223
- const { track, getByTestId } = renderInfinite();
1224
- const viewport = getByTestId("viewport");
1225
-
1226
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1227
- pointer(viewport, "pointermove", { client: 202, time: 50 }); // 2px < 3px
1228
- pointer(viewport, "pointerup", { client: 202, time: 60 });
1229
-
1230
- // Never became a drag: the track stays put and no fling runs.
1231
- expect(track!.style.transform).toBe("translate(0px, 0px)");
1232
- });
1233
-
1234
- it("ignores mouse drags unless allowMouseDrag is set", () => {
1235
- const { track, getByTestId } = renderInfinite({ allowMouseDrag: false });
1236
- const viewport = getByTestId("viewport");
1237
-
1238
- pointer(viewport, "pointerdown", {
1239
- client: 200,
1240
- time: 0,
1241
- pointerType: "mouse",
1242
- });
1243
- pointer(viewport, "pointermove", {
1244
- client: 120,
1245
- time: 100,
1246
- pointerType: "mouse",
1247
- });
1248
- pointer(viewport, "pointerup", {
1249
- client: 120,
1250
- time: 120,
1251
- pointerType: "mouse",
1252
- });
1253
-
1254
- // pointerdown bailed on the mouse gate, so no drag state was ever created.
1255
- expect(track!.style.transform).toBe("translate(0px, 0px)");
1256
- });
1257
-
1258
- it("drags with the mouse when allowMouseDrag is set", () => {
1259
- vi.useFakeTimers();
1260
- try {
1261
- const { track, getByTestId } = renderInfinite({ allowMouseDrag: true });
1262
- const viewport = getByTestId("viewport");
1263
-
1264
- pointer(viewport, "pointerdown", {
1265
- client: 200,
1266
- time: 0,
1267
- pointerType: "mouse",
1268
- });
1269
- pointer(viewport, "pointermove", {
1270
- client: 140,
1271
- time: 100,
1272
- pointerType: "mouse",
1273
- });
1274
- vi.advanceTimersToNextFrame();
1275
-
1276
- expect(track!.style.transform).toBe("translate(-60px, 0px)");
1277
- } finally {
1278
- vi.useRealTimers();
1279
- }
1280
- });
1281
-
1282
- it("drags along the block axis for a vertical loop", () => {
1283
- vi.useFakeTimers();
1284
- try {
1285
- const { track, getByTestId } = renderInfinite({
1286
- orientation: "vertical",
1287
- });
1288
- const viewport = getByTestId("viewport");
1289
-
1290
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1291
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1292
- vi.advanceTimersToNextFrame();
1293
-
1294
- // Vertical reads clientY (the helper sets both), so the block axis moves.
1295
- expect(track!.style.transform).toBe("translate(0px, -60px)");
1296
- } finally {
1297
- vi.useRealTimers();
1298
- }
1299
- });
1300
-
1301
- it("skips the velocity update when two moves share a timestamp", () => {
1302
- vi.useFakeTimers();
1303
- try {
1304
- const { track, getByTestId } = renderInfinite();
1305
- const viewport = getByTestId("viewport");
1306
-
1307
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1308
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1309
- // Same timestamp → elapsed 0 → velocity keeps its prior value, no divide.
1310
- pointer(viewport, "pointermove", { client: 100, time: 100 });
1311
- vi.advanceTimersToNextFrame();
1312
-
1313
- // The move still repositions (offset 100) even though velocity wasn't updated.
1314
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
1315
- } finally {
1316
- vi.useRealTimers();
1317
- }
1318
- });
1319
-
1320
- it("sweeps the wrap frame's window instead of just the post-wrap point", () => {
1321
- // A drag that crosses the loop seam wraps offsetRef by a whole trackLength
1322
- // in a single pointermove (normalizeOffset) — a discontinuity in the raw
1323
- // number, even though the finger only moved a normal few px. Painting that
1324
- // frame with the post-wrap value alone (the pre-fix behaviour) computes a
1325
- // window around only where the drag ended up, not where it came from —
1326
- // the same "entering edge blanks for a frame" risk the click-glide's own
1327
- // swept window already exists to avoid, just reached here by a drag's
1328
- // continuous wrap instead of an animated transition.
1329
- // 8 slides, starting on the last (rest offset 700, trackLength 800).
1330
- // Dragging forward past the end: move 1 lands just before the wrap
1331
- // (raw 790), move 2 crosses it (raw 810 -> wraps to 10). A real slide
1332
- // sitting near the middle of the strip (index 4, edge 400) is far
1333
- // outside a window centred on the post-wrap value (10) alone, but falls
1334
- // inside the swept range [790, 10] the fix passes to paint() instead.
1335
- vi.useFakeTimers();
1336
- try {
1337
- const { getByTestId, container } = renderInfinite({
1338
- count: 8,
1339
- defaultPage: 7,
1340
- });
1341
- const viewport = getByTestId("viewport");
1342
-
1343
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1344
- pointer(viewport, "pointermove", { client: 110, time: 50 });
1345
- pointer(viewport, "pointermove", { client: 90, time: 100 });
1346
- vi.advanceTimersToNextFrame();
1347
-
1348
- const midSlide = container.querySelector<HTMLElement>(
1349
- '[data-carousel-slide][data-index="4"]',
1350
- )!;
1351
- expect(midSlide.style.visibility).toBe("");
1352
- } finally {
1353
- vi.useRealTimers();
1354
- }
1355
- });
1356
-
1357
- it("ignores pointer events from a second, different pointer", () => {
1358
- vi.useFakeTimers();
1359
- try {
1360
- const { track, getByTestId } = renderInfinite();
1361
- const viewport = getByTestId("viewport");
1362
-
1363
- pointer(viewport, "pointerdown", { client: 200, time: 0, id: 1 });
1364
- // A different pointerId must not steer or end the active drag.
1365
- pointer(viewport, "pointermove", { client: 500, time: 50, id: 2 });
1366
- pointer(viewport, "pointerup", { client: 500, time: 60, id: 2 });
1367
- // The original pointer still drives it.
1368
- pointer(viewport, "pointermove", { client: 140, time: 100, id: 1 });
1369
- vi.advanceTimersToNextFrame();
1370
-
1371
- expect(track!.style.transform).toBe("translate(-60px, 0px)");
1372
- } finally {
1373
- vi.useRealTimers();
1374
- }
1375
- });
1376
-
1377
- it("ignores a move with no active drag", () => {
1378
- const { track, getByTestId } = renderInfinite();
1379
- const viewport = getByTestId("viewport");
1380
-
1381
- // A move with no preceding pointerdown is a no-op (nothing to steer).
1382
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1383
-
1384
- expect(track!.style.transform).toBe("translate(0px, 0px)");
1385
- });
1386
-
1387
- it("does not start a drag when there is nothing to loop", () => {
1388
- const { track, getByTestId } = renderInfinite({ count: 1 });
1389
- const viewport = getByTestId("viewport");
1390
-
1391
- // measure() bails (count < 2), so pointerdown records no drag state.
1392
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1393
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1394
-
1395
- expect(track!.style.transform).toBe("");
1396
- });
1397
-
1398
- it("snaps a multi-slide fling to the nearest PAGE, not the nearest slide", () => {
1399
- // 6 slides, 2 per page → pages lead at slide 0, 2, 4 (page stride = 200). A
1400
- // drag of 120px is past the half-PAGE point (100) so it should advance a whole
1401
- // page to offset 200. Snapping to the nearest SLIDE instead lands on slide 1
1402
- // (offset 100) mid-page, whose page is 0, so the page effect then jerks back to
1403
- // offset 0 — the two-step this fixes.
1404
- stdRect({ trackSize: 200 });
1405
- const { track, getByTestId } = renderInfinite({
1406
- count: 6,
1407
- slidesPerPage: 2,
1408
- });
1409
- const viewport = getByTestId("viewport");
1410
-
1411
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1412
- pointer(viewport, "pointermove", { client: 80, time: 100 }); // offset 120
1413
- pointer(viewport, "pointermove", { client: 80, time: 200 }); // zero velocity
1414
- pointer(viewport, "pointerup", { client: 80, time: 220 });
1415
-
1416
- // Page-snap → offset 200 (page 1 lead), a single glide. Slide-snap would land
1417
- // on offset 100 then bounce back to 0.
1418
- expect(track!.style.transform).toBe("translate(-200px, 0px)");
1419
- });
1420
-
1421
- it("ends a drag cleanly on pointercancel", () => {
1422
- const { track, getByTestId } = renderInfinite();
1423
- const viewport = getByTestId("viewport");
1424
-
1425
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1426
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1427
- pointer(viewport, "pointermove", { client: 140, time: 200 });
1428
- // Cancel resolves the fling the same way a release does.
1429
- pointer(viewport, "pointercancel", { client: 140, time: 220 });
1430
-
1431
- expect(track!.style.transform).toBe("translate(-100px, 0px)");
1432
- });
1433
-
1434
- it("cancels a pending coalesced repaint on unmount", () => {
1435
- // Otherwise a still-scheduled rAF would fire against a detached track
1436
- // once the component (and its DOM) are gone.
1437
- vi.useFakeTimers();
1438
- try {
1439
- const { getByTestId, unmount } = renderInfinite();
1440
- const viewport = getByTestId("viewport");
1441
- const cancelSpy = vi.spyOn(window, "cancelAnimationFrame");
1442
-
1443
- pointer(viewport, "pointerdown", { client: 200, time: 0 });
1444
- pointer(viewport, "pointermove", { client: 140, time: 100 });
1445
- // Left pending on purpose — no advanceTimersToNextFrame() before unmount.
1446
-
1447
- expect(() => act(() => unmount())).not.toThrow();
1448
- expect(cancelSpy).toHaveBeenCalled();
1449
- } finally {
1450
- vi.useRealTimers();
1451
- }
1452
- });
1453
- });