@sanity/ui 2.6.7-canary.0 → 2.6.8-canary.0

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 (36) hide show
  1. package/dist/index.d.mts +6 -42
  2. package/dist/index.d.ts +6 -42
  3. package/dist/index.esm.js +158 -87
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +157 -86
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +158 -87
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +1 -1
  10. package/src/core/components/breadcrumbs/breadcrumbs.tsx +6 -15
  11. package/src/core/components/dialog/dialog.tsx +21 -12
  12. package/src/core/components/menu/menu.tsx +18 -11
  13. package/src/core/components/menu/menuButton.tsx +1 -1
  14. package/src/core/components/menu/menuContext.ts +1 -1
  15. package/src/core/components/menu/useMenuController.ts +17 -11
  16. package/src/core/components/toast/styles.ts +1 -2
  17. package/src/core/components/toast/useToast.ts +0 -1
  18. package/src/core/components/tree/tree.tsx +0 -1
  19. package/src/core/components/tree/treeItem.tsx +0 -1
  20. package/src/core/helpers/focus.ts +0 -1
  21. package/src/core/helpers/scroll.ts +0 -1
  22. package/src/core/hooks/_internal/index.ts +1 -0
  23. package/src/core/hooks/_internal/useUnique.ts +34 -0
  24. package/src/core/hooks/index.ts +2 -3
  25. package/src/core/hooks/useClickOutside.ts +72 -38
  26. package/src/core/hooks/useElementSize.ts +0 -1
  27. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +10 -2
  28. package/src/core/hooks/usePrefersDark.ts +55 -10
  29. package/src/core/hooks/usePrefersReducedMotion.ts +56 -10
  30. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +7 -9
  31. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +6 -8
  32. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -1
  33. package/src/core/utils/layer/layerProvider.tsx +0 -1
  34. package/src/core/utils/portal/__workshop__/named.tsx +8 -10
  35. package/src/core/utils/portal/portalProvider.tsx +13 -7
  36. package/src/core/hooks/useMatchMedia.ts +0 -46
package/dist/index.js CHANGED
@@ -126,26 +126,45 @@ function useArrayProp(val, defaultVal) {
126
126
  [__perf_hash__]
127
127
  );
128
128
  }
129
+ function _getElements(element, elementsArg) {
130
+ const ret = [element];
131
+ for (const el of elementsArg)
132
+ Array.isArray(el) ? ret.push(...el) : ret.push(el);
133
+ return ret.filter(Boolean);
134
+ }
129
135
  function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
130
- const eventHandler = useEffectEvent.useEffectEvent((evt) => {
131
- const target = evt.target;
132
- if (!(target instanceof Node) || boundaryElement && !boundaryElement.contains(target))
136
+ const [element, setElement] = react.useState(null), [elements, setElements] = react.useState(() => _getElements(element, elementsArg)), elementsRef = react.useRef(elements);
137
+ return react.useEffect(() => {
138
+ const prevElements = elementsRef.current, nextElements = _getElements(element, elementsArg);
139
+ if (prevElements.length !== nextElements.length) {
140
+ setElements(nextElements), elementsRef.current = nextElements;
133
141
  return;
134
- const elements = (Array.isArray(elementsArg) ? elementsArg : elementsArg()).flat();
135
- for (const el of elements)
136
- if (el && (target === el || el.contains(target)))
142
+ }
143
+ for (const el of prevElements)
144
+ if (!nextElements.includes(el)) {
145
+ setElements(nextElements), elementsRef.current = nextElements;
137
146
  return;
138
- listener(evt);
139
- });
140
- react.useEffect(() => (document.addEventListener("mousedown", eventHandler), document.addEventListener("touchstart", eventHandler), () => {
141
- document.removeEventListener("mousedown", eventHandler), document.removeEventListener("touchstart", eventHandler);
142
- }), [eventHandler]);
143
- }
144
- function useCustomValidity(ref, customValidity) {
145
- react.useEffect(() => {
146
- var _a;
147
- (_a = ref.current) == null || _a.setCustomValidity(customValidity || "");
148
- }, [customValidity, ref]);
147
+ }
148
+ for (const el of nextElements)
149
+ if (!prevElements.includes(el)) {
150
+ setElements(nextElements), elementsRef.current = nextElements;
151
+ return;
152
+ }
153
+ }, [element, elementsArg]), react.useEffect(() => {
154
+ if (!listener) return;
155
+ const handleWindowMouseDown = (evt) => {
156
+ const target = evt.target;
157
+ if (target instanceof Node && !(boundaryElement && !boundaryElement.contains(target))) {
158
+ for (const el of elements)
159
+ if (target === el || el.contains(target))
160
+ return;
161
+ listener(evt);
162
+ }
163
+ };
164
+ return window.addEventListener("mousedown", handleWindowMouseDown), () => {
165
+ window.removeEventListener("mousedown", handleWindowMouseDown);
166
+ };
167
+ }, [boundaryElement, listener, elements]), setElement;
149
168
  }
