@sanity/ui 3.0.0-static.32 → 3.0.0-static.34

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 (582) hide show
  1. package/README.md +1 -1
  2. package/dist/_chunks-cjs/_visual-editing.cjs +269 -378
  3. package/dist/_chunks-cjs/_visual-editing.cjs.map +1 -1
  4. package/dist/_chunks-cjs/refractor.cjs.map +1 -1
  5. package/dist/_chunks-es/_visual-editing.js +270 -381
  6. package/dist/_chunks-es/_visual-editing.js.map +1 -1
  7. package/dist/_chunks-es/refractor.js.map +1 -1
  8. package/dist/_visual-editing.cjs +0 -2
  9. package/dist/_visual-editing.cjs.map +1 -1
  10. package/dist/_visual-editing.d.cts +2 -894
  11. package/dist/_visual-editing.d.ts +2 -894
  12. package/dist/_visual-editing.js +2 -4
  13. package/dist/css/index.cjs +13 -13
  14. package/dist/css/index.cjs.map +1 -1
  15. package/dist/css/index.css +1 -1
  16. package/dist/css/index.d.cts +805 -14697
  17. package/dist/css/index.d.ts +805 -14697
  18. package/dist/css/index.js +13 -13
  19. package/dist/css/index.js.map +1 -1
  20. package/dist/index.cjs +242 -367
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +990 -3085
  23. package/dist/index.d.ts +990 -3085
  24. package/dist/index.js +244 -361
  25. package/dist/index.js.map +1 -1
  26. package/dist/portalProvider-DgNIVviV.d.ts +575 -0
  27. package/dist/theme.cjs +367 -4288
  28. package/dist/theme.cjs.map +1 -1
  29. package/dist/theme.d.cts +272 -1806
  30. package/dist/theme.d.ts +272 -1806
  31. package/dist/theme.js +371 -4292
  32. package/dist/theme.js.map +1 -1
  33. package/exports/_visual-editing.ts +0 -2
  34. package/package.json +8 -9
  35. package/src/core/Root.tsx +6 -4
  36. package/src/core/RootProvider.tsx +4 -4
  37. package/src/core/__workshop__/boundary.tsx +1 -1
  38. package/src/core/__workshop__/index.ts +5 -3
  39. package/src/core/components/autocomplete/__workshop__/async.tsx +1 -1
  40. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +2 -2
  41. package/src/core/components/autocomplete/__workshop__/custom.tsx +2 -2
  42. package/src/core/components/autocomplete/__workshop__/example.tsx +2 -2
  43. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +1 -1
  44. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +1 -1
  45. package/src/core/components/autocomplete/__workshop__/index.ts +5 -3
  46. package/src/core/components/autocomplete/__workshop__/mock/apiStore.ts +1 -1
  47. package/src/core/components/autocomplete/__workshop__/mock/countries.ts +1 -1
  48. package/src/core/components/autocomplete/autocomplete.tsx +2 -2
  49. package/src/core/components/autocomplete/autocompleteOption.tsx +2 -2
  50. package/src/core/components/autocomplete/constants.ts +2 -2
  51. package/src/core/components/breadcrumbs/__workshop__/example.tsx +1 -1
  52. package/src/core/components/breadcrumbs/__workshop__/index.ts +5 -3
  53. package/src/core/components/breadcrumbs/breadcrumbs.tsx +6 -11
  54. package/src/core/components/dialog/__workshop__/activate.tsx +1 -1
  55. package/src/core/components/dialog/__workshop__/autoFocus.tsx +1 -1
  56. package/src/core/components/dialog/__workshop__/index.ts +5 -3
  57. package/src/core/components/dialog/__workshop__/layering.tsx +1 -1
  58. package/src/core/components/dialog/__workshop__/nested.tsx +2 -3
  59. package/src/core/components/dialog/__workshop__/onScroll.tsx +1 -1
  60. package/src/core/components/dialog/__workshop__/panes.tsx +1 -1
  61. package/src/core/components/dialog/__workshop__/position.tsx +1 -1
  62. package/src/core/components/dialog/__workshop__/props.tsx +1 -1
  63. package/src/core/components/dialog/__workshop__/provider.tsx +1 -1
  64. package/src/core/components/dialog/__workshop__/wrapped.tsx +1 -1
  65. package/src/core/components/dialog/dialog.tsx +5 -6
  66. package/src/core/components/dialog/dialogCard.tsx +2 -2
  67. package/src/core/components/dialog/dialogContext.ts +3 -4
  68. package/src/core/components/dialog/dialogProvider.tsx +2 -2
  69. package/src/core/components/hotkeys/__workshop__/index.ts +5 -3
  70. package/src/core/components/hotkeys/__workshop__/plain.tsx +1 -1
  71. package/src/core/components/hotkeys/hotkeys.tsx +4 -15
  72. package/src/core/components/menu/__workshop__/asComponent.tsx +1 -1
  73. package/src/core/components/menu/__workshop__/avatarMenu.tsx +1 -1
  74. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +1 -1
  75. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +3 -3
  76. package/src/core/components/menu/__workshop__/customMenuItem.tsx +1 -1
  77. package/src/core/components/menu/__workshop__/customSelectedState.tsx +1 -1
  78. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +1 -1
  79. package/src/core/components/menu/__workshop__/groups.tsx +1 -1
  80. package/src/core/components/menu/__workshop__/index.ts +5 -3
  81. package/src/core/components/menu/__workshop__/menuButton.tsx +2 -2
  82. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +1 -1
  83. package/src/core/components/menu/__workshop__/nestedMenu.tsx +1 -1
  84. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +1 -1
  85. package/src/core/components/menu/__workshop__/selectedItem.tsx +1 -1
  86. package/src/core/components/menu/__workshop__/shouldFocus.tsx +1 -1
  87. package/src/core/components/menu/__workshop__/tones.tsx +3 -3
  88. package/src/core/components/menu/__workshop__/withoutArrow.tsx +1 -1
  89. package/src/core/components/menu/menu.test.tsx +2 -1
  90. package/src/core/components/menu/menu.tsx +7 -22
  91. package/src/core/components/menu/menuButton.tsx +4 -50
  92. package/src/core/components/menu/menuContext.ts +3 -15
  93. package/src/core/components/menu/menuDivider.tsx +2 -2
  94. package/src/core/components/menu/menuGroup.tsx +10 -15
  95. package/src/core/components/menu/menuItem.tsx +7 -18
  96. package/src/core/components/tab/__workshop__/example.tsx +1 -1
  97. package/src/core/components/tab/__workshop__/index.ts +5 -3
  98. package/src/core/components/tab/tab.tsx +6 -4
  99. package/src/core/components/tab/tabList.tsx +3 -8
  100. package/src/core/components/tab/tabPanel.tsx +2 -2
  101. package/src/core/components/toast/__workshop__/hook.tsx +1 -1
  102. package/src/core/components/toast/__workshop__/index.ts +5 -3
  103. package/src/core/components/toast/__workshop__/toast.tsx +1 -1
  104. package/src/core/components/toast/toast.test.tsx +2 -1
  105. package/src/core/components/toast/toast.tsx +2 -2
  106. package/src/core/components/toast/toastContext.ts +4 -4
  107. package/src/core/components/toast/toastLayer.tsx +3 -3
  108. package/src/core/components/tree/__workshop__/basic.perf.ts +1 -1
  109. package/src/core/components/tree/__workshop__/basic.tsx +1 -1
  110. package/src/core/components/tree/__workshop__/index.ts +5 -3
  111. package/src/core/components/tree/__workshop__/tabFromElement.tsx +1 -1
  112. package/src/core/components/tree/tree.tsx +8 -9
  113. package/src/core/components/tree/treeContext.ts +4 -4
  114. package/src/core/components/tree/treeGroup.tsx +6 -8
  115. package/src/core/components/tree/treeItem.tsx +4 -4
  116. package/src/core/components/tree/types.ts +1 -1
  117. package/src/core/components/virtualList/__workshop__/changingProps.tsx +1 -1
  118. package/src/core/components/virtualList/__workshop__/elementScroll.tsx +1 -1
  119. package/src/core/components/virtualList/__workshop__/index.ts +5 -3
  120. package/src/core/components/virtualList/__workshop__/infiniteList.tsx +1 -1
  121. package/src/core/components/virtualList/__workshop__/windowScrolll.tsx +1 -1
  122. package/src/core/components/virtualList/virtualList.tsx +2 -2
  123. package/src/core/constants.ts +0 -18
  124. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +5 -3
  125. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +1 -1
  126. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +6 -1
  127. package/src/core/index.ts +1 -24
  128. package/src/core/lib/createGlobalScopedContext.ts +1 -1
  129. package/src/core/lib/globalScope.ts +1 -1
  130. package/src/core/observers/elementSize.ts +1 -1
  131. package/src/core/primitives/arrow/arrow.tsx +2 -2
  132. package/src/core/primitives/avatar/__workshop__/asButton.tsx +1 -1
  133. package/src/core/primitives/avatar/__workshop__/index.ts +5 -3
  134. package/src/core/primitives/avatar/__workshop__/stack.tsx +1 -1
  135. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +1 -1
  136. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +1 -1
  137. package/src/core/primitives/avatar/avatar.tsx +3 -10
  138. package/src/core/primitives/avatar/avatarCounter.tsx +2 -2
  139. package/src/core/primitives/avatar/avatarStack.tsx +2 -4
  140. package/src/core/primitives/avatar/types.ts +0 -32
  141. package/src/core/primitives/badge/__workshop__/index.ts +5 -3
  142. package/src/core/primitives/badge/__workshop__/props.tsx +1 -1
  143. package/src/core/primitives/badge/__workshop__/tones.tsx +3 -3
  144. package/src/core/primitives/badge/badge.test.tsx +2 -1
  145. package/src/core/primitives/badge/badge.tsx +12 -11
  146. package/src/core/primitives/box/__workshop__/index.ts +5 -3
  147. package/src/core/primitives/box/__workshop__/props.tsx +1 -1
  148. package/src/core/primitives/box/__workshop__/responsive.tsx +1 -1
  149. package/src/core/primitives/box/box.tsx +28 -32
  150. package/src/core/primitives/button/__workshop__/custom.tsx +5 -5
  151. package/src/core/primitives/button/__workshop__/customIcons.tsx +1 -1
  152. package/src/core/primitives/button/__workshop__/disabled.tsx +3 -3
  153. package/src/core/primitives/button/__workshop__/index.ts +5 -3
  154. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +1 -1
  155. package/src/core/primitives/button/__workshop__/props.tsx +1 -1
  156. package/src/core/primitives/button/__workshop__/sanityUploadButton.tsx +1 -1
  157. package/src/core/primitives/button/__workshop__/stacked.tsx +1 -1
  158. package/src/core/primitives/button/__workshop__/styled1.tsx +1 -1
  159. package/src/core/primitives/button/__workshop__/styled2.tsx +1 -1
  160. package/src/core/primitives/button/__workshop__/textOverflow.tsx +1 -1
  161. package/src/core/primitives/button/__workshop__/uploadButton.tsx +1 -1
  162. package/src/core/primitives/button/button.test.tsx +2 -1
  163. package/src/core/primitives/button/button.tsx +4 -7
  164. package/src/core/primitives/button/types.ts +0 -20
  165. package/src/core/primitives/card/__workshop__/asButton.tsx +2 -2
  166. package/src/core/primitives/card/__workshop__/asComponent.tsx +1 -1
  167. package/src/core/primitives/card/__workshop__/checkered.tsx +3 -3
  168. package/src/core/primitives/card/__workshop__/index.ts +5 -3
  169. package/src/core/primitives/card/__workshop__/interactive.tsx +1 -1
  170. package/src/core/primitives/card/__workshop__/listNavigation.tsx +1 -1
  171. package/src/core/primitives/card/__workshop__/props.tsx +1 -1
  172. package/src/core/primitives/card/__workshop__/selected.tsx +1 -1
  173. package/src/core/primitives/card/__workshop__/styled.tsx +1 -1
  174. package/src/core/primitives/card/__workshop__/tones.tsx +3 -3
  175. package/src/core/primitives/card/card.tsx +4 -2
  176. package/src/core/primitives/card/cardContext.ts +1 -1
  177. package/src/core/primitives/card/cardProvider.tsx +4 -4
  178. package/src/core/primitives/card/types.ts +5 -19
  179. package/src/core/primitives/checkbox/__workshop__/example.tsx +1 -1
  180. package/src/core/primitives/checkbox/__workshop__/index.ts +5 -3
  181. package/src/core/primitives/checkbox/__workshop__/props.tsx +1 -1
  182. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +1 -1
  183. package/src/core/primitives/checkbox/__workshop__/tones.tsx +3 -3
  184. package/src/core/primitives/checkbox/checkbox.tsx +2 -2
  185. package/src/core/primitives/code/__workshop__/index.ts +5 -3
  186. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +1 -1
  187. package/src/core/primitives/code/__workshop__/props.tsx +1 -1
  188. package/src/core/primitives/code/code.tsx +4 -2
  189. package/src/core/primitives/code/refractor.tsx +1 -1
  190. package/src/core/primitives/container/__workshop__/example.tsx +1 -1
  191. package/src/core/primitives/container/__workshop__/index.ts +5 -3
  192. package/src/core/primitives/container/container.tsx +2 -2
  193. package/src/core/primitives/flex/__workshop__/example.tsx +1 -1
  194. package/src/core/primitives/flex/__workshop__/gap.tsx +1 -1
  195. package/src/core/primitives/flex/__workshop__/index.ts +5 -3
  196. package/src/core/primitives/flex/flex.tsx +4 -2
  197. package/src/core/primitives/grid/__workshop__/index.ts +5 -3
  198. package/src/core/primitives/grid/__workshop__/responsive.tsx +3 -3
  199. package/src/core/primitives/grid/grid.tsx +4 -2
  200. package/src/core/primitives/heading/__workshop__/index.ts +5 -3
  201. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +1 -1
  202. package/src/core/primitives/heading/__workshop__/plain.tsx +1 -1
  203. package/src/core/primitives/heading/heading.tsx +2 -4
  204. package/src/core/primitives/inline/__workshop__/index.ts +5 -3
  205. package/src/core/primitives/inline/__workshop__/plain.tsx +1 -1
  206. package/src/core/primitives/inline/inline.tsx +4 -11
  207. package/src/core/primitives/kbd/__workshop__/index.ts +5 -3
  208. package/src/core/primitives/kbd/__workshop__/plain.tsx +1 -1
  209. package/src/core/primitives/kbd/kbd.tsx +4 -2
  210. package/src/core/primitives/label/__workshop__/index.ts +5 -3
  211. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +1 -1
  212. package/src/core/primitives/label/__workshop__/plain.tsx +1 -1
  213. package/src/core/primitives/label/label.tsx +2 -4
  214. package/src/core/primitives/layer/__workshop__/_debug.tsx +1 -1
  215. package/src/core/primitives/layer/__workshop__/index.ts +5 -3
  216. package/src/core/primitives/layer/__workshop__/multipleRoots.tsx +1 -1
  217. package/src/core/primitives/layer/__workshop__/nested.tsx +1 -1
  218. package/src/core/primitives/layer/__workshop__/responsiveZOffset.tsx +1 -1
  219. package/src/core/primitives/layer/layer.test.tsx +2 -1
  220. package/src/core/primitives/layer/layer.tsx +2 -2
  221. package/src/core/primitives/layer/layerCard.tsx +2 -2
  222. package/src/core/primitives/layer/layerContext.ts +4 -4
  223. package/src/core/primitives/layer/layerProvider.tsx +2 -10
  224. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +2 -2
  225. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +1 -1
  226. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +1 -1
  227. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +1 -1
  228. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +2 -2
  229. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +3 -3
  230. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +3 -3
  231. package/src/core/primitives/popover/__workshop__/index.ts +5 -3
  232. package/src/core/primitives/popover/popover.tsx +34 -17
  233. package/src/core/primitives/popover/popoverLayer.tsx +2 -2
  234. package/src/core/primitives/radio/__workshop__/example.tsx +1 -1
  235. package/src/core/primitives/radio/__workshop__/index.ts +5 -3
  236. package/src/core/primitives/radio/__workshop__/plain.tsx +1 -1
  237. package/src/core/primitives/radio/radio.tsx +2 -2
  238. package/src/core/primitives/select/__workshop__/index.ts +5 -3
  239. package/src/core/primitives/select/__workshop__/plain.tsx +1 -1
  240. package/src/core/primitives/select/__workshop__/readOnly.tsx +1 -1
  241. package/src/core/primitives/select/select.tsx +5 -15
  242. package/src/core/primitives/selectable/selectable.tsx +4 -4
  243. package/src/core/primitives/skeleton/__workshop__/delay.tsx +1 -1
  244. package/src/core/primitives/skeleton/__workshop__/index.ts +5 -3
  245. package/src/core/primitives/skeleton/__workshop__/skeleton.tsx +2 -2
  246. package/src/core/primitives/skeleton/codeSkeleton.tsx +2 -2
  247. package/src/core/primitives/skeleton/headingSkeleton.tsx +2 -2
  248. package/src/core/primitives/skeleton/labelSkeleton.tsx +2 -2
  249. package/src/core/primitives/skeleton/skeleton.tsx +2 -2
  250. package/src/core/primitives/skeleton/textSkeleton.tsx +2 -2
  251. package/src/core/primitives/spinner/__workshop__/Props.tsx +1 -1
  252. package/src/core/primitives/spinner/__workshop__/index.ts +5 -3
  253. package/src/core/primitives/spinner/animatedSpinnerIcon.tsx +2 -2
  254. package/src/core/primitives/spinner/spinner.tsx +2 -2
  255. package/src/core/primitives/srOnly/srOnly.tsx +2 -2
  256. package/src/core/primitives/stack/__workshop__/index.ts +5 -3
  257. package/src/core/primitives/stack/__workshop__/plain.tsx +1 -1
  258. package/src/core/primitives/stack/stack.tsx +5 -10
  259. package/src/core/primitives/switch/__workshop__/example.tsx +1 -1
  260. package/src/core/primitives/switch/__workshop__/index.ts +5 -3
  261. package/src/core/primitives/switch/__workshop__/props.tsx +1 -1
  262. package/src/core/primitives/switch/switch.tsx +2 -2
  263. package/src/core/primitives/text/__workshop__/colored.tsx +1 -1
  264. package/src/core/primitives/text/__workshop__/example.tsx +1 -1
  265. package/src/core/primitives/text/__workshop__/index.ts +5 -3
  266. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +1 -1
  267. package/src/core/primitives/text/text.tsx +4 -4
  268. package/src/core/primitives/textArea/__workshop__/index.ts +5 -3
  269. package/src/core/primitives/textArea/__workshop__/plain.tsx +1 -1
  270. package/src/core/primitives/textArea/textArea.tsx +5 -15
  271. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +1 -1
  272. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +1 -1
  273. package/src/core/primitives/textInput/__workshop__/index.ts +5 -3
  274. package/src/core/primitives/textInput/__workshop__/plain.tsx +1 -1
  275. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +1 -1
  276. package/src/core/primitives/textInput/__workshop__/states.tsx +1 -1
  277. package/src/core/primitives/textInput/__workshop__/tones.tsx +1 -1
  278. package/src/core/primitives/textInput/__workshop__/typed.tsx +1 -1
  279. package/src/core/primitives/textInput/textInput.tsx +6 -9
  280. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +1 -1
  281. package/src/core/primitives/tooltip/__workshop__/index.ts +5 -3
  282. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +1 -1
  283. package/src/core/primitives/tooltip/__workshop__/props.tsx +1 -1
  284. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +1 -1
  285. package/src/core/primitives/tooltip/constants.ts +1 -1
  286. package/src/core/primitives/tooltip/tooltip.test.tsx +2 -4
  287. package/src/core/primitives/tooltip/tooltip.tsx +5 -9
  288. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +4 -2
  289. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +5 -3
  290. package/src/core/primitives/tooltip/tooltipLayer.tsx +2 -2
  291. package/src/core/{types/props.ts → types.ts} +27 -0
  292. package/src/core/utils/boundaryElement/__workshop__/index.ts +5 -3
  293. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +1 -1
  294. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +2 -1
  295. package/src/core/utils/boundaryElement/boundaryElementContext.ts +7 -4
  296. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +2 -2
  297. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +1 -1
  298. package/src/core/utils/elementQuery/__workshop__/index.ts +5 -3
  299. package/src/core/utils/elementQuery/elementQuery.tsx +2 -2
  300. package/src/core/utils/getElementRef.ts +1 -1
  301. package/src/core/utils/portal/__workshop__/index.ts +5 -3
  302. package/src/core/utils/portal/__workshop__/named.tsx +1 -1
  303. package/src/core/utils/portal/portal.test.tsx +2 -1
  304. package/src/core/utils/portal/portalContext.ts +5 -2
  305. package/src/core/utils/portal/portalProvider.tsx +5 -9
  306. package/src/css/_responsiveClassName.ts +2 -2
  307. package/src/css/_style.css.ts +1 -1
  308. package/src/css/components/breadcrumbs/breadcrumbs.css.ts +1 -1
  309. package/src/css/components/dialog/dialog.css.ts +9 -17
  310. package/src/css/components/menu/menu.css.ts +2 -2
  311. package/src/css/components/menu/menu.ts +2 -2
  312. package/src/css/components/skeleton/skeleton.css.ts +2 -6
  313. package/src/css/components/toast/toast.css.ts +2 -2
  314. package/src/css/components/toast/toast.ts +2 -2
  315. package/src/css/components/tree/tree.css.ts +1 -1
  316. package/src/css/components/tree/tree.ts +1 -1
  317. package/src/css/defaultTheme.css.ts +59 -60
  318. package/src/css/layers.css.ts +4 -1
  319. package/src/css/primitives/_arrow/_arrow.css.ts +5 -5
  320. package/src/css/primitives/_input/_input.css.ts +4 -4
  321. package/src/css/primitives/_selectable/_selectable.css.ts +4 -4
  322. package/src/css/primitives/_selectable/types.ts +2 -2
  323. package/src/css/primitives/avatar/avatar.css.ts +10 -10
  324. package/src/css/primitives/badge/badge.css.ts +4 -4
  325. package/src/css/primitives/badge/types.ts +8 -2
  326. package/src/css/primitives/box/box.css.ts +2 -2
  327. package/src/css/primitives/button/button.css.ts +6 -6
  328. package/src/css/primitives/button/button.ts +2 -2
  329. package/src/css/primitives/button/types.ts +3 -3
  330. package/src/css/primitives/card/__workshop__/color.tsx +9 -9
  331. package/src/css/primitives/card/__workshop__/index.ts +5 -3
  332. package/src/css/primitives/card/card.css.ts +12 -18
  333. package/src/css/primitives/card/types.ts +3 -3
  334. package/src/css/primitives/checkbox/checkbox.css.ts +3 -3
  335. package/src/css/primitives/checkbox/checkbox.ts +3 -3
  336. package/src/css/primitives/code/code.css.ts +4 -3
  337. package/src/css/primitives/code/types.ts +3 -4
  338. package/src/css/primitives/container/container.css.ts +1 -1
  339. package/src/css/primitives/heading/heading.css.ts +5 -4
  340. package/src/css/primitives/heading/types.ts +3 -6
  341. package/src/css/primitives/kbd/kbd.css.ts +1 -1
  342. package/src/css/primitives/label/label.css.ts +5 -4
  343. package/src/css/primitives/label/types.ts +0 -8
  344. package/src/css/primitives/popover/popover.css.ts +2 -2
  345. package/src/css/primitives/popover/popover.ts +2 -2
  346. package/src/css/primitives/radio/radio.css.ts +3 -3
  347. package/src/css/primitives/radio/radio.ts +3 -3
  348. package/src/css/primitives/root/root.css.ts +2 -2
  349. package/src/css/primitives/root/root.ts +2 -2
  350. package/src/css/primitives/root/types.ts +3 -3
  351. package/src/css/primitives/select/select.css.ts +3 -3
  352. package/src/css/primitives/spinner/spinner.css.ts +2 -6
  353. package/src/css/primitives/spinner/spinner.ts +2 -2
  354. package/src/css/primitives/srOnly/srOnly.css.ts +1 -1
  355. package/src/css/primitives/srOnly/srOnly.ts +1 -1
  356. package/src/css/primitives/stack/stack.css.ts +1 -1
  357. package/src/css/primitives/stack/stack.ts +1 -1
  358. package/src/css/primitives/switch/switch.css.ts +5 -5
  359. package/src/css/primitives/text/text.css.ts +5 -4
  360. package/src/css/primitives/text/types.ts +3 -5
  361. package/src/css/primitives/textArea/textArea.css.ts +1 -1
  362. package/src/css/primitives/textInput/textInput.css.ts +4 -4
  363. package/src/css/primitives/tooltip/tooltip.css.ts +1 -1
  364. package/src/css/props/alignItems/alignItems.ts +1 -1
  365. package/src/css/props/border/border.ts +1 -16
  366. package/src/css/props/boxSizing/boxSizing.css.ts +2 -1
  367. package/src/css/props/boxSizing/boxSizing.ts +0 -3
  368. package/src/css/props/display/display.ts +1 -10
  369. package/src/css/props/flex/flex.ts +1 -1
  370. package/src/css/props/flexDirection/flexDirection.ts +1 -1
  371. package/src/css/props/flexWrap/flexWrap.ts +1 -1
  372. package/src/css/props/font/font.css.ts +3 -2
  373. package/src/css/props/font/font.ts +1 -1
  374. package/src/css/props/gap/gap.ts +1 -1
  375. package/src/css/props/gridAutoColumns/gridAutoColumns.css.ts +2 -2
  376. package/src/css/props/gridAutoColumns/gridAutoColumns.ts +2 -2
  377. package/src/css/props/gridAutoColumns/types.ts +0 -10
  378. package/src/css/props/gridAutoFlow/gridAutoFlow.ts +2 -2
  379. package/src/css/props/gridAutoFlow/types.ts +0 -4
  380. package/src/css/props/gridAutoRows/gridAutoRows.ts +2 -2
  381. package/src/css/props/gridAutoRows/types.ts +0 -4
  382. package/src/css/props/gridColumn/gridColumn.ts +3 -3
  383. package/src/css/props/gridColumn/types.ts +0 -10
  384. package/src/css/props/gridColumnEnd/gridColumnEnd.ts +3 -3
  385. package/src/css/props/gridColumnEnd/types.ts +0 -10
  386. package/src/css/props/gridColumnStart/gridColumnStart.ts +3 -6
  387. package/src/css/props/gridColumnStart/types.ts +0 -10
  388. package/src/css/props/gridRow/gridRow.ts +3 -3
  389. package/src/css/props/gridRow/types.ts +0 -10
  390. package/src/css/props/gridRowEnd/gridRowEnd.ts +3 -3
  391. package/src/css/props/gridRowEnd/types.ts +0 -10
  392. package/src/css/props/gridRowStart/gridRowStart.ts +3 -3
  393. package/src/css/props/gridRowStart/types.ts +0 -10
  394. package/src/css/props/gridTemplateColumns/gridTemplateColumns.ts +2 -2
  395. package/src/css/props/gridTemplateColumns/types.ts +0 -10
  396. package/src/css/props/gridTemplateRows/gridTemplateRows.ts +2 -2
  397. package/src/css/props/gridTemplateRows/types.ts +0 -10
  398. package/src/css/props/height/height.ts +1 -1
  399. package/src/css/props/height/types.ts +0 -6
  400. package/src/css/props/inset/inset.ts +1 -1
  401. package/src/css/props/justifyContent/justifyContent.ts +1 -1
  402. package/src/css/props/margin/margin.ts +1 -1
  403. package/src/css/props/maxWidth/maxWidth.ts +1 -1
  404. package/src/css/props/minHeight/minHeight.ts +1 -1
  405. package/src/css/props/minWidth/minWidth.ts +1 -1
  406. package/src/css/props/outline/outline.ts +1 -1
  407. package/src/css/props/overflow/overflow.ts +1 -1
  408. package/src/css/props/overflow/types.ts +0 -6
  409. package/src/css/props/padding/padding.ts +1 -1
  410. package/src/css/props/pointerEvents/pointerEvents.ts +1 -1
  411. package/src/css/props/position/position.ts +1 -1
  412. package/src/css/props/radius/radius.ts +1 -1
  413. package/src/css/props/shadow/shadow.ts +1 -1
  414. package/src/css/props/textAlign/textAlign.ts +1 -1
  415. package/src/css/props/textOverflow/textOverflow.ts +1 -1
  416. package/src/css/props/width/width.ts +1 -1
  417. package/src/css/types.ts +225 -53
  418. package/src/css/util.ts +2 -2
  419. package/src/css/vars.css.ts +33 -36
  420. package/src/theme/{v3/_parseColorToken.ts → _parseColorToken.ts} +2 -2
  421. package/src/theme/buildTheme.ts +33 -0
  422. package/src/theme/constants.ts +90 -0
  423. package/src/theme/defaults/color.ts +197 -0
  424. package/src/theme/{v2/defaults/config.ts → defaults/common.ts} +3 -16
  425. package/src/theme/{v3/defaultFonts.ts → defaults/fonts.ts} +2 -2
  426. package/src/theme/index.ts +4 -5
  427. package/src/theme/{v3/resolveTokens.ts → resolveTokens.ts} +15 -15
  428. package/src/theme/types.ts +355 -15
  429. package/dist/css/layers.css +0 -4
  430. package/dist/css/primitives/popover/popover.css +0 -4
  431. package/src/core/__DEV__.ts +0 -5
  432. package/src/core/_compat/helpers.ts +0 -72
  433. package/src/core/_compat/styles/_responsive.ts +0 -19
  434. package/src/core/_compat/theme/theme.test.tsx +0 -73
  435. package/src/core/_compat/theme/themeColorProvider.tsx +0 -24
  436. package/src/core/_compat/theme/themeContext.ts +0 -10
  437. package/src/core/_compat/theme/themeProvider.tsx +0 -68
  438. package/src/core/_compat/theme/types.ts +0 -10
  439. package/src/core/_compat/theme/useRootTheme.ts +0 -15
  440. package/src/core/_compat/theme/useTheme.ts +0 -12
  441. package/src/core/_compat/types.ts +0 -191
  442. package/src/core/hooks/useArrayProp.ts +0 -26
  443. package/src/core/hooks/useClickOutside.test.tsx +0 -481
  444. package/src/core/hooks/useClickOutside.ts +0 -113
  445. package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -30
  446. package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
  447. package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
  448. package/src/core/hooks/useForwardedRef.ts +0 -19
  449. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  450. package/src/core/primitives/badge/types.ts +0 -18
  451. package/src/core/primitives/box/types.ts +0 -22
  452. package/src/core/primitives/flex/types.ts +0 -27
  453. package/src/core/primitives/grid/types.ts +0 -17
  454. package/src/core/primitives/selectable/types.ts +0 -7
  455. package/src/core/primitives/types.ts +0 -153
  456. package/src/core/types/gridItem.ts +0 -32
  457. package/src/core/types/placement.ts +0 -18
  458. package/src/core/types/radius.ts +0 -7
  459. package/src/core/types/textAlign.ts +0 -7
  460. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  461. package/src/theme/getScopedTheme.ts +0 -88
  462. package/src/theme/v0/avatar.ts +0 -10
  463. package/src/theme/v0/color/_generic.ts +0 -35
  464. package/src/theme/v0/color/_system.ts +0 -17
  465. package/src/theme/v0/color/base.ts +0 -21
  466. package/src/theme/v0/color/button.ts +0 -42
  467. package/src/theme/v0/color/card.ts +0 -19
  468. package/src/theme/v0/color/color.ts +0 -40
  469. package/src/theme/v0/color/index.ts +0 -11
  470. package/src/theme/v0/color/input.ts +0 -34
  471. package/src/theme/v0/color/muted.ts +0 -26
  472. package/src/theme/v0/color/selectable.ts +0 -31
  473. package/src/theme/v0/color/solid.ts +0 -26
  474. package/src/theme/v0/color/spot.ts +0 -13
  475. package/src/theme/v0/css.ts +0 -10
  476. package/src/theme/v0/focusRing.ts +0 -5
  477. package/src/theme/v0/font.ts +0 -40
  478. package/src/theme/v0/index.ts +0 -10
  479. package/src/theme/v0/input.ts +0 -23
  480. package/src/theme/v0/layer.ts +0 -6
  481. package/src/theme/v0/shadow.ts +0 -15
  482. package/src/theme/v0/styles.ts +0 -13
  483. package/src/theme/v0/theme.ts +0 -72
  484. package/src/theme/v2/avatar.ts +0 -12
  485. package/src/theme/v2/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
  486. package/src/theme/v2/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
  487. package/src/theme/v2/build/_deprecated/color/button/createButtonModes.ts +0 -22
  488. package/src/theme/v2/build/_deprecated/color/button/createButtonTones.ts +0 -55
  489. package/src/theme/v2/build/_deprecated/color/card/createCardStates.ts +0 -60
  490. package/src/theme/v2/build/_deprecated/color/color.test.ts +0 -63
  491. package/src/theme/v2/build/_deprecated/color/defaults.ts +0 -390
  492. package/src/theme/v2/build/_deprecated/color/factory.ts +0 -141
  493. package/src/theme/v2/build/_deprecated/color/index.ts +0 -1
  494. package/src/theme/v2/build/_deprecated/color/input/createInputModes.ts +0 -86
  495. package/src/theme/v2/build/_deprecated/color/muted/createMuted.ts +0 -54
  496. package/src/theme/v2/build/_deprecated/color/spot/createSpot.ts +0 -20
  497. package/src/theme/v2/build/buildColorTheme.test.ts +0 -185
  498. package/src/theme/v2/build/buildColorTheme.ts +0 -494
  499. package/src/theme/v2/build/buildTheme.test.ts +0 -89
  500. package/src/theme/v2/build/buildTheme.ts +0 -37
  501. package/src/theme/v2/build/colorToken/colorToken.ts +0 -19
  502. package/src/theme/v2/build/colorToken/compileColorToken.ts +0 -21
  503. package/src/theme/v2/build/colorToken/index.ts +0 -2
  504. package/src/theme/v2/build/colorToken/types.ts +0 -6
  505. package/src/theme/v2/build/index.ts +0 -3
  506. package/src/theme/v2/build/lib/color-fns/blend/index.ts +0 -3
  507. package/src/theme/v2/build/lib/color-fns/blend/mix.ts +0 -21
  508. package/src/theme/v2/build/lib/color-fns/blend/multiply.ts +0 -18
  509. package/src/theme/v2/build/lib/color-fns/blend/screen.ts +0 -18
  510. package/src/theme/v2/build/lib/color-fns/color-fns.test.ts +0 -68
  511. package/src/theme/v2/build/lib/color-fns/contrastRatio.ts +0 -34
  512. package/src/theme/v2/build/lib/color-fns/convert.ts +0 -150
  513. package/src/theme/v2/build/lib/color-fns/index.ts +0 -6
  514. package/src/theme/v2/build/lib/color-fns/parse.ts +0 -60
  515. package/src/theme/v2/build/lib/color-fns/rgba.ts +0 -14
  516. package/src/theme/v2/build/lib/color-fns/types.ts +0 -28
  517. package/src/theme/v2/build/lib/isRecord.ts +0 -3
  518. package/src/theme/v2/build/lib/utils.ts +0 -19
  519. package/src/theme/v2/build/merge.ts +0 -28
  520. package/src/theme/v2/build/mixThemeColor.test.ts +0 -23
  521. package/src/theme/v2/build/mixThemeColor.ts +0 -53
  522. package/src/theme/v2/build/renderColorTheme.ts +0 -532
  523. package/src/theme/v2/build/renderColorValue.ts +0 -85
  524. package/src/theme/v2/build/resolveColorTokens.ts +0 -268
  525. package/src/theme/v2/color/_constants.ts +0 -45
  526. package/src/theme/v2/color/_helpers.ts +0 -24
  527. package/src/theme/v2/color/_system.ts +0 -38
  528. package/src/theme/v2/color/avatar.ts +0 -11
  529. package/src/theme/v2/color/badge.ts +0 -12
  530. package/src/theme/v2/color/button.ts +0 -11
  531. package/src/theme/v2/color/color.ts +0 -28
  532. package/src/theme/v2/color/index.ts +0 -13
  533. package/src/theme/v2/color/input.ts +0 -23
  534. package/src/theme/v2/color/kbd.ts +0 -6
  535. package/src/theme/v2/color/selectable.ts +0 -8
  536. package/src/theme/v2/color/shadow.ts +0 -7
  537. package/src/theme/v2/color/state.ts +0 -41
  538. package/src/theme/v2/color/syntax.ts +0 -39
  539. package/src/theme/v2/config/helpers.ts +0 -48
  540. package/src/theme/v2/config/index.ts +0 -4
  541. package/src/theme/v2/config/system.ts +0 -114
  542. package/src/theme/v2/config/tokens/color/index.ts +0 -1
  543. package/src/theme/v2/config/tokens/color/types.ts +0 -137
  544. package/src/theme/v2/config/tokens/index.ts +0 -3
  545. package/src/theme/v2/config/tokens/parseTokenValue.test.ts +0 -44
  546. package/src/theme/v2/config/tokens/parseTokenValue.ts +0 -133
  547. package/src/theme/v2/config/tokens/types.ts +0 -53
  548. package/src/theme/v2/config/types.ts +0 -47
  549. package/src/theme/v2/defaults/colorPalette.ts +0 -5
  550. package/src/theme/v2/defaults/colorTokens.ts +0 -648
  551. package/src/theme/v2/defaults/fonts.ts +0 -227
  552. package/src/theme/v2/index.ts +0 -6
  553. package/src/theme/v2/input.ts +0 -31
  554. package/src/theme/v2/theme.ts +0 -45
  555. package/src/theme/v3/_constants.ts +0 -29
  556. package/src/theme/v3/buildTheme_v3.ts +0 -39
  557. package/src/theme/v3/color/_constants.ts +0 -15
  558. package/src/theme/v3/color/avatar.ts +0 -14
  559. package/src/theme/v3/color/card.ts +0 -79
  560. package/src/theme/v3/color/color.ts +0 -98
  561. package/src/theme/v3/color/element.ts +0 -19
  562. package/src/theme/v3/color/index.ts +0 -7
  563. package/src/theme/v3/color/token.ts +0 -32
  564. package/src/theme/v3/color/tokens.ts +0 -5
  565. package/src/theme/v3/defaultTokens.ts +0 -199
  566. package/src/theme/v3/index.ts +0 -9
  567. package/src/theme/v3/palette/constants.ts +0 -15
  568. package/src/theme/v3/palette/index.ts +0 -2
  569. package/src/theme/v3/palette/types.ts +0 -7
  570. package/src/theme/v3/tokens.ts +0 -16
  571. package/src/theme/v3/types.ts +0 -133
  572. package/src/theme/versioning/getTheme_v2.ts +0 -58
  573. package/src/theme/versioning/index.ts +0 -1
  574. package/src/theme/versioning/is_v0.ts +0 -7
  575. package/src/theme/versioning/is_v2.ts +0 -7
  576. package/src/theme/versioning/themeColor_v0_v2.ts +0 -245
  577. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
  578. package/src/theme/versioning/themeColor_v3_v2.ts +0 -383
  579. package/src/theme/versioning/v0_v2.ts +0 -95
  580. package/src/theme/versioning/v2_v0.ts +0 -127
  581. package/src/theme/versioning/v3_v2.ts +0 -130
  582. /package/src/theme/{v3/merge.ts → merge.ts} +0 -0
