@basic-ui/core 0.0.50 → 0.0.52

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 (337) hide show
  1. package/README.md +3 -3
  2. package/build/cjs/index.js +106 -92
  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/CheckBox/CheckBox.d.ts +7 -7
  19. package/build/esm/CheckBox/CheckBox.js.map +1 -1
  20. package/build/esm/CheckBox/index.d.ts +1 -1
  21. package/build/esm/CheckBox/index.js.map +1 -1
  22. package/build/esm/ComboBox/Combobox.d.ts +18 -18
  23. package/build/esm/ComboBox/Combobox.js.map +1 -1
  24. package/build/esm/ComboBox/ComboboxButton.d.ts +9 -9
  25. package/build/esm/ComboBox/ComboboxButton.js.map +1 -1
  26. package/build/esm/ComboBox/ComboboxInput.d.ts +17 -17
  27. package/build/esm/ComboBox/ComboboxInput.js.map +1 -1
  28. package/build/esm/ComboBox/ComboboxLabel.d.ts +7 -7
  29. package/build/esm/ComboBox/ComboboxLabel.js.map +1 -1
  30. package/build/esm/ComboBox/ComboboxList.d.ts +8 -8
  31. package/build/esm/ComboBox/ComboboxList.js.map +1 -1
  32. package/build/esm/ComboBox/ComboboxOption.d.ts +11 -11
  33. package/build/esm/ComboBox/ComboboxOption.js.map +1 -1
  34. package/build/esm/ComboBox/ComboboxPopover.d.ts +9 -9
  35. package/build/esm/ComboBox/ComboboxPopover.js.map +1 -1
  36. package/build/esm/ComboBox/cities.d.ts +5 -5
  37. package/build/esm/ComboBox/cities.js.map +1 -1
  38. package/build/esm/ComboBox/context.d.ts +30 -30
  39. package/build/esm/ComboBox/context.js.map +1 -1
  40. package/build/esm/ComboBox/hooks.d.ts +37 -37
  41. package/build/esm/ComboBox/hooks.js.map +1 -1
  42. package/build/esm/ComboBox/index.d.ts +8 -8
  43. package/build/esm/ComboBox/index.js.map +1 -1
  44. package/build/esm/ComboBox/makeHash.d.ts +1 -1
  45. package/build/esm/ComboBox/makeHash.js.map +1 -1
  46. package/build/esm/ComboBox/scopeQuery.d.ts +1 -1
  47. package/build/esm/ComboBox/scopeQuery.js.map +1 -1
  48. package/build/esm/FocusLock/FocusLock.d.ts +9 -9
  49. package/build/esm/FocusLock/FocusLock.js.map +1 -1
  50. package/build/esm/FocusLock/index.d.ts +1 -1
  51. package/build/esm/FocusLock/index.js.map +1 -1
  52. package/build/esm/FocusLock/tabUtils.d.ts +3 -3
  53. package/build/esm/FocusLock/tabUtils.js.map +1 -1
  54. package/build/esm/FocusLock/useFocusLock.d.ts +7 -7
  55. package/build/esm/FocusLock/useFocusLock.js.map +1 -1
  56. package/build/esm/List/List.d.ts +7 -7
  57. package/build/esm/List/List.js.map +1 -1
  58. package/build/esm/List/ListItem.d.ts +7 -7
  59. package/build/esm/List/ListItem.js.map +1 -1
  60. package/build/esm/List/context.d.ts +4 -4
  61. package/build/esm/List/context.js.map +1 -1
  62. package/build/esm/List/index.d.ts +2 -2
  63. package/build/esm/List/index.js.map +1 -1
  64. package/build/esm/Menu/ContextMenuTrigger.d.ts +11 -11
  65. package/build/esm/Menu/ContextMenuTrigger.js.map +1 -1
  66. package/build/esm/Menu/Menu.d.ts +10 -10
  67. package/build/esm/Menu/Menu.js.map +1 -1
  68. package/build/esm/Menu/MenuButton.d.ts +11 -11
  69. package/build/esm/Menu/MenuButton.js.map +1 -1
  70. package/build/esm/Menu/MenuItem.d.ts +8 -8
  71. package/build/esm/Menu/MenuItem.js +1 -0
  72. package/build/esm/Menu/MenuItem.js.map +1 -1
  73. package/build/esm/Menu/MenuList.d.ts +7 -7
  74. package/build/esm/Menu/MenuList.js +17 -4
  75. package/build/esm/Menu/MenuList.js.map +1 -1
  76. package/build/esm/Menu/MenuPopover.d.ts +8 -8
  77. package/build/esm/Menu/MenuPopover.js.map +1 -1
  78. package/build/esm/Menu/context.d.ts +25 -25
  79. package/build/esm/Menu/context.js.map +1 -1
  80. package/build/esm/Menu/fixtures/countryList.d.ts +1 -1
  81. package/build/esm/Menu/fixtures/countryList.js.map +1 -1
  82. package/build/esm/Menu/index.d.ts +6 -6
  83. package/build/esm/Menu/index.js.map +1 -1
  84. package/build/esm/Menu/scope.d.ts +1 -1
  85. package/build/esm/Menu/scope.js.map +1 -1
  86. package/build/esm/Modal/Modal.d.ts +9 -9
  87. package/build/esm/Modal/Modal.js.map +1 -1
  88. package/build/esm/Modal/ModalBackdrop.d.ts +10 -10
  89. package/build/esm/Modal/ModalBackdrop.js.map +1 -1
  90. package/build/esm/Modal/index.d.ts +2 -2
  91. package/build/esm/Modal/index.js.map +1 -1
  92. package/build/esm/Popper/Popper.d.ts +35 -35
  93. package/build/esm/Popper/Popper.js.map +1 -1
  94. package/build/esm/Popper/PopperArrow.d.ts +6 -6
  95. package/build/esm/Popper/PopperArrow.js.map +1 -1
  96. package/build/esm/Popper/context.d.ts +6 -6
  97. package/build/esm/Popper/context.js.map +1 -1
  98. package/build/esm/Popper/index.d.ts +3 -3
  99. package/build/esm/Popper/index.js.map +1 -1
  100. package/build/esm/Portal/Portal.d.ts +6 -6
  101. package/build/esm/Portal/Portal.js.map +1 -1
  102. package/build/esm/Portal/index.d.ts +1 -1
  103. package/build/esm/Portal/index.js.map +1 -1
  104. package/build/esm/RadioButton/RadioButton.d.ts +10 -10
  105. package/build/esm/RadioButton/RadioButton.js.map +1 -1
  106. package/build/esm/RadioButton/RadioGroup.d.ts +12 -12
  107. package/build/esm/RadioButton/RadioGroup.js.map +1 -1
  108. package/build/esm/RadioButton/context.d.ts +9 -9
  109. package/build/esm/RadioButton/context.js.map +1 -1
  110. package/build/esm/RadioButton/index.d.ts +2 -2
  111. package/build/esm/RadioButton/index.js.map +1 -1
  112. package/build/esm/SkipNav/SkipNav.d.ts +7 -7
  113. package/build/esm/SkipNav/SkipNav.js.map +1 -1
  114. package/build/esm/SkipNav/index.d.ts +1 -1
  115. package/build/esm/SkipNav/index.js.map +1 -1
  116. package/build/esm/Slider/Slider.d.ts +197 -197
  117. package/build/esm/Slider/Slider.js +82 -82
  118. package/build/esm/Slider/Slider.js.map +1 -1
  119. package/build/esm/Slider/index.d.ts +1 -1
  120. package/build/esm/Slider/index.js.map +1 -1
  121. package/build/esm/Spinner/Spinner.d.ts +12 -12
  122. package/build/esm/Spinner/Spinner.js.map +1 -1
  123. package/build/esm/Spinner/SpinnerButton.d.ts +8 -8
  124. package/build/esm/Spinner/SpinnerButton.js.map +1 -1
  125. package/build/esm/Spinner/context.d.ts +12 -12
  126. package/build/esm/Spinner/context.js.map +1 -1
  127. package/build/esm/Spinner/index.d.ts +2 -2
  128. package/build/esm/Spinner/index.js.map +1 -1
  129. package/build/esm/Tabs/Tab.d.ts +7 -7
  130. package/build/esm/Tabs/Tab.js.map +1 -1
  131. package/build/esm/Tabs/TabList.d.ts +9 -9
  132. package/build/esm/Tabs/TabList.js.map +1 -1
  133. package/build/esm/Tabs/TabPanel.d.ts +8 -8
  134. package/build/esm/Tabs/TabPanel.js.map +1 -1
  135. package/build/esm/Tabs/TabPanels.d.ts +8 -8
  136. package/build/esm/Tabs/TabPanels.js.map +1 -1
  137. package/build/esm/Tabs/Tabs.d.ts +10 -10
  138. package/build/esm/Tabs/Tabs.js.map +1 -1
  139. package/build/esm/Tabs/context.d.ts +17 -17
  140. package/build/esm/Tabs/context.js.map +1 -1
  141. package/build/esm/Tabs/index.d.ts +5 -5
  142. package/build/esm/Tabs/index.js.map +1 -1
  143. package/build/esm/Tabs/scopeQuery.d.ts +1 -1
  144. package/build/esm/Tabs/scopeQuery.js.map +1 -1
  145. package/build/esm/Tooltip/Tooltip.d.ts +10 -10
  146. package/build/esm/Tooltip/Tooltip.js.map +1 -1
  147. package/build/esm/Tooltip/index.d.ts +1 -1
  148. package/build/esm/Tooltip/index.js.map +1 -1
  149. package/build/esm/Tooltip/stateMachine.d.ts +28 -28
  150. package/build/esm/Tooltip/stateMachine.js.map +1 -1
  151. package/build/esm/Tooltip/useTooltip.d.ts +10 -10
  152. package/build/esm/Tooltip/useTooltip.js.map +1 -1
  153. package/build/esm/hooks/index.d.ts +13 -13
  154. package/build/esm/hooks/index.js.map +1 -1
  155. package/build/esm/hooks/useAutoFocus.d.ts +2 -2
  156. package/build/esm/hooks/useAutoFocus.js.map +1 -1
  157. package/build/esm/hooks/useChildrenCounter.d.ts +7 -7
  158. package/build/esm/hooks/useChildrenCounter.js.map +1 -1
  159. package/build/esm/hooks/useControlledState.d.ts +3 -3
  160. package/build/esm/hooks/useControlledState.js +1 -1
  161. package/build/esm/hooks/useControlledState.js.map +1 -1
  162. package/build/esm/hooks/useFocusReturn.d.ts +2 -2
  163. package/build/esm/hooks/useFocusReturn.js.map +1 -1
  164. package/build/esm/hooks/useFocusState.d.ts +11 -11
  165. package/build/esm/hooks/useFocusState.js.map +1 -1
  166. package/build/esm/hooks/useGestureHandlers.d.ts +52 -52
  167. package/build/esm/hooks/useGestureHandlers.js.map +1 -1
  168. package/build/esm/hooks/useMeasure.d.ts +7 -7
  169. package/build/esm/hooks/useMeasure.js.map +1 -1
  170. package/build/esm/hooks/useOnClickOutside.d.ts +2 -2
  171. package/build/esm/hooks/useOnClickOutside.js.map +1 -1
  172. package/build/esm/hooks/useOnKeyDown.d.ts +1 -1
  173. package/build/esm/hooks/useOnKeyDown.js.map +1 -1
  174. package/build/esm/hooks/useReducerMachine.d.ts +24 -24
  175. package/build/esm/hooks/useReducerMachine.js.map +1 -1
  176. package/build/esm/hooks/useRemoveBodyScroll.d.ts +2 -2
  177. package/build/esm/hooks/useRemoveBodyScroll.js.map +1 -1
  178. package/build/esm/hooks/useScope.d.ts +11 -11
  179. package/build/esm/hooks/useScope.js.map +1 -1
  180. package/build/esm/hooks/useThrottle.d.ts +1 -1
  181. package/build/esm/hooks/useThrottle.js.map +1 -1
  182. package/build/esm/index.d.ts +15 -15
  183. package/build/esm/index.js.map +1 -1
  184. package/build/esm/utils/assign-ref.d.ts +3 -3
  185. package/build/esm/utils/assign-ref.js.map +1 -1
  186. package/build/esm/utils/can-use-dom.d.ts +1 -1
  187. package/build/esm/utils/can-use-dom.js.map +1 -1
  188. package/build/esm/utils/clamp.d.ts +1 -1
  189. package/build/esm/utils/clamp.js.map +1 -1
  190. package/build/esm/utils/context.d.ts +7 -7
  191. package/build/esm/utils/context.js.map +1 -1
  192. package/build/esm/utils/create-subscription.d.ts +4 -4
  193. package/build/esm/utils/create-subscription.js.map +1 -1
  194. package/build/esm/utils/get-circular-index.d.ts +1 -1
  195. package/build/esm/utils/get-circular-index.js.map +1 -1
  196. package/build/esm/utils/index.d.ts +10 -10
  197. package/build/esm/utils/index.js.map +1 -1
  198. package/build/esm/utils/is-right-click.d.ts +6 -6
  199. package/build/esm/utils/is-right-click.js +4 -4
  200. package/build/esm/utils/is-right-click.js.map +1 -1
  201. package/build/esm/utils/owner-document.d.ts +7 -7
  202. package/build/esm/utils/owner-document.js +5 -5
  203. package/build/esm/utils/owner-document.js.map +1 -1
  204. package/build/esm/utils/polymorphic.d.ts +39 -39
  205. package/build/esm/utils/polymorphic.js.map +1 -1
  206. package/build/esm/utils/rubber-band-clamp.d.ts +2 -2
  207. package/build/esm/utils/rubber-band-clamp.js.map +1 -1
  208. package/build/esm/utils/use-stable-callback.d.ts +16 -16
  209. package/build/esm/utils/use-stable-callback.js +16 -16
  210. package/build/esm/utils/use-stable-callback.js.map +1 -1
  211. package/build/esm/utils/wrap-event.d.ts +3 -3
  212. package/build/esm/utils/wrap-event.js.map +1 -1
  213. package/build/tsconfig-build.tsbuildinfo +1 -1
  214. package/package.json +2 -2
  215. package/src/Accordion/Accordion.story.tsx +74 -74
  216. package/src/Accordion/Accordion.tsx +59 -59
  217. package/src/Accordion/AccordionBody.tsx +52 -52
  218. package/src/Accordion/AccordionHeader.tsx +167 -167
  219. package/src/Accordion/AccordionItem.tsx +50 -50
  220. package/src/Accordion/context.ts +37 -37
  221. package/src/Accordion/index.ts +4 -4
  222. package/src/Accordion/scopeQuery.ts +7 -7
  223. package/src/Accordion/styles.css +21 -21
  224. package/src/CheckBox/CheckBox.tsx +41 -41
  225. package/src/CheckBox/index.ts +1 -1
  226. package/src/ComboBox/ComboBox.story.tsx +120 -120
  227. package/src/ComboBox/Combobox.tsx +148 -148
  228. package/src/ComboBox/ComboboxButton.tsx +61 -61
  229. package/src/ComboBox/ComboboxInput.tsx +187 -187
  230. package/src/ComboBox/ComboboxLabel.tsx +33 -33
  231. package/src/ComboBox/ComboboxList.tsx +47 -47
  232. package/src/ComboBox/ComboboxOption.tsx +111 -111
  233. package/src/ComboBox/ComboboxPopover.tsx +64 -64
  234. package/src/ComboBox/cities.ts +23194 -23194
  235. package/src/ComboBox/context.ts +35 -35
  236. package/src/ComboBox/hooks.tsx +451 -451
  237. package/src/ComboBox/index.ts +8 -8
  238. package/src/ComboBox/makeHash.ts +19 -19
  239. package/src/ComboBox/scopeQuery.ts +6 -6
  240. package/src/ComboBox/styles.css +32 -32
  241. package/src/FocusLock/FocusLock.tsx +66 -66
  242. package/src/FocusLock/index.ts +1 -1
  243. package/src/FocusLock/tabUtils.ts +40 -40
  244. package/src/FocusLock/useFocusLock.ts +56 -56
  245. package/src/List/List.story.tsx +18 -18
  246. package/src/List/List.tsx +17 -17
  247. package/src/List/ListItem.tsx +23 -23
  248. package/src/List/context.ts +19 -19
  249. package/src/List/index.ts +2 -2
  250. package/src/Menu/ContextMenu.story.tsx +73 -73
  251. package/src/Menu/ContextMenuTrigger.tsx +76 -76
  252. package/src/Menu/Menu.story.tsx +160 -160
  253. package/src/Menu/Menu.tsx +83 -83
  254. package/src/Menu/MenuButton.tsx +83 -83
  255. package/src/Menu/MenuComplex.story.tsx +58 -58
  256. package/src/Menu/MenuItem.tsx +88 -87
  257. package/src/Menu/MenuList.tsx +254 -243
  258. package/src/Menu/MenuPopover.tsx +35 -35
  259. package/src/Menu/context.ts +44 -44
  260. package/src/Menu/fixtures/countryList.ts +198 -198
  261. package/src/Menu/index.ts +6 -6
  262. package/src/Menu/scope.ts +7 -7
  263. package/src/Menu/styles.css +42 -42
  264. package/src/Modal/Modal.story.tsx +258 -258
  265. package/src/Modal/Modal.tsx +48 -48
  266. package/src/Modal/ModalBackdrop.tsx +78 -78
  267. package/src/Modal/NavDrawer.story.tsx +158 -158
  268. package/src/Modal/index.ts +2 -2
  269. package/src/Modal/styles.css +46 -46
  270. package/src/Popper/Popper.story.tsx +263 -263
  271. package/src/Popper/Popper.tsx +154 -154
  272. package/src/Popper/PopperArrow.tsx +35 -35
  273. package/src/Popper/context.ts +10 -10
  274. package/src/Popper/index.ts +3 -3
  275. package/src/Popper/styles.css +60 -60
  276. package/src/Portal/Portal.tsx +20 -20
  277. package/src/Portal/index.ts +1 -1
  278. package/src/RadioButton/RadioButton.story.tsx +77 -77
  279. package/src/RadioButton/RadioButton.tsx +55 -55
  280. package/src/RadioButton/RadioGroup.tsx +60 -60
  281. package/src/RadioButton/context.ts +17 -17
  282. package/src/RadioButton/index.ts +2 -2
  283. package/src/SkipNav/SkipNav.tsx +16 -16
  284. package/src/SkipNav/index.tsx +1 -1
  285. package/src/Slider/Slider.story.tsx +45 -45
  286. package/src/Slider/Slider.tsx +1120 -1120
  287. package/src/Slider/index.ts +1 -1
  288. package/src/Slider/styles.css +131 -131
  289. package/src/Spinner/Spinner.story.tsx +31 -31
  290. package/src/Spinner/Spinner.tsx +117 -117
  291. package/src/Spinner/SpinnerButton.tsx +54 -54
  292. package/src/Spinner/context.ts +20 -20
  293. package/src/Spinner/index.ts +2 -2
  294. package/src/Spinner/styles.css +23 -23
  295. package/src/Tabs/Tab.story.tsx +80 -80
  296. package/src/Tabs/Tab.tsx +136 -136
  297. package/src/Tabs/TabList.tsx +71 -71
  298. package/src/Tabs/TabPanel.tsx +53 -53
  299. package/src/Tabs/TabPanels.tsx +30 -30
  300. package/src/Tabs/Tabs.tsx +46 -46
  301. package/src/Tabs/context.ts +30 -30
  302. package/src/Tabs/index.tsx +5 -5
  303. package/src/Tabs/scopeQuery.ts +6 -6
  304. package/src/Tooltip/Tooltip.story.tsx +61 -61
  305. package/src/Tooltip/Tooltip.tsx +50 -50
  306. package/src/Tooltip/index.ts +1 -1
  307. package/src/Tooltip/stateMachine.ts +192 -192
  308. package/src/Tooltip/styles.css +17 -17
  309. package/src/Tooltip/useTooltip.ts +136 -136
  310. package/src/hooks/index.ts +13 -13
  311. package/src/hooks/useAutoFocus.ts +22 -22
  312. package/src/hooks/useChildrenCounter.ts +51 -51
  313. package/src/hooks/useControlledState.ts +3 -3
  314. package/src/hooks/useFocusReturn.ts +43 -43
  315. package/src/hooks/useFocusState.ts +30 -30
  316. package/src/hooks/useGestureHandlers.ts +286 -286
  317. package/src/hooks/useMeasure.ts +33 -33
  318. package/src/hooks/useOnClickOutside.ts +32 -32
  319. package/src/hooks/useOnKeyDown.ts +19 -19
  320. package/src/hooks/useReducerMachine.ts +60 -60
  321. package/src/hooks/useRemoveBodyScroll.ts +39 -39
  322. package/src/hooks/useScope.ts +52 -52
  323. package/src/hooks/useThrottle.ts +19 -19
  324. package/src/index.ts +20 -20
  325. package/src/utils/assign-ref.ts +27 -27
  326. package/src/utils/can-use-dom.ts +7 -7
  327. package/src/utils/clamp.ts +3 -3
  328. package/src/utils/context.tsx +48 -48
  329. package/src/utils/create-subscription.ts +16 -16
  330. package/src/utils/get-circular-index.ts +7 -7
  331. package/src/utils/index.ts +10 -10
  332. package/src/utils/is-right-click.ts +14 -14
  333. package/src/utils/owner-document.ts +13 -13
  334. package/src/utils/polymorphic.ts +78 -78
  335. package/src/utils/rubber-band-clamp.ts +25 -25
  336. package/src/utils/use-stable-callback.ts +58 -58
  337. package/src/utils/wrap-event.ts +22 -22