150
169
  var resizeObservers = [], hasActiveObservations = function() {
151
170
  return resizeObservers.some(function(ro) {
@@ -480,27 +499,9 @@ function useElementRect(element) {
480
499
  const elementSize = useElementSize(element);
481
500
  return (elementSize == null ? void 0 : elementSize._contentRect) || null;
482
501
  }
483
- function useForwardedRef(ref) {
484
- const innerRef = react.useRef(null);
485
- return react.useImperativeHandle(ref, () => innerRef.current), innerRef;
486
- }
487
502
  function useGlobalKeyDown(onKeyDown) {
488
503
  return react.useEffect(() => (addEventListener("keydown", onKeyDown), () => removeEventListener("keydown", onKeyDown)), [onKeyDown]);
489
504
  }
490
- function useMatchMedia(mediaQueryString, getServerSnapshot2) {
491
- const { subscribe: subscribe2, getSnapshot } = react.useMemo(() => {
492
- let MEDIA_QUERY_CACHE;
493
- const getMatchMedia = () => (MEDIA_QUERY_CACHE || (MEDIA_QUERY_CACHE = window.matchMedia(mediaQueryString)), MEDIA_QUERY_CACHE);
494
- return {
495
- subscribe: (onStoreChange) => {
496
- const matchMedia = getMatchMedia();
497
- return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
498
- },
499
- getSnapshot: () => getMatchMedia().matches
500
- };
501
- }, [mediaQueryString]);
502
- return react.useDebugValue(mediaQueryString), react.useSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot2);
503
- }
504
505
  function getGlobalScope() {
505
506
  if (typeof globalThis < "u") return globalThis;
506
507
  if (typeof window < "u") return window;
@@ -543,6 +544,7 @@ function useTheme() {
543
544
  function useTheme_v2() {
544
545
  return theme.getTheme_v2(styledComponents.useTheme());
545
546
  }
547
+ const MEDIA_STORE_CACHE = /* @__PURE__ */ new WeakMap();
546
548
  function _getMediaQuery(media, index) {
547
549
  return index === 0 ? `screen and (max-width: ${media[index] - 1}px)` : index === media.length ? `screen and (min-width: ${media[index - 1]}px)` : `screen and (min-width: ${media[index - 1]}px) and (max-width: ${media[index] - 1}px)`;
548
550
  }
@@ -577,18 +579,57 @@ function _createMediaStore(media) {
577
579
  };
578
580
  } };
579
581
  }
580
- function getServerSnapshot() {
582
+ function getServerSnapshot$2() {
581
583
  return 0;
582
584
  }
583
585
  function useMediaIndex() {
584
- const { media } = useTheme_v2(), store = react.useMemo(() => _createMediaStore(media), [media]);
585
- return react.useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot);
586
+ const { media } = useTheme_v2();
587
+ let store = MEDIA_STORE_CACHE.get(media);
588
+ return store || (store = _createMediaStore(media), MEDIA_STORE_CACHE.set(media, store)), react.useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot$2);
589
+ }
590
+ let MEDIA_QUERY_CACHE$1;
591
+ function getMatchMedia$1() {
592
+ return MEDIA_QUERY_CACHE$1 || (MEDIA_QUERY_CACHE$1 = window.matchMedia("(prefers-color-scheme: dark)")), MEDIA_QUERY_CACHE$1;
593
+ }
594
+ function subscribe$2(onStoreChange) {
595
+ const matchMedia = getMatchMedia$1();
596
+ return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
597
+ }
598
+ function getSnapshot$1() {
599
+ return getMatchMedia$1().matches;
600
+ }
601
+ function getServerSnapshot$1() {
602
+ return !1;
603
+ }
604
+ function usePrefersDark() {
605
+ return react.useSyncExternalStore(subscribe$2, getSnapshot$1, getServerSnapshot$1);
586
606
  }
