@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,8 +1,8 @@
1
- export * from './Combobox';
2
- export * from './ComboboxButton';
3
- export * from './ComboboxInput';
4
- export * from './ComboboxLabel';
5
- export * from './ComboboxList';
6
- export * from './ComboboxOption';
7
- export * from './ComboboxPopover';
8
- export * from './context';
1
+ export * from './Combobox';
2
+ export * from './ComboboxButton';
3
+ export * from './ComboboxInput';
4
+ export * from './ComboboxLabel';
5
+ export * from './ComboboxList';
6
+ export * from './ComboboxOption';
7
+ export * from './ComboboxPopover';
8
+ export * from './context';
@@ -1,19 +1,19 @@
1
- // We don't want to track the active descendant with indexes because nothing is
2
- // more annoying in a combobox than having it change values RIGHT AS YOU HIT
3
- // ENTER. That only happens if you use the index as your data, rather than
4
- // *your data as your data*. We use this to generate a unique ID based on the
5
- // value of each item. This function is short, sweet, and good enough™ (I also
6
- // don't know how it works, tbqh)
7
- // https://stackoverflow.com/questions/6122571/simple-non-secure-hash-function-for-javascript
8
- export function makeHash(str: string) {
9
- let hash = 0;
10
- if (str.length === 0) {
11
- return hash;
12
- }
13
- for (let i = 0; i < str.length; i++) {
14
- const char = str.charCodeAt(i);
15
- hash = (hash << 5) - hash + char;
16
- hash = hash & hash;
17
- }
18
- return hash;
19
- }
1
+ // We don't want to track the active descendant with indexes because nothing is
2
+ // more annoying in a combobox than having it change values RIGHT AS YOU HIT
3
+ // ENTER. That only happens if you use the index as your data, rather than
4
+ // *your data as your data*. We use this to generate a unique ID based on the
5
+ // value of each item. This function is short, sweet, and good enough™ (I also
6
+ // don't know how it works, tbqh)
7
+ // https://stackoverflow.com/questions/6122571/simple-non-secure-hash-function-for-javascript
8
+ export function makeHash(str: string) {
9
+ let hash = 0;
10
+ if (str.length === 0) {
11
+ return hash;
12
+ }
13
+ for (let i = 0; i < str.length; i++) {
14
+ const char = str.charCodeAt(i);
15
+ hash = (hash << 5) - hash + char;
16
+ hash = hash & hash;
17
+ }
18
+ return hash;
19
+ }
@@ -1,6 +1,6 @@
1
- export function scopeQuery(
2
- nodeType: string,
3
- props: Record<string, unknown>
4
- ): boolean {
5
- return props['data-reach-combobox-option'] === '';
6
- }
1
+ export function scopeQuery(
2
+ nodeType: string,
3
+ props: Record<string, unknown>
4
+ ): boolean {
5
+ return props['data-reach-combobox-option'] === '';
6
+ }
@@ -1,32 +1,32 @@
1
- [data-reach-combobox] {
2
- position: relative;
3
- }
4
-
5
- [data-reach-combobox-input] {
6
- width: 400px;
7
- font-size: 100%;
8
- padding: 0.33rem;
9
- }
10
-
11
- [data-reach-combobox-popover] {
12
- position: absolute;
13
- top: 100%;
14
- left: 0px;
15
- width: auto;
16
- box-shadow: 0px 2px 6px hsla(0, 0%, 0%, 0.15);
17
- border: none;
18
- }
19
-
20
- [data-reach-combobox-list] {
21
- padding: 0 8px;
22
- max-height: 100px;
23
- overflow-y: scroll
24
- }
25
-
26
- [data-reach-combobox-option] {
27
- list-style: none;
28
- }
29
-
30
- [data-reach-combobox-option][data-highlighted] {
31
- background-color: #f1f2f4;
32
- }
1
+ [data-reach-combobox] {
2
+ position: relative;
3
+ }
4
+
5
+ [data-reach-combobox-input] {
6
+ width: 400px;
7
+ font-size: 100%;
8
+ padding: 0.33rem;
9
+ }
10
+
11
+ [data-reach-combobox-popover] {
12
+ position: absolute;
13
+ top: 100%;
14
+ left: 0px;
15
+ width: auto;
16
+ box-shadow: 0px 2px 6px hsla(0, 0%, 0%, 0.15);
17
+ border: none;
18
+ }
19
+
20
+ [data-reach-combobox-list] {
21
+ padding: 0 8px;
22
+ max-height: 100px;
23
+ overflow-y: scroll
24
+ }
25
+
26
+ [data-reach-combobox-option] {
27
+ list-style: none;
28
+ }
29
+
30
+ [data-reach-combobox-option][data-highlighted] {
31
+ background-color: #f1f2f4;
32
+ }
@@ -1,66 +1,66 @@
1
- import type {
2
- ElementType,
3
- FC,
4
- HTMLAttributes,
5
- MutableRefObject,
6
- ReactNode,
7
- } from 'react';
8
- import { useRef } from 'react';
9
-
10
- import { useFocusLock } from './useFocusLock';
11
-
12
- export interface FocusLockProps extends HTMLAttributes<HTMLDivElement> {
13
- as?: ElementType<any>;
14
- innerAs?: ElementType<any>;
15
- children?: ReactNode;
16
- childRef: MutableRefObject<HTMLElement | null>;
17
- enabled?: boolean;
18
- }
19
-
20
- export const FocusLock: FC<FocusLockProps> = function FocusLock(props) {
21
- const {
22
- as: Comp = 'div',
23
- childRef,
24
- enabled = false,
25
- style = {},
26
- children,
27
- ...otherProps
28
- } = props;
29
- const lockStartRef = useRef<HTMLElement>(null);
30
- const lockEndRef = useRef<HTMLElement>(null);
31
-
32
- useFocusLock(childRef, { enabled, lockStartRef, lockEndRef });
33
-
34
- const lockStyle = {
35
- width: 1,
36
- height: 0,
37
- padding: 0,
38
- overflow: 'hidden',
39
- position: 'fixed',
40
- top: 1,
41
- left: 1,
42
- ...style,
43
- };
44
-
45
- return (
46
- <>
47
- <Comp
48
- ref={lockStartRef}
49
- data-focus-lock-start=""
50
- aria-hidden={true}
51
- tabIndex={0}
52
- style={lockStyle}
53
- {...otherProps}
54
- />
55
- {children}
56
- <Comp
57
- ref={lockEndRef}
58
- data-focus-lock-end=""
59
- aria-hidden={true}
60
- tabIndex={0}
61
- style={lockStyle}
62
- {...otherProps}
63
- />
64
- </>
65
- );
66
- };
1
+ import type {
2
+ ElementType,
3
+ FC,
4
+ HTMLAttributes,
5
+ MutableRefObject,
6
+ ReactNode,
7
+ } from 'react';
8
+ import { useRef } from 'react';
9
+
10
+ import { useFocusLock } from './useFocusLock';
11
+
12
+ export interface FocusLockProps extends HTMLAttributes<HTMLDivElement> {
13
+ as?: ElementType<any>;
14
+ innerAs?: ElementType<any>;
15
+ children?: ReactNode;
16
+ childRef: MutableRefObject<HTMLElement | null>;
17
+ enabled?: boolean;
18
+ }
19
+
20
+ export const FocusLock: FC<FocusLockProps> = function FocusLock(props) {
21
+ const {
22
+ as: Comp = 'div',
23
+ childRef,
24
+ enabled = false,
25
+ style = {},
26
+ children,
27
+ ...otherProps
28
+ } = props;
29
+ const lockStartRef = useRef<HTMLElement>(null);
30
+ const lockEndRef = useRef<HTMLElement>(null);
31
+
32
+ useFocusLock(childRef, { enabled, lockStartRef, lockEndRef });
33
+
34
+ const lockStyle = {
35
+ width: 1,
36
+ height: 0,
37
+ padding: 0,
38
+ overflow: 'hidden',
39
+ position: 'fixed',
40
+ top: 1,
41
+ left: 1,
42
+ ...style,
43
+ };
44
+
45
+ return (
46
+ <>
47
+ <Comp
48
+ ref={lockStartRef}
49
+ data-focus-lock-start=""
50
+ aria-hidden={true}
51
+ tabIndex={0}
52
+ style={lockStyle}
53
+ {...otherProps}
54
+ />
55
+ {children}
56
+ <Comp
57
+ ref={lockEndRef}
58
+ data-focus-lock-end=""
59
+ aria-hidden={true}
60
+ tabIndex={0}
61
+ style={lockStyle}
62
+ {...otherProps}
63
+ />
64
+ </>
65
+ );
66
+ };
@@ -1 +1 @@
1
- export * from './FocusLock';
1
+ export * from './FocusLock';
@@ -1,40 +1,40 @@
1
- export const tabblable = [
2
- 'button:enabled:not([readonly])',
3
- 'select:enabled:not([readonly])',
4
- 'textarea:enabled:not([readonly])',
5
- 'input:enabled:not([readonly])',
6
-
7
- 'a[href]',
8
- 'area[href]',
9
-
10
- 'iframe',
11
- 'object',
12
- 'embed',
13
-
14
- '[tabindex]',
15
- '[contenteditable]',
16
- '[autofocus]',
17
- ].join(',');
18
-
19
- /* This is naive and will not consider tabIndex */
20
- export const getTabblableNodes = (
21
- parentNode: HTMLElement | null
22
- ): HTMLElement[] => {
23
- if (!parentNode) {
24
- return [];
25
- }
26
-
27
- return Array.from(parentNode.querySelectorAll(tabblable));
28
- };
29
-
30
- export function focusOnChildNode(parentNode: HTMLElement, itemIndex: 0 | -1) {
31
- const elements = getTabblableNodes(parentNode);
32
- if (elements.length > 0) {
33
- elements[itemIndex === -1 ? elements.length - 1 : 0].focus();
34
- } else {
35
- const currentTabIndex = parentNode.tabIndex;
36
- parentNode.tabIndex = 0;
37
- parentNode.focus();
38
- parentNode.tabIndex = currentTabIndex;
39
- }
40
- }
1
+ export const tabblable = [
2
+ 'button:enabled:not([readonly])',
3
+ 'select:enabled:not([readonly])',
4
+ 'textarea:enabled:not([readonly])',
5
+ 'input:enabled:not([readonly])',
6
+
7
+ 'a[href]',
8
+ 'area[href]',
9
+
10
+ 'iframe',
11
+ 'object',
12
+ 'embed',
13
+
14
+ '[tabindex]',
15
+ '[contenteditable]',
16
+ '[autofocus]',
17
+ ].join(',');
18
+
19
+ /* This is naive and will not consider tabIndex */
20
+ export const getTabblableNodes = (
21
+ parentNode: HTMLElement | null
22
+ ): HTMLElement[] => {
23
+ if (!parentNode) {
24
+ return [];
25
+ }
26
+
27
+ return Array.from(parentNode.querySelectorAll(tabblable));
28
+ };
29
+
30
+ export function focusOnChildNode(parentNode: HTMLElement, itemIndex: 0 | -1) {
31
+ const elements = getTabblableNodes(parentNode);
32
+ if (elements.length > 0) {
33
+ elements[itemIndex === -1 ? elements.length - 1 : 0].focus();
34
+ } else {
35
+ const currentTabIndex = parentNode.tabIndex;
36
+ parentNode.tabIndex = 0;
37
+ parentNode.focus();
38
+ parentNode.tabIndex = currentTabIndex;
39
+ }
40
+ }
@@ -1,56 +1,56 @@
1
- import type { MutableRefObject } from 'react';
2
- import { useEffect } from 'react';
3
-
4
- import { focusOnChildNode } from './tabUtils';
5
-
6
- export interface FocusLockOptions {
7
- enabled: boolean;
8
- lockStartRef: MutableRefObject<HTMLElement | null>;
9
- lockEndRef: MutableRefObject<HTMLElement | null>;
10
- }
11
-
12
- const focusLockStack: HTMLElement[] = [];
13
- export function useFocusLock(
14
- ref: MutableRefObject<HTMLElement | null>,
15
- opts: FocusLockOptions
16
- ) {
17
- const { enabled = true, lockStartRef, lockEndRef } = opts;
18
-
19
- useEffect(() => {
20
- const rootEl = ref.current;
21
- if (enabled && rootEl) {
22
- focusLockStack.push(rootEl);
23
-
24
- const listener = (event: FocusEvent) => {
25
- const isActiveFocusLock =
26
- focusLockStack[focusLockStack.length - 1] === rootEl;
27
- if (!isActiveFocusLock) {
28
- // Not the currently focused lock. Forget about it.
29
- return;
30
- }
31
-
32
- if (event.target === lockEndRef.current) {
33
- focusOnChildNode(rootEl, 0);
34
- } else if (event.target === lockStartRef.current) {
35
- focusOnChildNode(rootEl, -1);
36
- } else if (
37
- document !== event.target &&
38
- rootEl !== event.target &&
39
- !rootEl.contains(event.target as any)
40
- ) {
41
- event.preventDefault();
42
- focusOnChildNode(rootEl, 0);
43
- }
44
- };
45
-
46
- document.addEventListener('focusin', listener);
47
- return () => {
48
- document.removeEventListener('focusin', listener);
49
-
50
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
51
- focusLockStack.pop();
52
- };
53
- }
54
- // eslint-disable-next-line react-hooks/exhaustive-deps
55
- }, [enabled]);
56
- }
1
+ import type { MutableRefObject } from 'react';
2
+ import { useEffect } from 'react';
3
+
4
+ import { focusOnChildNode } from './tabUtils';
5
+
6
+ export interface FocusLockOptions {
7
+ enabled: boolean;
8
+ lockStartRef: MutableRefObject<HTMLElement | null>;
9
+ lockEndRef: MutableRefObject<HTMLElement | null>;
10
+ }
11
+
12
+ const focusLockStack: HTMLElement[] = [];
13
+ export function useFocusLock(
14
+ ref: MutableRefObject<HTMLElement | null>,
15
+ opts: FocusLockOptions
16
+ ) {
17
+ const { enabled = true, lockStartRef, lockEndRef } = opts;
18
+
19
+ useEffect(() => {
20
+ const rootEl = ref.current;
21
+ if (enabled && rootEl) {
22
+ focusLockStack.push(rootEl);
23
+
24
+ const listener = (event: FocusEvent) => {
25
+ const isActiveFocusLock =
26
+ focusLockStack[focusLockStack.length - 1] === rootEl;
27
+ if (!isActiveFocusLock) {
28
+ // Not the currently focused lock. Forget about it.
29
+ return;
30
+ }
31
+
32
+ if (event.target === lockEndRef.current) {
33
+ focusOnChildNode(rootEl, 0);
34
+ } else if (event.target === lockStartRef.current) {
35
+ focusOnChildNode(rootEl, -1);
36
+ } else if (
37
+ document !== event.target &&
38
+ rootEl !== event.target &&
39
+ !rootEl.contains(event.target as any)
40
+ ) {
41
+ event.preventDefault();
42
+ focusOnChildNode(rootEl, 0);
43
+ }
44
+ };
45
+
46
+ document.addEventListener('focusin', listener);
47
+ return () => {
48
+ document.removeEventListener('focusin', listener);
49
+
50
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
51
+ focusLockStack.pop();
52
+ };
53
+ }
54
+ // eslint-disable-next-line react-hooks/exhaustive-deps
55
+ }, [enabled]);
56
+ }
@@ -1,18 +1,18 @@
1
- import { List, ListItem } from './';
2
- // import './styles.css';
3
-
4
- export default {
5
- title: 'components/List',
6
- };
7
-
8
- const Example = () => {
9
- return (
10
- <List>
11
- <ListItem>Item 1</ListItem>
12
- <ListItem>Item 2</ListItem>
13
- <ListItem>Item 3</ListItem>
14
- </List>
15
- );
16
- };
17
-
18
- export const Controlled = () => <Example />;
1
+ import { List, ListItem } from './';
2
+ // import './styles.css';
3
+
4
+ export default {
5
+ title: 'components/List',
6
+ };
7
+
8
+ const Example = () => {
9
+ return (
10
+ <List>
11
+ <ListItem>Item 1</ListItem>
12
+ <ListItem>Item 2</ListItem>
13
+ <ListItem>Item 3</ListItem>
14
+ </List>
15
+ );
16
+ };
17
+
18
+ export const Controlled = () => <Example />;
package/src/List/List.tsx CHANGED
@@ -1,17 +1,17 @@
1
- import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
- import { forwardRef } from 'react';
3
-
4
- export interface ListProps extends HTMLAttributes<HTMLUListElement> {
5
- as?: ElementType<any>;
6
- innerAs?: ElementType<any>;
7
- children?: ReactNode;
8
- }
9
-
10
- export const List = forwardRef<HTMLUListElement, ListProps>(function List(
11
- props,
12
- forwardedRef
13
- ) {
14
- const { as: Comp = 'ul', ...otherProps } = props;
15
-
16
- return <Comp ref={forwardedRef} {...otherProps} />;
17
- });
1
+ import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
+ import { forwardRef } from 'react';
3
+
4
+ export interface ListProps extends HTMLAttributes<HTMLUListElement> {
5
+ as?: ElementType<any>;
6
+ innerAs?: ElementType<any>;
7
+ children?: ReactNode;
8
+ }
9
+
10
+ export const List = forwardRef<HTMLUListElement, ListProps>(function List(
11
+ props,
12
+ forwardedRef
13
+ ) {
14
+ const { as: Comp = 'ul', ...otherProps } = props;
15
+
16
+ return <Comp ref={forwardedRef} {...otherProps} />;
17
+ });
@@ -1,23 +1,23 @@
1
- import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
- import { forwardRef } from 'react';
3
-
4
- export interface ListItemProps extends HTMLAttributes<HTMLLIElement> {
5
- as?: ElementType<any>;
6
- innerAs?: ElementType<any>;
7
- children?: ReactNode;
8
- }
9
-
10
- export const ListItem = forwardRef<HTMLLIElement, ListItemProps>(
11
- function ListItem(props, forwardedRef) {
12
- const { as: Comp = 'li', ...otherProps } = props;
13
-
14
- return (
15
- <Comp
16
- tabIndex={-1}
17
- data-list-item=""
18
- ref={forwardedRef}
19
- {...otherProps}
20
- />
21
- );
22
- }
23
- );
1
+ import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
+ import { forwardRef } from 'react';
3
+
4
+ export interface ListItemProps extends HTMLAttributes<HTMLLIElement> {
5
+ as?: ElementType<any>;
6
+ innerAs?: ElementType<any>;
7
+ children?: ReactNode;
8
+ }
9
+
10
+ export const ListItem = forwardRef<HTMLLIElement, ListItemProps>(
11
+ function ListItem(props, forwardedRef) {
12
+ const { as: Comp = 'li', ...otherProps } = props;
13
+
14
+ return (
15
+ <Comp
16
+ tabIndex={-1}
17
+ data-list-item=""
18
+ ref={forwardedRef}
19
+ {...otherProps}
20
+ />
21
+ );
22
+ }
23
+ );
@@ -1,19 +1,19 @@
1
- import { createContext, useContext } from 'react';
2
-
3
- // List Component
4
- export interface ListContextProps {
5
- id: string | undefined;
6
- }
7
-
8
- const ListContext = createContext<ListContextProps | null>(null);
9
- ListContext.displayName = 'ListContext';
10
-
11
- export const useListContext = (): ListContextProps => {
12
- const ctx = useContext(ListContext);
13
- if (!ctx) {
14
- throw new Error(
15
- 'useListContext must be used within a ListContext.Provider'
16
- );
17
- }
18
- return ctx;
19
- };
1
+ import { createContext, useContext } from 'react';
2
+
3
+ // List Component
4
+ export interface ListContextProps {
5
+ id: string | undefined;
6
+ }
7
+
8
+ const ListContext = createContext<ListContextProps | null>(null);
9
+ ListContext.displayName = 'ListContext';
10
+
11
+ export const useListContext = (): ListContextProps => {
12
+ const ctx = useContext(ListContext);
13
+ if (!ctx) {
14
+ throw new Error(
15
+ 'useListContext must be used within a ListContext.Provider'
16
+ );
17
+ }
18
+ return ctx;
19
+ };
package/src/List/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from './List';
2
- export * from './ListItem';
1
+ export * from './List';
2
+ export * from './ListItem';