@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
@@ -13,10 +13,10 @@ import {
13
13
  useState,
14
14
  } from 'react'
15
15
 
16
- import type {ButtonProps} from '../../primitives/button/button'
17
- import {Popover, type PopoverProps} from '../../primitives/popover/popover'
16
+ import type {ButtonProps} from '../../primitives/button/Button'
17
+ import {Popover, type PopoverProps} from '../../primitives/popover/Popover'
18
18
  import type {Props} from '../../types'
19
- import type {MenuProps} from './menu'
19
+ import type {MenuProps} from './Menu'
20
20
 
21
21
  /** @public */
22
22
  export type MenuButtonProps = {
@@ -29,7 +29,7 @@ export type MenuButtonProps = {
29
29
  menu?: ReactElement
30
30
  onClose?: () => void
31
31
  onOpen?: () => void
32
- popover?: Omit<PopoverProps, 'content' | 'open'>
32
+ popover?: Omit<PopoverProps<'div'>, 'content' | 'open'>
33
33
 
34
34
  ref?: ForwardedRef<HTMLButtonElement | null>
35
35
  }
@@ -159,11 +159,16 @@ export function MenuButton(props: MenuButtonProps): React.JSX.Element {
159
159
  [menuElements],
160
160
  )
161
161
 
162
- const handleItemClick = useCallback(() => {
163
- setOpen(false)
164
- if (disableRestoreFocusOnClose) return
165
- if (buttonElement) buttonElement.focus()
166
- }, [buttonElement, disableRestoreFocusOnClose])
162
+ const handleItemClick = useCallback(
163
+ (e: ReactMouseEvent<HTMLButtonElement>) => {
164
+ if (e.defaultPrevented) return
165
+
166
+ setOpen(false)
167
+ if (disableRestoreFocusOnClose) return
168
+ if (buttonElement) buttonElement.focus()
169
+ },
170
+ [buttonElement, disableRestoreFocusOnClose],
171
+ )
167
172
 
168
173
  const registerElement = useCallback((el: HTMLElement) => {
169
174
  setChildMenuElements((els) => els.concat([el]))
@@ -3,17 +3,16 @@ import {type Context, type MouseEvent as ReactMouseEvent} from 'react'
3
3
  import {createGlobalScopedContext} from '../../lib/createGlobalScopedContext'
4
4
 
5
5
  export interface MenuContextValue {
6
- version: 0.0
6
+ version: 2
7
7
  activeElement: HTMLElement | null
8
- activeIndex: number
9
8
  mount: (element: HTMLElement | null, selected?: boolean) => () => void
10
9
  onClickOutside?: (event: MouseEvent) => void
11
10
  onEscape?: () => void
12
- onItemClick?: () => void
11
+ onItemClick?: (event: ReactMouseEvent<HTMLButtonElement>) => void
13
12
  onItemMouseEnter?: (event: ReactMouseEvent<HTMLElement>) => void
14
13
  onItemMouseLeave?: (event: ReactMouseEvent<HTMLElement>) => void
15
14
  registerElement?: (el: HTMLElement) => () => void
16
15
  }
17
16
 
18
17
  export const MenuContext: Context<MenuContextValue | null> =
19
- createGlobalScopedContext<MenuContextValue | null>('@sanity/ui/v3/menu', null)
18
+ createGlobalScopedContext<MenuContextValue | null>('@sanity/ui/v4/menu', null)
@@ -13,13 +13,13 @@ import {
13
13
  } from 'react'
14
14
  import {isValidElementType} from 'react-is'
15
15
 
16
- import {Box} from '../../primitives/box/box'
17
- import {Flex} from '../../primitives/flex/flex'
18
- import {Popover, type PopoverProps} from '../../primitives/popover/popover'
19
- import {Selectable} from '../../primitives/selectable/selectable'
20
- import {Text} from '../../primitives/text/text'
16
+ import {Box} from '../../primitives/box/Box'
17
+ import {Flex} from '../../primitives/flex/Flex'
18
+ import {Popover, type PopoverProps} from '../../primitives/popover/Popover'
19
+ import {Selectable} from '../../primitives/selectable/Selectable'
20
+ import {Text} from '../../primitives/text/Text'
21
21
  import type {ComponentType, Props} from '../../types'
22
- import {DEFAULT_MENU_ELEMENT, Menu, type MenuProps} from './menu'
22
+ import {DEFAULT_MENU_ELEMENT, Menu, type MenuProps} from './Menu'
23
23
  import {useMenu} from './useMenu'
24
24
 
25
25
  /** @public */
@@ -43,7 +43,7 @@ export type MenuGroupOwnProps = RadiusStyleProps & {
43
43
  | 'onBlurCapture'
44
44
  >
45
45
  padding?: ResponsiveProp<Space>
46
- popover?: Omit<PopoverProps, 'content' | 'open'>
46
+ popover?: Omit<PopoverProps<'div'>, 'content' | 'open'>
47
47
  text?: ReactNode
48
48
  tone?: ElementTone
49
49
  }
@@ -127,10 +127,13 @@ export function MenuGroup<E extends MenuGroupElementType = typeof DEFAULT_MENU_G
127
127
  [onClick],
128
128
  )
129
129
 
130
- const handleChildItemClick = useCallback(() => {
131
- setOpen(false)
132
- onItemClick?.()
133
- }, [onItemClick])
130
+ const handleChildItemClick = useCallback(
131
+ (e: MouseEvent<HTMLButtonElement>) => {
132
+ setOpen(false)
133
+ onItemClick?.(e)
134
+ },
135
+ [onItemClick],
136
+ )
134
137
 
135
138
  const handleMenuMouseEnter = useCallback(() => setWithinMenu(true), [])
136
139
 
@@ -139,11 +142,13 @@ export function MenuGroup<E extends MenuGroupElementType = typeof DEFAULT_MENU_G
139
142
 
140
143
  // Close child menu when a sibling item becomes active
141
144
  useEffect(() => {
145
+ // eslint-disable-next-line react-hooks/set-state-in-effect
142
146
  if (!active) setOpen(false)
143
147
  }, [active])
144
148
 
145
149
  // Update state when child menu is no longer open
146
150
  useEffect(() => {
151
+ // eslint-disable-next-line react-hooks/set-state-in-effect
147
152
  if (!open) setWithinMenu(false)
148
153
  }, [open])
149
154
 
@@ -19,12 +19,12 @@ import {
19
19
  } from 'react'
20
20
  import {isValidElementType} from 'react-is'
21
21
 
22
- import {Box} from '../../primitives/box/box'
23
- import {Flex} from '../../primitives/flex/flex'
24
- import {Selectable} from '../../primitives/selectable/selectable'
25
- import {Text} from '../../primitives/text/text'
22
+ import {Box} from '../../primitives/box/Box'
23
+ import {Flex} from '../../primitives/flex/Flex'
24
+ import {Selectable} from '../../primitives/selectable/Selectable'
25
+ import {Text} from '../../primitives/text/Text'
26
26
  import type {ComponentType, Props} from '../../types'
27
- import {Hotkeys} from '../hotkeys/hotkeys'
27
+ import {Hotkeys} from '../hotkeys/Hotkeys'
28
28
  import {useMenu} from './useMenu'
29
29
 
30
30
  /** @public */
@@ -104,7 +104,7 @@ export function MenuItem<E extends MenuItemElementType = typeof DEFAULT_MENU_ITE
104
104
  (event: MouseEvent<HTMLButtonElement>) => {
105
105
  if (disabled) return
106
106
  if (onClick) onClick(event)
107
- if (onItemClick) onItemClick()
107
+ if (onItemClick) onItemClick(event)
108
108
  },
109
109
  [disabled, onClick, onItemClick],
110
110
  )
@@ -132,9 +132,6 @@ export function MenuItem<E extends MenuItemElementType = typeof DEFAULT_MENU_ITE
132
132
  data-ui="MenuItem"
133
133
  {...rest}
134
134
  as={as}
135
- data-pressed={pressed ? '' : undefined}
136
- data-selected={active ? '' : undefined}
137
- data-disabled={disabled ? '' : undefined}
138
135
  radius={radius}
139
136
  disabled={disabled}
140
137
  onClick={handleClick}
@@ -142,6 +139,7 @@ export function MenuItem<E extends MenuItemElementType = typeof DEFAULT_MENU_ITE
142
139
  onMouseLeave={onItemMouseLeave}
143
140
  ref={setRef}
144
141
  role={role}
142
+ selected={active}
145
143
  tabIndex={-1}
146
144
  tone={tone}
147
145
  type={as === 'button' ? 'button' : undefined}
@@ -0,0 +1,27 @@
1
+ import {Menu, MenuItem, Text} from '@sanity/ui'
2
+ import type {ElementTone} from '@sanity/ui/theme'
3
+ import {useSelect} from '@sanity/ui-workshop'
4
+
5
+ import {WORKSHOP_BUTTON_TONE_OPTIONS} from '$workshop'
6
+
7
+ export default function DataPropsStory(): React.JSX.Element {
8
+ // @ts-expect-error - TODO: fix this
9
+ const tone = useSelect('Tone', WORKSHOP_BUTTON_TONE_OPTIONS, 'default') as ElementTone | undefined
10
+
11
+ return (
12
+ <Menu gap={4} padding={4}>
13
+ <MenuItem data-enabled="" padding={3} tone={tone}>
14
+ <Text>MenuItem</Text>
15
+ </MenuItem>
16
+ <MenuItem data-hovered="" padding={3} tone={tone}>
17
+ <Text>MenuItem</Text>
18
+ </MenuItem>
19
+ <MenuItem data-pressed="" padding={3} tone={tone}>
20
+ <Text>MenuItem</Text>
21
+ </MenuItem>
22
+ <MenuItem data-selected="" padding={3} tone={tone}>
23
+ <Text>MenuItem</Text>
24
+ </MenuItem>
25
+ </Menu>
26
+ )
27
+ }
@@ -17,6 +17,7 @@ import {useMemo} from 'react'
17
17
  import {WORKSHOP_CARD_TONE_OPTIONS} from '$workshop'
18
18
 
19
19
  export default function MenuButtonStory(): React.JSX.Element {
20
+ // @ts-expect-error - TODO: fix this
20
21
  const layoutTone = useSelect('Layout tone', WORKSHOP_CARD_TONE_OPTIONS, 'default')
21
22
  const portal = useBoolean('Portal', false)
22
23
 
@@ -29,7 +30,11 @@ export default function MenuButtonStory(): React.JSX.Element {
29
30
  )
30
31
 
31
32
  return (
32
- <Card height="fill" tone={layoutTone}>
33
+ <Card
34
+ height="fill"
35
+ // @ts-expect-error - TODO: fix this
36
+ tone={layoutTone}
37
+ >
33
38
  <Box padding={[4, 5, 6]}>
34
39
  <Grid gridTemplateColumns={3} gap={2}>
35
40
  <Button id="prev-button" mode="ghost" text="Prev" />
@@ -7,12 +7,18 @@ import {WORKSHOP_CARD_TONE_OPTIONS} from '$workshop'
7
7
 
8
8
  export default function TonesStory(): React.JSX.Element {
9
9
  const disabled = useBoolean('Disabled', false)
10
+ // @ts-expect-error - TODO: fix this
10
11
  const parentTone = useSelect('Parent tone', WORKSHOP_CARD_TONE_OPTIONS, 'default')
11
12
 
12
13
  return (
13
14
  <LayerProvider>
14
15
  <Box padding={[4, 5, 6]}>
15
- <Card radius={3} shadow={3} tone={parentTone}>
16
+ <Card
17
+ radius={3}
18
+ shadow={3}
19
+ // @ts-expect-error - TODO: fix this
20
+ tone={parentTone}
21
+ >
16
22
  <Menu>
17
23
  {ELEMENT_TONES.map((tone) => (
18
24
  <MenuItem disabled={disabled} icon={CubeIcon} key={tone} text={tone} tone={tone} />
@@ -8,82 +8,87 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'menu-button',
10
10
  title: 'MenuButton',
11
- component: lazy(() => import('./menuButton')),
11
+ component: lazy(() => import('./MenuButton')),
12
12
  },
13
13
  {
14
14
  name: 'nested-menu-items',
15
15
  title: 'Nested MenuItems',
16
- component: lazy(() => import('./nestedMenu')),
16
+ component: lazy(() => import('./NestedMenu')),
17
17
  },
18
18
  {
19
19
  name: 'custom-menu-item',
20
20
  title: 'Custom MenuItem',
21
- component: lazy(() => import('./customMenuItem')),
21
+ component: lazy(() => import('./CustomMenuItem')),
22
22
  },
23
23
  {
24
24
  name: 'groups',
25
25
  title: 'Groups',
26
- component: lazy(() => import('./groups')),
26
+ component: lazy(() => import('./Groups')),
27
27
  },
28
28
  {
29
29
  name: 'menu-group-right',
30
30
  title: 'Menu group (right)',
31
- component: lazy(() => import('./menuGroupRight')),
31
+ component: lazy(() => import('./MenuGroupRight')),
32
32
  },
33
33
  {
34
34
  name: 'tones',
35
35
  title: 'Tones',
36
- component: lazy(() => import('./tones')),
36
+ component: lazy(() => import('./Tones')),
37
37
  },
38
38
  {
39
39
  name: 'selected-item',
40
40
  title: 'Selected item',
41
- component: lazy(() => import('./selectedItem')),
41
+ component: lazy(() => import('./SelectedItem')),
42
42
  },
43
43
  {
44
44
  name: 'closable',
45
45
  title: 'Closeable',
46
- component: lazy(() => import('./closableMenuButton')),
46
+ component: lazy(() => import('./ClosableMenuButton')),
47
47
  },
48
48
  {
49
49
  name: 'without-arrow',
50
50
  title: 'Without arrow',
51
- component: lazy(() => import('./withoutArrow')),
51
+ component: lazy(() => import('./WithoutArrow')),
52
52
  },
53
53
  {
54
54
  name: 'constrained-in-boundary',
55
55
  title: 'Constrained in boundary',
56
- component: lazy(() => import('./constrainedInBoundary')),
56
+ component: lazy(() => import('./ConstrainedInBoundary')),
57
57
  },
58
58
  {
59
59
  name: 'as-component',
60
60
  title: 'As component',
61
- component: lazy(() => import('./asComponent')),
61
+ component: lazy(() => import('./AsComponent')),
62
62
  },
63
63
  {
64
64
  name: 'disable-focus-on-close',
65
65
  title: 'Disable focus on close',
66
- component: lazy(() => import('./disableFocusOnClose')),
66
+ component: lazy(() => import('./DisableFocusOnClose')),
67
67
  },
68
68
  {
69
69
  name: 'menu-button-with-on-close',
70
70
  title: 'MenuButton with on close',
71
- component: lazy(() => import('./onCloseMenuButton')),
71
+ component: lazy(() => import('./OnCloseMenuButton')),
72
72
  },
73
73
  {
74
- name: 'shouldFocus',
74
+ name: 'should-focus',
75
75
  title: 'Menu with shouldFocus',
76
- component: lazy(() => import('./shouldFocus')),
76
+ component: lazy(() => import('./ShouldFocus')),
77
77
  },
78
78
  {
79
79
  name: 'avatar',
80
80
  title: 'Avatar menu',
81
- component: lazy(() => import('./avatarMenu')),
81
+ component: lazy(() => import('./AvatarMenu')),
82
82
  },
83
83
  {
84
84
  name: 'custom-selected-state',
85
85
  title: 'Custom selected state',
86
- component: lazy(() => import('./customSelectedState')),
86
+ component: lazy(() => import('./CustomSelectedState')),
87
+ },
88
+ {
89
+ name: 'data-props',
90
+ title: 'Data props',
91
+ component: lazy(() => import('./DataProps')),
87
92
  },
88
93
  ],
89
94
  }
@@ -1,10 +1,10 @@
1
- import {useContext} from 'react'
1
+ import {use} from 'react'
2
2
 
3
3
  import {isRecord} from '../../lib/isRecord'
4
- import {MenuContext, type MenuContextValue} from './menuContext'
4
+ import {MenuContext, type MenuContextValue} from './MenuContext'
5
5
 
6
6
  export function useMenu(): MenuContextValue {
7
- const value = useContext(MenuContext)
7
+ const value = use(MenuContext)
8
8
 
9
9
  if (!value) {
10
10
  throw new Error('useMenu(): missing context value')
@@ -12,8 +12,8 @@ export function useMenu(): MenuContextValue {
12
12
 
13
13
  // NOTE: This check is for future-compatiblity
14
14
  // - If the value is not an object, it’s not compatible with the current version
15
- // - If the value is an object, but doesn’t have `version: 0.0`, it’s not compatible with the current version
16
- if (!isRecord(value) || value.version !== 0.0) {
15
+ // - If the value is an object, but doesn’t have `version: 2`, it’s not compatible with the current version
16
+ if (!isRecord(value) || value.version !== 2) {
17
17
  throw new Error('useMenu(): the context value is not compatible')
18
18
  }
19
19
 
@@ -5,7 +5,6 @@ import {
5
5
  type MutableRefObject,
6
6
  useCallback,
7
7
  useEffect,
8
- useMemo,
9
8
  useRef,
10
9
  useState,
11
10
  } from 'react'
@@ -39,12 +38,13 @@ export function useMenuController(props: {
39
38
  const elementsRef = useRef<HTMLElement[]>([])
40
39
  const [activeIndex, _setActiveIndex] = useState(-1)
41
40
  const activeIndexRef = useRef(activeIndex)
42
- const activeElement = useMemo(() => elementsRef.current[activeIndex] || null, [activeIndex])
43
- const mounted = Boolean(rootElementRef.current)
41
+ const [activeElement, setActiveElement] = useState<HTMLElement | null>(null)
44
42
 
45
43
  const setActiveIndex = useCallback((nextActiveIndex: number) => {
46
44
  _setActiveIndex(nextActiveIndex)
47
45
  activeIndexRef.current = nextActiveIndex
46
+
47
+ setActiveElement(elementsRef.current[nextActiveIndex] || null)
48
48
  }, [])
49
49
 
50
50
  const mount = useCallback(
@@ -193,7 +193,7 @@ export function useMenuController(props: {
193
193
 
194
194
  // Set focus on the currently active element
195
195
  useEffect(() => {
196
- if (!mounted) return
196
+ if (!rootElementRef.current) return
197
197
 
198
198
  const rafId = requestAnimationFrame(() => {
199
199
  if (activeIndex === -1) {
@@ -228,7 +228,7 @@ export function useMenuController(props: {
228
228
  })
229
229
 
230
230
  return () => cancelAnimationFrame(rafId)
231
- }, [activeIndex, mounted, setActiveIndex, shouldFocus])
231
+ }, [activeIndex, rootElementRef, setActiveIndex, shouldFocus])
232
232
 
233
233
  return {
234
234
  activeElement,
@@ -10,7 +10,7 @@ import {
10
10
  useRef,
11
11
  } from 'react'
12
12
 
13
- import {Button} from '../../primitives/button/button'
13
+ import {Button} from '../../primitives/button/Button'
14
14
  import type {ComponentType, Props} from '../../types'
15
15
 
16
16
  /** @public */
@@ -7,9 +7,9 @@ import {
7
7
  useState,
8
8
  } from 'react'
9
9
 
10
- import {Flex, type FlexOwnProps} from '../../primitives/flex/flex'
10
+ import {Flex, type FlexOwnProps} from '../../primitives/flex/Flex'
11
11
  import type {ComponentType, Props} from '../../types'
12
- import type {TabProps} from './tab'
12
+ import type {TabProps} from './Tab'
13
13
 
14
14
  /** @public */
15
15
  export const DEFAULT_TAB_LIST_ELEMENT = 'div'
@@ -1,4 +1,4 @@
1
- import {Box, type BoxOwnProps} from '../../primitives/box/box'
1
+ import {Box, type BoxOwnProps} from '../../primitives/box/Box'
2
2
  import type {ComponentType, Props} from '../../types'
3
3
 
4
4
  /** @public */
@@ -8,7 +8,7 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'example',
10
10
  title: 'Example',
11
- component: lazy(() => import('./example')),
11
+ component: lazy(() => import('./Example')),
12
12
  },
13
13
  ],
14
14
  }
@@ -2,7 +2,7 @@ import {describe, expect, it, vi} from 'vitest'
2
2
 
3
3
  import {render} from '$test/utils'
4
4
 
5
- import {ToastContext} from './toastContext'
5
+ import {ToastContext} from './ToastContext'
6
6
  import type {ToastContextValue} from './types'
7
7
  import {useToast} from './useToast'
8
8
 
@@ -26,9 +26,9 @@ describe('components/toast', () => {
26
26
  }
27
27
 
28
28
  return (
29
- <ToastContext.Provider value={value}>
29
+ <ToastContext value={value}>
30
30
  <Debug />
31
- </ToastContext.Provider>
31
+ </ToastContext>
32
32
  )
33
33
  }
34
34
 
@@ -53,12 +53,12 @@ describe('components/toast', () => {
53
53
 
54
54
  function Root() {
55
55
  return (
56
- <ToastContext.Provider
56
+ <ToastContext
57
57
  // @ts-expect-error - we want to test the error case
58
58
  value={undefined}
59
59
  >
60
60
  <Debug />
61
- </ToastContext.Provider>
61
+ </ToastContext>
62
62
  )
63
63
  }
64
64
 
@@ -84,12 +84,12 @@ describe('components/toast', () => {
84
84
  // NOTE: we’re testing this because the context value may be a function in the future
85
85
 
86
86
  return (
87
- <ToastContext.Provider
87
+ <ToastContext
88
88
  // @ts-expect-error - we want to test the error case
89
89
  value={() => ({version: 1})}
90
90
  >
91
91
  <Debug />
92
- </ToastContext.Provider>
92
+ </ToastContext>
93
93
  )
94
94
  }
95
95
 
@@ -4,12 +4,12 @@ import {motion, type Variant, type Variants} from 'framer-motion'
4
4
  import {type ReactNode} from 'react'
5
5
 
6
6
  import {usePrefersReducedMotion} from '../../hooks/usePrefersReducedMotion'
7
- import {Box} from '../../primitives/box/box'
8
- import {Button} from '../../primitives/button/button'
9
- import {Card} from '../../primitives/card/card'
10
- import {Flex} from '../../primitives/flex/flex'
11
- import {Stack} from '../../primitives/stack/stack'
12
- import {Text} from '../../primitives/text/text'
7
+ import {Box} from '../../primitives/box/Box'
8
+ import {Button} from '../../primitives/button/Button'
9
+ import {Card} from '../../primitives/card/Card'
10
+ import {Flex} from '../../primitives/flex/Flex'
11
+ import {Stack} from '../../primitives/stack/Stack'
12
+ import {Text} from '../../primitives/text/Text'
13
13
  import type {ComponentType, Props} from '../../types'
14
14
 
15
15
  /** @internal */
@@ -4,4 +4,4 @@ import {createGlobalScopedContext} from '../../lib/createGlobalScopedContext'
4
4
  import type {ToastContextValue} from './types'
5
5
 
6
6
  export const ToastContext: Context<ToastContextValue | null> =
7
- createGlobalScopedContext<ToastContextValue | null>('@sanity/ui/v3/toast', null)
7
+ createGlobalScopedContext<ToastContextValue | null>('@sanity/ui/v4/toast', null)
@@ -1,6 +1,6 @@
1
1
  import {type GapStyleProps, type PaddingStyleProps, toastLayer} from '@sanity/ui/css'
2
2
 
3
- import {Grid} from '../../primitives/grid/grid'
3
+ import {Grid} from '../../primitives/grid/Grid'
4
4
  import {useLayer} from '../../primitives/layer/useLayer'
5
5
  import type {ComponentType, Props} from '../../types'
6
6
 
@@ -3,10 +3,10 @@ import {AnimatePresence} from 'framer-motion'
3
3
  import {startTransition, useMemo, useState} from 'react'
4
4
 
5
5
  import {useMounted} from '../../hooks/useMounted'
6
- import {LayerProvider} from '../../primitives/layer/layerProvider'
7
- import {Toast} from './toast'
8
- import {ToastContext} from './toastContext'
9
- import {ToastLayer, type ToastLayerProps} from './toastLayer'
6
+ import {LayerProvider} from '../../primitives/layer/LayerProvider'
7
+ import {Toast} from './Toast'
8
+ import {ToastContext} from './ToastContext'
9
+ import {ToastLayer, type ToastLayerProps} from './ToastLayer'
10
10
  import {generateToastId} from './toastState'
11
11
  import type {ToastContextValue, ToastParams} from './types'
12
12
 
@@ -60,7 +60,7 @@ export function ToastProvider(props: ToastProviderProps): React.JSX.Element {
60
60
  })
61
61
  }
62
62
 
63
- const timeoutId = setTimeout(dismiss, duration)
63
+ const timeoutId = duration === Infinity ? undefined : setTimeout(dismiss, duration)
64
64
 
65
65
  /**
66
66
  * Create updated state by:
@@ -86,7 +86,7 @@ export function ToastProvider(props: ToastProviderProps): React.JSX.Element {
86
86
  }, [])
87
87
 
88
88
  return (
89
- <ToastContext.Provider value={value}>
89
+ <ToastContext value={value}>
90
90
  {children}
91
91
  {mounted && (
92
92
  <LayerProvider zOffset={zOffset}>
@@ -107,6 +107,6 @@ export function ToastProvider(props: ToastProviderProps): React.JSX.Element {
107
107
  </ToastLayer>
108
108
  </LayerProvider>
109
109
  )}
110
- </ToastContext.Provider>
110
+ </ToastContext>
111
111
  )
112
112
  }
@@ -6,6 +6,7 @@ import {WORKSHOP_TOAST_STATUS_OPTIONS} from '$workshop'
6
6
  export default function ToastStory(): React.JSX.Element {
7
7
  const closable = useBoolean('Closable', false)
8
8
  const title = useString('Title', 'Toast title')
9
+ // @ts-expect-error - TODO: fix this
9
10
  const status = useSelect('Status', WORKSHOP_TOAST_STATUS_OPTIONS)
10
11
  const description = useText('Description')
11
12
  const handleClose = useAction('onClose')
@@ -17,6 +18,7 @@ export default function ToastStory(): React.JSX.Element {
17
18
  closable={closable}
18
19
  description={description}
19
20
  onClose={handleClose}
21
+ // @ts-expect-error - TODO: fix this
20
22
  status={status}
21
23
  title={title}
22
24
  />
@@ -8,12 +8,12 @@ const scope: WorkshopScope = {
8
8
  {
9
9
  name: 'toast',
10
10
  title: 'Toast',
11
- component: lazy(() => import('./toast')),
11
+ component: lazy(() => import('./Toast')),
12
12
  },
13
13
  {
14
14
  name: 'hook',
15
15
  title: 'Hook',
16
- component: lazy(() => import('./hook')),
16
+ component: lazy(() => import('./Hook')),
17
17
  },
18
18
  ],
19
19
  }
@@ -1,12 +1,12 @@
1
- import {useContext} from 'react'
1
+ import {use} from 'react'
2
2
 
3
3
  import {isRecord} from '../../lib/isRecord'
4
- import {ToastContext} from './toastContext'
4
+ import {ToastContext} from './ToastContext'
5
5
  import type {ToastContextValue} from './types'
6
6
 
7
7
  /** @public */
8
8
  export function useToast(): ToastContextValue {
9
- const value = useContext(ToastContext)
9
+ const value = use(ToastContext)
10
10
 
11
11
  if (!value) {
12
12
  throw new Error('useToast(): missing context value')