@@ -1,111 +1,111 @@
1
- /* eslint-disable @typescript-eslint/no-use-before-define */
2
- import type {
3
- ElementType,
4
- LiHTMLAttributes,
5
- MouseEventHandler,
6
- ReactNode,
7
- } from 'react';
8
- import { forwardRef, useEffect, useRef } from 'react';
9
-
10
- import { SELECT_WITH_CLICK, CLEAR_SELECTION } from './hooks';
11
- import { wrapEvent } from '../utils/wrap-event';
12
- import { useComboBoxContext } from './context';
13
- import { makeHash } from './makeHash';
14
-
15
- export interface ComboboxOptionProps extends LiHTMLAttributes<HTMLLIElement> {
16
- as?: ElementType<any>;
17
- innerAs?: ElementType<any>;
18
- id: string;
19
- value: any;
20
- text?: string;
21
- onClick?: MouseEventHandler<HTMLLIElement>;
22
- children?: ReactNode;
23
- }
24
-
25
- export const ComboboxOption = forwardRef<HTMLLIElement, ComboboxOptionProps>(
26
- function ComboboxOption(
27
- {
28
- children,
29
- id: idProp,
30
- value: valueProp,
31
- text: textProp,
32
- onClick,
33
- as: Comp = 'li',
34
- innerAs,
35
- ...props
36
- },
37
- ref
38
- ) {
39
- const {
40
- onSelect,
41
- data: { navigationItem },
42
- transition,
43
- optionsRef,
44
- } = useComboBoxContext();
45
- const transitionCleanupRef = useRef(transition);
46
- const isActiveRef = useRef(false);
47
-
48
- const value: any = valueProp;
49
- let text: string = textProp ? textProp : '';
50
-
51
- if (text.length === 0) {
52
- if (typeof valueProp === 'string' && valueProp.length > 0) {
53
- text = valueProp;
54
- } else {
55
- throw new Error('Missing text for <ComboboxOption />');
56
- }
57
- }
58
-
59
- const id = String(makeHash(idProp));
60
-
61
- useEffect(() => {
62
- const opts = optionsRef.current;
63
- opts[id] = { value, text };
64
-
65
- return () => {
66
- delete opts[id];
67
- };
68
- }, [optionsRef, id, text, value]);
69
-
70
- // Keep updating this ref with the current
71
- // function pointer for transition, so it can
72
- // be used by the unmount effect below.
73
- transitionCleanupRef.current = transition;
74
- isActiveRef.current = navigationItem === id;
75
-
76
- useEffect(() => {
77
- return () => {
78
- if (isActiveRef.current === true) {
79
- // clean up selections if this option is getting
80
- // unmounted and it was the currently selected item
81
- transitionCleanupRef.current(CLEAR_SELECTION);
82
- }
83
- };
84
- }, []);
85
-
86
- const handleClick = () => {
87
- onSelect && onSelect(text, id, value);
88
- transition(SELECT_WITH_CLICK, { text, item: id });
89
- };
90
-
91
- return (
92
- <Comp
93
- {...props}
94
- as={innerAs}
95
- data-reach-combobox-option=""
96
- ref={ref}
97
- id={id}
98
- role="option"
99
- aria-selected={isActiveRef.current}
100
- data-highlighted={isActiveRef.current ? '' : undefined}
101
- // without this the menu will close from `onBlur`, but with it the
102
- // element can be `document.activeElement` and then our focus checks in
103
- // onBlur will work as intended
104
- tabIndex="-1"
105
- onClick={wrapEvent(onClick, handleClick)}
106
- >
107
- {children || text}
108
- </Comp>
109
- );
110
- }
111
- );
1
+ /* eslint-disable @typescript-eslint/no-use-before-define */
2
+ import type {
3
+ ElementType,
4
+ LiHTMLAttributes,
5
+ MouseEventHandler,
6
+ ReactNode,
7
+ } from 'react';
8
+ import { forwardRef, useEffect, useRef } from 'react';
9
+
10
+ import { SELECT_WITH_CLICK, CLEAR_SELECTION } from './hooks';
11
+ import { wrapEvent } from '../utils/wrap-event';
12
+ import { useComboBoxContext } from './context';
13
+ import { makeHash } from './makeHash';
14
+
15
+ export interface ComboboxOptionProps extends LiHTMLAttributes<HTMLLIElement> {
16
+ as?: ElementType<any>;
17
+ innerAs?: ElementType<any>;
18
+ id: string;
19
+ value: any;
20
+ text?: string;
21
+ onClick?: MouseEventHandler<HTMLLIElement>;
22
+ children?: ReactNode;
23
+ }
24
+
25
+ export const ComboboxOption = forwardRef<HTMLLIElement, ComboboxOptionProps>(
26
+ function ComboboxOption(
27
+ {
28
+ children,
29
+ id: idProp,
30
+ value: valueProp,
31
+ text: textProp,
32
+ onClick,
33
+ as: Comp = 'li',
34
+ innerAs,
35
+ ...props
36
+ },
37
+ ref
38
+ ) {
39
+ const {
40
+ onSelect,
41
+ data: { navigationItem },
42
+ transition,
43
+ optionsRef,
44
+ } = useComboBoxContext();
45
+ const transitionCleanupRef = useRef(transition);
46
+ const isActiveRef = useRef(false);
47
+
48
+ const value: any = valueProp;
49
+ let text: string = textProp ? textProp : '';
50
+
51
+ if (text.length === 0) {
52
+ if (typeof valueProp === 'string' && valueProp.length > 0) {
53
+ text = valueProp;
54
+ } else {
55
+ throw new Error('Missing text for <ComboboxOption />');
56
+ }
57
+ }
58
+
59
+ const id = String(makeHash(idProp));
60
+
61
+ useEffect(() => {
62
+ const opts = optionsRef.current;
63
+ opts[id] = { value, text };
64
+
65
+ return () => {
66
+ delete opts[id];
67
+ };
68
+ }, [optionsRef, id, text, value]);
69
+
70
+ // Keep updating this ref with the current
71
+ // function pointer for transition, so it can
72
+ // be used by the unmount effect below.
73
+ transitionCleanupRef.current = transition;
74
+ isActiveRef.current = navigationItem === id;
75
+
76
+ useEffect(() => {
77
+ return () => {
78
+ if (isActiveRef.current === true) {
79
+ // clean up selections if this option is getting
80
+ // unmounted and it was the currently selected item
81
+ transitionCleanupRef.current(CLEAR_SELECTION);
82
+ }
83
+ };
84
+ }, []);
85
+
86
+ const handleClick = () => {
87
+ onSelect && onSelect(text, id, value);
88
+ transition(SELECT_WITH_CLICK, { text, item: id });
89
+ };
90
+
91
+ return (
92
+ <Comp
93
+ {...props}
94
+ as={innerAs}
95
+ data-reach-combobox-option=""
96
+ ref={ref}
97
+ id={id}
98
+ role="option"
99
+ aria-selected={isActiveRef.current}
100
+ data-highlighted={isActiveRef.current ? '' : undefined}
101
+ // without this the menu will close from `onBlur`, but with it the
102
+ // element can be `document.activeElement` and then our focus checks in
103
+ // onBlur will work as intended
104
+ tabIndex="-1"
105
+ onClick={wrapEvent(onClick, handleClick)}
106
+ >
107
+ {children || text}
108
+ </Comp>
109
+ );
110
+ }
111
+ );
@@ -1,64 +1,64 @@
1
- import type {
2
- ElementType,
3
- FocusEventHandler,
4
- HTMLAttributes,
5
- KeyboardEventHandler,
6
- ReactNode,
7
- } from 'react';
8
- import { forwardRef } from 'react';
9
-
10
- import { useKeyDown, useBlur } from './hooks';
11
- import { wrapEvent } from '../utils/wrap-event';
12
- import { assignMultipleRefs } from '../utils/assign-ref';
13
- import { useComboBoxContext } from './context';
14
-
15
- export interface ComboboxPopoverProps extends HTMLAttributes<HTMLDivElement> {
16
- as?: ElementType<any>;
17
- innerAs?: ElementType<any>;
18
- onBlur?: FocusEventHandler<HTMLDivElement>;
19
- onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
20
- children?: ReactNode;
21
- }
22
-
23
- export const ComboboxPopover = forwardRef<HTMLDivElement, ComboboxPopoverProps>(
24
- function ComboboxPopover(
25
- {
26
- // wrapped events
27
- onKeyDown,
28
- onBlur,
29
-
30
- as: Comp = 'div',
31
- innerAs,
32
- ...props
33
- },
34
- forwardedRef
35
- ) {
36
- const { popoverRef, isVisible } = useComboBoxContext();
37
- const handleKeyDown = useKeyDown();
38
- const handleBlur = useBlur();
39
-
40
- // Instead of conditionally rendering the popover we use the `hidden` prop
41
- // because we don't want to unmount on close (from escape or onSelect). If
42
- // we unmounted, then we'd lose the optionsRef and the user wouldn't be able
43
- // to use the arrow keys to pop the list back open. However, the developer
44
- // can conditionally render the ComboboxPopover if they do want to cause
45
- // mount/unmount based on the app's own data (like results.length or
46
- // whatever).
47
- const hidden = !isVisible;
48
-
49
- return (
50
- <Comp
51
- {...props}
52
- as={innerAs}
53
- data-reach-combobox-popover=""
54
- ref={assignMultipleRefs(popoverRef, forwardedRef)}
55
- onKeyDown={wrapEvent(onKeyDown, handleKeyDown)}
56
- onBlur={wrapEvent(onBlur, handleBlur)}
57
- hidden={hidden}
58
- // Allow the user to click empty space inside the popover without causing
59
- // to close from useBlur
60
- tabIndex="-1"
61
- />
62
- );
63
- }
64
- );
1
+ import type {
2
+ ElementType,
3
+ FocusEventHandler,
4
+ HTMLAttributes,
5
+ KeyboardEventHandler,
6
+ ReactNode,
7
+ } from 'react';
8
+ import { forwardRef } from 'react';
9
+
10
+ import { useKeyDown, useBlur } from './hooks';
11
+ import { wrapEvent } from '../utils/wrap-event';
12
+ import { assignMultipleRefs } from '../utils/assign-ref';
13
+ import { useComboBoxContext } from './context';
14
+
15
+ export interface ComboboxPopoverProps extends HTMLAttributes<HTMLDivElement> {
16
+ as?: ElementType<any>;
17
+ innerAs?: ElementType<any>;
18
+ onBlur?: FocusEventHandler<HTMLDivElement>;
19
+ onKeyDown?: KeyboardEventHandler<HTMLDivElement>;
20
+ children?: ReactNode;
21
+ }
22
+
23
+ export const ComboboxPopover = forwardRef<HTMLDivElement, ComboboxPopoverProps>(
24
+ function ComboboxPopover(
25
+ {
26
+ // wrapped events
27
+ onKeyDown,
28
+ onBlur,
29
+
30
+ as: Comp = 'div',
31
+ innerAs,
32
+ ...props
33
+ },
34
+ forwardedRef
35
+ ) {
36
+ const { popoverRef, isVisible } = useComboBoxContext();
37
+ const handleKeyDown = useKeyDown();
38
+ const handleBlur = useBlur();
39
+
40
+ // Instead of conditionally rendering the popover we use the `hidden` prop
41
+ // because we don't want to unmount on close (from escape or onSelect). If
42
+ // we unmounted, then we'd lose the optionsRef and the user wouldn't be able
43
+ // to use the arrow keys to pop the list back open. However, the developer
44
+ // can conditionally render the ComboboxPopover if they do want to cause
45
+ // mount/unmount based on the app's own data (like results.length or
46
+ // whatever).
47
+ const hidden = !isVisible;
48
+
49
+ return (
50
+ <Comp
51
+ {...props}
52
+ as={innerAs}
53
+ data-reach-combobox-popover=""
54
+ ref={assignMultipleRefs(popoverRef, forwardedRef)}
55
+ onKeyDown={wrapEvent(onKeyDown, handleKeyDown)}
56
+ onBlur={wrapEvent(onBlur, handleBlur)}
57
+ hidden={hidden}
58
+ // Allow the user to click empty space inside the popover without causing
59
+ // to close from useBlur
60
+ tabIndex="-1"
61
+ />
62
+ );
63
+ }
64
+ );