@sanity/ui 4.0.0-static.4 → 4.0.0-static.40

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 (341) hide show
  1. package/dist/_chunks-es/{refractor.js → Refractor.js} +1 -1
  2. package/dist/_chunks-es/{refractor.js.map → Refractor.js.map} +1 -1
  3. package/dist/css/index.css +2 -1
  4. package/dist/css/index.css.map +1 -0
  5. package/dist/css/index.d.ts +51 -7
  6. package/dist/css/index.js +17979 -55
  7. package/dist/css/index.js.map +1 -1
  8. package/dist/index.d.ts +26 -38
  9. package/dist/index.js +1744 -1127
  10. package/dist/index.js.map +1 -1
  11. package/exports/css/index.css +1 -0
  12. package/package.json +39 -51
  13. package/src/core/Root.tsx +1 -1
  14. package/src/core/RootProvider.tsx +5 -5
  15. package/src/core/__workshop__/index.ts +1 -1
  16. package/src/core/components/autocomplete/{autocomplete.tsx → Autocomplete.tsx} +90 -58
  17. package/src/core/components/autocomplete/__workshop__/{custom.tsx → Custom.tsx} +14 -1
  18. package/src/core/components/autocomplete/__workshop__/{example.tsx → Example.tsx} +12 -1
  19. package/src/core/components/autocomplete/__workshop__/index.ts +6 -6
  20. package/src/core/components/autocomplete/types.ts +1 -1
  21. package/src/core/components/breadcrumbs/{breadcrumbs.tsx → Breadcrumbs.tsx} +80 -47
  22. package/src/core/components/breadcrumbs/__workshop__/index.ts +1 -1
  23. package/src/core/components/dialog/{dialog.tsx → Dialog.tsx} +20 -11
  24. package/src/core/components/dialog/{dialogCard.tsx → DialogCard.tsx} +9 -9
  25. package/src/core/components/dialog/{dialogContext.ts → DialogContext.ts} +1 -1
  26. package/src/core/components/dialog/{dialogProvider.tsx → DialogProvider.tsx} +2 -2
  27. package/src/core/components/dialog/__workshop__/{panes.tsx → Panes.tsx} +9 -21
  28. package/src/core/components/dialog/__workshop__/{position.tsx → Position.tsx} +9 -1
  29. package/src/core/components/dialog/__workshop__/{props.tsx → Props.tsx} +2 -0
  30. package/src/core/components/dialog/__workshop__/index.ts +10 -10
  31. package/src/core/components/dialog/__workshop__/styles.css.ts +18 -0
  32. package/src/core/components/dialog/useDialog.ts +3 -3
  33. package/src/core/components/hotkeys/{hotkeys.tsx → Hotkeys.tsx} +2 -2
  34. package/src/core/components/hotkeys/__workshop__/index.ts +1 -1
  35. package/src/core/components/menu/{menu.test.tsx → Menu.test.tsx} +9 -13
  36. package/src/core/components/menu/{menu.tsx → Menu.tsx} +19 -24
  37. package/src/core/components/menu/{menuButton.tsx → MenuButton.tsx} +14 -9
  38. package/src/core/components/menu/{menuContext.ts → MenuContext.ts} +3 -4
  39. package/src/core/components/menu/{menuGroup.tsx → MenuGroup.tsx} +16 -11
  40. package/src/core/components/menu/{menuItem.tsx → MenuItem.tsx} +7 -9
  41. package/src/core/components/menu/__workshop__/DataProps.tsx +27 -0
  42. package/src/core/components/menu/__workshop__/{menuButton.tsx → MenuButton.tsx} +6 -1
  43. package/src/core/components/menu/__workshop__/{tones.tsx → Tones.tsx} +7 -1
  44. package/src/core/components/menu/__workshop__/index.ts +22 -17
  45. package/src/core/components/menu/useMenu.ts +5 -5
  46. package/src/core/components/menu/useMenuController.ts +5 -5
  47. package/src/core/components/tab/{tab.tsx → Tab.tsx} +1 -1
  48. package/src/core/components/tab/{tabList.tsx → TabList.tsx} +2 -2
  49. package/src/core/components/tab/{tabPanel.tsx → TabPanel.tsx} +1 -1
  50. package/src/core/components/tab/__workshop__/index.ts +1 -1
  51. package/src/core/components/toast/{toast.test.tsx → Toast.test.tsx} +7 -7
  52. package/src/core/components/toast/{toast.tsx → Toast.tsx} +6 -6
  53. package/src/core/components/toast/{toastContext.ts → ToastContext.ts} +1 -1
  54. package/src/core/components/toast/{toastLayer.tsx → ToastLayer.tsx} +1 -1
  55. package/src/core/components/toast/{toastProvider.tsx → ToastProvider.tsx} +7 -7
  56. package/src/core/components/toast/__workshop__/{toast.tsx → Toast.tsx} +2 -0
  57. package/src/core/components/toast/__workshop__/index.ts +2 -2
  58. package/src/core/components/toast/useToast.ts +3 -3
  59. package/src/core/components/tree/{tree.tsx → Tree.tsx} +4 -4
  60. package/src/core/components/tree/{treeContext.ts → TreeContext.ts} +1 -1
  61. package/src/core/components/tree/{treeGroup.tsx → TreeGroup.tsx} +1 -1
  62. package/src/core/components/tree/{treeItem.tsx → TreeItem.tsx} +28 -25
  63. package/src/core/components/tree/__workshop__/index.ts +4 -4
  64. package/src/core/components/tree/useTree.ts +3 -3
  65. package/src/core/components/virtualList/{virtualList.tsx → VirtualList.tsx} +87 -45
  66. package/src/core/components/virtualList/__workshop__/index.ts +4 -4
  67. package/src/core/helpers/props.ts +0 -9
  68. package/src/core/hooks/useGlobalKeyDown.ts +11 -4
  69. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +1 -1
  70. package/src/core/hooks/useResponsiveProp.ts +4 -17
  71. package/src/core/index.ts +68 -66
  72. package/src/core/lib/createGlobalScopedContext.ts +5 -3
  73. package/src/core/primitives/avatar/{avatar.tsx → Avatar.tsx} +7 -6
  74. package/src/core/primitives/avatar/{avatarCounter.tsx → AvatarCounter.tsx} +2 -2
  75. package/src/core/primitives/avatar/{avatarStack.tsx → AvatarStack.tsx} +3 -3
  76. package/src/core/primitives/avatar/__workshop__/{asButton.tsx → AsButton.tsx} +8 -1
  77. package/src/core/primitives/avatar/__workshop__/PropsStory.tsx +22 -0
  78. package/src/core/primitives/avatar/__workshop__/{stack.tsx → Stack.tsx} +5 -1
  79. package/src/core/primitives/avatar/__workshop__/index.ts +9 -4
  80. package/src/core/primitives/badge/{badge.test.tsx → Badge.test.tsx} +1 -1
  81. package/src/core/primitives/badge/{badge.tsx → Badge.tsx} +2 -2
  82. package/src/core/primitives/badge/__workshop__/{props.tsx → Props.tsx} +12 -1
  83. package/src/core/primitives/badge/__workshop__/index.ts +2 -2
  84. package/src/core/primitives/box/__workshop__/{props.tsx → Props.tsx} +6 -1
  85. package/src/core/primitives/box/__workshop__/index.ts +2 -2
  86. package/src/core/primitives/button/{button.test.tsx → Button.test.tsx} +1 -1
  87. package/src/core/primitives/button/{button.tsx → Button.tsx} +12 -11
  88. package/src/core/primitives/button/__workshop__/DataProps.tsx +22 -0
  89. package/src/core/primitives/button/__workshop__/{props.tsx → Props.tsx} +22 -0
  90. package/src/core/primitives/button/__workshop__/SanityUploadButton.tsx +21 -0
  91. package/src/core/primitives/button/__workshop__/{stacked.tsx → Stacked.tsx} +16 -0
  92. package/src/core/primitives/button/__workshop__/Styled1.tsx +11 -0
  93. package/src/core/primitives/button/__workshop__/index.ts +15 -15
  94. package/src/core/primitives/button/__workshop__/styles.css.ts +30 -0
  95. package/src/core/primitives/card/{card.tsx → Card.tsx} +10 -10
  96. package/src/core/primitives/card/{cardContext.ts → CardContext.ts} +1 -1
  97. package/src/core/primitives/card/{cardProvider.tsx → CardProvider.tsx} +3 -12
  98. package/src/core/primitives/card/__workshop__/DataProps.tsx +30 -0
  99. package/src/core/primitives/card/__workshop__/{props.tsx → Props.tsx} +10 -0
  100. package/src/core/primitives/card/__workshop__/{selected.tsx → Selected.tsx} +1 -1
  101. package/src/core/primitives/card/__workshop__/{styled.tsx → Styled.tsx} +2 -5
  102. package/src/core/primitives/card/__workshop__/index.ts +10 -9
  103. package/src/core/primitives/card/useCard.ts +11 -6
  104. package/src/core/primitives/checkbox/__workshop__/index.ts +4 -4
  105. package/src/core/primitives/code/{code.tsx → Code.tsx} +26 -2
  106. package/src/core/primitives/code/__workshop__/{props.tsx → Props.tsx} +6 -1
  107. package/src/core/primitives/code/__workshop__/index.ts +2 -2
  108. package/src/core/primitives/container/{container.tsx → Container.tsx} +1 -1
  109. package/src/core/primitives/container/__workshop__/{example.tsx → Example.tsx} +6 -1
  110. package/src/core/primitives/container/__workshop__/index.ts +1 -1
  111. package/src/core/primitives/flex/{flex.tsx → Flex.tsx} +1 -1
  112. package/src/core/primitives/flex/__workshop__/{example.tsx → Example.tsx} +14 -16
  113. package/src/core/primitives/flex/__workshop__/index.ts +2 -2
  114. package/src/core/primitives/flex/__workshop__/styles.css.ts +12 -0
  115. package/src/core/primitives/grid/{grid.tsx → Grid.tsx} +1 -1
  116. package/src/core/primitives/grid/__workshop__/index.ts +1 -1
  117. package/src/core/primitives/heading/{heading.tsx → Heading.tsx} +16 -0
  118. package/src/core/primitives/heading/__workshop__/{plain.tsx → Plain.tsx} +12 -1
  119. package/src/core/primitives/heading/__workshop__/index.ts +2 -2
  120. package/src/core/primitives/inline/{inline.tsx → Inline.tsx} +2 -1
  121. package/src/core/primitives/inline/__workshop__/{plain.tsx → Plain.tsx} +5 -1
  122. package/src/core/primitives/inline/__workshop__/index.ts +1 -1
  123. package/src/core/primitives/kbd/{kbd.tsx → Kbd.tsx} +2 -2
  124. package/src/core/primitives/kbd/__workshop__/index.ts +1 -1
  125. package/src/core/primitives/label/{label.tsx → Label.tsx} +16 -0
  126. package/src/core/primitives/label/__workshop__/{plain.tsx → Plain.tsx} +15 -1
  127. package/src/core/primitives/label/__workshop__/index.ts +2 -2
  128. package/src/core/primitives/layer/{layer.test.tsx → Layer.test.tsx} +7 -7
  129. package/src/core/primitives/layer/{layer.tsx → Layer.tsx} +3 -3
  130. package/src/core/primitives/layer/{layerCard.tsx → LayerCard.tsx} +2 -2
  131. package/src/core/primitives/layer/{layerContext.ts → LayerContext.ts} +1 -1
  132. package/src/core/primitives/layer/{layerProvider.tsx → LayerProvider.tsx} +6 -6
  133. package/src/core/primitives/layer/__workshop__/index.ts +3 -3
  134. package/src/core/primitives/layer/useLayer.ts +3 -3
  135. package/src/core/primitives/popover/{popover.tsx → Popover.tsx} +170 -150
  136. package/src/core/primitives/popover/{popoverLayer.tsx → PopoverLayer.tsx} +3 -3
  137. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +13 -1
  138. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +2 -0
  139. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +8 -0
  140. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +7 -1
  141. package/src/core/primitives/popover/__workshop__/TestStory.tsx +6 -0
  142. package/src/core/primitives/popover/floating-ui/size.ts +17 -16
  143. package/src/core/primitives/radio/{radio.tsx → Radio.tsx} +2 -2
  144. package/src/core/primitives/radio/__workshop__/index.ts +2 -2
  145. package/src/core/primitives/select/{select.tsx → Select.tsx} +7 -5
  146. package/src/core/primitives/select/__workshop__/{plain.tsx → Plain.tsx} +4 -0
  147. package/src/core/primitives/select/__workshop__/index.ts +2 -2
  148. package/src/core/primitives/selectable/{selectable.tsx → Selectable.tsx} +2 -2
  149. package/src/core/primitives/selectable/__workshop__/DataProps.tsx +27 -0
  150. package/src/core/primitives/selectable/__workshop__/index.ts +14 -0
  151. package/src/core/primitives/skeleton/{codeSkeleton.tsx → CodeSkeleton.tsx} +1 -1
  152. package/src/core/primitives/skeleton/{headingSkeleton.tsx → HeadingSkeleton.tsx} +1 -1
  153. package/src/core/primitives/skeleton/{labelSkeleton.tsx → LabelSkeleton.tsx} +1 -1
  154. package/src/core/primitives/skeleton/{skeleton.tsx → Skeleton.tsx} +2 -2
  155. package/src/core/primitives/skeleton/{textSkeleton.tsx → TextSkeleton.tsx} +1 -1
  156. package/src/core/primitives/skeleton/__workshop__/{delay.tsx → Delay.tsx} +9 -1
  157. package/src/core/primitives/skeleton/__workshop__/{skeleton.tsx → Skeleton.tsx} +9 -1
  158. package/src/core/primitives/skeleton/__workshop__/index.ts +2 -2
  159. package/src/core/primitives/spinner/{spinner.tsx → Spinner.tsx} +2 -2
  160. package/src/core/primitives/spinner/__workshop__/Props.tsx +6 -1
  161. package/src/core/primitives/stack/{stack.tsx → Stack.tsx} +1 -1
  162. package/src/core/primitives/stack/__workshop__/{plain.tsx → Plain.tsx} +4 -1
  163. package/src/core/primitives/stack/__workshop__/index.ts +1 -1
  164. package/src/core/primitives/switch/{switch.tsx → Switch.tsx} +2 -10
  165. package/src/core/primitives/switch/__workshop__/index.ts +2 -2
  166. package/src/core/primitives/text/{text.tsx → Text.tsx} +14 -0
  167. package/src/core/primitives/text/__workshop__/{colored.tsx → Colored.tsx} +10 -8
  168. package/src/core/primitives/text/__workshop__/{example.tsx → Example.tsx} +15 -1
  169. package/src/core/primitives/text/__workshop__/index.ts +3 -3
  170. package/src/core/primitives/textArea/{textArea.tsx → TextArea.tsx} +7 -1
  171. package/src/core/primitives/textArea/__workshop__/{plain.tsx → Plain.tsx} +8 -0
  172. package/src/core/primitives/textArea/__workshop__/index.ts +1 -1
  173. package/src/core/primitives/textInput/{textInput.tsx → TextInput.tsx} +93 -72
  174. package/src/core/primitives/textInput/__workshop__/{plain.tsx → Plain.tsx} +34 -4
  175. package/src/core/primitives/textInput/__workshop__/{typed.tsx → Typed.tsx} +7 -1
  176. package/src/core/primitives/textInput/__workshop__/index.ts +7 -7
  177. package/src/core/primitives/tooltip/{tooltip.test.tsx → Tooltip.test.tsx} +4 -4
  178. package/src/core/primitives/tooltip/{tooltip.tsx → Tooltip.tsx} +102 -63
  179. package/src/core/primitives/tooltip/{tooltipLayer.tsx → TooltipLayer.tsx} +2 -2
  180. package/src/core/primitives/tooltip/__workshop__/{customPortal.tsx → CustomPortal.tsx} +2 -0
  181. package/src/core/primitives/tooltip/__workshop__/{overflowingBoundary.tsx → OverflowingBoundary.tsx} +2 -0
  182. package/src/core/primitives/tooltip/__workshop__/{props.tsx → Props.tsx} +12 -0
  183. package/src/core/primitives/tooltip/__workshop__/{resizableBoundary.tsx → ResizableBoundary.tsx} +5 -0
  184. package/src/core/primitives/tooltip/__workshop__/index.ts +4 -4
  185. package/src/core/primitives/tooltip/tooltipDelayGroup/{tooltipDelayGroupContext.tsx → TooltipDelayGroupContext.tsx} +1 -1
  186. package/src/core/primitives/tooltip/tooltipDelayGroup/{tooltipDelayGroupProvider.tsx → TooltipDelayGroupProvider.tsx} +2 -4
  187. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +3 -3
  188. package/src/core/types.ts +6 -5
  189. package/src/core/utils/{errorBoundary.tsx → ErrorBoundary.tsx} +1 -1
  190. package/src/core/utils/boundaryElement/{boundaryElementContext.ts → BoundaryElementContext.ts} +2 -5
  191. package/src/core/utils/boundaryElement/BoundaryElementProvider.tsx +16 -0
  192. package/src/core/utils/boundaryElement/__workshop__/index.ts +1 -1
  193. package/src/core/utils/boundaryElement/types.ts +1 -4
  194. package/src/core/utils/boundaryElement/useBoundaryElement.ts +7 -19
  195. package/src/core/utils/elementQuery/__workshop__/CustomMedia.tsx +19 -0
  196. package/src/core/utils/elementQuery/__workshop__/index.ts +1 -1
  197. package/src/core/utils/elementQuery/__workshop__/styles.css.ts +31 -0
  198. package/src/core/utils/portal/{portal.test.tsx → Portal.test.tsx} +7 -7
  199. package/src/core/utils/portal/{portal.tsx → Portal.tsx} +7 -4
  200. package/src/core/utils/portal/{portalContext.ts → PortalContext.ts} +1 -1
  201. package/src/core/utils/portal/PortalProvider.tsx +38 -0
  202. package/src/core/utils/portal/__workshop__/index.ts +1 -1
  203. package/src/core/utils/portal/usePortal.ts +12 -5
  204. package/src/css/_responsiveStyle.css.ts +2 -2
  205. package/src/css/primitives/_input/_input.css.ts +13 -12
  206. package/src/css/primitives/_input/input.ts +2 -0
  207. package/src/css/primitives/_input/types.ts +2 -1
  208. package/src/css/primitives/avatar/avatar.css.ts +17 -5
  209. package/src/css/primitives/box/box.css.ts +19 -1
  210. package/src/css/primitives/button/button.css.ts +252 -183
  211. package/src/css/primitives/card/__workshop__/{color.tsx → Color.tsx} +9 -1
  212. package/src/css/primitives/card/__workshop__/index.ts +1 -1
  213. package/src/css/primitives/card/card.css.ts +133 -130
  214. package/src/css/primitives/checkbox/checkbox.css.ts +1 -0
  215. package/src/css/primitives/code/code.ts +4 -0
  216. package/src/css/primitives/code/types.ts +7 -1
  217. package/src/css/primitives/heading/heading.ts +4 -0
  218. package/src/css/primitives/heading/types.ts +7 -1
  219. package/src/css/primitives/label/label.ts +4 -0
  220. package/src/css/primitives/label/types.ts +7 -1
  221. package/src/css/primitives/radio/radio.css.ts +1 -1
  222. package/src/css/primitives/root/root.css.ts +1 -1
  223. package/src/css/primitives/select/select.css.ts +7 -1
  224. package/src/css/primitives/selectable/selectable.css.ts +79 -70
  225. package/src/css/primitives/switch/switch.css.ts +10 -1
  226. package/src/css/primitives/text/text.ts +2 -0
  227. package/src/css/primitives/text/types.ts +6 -1
  228. package/src/css/primitives/textInput/textInput.css.ts +15 -3
  229. package/src/css/props/width/types.ts +1 -1
  230. package/src/css/props/width/width.css.ts +5 -2
  231. package/src/css/theme/buildCSSTheme.ts +4 -0
  232. package/src/css/types.ts +4 -0
  233. package/src/css/vars.css.ts +4 -0
  234. package/dist/_chunks-cjs/refractor.cjs +0 -22
  235. package/dist/_chunks-cjs/refractor.cjs.map +0 -1
  236. package/dist/css/index.cjs +0 -966
  237. package/dist/css/index.cjs.map +0 -1
  238. package/dist/css/index.d.cts +0 -1370
  239. package/dist/index.cjs +0 -4515
  240. package/dist/index.cjs.map +0 -1
  241. package/dist/index.d.cts +0 -2521
  242. package/dist/theme.cjs +0 -870
  243. package/dist/theme.cjs.map +0 -1
  244. package/dist/theme.d.cts +0 -499
  245. package/src/core/primitives/button/__workshop__/sanityUploadButton.tsx +0 -36
  246. package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
  247. package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
  248. package/src/core/primitives/popover/helpers.ts +0 -32
  249. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  250. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -102
  251. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -18
  252. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -41
  253. package/src/core/utils/portal/portalProvider.tsx +0 -70
  254. /package/src/core/__workshop__/{boundary.tsx → Boundary.tsx} +0 -0
  255. /package/src/core/components/autocomplete/{autocompleteOption.tsx → AutocompleteOption.tsx} +0 -0
  256. /package/src/core/components/autocomplete/__workshop__/{async.tsx → Async.tsx} +0 -0
  257. /package/src/core/components/autocomplete/__workshop__/{constrainedHeight.tsx → ConstrainedHeight.tsx} +0 -0
  258. /package/src/core/components/autocomplete/__workshop__/{focusAndBlur.tsx → FocusAndBlur.tsx} +0 -0
  259. /package/src/core/components/autocomplete/__workshop__/{fullscreen.tsx → Fullscreen.tsx} +0 -0
  260. /package/src/core/components/breadcrumbs/__workshop__/{example.tsx → Example.tsx} +0 -0
  261. /package/src/core/components/dialog/__workshop__/{activate.tsx → Activate.tsx} +0 -0
  262. /package/src/core/components/dialog/__workshop__/{autoFocus.tsx → AutoFocus.tsx} +0 -0
  263. /package/src/core/components/dialog/__workshop__/{layering.tsx → Layering.tsx} +0 -0
  264. /package/src/core/components/dialog/__workshop__/{nested.tsx → Nested.tsx} +0 -0
  265. /package/src/core/components/dialog/__workshop__/{onScroll.tsx → OnScroll.tsx} +0 -0
  266. /package/src/core/components/dialog/__workshop__/{provider.tsx → Provider.tsx} +0 -0
  267. /package/src/core/components/dialog/__workshop__/{wrapped.tsx → Wrapped.tsx} +0 -0
  268. /package/src/core/components/hotkeys/__workshop__/{plain.tsx → Plain.tsx} +0 -0
  269. /package/src/core/components/menu/{menuDivider.tsx → MenuDivider.tsx} +0 -0
  270. /package/src/core/components/menu/__workshop__/{asComponent.tsx → AsComponent.tsx} +0 -0
  271. /package/src/core/components/menu/__workshop__/{avatarMenu.tsx → AvatarMenu.tsx} +0 -0
  272. /package/src/core/components/menu/__workshop__/{closableMenuButton.tsx → ClosableMenuButton.tsx} +0 -0
  273. /package/src/core/components/menu/__workshop__/{constrainedInBoundary.tsx → ConstrainedInBoundary.tsx} +0 -0
  274. /package/src/core/components/menu/__workshop__/{customMenuItem.tsx → CustomMenuItem.tsx} +0 -0
  275. /package/src/core/components/menu/__workshop__/{customSelectedState.tsx → CustomSelectedState.tsx} +0 -0
  276. /package/src/core/components/menu/__workshop__/{disableFocusOnClose.tsx → DisableFocusOnClose.tsx} +0 -0
  277. /package/src/core/components/menu/__workshop__/{groups.tsx → Groups.tsx} +0 -0
  278. /package/src/core/components/menu/__workshop__/{menuGroupRight.tsx → MenuGroupRight.tsx} +0 -0
  279. /package/src/core/components/menu/__workshop__/{nestedMenu.tsx → NestedMenu.tsx} +0 -0
  280. /package/src/core/components/menu/__workshop__/{onCloseMenuButton.tsx → OnCloseMenuButton.tsx} +0 -0
  281. /package/src/core/components/menu/__workshop__/{selectedItem.tsx → SelectedItem.tsx} +0 -0
  282. /package/src/core/components/menu/__workshop__/{shouldFocus.tsx → ShouldFocus.tsx} +0 -0
  283. /package/src/core/components/menu/__workshop__/{withoutArrow.tsx → WithoutArrow.tsx} +0 -0
  284. /package/src/core/components/tab/__workshop__/{example.tsx → Example.tsx} +0 -0
  285. /package/src/core/components/toast/__workshop__/{hook.tsx → Hook.tsx} +0 -0
  286. /package/src/core/components/tree/__workshop__/{basic.tsx → Basic.tsx} +0 -0
  287. /package/src/core/components/tree/__workshop__/{tabFromElement.tsx → TabFromElement.tsx} +0 -0
  288. /package/src/core/components/virtualList/__workshop__/{changingProps.tsx → ChangingProps.tsx} +0 -0
  289. /package/src/core/components/virtualList/__workshop__/{elementScroll.tsx → ElementScroll.tsx} +0 -0
  290. /package/src/core/components/virtualList/__workshop__/{infiniteList.tsx → InfiniteList.tsx} +0 -0
  291. /package/src/core/components/virtualList/__workshop__/{windowScrolll.tsx → WindowScrolll.tsx} +0 -0
  292. /package/src/core/hooks/useMediaIndex/__workshop__/{test.tsx → Test.tsx} +0 -0
  293. /package/src/core/primitives/arrow/{arrow.tsx → Arrow.tsx} +0 -0
  294. /package/src/core/primitives/avatar/__workshop__/{withinButton.tsx → WithinButton.tsx} +0 -0
  295. /package/src/core/primitives/avatar/__workshop__/{withinMenuItem.tsx → WithinMenuItem.tsx} +0 -0
  296. /package/src/core/primitives/badge/__workshop__/{tones.tsx → Tones.tsx} +0 -0
  297. /package/src/core/primitives/box/{box.tsx → Box.tsx} +0 -0
  298. /package/src/core/primitives/box/__workshop__/{responsive.tsx → Responsive.tsx} +0 -0
  299. /package/src/core/primitives/button/__workshop__/{custom.tsx → Custom.tsx} +0 -0
  300. /package/src/core/primitives/button/__workshop__/{customIcons.tsx → CustomIcons.tsx} +0 -0
  301. /package/src/core/primitives/button/__workshop__/{disabled.tsx → Disabled.tsx} +0 -0
  302. /package/src/core/primitives/button/__workshop__/{mixedChildren.tsx → MixedChildren.tsx} +0 -0
  303. /package/src/core/primitives/button/__workshop__/{textOverflow.tsx → TextOverflow.tsx} +0 -0
  304. /package/src/core/primitives/button/__workshop__/{uploadButton.tsx → UploadButton.tsx} +0 -0
  305. /package/src/core/primitives/card/__workshop__/{asButton.tsx → AsButton.tsx} +0 -0
  306. /package/src/core/primitives/card/__workshop__/{asComponent.tsx → AsComponent.tsx} +0 -0
  307. /package/src/core/primitives/card/__workshop__/{checkered.tsx → Checkered.tsx} +0 -0
  308. /package/src/core/primitives/card/__workshop__/{interactive.tsx → Interactive.tsx} +0 -0
  309. /package/src/core/primitives/card/__workshop__/{listNavigation.tsx → ListNavigation.tsx} +0 -0
  310. /package/src/core/primitives/card/__workshop__/{tones.tsx → Tones.tsx} +0 -0
  311. /package/src/core/primitives/checkbox/{checkbox.tsx → Checkbox.tsx} +0 -0
  312. /package/src/core/primitives/checkbox/__workshop__/{example.tsx → Example.tsx} +0 -0
  313. /package/src/core/primitives/checkbox/__workshop__/{props.tsx → Props.tsx} +0 -0
  314. /package/src/core/primitives/checkbox/__workshop__/{readOnly.tsx → ReadOnly.tsx} +0 -0
  315. /package/src/core/primitives/checkbox/__workshop__/{tones.tsx → Tones.tsx} +0 -0
  316. /package/src/core/primitives/code/{refractor.tsx → Refractor.tsx} +0 -0
  317. /package/src/core/primitives/code/__workshop__/{opticalAlignment.tsx → OpticalAlignment.tsx} +0 -0
  318. /package/src/core/primitives/flex/__workshop__/{gap.tsx → Gap.tsx} +0 -0
  319. /package/src/core/primitives/grid/__workshop__/{responsive.tsx → Responsive.tsx} +0 -0
  320. /package/src/core/primitives/heading/__workshop__/{opticalAlignment.tsx → OpticalAlignment.tsx} +0 -0
  321. /package/src/core/primitives/kbd/__workshop__/{plain.tsx → Plain.tsx} +0 -0
  322. /package/src/core/primitives/label/__workshop__/{opticalAlignment.tsx → OpticalAlignment.tsx} +0 -0
  323. /package/src/core/primitives/layer/__workshop__/{multipleRoots.tsx → MultipleRoots.tsx} +0 -0
  324. /package/src/core/primitives/layer/__workshop__/{nested.tsx → Nested.tsx} +0 -0
  325. /package/src/core/primitives/layer/__workshop__/{responsiveZOffset.tsx → ResponsiveZOffset.tsx} +0 -0
  326. /package/src/core/primitives/radio/__workshop__/{example.tsx → Example.tsx} +0 -0
  327. /package/src/core/primitives/radio/__workshop__/{plain.tsx → Plain.tsx} +0 -0
  328. /package/src/core/primitives/select/__workshop__/{readOnly.tsx → ReadOnly.tsx} +0 -0
  329. /package/src/core/primitives/spinner/{animatedSpinnerIcon.tsx → AnimatedSpinnerIcon.tsx} +0 -0
  330. /package/src/core/primitives/srOnly/{srOnly.tsx → SrOnly.tsx} +0 -0
  331. /package/src/core/primitives/switch/__workshop__/{example.tsx → Example.tsx} +0 -0
  332. /package/src/core/primitives/switch/__workshop__/{props.tsx → Props.tsx} +0 -0
  333. /package/src/core/primitives/text/__workshop__/{opticalAlignment.tsx → OpticalAlignment.tsx} +0 -0
  334. /package/src/core/primitives/textInput/__workshop__/{clearButton.tsx → ClearButton.tsx} +0 -0
  335. /package/src/core/primitives/textInput/__workshop__/{customValidity.tsx → CustomValidity.tsx} +0 -0
  336. /package/src/core/primitives/textInput/__workshop__/{readOnly.tsx → ReadOnly.tsx} +0 -0
  337. /package/src/core/primitives/textInput/__workshop__/{states.tsx → States.tsx} +0 -0
  338. /package/src/core/primitives/textInput/__workshop__/{tones.tsx → Tones.tsx} +0 -0
  339. /package/src/core/utils/boundaryElement/__workshop__/{plain.tsx → Plain.tsx} +0 -0
  340. /package/src/core/utils/elementQuery/{elementQuery.tsx → ElementQuery.tsx} +0 -0
  341. /package/src/core/utils/portal/__workshop__/{named.tsx → Named.tsx} +0 -0