@@ -1,481 +0,0 @@
1
- import {render, screen} from '@testing-library/react'
2
- import userEvent from '@testing-library/user-event'
3
- import {type MutableRefObject, useEffect, useRef, useState} from 'react'
4
- import {describe, expect, it, vi} from 'vitest'
5
-
6
- import {useClickOutside} from './useClickOutside'
7
-
8
- describe('useClickOutside', () => {
9
- /**
10
- * Specifying the elements array directly:
11
- * useClickOutside(handler, [buttonElement, popoverElement])
12
- * instead of in a callback:
13
- * useClickOutside(handler, () => [buttonElement, popoverElement])
14
- * is still supported, but deprecated and discouraged. The same is true for the `setElement` callback pattern
15
- */
16
- it('calls the handler when clicking outside of the array of elements', async () => {
17
- const user = userEvent.setup()
18
- const handler = vi.fn()
19
-
20
- const TestComponent = () => {
21
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
22
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
23
-
24
- useClickOutside(handler, [buttonElement, popoverElement])
25
-
26
- return (
27
- <>
28
- <button data-testid="button" ref={setButtonElement} />
29
- <div data-testid="popover" ref={setPopoverElement} />
30
- <div data-testid="outside" />
31
- </>
32
- )
33
- }
34
-
35
- render(<TestComponent />)
36
-
37
- await user.click(screen.getByTestId('button'))
38
- await user.click(screen.getByTestId('popover'))
39
- expect(handler).not.toHaveBeenCalled()
40
-
41
- await user.click(screen.getByTestId('outside'))
42
- expect(handler).toHaveBeenCalledTimes(1)
43
- })
44
-
45
- it('the elements array flattens nested arrays one level deep', async () => {
46
- const user = userEvent.setup()
47
- const handler = vi.fn()
48
-
49
- const TestComponent = () => {
50
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
51
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
52
-
53
- useClickOutside(handler, [null, [null, buttonElement], [popoverElement, null], null])
54
-
55
- return (
56
- <>
57
- <button data-testid="button" ref={setButtonElement} />
58
- <div data-testid="popover" ref={setPopoverElement} />
59
- <div data-testid="outside" />
60
- </>
61
- )
62
- }
63
-
64
- render(<TestComponent />)
65
-
66
- await user.click(screen.getByTestId('button'))
67
- await user.click(screen.getByTestId('popover'))
68
- expect(handler).not.toHaveBeenCalled()
69
-
70
- await user.click(screen.getByTestId('outside'))
71
- expect(handler).toHaveBeenCalledTimes(1)
72
- })
73
-
74
- it('it can set a boundary to scope outside click events', async () => {
75
- const user = userEvent.setup()
76
- const handler = vi.fn()
77
-
78
- const TestComponent = () => {
79
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
80
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
81
- const [boundaryElement, setBoundaryElement] = useState<HTMLDivElement | null>(null)
82
-
83
- useClickOutside(handler, [buttonElement, popoverElement], boundaryElement)
84
-
85
- return (
86
- <>
87
- <div ref={setBoundaryElement}>
88
- <button data-testid="button" ref={setButtonElement} />
89
- <div data-testid="popover" ref={setPopoverElement} />
90
- <div data-testid="inside" />
91
- </div>
92
- <div data-testid="outside" />
93
- </>
94
- )
95
- }
96
-
97
- render(<TestComponent />)
98
-
99
- await user.click(screen.getByTestId('button'))
100
- await user.click(screen.getByTestId('popover'))
101
- // Since it's outside the boundary it should be ignored
102
- await user.click(screen.getByTestId('outside'))
103
- expect(handler).not.toHaveBeenCalled()
104
-
105
- await user.click(screen.getByTestId('inside'))
106
- expect(handler).toHaveBeenCalledTimes(1)
107
- })
108
-
109
- it('it returns a `setElement` callback', async () => {
110
- /**
111
- * We don't use this pattern in the studio codebase anymore, and we don't recommend using it moving forward.
112
- * But since it's part of the public API we can't remove it without a major version bump.
113
- * Thus it makes sense to unit test it to ensure it works as expected and we don't accidentally break backwards compatibility.
114
- */
115
- const user = userEvent.setup()
116
- const handler = vi.fn()
117
-
118
- const TestComponent = (props: {open?: true}) => {
119
- const {open = false} = props
120
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
121
-
122
- const setElement = useClickOutside(handler, [buttonElement])
123
-
124
- return (
125
- <>
126
- <button data-testid="button" ref={setButtonElement} />
127
- {open && <div data-testid="popover" ref={setElement} />}
128
- <div data-testid="outside" />
129
- </>
130
- )
131
- }
132
-
133
- const {rerender} = render(<TestComponent />)
134
-
135
- await user.click(screen.getByTestId('button'))
136
- expect(handler).not.toHaveBeenCalled()
137
-
138
- await user.click(screen.getByTestId('outside'))
139
- expect(handler).toHaveBeenCalledTimes(1)
140
-
141
- // The popover isn't rendered yet
142
- expect(screen.queryByTestId('popover')).toBeNull()
143
-
144
- // Rerender the component with the popover open
145
- rerender(<TestComponent open />)
146
-
147
- // Clicking the popover should not trigger the handler
148
- await user.click(screen.getByTestId('popover'))
149
- expect(handler).toHaveBeenCalledTimes(1)
150
- })
151
-
152
- it('instead of `setElement`, update the `elements` array', async () => {
153
- /**
154
- * Since we don't want people to use the `setElement` pattern, test that userland can handle dynamically changing elements arrays
155
- */
156
- const user = userEvent.setup()
157
- const handler = vi.fn()
158
-
159
- const TestComponent = (props: {open?: true}) => {
160
- const {open = false} = props
161
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
162
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
163
-
164
- useClickOutside(handler, [buttonElement, popoverElement])
165
-
166
- return (
167
- <>
168
- <button data-testid="button" ref={setButtonElement} />
169
- {open && <div data-testid="popover" ref={setPopoverElement} />}
170
- <div data-testid="outside" />
171
- </>
172
- )
173
- }
174
-
175
- const {rerender} = render(<TestComponent />)
176
-
177
- await user.click(screen.getByTestId('button'))
178
- expect(handler).not.toHaveBeenCalled()
179
-
180
- await user.click(screen.getByTestId('outside'))
181
- expect(handler).toHaveBeenCalledTimes(1)
182
-
183
- // The popover isn't rendered yet
184
- expect(screen.queryByTestId('popover')).toBeNull()
185
-
186
- // Rerender the component with the popover open
187
- rerender(<TestComponent open />)
188
-
189
- // Clicking the popover should not trigger the handler
190
- await user.click(screen.getByTestId('popover'))
191
- expect(handler).toHaveBeenCalledTimes(1)
192
- })
193
-
194
- it('returning the current value of refs in the elements array is dangerous', async () => {
195
- /**
196
- * This test demonstrates why it's dangerous to return ref values in the elements array.
197
- * When using refs, pass a function returning the elements array, instead of defining the array directly during render
198
- */
199
-
200
- const user = userEvent.setup()
201
- let handler = vi.fn()
202
-
203
- /**
204
- * Using refs in the `useClickOutside` elements array is dangerous,
205
- * the below example demonstrates how `useClickOutside` doesn't "see" the current values of refs,
206
- * it can only "see" whatever the value of the ref was when the hook was rendered.
207
- */
208
- let TestComponent = () => {
209
- const buttonRef = useRef<HTMLButtonElement | null>(null)
210
- const popoverRef = useRef<HTMLDivElement | null>(null)
211
-
212
- useClickOutside(handler, [buttonRef.current, popoverRef.current])
213
-
214
- return (
215
- <>
216
- <button data-testid="button" ref={buttonRef} />
217
- <div data-testid="popover" ref={popoverRef} />
218
- </>
219
- )
220
- }
221
- const {rerender} = render(<TestComponent />)
222
- await user.click(screen.getByTestId('button'))
223
- await user.click(screen.getByTestId('popover'))
224
- // Because the ref values are stale, the handler is called
225
- expect(handler).toHaveBeenCalledTimes(2)
226
-
227
- /**
228
- * If a mixture of refs and state is used it can appear like it's working correctly,
229
- * but this is a side-effect, not an indication it's safe.
230
- */
231
- handler = vi.fn()
232
- TestComponent = () => {
233
- const buttonRef = useRef<HTMLButtonElement | null>(null)
234
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
235
-
236
- useClickOutside(handler, [buttonRef.current, popoverElement])
237
-
238
- return (
239
- <>
240
- <button data-testid="button" ref={buttonRef} />
241
- <div data-testid="popover" ref={setPopoverElement} />
242
- <div data-testid="outside" />
243
- </>
244
- )
245
- }
246
- rerender(<TestComponent />)
247
- await user.click(screen.getByTestId('button'))
248
- await user.click(screen.getByTestId('popover'))
249
- expect(handler).not.toHaveBeenCalled()
250
- await user.click(screen.getByTestId('outside'))
251
- expect(handler).toHaveBeenCalledTimes(1)
252
-
253
- /**
254
- * Unrelated state updates can create the same false impression of safety.
255
- */
256
- handler = vi.fn()
257
- TestComponent = () => {
258
- const buttonRef = useRef<HTMLButtonElement | null>(null)
259
- const popoverRef = useRef<HTMLDivElement | null>(null)
260
-
261
- useClickOutside(handler, [buttonRef.current, popoverRef.current])
262
-
263
- const [, tick] = useState(0)
264
- useEffect(() => {
265
- /**
266
- * This effect schedules a re-render, which will lead to `useClickOutsideHandler` "seeing"
267
- * the current value of the refs after they got assigned dom nodes when the React ref callbacks executed.
268
- */
269
- tick((prev) => ++prev)
270
- }, [])
271
-
272
- return (
273
- <>
274
- <button data-testid="button" ref={buttonRef} />
275
- <div data-testid="popover" ref={popoverRef} />
276
- <div data-testid="outside" />
277
- </>
278
- )
279
- }
280
- rerender(<TestComponent />)
281
- await user.click(screen.getByTestId('button'))
282
- await user.click(screen.getByTestId('popover'))
283
- expect(handler).not.toHaveBeenCalled()
284
- await user.click(screen.getByTestId('outside'))
285
- expect(handler).toHaveBeenCalledTimes(1)
286
-
287
- /**
288
- * When using the legacy version of the `useClickOutside` API it's necessary to synchronize mutable ref values
289
- * with a effect and state loop to ensure they're not stale
290
- */
291
- const useElementsFromRefs = (refs: MutableRefObject<HTMLElement | null>[]) => {
292
- const [elements, setElements] = useState(() => refs.map((ref) => ref.current))
293
-
294
- useEffect(() => {
295
- if (refs.length !== elements.length) {
296
- setElements(refs.map((ref) => ref.current))
297
- }
298
- for (const ref of refs) {
299
- if (!elements.includes(ref.current)) {
300
- setElements(refs.map((ref) => ref.current))
301
- return
302
- }
303
- }
304
- }, [elements, refs])
305
-
306
- return elements
307
- }
308
- handler = vi.fn()
309
- TestComponent = () => {
310
- const buttonRef = useRef<HTMLButtonElement | null>(null)
311
- const popoverRef = useRef<HTMLDivElement | null>(null)
312
-
313
- const elements = useElementsFromRefs([buttonRef, popoverRef])
314
- useClickOutside(handler, elements)
315
-
316
- return (
317
- <>
318
- <button data-testid="button" ref={buttonRef} />
319
- <div data-testid="popover" ref={popoverRef} />
320
- <div data-testid="outside" />
321
- </>
322
- )
323
- }
324
- rerender(<TestComponent />)
325
- await user.click(screen.getByTestId('button'))
326
- await user.click(screen.getByTestId('popover'))
327
- expect(handler).not.toHaveBeenCalled()
328
- await user.click(screen.getByTestId('outside'))
329
- expect(handler).toHaveBeenCalledTimes(1)
330
- })
331
-
332
- it('using the current value of a react ref as the `boundaryElement` is dangerous', async () => {
333
- /**
334
- * This test demonstrates why it's dangerous to return a ref value as the boundaryElement,
335
- * for the same reasons it's dangerous for the elements array.
336
- */
337
-
338
- const user = userEvent.setup()
339
- let handler = vi.fn()
340
-
341
- /**
342
- * Using refs in the `useClickOutside` elements array is dangerous,
343
- * the below example demonstrates how `useClickOutside` doesn't "see" the current values of refs,
344
- * it can only "see" whatever the value of the ref was when the hook was rendered.
345
- */
346
- let TestComponent = () => {
347
- const boundaryRef = useRef<HTMLDivElement | null>(null)
348
-
349
- useClickOutside(handler, [], boundaryRef.current)
350
-
351
- return (
352
- <>
353
- <div ref={boundaryRef}>
354
- <div data-testid="inside" />
355
- </div>
356
- <div data-testid="outside" />
357
- </>
358
- )
359
- }
360
- const {rerender} = render(<TestComponent />)
361
- await user.click(screen.getByTestId('inside'))
362
- await user.click(screen.getByTestId('outside'))
363
- // Because the ref values are stale, the handler is called
364
- expect(handler).toHaveBeenCalledTimes(2)
365
-
366
- /**
367
- * If a mixture of refs and state is used it can appear like it's working correctly,
368
- * but this is a side-effect, not an indication it's safe.
369
- */
370
- handler = vi.fn()
371
- TestComponent = () => {
372
- const buttonRef = useRef<HTMLButtonElement | null>(null)
373
- const [popoverElement, setPopoverElement] = useState<HTMLDivElement | null>(null)
374
- const boundaryRef = useRef<HTMLDivElement | null>(null)
375
-
376
- useClickOutside(handler, [buttonRef.current, popoverElement], boundaryRef.current)
377
-
378
- return (
379
- <>
380
- <div ref={boundaryRef}>
381
- <button data-testid="button" ref={buttonRef} />
382
- <div data-testid="popover" ref={setPopoverElement} />
383
- <div data-testid="inside" />
384
- </div>
385
- <div data-testid="outside" />
386
- </>
387
- )
388
- }
389
- rerender(<TestComponent />)
390
- await user.click(screen.getByTestId('button'))
391
- await user.click(screen.getByTestId('popover'))
392
- await user.click(screen.getByTestId('outside'))
393
- expect(handler).not.toHaveBeenCalled()
394
- await user.click(screen.getByTestId('inside'))
395
- expect(handler).toHaveBeenCalledTimes(1)
396
-
397
- /**
398
- * Unrelated state updates can create the same false impression of safety.
399
- */
400
- handler = vi.fn()
401
- TestComponent = () => {
402
- const buttonRef = useRef<HTMLButtonElement | null>(null)
403
- const popoverRef = useRef<HTMLDivElement | null>(null)
404
- const boundaryRef = useRef<HTMLDivElement | null>(null)
405
-
406
- useClickOutside(handler, [buttonRef.current, popoverRef.current], boundaryRef.current)
407
-
408
- const [, tick] = useState(0)
409
- useEffect(() => {
410
- /**
411
- * This effect schedules a re-render, which will lead to `useClickOutsideHandler` "seeing"
412
- * the current value of the refs after they got assigned dom nodes when the React ref callbacks executed.
413
- */
414
- tick((prev) => ++prev)
415
- }, [])
416
-
417
- return (
418
- <>
419
- <div ref={boundaryRef}>
420
- <button data-testid="button" ref={buttonRef} />
421
- <div data-testid="popover" ref={popoverRef} />
422
- <div data-testid="inside" />
423
- </div>
424
- <div data-testid="outside" />
425
- </>
426
- )
427
- }
428
- rerender(<TestComponent />)
429
- await user.click(screen.getByTestId('button'))
430
- await user.click(screen.getByTestId('popover'))
431
- await user.click(screen.getByTestId('outside'))
432
- expect(handler).not.toHaveBeenCalled()
433
- await user.click(screen.getByTestId('inside'))
434
- expect(handler).toHaveBeenCalledTimes(1)
435
-
436
- /**
437
- * When using the legacy version of the `useClickOutside` API it's necessary to synchronize mutable ref values
438
- * with a effect and state loop to ensure they're not stale
439
- */
440
- const useBoundaryElementFromRef = (ref: MutableRefObject<HTMLElement | null>) => {
441
- const [element, setElement] = useState(() => ref.current)
442
-
443
- // eslint-disable-next-line react-hooks/exhaustive-deps
444
- useEffect(() => {
445
- // If the ref has mutated since the last render, update the state and schedule a re-render
446
- if (ref.current !== element) {
447
- setElement(ref.current)
448
- }
449
- })
450
-
451
- return element
452
- }
453
- handler = vi.fn()
454
- TestComponent = () => {
455
- const buttonRef = useRef<HTMLButtonElement | null>(null)
456
- const popoverRef = useRef<HTMLDivElement | null>(null)
457
- const boundaryRef = useRef<HTMLDivElement | null>(null)
458
-
459
- const boundaryElement = useBoundaryElementFromRef(boundaryRef)
460
- useClickOutside(handler, [buttonRef.current, popoverRef.current], boundaryElement)
461
-
462
- return (
463
- <>
464
- <div ref={boundaryRef}>
465
- <button data-testid="button" ref={buttonRef} />
466
- <div data-testid="popover" ref={popoverRef} />
467
- <div data-testid="inside" />
468
- </div>
469
- <div data-testid="outside" />
470
- </>
471
- )
472
- }
473
- rerender(<TestComponent />)
474
- await user.click(screen.getByTestId('button'))
475
- await user.click(screen.getByTestId('popover'))
476
- await user.click(screen.getByTestId('outside'))
477
- expect(handler).not.toHaveBeenCalled()
478
- await user.click(screen.getByTestId('inside'))
479
- expect(handler).toHaveBeenCalledTimes(1)
480
- })
481
- })
@@ -1,113 +0,0 @@
1
- import {useEffect, useRef, useState} from 'react'
2
-
3
- import {EMPTY_ARRAY} from '../constants'
4
-
5
- /** @public */
6
- export type ClickOutsideListener = (event: MouseEvent) => void
7
-
8
- /** @public */
9
- export type ClickOutsideElements = (HTMLElement | null | (HTMLElement | null)[])[]
10
-
11
- function _getElements(
12
- element: HTMLElement | null,
13
- elementsArg: ClickOutsideElements,
14
- ): HTMLElement[] {
15
- const ret = [element]
16
-
17
- for (const el of elementsArg) {
18
- if (Array.isArray(el)) {
19
- ret.push(...el)
20
- } else {
21
- ret.push(el)
22
- }
23
- }
24
-
25
- return ret.filter(Boolean) as HTMLElement[]
26
- }
27
-
28
- /**
29
- * @public
30
- * @deprecated replaced by the new `useClickOutsideEvent` hook, instead of:
31
- * ```tsx
32
- * const [button, setButtonElement] = useState(null)
33
- * useClickOutside((event) => {}, [button])
34
- * return <button ref={setButtonElement} />
35
- * ```
36
- * do:
37
- * ```tsx
38
- * const buttonRef = useRef()
39
- * useClickOutsideEvent((event) => {}, () => [buttonRef.current])
40
- * return <button ref={buttonRef} />
41
- * ```
42
- */
43
- export function useClickOutside(
44
- listener: ClickOutsideListener,
45
- elementsArg: ClickOutsideElements = EMPTY_ARRAY,
46
- boundaryElement?: HTMLElement | null,
47
- ): (el: HTMLElement | null) => void {
48
- const [element, setElement] = useState<HTMLElement | null>(null)
49
- const [elements, setElements] = useState(() => _getElements(element, elementsArg))
50
- const elementsRef = useRef(elements)
51
-
52
- useEffect(() => {
53
- const prevElements = elementsRef.current
54
- const nextElements = _getElements(element, elementsArg)
55
-
56
- if (prevElements.length !== nextElements.length) {
57
- setElements(nextElements)
58
- elementsRef.current = nextElements
59
-
60
- return
61
- }
62
-
63
- for (const el of prevElements) {
64
- if (!nextElements.includes(el)) {
65
- setElements(nextElements)
66
- elementsRef.current = nextElements
67
-
68
- return
69
- }
70
- }
71
-
72
- for (const el of nextElements) {
73
- if (!prevElements.includes(el)) {
74
- setElements(nextElements)
75
- elementsRef.current = nextElements
76
-
77
- return
78
- }
79
- }
80
- }, [element, elementsArg])
81
-
82
- useEffect(() => {
83
- if (!listener) return undefined
84
-
85
- const handleWindowMouseDown = (evt: MouseEvent) => {
86
- const target = evt.target
87
-
88
- if (!(target instanceof Node)) {
89
- return
90
- }
91
-
92
- if (boundaryElement && !boundaryElement.contains(target)) {
93
- return
94
- }
95
-
96
- for (const el of elements) {
97
- if (target === el || el.contains(target)) {
98
- return
99
- }
100
- }
101
-
102
- listener(evt)
103
- }
104
-
105
- window.addEventListener('mousedown', handleWindowMouseDown)
106
-
107
- return () => {
108
- window.removeEventListener('mousedown', handleWindowMouseDown)
109
- }
110
- }, [boundaryElement, listener, elements])
111
-
112
- return setElement
113
- }
@@ -1,30 +0,0 @@
1
- import {Box, Card, Code, Container, Grid, Stack, Text, useElementRect} from '@sanity/ui'
2
- import {useState} from 'react'
3
-
4
- export default function ExampleStory() {
5
- const [element, setElement] = useState<HTMLElement | null>(null)
6
- const rect = useElementRect(element)
7
- const size = {width: rect?.width || 0, height: rect?.height || 0}
8
-
9
- return (
10
- <Box padding={[3, 4, 5]}>
11
- <Container width={1}>
12
- <Stack gap={4}>
13
- <Grid columns={[1, 2, 3]}>
14
- <Card ref={setElement} tone="transparent">
15
- <Text>rect</Text>
16
- </Card>
17
- </Grid>
18
-
19
- <div style={{height: 11}}>
20
- <Card scheme="dark" style={{position: 'absolute', ...size}} />
21
- </div>
22
-
23
- <Code language="json" size={1}>
24
- {JSON.stringify(size)}
25
- </Code>
26
- </Stack>
27
- </Container>
28
- </Box>
29
- )
30
- }
@@ -1,14 +0,0 @@
1
- import {defineScope} from '@sanity/ui-workshop'
2
- import {lazy} from 'react'
3
-
4
- export default defineScope({
5
- name: 'hooks/useElementRect',
6
- title: 'useElementRect',
7
- stories: [
8
- {
9
- name: 'example',
10
- title: 'Example',
11
- component: lazy(() => import('./example')),
12
- },
13
- ],
14
- })
@@ -1,13 +0,0 @@
1
- import {useElementSize} from '../useElementSize'
2
-
3
- /**
4
- * Subscribe to the rect of a DOM element.
5
- * @beta
6
- *
7
- * @deprecated Use `useElementSize` instead
8
- */
9
- export function useElementRect(element: HTMLElement | null): DOMRectReadOnly | null {
10
- const elementSize = useElementSize(element)
11
-
12
- return elementSize?._contentRect || null
13
- }
@@ -1,19 +0,0 @@
1
- import {type ForwardedRef, type MutableRefObject, useImperativeHandle, useRef} from 'react'
2
-
3
- /**
4
- * @beta
5
- * @deprecated use `useImperativeHandle` instead
6
- * @example
7
- * ```diff
8
- * -const ref = useForwardedRef(forwardedRef)
9
- * +const ref = useRef(null)
10
- * +useImperativeHandle(forwardedRef, () => ref.current)
11
- * ```
12
- */
13
- export function useForwardedRef<T>(ref: ForwardedRef<T>): MutableRefObject<T | null> {
14
- const innerRef = useRef<T | null>(null)
15
-
16
- useImperativeHandle(ref, () => innerRef.current!)
17
-
18
- return innerRef
19
- }
@@ -1,7 +0,0 @@
1
- import {useEffect, useLayoutEffect} from 'react'
2
-
3
- /**
4
- * @beta
5
- * @deprecated use `useLayoutEffect` instead, or `useEffect` if possible
6
- */
7
- export const useIsomorphicEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect