@basic-ui/core 0.0.52 → 0.0.53

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 (408) hide show
  1. package/README.md +3 -3
  2. package/build/cjs/index.js +105 -89
  3. package/build/cjs/index.js.map +1 -1
  4. package/build/esm/Accordion/Accordion.d.ts +9 -9
  5. package/build/esm/Accordion/Accordion.js.map +1 -1
  6. package/build/esm/Accordion/AccordionBody.d.ts +6 -6
  7. package/build/esm/Accordion/AccordionBody.js.map +1 -1
  8. package/build/esm/Accordion/AccordionHeader.d.ts +7 -7
  9. package/build/esm/Accordion/AccordionHeader.js.map +1 -1
  10. package/build/esm/Accordion/AccordionItem.d.ts +9 -9
  11. package/build/esm/Accordion/AccordionItem.js.map +1 -1
  12. package/build/esm/Accordion/context.d.ts +19 -19
  13. package/build/esm/Accordion/context.js.map +1 -1
  14. package/build/esm/Accordion/index.d.ts +4 -4
  15. package/build/esm/Accordion/index.js.map +1 -1
  16. package/build/esm/Accordion/scopeQuery.d.ts +2 -2
  17. package/build/esm/Accordion/scopeQuery.js.map +1 -1
  18. package/build/esm/Carousel/Carousel.d.ts +9 -0
  19. package/build/esm/Carousel/Carousel.js +38 -0
  20. package/build/esm/Carousel/Carousel.js.map +1 -0
  21. package/build/esm/Carousel/Fader.d.ts +14 -0
  22. package/build/esm/Carousel/Fader.js +76 -0
  23. package/build/esm/Carousel/Fader.js.map +1 -0
  24. package/build/esm/Carousel/FaderItem.d.ts +5 -0
  25. package/build/esm/Carousel/FaderItem.js +16 -0
  26. package/build/esm/Carousel/FaderItem.js.map +1 -0
  27. package/build/esm/Carousel/Preloader.d.ts +7 -0
  28. package/build/esm/Carousel/Preloader.js +70 -0
  29. package/build/esm/Carousel/Preloader.js.map +1 -0
  30. package/build/esm/Carousel/Slider.d.ts +14 -0
  31. package/build/esm/Carousel/Slider.js +212 -0
  32. package/build/esm/Carousel/Slider.js.map +1 -0
  33. package/build/esm/Carousel/SliderItem.d.ts +12 -0
  34. package/build/esm/Carousel/SliderItem.js +41 -0
  35. package/build/esm/Carousel/SliderItem.js.map +1 -0
  36. package/build/esm/Carousel/context.d.ts +10 -0
  37. package/build/esm/Carousel/context.js +8 -0
  38. package/build/esm/Carousel/context.js.map +1 -0
  39. package/build/esm/Carousel/getSliderParams.d.ts +9 -0
  40. package/build/esm/Carousel/getSliderParams.js +85 -0
  41. package/build/esm/Carousel/getSliderParams.js.map +1 -0
  42. package/build/esm/Carousel/index.d.ts +7 -0
  43. package/build/esm/Carousel/index.js +8 -0
  44. package/build/esm/Carousel/index.js.map +1 -0
  45. package/build/esm/Carousel/useCarouselGestures.d.ts +30 -0
  46. package/build/esm/Carousel/useCarouselGestures.js +33 -0
  47. package/build/esm/Carousel/useCarouselGestures.js.map +1 -0
  48. package/build/esm/CheckBox/CheckBox.d.ts +7 -7
  49. package/build/esm/CheckBox/CheckBox.js.map +1 -1
  50. package/build/esm/CheckBox/index.d.ts +1 -1
  51. package/build/esm/CheckBox/index.js.map +1 -1
  52. package/build/esm/ComboBox/Combobox.d.ts +18 -18
  53. package/build/esm/ComboBox/Combobox.js.map +1 -1
  54. package/build/esm/ComboBox/ComboboxButton.d.ts +9 -9
  55. package/build/esm/ComboBox/ComboboxButton.js.map +1 -1
  56. package/build/esm/ComboBox/ComboboxInput.d.ts +17 -17
  57. package/build/esm/ComboBox/ComboboxInput.js.map +1 -1
  58. package/build/esm/ComboBox/ComboboxLabel.d.ts +7 -7
  59. package/build/esm/ComboBox/ComboboxLabel.js.map +1 -1
  60. package/build/esm/ComboBox/ComboboxList.d.ts +8 -8
  61. package/build/esm/ComboBox/ComboboxList.js.map +1 -1
  62. package/build/esm/ComboBox/ComboboxOption.d.ts +11 -11
  63. package/build/esm/ComboBox/ComboboxOption.js.map +1 -1
  64. package/build/esm/ComboBox/ComboboxPopover.d.ts +9 -9
  65. package/build/esm/ComboBox/ComboboxPopover.js.map +1 -1
  66. package/build/esm/ComboBox/cities.d.ts +5 -5
  67. package/build/esm/ComboBox/cities.js.map +1 -1
  68. package/build/esm/ComboBox/context.d.ts +30 -30
  69. package/build/esm/ComboBox/context.js.map +1 -1
  70. package/build/esm/ComboBox/hooks.d.ts +37 -37
  71. package/build/esm/ComboBox/hooks.js.map +1 -1
  72. package/build/esm/ComboBox/index.d.ts +8 -8
  73. package/build/esm/ComboBox/index.js.map +1 -1
  74. package/build/esm/ComboBox/makeHash.d.ts +1 -1
  75. package/build/esm/ComboBox/makeHash.js.map +1 -1
  76. package/build/esm/ComboBox/scopeQuery.d.ts +1 -1
  77. package/build/esm/ComboBox/scopeQuery.js.map +1 -1
  78. package/build/esm/DatePicker/DatePicker.d.ts +24 -0
  79. package/build/esm/DatePicker/DatePicker.js +101 -0
  80. package/build/esm/DatePicker/DatePicker.js.map +1 -0
  81. package/build/esm/DatePicker/DatePickerSelect.d.ts +8 -0
  82. package/build/esm/DatePicker/DatePickerSelect.js +201 -0
  83. package/build/esm/DatePicker/DatePickerSelect.js.map +1 -0
  84. package/build/esm/DatePicker/RangeDatePicker.d.ts +28 -0
  85. package/build/esm/DatePicker/RangeDatePicker.js +94 -0
  86. package/build/esm/DatePicker/RangeDatePicker.js.map +1 -0
  87. package/build/esm/DatePicker/adjustDates.d.ts +4 -0
  88. package/build/esm/DatePicker/adjustDates.js +18 -0
  89. package/build/esm/DatePicker/adjustDates.js.map +1 -0
  90. package/build/esm/DatePicker/contexts.d.ts +31 -0
  91. package/build/esm/DatePicker/contexts.js +15 -0
  92. package/build/esm/DatePicker/contexts.js.map +1 -0
  93. package/build/esm/DatePicker/dateTypes.d.ts +2 -0
  94. package/build/esm/DatePicker/dateTypes.js +2 -0
  95. package/build/esm/DatePicker/dateTypes.js.map +1 -0
  96. package/build/esm/DatePicker/hooks.d.ts +36 -0
  97. package/build/esm/DatePicker/hooks.js +98 -0
  98. package/build/esm/DatePicker/hooks.js.map +1 -0
  99. package/build/esm/DatePicker/index.d.ts +5 -0
  100. package/build/esm/DatePicker/index.js +6 -0
  101. package/build/esm/DatePicker/index.js.map +1 -0
  102. package/build/esm/FocusLock/FocusLock.d.ts +9 -9
  103. package/build/esm/FocusLock/FocusLock.js.map +1 -1
  104. package/build/esm/FocusLock/index.d.ts +1 -1
  105. package/build/esm/FocusLock/index.js.map +1 -1
  106. package/build/esm/FocusLock/tabUtils.d.ts +3 -3
  107. package/build/esm/FocusLock/tabUtils.js.map +1 -1
  108. package/build/esm/FocusLock/useFocusLock.d.ts +7 -7
  109. package/build/esm/FocusLock/useFocusLock.js.map +1 -1
  110. package/build/esm/List/List.d.ts +7 -7
  111. package/build/esm/List/List.js.map +1 -1
  112. package/build/esm/List/ListItem.d.ts +7 -7
  113. package/build/esm/List/ListItem.js.map +1 -1
  114. package/build/esm/List/context.d.ts +4 -4
  115. package/build/esm/List/context.js.map +1 -1
  116. package/build/esm/List/index.d.ts +2 -2
  117. package/build/esm/List/index.js.map +1 -1
  118. package/build/esm/Menu/ContextMenuTrigger.d.ts +11 -11
  119. package/build/esm/Menu/ContextMenuTrigger.js.map +1 -1
  120. package/build/esm/Menu/Menu.d.ts +10 -10
  121. package/build/esm/Menu/Menu.js.map +1 -1
  122. package/build/esm/Menu/MenuButton.d.ts +11 -11
  123. package/build/esm/Menu/MenuButton.js.map +1 -1
  124. package/build/esm/Menu/MenuItem.d.ts +8 -8
  125. package/build/esm/Menu/MenuItem.js.map +1 -1
  126. package/build/esm/Menu/MenuList.d.ts +7 -7
  127. package/build/esm/Menu/MenuList.js.map +1 -1
  128. package/build/esm/Menu/MenuPopover.d.ts +8 -8
  129. package/build/esm/Menu/MenuPopover.js.map +1 -1
  130. package/build/esm/Menu/context.d.ts +25 -25
  131. package/build/esm/Menu/context.js.map +1 -1
  132. package/build/esm/Menu/fixtures/countryList.d.ts +1 -1
  133. package/build/esm/Menu/fixtures/countryList.js.map +1 -1
  134. package/build/esm/Menu/index.d.ts +6 -6
  135. package/build/esm/Menu/index.js.map +1 -1
  136. package/build/esm/Menu/scope.d.ts +1 -1
  137. package/build/esm/Menu/scope.js.map +1 -1
  138. package/build/esm/Modal/Modal.d.ts +9 -9
  139. package/build/esm/Modal/Modal.js.map +1 -1
  140. package/build/esm/Modal/ModalBackdrop.d.ts +10 -10
  141. package/build/esm/Modal/ModalBackdrop.js.map +1 -1
  142. package/build/esm/Modal/index.d.ts +2 -2
  143. package/build/esm/Modal/index.js.map +1 -1
  144. package/build/esm/Popper/Popper.d.ts +35 -35
  145. package/build/esm/Popper/Popper.js.map +1 -1
  146. package/build/esm/Popper/PopperArrow.d.ts +6 -6
  147. package/build/esm/Popper/PopperArrow.js.map +1 -1
  148. package/build/esm/Popper/context.d.ts +6 -6
  149. package/build/esm/Popper/context.js.map +1 -1
  150. package/build/esm/Popper/index.d.ts +3 -3
  151. package/build/esm/Popper/index.js.map +1 -1
  152. package/build/esm/Portal/Portal.d.ts +7 -6
  153. package/build/esm/Portal/Portal.js +6 -3
  154. package/build/esm/Portal/Portal.js.map +1 -1
  155. package/build/esm/Portal/PortalSelectorProvider.d.ts +8 -0
  156. package/build/esm/Portal/PortalSelectorProvider.js +13 -0
  157. package/build/esm/Portal/PortalSelectorProvider.js.map +1 -0
  158. package/build/esm/Portal/index.d.ts +2 -1
  159. package/build/esm/Portal/index.js +1 -0
  160. package/build/esm/Portal/index.js.map +1 -1
  161. package/build/esm/RadioButton/RadioButton.d.ts +10 -10
  162. package/build/esm/RadioButton/RadioButton.js.map +1 -1
  163. package/build/esm/RadioButton/RadioGroup.d.ts +12 -12
  164. package/build/esm/RadioButton/RadioGroup.js.map +1 -1
  165. package/build/esm/RadioButton/context.d.ts +9 -9
  166. package/build/esm/RadioButton/context.js.map +1 -1
  167. package/build/esm/RadioButton/index.d.ts +2 -2
  168. package/build/esm/RadioButton/index.js.map +1 -1
  169. package/build/esm/SkipNav/SkipNav.d.ts +7 -7
  170. package/build/esm/SkipNav/SkipNav.js.map +1 -1
  171. package/build/esm/SkipNav/index.d.ts +1 -1
  172. package/build/esm/SkipNav/index.js.map +1 -1
  173. package/build/esm/Slider/Slider.d.ts +197 -197
  174. package/build/esm/Slider/Slider.js +82 -82
  175. package/build/esm/Slider/Slider.js.map +1 -1
  176. package/build/esm/Slider/index.d.ts +1 -1
  177. package/build/esm/Slider/index.js.map +1 -1
  178. package/build/esm/Spinner/Spinner.d.ts +12 -12
  179. package/build/esm/Spinner/Spinner.js.map +1 -1
  180. package/build/esm/Spinner/SpinnerButton.d.ts +8 -8
  181. package/build/esm/Spinner/SpinnerButton.js.map +1 -1
  182. package/build/esm/Spinner/context.d.ts +12 -12
  183. package/build/esm/Spinner/context.js.map +1 -1
  184. package/build/esm/Spinner/index.d.ts +2 -2
  185. package/build/esm/Spinner/index.js.map +1 -1
  186. package/build/esm/Tabs/Tab.d.ts +7 -7
  187. package/build/esm/Tabs/Tab.js.map +1 -1
  188. package/build/esm/Tabs/TabList.d.ts +9 -9
  189. package/build/esm/Tabs/TabList.js.map +1 -1
  190. package/build/esm/Tabs/TabPanel.d.ts +8 -8
  191. package/build/esm/Tabs/TabPanel.js.map +1 -1
  192. package/build/esm/Tabs/TabPanels.d.ts +8 -8
  193. package/build/esm/Tabs/TabPanels.js.map +1 -1
  194. package/build/esm/Tabs/Tabs.d.ts +10 -10
  195. package/build/esm/Tabs/Tabs.js.map +1 -1
  196. package/build/esm/Tabs/context.d.ts +17 -17
  197. package/build/esm/Tabs/context.js.map +1 -1
  198. package/build/esm/Tabs/index.d.ts +5 -5
  199. package/build/esm/Tabs/index.js.map +1 -1
  200. package/build/esm/Tabs/scopeQuery.d.ts +1 -1
  201. package/build/esm/Tabs/scopeQuery.js.map +1 -1
  202. package/build/esm/Tooltip/Tooltip.d.ts +10 -10
  203. package/build/esm/Tooltip/Tooltip.js.map +1 -1
  204. package/build/esm/Tooltip/index.d.ts +1 -1
  205. package/build/esm/Tooltip/index.js.map +1 -1
  206. package/build/esm/Tooltip/stateMachine.d.ts +28 -28
  207. package/build/esm/Tooltip/stateMachine.js.map +1 -1
  208. package/build/esm/Tooltip/useTooltip.d.ts +10 -10
  209. package/build/esm/Tooltip/useTooltip.js.map +1 -1
  210. package/build/esm/hooks/index.d.ts +13 -13
  211. package/build/esm/hooks/index.js.map +1 -1
  212. package/build/esm/hooks/useAutoFocus.d.ts +2 -2
  213. package/build/esm/hooks/useAutoFocus.js.map +1 -1
  214. package/build/esm/hooks/useChildrenCounter.d.ts +7 -7
  215. package/build/esm/hooks/useChildrenCounter.js.map +1 -1
  216. package/build/esm/hooks/useControlledState.d.ts +3 -3
  217. package/build/esm/hooks/useFocusReturn.d.ts +2 -2
  218. package/build/esm/hooks/useFocusReturn.js.map +1 -1
  219. package/build/esm/hooks/useFocusState.d.ts +11 -11
  220. package/build/esm/hooks/useFocusState.js.map +1 -1
  221. package/build/esm/hooks/useGestureHandlers.d.ts +52 -52
  222. package/build/esm/hooks/useGestureHandlers.js.map +1 -1
  223. package/build/esm/hooks/useId.d.ts +1 -0
  224. package/build/esm/hooks/useId.js +25 -0
  225. package/build/esm/hooks/useId.js.map +1 -0
  226. package/build/esm/hooks/useMeasure.d.ts +7 -7
  227. package/build/esm/hooks/useMeasure.js.map +1 -1
  228. package/build/esm/hooks/useOnClickOutside.d.ts +2 -2
  229. package/build/esm/hooks/useOnClickOutside.js.map +1 -1
  230. package/build/esm/hooks/useOnKeyDown.d.ts +1 -1
  231. package/build/esm/hooks/useOnKeyDown.js.map +1 -1
  232. package/build/esm/hooks/useReducerMachine.d.ts +24 -24
  233. package/build/esm/hooks/useReducerMachine.js.map +1 -1
  234. package/build/esm/hooks/useRemoveBodyScroll.d.ts +2 -2
  235. package/build/esm/hooks/useRemoveBodyScroll.js.map +1 -1
  236. package/build/esm/hooks/useScope.d.ts +11 -11
  237. package/build/esm/hooks/useScope.js.map +1 -1
  238. package/build/esm/hooks/useThrottle.d.ts +1 -1
  239. package/build/esm/hooks/useThrottle.js.map +1 -1
  240. package/build/esm/index.d.ts +15 -15
  241. package/build/esm/index.js.map +1 -1
  242. package/build/esm/utils/assign-ref.d.ts +3 -3
  243. package/build/esm/utils/assign-ref.js.map +1 -1
  244. package/build/esm/utils/assignRef.d.ts +3 -0
  245. package/build/esm/utils/assignRef.js +25 -0
  246. package/build/esm/utils/assignRef.js.map +1 -0
  247. package/build/esm/utils/can-use-dom.d.ts +1 -1
  248. package/build/esm/utils/can-use-dom.js.map +1 -1
  249. package/build/esm/utils/clamp.d.ts +1 -1
  250. package/build/esm/utils/clamp.js.map +1 -1
  251. package/build/esm/utils/context.d.ts +7 -7
  252. package/build/esm/utils/context.js.map +1 -1
  253. package/build/esm/utils/create-subscription.d.ts +4 -4
  254. package/build/esm/utils/create-subscription.js.map +1 -1
  255. package/build/esm/utils/get-circular-index.d.ts +1 -1
  256. package/build/esm/utils/get-circular-index.js.map +1 -1
  257. package/build/esm/utils/getCircularIndex.d.ts +1 -0
  258. package/build/esm/utils/getCircularIndex.js +8 -0
  259. package/build/esm/utils/getCircularIndex.js.map +1 -0
  260. package/build/esm/utils/index.d.ts +10 -10
  261. package/build/esm/utils/index.js.map +1 -1
  262. package/build/esm/utils/is-right-click.d.ts +6 -6
  263. package/build/esm/utils/is-right-click.js +4 -4
  264. package/build/esm/utils/is-right-click.js.map +1 -1
  265. package/build/esm/utils/owner-document.d.ts +7 -7
  266. package/build/esm/utils/owner-document.js +5 -5
  267. package/build/esm/utils/owner-document.js.map +1 -1
  268. package/build/esm/utils/polymorphic.d.ts +39 -39
  269. package/build/esm/utils/polymorphic.js.map +1 -1
  270. package/build/esm/utils/rubber-band-clamp.d.ts +2 -2
  271. package/build/esm/utils/rubber-band-clamp.js.map +1 -1
  272. package/build/esm/utils/rubberBandClamp.d.ts +2 -0
  273. package/build/esm/utils/rubberBandClamp.js +20 -0
  274. package/build/esm/utils/rubberBandClamp.js.map +1 -0
  275. package/build/esm/utils/use-stable-callback.d.ts +16 -16
  276. package/build/esm/utils/use-stable-callback.js +16 -16
  277. package/build/esm/utils/use-stable-callback.js.map +1 -1
  278. package/build/esm/utils/wrap-event.d.ts +3 -3
  279. package/build/esm/utils/wrap-event.js.map +1 -1
  280. package/build/esm/utils/wrapEvent.d.ts +3 -0
  281. package/build/esm/utils/wrapEvent.js +16 -0
  282. package/build/esm/utils/wrapEvent.js.map +1 -0
  283. package/build/tsconfig-build.tsbuildinfo +1 -1
  284. package/build/tsconfig.tsbuildinfo +7270 -0
  285. package/package.json +2 -2
  286. package/src/Accordion/Accordion.story.tsx +74 -74
  287. package/src/Accordion/Accordion.tsx +59 -59
  288. package/src/Accordion/AccordionBody.tsx +52 -52
  289. package/src/Accordion/AccordionHeader.tsx +167 -167
  290. package/src/Accordion/AccordionItem.tsx +50 -50
  291. package/src/Accordion/context.ts +37 -37
  292. package/src/Accordion/index.ts +4 -4
  293. package/src/Accordion/scopeQuery.ts +7 -7
  294. package/src/Accordion/styles.css +21 -21
  295. package/src/CheckBox/CheckBox.tsx +41 -41
  296. package/src/CheckBox/index.ts +1 -1
  297. package/src/ComboBox/ComboBox.story.tsx +120 -120
  298. package/src/ComboBox/Combobox.tsx +148 -148
  299. package/src/ComboBox/ComboboxButton.tsx +61 -61
  300. package/src/ComboBox/ComboboxInput.tsx +187 -187
  301. package/src/ComboBox/ComboboxLabel.tsx +33 -33
  302. package/src/ComboBox/ComboboxList.tsx +47 -47
  303. package/src/ComboBox/ComboboxOption.tsx +111 -111
  304. package/src/ComboBox/ComboboxPopover.tsx +64 -64
  305. package/src/ComboBox/cities.ts +23194 -23194
  306. package/src/ComboBox/context.ts +35 -35
  307. package/src/ComboBox/hooks.tsx +451 -451
  308. package/src/ComboBox/index.ts +8 -8
  309. package/src/ComboBox/makeHash.ts +19 -19
  310. package/src/ComboBox/scopeQuery.ts +6 -6
  311. package/src/ComboBox/styles.css +32 -32
  312. package/src/FocusLock/FocusLock.tsx +66 -66
  313. package/src/FocusLock/index.ts +1 -1
  314. package/src/FocusLock/tabUtils.ts +40 -40
  315. package/src/FocusLock/useFocusLock.ts +56 -56
  316. package/src/List/List.story.tsx +18 -18
  317. package/src/List/List.tsx +17 -17
  318. package/src/List/ListItem.tsx +23 -23
  319. package/src/List/context.ts +19 -19
  320. package/src/List/index.ts +2 -2
  321. package/src/Menu/ContextMenu.story.tsx +73 -73
  322. package/src/Menu/ContextMenuTrigger.tsx +76 -76
  323. package/src/Menu/Menu.story.tsx +160 -160
  324. package/src/Menu/Menu.tsx +83 -83
  325. package/src/Menu/MenuButton.tsx +83 -83
  326. package/src/Menu/MenuComplex.story.tsx +58 -58
  327. package/src/Menu/MenuItem.tsx +88 -88
  328. package/src/Menu/MenuList.tsx +254 -254
  329. package/src/Menu/MenuPopover.tsx +35 -35
  330. package/src/Menu/context.ts +44 -44
  331. package/src/Menu/fixtures/countryList.ts +198 -198
  332. package/src/Menu/index.ts +6 -6
  333. package/src/Menu/scope.ts +7 -7
  334. package/src/Menu/styles.css +42 -42
  335. package/src/Modal/Modal.story.tsx +258 -258
  336. package/src/Modal/Modal.tsx +48 -48
  337. package/src/Modal/ModalBackdrop.tsx +78 -78
  338. package/src/Modal/NavDrawer.story.tsx +158 -158
  339. package/src/Modal/index.ts +2 -2
  340. package/src/Modal/styles.css +46 -46
  341. package/src/Popper/Popper.story.tsx +263 -263
  342. package/src/Popper/Popper.tsx +154 -154
  343. package/src/Popper/PopperArrow.tsx +35 -35
  344. package/src/Popper/context.ts +10 -10
  345. package/src/Popper/index.ts +3 -3
  346. package/src/Popper/styles.css +60 -60
  347. package/src/Portal/Portal.tsx +31 -20
  348. package/src/Portal/PortalSelectorProvider.tsx +24 -0
  349. package/src/Portal/index.ts +6 -1
  350. package/src/RadioButton/RadioButton.story.tsx +77 -77
  351. package/src/RadioButton/RadioButton.tsx +55 -55
  352. package/src/RadioButton/RadioGroup.tsx +60 -60
  353. package/src/RadioButton/context.ts +17 -17
  354. package/src/RadioButton/index.ts +2 -2
  355. package/src/SkipNav/SkipNav.tsx +16 -16
  356. package/src/SkipNav/index.tsx +1 -1
  357. package/src/Slider/Slider.story.tsx +45 -45
  358. package/src/Slider/Slider.tsx +1120 -1120
  359. package/src/Slider/index.ts +1 -1
  360. package/src/Slider/styles.css +131 -131
  361. package/src/Spinner/Spinner.story.tsx +31 -31
  362. package/src/Spinner/Spinner.tsx +117 -117
  363. package/src/Spinner/SpinnerButton.tsx +54 -54
  364. package/src/Spinner/context.ts +20 -20
  365. package/src/Spinner/index.ts +2 -2
  366. package/src/Spinner/styles.css +23 -23
  367. package/src/Tabs/Tab.story.tsx +80 -80
  368. package/src/Tabs/Tab.tsx +136 -136
  369. package/src/Tabs/TabList.tsx +71 -71
  370. package/src/Tabs/TabPanel.tsx +53 -53
  371. package/src/Tabs/TabPanels.tsx +30 -30
  372. package/src/Tabs/Tabs.tsx +46 -46
  373. package/src/Tabs/context.ts +30 -30
  374. package/src/Tabs/index.tsx +5 -5
  375. package/src/Tabs/scopeQuery.ts +6 -6
  376. package/src/Tooltip/Tooltip.story.tsx +61 -61
  377. package/src/Tooltip/Tooltip.tsx +50 -50
  378. package/src/Tooltip/index.ts +1 -1
  379. package/src/Tooltip/stateMachine.ts +192 -192
  380. package/src/Tooltip/styles.css +17 -17
  381. package/src/Tooltip/useTooltip.ts +136 -136
  382. package/src/hooks/index.ts +13 -13
  383. package/src/hooks/useAutoFocus.ts +22 -22
  384. package/src/hooks/useChildrenCounter.ts +51 -51
  385. package/src/hooks/useFocusReturn.ts +43 -43
  386. package/src/hooks/useFocusState.ts +30 -30
  387. package/src/hooks/useGestureHandlers.ts +286 -286
  388. package/src/hooks/useMeasure.ts +33 -33
  389. package/src/hooks/useOnClickOutside.ts +32 -32
  390. package/src/hooks/useOnKeyDown.ts +19 -19
  391. package/src/hooks/useReducerMachine.ts +60 -60
  392. package/src/hooks/useRemoveBodyScroll.ts +39 -39
  393. package/src/hooks/useScope.ts +52 -52
  394. package/src/hooks/useThrottle.ts +19 -19
  395. package/src/index.ts +20 -20
  396. package/src/utils/assign-ref.ts +27 -27
  397. package/src/utils/can-use-dom.ts +7 -7
  398. package/src/utils/clamp.ts +3 -3
  399. package/src/utils/context.tsx +48 -48
  400. package/src/utils/create-subscription.ts +16 -16
  401. package/src/utils/get-circular-index.ts +7 -7
  402. package/src/utils/index.ts +10 -10
  403. package/src/utils/is-right-click.ts +14 -14
  404. package/src/utils/owner-document.ts +13 -13
  405. package/src/utils/polymorphic.ts +78 -78
  406. package/src/utils/rubber-band-clamp.ts +25 -25
  407. package/src/utils/use-stable-callback.ts +58 -58
  408. package/src/utils/wrap-event.ts +22 -22