@@ -25,6 +25,7 @@ export default function CustomPortalStory(): React.JSX.Element {
25
25
  'Content',
26
26
  'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mollis consectetur malesuada. Sed lobortis est dolor, eget imperdiet velit placerat et. Aenean posuere mi non aliquet iaculis. Donec fermentum pulvinar purus at sagittis. Ut tincidunt massa odio, sed finibus justo ullamcorper id. Nam venenatis justo non ligula elementum cursus. Pellentesque laoreet justo in mollis sagittis. In lacinia ornare ultrices. Suspendisse potenti.',
27
27
  )
28
+ // @ts-expect-error - TODO: fix this
28
29
  const placement = useSelect('Placement', WORKSHOP_PLACEMENT_OPTIONS, 'top')
29
30
  const portal = useSelect('Portal', PORTAL_OPTIONS)
30
31
  const useBoundaryElement = useBoolean('Use boundary element', true)
@@ -60,6 +61,7 @@ export default function CustomPortalStory(): React.JSX.Element {
60
61
  boundaryElement={useBoundaryElement ? boundaryElement : null}
61
62
  content={content ? <Text size={1}>{content}</Text> : undefined}
62
63
  padding={2}
64
+ // @ts-expect-error - TODO: fix this
63
65
  placement={placement}
64
66
  portal={portal}
65
67
  >
@@ -9,6 +9,7 @@ export default function OverflowingBoundaryStory(): React.JSX.Element {
9
9
  'Content',
10
10
  'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mollis consectetur malesuada. Sed lobortis est dolor, eget imperdiet velit placerat et. Aenean posuere mi non aliquet iaculis. Donec fermentum pulvinar purus at sagittis. Ut tincidunt massa odio, sed finibus justo ullamcorper id. Nam venenatis justo non ligula elementum cursus. Pellentesque laoreet justo in mollis sagittis. In lacinia ornare ultrices. Suspendisse potenti.',
11
11
  )
12
+ // @ts-expect-error - TODO: fix this
12
13
  const placement = useSelect('Placement', WORKSHOP_PLACEMENT_OPTIONS, 'top')
13
14
  const portal = useBoolean('Portal', false)
14
15
  const useBoundaryElement = useBoolean('Use boundary element', true)
@@ -56,6 +57,7 @@ export default function OverflowingBoundaryStory(): React.JSX.Element {
56
57
  <Tooltip
57
58
  content={<Text size={1}>{content}</Text>}
58
59
  padding={2}
60
+ // @ts-expect-error - TODO: fix this
59
61
  placement={placement}
60
62
  portal={portal}
61
63
  >
@@ -11,11 +11,14 @@ import {
11
11
  export default function PropsStory(): React.JSX.Element {
12
12
  const arrow = useBoolean('Arrow', false)
13
13
  const content = useText('Content', 'Tooltip content')
14
+ // @ts-expect-error - TODO: fix this
14
15
  const padding = useSelect('Padding', WORKSHOP_SPACE_OPTIONS, 2)
16
+ // @ts-expect-error - TODO: fix this
15
17
  const placement = useSelect('Placement', WORKSHOP_PLACEMENT_OPTIONS, 'top')
16
18
  const portal = useBoolean('Portal', true)
17
19
  const openDelay = useNumber('Open Delay', 200)
18
20
  const closeDelay = useNumber('Close Delay', 200)
21
+ // @ts-expect-error - TODO: fix this
19
22
  const shadow = useSelect('Shadow', WORKSHOP_SHADOW_OPTIONS, 2)
20
23
 
21
24
  return (
@@ -41,9 +44,12 @@ export default function PropsStory(): React.JSX.Element {
41
44
  <Tooltip
42
45
  arrow={arrow}
43
46
  content={<Text size={1}>{content}</Text>}
47
+ // @ts-expect-error - TODO: fix this
44
48
  padding={padding}
49
+ // @ts-expect-error - TODO: fix this
45
50
  placement={placement}
46
51
  portal={portal}
52
+ // @ts-expect-error - TODO: fix this
47
53
  shadow={shadow}
48
54
  delay={{
49
55
  open: openDelay,
@@ -81,9 +87,12 @@ export default function PropsStory(): React.JSX.Element {
81
87
  close: 100,
82
88
  }}
83
89
  content={<Text size={1}>{content}</Text>}
90
+ // @ts-expect-error - TODO: fix this
84
91
  padding={padding}
92
+ // @ts-expect-error - TODO: fix this
85
93
  placement={placement}
86
94
  portal={portal}
95
+ // @ts-expect-error - TODO: fix this
87
96
  shadow={shadow}
88
97
  >
89
98
  <Button mode="bleed" text="Hover me" />
@@ -96,9 +105,12 @@ export default function PropsStory(): React.JSX.Element {
96
105
  close: 100,
97
106
  }}
98
107
  content={<Text size={1}>{content}</Text>}
108
+ // @ts-expect-error - TODO: fix this
99
109
  padding={padding}
110
+ // @ts-expect-error - TODO: fix this
100
111
  placement={placement}
101
112
  portal={portal}
113
+ // @ts-expect-error - TODO: fix this
102
114
  shadow={shadow}
103
115
  >
104
116
  <Button mode="bleed" text="Or me" />
@@ -9,6 +9,7 @@ export default function ResizableBoundaryStory(): React.JSX.Element {
9
9
  'Content',
10
10
  'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut mollis consectetur malesuada. Sed lobortis est dolor, eget imperdiet velit placerat et. Aenean posuere mi non aliquet iaculis. Donec fermentum pulvinar purus at sagittis. Ut tincidunt massa odio, sed finibus justo ullamcorper id. Nam venenatis justo non ligula elementum cursus. Pellentesque laoreet justo in mollis sagittis. In lacinia ornare ultrices. Suspendisse potenti.',
11
11
  )
12
+ // @ts-expect-error - TODO: fix this
12
13
  const placement = useSelect('Placement', WORKSHOP_PLACEMENT_OPTIONS, 'right')
13
14
  const portal = useBoolean('Portal', true)
14
15
  const useBoundaryElement = useBoolean('Use boundary element', true)
@@ -38,6 +39,7 @@ export default function ResizableBoundaryStory(): React.JSX.Element {
38
39
  <Tooltip
39
40
  content={<Text size={1}>{content}</Text>}
40
41
  padding={2}
42
+ // @ts-expect-error - TODO: fix this
41
43
  placement={placement}
42
44
  portal={portal}
43
45
  >
@@ -46,6 +48,7 @@ export default function ResizableBoundaryStory(): React.JSX.Element {
46
48
  <Tooltip
47
49
  content={<Text size={1}>{content}</Text>}
48
50
  padding={2}
51
+ // @ts-expect-error - TODO: fix this
49
52
  placement={placement}
50
53
  portal={portal}
51
54
  >
@@ -58,6 +61,7 @@ export default function ResizableBoundaryStory(): React.JSX.Element {
58
61
  <Tooltip
59
62
  content={<Text size={1}>{content}</Text>}
60
63
  padding={2}
64
+ // @ts-expect-error - TODO: fix this
61
65
  placement={placement}
62
66
  portal={portal}
63
67
  >
@@ -70,6 +74,7 @@ export default function ResizableBoundaryStory(): React.JSX.Element {
70
74
  <Tooltip
71
75
  content={<Text size={1}>{content}</Text>}
72
76
  padding={2}
77
+ // @ts-expect-error - TODO: fix this
73
78
  placement={placement}
74
79
  portal={portal}
75
80
  >
@@ -8,22 +8,22 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'props',
10
10
  title: 'Props',
11
- component: lazy(() => import('./props')),
11
+ component: lazy(() => import('./Props')),
12
12
  },
13
13
  {
14
14
  name: 'resizableBoundary',
15
15
  title: 'Resizable Boundary',
16
- component: lazy(() => import('./resizableBoundary')),
16
+ component: lazy(() => import('./ResizableBoundary')),
17
17
  },
18
18
  {
19
19
  name: 'overflowBoundary',
20
20
  title: 'Overflowing Boundary',
21
- component: lazy(() => import('./overflowingBoundary')),
21
+ component: lazy(() => import('./OverflowingBoundary')),
22
22
  },
23
23
  {
24
24
  name: 'customPortalStory',
25
25
  title: 'Custom Portal',
26
- component: lazy(() => import('./customPortal')),
26
+ component: lazy(() => import('./CustomPortal')),
27
27
  },
28
28
  ],
29
29
  }
@@ -8,6 +8,6 @@ import type {TooltipDelayGroupContextValue} from './types'
8
8
  */
9
9
  export const TooltipDelayGroupContext: Context<TooltipDelayGroupContextValue | null> =
10
10
  createGlobalScopedContext<TooltipDelayGroupContextValue | null>(
11
- '@sanity/ui/v3/tooltipDelayGroup',
11
+ '@sanity/ui/v4/tooltipDelayGroup',
12
12
  null,
13
13
  )
@@ -2,7 +2,7 @@ import {type ReactNode, useMemo} from 'react'
2
2
 
3
3
  import {useDelayedState} from '../../../hooks/useDelayedState'
4
4
  import type {Delay} from '../../../types'
5
- import {TooltipDelayGroupContext} from './tooltipDelayGroupContext'
5
+ import {TooltipDelayGroupContext} from './TooltipDelayGroupContext'
6
6
  import type {TooltipDelayGroupContextValue} from './types'
7
7
 
8
8
  /**
@@ -49,7 +49,5 @@ export function TooltipDelayGroupProvider(
49
49
  [closeDelay, isGroupActive, openDelay, openTooltipId, setIsGroupActive, setOpenTooltipId],
50
50
  )
51
51
 
52
- return (
53
- <TooltipDelayGroupContext.Provider value={value}>{children}</TooltipDelayGroupContext.Provider>
54
- )
52
+ return <TooltipDelayGroupContext value={value}>{children}</TooltipDelayGroupContext>
55
53
  }
@@ -1,13 +1,13 @@
1
- import {useContext} from 'react'
1
+ import {use} from 'react'
2
2
 
3
- import {TooltipDelayGroupContext} from './tooltipDelayGroupContext'
3
+ import {TooltipDelayGroupContext} from './TooltipDelayGroupContext'
4
4
  import type {TooltipDelayGroupContextValue} from './types'
5
5
 
6
6
  /**
7
7
  * @beta
8
8
  */
9
9
  export function useTooltipDelayGroup(): TooltipDelayGroupContextValue | null {
10
- const value = useContext(TooltipDelayGroupContext)
10
+ const value = use(TooltipDelayGroupContext)
11
11
 
12
12
  return value
13
13
  }
package/src/core/types.ts CHANGED
@@ -1,8 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-empty-object-type */
2
2
  /* eslint-disable @typescript-eslint/no-explicit-any */
3
3
 
4
- import type {ComponentClass, ComponentProps, ExoticComponent, FunctionComponent, JSX} from 'react'
5
-
6
4
  /**
7
5
  * Assign properties from `U` to `T`, excluding properties that already exist in `T`.
8
6
  *
@@ -14,17 +12,20 @@ export type Assign<T extends {}, U extends {}> = Omit<T, keyof U> & U
14
12
  export type EmptyProps = {}
15
13
 
16
14
  /** @public */
17
- export type TagType = keyof JSX.IntrinsicElements
15
+ export type TagType = keyof React.JSX.IntrinsicElements
18
16
 
19
17
  /** @public */
20
- export type ComponentType<P = any> = FunctionComponent<P> | ComponentClass<P> | ExoticComponent<P>
18
+ export type ComponentType<P = any> =
19
+ | React.FunctionComponent<P>
20
+ | React.ComponentClass<P>
21
+ | React.ExoticComponent<P>
21
22
 
22
23
  /** @public */
23
24
  export type ElementType<P> = TagType | ComponentType<P>
24
25
 
25
26
  /** @public */
26
27
  export type Props<P extends EmptyProps, E extends ElementType<P>> = Assign<
27
- E extends TagType ? JSX.IntrinsicElements[E] : ComponentProps<E>,
28
+ E extends TagType ? React.JSX.IntrinsicElements[E] : React.ComponentProps<E>,
28
29
  P & {as?: E}
29
30
  >
30
31
 
@@ -1,6 +1,6 @@
1
1
  import {Component, type ErrorInfo, type PropsWithChildren, type ReactNode} from 'react'
2
2
 
3
- import {Code} from '../primitives/code/code'
3
+ import {Code} from '../primitives/code/Code'
4
4
 
5
5
  /**
6
6
  * DO NOT USE IN PRODUCTION
@@ -3,8 +3,5 @@ import type {Context} from 'react'
3
3
  import {createGlobalScopedContext} from '../../lib/createGlobalScopedContext'
4
4
  import type {BoundaryElementContextValue} from './types'
5
5
 
6
- export const BoundaryElementContext: Context<BoundaryElementContextValue | null> =
7
- createGlobalScopedContext<BoundaryElementContextValue | null>(
8
- '@sanity/ui/v3/boundaryElement',
9
- null,
10
- )
6
+ export const BoundaryElementContext: Context<BoundaryElementContextValue> =
7
+ createGlobalScopedContext<BoundaryElementContextValue>('@sanity/ui/v4/boundaryElement', null)
@@ -0,0 +1,16 @@
1
+ import {type ReactNode} from 'react'
2
+
3
+ import {BoundaryElementContext} from './BoundaryElementContext'
4
+
5
+ /** @public */
6
+ export interface BoundaryElementProviderProps {
7
+ children: ReactNode
8
+ element: HTMLElement | null
9
+ }
10
+
11
+ /** @public */
12
+ export function BoundaryElementProvider(props: BoundaryElementProviderProps): React.JSX.Element {
13
+ const {children, element} = props
14
+
15
+ return <BoundaryElementContext value={element}>{children}</BoundaryElementContext>
16
+ }
@@ -8,7 +8,7 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'plain',
10
10
  title: 'Plain',
11
- component: lazy(() => import('./plain')),
11
+ component: lazy(() => import('./Plain')),
12
12
  },
13
13
  ],
14
14
  }
@@ -1,5 +1,2 @@
1
1
  /** @public */
2
- export interface BoundaryElementContextValue {
3
- version: 0.0
4
- element: HTMLElement | null
5
- }
2
+ export type BoundaryElementContextValue = HTMLElement | null
@@ -1,24 +1,12 @@
1
- import {useContext} from 'react'
1
+ import {use, useMemo} from 'react'
2
2
 
3
- import {isRecord} from '../../lib/isRecord'
4
- import {BoundaryElementContext} from './boundaryElementContext'
3
+ import {BoundaryElementContext} from './BoundaryElementContext'
5
4
  import type {BoundaryElementContextValue} from './types'
6
5
 
7
- const DEFAULT_VALUE: BoundaryElementContextValue = {
8
- version: 0.0,
9
- element: null,
10
- }
11
-
12
6
  /** @public */
13
- export function useBoundaryElement(): BoundaryElementContextValue {
14
- const value = useContext(BoundaryElementContext)
15
-
16
- // NOTE: This check is for future-compatiblity
17
- // - If the value is not an object, it’s not compatible with the current version
18
- // - If the value is an object, but doesn’t have `version: 0.0`, it’s not compatible with the current version
19
- if (value && (!isRecord(value) || value.version !== 0.0)) {
20
- throw new Error('useBoundaryElement(): the context value is not compatible')
21
- }
22
-
23
- return value || DEFAULT_VALUE
7
+ export function useBoundaryElement(): {version: 0.0; element: BoundaryElementContextValue} {
8
+ // eslint-disable-next-line no-warning-comments
9
+ // @TODO this wrapping is for BC and should be removed
10
+ const element = use(BoundaryElementContext)
11
+ return useMemo(() => ({version: 0.0, element}), [element])
24
12
  }
@@ -0,0 +1,19 @@
1
+ import {Box, Card, ElementQuery, Text} from '@sanity/ui'
2
+
3
+ import {testCard} from './styles.css'
4
+
5
+ export default function CustomMediaQuery(): React.JSX.Element {
6
+ return (
7
+ <Box padding={4}>
8
+ <Box marginBottom={4}>
9
+ <Text>Resize this frame to see the text color change:</Text>
10
+ </Box>
11
+
12
+ <ElementQuery media={[0, 100, 200, 300]}>
13
+ <Card className={testCard} padding={3} shadow={1}>
14
+ <Text>This card sits inside an element query.</Text>
15
+ </Card>
16
+ </ElementQuery>
17
+ </Box>
18
+ )
19
+ }
@@ -8,7 +8,7 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'custom-media',
10
10
  title: 'Custom media',
11
- component: lazy(() => import('./customMedia')),
11
+ component: lazy(() => import('./CustomMedia')),
12
12
  },
13
13
  ],
14
14
  }
@@ -0,0 +1,31 @@
1
+ import {vars} from '@sanity/ui/css'
2
+ import {style} from '@vanilla-extract/css'
3
+
4
+ export const testCard: string = style({
5
+ selectors: {
6
+ '[data-eq-min~="0"] > &': {
7
+ vars: {
8
+ [vars.color.fg]:
9
+ `light-dark(${vars.color.palette.orange[600]}, ${vars.color.palette.orange[400]})`,
10
+ },
11
+ },
12
+ '[data-eq-min~="1"] > &': {
13
+ vars: {
14
+ [vars.color.fg]:
15
+ `light-dark(${vars.color.palette.red[600]}, ${vars.color.palette.red[400]})`,
16
+ },
17
+ },
18
+ '[data-eq-min~="2"] > &': {
19
+ vars: {
20
+ [vars.color.fg]:
21
+ `light-dark(${vars.color.palette.magenta[600]}, ${vars.color.palette.magenta[400]})`,
22
+ },
23
+ },
24
+ '[data-eq-min~="3"] > &': {
25
+ vars: {
26
+ [vars.color.fg]:
27
+ `light-dark(${vars.color.palette.purple[600]}, ${vars.color.palette.purple[400]})`,
28
+ },
29
+ },
30
+ },
31
+ })
@@ -2,7 +2,7 @@ import {describe, expect, it, vi} from 'vitest'
2
2
 
3
3
  import {render} from '$test/utils'
4
4
 
5
- import {PortalContext} from './portalContext'
5
+ import {PortalContext} from './PortalContext'
6
6
  import type {PortalContextValue} from './types'
7
7
  import {usePortal} from './usePortal'
8
8
 
@@ -27,9 +27,9 @@ describe('utils/portal', () => {
27
27
  }
28
28
 
29
29
  return (
30
- <PortalContext.Provider value={value}>
30
+ <PortalContext value={value}>
31
31
  <Debug />
32
- </PortalContext.Provider>
32
+ </PortalContext>
33
33
  )
34
34
  }
35
35
 
@@ -55,12 +55,12 @@ describe('utils/portal', () => {
55
55
 
56
56
  function Root() {
57
57
  return (
58
- <PortalContext.Provider
58
+ <PortalContext
59
59
  // @ts-expect-error - we want to test the error case
60
60
  value={undefined}
61
61
  >
62
62
  <Debug />
63
- </PortalContext.Provider>
63
+ </PortalContext>
64
64
  )
65
65
  }
66
66
 
@@ -86,12 +86,12 @@ describe('utils/portal', () => {
86
86
  // NOTE: we’re testing this because the context value may be a function in the future
87
87
 
88
88
  return (
89
- <PortalContext.Provider
89
+ <PortalContext
90
90
  // @ts-expect-error - we want to test the error case
91
91
  value={() => ({version: 1})}
92
92
  >
93
93
  <Debug />
94
- </PortalContext.Provider>
94
+ </PortalContext>
95
95
  )
96
96
  }
97
97
 
@@ -1,8 +1,9 @@
1
- import type {ReactNode, ReactPortal} from 'react'
1
+ import {type ReactNode, type ReactPortal, use} from 'react'
2
2
  import {createPortal} from 'react-dom'
3
3
 
4
- import {CardProvider} from '../../primitives/card/cardProvider'
5
- import {useCard} from '../../primitives/card/useCard'
4
+ import {CardContext} from '../../primitives/card/CardContext'
5
+ import {CardProvider} from '../../primitives/card/CardProvider'
6
+ import {assertCardContext} from '../../primitives/card/useCard'
6
7
  import {usePortal} from './usePortal'
7
8
 
8
9
  /** @public */
@@ -17,7 +18,6 @@ export interface PortalProps {
17
18
  /** @public */
18
19
  export function Portal(props: PortalProps): ReactPortal | null {
19
20
  const {children, __unstable_name: name} = props
20
- const card = useCard()
21
21
  const portal = usePortal()
22
22
  const portalElement =
23
23
  (name ? portal.elements && portal.elements[name] : portal.element) ||
@@ -27,6 +27,9 @@ export function Portal(props: PortalProps): ReactPortal | null {
27
27
  return null
28
28
  }
29
29
 
30
+ const card = use(CardContext)
31
+ assertCardContext(card)
32
+
30
33
  return createPortal(
31
34
  <CardProvider tone="transparent" scheme={card.scheme}>
32
35
  {children}
@@ -4,7 +4,7 @@ import {createGlobalScopedContext} from '../../lib/createGlobalScopedContext'
4
4
  import {globalScope} from '../../lib/globalScope'
5
5
  import type {PortalContextValue} from './types'
6
6
 
7
- const key = '@sanity/ui/v3/portal'
7
+ const key = '@sanity/ui/v4/portal'
8
8
  const elementKey = Symbol.for(`${key}/element`)
9
9
 
10
10
  // Use the global scope as a map of symbols to elements
@@ -0,0 +1,38 @@
1
+ import {type ReactNode, use, useMemo, useSyncExternalStore} from 'react'
2
+
3
+ import {PortalContext} from './PortalContext'
4
+ import type {PortalContextValue} from './types'
5
+
6
+ /** @public */
7
+ export interface PortalProviderProps {
8
+ children: ReactNode
9
+ element?: HTMLElement | null
10
+ /**
11
+ * @beta
12
+ */
13
+ __unstable_elements?: Record<string, HTMLElement | null | undefined>
14
+ }
15
+
16
+ /** @public */
17
+ export function PortalProvider(props: PortalProviderProps): React.JSX.Element {
18
+ const {children, element, __unstable_elements: elements} = props
19
+ const parentPortal = use(PortalContext)
20
+ const fallbackElement = useSyncExternalStore(
21
+ emptySubscribe,
22
+ () => elements?.['default'] ?? (parentPortal.element || document.body),
23
+ () => null,
24
+ )
25
+
26
+ const value = useMemo(() => {
27
+ return {
28
+ version: 0.0,
29
+ boundaryElement: null,
30
+ element: element || fallbackElement,
31
+ elements,
32
+ } satisfies PortalContextValue
33
+ }, [element, elements, fallbackElement])
34
+
35
+ return <PortalContext value={value}>{children}</PortalContext>
36
+ }
37
+
38
+ const emptySubscribe = () => () => {}
@@ -8,7 +8,7 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'named',
10
10
  title: 'Named portals',
11
- component: lazy(() => import('./named')),
11
+ component: lazy(() => import('./Named')),
12
12
  },
13
13
  ],
14
14
  }
@@ -1,13 +1,22 @@
1
- import {useContext} from 'react'
1
+ import {use} from 'react'
2
2
 
3
3
  import {isRecord} from '../../lib/isRecord'
4
- import {PortalContext} from './portalContext'
4
+ import {PortalContext} from './PortalContext'
5
5
  import type {PortalContextValue} from './types'
6
6
 
7
7
  /** @public */
8
8
  export function usePortal(): PortalContextValue {
9
- const value = useContext(PortalContext)
9
+ const value = use(PortalContext)
10
10
 
11
+ assertPortalContext(value)
12
+
13
+ return value
14
+ }
15
+
16
+ /** @internal */
17
+ export function assertPortalContext(
18
+ value: PortalContextValue | null,
19
+ ): asserts value is PortalContextValue {
11
20
  if (!value) {
12
21
  throw new Error('usePortal(): missing context value')
13
22
  }
@@ -18,6 +27,4 @@ export function usePortal(): PortalContextValue {
18
27
  if (!isRecord(value) || value.version !== 0.0) {
19
28
  throw new Error('usePortal(): the context value is not compatible')
20
29
  }
21
-
22
- return value
23
30
  }
@@ -21,8 +21,8 @@ export function _responsiveStyle(layer: string, rule: StyleRule): ResponsiveRule
21
21
  rules[index] = style({
22
22
  '@layer': {
23
23
  [layer]: {
24
- '@media': {
25
- [`screen and (min-width: ${bp}px)`]: rule,
24
+ '@container': {
25
+ [`(min-width: ${bp}px)`]: rule,
26
26
  },
27
27
  },
28
28
  },
@@ -37,8 +37,7 @@ export const element: string = _style(layers.primitives, {
37
37
  display: 'block',
38
38
  boxSizing: 'border-box',
39
39
  resize: 'none',
40
- // See https://caniuse.com/?search=width%3A%20stretch
41
- width: ['-moz-available', '-webkit-fill-available', 'stretch'],
40
+ inlineSize: 'stretch',
42
41
 
43
42
  selectors: {
44
43
  '&::placeholder': {
@@ -57,7 +56,6 @@ export const element: string = _style(layers.primitives, {
57
56
  [`${root}:not([data-invalid]) &`]: {
58
57
  vars: {
59
58
  [vars.color.input.text.fg]: vars.color.tinted.default.fg[2],
60
- [vars.color.input.text.placeholder]: vars.color.tinted.default.border[4],
61
59
  },
62
60
  },
63
61
 
@@ -76,14 +74,12 @@ export const element: string = _style(layers.primitives, {
76
74
  [`${root}:not([data-invalid]) &:disabled`]: {
77
75
  vars: {
78
76
  [vars.color.input.text.fg]: vars.color.tinted.default.border[4],
79
- [vars.color.input.text.placeholder]: vars.color.tinted.default.border[1],
80
77
  },
81
78
  },
82
79
 
83
80
  [`${root}[data-invalid] &`]: {
84
81
  vars: {
85
82
  [vars.color.input.text.fg]: vars.color.tinted.critical.fg[2],
86
- [vars.color.input.text.placeholder]: vars.color.tinted.critical.border[2],
87
83
  },
88
84
  },
89
85
 
@@ -102,22 +98,26 @@ export const element: string = _style(layers.primitives, {
102
98
  [`${root}[data-invalid] &:disabled`]: {
103
99
  vars: {
104
100
  [vars.color.input.text.fg]: vars.color.tinted.critical.border[4],
105
- [vars.color.input.text.placeholder]: vars.color.tinted.critical.border[2],
106
101
  },
107
102
  },
108
103
  },
104
+
105
+ vars: {
106
+ [vars.color.input.text.placeholder]:
107
+ `color-mix(in srgb, transparent, ${vars.color.input.text.fg} 50%)`,
108
+ },
109
109
  })
110
110
 
111
111
  export const presentation: string = _style(layers.primitives, {
112
112
  backgroundColor: vars.color.input.text.bg,
113
113
  borderRadius: 'inherit',
114
114
  boxShadow: `inset 0 0 0 ${vars.input.border.width} ${vars.color.input.text.border}`,
115
+ display: 'block',
115
116
  position: 'absolute',
116
117
  top: 0,
117
118
  left: 0,
118
119
  right: 0,
119
120
  bottom: 0,
120
- display: 'block',
121
121
  pointerEvents: 'none',
122
122
  zIndex: 0,
123
123
 
@@ -155,11 +155,12 @@ export const presentation: string = _style(layers.primitives, {
155
155
  },
156
156
  },
157
157
 
158
- [`${root}:not([data-invalid]):not([data-read-only]) ${element}:not(:disabled):hover + &`]: {
159
- vars: {
160
- [vars.color.input.text.border]: vars.color.tinted.default.border[2],
158
+ [`${root}.${border}:not([data-invalid]):not([data-read-only]) ${element}:not(:disabled):hover + &`]:
159
+ {
160
+ vars: {
161
+ [vars.color.input.text.border]: vars.color.tinted.default.border[2],
162
+ },
161
163
  },
162
- },
163
164
 
164
165
  [`${root}:not([data-invalid]) ${element}:focus + &`]: {
165
166
  vars: {
@@ -186,7 +187,7 @@ export const presentation: string = _style(layers.primitives, {
186
187
  },
187
188
  },
188
189
 
189
- [`${root}[data-invalid] ${element}:not(:disabled):hover + &`]: {
190
+ [`${root}.${border}[data-invalid] ${element}:not(:disabled):hover + &`]: {
190
191
  vars: {
191
192
  [vars.color.input.text.border]: vars.color.tinted.critical.border[2],
192
193
  },