@sanity/ui 3.3.1 → 3.3.3

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 (651) hide show
  1. package/dist/_visual-editing.d.mts +2 -1126
  2. package/dist/_visual-editing.d.ts +2 -1126
  3. package/dist/_visual-editing.js +3 -31
  4. package/dist/_visual-editing.mjs +2 -31
  5. package/dist/index.d.mts +555 -2769
  6. package/dist/index.d.mts.map +1 -0
  7. package/dist/index.d.ts +555 -2769
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +2982 -1934
  10. package/dist/index.mjs +2950 -1903
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/refractor.js +16 -0
  13. package/dist/refractor.mjs +21 -0
  14. package/dist/refractor.mjs.map +1 -0
  15. package/dist/tabList.js +3804 -0
  16. package/dist/tabList.mjs +3355 -0
  17. package/dist/tabList.mjs.map +1 -0
  18. package/dist/theme.d.mts +927 -1227
  19. package/dist/theme.d.mts.map +1 -0
  20. package/dist/theme.d.ts +927 -1227
  21. package/dist/theme.d.ts.map +1 -0
  22. package/dist/theme.js +3 -4127
  23. package/dist/theme.mjs +2 -4127
  24. package/dist/theme2.d.mts +2 -0
  25. package/dist/theme2.d.ts +2 -0
  26. package/dist/theme2.js +4104 -0
  27. package/dist/theme2.mjs +3851 -0
  28. package/dist/theme2.mjs.map +1 -0
  29. package/dist/useTheme.d.mts +1451 -0
  30. package/dist/useTheme.d.mts.map +1 -0
  31. package/dist/useTheme.d.ts +1451 -0
  32. package/dist/useTheme.d.ts.map +1 -0
  33. package/package.json +48 -106
  34. package/dist/_chunks-cjs/_visual-editing.js +0 -5899
  35. package/dist/_chunks-cjs/_visual-editing.js.map +0 -1
  36. package/dist/_chunks-cjs/refractor.js +0 -23
  37. package/dist/_chunks-cjs/refractor.js.map +0 -1
  38. package/dist/_chunks-es/_visual-editing.mjs +0 -5905
  39. package/dist/_chunks-es/_visual-editing.mjs.map +0 -1
  40. package/dist/_chunks-es/refractor.mjs +0 -26
  41. package/dist/_chunks-es/refractor.mjs.map +0 -1
  42. package/dist/_visual-editing.js.map +0 -1
  43. package/dist/_visual-editing.mjs.map +0 -1
  44. package/dist/index.js.map +0 -1
  45. package/dist/theme.js.map +0 -1
  46. package/dist/theme.mjs.map +0 -1
  47. package/exports/_visual-editing.ts +0 -31
  48. package/exports/index.ts +0 -1
  49. package/exports/theme.ts +0 -1
  50. package/src/core/__workshop__/constants.ts +0 -293
  51. package/src/core/_compat.ts +0 -264
  52. package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
  53. package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
  54. package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
  55. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
  56. package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
  57. package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
  58. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
  59. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
  60. package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
  61. package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
  62. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  63. package/src/core/components/autocomplete/autocomplete.tsx +0 -767
  64. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
  65. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  66. package/src/core/components/autocomplete/constants.ts +0 -28
  67. package/src/core/components/autocomplete/index.ts +0 -2
  68. package/src/core/components/autocomplete/types.ts +0 -108
  69. package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
  70. package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
  71. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  72. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
  73. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
  74. package/src/core/components/breadcrumbs/index.ts +0 -1
  75. package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
  76. package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
  77. package/src/core/components/dialog/__workshop__/index.ts +0 -19
  78. package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
  79. package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
  80. package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
  81. package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
  82. package/src/core/components/dialog/__workshop__/position.tsx +0 -30
  83. package/src/core/components/dialog/__workshop__/props.tsx +0 -75
  84. package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
  85. package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
  86. package/src/core/components/dialog/dialog.tsx +0 -430
  87. package/src/core/components/dialog/dialogContext.ts +0 -20
  88. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  89. package/src/core/components/dialog/index.ts +0 -4
  90. package/src/core/components/dialog/styles.ts +0 -77
  91. package/src/core/components/dialog/useDialog.ts +0 -11
  92. package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
  93. package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
  94. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
  95. package/src/core/components/hotkeys/hotkeys.tsx +0 -66
  96. package/src/core/components/hotkeys/index.ts +0 -1
  97. package/src/core/components/index.ts +0 -9
  98. package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
  99. package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
  100. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
  101. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
  102. package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
  103. package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
  104. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
  105. package/src/core/components/menu/__workshop__/groups.tsx +0 -156
  106. package/src/core/components/menu/__workshop__/index.ts +0 -89
  107. package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
  108. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -65
  109. package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
  110. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
  111. package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
  112. package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
  113. package/src/core/components/menu/__workshop__/tones.tsx +0 -25
  114. package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
  115. package/src/core/components/menu/helpers.ts +0 -82
  116. package/src/core/components/menu/index.ts +0 -5
  117. package/src/core/components/menu/menu.spacing.test.tsx +0 -63
  118. package/src/core/components/menu/menu.test.tsx +0 -125
  119. package/src/core/components/menu/menu.tsx +0 -178
  120. package/src/core/components/menu/menuButton.tsx +0 -268
  121. package/src/core/components/menu/menuContext.ts +0 -18
  122. package/src/core/components/menu/menuDivider.ts +0 -23
  123. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
  124. package/src/core/components/menu/menuGroup.tsx +0 -233
  125. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
  126. package/src/core/components/menu/menuItem.tsx +0 -197
  127. package/src/core/components/menu/useMenu.ts +0 -21
  128. package/src/core/components/menu/useMenuController.ts +0 -231
  129. package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
  130. package/src/core/components/skeleton/__workshop__/index.ts +0 -11
  131. package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
  132. package/src/core/components/skeleton/index.ts +0 -2
  133. package/src/core/components/skeleton/skeleton.tsx +0 -57
  134. package/src/core/components/skeleton/styles.ts +0 -50
  135. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  136. package/src/core/components/tab/__workshop__/example.tsx +0 -79
  137. package/src/core/components/tab/__workshop__/index.ts +0 -14
  138. package/src/core/components/tab/index.ts +0 -3
  139. package/src/core/components/tab/tab.tsx +0 -101
  140. package/src/core/components/tab/tabList.test.tsx +0 -48
  141. package/src/core/components/tab/tabList.tsx +0 -70
  142. package/src/core/components/tab/tabPanel.tsx +0 -39
  143. package/src/core/components/toast/__workshop__/hook.tsx +0 -71
  144. package/src/core/components/toast/__workshop__/index.ts +0 -19
  145. package/src/core/components/toast/__workshop__/toast.tsx +0 -26
  146. package/src/core/components/toast/index.ts +0 -4
  147. package/src/core/components/toast/styles.ts +0 -77
  148. package/src/core/components/toast/toast.test.tsx +0 -101
  149. package/src/core/components/toast/toast.tsx +0 -198
  150. package/src/core/components/toast/toastContext.ts +0 -7
  151. package/src/core/components/toast/toastLayer.tsx +0 -51
  152. package/src/core/components/toast/toastProvider.tsx +0 -113
  153. package/src/core/components/toast/toastState.ts +0 -6
  154. package/src/core/components/toast/types.ts +0 -26
  155. package/src/core/components/toast/useToast.ts +0 -25
  156. package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
  157. package/src/core/components/tree/__workshop__/basic.tsx +0 -105
  158. package/src/core/components/tree/__workshop__/index.ts +0 -21
  159. package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
  160. package/src/core/components/tree/helpers.ts +0 -105
  161. package/src/core/components/tree/index.ts +0 -4
  162. package/src/core/components/tree/style.ts +0 -105
  163. package/src/core/components/tree/tree.test.tsx +0 -55
  164. package/src/core/components/tree/tree.tsx +0 -240
  165. package/src/core/components/tree/treeContext.ts +0 -10
  166. package/src/core/components/tree/treeGroup.tsx +0 -28
  167. package/src/core/components/tree/treeItem.test.tsx +0 -65
  168. package/src/core/components/tree/treeItem.tsx +0 -224
  169. package/src/core/components/tree/types.ts +0 -25
  170. package/src/core/components/tree/useTree.ts +0 -17
  171. package/src/core/constants.ts +0 -79
  172. package/src/core/helpers/animation.ts +0 -27
  173. package/src/core/helpers/element.ts +0 -55
  174. package/src/core/helpers/focus.ts +0 -100
  175. package/src/core/helpers/index.ts +0 -4
  176. package/src/core/helpers/scroll.ts +0 -15
  177. package/src/core/hooks/index.ts +0 -12
  178. package/src/core/hooks/useArrayProp.ts +0 -17
  179. package/src/core/hooks/useClickOutside.test.tsx +0 -482
  180. package/src/core/hooks/useClickOutside.ts +0 -118
  181. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
  182. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  183. package/src/core/hooks/useCustomValidity.ts +0 -13
  184. package/src/core/hooks/useDelayed.test.ts +0 -88
  185. package/src/core/hooks/useDelayedState.ts +0 -36
  186. package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
  187. package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
  188. package/src/core/hooks/useElementRect/index.ts +0 -1
  189. package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
  190. package/src/core/hooks/useElementSize.ts +0 -19
  191. package/src/core/hooks/useForwardedRef.ts +0 -19
  192. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  193. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  194. package/src/core/hooks/useMatchMedia.ts +0 -28
  195. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
  196. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
  197. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  198. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
  199. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  200. package/src/core/hooks/useMounted.ts +0 -15
  201. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
  202. package/src/core/hooks/usePrefersDark.test.tsx +0 -19
  203. package/src/core/hooks/usePrefersDark.ts +0 -16
  204. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  205. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
  206. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  207. package/src/core/index.ts +0 -10
  208. package/src/core/lib/createGlobalScopedContext.ts +0 -36
  209. package/src/core/lib/globalScope.ts +0 -19
  210. package/src/core/lib/isRecord.ts +0 -3
  211. package/src/core/middleware/origin.ts +0 -47
  212. package/src/core/observers/elementSizeObserver.ts +0 -116
  213. package/src/core/observers/index.ts +0 -2
  214. package/src/core/observers/resizeObserver.ts +0 -9
  215. package/src/core/primitives/_selectable/index.ts +0 -1
  216. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  217. package/src/core/primitives/_selectable/style.ts +0 -115
  218. package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
  219. package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
  220. package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
  221. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
  222. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
  223. package/src/core/primitives/avatar/avatar.tsx +0 -200
  224. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  225. package/src/core/primitives/avatar/avatarStack.tsx +0 -100
  226. package/src/core/primitives/avatar/index.ts +0 -4
  227. package/src/core/primitives/avatar/styles.ts +0 -167
  228. package/src/core/primitives/avatar/types.ts +0 -17
  229. package/src/core/primitives/badge/__workshop__/index.ts +0 -19
  230. package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
  231. package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
  232. package/src/core/primitives/badge/badge.test.tsx +0 -16
  233. package/src/core/primitives/badge/badge.tsx +0 -70
  234. package/src/core/primitives/badge/index.ts +0 -1
  235. package/src/core/primitives/badge/styles.ts +0 -20
  236. package/src/core/primitives/badge/types.ts +0 -8
  237. package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
  238. package/src/core/primitives/box/__workshop__/index.ts +0 -24
  239. package/src/core/primitives/box/__workshop__/props.tsx +0 -20
  240. package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
  241. package/src/core/primitives/box/box.test.tsx +0 -142
  242. package/src/core/primitives/box/box.tsx +0 -154
  243. package/src/core/primitives/box/index.ts +0 -1
  244. package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
  245. package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
  246. package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
  247. package/src/core/primitives/button/__workshop__/index.ts +0 -59
  248. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
  249. package/src/core/primitives/button/__workshop__/props.tsx +0 -55
  250. package/src/core/primitives/button/__workshop__/sanityUploadButton.tsx +0 -36
  251. package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
  252. package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
  253. package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
  254. package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
  255. package/src/core/primitives/button/button.test.tsx +0 -82
  256. package/src/core/primitives/button/button.tsx +0 -210
  257. package/src/core/primitives/button/index.ts +0 -1
  258. package/src/core/primitives/button/styles.ts +0 -117
  259. package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
  260. package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
  261. package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
  262. package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
  263. package/src/core/primitives/card/__workshop__/index.ts +0 -18
  264. package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
  265. package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
  266. package/src/core/primitives/card/__workshop__/props.tsx +0 -53
  267. package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
  268. package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
  269. package/src/core/primitives/card/card.tsx +0 -128
  270. package/src/core/primitives/card/index.ts +0 -2
  271. package/src/core/primitives/card/styles.ts +0 -147
  272. package/src/core/primitives/card/types.ts +0 -11
  273. package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
  274. package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
  275. package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
  276. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
  277. package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
  278. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  279. package/src/core/primitives/checkbox/index.ts +0 -1
  280. package/src/core/primitives/checkbox/styles.ts +0 -128
  281. package/src/core/primitives/code/__workshop__/index.ts +0 -19
  282. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
  283. package/src/core/primitives/code/__workshop__/props.tsx +0 -21
  284. package/src/core/primitives/code/code.tsx +0 -55
  285. package/src/core/primitives/code/index.ts +0 -1
  286. package/src/core/primitives/code/refractor.tsx +0 -20
  287. package/src/core/primitives/code/styles.ts +0 -77
  288. package/src/core/primitives/container/__workshop__/example.tsx +0 -20
  289. package/src/core/primitives/container/__workshop__/index.ts +0 -8
  290. package/src/core/primitives/container/container.tsx +0 -54
  291. package/src/core/primitives/container/index.ts +0 -2
  292. package/src/core/primitives/container/styles.ts +0 -23
  293. package/src/core/primitives/container/types.ts +0 -6
  294. package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
  295. package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
  296. package/src/core/primitives/flex/__workshop__/index.ts +0 -11
  297. package/src/core/primitives/flex/flex.tsx +0 -64
  298. package/src/core/primitives/flex/index.ts +0 -1
  299. package/src/core/primitives/grid/__workshop__/index.ts +0 -10
  300. package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
  301. package/src/core/primitives/grid/grid.test.tsx +0 -80
  302. package/src/core/primitives/grid/grid.tsx +0 -74
  303. package/src/core/primitives/grid/index.ts +0 -1
  304. package/src/core/primitives/heading/__workshop__/index.ts +0 -19
  305. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
  306. package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
  307. package/src/core/primitives/heading/heading.tsx +0 -88
  308. package/src/core/primitives/heading/index.ts +0 -1
  309. package/src/core/primitives/heading/styles.ts +0 -64
  310. package/src/core/primitives/heading/types.ts +0 -7
  311. package/src/core/primitives/index.ts +0 -27
  312. package/src/core/primitives/inline/__workshop__/index.ts +0 -8
  313. package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
  314. package/src/core/primitives/inline/index.ts +0 -1
  315. package/src/core/primitives/inline/inline.test.tsx +0 -51
  316. package/src/core/primitives/inline/inline.tsx +0 -63
  317. package/src/core/primitives/inline/styles.ts +0 -32
  318. package/src/core/primitives/inline/types.ts +0 -6
  319. package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
  320. package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
  321. package/src/core/primitives/kbd/index.ts +0 -1
  322. package/src/core/primitives/kbd/kbd.tsx +0 -69
  323. package/src/core/primitives/label/__workshop__/index.ts +0 -19
  324. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
  325. package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
  326. package/src/core/primitives/label/index.ts +0 -1
  327. package/src/core/primitives/label/label.tsx +0 -87
  328. package/src/core/primitives/label/styles.ts +0 -45
  329. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
  330. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  331. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
  332. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  333. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
  334. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
  335. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
  336. package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
  337. package/src/core/primitives/popover/__workshop__/index.ts +0 -49
  338. package/src/core/primitives/popover/constants.ts +0 -22
  339. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  340. package/src/core/primitives/popover/helpers.ts +0 -31
  341. package/src/core/primitives/popover/index.ts +0 -2
  342. package/src/core/primitives/popover/popover.tsx +0 -511
  343. package/src/core/primitives/popover/popoverCard.tsx +0 -166
  344. package/src/core/primitives/popover/types.ts +0 -7
  345. package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
  346. package/src/core/primitives/radio/__workshop__/index.ts +0 -11
  347. package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
  348. package/src/core/primitives/radio/index.ts +0 -1
  349. package/src/core/primitives/radio/radio.tsx +0 -51
  350. package/src/core/primitives/radio/styles.ts +0 -117
  351. package/src/core/primitives/select/__workshop__/index.ts +0 -11
  352. package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
  353. package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
  354. package/src/core/primitives/select/index.ts +0 -1
  355. package/src/core/primitives/select/select.test.tsx +0 -52
  356. package/src/core/primitives/select/select.tsx +0 -94
  357. package/src/core/primitives/select/styles.ts +0 -166
  358. package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
  359. package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
  360. package/src/core/primitives/spinner/index.ts +0 -1
  361. package/src/core/primitives/spinner/spinner.tsx +0 -46
  362. package/src/core/primitives/stack/__workshop__/index.ts +0 -14
  363. package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
  364. package/src/core/primitives/stack/index.ts +0 -1
  365. package/src/core/primitives/stack/stack.test.tsx +0 -57
  366. package/src/core/primitives/stack/stack.tsx +0 -57
  367. package/src/core/primitives/stack/styles.ts +0 -32
  368. package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
  369. package/src/core/primitives/switch/__workshop__/index.ts +0 -11
  370. package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
  371. package/src/core/primitives/switch/index.ts +0 -1
  372. package/src/core/primitives/switch/styles.ts +0 -173
  373. package/src/core/primitives/switch/switch.tsx +0 -68
  374. package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
  375. package/src/core/primitives/text/__workshop__/example.tsx +0 -39
  376. package/src/core/primitives/text/__workshop__/index.ts +0 -24
  377. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
  378. package/src/core/primitives/text/index.ts +0 -1
  379. package/src/core/primitives/text/styles.ts +0 -74
  380. package/src/core/primitives/text/text.tsx +0 -89
  381. package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
  382. package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
  383. package/src/core/primitives/textArea/index.ts +0 -1
  384. package/src/core/primitives/textArea/textArea.tsx +0 -120
  385. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
  386. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
  387. package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
  388. package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
  389. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
  390. package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
  391. package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
  392. package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
  393. package/src/core/primitives/textInput/index.ts +0 -1
  394. package/src/core/primitives/textInput/textInput.test.tsx +0 -48
  395. package/src/core/primitives/textInput/textInput.tsx +0 -395
  396. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
  397. package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
  398. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
  399. package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
  400. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
  401. package/src/core/primitives/tooltip/constants.ts +0 -23
  402. package/src/core/primitives/tooltip/index.ts +0 -2
  403. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
  404. package/src/core/primitives/tooltip/tooltip.tsx +0 -495
  405. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
  406. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  407. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  408. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  409. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
  410. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  411. package/src/core/primitives/types.ts +0 -179
  412. package/src/core/styles/border/borderStyle.ts +0 -56
  413. package/src/core/styles/border/index.ts +0 -2
  414. package/src/core/styles/border/types.ts +0 -10
  415. package/src/core/styles/box/boxStyle.ts +0 -69
  416. package/src/core/styles/box/index.ts +0 -2
  417. package/src/core/styles/box/types.ts +0 -11
  418. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  419. package/src/core/styles/card/index.ts +0 -1
  420. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  421. package/src/core/styles/flex/flexStyle.ts +0 -70
  422. package/src/core/styles/flex/index.ts +0 -3
  423. package/src/core/styles/flex/types.ts +0 -25
  424. package/src/core/styles/focusRing/index.ts +0 -25
  425. package/src/core/styles/font/codeFontStyle.ts +0 -13
  426. package/src/core/styles/font/headingFontStyle.ts +0 -13
  427. package/src/core/styles/font/index.ts +0 -6
  428. package/src/core/styles/font/labelFontStyle.ts +0 -13
  429. package/src/core/styles/font/responsiveFont.ts +0 -103
  430. package/src/core/styles/font/textAlignStyle.ts +0 -19
  431. package/src/core/styles/font/textFontStyle.ts +0 -13
  432. package/src/core/styles/font/types.ts +0 -35
  433. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  434. package/src/core/styles/grid/gridStyle.ts +0 -108
  435. package/src/core/styles/grid/index.ts +0 -3
  436. package/src/core/styles/grid/types.ts +0 -37
  437. package/src/core/styles/helpers.ts +0 -72
  438. package/src/core/styles/index.ts +0 -5
  439. package/src/core/styles/input/index.ts +0 -2
  440. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  441. package/src/core/styles/input/textInputStyle.ts +0 -263
  442. package/src/core/styles/internal.ts +0 -12
  443. package/src/core/styles/margin/index.ts +0 -2
  444. package/src/core/styles/margin/marginStyle.ts +0 -21
  445. package/src/core/styles/margin/marginsStyle.test.ts +0 -33
  446. package/src/core/styles/margin/types.ts +0 -9
  447. package/src/core/styles/padding/index.ts +0 -2
  448. package/src/core/styles/padding/paddingStyle.test.ts +0 -33
  449. package/src/core/styles/padding/paddingStyle.ts +0 -21
  450. package/src/core/styles/padding/types.ts +0 -12
  451. package/src/core/styles/radius/index.ts +0 -2
  452. package/src/core/styles/radius/radiusStyle.ts +0 -23
  453. package/src/core/styles/radius/types.ts +0 -8
  454. package/src/core/styles/shadow/index.ts +0 -2
  455. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  456. package/src/core/styles/shadow/types.ts +0 -6
  457. package/src/core/styles/types.ts +0 -8
  458. package/src/core/theme/__workshop__/build/Root.tsx +0 -367
  459. package/src/core/theme/__workshop__/build/helpers.ts +0 -46
  460. package/src/core/theme/__workshop__/build/story.tsx +0 -465
  461. package/src/core/theme/__workshop__/canvas.tsx +0 -352
  462. package/src/core/theme/__workshop__/color.tsx +0 -62
  463. package/src/core/theme/__workshop__/debug/story.tsx +0 -408
  464. package/src/core/theme/__workshop__/index.ts +0 -39
  465. package/src/core/theme/__workshop__/layer.tsx +0 -78
  466. package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
  467. package/src/core/theme/index.ts +0 -5
  468. package/src/core/theme/theme.test.tsx +0 -73
  469. package/src/core/theme/themeColorProvider.tsx +0 -29
  470. package/src/core/theme/themeContext.ts +0 -10
  471. package/src/core/theme/themeProvider.tsx +0 -62
  472. package/src/core/theme/types.ts +0 -12
  473. package/src/core/theme/useRootTheme.ts +0 -17
  474. package/src/core/theme/useTheme.ts +0 -16
  475. package/src/core/types/avatar.ts +0 -14
  476. package/src/core/types/badge.ts +0 -12
  477. package/src/core/types/box.ts +0 -19
  478. package/src/core/types/button.ts +0 -21
  479. package/src/core/types/card.ts +0 -6
  480. package/src/core/types/component.ts +0 -32
  481. package/src/core/types/dialog.ts +0 -4
  482. package/src/core/types/flex.ts +0 -30
  483. package/src/core/types/grid.ts +0 -14
  484. package/src/core/types/gridItem.ts +0 -29
  485. package/src/core/types/index.ts +0 -15
  486. package/src/core/types/placement.ts +0 -18
  487. package/src/core/types/popover.ts +0 -4
  488. package/src/core/types/radius.ts +0 -4
  489. package/src/core/types/selectable.ts +0 -6
  490. package/src/core/types/text.ts +0 -4
  491. package/src/core/utils/arrow/arrow.tsx +0 -123
  492. package/src/core/utils/arrow/cmds.ts +0 -91
  493. package/src/core/utils/arrow/index.ts +0 -1
  494. package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
  495. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
  496. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
  497. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  498. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  499. package/src/core/utils/boundaryElement/index.ts +0 -3
  500. package/src/core/utils/boundaryElement/types.ts +0 -7
  501. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  502. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
  503. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  504. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
  505. package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
  506. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  507. package/src/core/utils/elementQuery/helpers.ts +0 -27
  508. package/src/core/utils/elementQuery/index.ts +0 -1
  509. package/src/core/utils/errorBoundary.tsx +0 -48
  510. package/src/core/utils/getElementRef.ts +0 -26
  511. package/src/core/utils/index.ts +0 -9
  512. package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
  513. package/src/core/utils/layer/__workshop__/index.ts +0 -24
  514. package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
  515. package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
  516. package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
  517. package/src/core/utils/layer/getLayerContext.test.ts +0 -30
  518. package/src/core/utils/layer/getLayerContext.ts +0 -21
  519. package/src/core/utils/layer/index.ts +0 -4
  520. package/src/core/utils/layer/layer.test.tsx +0 -108
  521. package/src/core/utils/layer/layer.tsx +0 -98
  522. package/src/core/utils/layer/layerContext.ts +0 -7
  523. package/src/core/utils/layer/layerProvider.tsx +0 -111
  524. package/src/core/utils/layer/types.ts +0 -9
  525. package/src/core/utils/layer/useLayer.ts +0 -26
  526. package/src/core/utils/portal/__workshop__/index.ts +0 -14
  527. package/src/core/utils/portal/__workshop__/named.tsx +0 -63
  528. package/src/core/utils/portal/index.ts +0 -4
  529. package/src/core/utils/portal/portal.test.tsx +0 -103
  530. package/src/core/utils/portal/portal.ts +0 -32
  531. package/src/core/utils/portal/portalContext.ts +0 -31
  532. package/src/core/utils/portal/portalProvider.tsx +0 -47
  533. package/src/core/utils/portal/types.ts +0 -9
  534. package/src/core/utils/portal/usePortal.ts +0 -25
  535. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  536. package/src/core/utils/srOnly/index.ts +0 -1
  537. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  538. package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
  539. package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
  540. package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
  541. package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
  542. package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
  543. package/src/core/utils/virtualList/index.ts +0 -1
  544. package/src/core/utils/virtualList/virtualList.tsx +0 -200
  545. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
  546. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
  547. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
  548. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
  549. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
  550. package/src/theme/build/_deprecated/color/color.test.ts +0 -63
  551. package/src/theme/build/_deprecated/color/defaults.ts +0 -390
  552. package/src/theme/build/_deprecated/color/factory.ts +0 -142
  553. package/src/theme/build/_deprecated/color/index.ts +0 -1
  554. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
  555. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
  556. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
  557. package/src/theme/build/buildColorTheme.test.ts +0 -183
  558. package/src/theme/build/buildColorTheme.ts +0 -499
  559. package/src/theme/build/buildTheme.test.ts +0 -87
  560. package/src/theme/build/buildTheme.ts +0 -36
  561. package/src/theme/build/colorToken/colorToken.ts +0 -19
  562. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  563. package/src/theme/build/colorToken/index.ts +0 -2
  564. package/src/theme/build/colorToken/types.ts +0 -6
  565. package/src/theme/build/index.ts +0 -3
  566. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  567. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  568. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  569. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  570. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
  571. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  572. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  573. package/src/theme/build/lib/color-fns/index.ts +0 -6
  574. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  575. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  576. package/src/theme/build/lib/color-fns/types.ts +0 -28
  577. package/src/theme/build/lib/isRecord.ts +0 -3
  578. package/src/theme/build/lib/lazy.ts +0 -30
  579. package/src/theme/build/lib/utils.ts +0 -19
  580. package/src/theme/build/merge.ts +0 -26
  581. package/src/theme/build/mixThemeColor.test.ts +0 -21
  582. package/src/theme/build/mixThemeColor.ts +0 -53
  583. package/src/theme/build/renderColorTheme.ts +0 -532
  584. package/src/theme/build/renderColorValue.ts +0 -85
  585. package/src/theme/build/resolveColorTokens.ts +0 -268
  586. package/src/theme/build/theme.test.ts +0 -27
  587. package/src/theme/config/helpers.ts +0 -55
  588. package/src/theme/config/index.ts +0 -4
  589. package/src/theme/config/system.ts +0 -115
  590. package/src/theme/config/tokens/color/index.ts +0 -1
  591. package/src/theme/config/tokens/color/types.ts +0 -133
  592. package/src/theme/config/tokens/index.ts +0 -4
  593. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
  594. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  595. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
  596. package/src/theme/config/tokens/parseTokenValue.ts +0 -133
  597. package/src/theme/config/tokens/types.ts +0 -53
  598. package/src/theme/config/types.ts +0 -46
  599. package/src/theme/defaults/colorPalette.ts +0 -5
  600. package/src/theme/defaults/colorTokens.ts +0 -648
  601. package/src/theme/defaults/config.ts +0 -84
  602. package/src/theme/defaults/fonts.ts +0 -227
  603. package/src/theme/getScopedTheme.ts +0 -98
  604. package/src/theme/index.ts +0 -5
  605. package/src/theme/system/avatar.ts +0 -14
  606. package/src/theme/system/color/_constants.ts +0 -45
  607. package/src/theme/system/color/_helpers.ts +0 -24
  608. package/src/theme/system/color/_system.ts +0 -40
  609. package/src/theme/system/color/avatar.ts +0 -15
  610. package/src/theme/system/color/badge.ts +0 -16
  611. package/src/theme/system/color/button.ts +0 -17
  612. package/src/theme/system/color/color.ts +0 -34
  613. package/src/theme/system/color/index.ts +0 -13
  614. package/src/theme/system/color/input.ts +0 -25
  615. package/src/theme/system/color/kbd.ts +0 -8
  616. package/src/theme/system/color/selectable.ts +0 -12
  617. package/src/theme/system/color/shadow.ts +0 -7
  618. package/src/theme/system/color/state.ts +0 -43
  619. package/src/theme/system/color/syntax.ts +0 -41
  620. package/src/theme/system/css.ts +0 -14
  621. package/src/theme/system/focusRing.ts +0 -7
  622. package/src/theme/system/font.ts +0 -52
  623. package/src/theme/system/index.ts +0 -11
  624. package/src/theme/system/input.ts +0 -33
  625. package/src/theme/system/layer.ts +0 -8
  626. package/src/theme/system/shadow.ts +0 -19
  627. package/src/theme/system/styles.ts +0 -13
  628. package/src/theme/system/theme.ts +0 -138
  629. package/src/theme/system/v0/avatar.ts +0 -10
  630. package/src/theme/system/v0/color/_generic.ts +0 -35
  631. package/src/theme/system/v0/color/_system.ts +0 -17
  632. package/src/theme/system/v0/color/base.ts +0 -21
  633. package/src/theme/system/v0/color/button.ts +0 -42
  634. package/src/theme/system/v0/color/card.ts +0 -19
  635. package/src/theme/system/v0/color/color.ts +0 -40
  636. package/src/theme/system/v0/color/index.ts +0 -11
  637. package/src/theme/system/v0/color/input.ts +0 -34
  638. package/src/theme/system/v0/color/muted.ts +0 -26
  639. package/src/theme/system/v0/color/selectable.ts +0 -31
  640. package/src/theme/system/v0/color/solid.ts +0 -26
  641. package/src/theme/system/v0/color/spot.ts +0 -13
  642. package/src/theme/system/v0/index.ts +0 -3
  643. package/src/theme/system/v0/input.ts +0 -23
  644. package/src/theme/versioning/getTheme_v2.ts +0 -57
  645. package/src/theme/versioning/index.ts +0 -5
  646. package/src/theme/versioning/is_v0.ts +0 -6
  647. package/src/theme/versioning/is_v2.ts +0 -6
  648. package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
  649. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
  650. package/src/theme/versioning/v0_v2.ts +0 -94
  651. package/src/theme/versioning/v2_v0.ts +0 -135
@@ -1,482 +0,0 @@
1
- /** @jest-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
-
7
- import {useClickOutside} from './useClickOutside'
8
-
9
- describe('useClickOutside', () => {
10
- /**
11
- * Specifying the elements array directly:
12
- * useClickOutside(handler, [buttonElement, popoverElement])
13
- * instead of in a callback:
14
- * useClickOutside(handler, () => [buttonElement, popoverElement])
15
- * is still supported, but deprecated and discouraged. The same is true for the `setElement` callback pattern
16
- */
17
- it('calls the handler when clicking outside of the array of elements', async () => {
18
- const user = userEvent.setup()
19
- const handler = jest.fn()
20
-
21
- const TestComponent = () => {
22
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
23
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
24
-
25
- useClickOutside(handler, [buttonElement, popoverElement])
26
-
27
- return (
28
- <>
29
- <button data-testid="button" ref={setButtonElement} />
30
- <div data-testid="popover" ref={setPopoverElement} />
31
- <div data-testid="outside" />
32
- </>
33
- )
34
- }
35
-
36
- render(<TestComponent />)
37
-
38
- await user.click(screen.getByTestId('button'))
39
- await user.click(screen.getByTestId('popover'))
40
- expect(handler).not.toHaveBeenCalled()
41
-
42
- await user.click(screen.getByTestId('outside'))
43
- expect(handler).toHaveBeenCalledTimes(1)
44
- })
45
-
46
- it('the elements array flattens nested arrays one level deep', async () => {
47
- const user = userEvent.setup()
48
- const handler = jest.fn()
49
-
50
- const TestComponent = () => {
51
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
52
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
53
-
54
- useClickOutside(handler, [null, [null, buttonElement], [popoverElement, null], null])
55
-
56
- return (
57
- <>
58
- <button data-testid="button" ref={setButtonElement} />
59
- <div data-testid="popover" ref={setPopoverElement} />
60
- <div data-testid="outside" />
61
- </>
62
- )
63
- }
64
-
65
- render(<TestComponent />)
66
-
67
- await user.click(screen.getByTestId('button'))
68
- await user.click(screen.getByTestId('popover'))
69
- expect(handler).not.toHaveBeenCalled()
70
-
71
- await user.click(screen.getByTestId('outside'))
72
- expect(handler).toHaveBeenCalledTimes(1)
73
- })
74
-
75
- it('it can set a boundary to scope outside click events', async () => {
76
- const user = userEvent.setup()
77
- const handler = jest.fn()
78
-
79
- const TestComponent = () => {
80
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
81
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
82
- const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(null)
83
-
84
- useClickOutside(handler, [buttonElement, popoverElement], boundaryElement)
85
-
86
- return (
87
- <>
88
- <div ref={setBoundaryElement}>
89
- <button data-testid="button" ref={setButtonElement} />
90
- <div data-testid="popover" ref={setPopoverElement} />
91
- <div data-testid="inside" />
92
- </div>
93
- <div data-testid="outside" />
94
- </>
95
- )
96
- }
97
-
98
- render(<TestComponent />)
99
-
100
- await user.click(screen.getByTestId('button'))
101
- await user.click(screen.getByTestId('popover'))
102
- // Since it's outside the boundary it should be ignored
103
- await user.click(screen.getByTestId('outside'))
104
- expect(handler).not.toHaveBeenCalled()
105
-
106
- await user.click(screen.getByTestId('inside'))
107
- expect(handler).toHaveBeenCalledTimes(1)
108
- })
109
-
110
- it('it returns a `setElement` callback', async () => {
111
- /**
112
- * We don't use this pattern in the studio codebase anymore, and we don't recommend using it moving forward.
113
- * But since it's part of the public API we can't remove it without a major version bump.
114
- * Thus it makes sense to unit test it to ensure it works as expected and we don't accidentally break backwards compatibility.
115
- */
116
- const user = userEvent.setup()
117
- const handler = jest.fn()
118
-
119
- const TestComponent = (props: {open?: true}) => {
120
- const {open = false} = props
121
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
122
-
123
- const setElement = useClickOutside(handler, [buttonElement])
124
-
125
- return (
126
- <>
127
- <button data-testid="button" ref={setButtonElement} />
128
- {open && <div data-testid="popover" ref={setElement} />}
129
- <div data-testid="outside" />
130
- </>
131
- )
132
- }
133
-
134
- const {rerender} = render(<TestComponent />)
135
-
136
- await user.click(screen.getByTestId('button'))
137
- expect(handler).not.toHaveBeenCalled()
138
-
139
- await user.click(screen.getByTestId('outside'))
140
- expect(handler).toHaveBeenCalledTimes(1)
141
-
142
- // The popover isn't rendered yet
143
- expect(screen.queryByTestId('popover')).toBeNull()
144
-
145
- // Rerender the component with the popover open
146
- rerender(<TestComponent open />)
147
-
148
- // Clicking the popover should not trigger the handler
149
- await user.click(screen.getByTestId('popover'))
150
- expect(handler).toHaveBeenCalledTimes(1)
151
- })
152
-
153
- it('instead of `setElement`, update the `elements` array', async () => {
154
- /**
155
- * Since we don't want people to use the `setElement` pattern, test that userland can handle dynamically changing elements arrays
156
- */
157
- const user = userEvent.setup()
158
- const handler = jest.fn()
159
-
160
- const TestComponent = (props: {open?: true}) => {
161
- const {open = false} = props
162
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
163
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
164
-
165
- useClickOutside(handler, [buttonElement, popoverElement])
166
-
167
- return (
168
- <>
169
- <button data-testid="button" ref={setButtonElement} />
170
- {open && <div data-testid="popover" ref={setPopoverElement} />}
171
- <div data-testid="outside" />
172
- </>
173
- )
174
- }
175
-
176
- const {rerender} = render(<TestComponent />)
177
-
178
- await user.click(screen.getByTestId('button'))
179
- expect(handler).not.toHaveBeenCalled()
180
-
181
- await user.click(screen.getByTestId('outside'))
182
- expect(handler).toHaveBeenCalledTimes(1)
183
-
184
- // The popover isn't rendered yet
185
- expect(screen.queryByTestId('popover')).toBeNull()
186
-
187
- // Rerender the component with the popover open
188
- rerender(<TestComponent open />)
189
-
190
- // Clicking the popover should not trigger the handler
191
- await user.click(screen.getByTestId('popover'))
192
- expect(handler).toHaveBeenCalledTimes(1)
193
- })
194
-
195
- it('returning the current value of refs in the elements array is dangerous', async () => {
196
- /**
197
- * This test demonstrates why it's dangerous to return ref values in the elements array.
198
- * When using refs, pass a function returning the elements array, instead of defining the array directly during render
199
- */
200
-
201
- const user = userEvent.setup()
202
- let handler = jest.fn()
203
-
204
- /**
205
- * Using refs in the `useClickOutside` elements array is dangerous,
206
- * the below example demonstrates how `useClickOutside` doesn't "see" the current values of refs,
207
- * it can only "see" whatever the value of the ref was when the hook was rendered.
208
- */
209
- let TestComponent = () => {
210
- const buttonRef = useRef<HTMLButtonElement | null>(null)
211
- const popoverRef = useRef<HTMLDivElement | null>(null)
212
-
213
- useClickOutside(handler, [buttonRef.current, popoverRef.current])
214
-
215
- return (
216
- <>
217
- <button data-testid="button" ref={buttonRef} />
218
- <div data-testid="popover" ref={popoverRef} />
219
- </>
220
- )
221
- }
222
- const {rerender} = render(<TestComponent />)
223
- await user.click(screen.getByTestId('button'))
224
- await user.click(screen.getByTestId('popover'))
225
- // Because the ref values are stale, the handler is called
226
- expect(handler).toHaveBeenCalledTimes(2)
227
-
228
- /**
229
- * If a mixture of refs and state is used it can appear like it's working correctly,
230
- * but this is a side-effect, not an indication it's safe.
231
- */
232
- handler = jest.fn()
233
- TestComponent = () => {
234
- const buttonRef = useRef<HTMLButtonElement | null>(null)
235
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
236
-
237
- useClickOutside(handler, [buttonRef.current, popoverElement])
238
-
239
- return (
240
- <>
241
- <button data-testid="button" ref={buttonRef} />
242
- <div data-testid="popover" ref={setPopoverElement} />
243
- <div data-testid="outside" />
244
- </>
245
- )
246
- }
247
- rerender(<TestComponent />)
248
- await user.click(screen.getByTestId('button'))
249
- await user.click(screen.getByTestId('popover'))
250
- expect(handler).not.toHaveBeenCalled()
251
- await user.click(screen.getByTestId('outside'))
252
- expect(handler).toHaveBeenCalledTimes(1)
253
-
254
- /**
255
- * Unrelated state updates can create the same false impression of safety.
256
- */
257
- handler = jest.fn()
258
- TestComponent = () => {
259
- const buttonRef = useRef<HTMLButtonElement | null>(null)
260
- const popoverRef = useRef<HTMLDivElement | null>(null)
261
-
262
- useClickOutside(handler, [buttonRef.current, popoverRef.current])
263
-
264
- const [, tick] = useState(0)
265
- useEffect(() => {
266
- /**
267
- * This effect schedules a re-render, which will lead to `useClickOutsideHandler` "seeing"
268
- * the current value of the refs after they got assigned dom nodes when the React ref callbacks executed.
269
- */
270
- tick((prev) => ++prev)
271
- }, [])
272
-
273
- return (
274
- <>
275
- <button data-testid="button" ref={buttonRef} />
276
- <div data-testid="popover" ref={popoverRef} />
277
- <div data-testid="outside" />
278
- </>
279
- )
280
- }
281
- rerender(<TestComponent />)
282
- await user.click(screen.getByTestId('button'))
283
- await user.click(screen.getByTestId('popover'))
284
- expect(handler).not.toHaveBeenCalled()
285
- await user.click(screen.getByTestId('outside'))
286
- expect(handler).toHaveBeenCalledTimes(1)
287
-
288
- /**
289
- * When using the legacy version of the `useClickOutside` API it's necessary to synchronize mutable ref values
290
- * with a effect and state loop to ensure they're not stale
291
- */
292
- const useElementsFromRefs = (refs: React.MutableRefObject<HTMLElement | null>[]) => {
293
- const [elements, setElements] = useState(() => refs.map((ref) => ref.current))
294
-
295
- useEffect(() => {
296
- if (refs.length !== elements.length) {
297
- setElements(refs.map((ref) => ref.current))
298
- }
299
- for (const ref of refs) {
300
- if (!elements.includes(ref.current)) {
301
- setElements(refs.map((ref) => ref.current))
302
- return
303
- }
304
- }
305
- }, [elements, refs])
306
-
307
- return elements
308
- }
309
- handler = jest.fn()
310
- TestComponent = () => {
311
- const buttonRef = useRef<HTMLButtonElement | null>(null)
312
- const popoverRef = useRef<HTMLDivElement | null>(null)
313
-
314
- const elements = useElementsFromRefs([buttonRef, popoverRef])
315
- useClickOutside(handler, elements)
316
-
317
- return (
318
- <>
319
- <button data-testid="button" ref={buttonRef} />
320
- <div data-testid="popover" ref={popoverRef} />
321
- <div data-testid="outside" />
322
- </>
323
- )
324
- }
325
- rerender(<TestComponent />)
326
- await user.click(screen.getByTestId('button'))
327
- await user.click(screen.getByTestId('popover'))
328
- expect(handler).not.toHaveBeenCalled()
329
- await user.click(screen.getByTestId('outside'))
330
- expect(handler).toHaveBeenCalledTimes(1)
331
- })
332
-
333
- it('using the current value of a react ref as the `boundaryElement` is dangerous', async () => {
334
- /**
335
- * This test demonstrates why it's dangerous to return a ref value as the boundaryElement,
336
- * for the same reasons it's dangerous for the elements array.
337
- */
338
-
339
- const user = userEvent.setup()
340
- let handler = jest.fn()
341
-
342
- /**
343
- * Using refs in the `useClickOutside` elements array is dangerous,
344
- * the below example demonstrates how `useClickOutside` doesn't "see" the current values of refs,
345
- * it can only "see" whatever the value of the ref was when the hook was rendered.
346
- */
347
- let TestComponent = () => {
348
- const boundaryRef = useRef<HTMLDivElement | null>(null)
349
-
350
- useClickOutside(handler, [], boundaryRef.current)
351
-
352
- return (
353
- <>
354
- <div ref={boundaryRef}>
355
- <div data-testid="inside" />
356
- </div>
357
- <div data-testid="outside" />
358
- </>
359
- )
360
- }
361
- const {rerender} = render(<TestComponent />)
362
- await user.click(screen.getByTestId('inside'))
363
- await user.click(screen.getByTestId('outside'))
364
- // Because the ref values are stale, the handler is called
365
- expect(handler).toHaveBeenCalledTimes(2)
366
-
367
- /**
368
- * If a mixture of refs and state is used it can appear like it's working correctly,
369
- * but this is a side-effect, not an indication it's safe.
370
- */
371
- handler = jest.fn()
372
- TestComponent = () => {
373
- const buttonRef = useRef<HTMLButtonElement | null>(null)
374
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
375
- const boundaryRef = useRef<HTMLDivElement | null>(null)
376
-
377
- useClickOutside(handler, [buttonRef.current, popoverElement], boundaryRef.current)
378
-
379
- return (
380
- <>
381
- <div ref={boundaryRef}>
382
- <button data-testid="button" ref={buttonRef} />
383
- <div data-testid="popover" ref={setPopoverElement} />
384
- <div data-testid="inside" />
385
- </div>
386
- <div data-testid="outside" />
387
- </>
388
- )
389
- }
390
- rerender(<TestComponent />)
391
- await user.click(screen.getByTestId('button'))
392
- await user.click(screen.getByTestId('popover'))
393
- await user.click(screen.getByTestId('outside'))
394
- expect(handler).not.toHaveBeenCalled()
395
- await user.click(screen.getByTestId('inside'))
396
- expect(handler).toHaveBeenCalledTimes(1)
397
-
398
- /**
399
- * Unrelated state updates can create the same false impression of safety.
400
- */
401
- handler = jest.fn()
402
- TestComponent = () => {
403
- const buttonRef = useRef<HTMLButtonElement | null>(null)
404
- const popoverRef = useRef<HTMLDivElement | null>(null)
405
- const boundaryRef = useRef<HTMLDivElement | null>(null)
406
-
407
- useClickOutside(handler, [buttonRef.current, popoverRef.current], boundaryRef.current)
408
-
409
- const [, tick] = useState(0)
410
- useEffect(() => {
411
- /**
412
- * This effect schedules a re-render, which will lead to `useClickOutsideHandler` "seeing"
413
- * the current value of the refs after they got assigned dom nodes when the React ref callbacks executed.
414
- */
415
- tick((prev) => ++prev)
416
- }, [])
417
-
418
- return (
419
- <>
420
- <div ref={boundaryRef}>
421
- <button data-testid="button" ref={buttonRef} />
422
- <div data-testid="popover" ref={popoverRef} />
423
- <div data-testid="inside" />
424
- </div>
425
- <div data-testid="outside" />
426
- </>
427
- )
428
- }
429
- rerender(<TestComponent />)
430
- await user.click(screen.getByTestId('button'))
431
- await user.click(screen.getByTestId('popover'))
432
- await user.click(screen.getByTestId('outside'))
433
- expect(handler).not.toHaveBeenCalled()
434
- await user.click(screen.getByTestId('inside'))
435
- expect(handler).toHaveBeenCalledTimes(1)
436
-
437
- /**
438
- * When using the legacy version of the `useClickOutside` API it's necessary to synchronize mutable ref values
439
- * with a effect and state loop to ensure they're not stale
440
- */
441
- const useBoundaryElementFromRef = (ref: React.MutableRefObject<HTMLElement | null>) => {
442
- const [element, setElement] = useState(() => ref.current)
443
-
444
- // eslint-disable-next-line react-hooks/exhaustive-deps
445
- useEffect(() => {
446
- // If the ref has mutated since the last render, update the state and schedule a re-render
447
- if (ref.current !== element) {
448
- setElement(ref.current)
449
- }
450
- })
451
-
452
- return element
453
- }
454
- handler = jest.fn()
455
- TestComponent = () => {
456
- const buttonRef = useRef<HTMLButtonElement | null>(null)
457
- const popoverRef = useRef<HTMLDivElement | null>(null)
458
- const boundaryRef = useRef<HTMLDivElement | null>(null)
459
-
460
- const boundaryElement = useBoundaryElementFromRef(boundaryRef)
461
- useClickOutside(handler, [buttonRef.current, popoverRef.current], boundaryElement)
462
-
463
- return (
464
- <>
465
- <div ref={boundaryRef}>
466
- <button data-testid="button" ref={buttonRef} />
467
- <div data-testid="popover" ref={popoverRef} />
468
- <div data-testid="inside" />
469
- </div>
470
- <div data-testid="outside" />
471
- </>
472
- )
473
- }
474
- rerender(<TestComponent />)
475
- await user.click(screen.getByTestId('button'))
476
- await user.click(screen.getByTestId('popover'))
477
- await user.click(screen.getByTestId('outside'))
478
- expect(handler).not.toHaveBeenCalled()
479
- await user.click(screen.getByTestId('inside'))
480
- expect(handler).toHaveBeenCalledTimes(1)
481
- })
482
- })
@@ -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
- return ret.filter(Boolean) as HTMLElement[]
30
- }
31
-
32
- /**
33
- * @public
34
- * @deprecated replaced by the new `useClickOutsideEvent` hook, instead of:
35
- * ```tsx
36
- * const [button, setButtonElement] = useState(null)
37
- * useClickOutside((event) => {}, [button])
38
- * return <button ref={setButtonElement} />
39
- * ```
40
- * do:
41
- * ```tsx
42
- * const buttonRef = useRef()
43
- * useClickOutsideEvent((event) => {}, () => [buttonRef.current])
44
- * return <button ref={buttonRef} />
45
- * ```
46
- */
47
- export function useClickOutside(
48
- listener: ClickOutsideListener,
49
- elementsArg: ClickOutsideElements = EMPTY_ARRAY,
50
- boundaryElement?: HTMLElement | null,
51
- ): (el: HTMLElement | null) => void {
52
- const [element, setElement] = useState<HTMLElement | null>(null)
53
- const [elements, setElements] = useState(() => _getElements(element, elementsArg))
54
- const elementsRef = useRef(elements)
55
-
56
- useEffect(() => {
57
- const prevElements = elementsRef.current
58
- const nextElements = _getElements(element, elementsArg)
59
-
60
- if (prevElements.length !== nextElements.length) {
61
- // eslint-disable-next-line react-hooks/set-state-in-effect
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
- }