587
- function usePrefersDark(getServerSnapshot2 = () => !1) {
588
- return useMatchMedia("(prefers-color-scheme: dark)", getServerSnapshot2);
607
+ let MEDIA_QUERY_CACHE;
608
+ function getMatchMedia() {
609
+ return MEDIA_QUERY_CACHE || (MEDIA_QUERY_CACHE = window.matchMedia("(prefers-reduced-motion: reduce)")), MEDIA_QUERY_CACHE;
589
610
  }
590
- function usePrefersReducedMotion(getServerSnapshot2 = () => !1) {
591
- return useMatchMedia("(prefers-reduced-motion: reduce)", getServerSnapshot2);
611
+ function subscribe$1(onStoreChange) {
612
+ const matchMedia = getMatchMedia();
613
+ return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
614
+ }
615
+ function getSnapshot() {
616
+ return getMatchMedia().matches;
617
+ }
618
+ function getServerSnapshot() {
619
+ return !1;
620
+ }
621
+ function usePrefersReducedMotion() {
622
+ return react.useSyncExternalStore(subscribe$1, getSnapshot, getServerSnapshot);
623
+ }
624
+ function useForwardedRef(ref) {
625
+ const innerRef = react.useRef(null);
626
+ return react.useImperativeHandle(ref, () => innerRef.current), innerRef;
627
+ }
628
+ function useCustomValidity(ref, customValidity) {
629
+ react.useEffect(() => {
630
+ var _a;
631
+ (_a = ref.current) == null || _a.setCustomValidity(customValidity || "");
632
+ }, [customValidity, ref]);
592
633
  }
593
634
  function responsiveBorderStyle() {
594
635
  return [border, borderTop, borderRight, borderBottom, borderLeft];
@@ -3014,25 +3055,31 @@ function Portal(props) {
3014
3055
  const { children, __unstable_name: name } = props, portal = usePortal(), portalElement = (name ? portal.elements && portal.elements[name] : portal.element) || ((_a = portal.elements) == null ? void 0 : _a.default);
3015
3056
  return portalElement ? reactDom.createPortal(children, portalElement) : null;
3016
3057
  }
3017
- function useMounted() {
3018
- return react.useSyncExternalStore(
3019
- subscribe,
3020
- () => !0,
3021
- () => !1
3022
- );
3058
+ function useUnique(value) {
3059
+ const valueRef = react.useRef(value);
3060
+ return _isEqual(valueRef.current, value) || (valueRef.current = value), valueRef.current;
3061
+ }
3062
+ function _isEqual(objA, objB) {
3063
+ if (!objA || !objB)
3064
+ return objA === objB;
3065
+ const keysA = Object.keys(objA), keysB = Object.keys(objB);
3066
+ return keysA.length !== keysB.length ? !1 : keysA.every((key2) => objA[key2] === objB[key2]);
3023
3067
  }
3024
- const subscribe = () => () => {
3025
- };
3026
3068
  function PortalProvider(props) {
3027
- const { boundaryElement, children, element, __unstable_elements: elements } = props, mounted = useMounted(), value = react.useMemo(() => ({
3069
+ const { boundaryElement, children, element, __unstable_elements: elementsProp } = props, elements = useUnique(elementsProp), fallbackElement = react.useSyncExternalStore(
3070
+ emptySubscribe,
3071
+ () => document.body,
3072
+ () => null
3073
+ ), value = react.useMemo(() => ({
3028
3074
  version: 0,
3029
3075
  boundaryElement: boundaryElement || null,
3030
- element: element || mounted ? document.body : null,
3076
+ element: element || fallbackElement,
3031
3077
  elements
3032
- }), [boundaryElement, element, elements, mounted]);
3078
+ }), [boundaryElement, element, elements, fallbackElement]);
3033
3079
  return /* @__PURE__ */ jsxRuntime.jsx(PortalContext.Provider, { value, children });
3034
3080
  }
3035
- const Root$i = styledComponents.styled.div`
3081
+ const emptySubscribe = () => () => {
3082
+ }, Root$i = styledComponents.styled.div`
3036
3083
  display: block;
3037
3084
  width: 0;
3038
3085
  height: 0;
@@ -4911,8 +4958,8 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
4911
4958
  appearance: none;
4912
4959
  margin: -4px;
4913
4960
  `, Breadcrumbs = react.forwardRef(function(props, ref) {
4914
- const { children, maxLength, separator, space: spaceRaw = 2, ...restProps } = props, space = useArrayProp(spaceRaw), [open, setOpen] = react.useState(!1), expandElementRef = react.useRef(null), popoverElementRef = react.useRef(null), collapse = react.useCallback(() => setOpen(!1), []), expand = react.useCallback(() => setOpen(!0), []);
4915
- useClickOutside(collapse, () => [expandElementRef.current, popoverElementRef.current]);
4961
+ const { children, maxLength, separator, space: spaceRaw = 2, ...restProps } = props, space = useArrayProp(spaceRaw), [open, setOpen] = react.useState(!1), [expandElement, setExpandElement] = react.useState(null), [popoverElement, setPopoverElement] = react.useState(null), collapse = react.useCallback(() => setOpen(!1), []), expand = react.useCallback(() => setOpen(!0), []);
4962
+ useClickOutside(collapse, [expandElement, popoverElement]);
4916
4963
  const rawItems = react.useMemo(() => react.Children.toArray(children).filter(react.isValidElement), [children]), items = react.useMemo(() => {
4917
4964
  const len = rawItems.length;
4918
4965
  if (maxLength && len > maxLength) {
@@ -4927,7 +4974,7 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
4927
4974
  open,
4928
4975
  placement: "top",
4929
4976
  portal: !0,
4930
- ref: popoverElementRef,
4977
+ ref: setPopoverElement,
4931
4978
  children: /* @__PURE__ */ jsxRuntime.jsx(
4932
4979
  ExpandButton,
4933
4980
  {
@@ -4935,7 +4982,7 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
4935
4982
  mode: "bleed",
4936
4983
  onClick: open ? collapse : expand,
4937
4984
  padding: 1,
4938
- ref: expandElementRef,
4985
+ ref: setExpandElement,
4939
4986
  selected: open,
4940
4987
  text: "\u2026"
4941
4988
  }
@@ -5060,8 +5107,8 @@ const Root$7 = styledComponents.styled(Layer)(responsivePaddingStyle, dialogStyl
5060
5107
  scheme,
5061
5108
  shadow: shadowProp,
5062
5109
  width: widthProp
5063
- } = props, portal = usePortal(), portalElement = portalProp ? ((_a = portal.elements) == null ? void 0 : _a[portalProp]) || null : portal.element, boundaryElement = useBoundaryElement().element, radius = useArrayProp(radiusProp), shadow = useArrayProp(shadowProp), width = useArrayProp(widthProp), ref = react.useRef(null), contentRef = react.useRef(null), layer = useLayer(), { isTopLayer } = layer, labelId = `${id}_label`, showCloseButton = !!onClose && hideCloseButton === !1, showHeader = !!header || showCloseButton;
5064
- return react.useImperativeHandle(forwardedRef, () => ref.current), react.useImperativeHandle(
5110
+ } = props, portal = usePortal(), portalElement = portalProp ? ((_a = portal.elements) == null ? void 0 : _a[portalProp]) || null : portal.element, boundaryElement = useBoundaryElement().element, radius = useArrayProp(radiusProp), shadow = useArrayProp(shadowProp), width = useArrayProp(widthProp), ref = react.useRef(null), [rootElement, setRootElement] = react.useState(null), contentRef = react.useRef(null), layer = useLayer(), { isTopLayer } = layer, labelId = `${id}_label`, showCloseButton = !!onClose && hideCloseButton === !1, showHeader = !!header || showCloseButton;
5111
+ react.useImperativeHandle(forwardedRef, () => ref.current), react.useImperativeHandle(
5065
5112
  forwardedContentRef,
5066
5113
  () => contentRef.current
5067
5114
  ), react.useEffect(() => {
@@ -5076,13 +5123,20 @@ const Root$7 = styledComponents.styled(Layer)(responsivePaddingStyle, dialogStyl
5076
5123
  [boundaryElement, isTopLayer, onClose, portalElement]
5077
5124
  )
5078
5125
  ), useClickOutside(
5079
- (event) => {
5080
- if (!isTopLayer || !onClickOutside) return;
5081
- const target = event.target;
5082
- target && !isTargetWithinScope(boundaryElement, portalElement, target) || onClickOutside();
5083
- },
5084
- () => [ref.current]
5085
- ), /* @__PURE__ */ jsxRuntime.jsx(DialogContainer, { "data-ui": "DialogCard", width, children: /* @__PURE__ */ jsxRuntime.jsx(DialogCardRoot, { radius, ref, scheme, shadow, children: /* @__PURE__ */ jsxRuntime.jsxs(DialogLayout, { direction: "column", children: [
5126
+ react.useCallback(
5127
+ (event) => {
5128
+ if (!isTopLayer || !onClickOutside) return;
5129
+ const target = event.target;
5130
+ target && !isTargetWithinScope(boundaryElement, portalElement, target) || onClickOutside();
5131
+ },
5132
+ [boundaryElement, isTopLayer, onClickOutside, portalElement]
5133
+ ),
5134
+ [rootElement]
5135
+ );
5136
+ const setRef = react.useCallback((el) => {
5137
+ setRootElement(el), ref.current = el;
5138
+ }, []);
5139
+ return /* @__PURE__ */ jsxRuntime.jsx(DialogContainer, { "data-ui": "DialogCard", width, children: /* @__PURE__ */ jsxRuntime.jsx(DialogCardRoot, { radius, ref: setRef, scheme, shadow, children: /* @__PURE__ */ jsxRuntime.jsxs(DialogLayout, { direction: "column", children: [
5086
5140
  showHeader && /* @__PURE__ */ jsxRuntime.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(Flex, { align: "center", padding: 3, children: [
5087
5141
  /* @__PURE__ */ jsxRuntime.jsx(Box, { flex: 1, padding: 2, children: header && /* @__PURE__ */ jsxRuntime.jsx(Text, { id: labelId, size: 1, weight: "semibold", children: header }) }),
5088
5142
  showCloseButton && /* @__PURE__ */ jsxRuntime.jsx(Box, { flex: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -5260,13 +5314,13 @@ function _sortElements(rootElement, elements) {
5260
5314
  elements.sort(_sort);
5261
5315
  }
5262
5316
  function useMenuController(props) {
5263
- const { onKeyDown, originElement, shouldFocus, rootElementRef } = props, elementsRef = react.useRef([]), [activeIndex, _setActiveIndex] = react.useState(-1), activeIndexRef = react.useRef(activeIndex), activeElement = react.useMemo(() => elementsRef.current[activeIndex] || null, [activeIndex]), mounted = !!rootElementRef.current, setActiveIndex = react.useCallback((nextActiveIndex) => {
5317
+ const { onKeyDown, originElement, shouldFocus } = props, elementsRef = react.useRef([]), [rootElement, setRootElement] = react.useState(null), [activeIndex, _setActiveIndex] = react.useState(-1), activeIndexRef = react.useRef(activeIndex), activeElement = elementsRef.current[activeIndex] || null, mounted = !!rootElement, setActiveIndex = react.useCallback((nextActiveIndex) => {
5264
5318
  _setActiveIndex(nextActiveIndex), activeIndexRef.current = nextActiveIndex;
5265
5319
  }, []), mount = react.useCallback(
5266
5320
  (element, selected) => {
5267
5321
  if (!element) return () => {
5268
5322
  };
5269
- if (elementsRef.current.indexOf(element) === -1 && (elementsRef.current.push(element), _sortElements(rootElementRef.current, elementsRef.current)), selected) {
5323
+ if (elementsRef.current.indexOf(element) === -1 && (elementsRef.current.push(element), _sortElements(rootElement, elementsRef.current)), selected) {
5270
5324
  const selectedIndex = elementsRef.current.indexOf(element);
5271
5325
  setActiveIndex(selectedIndex);
5272
5326
  }
@@ -5275,7 +5329,7 @@ function useMenuController(props) {
5275
5329
  idx > -1 && elementsRef.current.splice(idx, 1);
5276
5330
  };
5277
5331
  },
5278
- [rootElementRef, setActiveIndex]
5332
+ [rootElement, setActiveIndex]
5279
5333
  ), handleKeyDown = react.useCallback(
5280
5334
  (event) => {
5281
5335
  if (event.key === "Tab") {
@@ -5330,13 +5384,13 @@ function useMenuController(props) {
5330
5384
  },
5331
5385
  [setActiveIndex]
5332
5386
  ), handleItemMouseLeave = react.useCallback(() => {
5333
- var _a;
5334
- setActiveIndex(-2), (_a = rootElementRef.current) == null || _a.focus();
5335
- }, [rootElementRef, setActiveIndex]);
5387
+ setActiveIndex(-2), rootElement == null || rootElement.focus();
5388
+ }, [setActiveIndex, rootElement]);
5336
5389
  return react.useEffect(() => {
5337
5390
  if (!mounted) return;
5338
5391
  const rafId = window.requestAnimationFrame(() => {
5339
- if (activeIndex === -1) {
5392
+ const _activeIndex = activeIndexRef.current;
5393
+ if (_activeIndex === -1) {
5340
5394
  if (shouldFocus === "first") {
5341
5395
  const el = _getFocusableElements(elementsRef.current)[0];
5342
5396
  if (el) {
@@ -5353,7 +5407,7 @@ function useMenuController(props) {
5353
5407
  }
5354
5408
  return;
5355
5409
  }
5356
- const element = elementsRef.current[activeIndex] || null;
5410
+ const element = elementsRef.current[_activeIndex] || null;
5357
5411
  element == null || element.focus();
5358
5412
  });
5359
5413
  return () => {
@@ -5365,7 +5419,9 @@ function useMenuController(props) {
5365
5419
  handleItemMouseEnter,
5366
5420
  handleItemMouseLeave,
5367
5421
  handleKeyDown,
5368
- mount
5422
+ mount,
5423
+ rootElement,
5424
+ setRootElement
5369
5425
  };
5370
5426
  }
5371
5427
  const Root$5 = styledComponents.styled(Box)`
@@ -5397,18 +5453,23 @@ const Root$5 = styledComponents.styled(Box)`
5397
5453
  handleItemMouseEnter,
5398
5454
  handleItemMouseLeave,
5399
5455
  handleKeyDown,
5400
- mount
5401
- } = useMenuController({ onKeyDown, originElement, shouldFocus, rootElementRef: ref }), handleRefChange = react.useCallback(
5456
+ mount,
5457
+ rootElement,
5458
+ setRootElement
5459
+ } = useMenuController({ onKeyDown, originElement, shouldFocus }), handleRefChange = react.useCallback(
5402
5460
  (el) => {
5403
- ref.current = el, ref.current && registerElement && registerElement(ref.current);
5461
+ setRootElement(el), ref.current = el;
5404
5462
  },
5405
- [registerElement]
5463
+ [setRootElement]
5406
5464
  );
5407
5465
  react.useEffect(() => {
5408
5466
  onItemSelect && onItemSelect(activeIndex);
5409
5467
  }, [activeIndex, onItemSelect]), useClickOutside(
5410
- (event) => isTopLayer && onClickOutside && onClickOutside(event),
5411
- () => [ref.current]
5468
+ react.useCallback(
5469
+ (event) => isTopLayer && onClickOutside && onClickOutside(event),
5470
+ [isTopLayer, onClickOutside]
5471
+ ),
5472
+ [rootElement]
5412
5473
  ), useGlobalKeyDown(
5413
5474
  react.useCallback(
5414
5475
  (event) => {
@@ -5416,7 +5477,10 @@ const Root$5 = styledComponents.styled(Box)`
5416
5477
  },
5417
5478
  [isTopLayer, onEscape]
5418
5479
  )
5419
- );
5480
+ ), react.useEffect(() => {
5481
+ if (!(!rootElement || !registerElement))
5482
+ return registerElement(rootElement);
5483
+ }, [registerElement, rootElement]);
5420
5484
  const value = react.useMemo(
5421
5485
  () => ({
5422
5486
  version: 0,
@@ -6092,7 +6156,7 @@ const CustomInline = styledComponents.styled(Inline)`
6092
6156
  }
6093
6157
  100% {
6094
6158
  width: 100%;
6095
- }
6159
+ }
6096
6160
  `, LOADING_BAR_HEIGHT = 2;
6097
6161
  function rootStyles(props) {
6098
6162
  const { color } = getTheme_v2.getTheme_v2(props.theme), loadingBarColor = color.button.default[props.tone].enabled.bg;
@@ -6178,7 +6242,15 @@ function Toast(props) {
6178
6242
  }
6179
6243
  );
6180
6244
  }
6181
- const key$1 = Symbol.for("@sanity/ui/context/toast"), ToastContext = createGlobalScopedContext(key$1, null), Root$1 = styledComponents.styled(Layer)`
6245
+ function useMounted() {
6246
+ return react.useSyncExternalStore(
6247
+ subscribe,
6248
+ () => !0,
6249
+ () => !1
6250
+ );
6251
+ }
6252
+ const subscribe = () => () => {
6253
+ }, key$1 = Symbol.for("@sanity/ui/context/toast"), ToastContext = createGlobalScopedContext(key$1, null), Root$1 = styledComponents.styled(Layer)`
6182
6254
  position: fixed;
6183
6255
  top: 0;
6184
6256
  left: 0;
@@ -6789,7 +6861,6 @@ exports.useElementSize = useElementSize;
6789
6861
  exports.useForwardedRef = useForwardedRef;
6790
6862
  exports.useGlobalKeyDown = useGlobalKeyDown;
6791
6863
  exports.useLayer = useLayer;
6792
- exports.useMatchMedia = useMatchMedia;
6793
6864
  exports.useMediaIndex = useMediaIndex;
6794
6865
  exports.usePortal = usePortal;
6795
6866
  exports.usePrefersDark = usePrefersDark;