@@ -1,120 +1,120 @@
1
- import type { ChangeEvent } from 'react';
2
- import { useMemo, useState } from 'react';
3
-
4
- import { ComboboxOption } from './ComboboxOption';
5
- import { ComboboxList } from './ComboboxList';
6
- import { ComboboxPopover } from './ComboboxPopover';
7
- import { ComboboxInput } from './ComboboxInput';
8
- import { ComboboxLabel } from './ComboboxLabel';
9
- import { Combobox } from './Combobox';
10
- import cities from './cities';
11
- import './styles.css';
12
-
13
- export default {
14
- title: 'components/Combobox',
15
- };
16
-
17
- function useCityMatch(searchTerm: string) {
18
- return useMemo(() => {
19
- const term = searchTerm.trim().toLowerCase();
20
- return term === ''
21
- ? []
22
- : cities.filter(
23
- (city) =>
24
- city.city.toLowerCase().indexOf(term) !== -1 ||
25
- city.state.toLowerCase().indexOf(term) !== -1
26
- );
27
- }, [searchTerm]);
28
- }
29
-
30
- export function UncontrolledClientSideExample({ initialValue = '' }) {
31
- const [term, setTerm] = useState(initialValue);
32
- const [selected, setSelected] = useState(initialValue);
33
- const results = useCityMatch(term);
34
-
35
- const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
36
- setTerm(event.target.value);
37
- };
38
-
39
- const handleSelect = (value: string) => {
40
- setSelected(value);
41
- };
42
-
43
- return (
44
- <div>
45
- <h2>Clientside Search</h2>
46
- <p>Selection: {selected}</p>
47
- <p>Term: {term}</p>
48
- <Combobox onSelect={handleSelect} selectOnBlur>
49
- <ComboboxLabel>Enter a city name</ComboboxLabel>
50
- <br />
51
- <ComboboxInput onChange={handleChange} defaultValue={initialValue} />
52
- {results.length > 0 && (
53
- <ComboboxPopover>
54
- <ComboboxList persistSelection={true}>
55
- {results.slice(0, 100).map((result, index) => (
56
- <ComboboxOption
57
- key={`${result.city}, ${result.state}, ${index}`}
58
- id={`${result.city}, ${result.state}, ${index}`}
59
- text={`${result.city}, ${result.state}`}
60
- value={result}
61
- />
62
- ))}
63
- </ComboboxList>
64
- </ComboboxPopover>
65
- )}
66
- </Combobox>
67
- </div>
68
- );
69
- }
70
-
71
- export function ControlledClientSideExample({ initialValue = '' }) {
72
- const [term, setTerm] = useState(initialValue);
73
- const [selected, setSelected] = useState(initialValue);
74
- const results = useCityMatch(term);
75
-
76
- const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
77
- setTerm(event.target.value);
78
- setSelected('');
79
- };
80
-
81
- const handleSelect = (value: string) => {
82
- setSelected(value);
83
- };
84
-
85
- return (
86
- <div>
87
- <h2>Clientside Search</h2>
88
- <p>Selection: {selected}</p>
89
- <p>Term: {term}</p>
90
- <Combobox onSelect={handleSelect} selectOnBlur>
91
- <ComboboxLabel>Enter a city name</ComboboxLabel>
92
- <br />
93
- <ComboboxInput onChange={handleChange} value={selected || term} />
94
- {results.length > 0 && (
95
- <ComboboxPopover>
96
- <ComboboxList persistSelection={true}>
97
- {results.slice(0, 10).map((result, index) => (
98
- <ComboboxOption
99
- key={`${result.city}, ${result.state}, ${index}`}
100
- id={`${result.city}, ${result.state}, ${index}`}
101
- text={`${result.city}, ${result.state}`}
102
- value={result}
103
- />
104
- ))}
105
- </ComboboxList>
106
- </ComboboxPopover>
107
- )}
108
- </Combobox>
109
- </div>
110
- );
111
- }
112
-
113
- export const UncontrolledClientSide = () => <UncontrolledClientSideExample />;
114
- export const UncontrolledClientSideInitial = () => (
115
- <UncontrolledClientSideExample initialValue="Aberdeen" />
116
- );
117
- export const ControlledClientSide = () => <ControlledClientSideExample />;
118
- export const ControlledClientsideInitial = () => (
119
- <ControlledClientSideExample initialValue="Aberdeen" />
120
- );
1
+ import type { ChangeEvent } from 'react';
2
+ import { useMemo, useState } from 'react';
3
+
4
+ import { ComboboxOption } from './ComboboxOption';
5
+ import { ComboboxList } from './ComboboxList';
6
+ import { ComboboxPopover } from './ComboboxPopover';
7
+ import { ComboboxInput } from './ComboboxInput';
8
+ import { ComboboxLabel } from './ComboboxLabel';
9
+ import { Combobox } from './Combobox';
10
+ import cities from './cities';
11
+ import './styles.css';
12
+
13
+ export default {
14
+ title: 'components/Combobox',
15
+ };
16
+
17
+ function useCityMatch(searchTerm: string) {
18
+ return useMemo(() => {
19
+ const term = searchTerm.trim().toLowerCase();
20
+ return term === ''
21
+ ? []
22
+ : cities.filter(
23
+ (city) =>
24
+ city.city.toLowerCase().indexOf(term) !== -1 ||
25
+ city.state.toLowerCase().indexOf(term) !== -1
26
+ );
27
+ }, [searchTerm]);
28
+ }
29
+
30
+ export function UncontrolledClientSideExample({ initialValue = '' }) {
31
+ const [term, setTerm] = useState(initialValue);
32
+ const [selected, setSelected] = useState(initialValue);
33
+ const results = useCityMatch(term);
34
+
35
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
36
+ setTerm(event.target.value);
37
+ };
38
+
39
+ const handleSelect = (value: string) => {
40
+ setSelected(value);
41
+ };
42
+
43
+ return (
44
+ <div>
45
+ <h2>Clientside Search</h2>
46
+ <p>Selection: {selected}</p>
47
+ <p>Term: {term}</p>
48
+ <Combobox onSelect={handleSelect} selectOnBlur>
49
+ <ComboboxLabel>Enter a city name</ComboboxLabel>
50
+ <br />
51
+ <ComboboxInput onChange={handleChange} defaultValue={initialValue} />
52
+ {results.length > 0 && (
53
+ <ComboboxPopover>
54
+ <ComboboxList persistSelection={true}>
55
+ {results.slice(0, 100).map((result, index) => (
56
+ <ComboboxOption
57
+ key={`${result.city}, ${result.state}, ${index}`}
58
+ id={`${result.city}, ${result.state}, ${index}`}
59
+ text={`${result.city}, ${result.state}`}
60
+ value={result}
61
+ />
62
+ ))}
63
+ </ComboboxList>
64
+ </ComboboxPopover>
65
+ )}
66
+ </Combobox>
67
+ </div>
68
+ );
69
+ }
70
+
71
+ export function ControlledClientSideExample({ initialValue = '' }) {
72
+ const [term, setTerm] = useState(initialValue);
73
+ const [selected, setSelected] = useState(initialValue);
74
+ const results = useCityMatch(term);
75
+
76
+ const handleChange = (event: ChangeEvent<HTMLInputElement>) => {
77
+ setTerm(event.target.value);
78
+ setSelected('');
79
+ };
80
+
81
+ const handleSelect = (value: string) => {
82
+ setSelected(value);
83
+ };
84
+
85
+ return (
86
+ <div>
87
+ <h2>Clientside Search</h2>
88
+ <p>Selection: {selected}</p>
89
+ <p>Term: {term}</p>
90
+ <Combobox onSelect={handleSelect} selectOnBlur>
91
+ <ComboboxLabel>Enter a city name</ComboboxLabel>
92
+ <br />
93
+ <ComboboxInput onChange={handleChange} value={selected || term} />
94
+ {results.length > 0 && (
95
+ <ComboboxPopover>
96
+ <ComboboxList persistSelection={true}>
97
+ {results.slice(0, 10).map((result, index) => (
98
+ <ComboboxOption
99
+ key={`${result.city}, ${result.state}, ${index}`}
100
+ id={`${result.city}, ${result.state}, ${index}`}
101
+ text={`${result.city}, ${result.state}`}
102
+ value={result}
103
+ />
104
+ ))}
105
+ </ComboboxList>
106
+ </ComboboxPopover>
107
+ )}
108
+ </Combobox>
109
+ </div>
110
+ );
111
+ }
112
+
113
+ export const UncontrolledClientSide = () => <UncontrolledClientSideExample />;
114
+ export const UncontrolledClientSideInitial = () => (
115
+ <UncontrolledClientSideExample initialValue="Aberdeen" />
116
+ );
117
+ export const ControlledClientSide = () => <ControlledClientSideExample />;
118
+ export const ControlledClientsideInitial = () => (
119
+ <ControlledClientSideExample initialValue="Aberdeen" />
120
+ );
@@ -1,148 +1,148 @@
1
- import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
- import { forwardRef, useRef, useMemo, useId } from 'react';
3
-
4
- import type { ActionTypes } from './hooks';
5
- import { stateChart, comboboxReducer, isVisible, INIT } from './hooks';
6
- import type { ComboBoxContextProps } from './context';
7
- import { ComboBoxProvider } from './context';
8
- import { useReducerMachine } from '../hooks/useReducerMachine';
9
- import type { Scope } from '../hooks';
10
- import { getScope } from '../hooks';
11
-
12
- export type SelectEventHandler = (
13
- text: string,
14
- itemId: string,
15
- obj: any
16
- ) => void;
17
-
18
- export type ComboboxProps = Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> & {
19
- onSelect?: SelectEventHandler;
20
- openOnFocus?: boolean;
21
- selectOnBlur?: boolean;
22
- children?: ReactNode;
23
- as?: ElementType<any>;
24
- innerAs?: ElementType<any>;
25
- };
26
-
27
- export const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(
28
- function Combobox(
29
- {
30
- // Called whenever the user selects an item from the list
31
- onSelect,
32
-
33
- // opens the list when the input receives focused (but only if there are
34
- // items in the list)
35
- openOnFocus = false,
36
-
37
- // if set to true, it will select an item after blurring
38
- selectOnBlur = false,
39
-
40
- children,
41
- as: Comp = 'div',
42
- innerAs,
43
- ...rest
44
- }: ComboboxProps,
45
- ref
46
- ) {
47
- // We store the values of all the ComboboxOptions on this ref. This makes it
48
- // possible to perform the keyboard navigation from the input on the list. We
49
- // manipulate this array through context so that we don't have to enforce a
50
- // parent/child relationship between ComboboxList and ComboboxOption.
51
- const optionsRef = useRef<{
52
- [itemId: string]: {
53
- value: string | unknown;
54
- text: string;
55
- };
56
- }>({});
57
-
58
- const listScope: Scope<HTMLElement> = useRef(getScope({ current: null }));
59
-
60
- // Need this to focus it
61
- const inputRef = useRef<HTMLInputElement>(null);
62
-
63
- const popoverRef = useRef<HTMLDivElement>(null);
64
-
65
- const buttonRef = useRef<HTMLButtonElement>(null);
66
-
67
- // When <ComboboxInput autocomplete={false} /> we don't want cycle back to
68
- // the user's value while navigating (because it's always the user's value),
69
- // but we need to know this in useKeyDown which is far away from the prop
70
- // here, so we do something sneaky and write it to this ref on context so we
71
- // can use it anywhere else 😛. Another new trick for me and I'm excited
72
- // about this one too!
73
- const autocompletePropRef = useRef<boolean>(false);
74
-
75
- const persistSelectionRef = useRef<boolean>(false);
76
-
77
- const clearOnEscapeRef = useRef<boolean>(false);
78
-
79
- const listboxIdRef = useRef<string | undefined>();
80
-
81
- const labelIdRef = useRef<string | undefined>();
82
-
83
- const defaultData = {
84
- // initial state
85
- state: stateChart.initial,
86
- // the value the user has typed, we derived this also when the developer is
87
- // controlling the value of ComboboxInput
88
- text: '',
89
- // the index the user has typed, we derived this also when the developer is
90
- // controlling the value of ComboboxInput
91
- item: '',
92
- // the hash of the currently navigated item
93
- navigationItem: '',
94
- // the last submitted action
95
- lastActionType: INIT as ActionTypes,
96
- };
97
-
98
- const [state, data, transition] = useReducerMachine(
99
- stateChart,
100
- comboboxReducer,
101
- defaultData
102
- );
103
-
104
- listboxIdRef.current = useId();
105
-
106
- labelIdRef.current = useId();
107
-
108
- const context = useMemo(
109
- (): ComboBoxContextProps => ({
110
- data,
111
- inputRef,
112
- popoverRef,
113
- buttonRef,
114
- onSelect,
115
- optionsRef,
116
- listScope,
117
- state,
118
- transition,
119
- listboxIdRef,
120
- labelIdRef,
121
- autocompletePropRef,
122
- persistSelectionRef,
123
- clearOnEscapeRef,
124
- isVisible: isVisible(state),
125
- openOnFocus,
126
- selectOnBlur,
127
- }),
128
- [data, onSelect, listScope, state, transition, openOnFocus, selectOnBlur]
129
- );
130
-
131
- return (
132
- <ComboBoxProvider value={context}>
133
- <Comp
134
- {...rest}
135
- as={innerAs}
136
- data-reach-combobox=""
137
- ref={ref}
138
- role="combobox"
139
- aria-haspopup="listbox"
140
- aria-owns={listboxIdRef.current}
141
- aria-expanded={context.isVisible}
142
- >
143
- {children}
144
- </Comp>
145
- </ComboBoxProvider>
146
- );
147
- }
148
- );
1
+ import type { HTMLAttributes, ReactNode, ElementType } from 'react';
2
+ import { forwardRef, useRef, useMemo, useId } from 'react';
3
+
4
+ import type { ActionTypes } from './hooks';
5
+ import { stateChart, comboboxReducer, isVisible, INIT } from './hooks';
6
+ import type { ComboBoxContextProps } from './context';
7
+ import { ComboBoxProvider } from './context';
8
+ import { useReducerMachine } from '../hooks/useReducerMachine';
9
+ import type { Scope } from '../hooks';
10
+ import { getScope } from '../hooks';
11
+
12
+ export type SelectEventHandler = (
13
+ text: string,
14
+ itemId: string,
15
+ obj: any
16
+ ) => void;
17
+
18
+ export type ComboboxProps = Omit<HTMLAttributes<HTMLDivElement>, 'onSelect'> & {
19
+ onSelect?: SelectEventHandler;
20
+ openOnFocus?: boolean;
21
+ selectOnBlur?: boolean;
22
+ children?: ReactNode;
23
+ as?: ElementType<any>;
24
+ innerAs?: ElementType<any>;
25
+ };
26
+
27
+ export const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(
28
+ function Combobox(
29
+ {
30
+ // Called whenever the user selects an item from the list
31
+ onSelect,
32
+
33
+ // opens the list when the input receives focused (but only if there are
34
+ // items in the list)
35
+ openOnFocus = false,
36
+
37
+ // if set to true, it will select an item after blurring
38
+ selectOnBlur = false,
39
+
40
+ children,
41
+ as: Comp = 'div',
42
+ innerAs,
43
+ ...rest
44
+ }: ComboboxProps,
45
+ ref
46
+ ) {
47
+ // We store the values of all the ComboboxOptions on this ref. This makes it
48
+ // possible to perform the keyboard navigation from the input on the list. We
49
+ // manipulate this array through context so that we don't have to enforce a
50
+ // parent/child relationship between ComboboxList and ComboboxOption.
51
+ const optionsRef = useRef<{
52
+ [itemId: string]: {
53
+ value: string | unknown;
54
+ text: string;
55
+ };
56
+ }>({});
57
+
58
+ const listScope: Scope<HTMLElement> = useRef(getScope({ current: null }));
59
+
60
+ // Need this to focus it
61
+ const inputRef = useRef<HTMLInputElement>(null);
62
+
63
+ const popoverRef = useRef<HTMLDivElement>(null);
64
+
65
+ const buttonRef = useRef<HTMLButtonElement>(null);
66
+
67
+ // When <ComboboxInput autocomplete={false} /> we don't want cycle back to
68
+ // the user's value while navigating (because it's always the user's value),
69
+ // but we need to know this in useKeyDown which is far away from the prop
70
+ // here, so we do something sneaky and write it to this ref on context so we
71
+ // can use it anywhere else 😛. Another new trick for me and I'm excited
72
+ // about this one too!
73
+ const autocompletePropRef = useRef<boolean>(false);
74
+
75
+ const persistSelectionRef = useRef<boolean>(false);
76
+
77
+ const clearOnEscapeRef = useRef<boolean>(false);
78
+
79
+ const listboxIdRef = useRef<string | undefined>();
80
+
81
+ const labelIdRef = useRef<string | undefined>();
82
+
83
+ const defaultData = {
84
+ // initial state
85
+ state: stateChart.initial,
86
+ // the value the user has typed, we derived this also when the developer is
87
+ // controlling the value of ComboboxInput
88
+ text: '',
89
+ // the index the user has typed, we derived this also when the developer is
90
+ // controlling the value of ComboboxInput
91
+ item: '',
92
+ // the hash of the currently navigated item
93
+ navigationItem: '',
94
+ // the last submitted action
95
+ lastActionType: INIT as ActionTypes,
96
+ };
97
+
98
+ const [state, data, transition] = useReducerMachine(
99
+ stateChart,
100
+ comboboxReducer,
101
+ defaultData
102
+ );
103
+
104
+ listboxIdRef.current = useId();
105
+
106
+ labelIdRef.current = useId();
107
+
108
+ const context = useMemo(
109
+ (): ComboBoxContextProps => ({
110
+ data,
111
+ inputRef,
112
+ popoverRef,
113
+ buttonRef,
114
+ onSelect,
115
+ optionsRef,
116
+ listScope,
117
+ state,
118
+ transition,
119
+ listboxIdRef,
120
+ labelIdRef,
121
+ autocompletePropRef,
122
+ persistSelectionRef,
123
+ clearOnEscapeRef,
124
+ isVisible: isVisible(state),
125
+ openOnFocus,
126
+ selectOnBlur,
127
+ }),
128
+ [data, onSelect, listScope, state, transition, openOnFocus, selectOnBlur]
129
+ );
130
+
131
+ return (
132
+ <ComboBoxProvider value={context}>
133
+ <Comp
134
+ {...rest}
135
+ as={innerAs}
136
+ data-reach-combobox=""
137
+ ref={ref}
138
+ role="combobox"
139
+ aria-haspopup="listbox"
140
+ aria-owns={listboxIdRef.current}
141
+ aria-expanded={context.isVisible}
142
+ >
143
+ {children}
144
+ </Comp>
145
+ </ComboBoxProvider>
146
+ );
147
+ }
148
+ );
@@ -1,61 +1,61 @@
1
- import type {
2
- ButtonHTMLAttributes,
3
- ElementType,
4
- KeyboardEventHandler,
5
- MouseEventHandler,
6
- ReactNode,
7
- } from 'react';
8
- import { forwardRef } from 'react';
9
-
10
- import { useComboBoxContext } from './context';
11
- import { useKeyDown, IDLE, OPEN_WITH_BUTTON, CLOSE_WITH_BUTTON } from './hooks';
12
- import { wrapEvent } from '../utils/wrap-event';
13
- import { assignMultipleRefs } from '../utils/assign-ref';
14
-
15
- export interface ComboboxButtonProps
16
- extends ButtonHTMLAttributes<HTMLButtonElement> {
17
- as?: ElementType<any>;
18
- innerAs?: ElementType<any>;
19
- onClick?: MouseEventHandler<HTMLButtonElement>;
20
- onKeyDown?: KeyboardEventHandler<HTMLButtonElement>;
21
- children?: ReactNode;
22
- }
23
-
24
- export const ComboboxButton = forwardRef<
25
- HTMLButtonElement,
26
- ComboboxButtonProps
27
- >(function ComboboxButton(
28
- { as: Comp = 'button', innerAs, onClick, onKeyDown, ...props },
29
- ref
30
- ) {
31
- const { transition, data, state, buttonRef, listboxIdRef, isVisible } =
32
- useComboBoxContext();
33
-
34
- const handleKeyDown = useKeyDown();
35
-
36
- const handleClick = () => {
37
- const payload = {
38
- item: data.navigationItem,
39
- };
40
-
41
- if (state === IDLE) {
42
- transition(OPEN_WITH_BUTTON, payload);
43
- } else {
44
- transition(CLOSE_WITH_BUTTON, payload);
45
- }
46
- };
47
-
48
- return (
49
- <Comp
50
- as={innerAs}
51
- data-reach-combobox-button=""
52
- aria-controls={listboxIdRef.current}
53
- aria-haspopup="listbox"
54
- aria-expanded={isVisible}
55
- ref={assignMultipleRefs(ref, buttonRef)}
56
- onClick={wrapEvent(onClick, handleClick)}
57
- onKeyDown={wrapEvent(onKeyDown, handleKeyDown)}
58
- {...props}
59
- />
60
- );
61
- });
1
+ import type {
2
+ ButtonHTMLAttributes,
3
+ ElementType,
4
+ KeyboardEventHandler,
5
+ MouseEventHandler,
6
+ ReactNode,
7
+ } from 'react';
8
+ import { forwardRef } from 'react';
9
+
10
+ import { useComboBoxContext } from './context';
11
+ import { useKeyDown, IDLE, OPEN_WITH_BUTTON, CLOSE_WITH_BUTTON } from './hooks';
12
+ import { wrapEvent } from '../utils/wrap-event';
13
+ import { assignMultipleRefs } from '../utils/assign-ref';
14
+
15
+ export interface ComboboxButtonProps
16
+ extends ButtonHTMLAttributes<HTMLButtonElement> {
17
+ as?: ElementType<any>;
18
+ innerAs?: ElementType<any>;
19
+ onClick?: MouseEventHandler<HTMLButtonElement>;
20
+ onKeyDown?: KeyboardEventHandler<HTMLButtonElement>;
21
+ children?: ReactNode;
22
+ }
23
+
24
+ export const ComboboxButton = forwardRef<
25
+ HTMLButtonElement,
26
+ ComboboxButtonProps
27
+ >(function ComboboxButton(
28
+ { as: Comp = 'button', innerAs, onClick, onKeyDown, ...props },
29
+ ref
30
+ ) {
31
+ const { transition, data, state, buttonRef, listboxIdRef, isVisible } =
32
+ useComboBoxContext();
33
+
34
+ const handleKeyDown = useKeyDown();
35
+
36
+ const handleClick = () => {
37
+ const payload = {
38
+ item: data.navigationItem,
39
+ };
40
+
41
+ if (state === IDLE) {
42
+ transition(OPEN_WITH_BUTTON, payload);
43
+ } else {
44
+ transition(CLOSE_WITH_BUTTON, payload);
45
+ }
46
+ };
47
+
48
+ return (
49
+ <Comp
50
+ as={innerAs}
51
+ data-reach-combobox-button=""
52
+ aria-controls={listboxIdRef.current}
53
+ aria-haspopup="listbox"
54
+ aria-expanded={isVisible}
55
+ ref={assignMultipleRefs(ref, buttonRef)}
56
+ onClick={wrapEvent(onClick, handleClick)}
57
+ onKeyDown={wrapEvent(onKeyDown, handleKeyDown)}
58
+ {...props}
59
+ />
60
+ );
61
+ });