@sanity/ui 4.0.0-beta.8 → 4.0.0-next.2

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 (381) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +21 -7
  3. package/dist/_chunks/getScopedTheme.cjs +4043 -0
  4. package/dist/_chunks/getScopedTheme.cjs.map +1 -0
  5. package/dist/_chunks/getScopedTheme.js +3803 -0
  6. package/dist/_chunks/getScopedTheme.js.map +1 -0
  7. package/dist/_chunks/refractor.cjs +18 -0
  8. package/dist/_chunks/refractor.cjs.map +1 -0
  9. package/dist/_chunks/refractor.js +20 -0
  10. package/dist/_chunks/refractor.js.map +1 -0
  11. package/dist/_chunks/rgba.d.cts +929 -0
  12. package/dist/_chunks/rgba.d.cts.map +1 -0
  13. package/dist/_chunks/rgba.d.ts +929 -0
  14. package/dist/_chunks/rgba.d.ts.map +1 -0
  15. package/dist/index.cjs +6243 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.cts +2332 -0
  18. package/dist/index.d.cts.map +1 -0
  19. package/dist/index.d.ts +1767 -1190
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +6134 -4725
  22. package/dist/index.js.map +1 -1
  23. package/dist/theme.cjs +54 -0
  24. package/dist/theme.cjs.map +1 -0
  25. package/dist/theme.d.cts +278 -0
  26. package/dist/theme.d.cts.map +1 -0
  27. package/dist/theme.d.ts +278 -0
  28. package/dist/theme.d.ts.map +1 -0
  29. package/dist/theme.js +53 -0
  30. package/dist/theme.js.map +1 -0
  31. package/package.json +55 -86
  32. package/dist/_chunks-es/Syntax.js +0 -23
  33. package/dist/_chunks-es/Syntax.js.map +0 -1
  34. package/dist/index.css +0 -1
  35. package/exports/index.css +0 -1
  36. package/exports/index.ts +0 -125
  37. package/src/components/autocomplete/Autocomplete.tsx +0 -665
  38. package/src/components/autocomplete/AutocompleteOption.tsx +0 -42
  39. package/src/components/autocomplete/__workshop__/Async.tsx +0 -162
  40. package/src/components/autocomplete/__workshop__/ConstrainedHeight.tsx +0 -121
  41. package/src/components/autocomplete/__workshop__/Custom.tsx +0 -91
  42. package/src/components/autocomplete/__workshop__/Example.tsx +0 -70
  43. package/src/components/autocomplete/__workshop__/FocusAndBlur.tsx +0 -39
  44. package/src/components/autocomplete/__workshop__/Fullscreen.tsx +0 -307
  45. package/src/components/autocomplete/__workshop__/index.ts +0 -41
  46. package/src/components/autocomplete/__workshop__/mock/apiStore.ts +0 -49
  47. package/src/components/autocomplete/__workshop__/mock/countries.ts +0 -245
  48. package/src/components/autocomplete/__workshop__/types.ts +0 -4
  49. package/src/components/autocomplete/autocompleteReducer.ts +0 -47
  50. package/src/components/autocomplete/constants.ts +0 -28
  51. package/src/components/autocomplete/types.ts +0 -103
  52. package/src/components/breadcrumbs/Breadcrumbs.tsx +0 -163
  53. package/src/components/breadcrumbs/__workshop__/Example.tsx +0 -48
  54. package/src/components/breadcrumbs/__workshop__/index.ts +0 -16
  55. package/src/components/dialog/Dialog.tsx +0 -230
  56. package/src/components/dialog/DialogCard.tsx +0 -233
  57. package/src/components/dialog/DialogContext.ts +0 -21
  58. package/src/components/dialog/DialogProvider.tsx +0 -34
  59. package/src/components/dialog/__workshop__/Activate.tsx +0 -141
  60. package/src/components/dialog/__workshop__/AutoFocus.tsx +0 -29
  61. package/src/components/dialog/__workshop__/Layering.tsx +0 -41
  62. package/src/components/dialog/__workshop__/Nested.tsx +0 -71
  63. package/src/components/dialog/__workshop__/OnScroll.tsx +0 -51
  64. package/src/components/dialog/__workshop__/Panes.tsx +0 -75
  65. package/src/components/dialog/__workshop__/Position.tsx +0 -30
  66. package/src/components/dialog/__workshop__/Props.tsx +0 -93
  67. package/src/components/dialog/__workshop__/Provider.tsx +0 -11
  68. package/src/components/dialog/__workshop__/Wrapped.tsx +0 -76
  69. package/src/components/dialog/__workshop__/index.ts +0 -21
  70. package/src/components/dialog/isTargetWithinScope.ts +0 -14
  71. package/src/components/dialog/types.ts +0 -2
  72. package/src/components/dialog/useDialog.ts +0 -11
  73. package/src/components/hotkeys/Hotkeys.tsx +0 -70
  74. package/src/components/hotkeys/__workshop__/Plain.tsx +0 -9
  75. package/src/components/hotkeys/__workshop__/index.ts +0 -16
  76. package/src/components/menu/Menu.test.tsx +0 -125
  77. package/src/components/menu/Menu.tsx +0 -174
  78. package/src/components/menu/MenuButton.tsx +0 -231
  79. package/src/components/menu/MenuContext.ts +0 -19
  80. package/src/components/menu/MenuDivider.tsx +0 -32
  81. package/src/components/menu/MenuGroup.tsx +0 -240
  82. package/src/components/menu/MenuItem.tsx +0 -153
  83. package/src/components/menu/__workshop__/AsComponent.tsx +0 -45
  84. package/src/components/menu/__workshop__/AvatarMenu.tsx +0 -36
  85. package/src/components/menu/__workshop__/ClosableMenuButton.tsx +0 -47
  86. package/src/components/menu/__workshop__/ConstrainedInBoundary.tsx +0 -133
  87. package/src/components/menu/__workshop__/CustomMenuItem.tsx +0 -47
  88. package/src/components/menu/__workshop__/CustomSelectedState.tsx +0 -35
  89. package/src/components/menu/__workshop__/DataProps.tsx +0 -27
  90. package/src/components/menu/__workshop__/DisableFocusOnClose.tsx +0 -40
  91. package/src/components/menu/__workshop__/Groups.tsx +0 -164
  92. package/src/components/menu/__workshop__/MenuButton.tsx +0 -79
  93. package/src/components/menu/__workshop__/MenuGroupRight.tsx +0 -73
  94. package/src/components/menu/__workshop__/NestedMenu.tsx +0 -22
  95. package/src/components/menu/__workshop__/OnCloseMenuButton.tsx +0 -50
  96. package/src/components/menu/__workshop__/SelectedItem.tsx +0 -69
  97. package/src/components/menu/__workshop__/ShouldFocus.tsx +0 -42
  98. package/src/components/menu/__workshop__/Tones.tsx +0 -19
  99. package/src/components/menu/__workshop__/index.ts +0 -91
  100. package/src/components/menu/helpers.ts +0 -82
  101. package/src/components/menu/useMenu.ts +0 -21
  102. package/src/components/menu/useMenuController.ts +0 -245
  103. package/src/components/tab/Tab.tsx +0 -135
  104. package/src/components/tab/TabList.tsx +0 -157
  105. package/src/components/tab/TabListContext.ts +0 -10
  106. package/src/components/tab/TabPanel.tsx +0 -94
  107. package/src/components/tab/__workshop__/Example.tsx +0 -135
  108. package/src/components/tab/__workshop__/index.ts +0 -16
  109. package/src/components/tab/types.ts +0 -11
  110. package/src/components/toast/Toast.test.tsx +0 -103
  111. package/src/components/toast/Toast.tsx +0 -191
  112. package/src/components/toast/ToastContext.ts +0 -7
  113. package/src/components/toast/ToastLayer.tsx +0 -54
  114. package/src/components/toast/ToastProvider.tsx +0 -127
  115. package/src/components/toast/__workshop__/Hook.tsx +0 -71
  116. package/src/components/toast/__workshop__/Toast.tsx +0 -26
  117. package/src/components/toast/__workshop__/index.ts +0 -21
  118. package/src/components/toast/toastState.ts +0 -6
  119. package/src/components/toast/types.ts +0 -24
  120. package/src/components/toast/useToast.ts +0 -23
  121. package/src/components/tree/Tree.tsx +0 -248
  122. package/src/components/tree/TreeContext.ts +0 -10
  123. package/src/components/tree/TreeGroup.tsx +0 -46
  124. package/src/components/tree/TreeItem.tsx +0 -236
  125. package/src/components/tree/__workshop__/Basic.tsx +0 -108
  126. package/src/components/tree/__workshop__/TabFromElement.tsx +0 -84
  127. package/src/components/tree/__workshop__/basic.perf.ts +0 -19
  128. package/src/components/tree/__workshop__/index.ts +0 -23
  129. package/src/components/tree/helpers.ts +0 -105
  130. package/src/components/tree/types.ts +0 -24
  131. package/src/components/tree/useTree.ts +0 -17
  132. package/src/components/virtualList/VirtualList.tsx +0 -254
  133. package/src/components/virtualList/__workshop__/ChangingProps.tsx +0 -41
  134. package/src/components/virtualList/__workshop__/ElementScroll.tsx +0 -43
  135. package/src/components/virtualList/__workshop__/InfiniteList.tsx +0 -40
  136. package/src/components/virtualList/__workshop__/WindowScrolll.tsx +0 -23
  137. package/src/components/virtualList/__workshop__/index.ts +0 -31
  138. package/src/core/_keys.ts +0 -26
  139. package/src/core/constants.ts +0 -67
  140. package/src/core/getElementRef.ts +0 -29
  141. package/src/core/helpers/animation.ts +0 -26
  142. package/src/core/helpers/element.ts +0 -55
  143. package/src/core/helpers/focus.ts +0 -92
  144. package/src/core/helpers/props.ts +0 -51
  145. package/src/core/helpers/scroll.ts +0 -15
  146. package/src/core/lib/createGlobalScopedContext.ts +0 -39
  147. package/src/core/lib/globalScope.ts +0 -19
  148. package/src/core/lib/isArray.ts +0 -3
  149. package/src/core/lib/isRecord.ts +0 -3
  150. package/src/core/types.ts +0 -57
  151. package/src/hooks/useClickOutsideEvent.test.tsx +0 -114
  152. package/src/hooks/useClickOutsideEvent.ts +0 -66
  153. package/src/hooks/useCustomValidity.ts +0 -13
  154. package/src/hooks/useElementSize.ts +0 -19
  155. package/src/hooks/useGlobalKeyDown.ts +0 -23
  156. package/src/hooks/useMatchMedia.ts +0 -28
  157. package/src/hooks/useMediaIndex/__workshop__/Test.tsx +0 -14
  158. package/src/hooks/useMediaIndex/__workshop__/index.ts +0 -16
  159. package/src/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -21
  160. package/src/hooks/useMediaIndex/useMediaIndex.ts +0 -111
  161. package/src/hooks/useMounted.ts +0 -15
  162. package/src/hooks/usePrefersDark.hydration.test.tsx +0 -56
  163. package/src/hooks/usePrefersDark.test.tsx +0 -20
  164. package/src/hooks/usePrefersDark.ts +0 -16
  165. package/src/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  166. package/src/hooks/usePrefersReducedMotion.test.tsx +0 -20
  167. package/src/hooks/usePrefersReducedMotion.ts +0 -16
  168. package/src/hooks/useResponsiveProp.ts +0 -14
  169. package/src/hooks/useUnique.ts +0 -54
  170. package/src/middleware/origin.ts +0 -47
  171. package/src/observers/elementSize.ts +0 -114
  172. package/src/primitives/_syntax/LazySyntax.tsx +0 -4
  173. package/src/primitives/_syntax/Syntax.tsx +0 -26
  174. package/src/primitives/avatar/Avatar.tsx +0 -145
  175. package/src/primitives/avatar/AvatarCounter.tsx +0 -69
  176. package/src/primitives/avatar/AvatarStack.tsx +0 -77
  177. package/src/primitives/avatar/__workshop__/AsButton.tsx +0 -12
  178. package/src/primitives/avatar/__workshop__/PropsStory.tsx +0 -24
  179. package/src/primitives/avatar/__workshop__/Stack.tsx +0 -27
  180. package/src/primitives/avatar/__workshop__/WithinButton.tsx +0 -51
  181. package/src/primitives/avatar/__workshop__/WithinMenuItem.tsx +0 -52
  182. package/src/primitives/avatar/__workshop__/index.ts +0 -36
  183. package/src/primitives/avatar/types.ts +0 -2
  184. package/src/primitives/badge/Badge.test.tsx +0 -16
  185. package/src/primitives/badge/Badge.tsx +0 -53
  186. package/src/primitives/badge/__workshop__/Props.tsx +0 -27
  187. package/src/primitives/badge/__workshop__/Tones.tsx +0 -15
  188. package/src/primitives/badge/__workshop__/index.ts +0 -26
  189. package/src/primitives/badge/__workshop__/within-button.tsx +0 -36
  190. package/src/primitives/box/Box.tsx +0 -73
  191. package/src/primitives/box/__workshop__/Props.tsx +0 -26
  192. package/src/primitives/box/__workshop__/Responsive.tsx +0 -19
  193. package/src/primitives/box/__workshop__/index.ts +0 -21
  194. package/src/primitives/button/Button.test.tsx +0 -30
  195. package/src/primitives/button/Button.tsx +0 -148
  196. package/src/primitives/button/__workshop__/Custom.tsx +0 -39
  197. package/src/primitives/button/__workshop__/CustomIcons.tsx +0 -37
  198. package/src/primitives/button/__workshop__/DataProps.tsx +0 -18
  199. package/src/primitives/button/__workshop__/Disabled.tsx +0 -43
  200. package/src/primitives/button/__workshop__/MixedChildren.tsx +0 -12
  201. package/src/primitives/button/__workshop__/Props.tsx +0 -60
  202. package/src/primitives/button/__workshop__/Stacked.tsx +0 -60
  203. package/src/primitives/button/__workshop__/Styled1.css.ts +0 -7
  204. package/src/primitives/button/__workshop__/Styled1.tsx +0 -11
  205. package/src/primitives/button/__workshop__/TextOverflow.tsx +0 -17
  206. package/src/primitives/button/__workshop__/UploadButton.tsx +0 -28
  207. package/src/primitives/button/__workshop__/index.ts +0 -61
  208. package/src/primitives/button/types.ts +0 -2
  209. package/src/primitives/card/Card.tsx +0 -124
  210. package/src/primitives/card/CardContext.ts +0 -10
  211. package/src/primitives/card/CardInternalContext.ts +0 -10
  212. package/src/primitives/card/CardInternalProvider.tsx +0 -15
  213. package/src/primitives/card/CardProvider.tsx +0 -16
  214. package/src/primitives/card/__workshop__/AsButton.tsx +0 -103
  215. package/src/primitives/card/__workshop__/AsComponent.tsx +0 -25
  216. package/src/primitives/card/__workshop__/Checkered.tsx +0 -25
  217. package/src/primitives/card/__workshop__/DataProps.tsx +0 -25
  218. package/src/primitives/card/__workshop__/Interactive.tsx +0 -29
  219. package/src/primitives/card/__workshop__/ListNavigation.tsx +0 -78
  220. package/src/primitives/card/__workshop__/Props.tsx +0 -59
  221. package/src/primitives/card/__workshop__/Selected.tsx +0 -62
  222. package/src/primitives/card/__workshop__/Styled.tsx +0 -11
  223. package/src/primitives/card/__workshop__/Tones.tsx +0 -26
  224. package/src/primitives/card/__workshop__/index.ts +0 -21
  225. package/src/primitives/card/types.ts +0 -21
  226. package/src/primitives/card/useCard.ts +0 -20
  227. package/src/primitives/checkbox/Checkbox.tsx +0 -80
  228. package/src/primitives/checkbox/__workshop__/Example.tsx +0 -25
  229. package/src/primitives/checkbox/__workshop__/Props.tsx +0 -35
  230. package/src/primitives/checkbox/__workshop__/ReadOnly.tsx +0 -16
  231. package/src/primitives/checkbox/__workshop__/Tones.tsx +0 -26
  232. package/src/primitives/checkbox/__workshop__/index.ts +0 -15
  233. package/src/primitives/code/Code.tsx +0 -47
  234. package/src/primitives/code/__workshop__/OpticalAlignment.tsx +0 -25
  235. package/src/primitives/code/__workshop__/Props.tsx +0 -20
  236. package/src/primitives/code/__workshop__/index.ts +0 -21
  237. package/src/primitives/container/Container.tsx +0 -43
  238. package/src/primitives/container/__workshop__/Example.tsx +0 -16
  239. package/src/primitives/container/__workshop__/index.ts +0 -16
  240. package/src/primitives/container/types.ts +0 -6
  241. package/src/primitives/flex/Flex.tsx +0 -38
  242. package/src/primitives/flex/__workshop__/Example.tsx +0 -26
  243. package/src/primitives/flex/__workshop__/Gap.tsx +0 -25
  244. package/src/primitives/flex/__workshop__/index.ts +0 -13
  245. package/src/primitives/flex/__workshop__/styles.css.ts +0 -12
  246. package/src/primitives/grid/Grid.tsx +0 -38
  247. package/src/primitives/grid/__workshop__/Responsive.tsx +0 -54
  248. package/src/primitives/grid/__workshop__/index.ts +0 -12
  249. package/src/primitives/heading/Heading.tsx +0 -68
  250. package/src/primitives/heading/__workshop__/OpticalAlignment.tsx +0 -27
  251. package/src/primitives/heading/__workshop__/Plain.tsx +0 -25
  252. package/src/primitives/heading/__workshop__/index.ts +0 -21
  253. package/src/primitives/inline/Inline.tsx +0 -37
  254. package/src/primitives/inline/__workshop__/Plain.tsx +0 -22
  255. package/src/primitives/inline/__workshop__/index.ts +0 -10
  256. package/src/primitives/kbd/Kbd.tsx +0 -36
  257. package/src/primitives/kbd/__workshop__/Plain.tsx +0 -9
  258. package/src/primitives/kbd/__workshop__/index.ts +0 -10
  259. package/src/primitives/label/Label.tsx +0 -67
  260. package/src/primitives/label/__workshop__/OpticalAlignment.tsx +0 -27
  261. package/src/primitives/label/__workshop__/Plain.tsx +0 -27
  262. package/src/primitives/label/__workshop__/index.ts +0 -21
  263. package/src/primitives/layer/Layer.test.tsx +0 -110
  264. package/src/primitives/layer/Layer.tsx +0 -35
  265. package/src/primitives/layer/LayerCard.tsx +0 -90
  266. package/src/primitives/layer/LayerContext.ts +0 -7
  267. package/src/primitives/layer/LayerProvider.tsx +0 -106
  268. package/src/primitives/layer/__workshop__/MultipleRoots.tsx +0 -49
  269. package/src/primitives/layer/__workshop__/Nested.tsx +0 -107
  270. package/src/primitives/layer/__workshop__/ResponsiveZOffset.tsx +0 -17
  271. package/src/primitives/layer/__workshop__/_debug.tsx +0 -17
  272. package/src/primitives/layer/__workshop__/index.ts +0 -26
  273. package/src/primitives/layer/getLayerContext.test.ts +0 -32
  274. package/src/primitives/layer/getLayerContext.ts +0 -21
  275. package/src/primitives/layer/types.ts +0 -9
  276. package/src/primitives/layer/useLayer.ts +0 -24
  277. package/src/primitives/popover/Popover.tsx +0 -291
  278. package/src/primitives/popover/PopoverLayer.tsx +0 -101
  279. package/src/primitives/popover/__workshop__/AlignedStory.tsx +0 -75
  280. package/src/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  281. package/src/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
  282. package/src/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  283. package/src/primitives/popover/__workshop__/PlainStory.tsx +0 -67
  284. package/src/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
  285. package/src/primitives/popover/__workshop__/SidePanelStory.tsx +0 -95
  286. package/src/primitives/popover/__workshop__/TestStory.tsx +0 -97
  287. package/src/primitives/popover/__workshop__/index.ts +0 -56
  288. package/src/primitives/popover/__workshop__/portal-inheritance.tsx +0 -15
  289. package/src/primitives/popover/constants.ts +0 -20
  290. package/src/primitives/popover/floating-ui/size.ts +0 -75
  291. package/src/primitives/popover/types.ts +0 -12
  292. package/src/primitives/popover/useMiddleware.ts +0 -126
  293. package/src/primitives/radio/Radio.tsx +0 -64
  294. package/src/primitives/radio/__workshop__/Example.tsx +0 -63
  295. package/src/primitives/radio/__workshop__/Plain.tsx +0 -28
  296. package/src/primitives/radio/__workshop__/index.ts +0 -13
  297. package/src/primitives/select/Select.tsx +0 -76
  298. package/src/primitives/select/__workshop__/Plain.tsx +0 -37
  299. package/src/primitives/select/__workshop__/ReadOnly.tsx +0 -23
  300. package/src/primitives/select/__workshop__/index.ts +0 -13
  301. package/src/primitives/selectable/Selectable.tsx +0 -48
  302. package/src/primitives/selectable/__workshop__/DataProps.tsx +0 -24
  303. package/src/primitives/selectable/__workshop__/as-link.tsx +0 -13
  304. package/src/primitives/selectable/__workshop__/index.ts +0 -19
  305. package/src/primitives/skeleton/CodeSkeleton.tsx +0 -49
  306. package/src/primitives/skeleton/HeadingSkeleton.tsx +0 -48
  307. package/src/primitives/skeleton/LabelSkeleton.tsx +0 -47
  308. package/src/primitives/skeleton/Skeleton.tsx +0 -70
  309. package/src/primitives/skeleton/TextSkeleton.tsx +0 -49
  310. package/src/primitives/skeleton/__workshop__/Delay.tsx +0 -69
  311. package/src/primitives/skeleton/__workshop__/Skeleton.tsx +0 -63
  312. package/src/primitives/skeleton/__workshop__/index.ts +0 -13
  313. package/src/primitives/spinner/Spinner.tsx +0 -45
  314. package/src/primitives/spinner/SpinnerAnimatedIcon.tsx +0 -14
  315. package/src/primitives/spinner/__workshop__/Props.tsx +0 -13
  316. package/src/primitives/spinner/__workshop__/index.ts +0 -16
  317. package/src/primitives/srOnly/SrOnly.tsx +0 -33
  318. package/src/primitives/stack/Stack.tsx +0 -38
  319. package/src/primitives/stack/__workshop__/Plain.tsx +0 -30
  320. package/src/primitives/stack/__workshop__/index.ts +0 -16
  321. package/src/primitives/switch/Switch.tsx +0 -76
  322. package/src/primitives/switch/__workshop__/Example.tsx +0 -25
  323. package/src/primitives/switch/__workshop__/Props.tsx +0 -23
  324. package/src/primitives/switch/__workshop__/index.ts +0 -13
  325. package/src/primitives/text/InlineCode.tsx +0 -25
  326. package/src/primitives/text/Text.tsx +0 -68
  327. package/src/primitives/text/__workshop__/Example.tsx +0 -26
  328. package/src/primitives/text/__workshop__/OpticalAlignment.tsx +0 -27
  329. package/src/primitives/text/__workshop__/index.ts +0 -26
  330. package/src/primitives/text/__workshop__/inline-code.tsx +0 -13
  331. package/src/primitives/textArea/TextArea.tsx +0 -97
  332. package/src/primitives/textArea/__workshop__/Plain.tsx +0 -46
  333. package/src/primitives/textArea/__workshop__/index.ts +0 -16
  334. package/src/primitives/textInput/TextInput.tsx +0 -279
  335. package/src/primitives/textInput/__workshop__/ClearButton.tsx +0 -32
  336. package/src/primitives/textInput/__workshop__/CustomValidity.tsx +0 -17
  337. package/src/primitives/textInput/__workshop__/Plain.tsx +0 -102
  338. package/src/primitives/textInput/__workshop__/ReadOnly.tsx +0 -14
  339. package/src/primitives/textInput/__workshop__/States.tsx +0 -53
  340. package/src/primitives/textInput/__workshop__/Tones.tsx +0 -40
  341. package/src/primitives/textInput/__workshop__/Typed.tsx +0 -23
  342. package/src/primitives/textInput/__workshop__/index.ts +0 -46
  343. package/src/primitives/tooltip/Tooltip.test.tsx +0 -496
  344. package/src/primitives/tooltip/Tooltip.tsx +0 -546
  345. package/src/primitives/tooltip/TooltipLayer.tsx +0 -72
  346. package/src/primitives/tooltip/__workshop__/CustomPortal.tsx +0 -102
  347. package/src/primitives/tooltip/__workshop__/OverflowingBoundary.tsx +0 -74
  348. package/src/primitives/tooltip/__workshop__/Props.tsx +0 -107
  349. package/src/primitives/tooltip/__workshop__/ResizableBoundary.tsx +0 -91
  350. package/src/primitives/tooltip/__workshop__/index.ts +0 -31
  351. package/src/primitives/tooltip/constants.ts +0 -24
  352. package/src/primitives/tooltip/tooltipDelayGroup/TooltipDelayGroupContext.tsx +0 -13
  353. package/src/primitives/tooltip/tooltipDelayGroup/TooltipDelayGroupProvider.tsx +0 -96
  354. package/src/primitives/tooltip/tooltipDelayGroup/types.ts +0 -7
  355. package/src/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  356. package/src/root/Root.tsx +0 -93
  357. package/src/root/RootProvider.tsx +0 -37
  358. package/src/root/__workshop__/Boundary.tsx +0 -43
  359. package/src/root/__workshop__/index.ts +0 -24
  360. package/src/root/__workshop__/primitives.tsx +0 -49
  361. package/src/root/__workshop__/tone-inheritance.tsx +0 -65
  362. package/src/utils/ErrorBoundary.tsx +0 -50
  363. package/src/utils/boundaryElement/BoundaryElementContext.ts +0 -7
  364. package/src/utils/boundaryElement/BoundaryElementProvider.tsx +0 -16
  365. package/src/utils/boundaryElement/__workshop__/Plain.tsx +0 -49
  366. package/src/utils/boundaryElement/__workshop__/index.ts +0 -16
  367. package/src/utils/boundaryElement/types.ts +0 -2
  368. package/src/utils/boundaryElement/useBoundaryElement.ts +0 -12
  369. package/src/utils/elementQuery/ElementQuery.tsx +0 -75
  370. package/src/utils/elementQuery/__workshop__/CustomMedia.tsx +0 -19
  371. package/src/utils/elementQuery/__workshop__/index.ts +0 -16
  372. package/src/utils/elementQuery/__workshop__/styles.css.ts +0 -31
  373. package/src/utils/elementQuery/helpers.ts +0 -27
  374. package/src/utils/portal/Portal.test.tsx +0 -105
  375. package/src/utils/portal/Portal.tsx +0 -42
  376. package/src/utils/portal/PortalContext.ts +0 -37
  377. package/src/utils/portal/PortalProvider.tsx +0 -38
  378. package/src/utils/portal/__workshop__/Named.tsx +0 -69
  379. package/src/utils/portal/__workshop__/index.ts +0 -16
  380. package/src/utils/portal/types.ts +0 -7
  381. package/src/utils/portal/usePortal.ts +0 -30
@@ -1,174 +0,0 @@
1
- import {menu, type PaddingStyleProps, type ResponsiveProp} from '@sanity/ui-css'
2
- import type {Space} from '@sanity/ui-tokens'
3
- import {useCallback, useEffect, useImperativeHandle, useMemo, useRef} from 'react'
4
-
5
- import type {ComponentType, Props} from '../../core/types'
6
- import {useClickOutsideEvent} from '../../hooks/useClickOutsideEvent'
7
- import {useGlobalKeyDown} from '../../hooks/useGlobalKeyDown'
8
- import {Box} from '../../primitives/box/Box'
9
- import {useLayer} from '../../primitives/layer/useLayer'
10
- import {Stack} from '../../primitives/stack/Stack'
11
- import {MenuContext, type MenuContextValue} from './MenuContext'
12
- import {useMenuController} from './useMenuController'
13
-
14
- /** @public */
15
- export const DEFAULT_MENU_ELEMENT = 'div'
16
-
17
- /** @public */
18
- export type MenuOwnProps = PaddingStyleProps & {
19
- 'gap'?: ResponsiveProp<Space>
20
- 'onClickOutside'?: (event: MouseEvent) => void
21
- 'onEscape'?: () => void
22
- 'onItemClick'?: (event: React.MouseEvent<HTMLButtonElement>) => void
23
- 'onItemSelect'?: (index: number) => void
24
- 'originElement'?: HTMLElement | null
25
- 'registerElement'?: (el: HTMLElement) => () => void
26
- 'shouldFocus'?: 'first' | 'last' | null
27
- 'aria-labelledby'?: string
28
- }
29
-
30
- /** @public */
31
- export type MenuElementType = 'div' | 'span' | ComponentType
32
-
33
- /** @public */
34
- export type MenuProps<E extends MenuElementType = MenuElementType> = Props<MenuOwnProps, E>
35
-
36
- /**
37
- * The `Menu` component is a building block for application menus.
38
- *
39
- * @public
40
- */
41
- export function Menu<E extends MenuElementType = typeof DEFAULT_MENU_ELEMENT>(
42
- props: MenuProps<E>,
43
- ): React.JSX.Element {
44
- const {
45
- as = DEFAULT_MENU_ELEMENT,
46
- children,
47
- className,
48
- gap = 1,
49
- onClickOutside,
50
- onEscape,
51
- onItemClick,
52
- onItemSelect,
53
- onKeyDown,
54
- originElement,
55
- padding = 1,
56
- ref: forwardedRef,
57
- registerElement,
58
- shouldFocus: _shouldFocus,
59
- ...rest
60
- } = props as MenuProps<typeof DEFAULT_MENU_ELEMENT>
61
-
62
- const shouldFocus = _shouldFocus ?? null
63
-
64
- const ref = useRef<HTMLDivElement | null>(null)
65
-
66
- useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)
67
-
68
- const {isTopLayer} = useLayer()
69
-
70
- const {
71
- activeElement,
72
- activeIndex,
73
- handleItemMouseEnter,
74
- handleItemMouseLeave,
75
- handleKeyDown,
76
- mount,
77
- } = useMenuController({
78
- onKeyDown,
79
- originElement,
80
- shouldFocus,
81
- rootElementRef: ref,
82
- })
83
-
84
- const unregisterElementRef = useRef<(() => void) | null>(null)
85
- const handleRefChange = useCallback(
86
- (el: HTMLDivElement | null) => {
87
- // Run cleanup of previously registered elements
88
- if (unregisterElementRef.current) {
89
- // The `registerElement` callback were originally used in a `useEffect`, so it returns a cleanup function that is a bit gnarly to handle in a ref callback.
90
- // Since we can't change the `registerElement` implementation itself without making breaking change,
91
- // that is explained in the code comments for createGlobalScopedContext.tsx,
92
- // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.
93
- unregisterElementRef.current()
94
- unregisterElementRef.current = null
95
- }
96
-
97
- ref.current = el
98
-
99
- // Register root element (for nested menus)
100
- if (ref.current && registerElement) {
101
- unregisterElementRef.current = registerElement(ref.current)
102
- }
103
- },
104
- [registerElement],
105
- )
106
-
107
- // Trigger `onItemSelect` when active index changes
108
- useEffect(() => {
109
- if (onItemSelect) onItemSelect(activeIndex)
110
- }, [activeIndex, onItemSelect])
111
-
112
- // Close menu when clicking outside
113
- useClickOutsideEvent(isTopLayer && onClickOutside, () => [ref.current])
114
-
115
- // Close menu when pressing Escape
116
- useGlobalKeyDown(
117
- useCallback(
118
- (event) => {
119
- if (!isTopLayer) return
120
-
121
- if (event.key === 'Escape') {
122
- event.stopPropagation()
123
- if (onEscape) onEscape()
124
- }
125
- },
126
- [isTopLayer, onEscape],
127
- ),
128
- )
129
-
130
- const value = useMemo(
131
- () =>
132
- ({
133
- version: 2,
134
- activeElement,
135
- mount,
136
- onClickOutside,
137
- onEscape,
138
- onItemClick,
139
- onItemMouseEnter: handleItemMouseEnter,
140
- onItemMouseLeave: handleItemMouseLeave,
141
- registerElement,
142
- }) satisfies MenuContextValue,
143
- [
144
- activeElement,
145
- mount,
146
- handleItemMouseEnter,
147
- handleItemMouseLeave,
148
- onClickOutside,
149
- onEscape,
150
- onItemClick,
151
- registerElement,
152
- ],
153
- )
154
-
155
- return (
156
- <MenuContext value={value}>
157
- <Box
158
- data-ui="Menu"
159
- {...rest}
160
- ref={handleRefChange}
161
- as={as}
162
- className={menu({className})}
163
- outline="none"
164
- overflow="auto"
165
- padding={padding}
166
- role="menu"
167
- tabIndex={-1}
168
- onKeyDown={handleKeyDown}
169
- >
170
- <Stack gap={gap}>{children}</Stack>
171
- </Box>
172
- </MenuContext>
173
- )
174
- }
@@ -1,231 +0,0 @@
1
- import {
2
- cloneElement,
3
- type FocusEvent,
4
- type ForwardedRef,
5
- type KeyboardEvent,
6
- type MouseEvent as ReactMouseEvent,
7
- type ReactElement,
8
- useCallback,
9
- useEffect,
10
- useImperativeHandle,
11
- useMemo,
12
- useRef,
13
- useState,
14
- } from 'react'
15
-
16
- import type {Props} from '../../core/types'
17
- import type {ButtonProps} from '../../primitives/button/Button'
18
- import {Popover, type PopoverProps} from '../../primitives/popover/Popover'
19
- import type {MenuProps} from './Menu'
20
-
21
- /** @public */
22
- export type MenuButtonProps = {
23
- /**
24
- * @beta Do not use in production.
25
- */
26
- __unstable_disableRestoreFocusOnClose?: boolean
27
- button: ReactElement<ButtonProps>
28
- id: string
29
- menu?: ReactElement
30
- onClose?: () => void
31
- onOpen?: () => void
32
- popover?: Omit<PopoverProps, 'content' | 'open'>
33
-
34
- ref?: ForwardedRef<HTMLButtonElement | null>
35
- }
36
-
37
- /**
38
- * The `MenuButton` component follows the WAI-ARIA specification for menu buttons.
39
- *
40
- * @public
41
- */
42
- export function MenuButton(props: MenuButtonProps): React.JSX.Element {
43
- const {
44
- __unstable_disableRestoreFocusOnClose: disableRestoreFocusOnClose = false,
45
- button: buttonProp,
46
- id,
47
- menu: menuProp,
48
- onClose,
49
- onOpen,
50
- popover,
51
- ref: forwardedRef,
52
- } = props
53
- const [open, setOpen] = useState(false)
54
- const [shouldFocus, setShouldFocus] = useState<'first' | 'last' | null>(null)
55
- const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)
56
- const [menuElements, setChildMenuElements] = useState<HTMLElement[]>([])
57
- const openRef = useRef<boolean>(open)
58
-
59
- // Notify consumers when the menu opens
60
- useEffect(() => {
61
- if (onOpen && open && !openRef.current) {
62
- onOpen()
63
- }
64
- }, [onOpen, open])
65
-
66
- // Notify consumers when the menu closes
67
- useEffect(() => {
68
- if (onClose && !open && openRef.current) {
69
- onClose()
70
- }
71
- }, [onClose, open])
72
-
73
- useEffect(() => {
74
- openRef.current = open
75
- }, [open])
76
-
77
- const handleButtonClick = useCallback((event: ReactMouseEvent<HTMLElement>) => {
78
- event.preventDefault()
79
- setOpen((v) => !v)
80
- setShouldFocus(null)
81
- }, [])
82
-
83
- // Prevent mouse event propagation when the menu is open.
84
- // This is to ensure that `handleBlur` isn't triggered when clicking the menu button whilst open,
85
- // which can lead to `setOpen` being triggered multiple times (once by `handleBlur`, and again by `handleButtonClick`).
86
- const handleMouseDown = useCallback(
87
- (event: ReactMouseEvent<HTMLElement>) => {
88
- if (open) event.preventDefault()
89
- },
90
- [open],
91
- )
92
-
93
- const handleButtonKeyDown = useCallback((event: KeyboardEvent<HTMLButtonElement>) => {
94
- // On `ArrowDown`, `Enter` and `Space`
95
- // - Opens menu and moves focus to first menuitem
96
- if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {
97
- event.preventDefault()
98
- setOpen(true)
99
- setShouldFocus('first')
100
-
101
- return
102
- }
103
-
104
- // On `ArrowUp`
105
- // - Opens menu and moves focus to last menuitem
106
- if (event.key === 'ArrowUp') {
107
- event.preventDefault()
108
- setOpen(true)
109
- setShouldFocus('last')
110
-
111
- return
112
- }
113
- }, [])
114
-
115
- const handleMenuClickOutside = useCallback(
116
- (event: MouseEvent) => {
117
- const target = event.target
118
-
119
- if (!(target instanceof Node)) {
120
- return
121
- }
122
-
123
- if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {
124
- return
125
- }
126
-
127
- for (const el of menuElements) {
128
- if (target === el || el.contains(target)) {
129
- return
130
- }
131
- }
132
-
133
- setOpen(false)
134
- },
135
- [buttonElement, menuElements],
136
- )
137
-
138
- const handleMenuEscape = useCallback(() => {
139
- setOpen(false)
140
- if (disableRestoreFocusOnClose) return
141
- if (buttonElement) buttonElement.focus()
142
- }, [buttonElement, disableRestoreFocusOnClose])
143
-
144
- const handleBlur = useCallback(
145
- (event: FocusEvent<HTMLDivElement>) => {
146
- const target = event.relatedTarget
147
-
148
- if (!(target instanceof Node)) {
149
- return
150
- }
151
-
152
- for (const el of menuElements) {
153
- if (el === target || el.contains(target)) {
154
- return
155
- }
156
- }
157
-
158
- setOpen(false)
159
- },
160
- [menuElements],
161
- )
162
-
163
- const handleItemClick = useCallback(
164
- (e: ReactMouseEvent<HTMLButtonElement>) => {
165
- if (e.defaultPrevented) return
166
-
167
- setOpen(false)
168
- if (disableRestoreFocusOnClose) return
169
- if (buttonElement) buttonElement.focus()
170
- },
171
- [buttonElement, disableRestoreFocusOnClose],
172
- )
173
-
174
- const registerElement = useCallback((el: HTMLElement) => {
175
- setChildMenuElements((els) => els.concat([el]))
176
-
177
- return () => setChildMenuElements((els) => els.filter((_el) => _el !== el))
178
- }, [])
179
-
180
- const menuProps: Props<MenuProps, 'div'> = {
181
- 'aria-labelledby': id,
182
- 'onBlurCapture': handleBlur,
183
- 'onClickOutside': handleMenuClickOutside,
184
- 'onEscape': handleMenuEscape,
185
- 'onItemClick': handleItemClick,
186
- 'originElement': buttonElement,
187
- registerElement,
188
- shouldFocus,
189
- }
190
-
191
- const menu = menuProp && cloneElement(menuProp, menuProps)
192
-
193
- const button = useMemo(() => {
194
- if (!buttonProp) return null
195
-
196
- const buttonProps: ButtonProps = {
197
- 'data-ui': 'MenuButton',
198
- id,
199
- 'onClick': handleButtonClick,
200
- 'onKeyDown': handleButtonKeyDown,
201
- 'onMouseDown': handleMouseDown,
202
- 'aria-haspopup': true,
203
- 'aria-expanded': open,
204
- 'ref': setButtonElement,
205
- 'selected': buttonProp.props.selected ?? open,
206
- 'tooltip': open ? undefined : buttonProp.props.tooltip,
207
- }
208
-
209
- return cloneElement(buttonProp, buttonProps)
210
- }, [buttonProp, handleButtonClick, handleButtonKeyDown, handleMouseDown, id, open])
211
-
212
- // Forward button ref to parent
213
- useImperativeHandle<HTMLButtonElement | null, HTMLButtonElement | null>(
214
- forwardedRef,
215
- () => buttonElement,
216
- [buttonElement],
217
- )
218
-
219
- return (
220
- <Popover
221
- data-ui="MenuButton__popover"
222
- overflow="auto"
223
- placement="bottom-start"
224
- {...popover}
225
- content={menu}
226
- open={open}
227
- >
228
- {button || <></>}
229
- </Popover>
230
- )
231
- }
@@ -1,19 +0,0 @@
1
- import {type Context, type MouseEvent as ReactMouseEvent} from 'react'
2
-
3
- import {createGlobalScopedContext} from '../../core/lib/createGlobalScopedContext'
4
-
5
- /** @internal */
6
- export interface MenuContextValue {
7
- version: 2
8
- activeElement: HTMLElement | null
9
- mount: (element: HTMLElement | null, selected?: boolean) => () => void
10
- onClickOutside?: (event: MouseEvent) => void
11
- onEscape?: () => void
12
- onItemClick?: (event: ReactMouseEvent<HTMLButtonElement>) => void
13
- onItemMouseEnter?: (event: ReactMouseEvent<HTMLElement>) => void
14
- onItemMouseLeave?: (event: ReactMouseEvent<HTMLElement>) => void
15
- registerElement?: (el: HTMLElement) => () => void
16
- }
17
-
18
- export const MenuContext: Context<MenuContextValue | null> =
19
- createGlobalScopedContext<MenuContextValue | null>('@sanity/ui/v4/menu', null)
@@ -1,32 +0,0 @@
1
- import {menu_divider} from '@sanity/ui-css'
2
-
3
- import type {ComponentType, Props} from '../../core/types'
4
-
5
- /** @public */
6
- export const DEFAULT_MENU_DIVIDER_ELEMENT = 'hr'
7
-
8
- /** @public */
9
- // eslint-disable-next-line @typescript-eslint/no-empty-object-type
10
- export type MenuDividerOwnProps = {}
11
-
12
- /** @public */
13
- export type MenuDividerElementType = 'div' | 'hr' | 'span' | ComponentType
14
-
15
- /** @public */
16
- export type MenuDividerProps<E extends MenuDividerElementType = MenuDividerElementType> = Props<
17
- MenuDividerOwnProps,
18
- E
19
- >
20
-
21
- /** @public */
22
- export function MenuDivider<E extends MenuDividerElementType = typeof DEFAULT_MENU_DIVIDER_ELEMENT>(
23
- props: MenuDividerProps<E>,
24
- ): React.JSX.Element {
25
- const {
26
- as: Element = DEFAULT_MENU_DIVIDER_ELEMENT,
27
- className,
28
- ...rest
29
- } = props as MenuDividerProps<typeof DEFAULT_MENU_DIVIDER_ELEMENT>
30
-
31
- return <Element {...rest} className={menu_divider({className})} />
32
- }
@@ -1,240 +0,0 @@
1
- import {ChevronRightIcon} from '@sanity/icons'
2
- import type {RadiusStyleProps, ResponsiveProp} from '@sanity/ui-css'
3
- import type {ElementTone, FontTextSize, Space} from '@sanity/ui-tokens'
4
- import {
5
- type ElementType,
6
- isValidElement,
7
- type KeyboardEvent,
8
- type MouseEvent,
9
- type ReactNode,
10
- useCallback,
11
- useEffect,
12
- useState,
13
- } from 'react'
14
- import {isValidElementType} from 'react-is'
15
-
16
- import type {ComponentType, Props} from '../../core/types'
17
- import {Box} from '../../primitives/box/Box'
18
- import {Flex} from '../../primitives/flex/Flex'
19
- import {Popover, type PopoverProps} from '../../primitives/popover/Popover'
20
- import {Selectable} from '../../primitives/selectable/Selectable'
21
- import {Text} from '../../primitives/text/Text'
22
- import {DEFAULT_MENU_ELEMENT, Menu, type MenuProps} from './Menu'
23
- import {useMenu} from './useMenu'
24
-
25
- /** @public */
26
- export const DEFAULT_MENU_GROUP_ELEMENT = 'button'
27
-
28
- /** @public */
29
- export type MenuGroupOwnProps = RadiusStyleProps & {
30
- disabled?: boolean
31
- fontSize?: ResponsiveProp<FontTextSize>
32
- gap?: ResponsiveProp<Space>
33
- icon?: ElementType | ReactNode
34
- menu?: Omit<
35
- MenuProps<typeof DEFAULT_MENU_ELEMENT>,
36
- | 'onClickOutside'
37
- | 'onEscape'
38
- | 'onItemClick'
39
- | 'onKeyDown'
40
- | 'onMouseEnter'
41
- | 'registerElement'
42
- | 'shouldFocus'
43
- | 'onBlurCapture'
44
- >
45
- padding?: ResponsiveProp<Space>
46
- popover?: Omit<PopoverProps, 'content' | 'open'>
47
- text?: ReactNode
48
- tone?: ElementTone
49
- }
50
-
51
- /** @public */
52
- export type MenuGroupElementType = 'button' | ComponentType
53
-
54
- /** @public */
55
- export type MenuGroupProps<E extends MenuGroupElementType = MenuGroupElementType> = Props<
56
- MenuGroupOwnProps,
57
- E
58
- >
59
-
60
- /** @public */
61
- export function MenuGroup<E extends MenuGroupElementType = typeof DEFAULT_MENU_GROUP_ELEMENT>(
62
- props: MenuGroupProps<E>,
63
- ): React.JSX.Element {
64
- const {
65
- as = DEFAULT_MENU_GROUP_ELEMENT,
66
- children,
67
- fontSize = 1,
68
- gap = 3,
69
- icon: IconComponent,
70
- menu: menuProps,
71
- onClick,
72
- padding = 3,
73
- popover,
74
- radius = 2,
75
- text,
76
- tone = 'default',
77
- ...rest
78
- } = props as MenuGroupProps<typeof DEFAULT_MENU_GROUP_ELEMENT>
79
-
80
- const {
81
- activeElement,
82
- mount,
83
- onClickOutside,
84
- onEscape,
85
- onItemClick,
86
- onItemMouseEnter,
87
- registerElement,
88
- } = useMenu()
89
-
90
- const [rootElement, setRootElement] = useState<HTMLButtonElement | HTMLDivElement | null>(null)
91
- const [open, setOpen] = useState(false)
92
- const [shouldFocus, setShouldFocus] = useState<'first' | 'last' | null>(null)
93
- const active = Boolean(activeElement) && activeElement === rootElement
94
- const [withinMenu, setWithinMenu] = useState(false)
95
-
96
- const handleMouseEnter = useCallback(
97
- (event: MouseEvent<HTMLElement>) => {
98
- setWithinMenu(false)
99
- onItemMouseEnter?.(event)
100
- setOpen(true)
101
- },
102
- [onItemMouseEnter],
103
- )
104
-
105
- const handleMenuKeyDown = useCallback(
106
- (event: KeyboardEvent<HTMLDivElement>) => {
107
- if (event.key === 'ArrowLeft') {
108
- event.stopPropagation()
109
-
110
- setOpen(false)
111
-
112
- requestAnimationFrame(() => {
113
- rootElement?.focus()
114
- })
115
- }
116
- },
117
- [rootElement],
118
- )
119
-
120
- const handleClick = useCallback(
121
- (event: MouseEvent<HTMLButtonElement>) => {
122
- onClick?.(event)
123
-
124
- setShouldFocus('first')
125
- setOpen(true)
126
- },
127
- [onClick],
128
- )
129
-
130
- const handleChildItemClick = useCallback(
131
- (e: MouseEvent<HTMLButtonElement>) => {
132
- setOpen(false)
133
- onItemClick?.(e)
134
- },
135
- [onItemClick],
136
- )
137
-
138
- const handleMenuMouseEnter = useCallback(() => setWithinMenu(true), [])
139
-
140
- // Register the menu item element
141
- useEffect(() => mount(rootElement), [mount, rootElement])
142
-
143
- // Close child menu when a sibling item becomes active
144
- useEffect(() => {
145
- // eslint-disable-next-line react-hooks/set-state-in-effect
146
- if (!active) setOpen(false)
147
- }, [active])
148
-
149
- // Update state when child menu is no longer open
150
- useEffect(() => {
151
- // eslint-disable-next-line react-hooks/set-state-in-effect
152
- if (!open) setWithinMenu(false)
153
- }, [open])
154
-
155
- // Reset the shouldFocus state after it has been used
156
- useEffect(() => {
157
- if (!shouldFocus) return
158
- // The useMenuController effect that handles `shouldFocus` schedules a request animation frame where it's processed.
159
- // By doing the same here, we ensure that the reset is processed after the focus change.
160
- const rafId = requestAnimationFrame(() => setShouldFocus(null))
161
-
162
- return () => cancelAnimationFrame(rafId)
163
- }, [shouldFocus])
164
-
165
- const childMenu = (
166
- <Menu
167
- {...menuProps}
168
- registerElement={registerElement}
169
- shouldFocus={shouldFocus}
170
- onClickOutside={onClickOutside}
171
- onEscape={onEscape}
172
- onItemClick={handleChildItemClick}
173
- onKeyDown={handleMenuKeyDown}
174
- onMouseEnter={handleMenuMouseEnter}
175
- >
176
- {children}
177
- </Menu>
178
- )
179
-
180
- const handleKeyDown = useCallback((event: KeyboardEvent<HTMLButtonElement>) => {
181
- const target = event.currentTarget
182
-
183
- if (document.activeElement !== target) {
184
- return
185
- }
186
-
187
- if (event.key === 'ArrowRight') {
188
- setShouldFocus('first')
189
- setOpen(true)
190
- setWithinMenu(true)
191
-
192
- return
193
- }
194
- }, [])
195
-
196
- return (
197
- <Popover
198
- __unstable_shift={-4}
199
- data-ui="MenuGroup__popover"
200
- {...popover}
201
- content={childMenu}
202
- open={open}
203
- >
204
- <Selectable
205
- data-ui="MenuGroup"
206
- {...rest}
207
- ref={setRootElement}
208
- aria-pressed={as === 'button' ? withinMenu : undefined}
209
- as={as}
210
- radius={radius}
211
- selected={withinMenu}
212
- tabIndex={-1}
213
- tone={tone}
214
- type={as === 'button' ? 'button' : undefined}
215
- onClick={handleClick}
216
- onKeyDown={handleKeyDown}
217
- onMouseEnter={handleMouseEnter}
218
- >
219
- <Flex gap={gap} padding={padding}>
220
- {IconComponent && (
221
- <Text size={fontSize}>
222
- {isValidElement(IconComponent) && IconComponent}
223
- {isValidElementType(IconComponent) && <IconComponent />}
224
- </Text>
225
- )}
226
-
227
- <Box flex={1}>
228
- <Text size={fontSize} textOverflow="ellipsis" weight="medium">
229
- {text}
230
- </Text>
231
- </Box>
232
-
233
- <Text size={fontSize}>
234
- <ChevronRightIcon />
235
- </Text>
236
- </Flex>
237
- </Selectable>
238
- </Popover>
239
- )
240
- }