@sanity/ui 3.3.2 → 3.3.4

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 (437) hide show
  1. package/dist/index.d.mts +8 -8
  2. package/dist/index.d.mts.map +1 -1
  3. package/dist/index.d.ts +8 -8
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +16 -16
  6. package/dist/index.mjs +16 -16
  7. package/dist/index.mjs.map +1 -1
  8. package/dist/tabList.js +2 -2
  9. package/dist/tabList.mjs +2 -2
  10. package/dist/tabList.mjs.map +1 -1
  11. package/dist/useTheme.d.mts +3 -3
  12. package/dist/useTheme.d.mts.map +1 -1
  13. package/dist/useTheme.d.ts +3 -3
  14. package/dist/useTheme.d.ts.map +1 -1
  15. package/package.json +8 -13
  16. package/exports/_visual-editing.ts +0 -32
  17. package/exports/index.ts +0 -1
  18. package/exports/theme.ts +0 -1
  19. package/src/core/_compat.ts +0 -294
  20. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  21. package/src/core/components/autocomplete/autocomplete.tsx +0 -775
  22. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -46
  23. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  24. package/src/core/components/autocomplete/constants.ts +0 -28
  25. package/src/core/components/autocomplete/index.ts +0 -2
  26. package/src/core/components/autocomplete/types.ts +0 -108
  27. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  28. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -54
  29. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -136
  30. package/src/core/components/breadcrumbs/index.ts +0 -1
  31. package/src/core/components/dialog/dialog.tsx +0 -433
  32. package/src/core/components/dialog/dialogContext.ts +0 -20
  33. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  34. package/src/core/components/dialog/index.ts +0 -4
  35. package/src/core/components/dialog/styles.ts +0 -77
  36. package/src/core/components/dialog/useDialog.ts +0 -11
  37. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -47
  38. package/src/core/components/hotkeys/hotkeys.tsx +0 -68
  39. package/src/core/components/hotkeys/index.ts +0 -1
  40. package/src/core/components/index.ts +0 -9
  41. package/src/core/components/menu/helpers.ts +0 -82
  42. package/src/core/components/menu/index.ts +0 -5
  43. package/src/core/components/menu/menu.spacing.test.tsx +0 -68
  44. package/src/core/components/menu/menu.test.tsx +0 -128
  45. package/src/core/components/menu/menu.tsx +0 -180
  46. package/src/core/components/menu/menuButton.tsx +0 -276
  47. package/src/core/components/menu/menuContext.ts +0 -18
  48. package/src/core/components/menu/menuDivider.ts +0 -24
  49. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -66
  50. package/src/core/components/menu/menuGroup.tsx +0 -237
  51. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -62
  52. package/src/core/components/menu/menuItem.tsx +0 -201
  53. package/src/core/components/menu/useMenu.ts +0 -21
  54. package/src/core/components/menu/useMenuController.ts +0 -233
  55. package/src/core/components/skeleton/index.ts +0 -2
  56. package/src/core/components/skeleton/skeleton.tsx +0 -58
  57. package/src/core/components/skeleton/styles.ts +0 -50
  58. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  59. package/src/core/components/tab/index.ts +0 -3
  60. package/src/core/components/tab/tab.tsx +0 -102
  61. package/src/core/components/tab/tabList.test.tsx +0 -50
  62. package/src/core/components/tab/tabList.tsx +0 -71
  63. package/src/core/components/tab/tabPanel.tsx +0 -39
  64. package/src/core/components/toast/index.ts +0 -4
  65. package/src/core/components/toast/styles.ts +0 -77
  66. package/src/core/components/toast/toast.test.tsx +0 -106
  67. package/src/core/components/toast/toast.tsx +0 -199
  68. package/src/core/components/toast/toastContext.ts +0 -7
  69. package/src/core/components/toast/toastLayer.tsx +0 -52
  70. package/src/core/components/toast/toastProvider.tsx +0 -113
  71. package/src/core/components/toast/toastState.ts +0 -6
  72. package/src/core/components/toast/types.ts +0 -26
  73. package/src/core/components/toast/useToast.ts +0 -25
  74. package/src/core/components/tree/helpers.ts +0 -105
  75. package/src/core/components/tree/index.ts +0 -4
  76. package/src/core/components/tree/style.ts +0 -105
  77. package/src/core/components/tree/tree.test.tsx +0 -60
  78. package/src/core/components/tree/tree.tsx +0 -242
  79. package/src/core/components/tree/treeContext.ts +0 -10
  80. package/src/core/components/tree/treeGroup.tsx +0 -29
  81. package/src/core/components/tree/treeItem.test.tsx +0 -70
  82. package/src/core/components/tree/treeItem.tsx +0 -225
  83. package/src/core/components/tree/types.ts +0 -25
  84. package/src/core/components/tree/useTree.ts +0 -17
  85. package/src/core/constants.ts +0 -79
  86. package/src/core/helpers/animation.ts +0 -27
  87. package/src/core/helpers/element.ts +0 -55
  88. package/src/core/helpers/focus.ts +0 -100
  89. package/src/core/helpers/index.ts +0 -4
  90. package/src/core/helpers/scroll.ts +0 -15
  91. package/src/core/hooks/index.ts +0 -13
  92. package/src/core/hooks/useArrayProp.ts +0 -17
  93. package/src/core/hooks/useClickOutside.test.tsx +0 -510
  94. package/src/core/hooks/useClickOutside.ts +0 -118
  95. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -119
  96. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  97. package/src/core/hooks/useCustomValidity.ts +0 -13
  98. package/src/core/hooks/useDelayed.test.ts +0 -89
  99. package/src/core/hooks/useDelayedState.ts +0 -36
  100. package/src/core/hooks/useElementRect/index.ts +0 -1
  101. package/src/core/hooks/useElementRect/useElementRect.ts +0 -14
  102. package/src/core/hooks/useElementSize.ts +0 -19
  103. package/src/core/hooks/useForwardedRef.ts +0 -20
  104. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  105. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  106. package/src/core/hooks/useMatchMedia.ts +0 -28
  107. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  108. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -37
  109. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  110. package/src/core/hooks/useMounted.ts +0 -15
  111. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -58
  112. package/src/core/hooks/usePrefersDark.test.tsx +0 -21
  113. package/src/core/hooks/usePrefersDark.ts +0 -16
  114. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -58
  115. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -21
  116. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  117. package/src/core/index.ts +0 -10
  118. package/src/core/lib/createGlobalScopedContext.ts +0 -37
  119. package/src/core/lib/globalScope.ts +0 -20
  120. package/src/core/lib/isRecord.ts +0 -3
  121. package/src/core/middleware/origin.ts +0 -47
  122. package/src/core/observers/elementSizeObserver.ts +0 -117
  123. package/src/core/observers/index.ts +0 -2
  124. package/src/core/observers/resizeObserver.ts +0 -9
  125. package/src/core/primitives/_selectable/index.ts +0 -1
  126. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  127. package/src/core/primitives/_selectable/style.ts +0 -115
  128. package/src/core/primitives/avatar/avatar.tsx +0 -200
  129. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  130. package/src/core/primitives/avatar/avatarStack.tsx +0 -101
  131. package/src/core/primitives/avatar/index.ts +0 -4
  132. package/src/core/primitives/avatar/styles.ts +0 -167
  133. package/src/core/primitives/avatar/types.ts +0 -17
  134. package/src/core/primitives/badge/badge.test.tsx +0 -17
  135. package/src/core/primitives/badge/badge.tsx +0 -72
  136. package/src/core/primitives/badge/index.ts +0 -1
  137. package/src/core/primitives/badge/styles.ts +0 -20
  138. package/src/core/primitives/badge/types.ts +0 -8
  139. package/src/core/primitives/box/box.test.tsx +0 -155
  140. package/src/core/primitives/box/box.tsx +0 -162
  141. package/src/core/primitives/box/index.ts +0 -1
  142. package/src/core/primitives/button/button.test.tsx +0 -86
  143. package/src/core/primitives/button/button.tsx +0 -214
  144. package/src/core/primitives/button/index.ts +0 -1
  145. package/src/core/primitives/button/styles.ts +0 -118
  146. package/src/core/primitives/card/card.tsx +0 -125
  147. package/src/core/primitives/card/index.ts +0 -2
  148. package/src/core/primitives/card/styles.ts +0 -147
  149. package/src/core/primitives/card/types.ts +0 -12
  150. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  151. package/src/core/primitives/checkbox/index.ts +0 -1
  152. package/src/core/primitives/checkbox/styles.ts +0 -128
  153. package/src/core/primitives/code/code.tsx +0 -56
  154. package/src/core/primitives/code/index.ts +0 -1
  155. package/src/core/primitives/code/refractor.tsx +0 -22
  156. package/src/core/primitives/code/styles.ts +0 -77
  157. package/src/core/primitives/container/container.tsx +0 -55
  158. package/src/core/primitives/container/index.ts +0 -2
  159. package/src/core/primitives/container/styles.ts +0 -23
  160. package/src/core/primitives/container/types.ts +0 -6
  161. package/src/core/primitives/flex/flex.tsx +0 -63
  162. package/src/core/primitives/flex/index.ts +0 -1
  163. package/src/core/primitives/grid/grid.test.tsx +0 -86
  164. package/src/core/primitives/grid/grid.tsx +0 -77
  165. package/src/core/primitives/grid/index.ts +0 -1
  166. package/src/core/primitives/heading/heading.tsx +0 -89
  167. package/src/core/primitives/heading/index.ts +0 -1
  168. package/src/core/primitives/heading/styles.ts +0 -64
  169. package/src/core/primitives/heading/types.ts +0 -7
  170. package/src/core/primitives/index.ts +0 -27
  171. package/src/core/primitives/inline/index.ts +0 -1
  172. package/src/core/primitives/inline/inline.test.tsx +0 -55
  173. package/src/core/primitives/inline/inline.tsx +0 -66
  174. package/src/core/primitives/inline/styles.ts +0 -32
  175. package/src/core/primitives/inline/types.ts +0 -6
  176. package/src/core/primitives/kbd/index.ts +0 -1
  177. package/src/core/primitives/kbd/kbd.tsx +0 -73
  178. package/src/core/primitives/label/index.ts +0 -1
  179. package/src/core/primitives/label/label.tsx +0 -88
  180. package/src/core/primitives/label/styles.ts +0 -45
  181. package/src/core/primitives/popover/constants.ts +0 -22
  182. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  183. package/src/core/primitives/popover/helpers.ts +0 -31
  184. package/src/core/primitives/popover/index.ts +0 -2
  185. package/src/core/primitives/popover/popover.tsx +0 -512
  186. package/src/core/primitives/popover/popoverCard.tsx +0 -167
  187. package/src/core/primitives/popover/types.ts +0 -6
  188. package/src/core/primitives/radio/index.ts +0 -1
  189. package/src/core/primitives/radio/radio.tsx +0 -51
  190. package/src/core/primitives/radio/styles.ts +0 -117
  191. package/src/core/primitives/select/index.ts +0 -1
  192. package/src/core/primitives/select/select.test.tsx +0 -56
  193. package/src/core/primitives/select/select.tsx +0 -95
  194. package/src/core/primitives/select/styles.ts +0 -166
  195. package/src/core/primitives/spinner/index.ts +0 -1
  196. package/src/core/primitives/spinner/spinner.tsx +0 -46
  197. package/src/core/primitives/stack/index.ts +0 -1
  198. package/src/core/primitives/stack/stack.test.tsx +0 -61
  199. package/src/core/primitives/stack/stack.tsx +0 -59
  200. package/src/core/primitives/stack/styles.ts +0 -33
  201. package/src/core/primitives/switch/index.ts +0 -1
  202. package/src/core/primitives/switch/styles.ts +0 -173
  203. package/src/core/primitives/switch/switch.tsx +0 -68
  204. package/src/core/primitives/text/index.ts +0 -1
  205. package/src/core/primitives/text/styles.ts +0 -74
  206. package/src/core/primitives/text/text.tsx +0 -90
  207. package/src/core/primitives/textArea/index.ts +0 -1
  208. package/src/core/primitives/textArea/textArea.tsx +0 -120
  209. package/src/core/primitives/textInput/index.ts +0 -1
  210. package/src/core/primitives/textInput/textInput.test.tsx +0 -52
  211. package/src/core/primitives/textInput/textInput.tsx +0 -398
  212. package/src/core/primitives/tooltip/constants.ts +0 -23
  213. package/src/core/primitives/tooltip/index.ts +0 -2
  214. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -485
  215. package/src/core/primitives/tooltip/tooltip.tsx +0 -497
  216. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -110
  217. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  218. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  219. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  220. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -12
  221. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  222. package/src/core/primitives/types.ts +0 -179
  223. package/src/core/styles/border/borderStyle.ts +0 -56
  224. package/src/core/styles/border/index.ts +0 -2
  225. package/src/core/styles/border/types.ts +0 -10
  226. package/src/core/styles/box/boxStyle.ts +0 -69
  227. package/src/core/styles/box/index.ts +0 -2
  228. package/src/core/styles/box/types.ts +0 -11
  229. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  230. package/src/core/styles/card/index.ts +0 -1
  231. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  232. package/src/core/styles/flex/flexStyle.ts +0 -70
  233. package/src/core/styles/flex/index.ts +0 -3
  234. package/src/core/styles/flex/types.ts +0 -24
  235. package/src/core/styles/focusRing/index.ts +0 -25
  236. package/src/core/styles/font/codeFontStyle.ts +0 -13
  237. package/src/core/styles/font/headingFontStyle.ts +0 -13
  238. package/src/core/styles/font/index.ts +0 -6
  239. package/src/core/styles/font/labelFontStyle.ts +0 -13
  240. package/src/core/styles/font/responsiveFont.ts +0 -100
  241. package/src/core/styles/font/textAlignStyle.ts +0 -19
  242. package/src/core/styles/font/textFontStyle.ts +0 -13
  243. package/src/core/styles/font/types.ts +0 -33
  244. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  245. package/src/core/styles/grid/gridStyle.ts +0 -109
  246. package/src/core/styles/grid/index.ts +0 -3
  247. package/src/core/styles/grid/types.ts +0 -37
  248. package/src/core/styles/helpers.ts +0 -72
  249. package/src/core/styles/index.ts +0 -5
  250. package/src/core/styles/input/index.ts +0 -2
  251. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  252. package/src/core/styles/input/textInputStyle.ts +0 -263
  253. package/src/core/styles/internal.ts +0 -12
  254. package/src/core/styles/margin/index.ts +0 -2
  255. package/src/core/styles/margin/marginStyle.ts +0 -22
  256. package/src/core/styles/margin/marginsStyle.test.ts +0 -34
  257. package/src/core/styles/margin/types.ts +0 -9
  258. package/src/core/styles/padding/index.ts +0 -2
  259. package/src/core/styles/padding/paddingStyle.test.ts +0 -34
  260. package/src/core/styles/padding/paddingStyle.ts +0 -22
  261. package/src/core/styles/padding/types.ts +0 -12
  262. package/src/core/styles/radius/index.ts +0 -2
  263. package/src/core/styles/radius/radiusStyle.ts +0 -23
  264. package/src/core/styles/radius/types.ts +0 -8
  265. package/src/core/styles/shadow/index.ts +0 -2
  266. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  267. package/src/core/styles/shadow/types.ts +0 -6
  268. package/src/core/styles/types.ts +0 -8
  269. package/src/core/theme/index.ts +0 -5
  270. package/src/core/theme/theme.test.tsx +0 -77
  271. package/src/core/theme/themeColorProvider.tsx +0 -29
  272. package/src/core/theme/themeContext.ts +0 -10
  273. package/src/core/theme/themeProvider.tsx +0 -62
  274. package/src/core/theme/types.ts +0 -12
  275. package/src/core/theme/useRootTheme.ts +0 -18
  276. package/src/core/theme/useTheme.ts +0 -18
  277. package/src/core/types/avatar.ts +0 -14
  278. package/src/core/types/badge.ts +0 -12
  279. package/src/core/types/box.ts +0 -19
  280. package/src/core/types/button.ts +0 -21
  281. package/src/core/types/card.ts +0 -6
  282. package/src/core/types/component.ts +0 -32
  283. package/src/core/types/dialog.ts +0 -4
  284. package/src/core/types/flex.ts +0 -30
  285. package/src/core/types/grid.ts +0 -14
  286. package/src/core/types/gridItem.ts +0 -29
  287. package/src/core/types/index.ts +0 -15
  288. package/src/core/types/placement.ts +0 -18
  289. package/src/core/types/popover.ts +0 -4
  290. package/src/core/types/radius.ts +0 -4
  291. package/src/core/types/selectable.ts +0 -6
  292. package/src/core/types/text.ts +0 -4
  293. package/src/core/utils/arrow/arrow.tsx +0 -124
  294. package/src/core/utils/arrow/cmds.ts +0 -91
  295. package/src/core/utils/arrow/index.ts +0 -1
  296. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -105
  297. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  298. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  299. package/src/core/utils/boundaryElement/index.ts +0 -3
  300. package/src/core/utils/boundaryElement/types.ts +0 -7
  301. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  302. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -22
  303. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  304. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  305. package/src/core/utils/elementQuery/helpers.ts +0 -27
  306. package/src/core/utils/elementQuery/index.ts +0 -1
  307. package/src/core/utils/errorBoundary.tsx +0 -48
  308. package/src/core/utils/getElementRef.ts +0 -31
  309. package/src/core/utils/index.ts +0 -9
  310. package/src/core/utils/layer/getLayerContext.test.ts +0 -32
  311. package/src/core/utils/layer/getLayerContext.ts +0 -21
  312. package/src/core/utils/layer/index.ts +0 -4
  313. package/src/core/utils/layer/layer.test.tsx +0 -113
  314. package/src/core/utils/layer/layer.tsx +0 -99
  315. package/src/core/utils/layer/layerContext.ts +0 -7
  316. package/src/core/utils/layer/layerProvider.tsx +0 -111
  317. package/src/core/utils/layer/types.ts +0 -9
  318. package/src/core/utils/layer/useLayer.ts +0 -28
  319. package/src/core/utils/portal/index.ts +0 -4
  320. package/src/core/utils/portal/portal.test.tsx +0 -108
  321. package/src/core/utils/portal/portal.ts +0 -32
  322. package/src/core/utils/portal/portalContext.ts +0 -31
  323. package/src/core/utils/portal/portalProvider.tsx +0 -48
  324. package/src/core/utils/portal/types.ts +0 -9
  325. package/src/core/utils/portal/usePortal.ts +0 -25
  326. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  327. package/src/core/utils/srOnly/index.ts +0 -1
  328. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  329. package/src/core/utils/virtualList/index.ts +0 -1
  330. package/src/core/utils/virtualList/virtualList.tsx +0 -201
  331. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -86
  332. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -58
  333. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -27
  334. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -60
  335. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -66
  336. package/src/theme/build/_deprecated/color/color.test.ts +0 -67
  337. package/src/theme/build/_deprecated/color/defaults.ts +0 -391
  338. package/src/theme/build/_deprecated/color/factory.ts +0 -178
  339. package/src/theme/build/_deprecated/color/index.ts +0 -1
  340. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -86
  341. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -58
  342. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -23
  343. package/src/theme/build/buildColorTheme.test.ts +0 -185
  344. package/src/theme/build/buildColorTheme.ts +0 -507
  345. package/src/theme/build/buildTheme.test.ts +0 -89
  346. package/src/theme/build/buildTheme.ts +0 -36
  347. package/src/theme/build/colorToken/colorToken.ts +0 -19
  348. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  349. package/src/theme/build/colorToken/index.ts +0 -2
  350. package/src/theme/build/colorToken/types.ts +0 -6
  351. package/src/theme/build/index.ts +0 -3
  352. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  353. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  354. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  355. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  356. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -70
  357. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  358. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  359. package/src/theme/build/lib/color-fns/index.ts +0 -6
  360. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  361. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  362. package/src/theme/build/lib/color-fns/types.ts +0 -28
  363. package/src/theme/build/lib/isRecord.ts +0 -3
  364. package/src/theme/build/lib/lazy.ts +0 -30
  365. package/src/theme/build/lib/utils.ts +0 -19
  366. package/src/theme/build/merge.ts +0 -31
  367. package/src/theme/build/mixThemeColor.test.ts +0 -23
  368. package/src/theme/build/mixThemeColor.ts +0 -53
  369. package/src/theme/build/renderColorTheme.ts +0 -538
  370. package/src/theme/build/renderColorValue.ts +0 -83
  371. package/src/theme/build/resolveColorTokens.ts +0 -274
  372. package/src/theme/build/theme.test.ts +0 -29
  373. package/src/theme/config/helpers.ts +0 -60
  374. package/src/theme/config/index.ts +0 -4
  375. package/src/theme/config/system.ts +0 -117
  376. package/src/theme/config/tokens/color/index.ts +0 -1
  377. package/src/theme/config/tokens/color/types.ts +0 -135
  378. package/src/theme/config/tokens/index.ts +0 -4
  379. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -66
  380. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  381. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -44
  382. package/src/theme/config/tokens/parseTokenValue.ts +0 -134
  383. package/src/theme/config/tokens/types.ts +0 -53
  384. package/src/theme/config/types.ts +0 -46
  385. package/src/theme/defaults/colorPalette.ts +0 -5
  386. package/src/theme/defaults/colorTokens.ts +0 -648
  387. package/src/theme/defaults/config.ts +0 -84
  388. package/src/theme/defaults/fonts.ts +0 -227
  389. package/src/theme/getScopedTheme.ts +0 -103
  390. package/src/theme/index.ts +0 -5
  391. package/src/theme/system/avatar.ts +0 -14
  392. package/src/theme/system/color/_constants.ts +0 -45
  393. package/src/theme/system/color/_helpers.ts +0 -28
  394. package/src/theme/system/color/_system.ts +0 -40
  395. package/src/theme/system/color/avatar.ts +0 -15
  396. package/src/theme/system/color/badge.ts +0 -16
  397. package/src/theme/system/color/button.ts +0 -17
  398. package/src/theme/system/color/color.ts +0 -34
  399. package/src/theme/system/color/index.ts +0 -13
  400. package/src/theme/system/color/input.ts +0 -25
  401. package/src/theme/system/color/kbd.ts +0 -8
  402. package/src/theme/system/color/selectable.ts +0 -12
  403. package/src/theme/system/color/shadow.ts +0 -7
  404. package/src/theme/system/color/state.ts +0 -43
  405. package/src/theme/system/color/syntax.ts +0 -41
  406. package/src/theme/system/css.ts +0 -14
  407. package/src/theme/system/focusRing.ts +0 -7
  408. package/src/theme/system/font.ts +0 -52
  409. package/src/theme/system/index.ts +0 -11
  410. package/src/theme/system/input.ts +0 -33
  411. package/src/theme/system/layer.ts +0 -8
  412. package/src/theme/system/shadow.ts +0 -19
  413. package/src/theme/system/styles.ts +0 -13
  414. package/src/theme/system/theme.ts +0 -142
  415. package/src/theme/system/v0/avatar.ts +0 -10
  416. package/src/theme/system/v0/color/_generic.ts +0 -35
  417. package/src/theme/system/v0/color/_system.ts +0 -18
  418. package/src/theme/system/v0/color/base.ts +0 -21
  419. package/src/theme/system/v0/color/button.ts +0 -56
  420. package/src/theme/system/v0/color/card.ts +0 -25
  421. package/src/theme/system/v0/color/color.ts +0 -51
  422. package/src/theme/system/v0/color/index.ts +0 -11
  423. package/src/theme/system/v0/color/input.ts +0 -40
  424. package/src/theme/system/v0/color/muted.ts +0 -37
  425. package/src/theme/system/v0/color/selectable.ts +0 -42
  426. package/src/theme/system/v0/color/solid.ts +0 -37
  427. package/src/theme/system/v0/color/spot.ts +0 -14
  428. package/src/theme/system/v0/index.ts +0 -3
  429. package/src/theme/system/v0/input.ts +0 -23
  430. package/src/theme/versioning/getTheme_v2.ts +0 -72
  431. package/src/theme/versioning/index.ts +0 -5
  432. package/src/theme/versioning/is_v0.ts +0 -6
  433. package/src/theme/versioning/is_v2.ts +0 -6
  434. package/src/theme/versioning/themeColor_v0_v2.ts +0 -250
  435. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -50
  436. package/src/theme/versioning/v0_v2.ts +0 -106
  437. package/src/theme/versioning/v2_v0.ts +0 -153
@@ -1,510 +0,0 @@
1
- /** @vitest-environment jsdom */
2
-
3
- import {render, screen} from '@testing-library/react'
4
- import userEvent from '@testing-library/user-event'
5
- import {useEffect, useRef, useState} from 'react'
6
- import {describe, expect, it, vi} from 'vitest'
7
-
8
- import {useClickOutside} from './useClickOutside'
9
-
10
- describe('useClickOutside', () => {
11
- /**
12
- * Specifying the elements array directly:
13
- * useClickOutside(handler, [buttonElement, popoverElement])
14
- * instead of in a callback:
15
- * useClickOutside(handler, () => [buttonElement, popoverElement])
16
- * is still supported, but deprecated and discouraged. The same is true for the `setElement` callback pattern
17
- */
18
- it('calls the handler when clicking outside of the array of elements', async () => {
19
- const user = userEvent.setup()
20
- const handler = vi.fn()
21
-
22
- const TestComponent = () => {
23
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
24
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
25
-
26
- // oxlint-disable-next-line no-deprecated
27
- useClickOutside(handler, [buttonElement, popoverElement])
28
-
29
- return (
30
- <>
31
- {/* oxlint-disable-next-line control-has-associated-label */}
32
- <button data-testid="button" ref={setButtonElement} />
33
- <div data-testid="popover" ref={setPopoverElement} />
34
- <div data-testid="outside" />
35
- </>
36
- )
37
- }
38
-
39
- render(<TestComponent />)
40
-
41
- await user.click(screen.getByTestId('button'))
42
- await user.click(screen.getByTestId('popover'))
43
- expect(handler).not.toHaveBeenCalled()
44
-
45
- await user.click(screen.getByTestId('outside'))
46
- expect(handler).toHaveBeenCalledTimes(1)
47
- })
48
-
49
- it('the elements array flattens nested arrays one level deep', async () => {
50
- const user = userEvent.setup()
51
- const handler = vi.fn()
52
-
53
- const TestComponent = () => {
54
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
55
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
56
-
57
- // oxlint-disable-next-line no-deprecated
58
- useClickOutside(handler, [null, [null, buttonElement], [popoverElement, null], null])
59
-
60
- return (
61
- <>
62
- {/* oxlint-disable-next-line control-has-associated-label */}
63
- <button data-testid="button" ref={setButtonElement} />
64
- <div data-testid="popover" ref={setPopoverElement} />
65
- <div data-testid="outside" />
66
- </>
67
- )
68
- }
69
-
70
- render(<TestComponent />)
71
-
72
- await user.click(screen.getByTestId('button'))
73
- await user.click(screen.getByTestId('popover'))
74
- expect(handler).not.toHaveBeenCalled()
75
-
76
- await user.click(screen.getByTestId('outside'))
77
- expect(handler).toHaveBeenCalledTimes(1)
78
- })
79
-
80
- it('it can set a boundary to scope outside click events', async () => {
81
- const user = userEvent.setup()
82
- const handler = vi.fn()
83
-
84
- const TestComponent = () => {
85
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
86
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
87
- const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(null)
88
-
89
- // oxlint-disable-next-line no-deprecated
90
- useClickOutside(handler, [buttonElement, popoverElement], boundaryElement)
91
-
92
- return (
93
- <>
94
- <div ref={setBoundaryElement}>
95
- {/* oxlint-disable-next-line control-has-associated-label */}
96
- <button data-testid="button" ref={setButtonElement} />
97
- <div data-testid="popover" ref={setPopoverElement} />
98
- <div data-testid="inside" />
99
- </div>
100
- <div data-testid="outside" />
101
- </>
102
- )
103
- }
104
-
105
- render(<TestComponent />)
106
-
107
- await user.click(screen.getByTestId('button'))
108
- await user.click(screen.getByTestId('popover'))
109
- // Since it's outside the boundary it should be ignored
110
- await user.click(screen.getByTestId('outside'))
111
- expect(handler).not.toHaveBeenCalled()
112
-
113
- await user.click(screen.getByTestId('inside'))
114
- expect(handler).toHaveBeenCalledTimes(1)
115
- })
116
-
117
- it('it returns a `setElement` callback', async () => {
118
- /**
119
- * We don't use this pattern in the studio codebase anymore, and we don't recommend using it moving forward.
120
- * But since it's part of the public API we can't remove it without a major version bump.
121
- * Thus it makes sense to unit test it to ensure it works as expected and we don't accidentally break backwards compatibility.
122
- */
123
- const user = userEvent.setup()
124
- const handler = vi.fn()
125
-
126
- const TestComponent = (props: {open?: true}) => {
127
- const {open = false} = props
128
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
129
-
130
- // oxlint-disable-next-line no-deprecated
131
- const setElement = useClickOutside(handler, [buttonElement])
132
-
133
- return (
134
- <>
135
- {/* oxlint-disable-next-line control-has-associated-label */}
136
- <button data-testid="button" ref={setButtonElement} />
137
- {open && <div data-testid="popover" ref={setElement} />}
138
- <div data-testid="outside" />
139
- </>
140
- )
141
- }
142
-
143
- const {rerender} = render(<TestComponent />)
144
-
145
- await user.click(screen.getByTestId('button'))
146
- expect(handler).not.toHaveBeenCalled()
147
-
148
- await user.click(screen.getByTestId('outside'))
149
- expect(handler).toHaveBeenCalledTimes(1)
150
-
151
- // The popover isn't rendered yet
152
- expect(screen.queryByTestId('popover')).toBeNull()
153
-
154
- // Rerender the component with the popover open
155
- rerender(<TestComponent open />)
156
-
157
- // Clicking the popover should not trigger the handler
158
- await user.click(screen.getByTestId('popover'))
159
- expect(handler).toHaveBeenCalledTimes(1)
160
- })
161
-
162
- it('instead of `setElement`, update the `elements` array', async () => {
163
- /**
164
- * Since we don't want people to use the `setElement` pattern, test that userland can handle dynamically changing elements arrays
165
- */
166
- const user = userEvent.setup()
167
- const handler = vi.fn()
168
-
169
- const TestComponent = (props: {open?: true}) => {
170
- const {open = false} = props
171
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
172
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
173
-
174
- // oxlint-disable-next-line no-deprecated
175
- useClickOutside(handler, [buttonElement, popoverElement])
176
-
177
- return (
178
- <>
179
- {/* oxlint-disable-next-line control-has-associated-label */}
180
- <button data-testid="button" ref={setButtonElement} />
181
- {open && <div data-testid="popover" ref={setPopoverElement} />}
182
- <div data-testid="outside" />
183
- </>
184
- )
185
- }
186
-
187
- const {rerender} = render(<TestComponent />)
188
-
189
- await user.click(screen.getByTestId('button'))
190
- expect(handler).not.toHaveBeenCalled()
191
-
192
- await user.click(screen.getByTestId('outside'))
193
- expect(handler).toHaveBeenCalledTimes(1)
194
-
195
- // The popover isn't rendered yet
196
- expect(screen.queryByTestId('popover')).toBeNull()
197
-
198
- // Rerender the component with the popover open
199
- rerender(<TestComponent open />)
200
-
201
- // Clicking the popover should not trigger the handler
202
- await user.click(screen.getByTestId('popover'))
203
- expect(handler).toHaveBeenCalledTimes(1)
204
- })
205
-
206
- it('returning the current value of refs in the elements array is dangerous', async () => {
207
- /**
208
- * This test demonstrates why it's dangerous to return ref values in the elements array.
209
- * When using refs, pass a function returning the elements array, instead of defining the array directly during render
210
- */
211
-
212
- const user = userEvent.setup()
213
- let handler = vi.fn()
214
-
215
- /**
216
- * Using refs in the `useClickOutside` elements array is dangerous,
217
- * the below example demonstrates how `useClickOutside` doesn't "see" the current values of refs,
218
- * it can only "see" whatever the value of the ref was when the hook was rendered.
219
- */
220
- let TestComponent = () => {
221
- const buttonRef = useRef<HTMLButtonElement | null>(null)
222
- const popoverRef = useRef<HTMLDivElement | null>(null)
223
-
224
- // oxlint-disable-next-line no-deprecated
225
- useClickOutside(handler, [buttonRef.current, popoverRef.current])
226
-
227
- return (
228
- <>
229
- {/* oxlint-disable-next-line control-has-associated-label */}
230
- <button data-testid="button" ref={buttonRef} />
231
- <div data-testid="popover" ref={popoverRef} />
232
- </>
233
- )
234
- }
235
- const {rerender} = render(<TestComponent />)
236
- await user.click(screen.getByTestId('button'))
237
- await user.click(screen.getByTestId('popover'))
238
- // Because the ref values are stale, the handler is called
239
- expect(handler).toHaveBeenCalledTimes(2)
240
-
241
- /**
242
- * If a mixture of refs and state is used it can appear like it's working correctly,
243
- * but this is a side-effect, not an indication it's safe.
244
- */
245
- handler = vi.fn()
246
- TestComponent = () => {
247
- const buttonRef = useRef<HTMLButtonElement | null>(null)
248
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
249
-
250
- // oxlint-disable-next-line no-deprecated
251
- useClickOutside(handler, [buttonRef.current, popoverElement])
252
-
253
- return (
254
- <>
255
- {/* oxlint-disable-next-line control-has-associated-label */}
256
- <button data-testid="button" ref={buttonRef} />
257
- <div data-testid="popover" ref={setPopoverElement} />
258
- <div data-testid="outside" />
259
- </>
260
- )
261
- }
262
- rerender(<TestComponent />)
263
- await user.click(screen.getByTestId('button'))
264
- await user.click(screen.getByTestId('popover'))
265
- expect(handler).not.toHaveBeenCalled()
266
- await user.click(screen.getByTestId('outside'))
267
- expect(handler).toHaveBeenCalledTimes(1)
268
-
269
- /**
270
- * Unrelated state updates can create the same false impression of safety.
271
- */
272
- handler = vi.fn()
273
- TestComponent = () => {
274
- const buttonRef = useRef<HTMLButtonElement | null>(null)
275
- const popoverRef = useRef<HTMLDivElement | null>(null)
276
-
277
- // oxlint-disable-next-line no-deprecated
278
- useClickOutside(handler, [buttonRef.current, popoverRef.current])
279
-
280
- const [, tick] = useState(0)
281
- useEffect(() => {
282
- /**
283
- * This effect schedules a re-render, which will lead to `useClickOutsideHandler` "seeing"
284
- * the current value of the refs after they got assigned dom nodes when the React ref callbacks executed.
285
- */
286
- tick((prev) => ++prev)
287
- }, [])
288
-
289
- return (
290
- <>
291
- {/* oxlint-disable-next-line control-has-associated-label */}
292
- <button data-testid="button" ref={buttonRef} />
293
- <div data-testid="popover" ref={popoverRef} />
294
- <div data-testid="outside" />
295
- </>
296
- )
297
- }
298
- rerender(<TestComponent />)
299
- await user.click(screen.getByTestId('button'))
300
- await user.click(screen.getByTestId('popover'))
301
- expect(handler).not.toHaveBeenCalled()
302
- await user.click(screen.getByTestId('outside'))
303
- expect(handler).toHaveBeenCalledTimes(1)
304
-
305
- /**
306
- * When using the legacy version of the `useClickOutside` API it's necessary to synchronize mutable ref values
307
- * with a effect and state loop to ensure they're not stale
308
- */
309
- // oxlint-disable-next-line no-deprecated
310
- const useElementsFromRefs = (refs: React.MutableRefObject<HTMLElement | null>[]) => {
311
- const [elements, setElements] = useState(() => refs.map((ref) => ref.current))
312
-
313
- useEffect(() => {
314
- if (refs.length !== elements.length) {
315
- setElements(refs.map((ref) => ref.current))
316
- }
317
- for (const ref of refs) {
318
- if (!elements.includes(ref.current)) {
319
- setElements(refs.map((ref) => ref.current))
320
- return
321
- }
322
- }
323
- }, [elements, refs])
324
-
325
- return elements
326
- }
327
- handler = vi.fn()
328
- TestComponent = () => {
329
- const buttonRef = useRef<HTMLButtonElement | null>(null)
330
- const popoverRef = useRef<HTMLDivElement | null>(null)
331
-
332
- const elements = useElementsFromRefs([buttonRef, popoverRef])
333
- // oxlint-disable-next-line no-deprecated
334
- useClickOutside(handler, elements)
335
-
336
- return (
337
- <>
338
- {/* oxlint-disable-next-line control-has-associated-label */}
339
- <button data-testid="button" ref={buttonRef} />
340
- <div data-testid="popover" ref={popoverRef} />
341
- <div data-testid="outside" />
342
- </>
343
- )
344
- }
345
- rerender(<TestComponent />)
346
- await user.click(screen.getByTestId('button'))
347
- await user.click(screen.getByTestId('popover'))
348
- expect(handler).not.toHaveBeenCalled()
349
- await user.click(screen.getByTestId('outside'))
350
- expect(handler).toHaveBeenCalledTimes(1)
351
- })
352
-
353
- it('using the current value of a react ref as the `boundaryElement` is dangerous', async () => {
354
- /**
355
- * This test demonstrates why it's dangerous to return a ref value as the boundaryElement,
356
- * for the same reasons it's dangerous for the elements array.
357
- */
358
-
359
- const user = userEvent.setup()
360
- let handler = vi.fn()
361
-
362
- /**
363
- * Using refs in the `useClickOutside` elements array is dangerous,
364
- * the below example demonstrates how `useClickOutside` doesn't "see" the current values of refs,
365
- * it can only "see" whatever the value of the ref was when the hook was rendered.
366
- */
367
- let TestComponent = () => {
368
- const boundaryRef = useRef<HTMLDivElement | null>(null)
369
-
370
- // oxlint-disable-next-line no-deprecated
371
- useClickOutside(handler, [], boundaryRef.current)
372
-
373
- return (
374
- <>
375
- <div ref={boundaryRef}>
376
- <div data-testid="inside" />
377
- </div>
378
- <div data-testid="outside" />
379
- </>
380
- )
381
- }
382
- const {rerender} = render(<TestComponent />)
383
- await user.click(screen.getByTestId('inside'))
384
- await user.click(screen.getByTestId('outside'))
385
- // Because the ref values are stale, the handler is called
386
- expect(handler).toHaveBeenCalledTimes(2)
387
-
388
- /**
389
- * If a mixture of refs and state is used it can appear like it's working correctly,
390
- * but this is a side-effect, not an indication it's safe.
391
- */
392
- handler = vi.fn()
393
- TestComponent = () => {
394
- const buttonRef = useRef<HTMLButtonElement | null>(null)
395
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
396
- const boundaryRef = useRef<HTMLDivElement | null>(null)
397
-
398
- // oxlint-disable-next-line no-deprecated
399
- useClickOutside(handler, [buttonRef.current, popoverElement], boundaryRef.current)
400
-
401
- return (
402
- <>
403
- <div ref={boundaryRef}>
404
- {/* oxlint-disable-next-line control-has-associated-label */}
405
- <button data-testid="button" ref={buttonRef} />
406
- <div data-testid="popover" ref={setPopoverElement} />
407
- <div data-testid="inside" />
408
- </div>
409
- <div data-testid="outside" />
410
- </>
411
- )
412
- }
413
- rerender(<TestComponent />)
414
- await user.click(screen.getByTestId('button'))
415
- await user.click(screen.getByTestId('popover'))
416
- await user.click(screen.getByTestId('outside'))
417
- expect(handler).not.toHaveBeenCalled()
418
- await user.click(screen.getByTestId('inside'))
419
- expect(handler).toHaveBeenCalledTimes(1)
420
-
421
- /**
422
- * Unrelated state updates can create the same false impression of safety.
423
- */
424
- handler = vi.fn()
425
- TestComponent = () => {
426
- const buttonRef = useRef<HTMLButtonElement | null>(null)
427
- const popoverRef = useRef<HTMLDivElement | null>(null)
428
- const boundaryRef = useRef<HTMLDivElement | null>(null)
429
-
430
- // oxlint-disable-next-line no-deprecated
431
- useClickOutside(handler, [buttonRef.current, popoverRef.current], boundaryRef.current)
432
-
433
- const [, tick] = useState(0)
434
- useEffect(() => {
435
- /**
436
- * This effect schedules a re-render, which will lead to `useClickOutsideHandler` "seeing"
437
- * the current value of the refs after they got assigned dom nodes when the React ref callbacks executed.
438
- */
439
- tick((prev) => ++prev)
440
- }, [])
441
-
442
- return (
443
- <>
444
- <div ref={boundaryRef}>
445
- {/* oxlint-disable-next-line control-has-associated-label */}
446
- <button data-testid="button" ref={buttonRef} />
447
- <div data-testid="popover" ref={popoverRef} />
448
- <div data-testid="inside" />
449
- </div>
450
- <div data-testid="outside" />
451
- </>
452
- )
453
- }
454
- rerender(<TestComponent />)
455
- await user.click(screen.getByTestId('button'))
456
- await user.click(screen.getByTestId('popover'))
457
- await user.click(screen.getByTestId('outside'))
458
- expect(handler).not.toHaveBeenCalled()
459
- await user.click(screen.getByTestId('inside'))
460
- expect(handler).toHaveBeenCalledTimes(1)
461
-
462
- /**
463
- * When using the legacy version of the `useClickOutside` API it's necessary to synchronize mutable ref values
464
- * with a effect and state loop to ensure they're not stale
465
- */
466
- // oxlint-disable-next-line no-deprecated
467
- const useBoundaryElementFromRef = (ref: React.MutableRefObject<HTMLElement | null>) => {
468
- const [element, setElement] = useState(() => ref.current)
469
-
470
- // oxlint-disable-next-line exhaustive-deps
471
- useEffect(() => {
472
- // If the ref has mutated since the last render, update the state and schedule a re-render
473
- if (ref.current !== element) {
474
- setElement(ref.current)
475
- }
476
- })
477
-
478
- return element
479
- }
480
- handler = vi.fn()
481
- TestComponent = () => {
482
- const buttonRef = useRef<HTMLButtonElement | null>(null)
483
- const popoverRef = useRef<HTMLDivElement | null>(null)
484
- const boundaryRef = useRef<HTMLDivElement | null>(null)
485
-
486
- const boundaryElement = useBoundaryElementFromRef(boundaryRef)
487
- // oxlint-disable-next-line no-deprecated
488
- useClickOutside(handler, [buttonRef.current, popoverRef.current], boundaryElement)
489
-
490
- return (
491
- <>
492
- <div ref={boundaryRef}>
493
- {/* oxlint-disable-next-line control-has-associated-label */}
494
- <button data-testid="button" ref={buttonRef} />
495
- <div data-testid="popover" ref={popoverRef} />
496
- <div data-testid="inside" />
497
- </div>
498
- <div data-testid="outside" />
499
- </>
500
- )
501
- }
502
- rerender(<TestComponent />)
503
- await user.click(screen.getByTestId('button'))
504
- await user.click(screen.getByTestId('popover'))
505
- await user.click(screen.getByTestId('outside'))
506
- expect(handler).not.toHaveBeenCalled()
507
- await user.click(screen.getByTestId('inside'))
508
- expect(handler).toHaveBeenCalledTimes(1)
509
- })
510
- })
@@ -1,118 +0,0 @@
1
- import {useEffect, useRef, useState} from 'react'
2
-
3
- import {EMPTY_ARRAY} from '../constants'
4
-
5
- /**
6
- * @public
7
- */
8
- export type ClickOutsideListener = (event: MouseEvent) => void
9
-
10
- /**
11
- * @public
12
- */
13
- export type ClickOutsideElements = (HTMLElement | null | (HTMLElement | null)[])[]
14
-
15
- function _getElements(
16
- element: HTMLElement | null,
17
- elementsArg: ClickOutsideElements,
18
- ): HTMLElement[] {
19
- const ret = [element]
20
-
21
- for (const el of elementsArg) {
22
- if (Array.isArray(el)) {
23
- ret.push(...el)
24
- } else {
25
- ret.push(el)
26
- }
27
- }
28
-
29
- // oxlint-disable-next-line no-unsafe-type-assertion
30
- return ret.filter(Boolean) as HTMLElement[]
31
- }
32
-
33
- /**
34
- * @public
35
- * @deprecated replaced by the new `useClickOutsideEvent` hook, instead of:
36
- * ```tsx
37
- * const [button, setButtonElement] = useState(null)
38
- * useClickOutside((event) => {}, [button])
39
- * return <button ref={setButtonElement} />
40
- * ```
41
- * do:
42
- * ```tsx
43
- * const buttonRef = useRef()
44
- * useClickOutsideEvent((event) => {}, () => [buttonRef.current])
45
- * return <button ref={buttonRef} />
46
- * ```
47
- */
48
- export function useClickOutside(
49
- listener: ClickOutsideListener,
50
- elementsArg: ClickOutsideElements = EMPTY_ARRAY,
51
- boundaryElement?: HTMLElement | null,
52
- ): (el: HTMLElement | null) => void {
53
- const [element, setElement] = useState<HTMLElement | null>(null)
54
- const [elements, setElements] = useState(() => _getElements(element, elementsArg))
55
- const elementsRef = useRef(elements)
56
-
57
- useEffect(() => {
58
- const prevElements = elementsRef.current
59
- const nextElements = _getElements(element, elementsArg)
60
-
61
- if (prevElements.length !== nextElements.length) {
62
- setElements(nextElements)
63
- elementsRef.current = nextElements
64
-
65
- return
66
- }
67
-
68
- for (const el of prevElements) {
69
- if (!nextElements.includes(el)) {
70
- setElements(nextElements)
71
- elementsRef.current = nextElements
72
-
73
- return
74
- }
75
- }
76
-
77
- for (const el of nextElements) {
78
- if (!prevElements.includes(el)) {
79
- setElements(nextElements)
80
- elementsRef.current = nextElements
81
-
82
- return
83
- }
84
- }
85
- }, [element, elementsArg])
86
-
87
- useEffect(() => {
88
- if (!listener) return undefined
89
-
90
- const handleWindowMouseDown = (evt: MouseEvent) => {
91
- const target = evt.target
92
-
93
- if (!(target instanceof Node)) {
94
- return
95
- }
96
-
97
- if (boundaryElement && !boundaryElement.contains(target)) {
98
- return
99
- }
100
-
101
- for (const el of elements) {
102
- if (target === el || el.contains(target)) {
103
- return
104
- }
105
- }
106
-
107
- listener(evt)
108
- }
109
-
110
- window.addEventListener('mousedown', handleWindowMouseDown)
111
-
112
- return () => {
113
- window.removeEventListener('mousedown', handleWindowMouseDown)
114
- }
115
- }, [boundaryElement, listener, elements])
116
-
117
- return setElement
118
- }