@sanity/ui 2.6.4-canary.1 → 2.6.4-canary.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 (37) hide show
  1. package/dist/index.d.mts +42 -6
  2. package/dist/index.d.ts +42 -6
  3. package/dist/index.esm.js +90 -156
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +88 -154
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.mjs +90 -156
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +1 -1
  10. package/src/core/components/breadcrumbs/breadcrumbs.tsx +15 -6
  11. package/src/core/components/dialog/dialog.tsx +12 -21
  12. package/src/core/components/menu/menu.tsx +11 -18
  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 +11 -17
  16. package/src/core/components/toast/styles.ts +2 -1
  17. package/src/core/components/toast/useToast.ts +1 -0
  18. package/src/core/components/tree/tree.tsx +1 -0
  19. package/src/core/components/tree/treeItem.tsx +1 -0
  20. package/src/core/helpers/focus.ts +1 -0
  21. package/src/core/helpers/scroll.ts +1 -0
  22. package/src/core/hooks/index.ts +3 -2
  23. package/src/core/hooks/useClickOutside.ts +38 -72
  24. package/src/core/hooks/useElementSize.ts +1 -0
  25. package/src/core/hooks/useMatchMedia.ts +46 -0
  26. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +2 -10
  27. package/src/core/hooks/usePrefersDark.ts +10 -55
  28. package/src/core/hooks/usePrefersReducedMotion.ts +10 -56
  29. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +9 -7
  30. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +8 -6
  31. package/src/core/primitives/tooltip/tooltip.tsx +25 -21
  32. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +1 -0
  33. package/src/core/utils/layer/layerProvider.tsx +1 -0
  34. package/src/core/utils/portal/__workshop__/named.tsx +10 -8
  35. package/src/core/utils/portal/portalProvider.tsx +2 -3
  36. package/src/core/hooks/_internal/index.ts +0 -1
  37. package/src/core/hooks/_internal/useUnique.ts +0 -34
package/dist/index.js CHANGED
@@ -126,45 +126,26 @@ 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
- }
135
129
  function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
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;
130
+ const eventHandler = useEffectEvent.useEffectEvent((evt) => {
131
+ const target = evt.target;
132
+ if (!(target instanceof Node) || boundaryElement && !boundaryElement.contains(target))
141
133
  return;
142
- }
143
- for (const el of prevElements)
144
- if (!nextElements.includes(el)) {
145
- setElements(nextElements), elementsRef.current = nextElements;
146
- return;
147
- }
148
- for (const el of nextElements)
149
- if (!prevElements.includes(el)) {
150
- setElements(nextElements), elementsRef.current = nextElements;
134
+ const elements = (Array.isArray(elementsArg) ? elementsArg : elementsArg()).flat();
135
+ for (const el of elements)
136
+ if (el && (target === el || el.contains(target)))
151
137
  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;
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]);
168
149
  }
169
150
  var resizeObservers = [], hasActiveObservations = function() {
170
151
  return resizeObservers.some(function(ro) {
@@ -499,9 +480,27 @@ function useElementRect(element) {
499
480
  const elementSize = useElementSize(element);
500
481
  return (elementSize == null ? void 0 : elementSize._contentRect) || null;
501
482
  }
483
+ function useForwardedRef(ref) {
484
+ const innerRef = react.useRef(null);
485
+ return react.useImperativeHandle(ref, () => innerRef.current), innerRef;
486
+ }
502
487
  function useGlobalKeyDown(onKeyDown) {
503
488
  return react.useEffect(() => (addEventListener("keydown", onKeyDown), () => removeEventListener("keydown", onKeyDown)), [onKeyDown]);
504
489
  }
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
+ }
505
504
  function getGlobalScope() {
506
505
  if (typeof globalThis < "u") return globalThis;
507
506
  if (typeof window < "u") return window;
@@ -544,7 +543,6 @@ function useTheme() {
544
543
  function useTheme_v2() {
545
544
  return theme.getTheme_v2(styledComponents.useTheme());
546
545
  }
547
- const MEDIA_STORE_CACHE = /* @__PURE__ */ new WeakMap();
548
546
  function _getMediaQuery(media, index) {
549
547
  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)`;
550
548
  }
@@ -579,57 +577,18 @@ function _createMediaStore(media) {
579
577
  };
580
578
  } };
581
579
  }
582
- function getServerSnapshot$2() {
580
+ function getServerSnapshot() {
583
581
  return 0;
584
582
  }
585
583
  function useMediaIndex() {
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;
584
+ const { media } = useTheme_v2(), store = react.useMemo(() => _createMediaStore(media), [media]);
585
+ return react.useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot);
593
586
  }
594
- function subscribe$2(onStoreChange) {
595
- const matchMedia = getMatchMedia$1();
596
- return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
587
+ function usePrefersDark(getServerSnapshot2 = () => !1) {
588
+ return useMatchMedia("(prefers-color-scheme: dark)", getServerSnapshot2);
597
589
  }
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);
606
- }
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;
610
- }
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]);
590
+ function usePrefersReducedMotion(getServerSnapshot2 = () => !1) {
591
+ return useMatchMedia("(prefers-reduced-motion: reduce)", getServerSnapshot2);
633
592
  }
634
593
  function responsiveBorderStyle() {
635
594
  return [border, borderTop, borderRight, borderBottom, borderLeft];
@@ -3055,16 +3014,6 @@ function Portal(props) {
3055
3014
  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);
3056
3015
  return portalElement ? reactDom.createPortal(children, portalElement) : null;
3057
3016
  }
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]);
3067
- }
3068
3017
  function useMounted() {
3069
3018
  return react.useSyncExternalStore(
3070
3019
  subscribe,
@@ -3075,7 +3024,7 @@ function useMounted() {
3075
3024
  const subscribe = () => () => {
3076
3025
  };
3077
3026
  function PortalProvider(props) {
3078
- const { boundaryElement, children, element, __unstable_elements: elementsProp } = props, elements = useUnique(elementsProp), mounted = useMounted(), value = react.useMemo(() => ({
3027
+ const { boundaryElement, children, element, __unstable_elements: elements } = props, mounted = useMounted(), value = react.useMemo(() => ({
3079
3028
  version: 0,
3080
3029
  boundaryElement: boundaryElement || null,
3081
3030
  element: element || mounted ? document.body : null,
@@ -4338,7 +4287,6 @@ function TooltipDelayGroupProvider(props) {
4338
4287
  }
4339
4288
  const Root$a = styledComponents.styled(Layer)`
4340
4289
  pointer-events: none;
4341
- max-width: ${({ $maxWidth }) => $maxWidth}px;
4342
4290
  `, Tooltip = react.forwardRef(function(props, forwardedRef) {
4343
4291
  var _a, _b, _c, _d, _e, _f, _g;
4344
4292
  const boundaryElementContext = useBoundaryElement(), { layer } = useTheme_v2(), {
@@ -4360,18 +4308,21 @@ const Root$a = styledComponents.styled(Layer)`
4360
4308
  ...restProps
4361
4309
  } = props, animate = usePrefersReducedMotion() ? !1 : _animate, fallbackPlacements = useArrayProp(fallbackPlacementsProp), ref = react.useRef(null), [referenceElement, setReferenceElement] = react.useState(null), arrowRef = react.useRef(null), rootBoundary = "viewport";
4362
4310
  react.useImperativeHandle(forwardedRef, () => ref.current);
4363
- const portal = usePortal(), portalElement = typeof portalProp == "string" ? ((_c = portal.elements) == null ? void 0 : _c[portalProp]) || null : portal.element, mounted = useMounted(), tooltipWidth = react.useMemo(() => {
4364
- const availableWidths = [
4365
- ...boundaryElement ? [boundaryElement.offsetWidth] : [],
4366
- portalElement != null && portalElement.offsetWidth || mounted ? document.body.offsetWidth : (
4367
- // We don't actually know what the width of the body is during SSR, so we'll just assume it's 800px or larger
4368
- 800
4369
- )
4370
- ];
4371
- return Math.min(...availableWidths) - DEFAULT_TOOLTIP_PADDING * 2;
4372
- }, [boundaryElement, mounted, portalElement]), middleware = react.useMemo(() => {
4311
+ const portal = usePortal(), portalElement = typeof portalProp == "string" ? ((_c = portal.elements) == null ? void 0 : _c[portalProp]) || null : portal.element, middleware = react.useMemo(() => {
4373
4312
  const ret = [];
4374
4313
  return ret.push(
4314
+ reactDom$1.size({
4315
+ apply({ elements }) {
4316
+ const availableWidths = [
4317
+ ...boundaryElement ? [boundaryElement.offsetWidth] : [],
4318
+ (portalElement == null ? void 0 : portalElement.offsetWidth) || document.body.offsetWidth
4319
+ ], tooltipWidth = Math.min(...availableWidths) - DEFAULT_TOOLTIP_PADDING * 2;
4320
+ Object.assign(elements.floating.style, {
4321
+ maxWidth: tooltipWidth > 0 ? `${tooltipWidth}px` : void 0
4322
+ });
4323
+ }
4324
+ })
4325
+ ), ret.push(
4375
4326
  reactDom$1.flip({
4376
4327
  boundary: boundaryElement || void 0,
4377
4328
  fallbackPlacements,
@@ -4385,7 +4336,7 @@ const Root$a = styledComponents.styled(Layer)`
4385
4336
  padding: DEFAULT_TOOLTIP_PADDING
4386
4337
  })
4387
4338
  ), arrowProp && ret.push(reactDom$1.arrow({ element: arrowRef, padding: DEFAULT_TOOLTIP_PADDING })), animate && ret.push(origin), ret;
4388
- }, [animate, arrowProp, boundaryElement, fallbackPlacements]), { floatingStyles, placement, middlewareData, refs, update } = reactDom$1.useFloating({
4339
+ }, [animate, arrowProp, boundaryElement, fallbackPlacements, portalElement]), { floatingStyles, placement, middlewareData, refs, update } = reactDom$1.useFloating({
4389
4340
  middleware,
4390
4341
  placement: placementProp,
4391
4342
  whileElementsMounted: reactDom$1.autoUpdate
@@ -4495,7 +4446,6 @@ const Root$a = styledComponents.styled(Layer)`
4495
4446
  ref: setFloating,
4496
4447
  style: floatingStyles,
4497
4448
  zOffset,
4498
- $maxWidth: tooltipWidth,
4499
4449
  children: /* @__PURE__ */ jsxRuntime.jsx(
4500
4450
  TooltipCard,
4501
4451
  {
@@ -4961,8 +4911,8 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
4961
4911
  appearance: none;
4962
4912
  margin: -4px;
4963
4913
  `, Breadcrumbs = react.forwardRef(function(props, ref) {
4964
- 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), []);
4965
- useClickOutside(collapse, [expandElement, popoverElement]);
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]);
4966
4916
  const rawItems = react.useMemo(() => react.Children.toArray(children).filter(react.isValidElement), [children]), items = react.useMemo(() => {
4967
4917
  const len = rawItems.length;
4968
4918
  if (maxLength && len > maxLength) {
@@ -4977,7 +4927,7 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
4977
4927
  open,
4978
4928
  placement: "top",
4979
4929
  portal: !0,
4980
- ref: setPopoverElement,
4930
+ ref: popoverElementRef,
4981
4931
  children: /* @__PURE__ */ jsxRuntime.jsx(
4982
4932
  ExpandButton,
4983
4933
  {
@@ -4985,7 +4935,7 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
4985
4935
  mode: "bleed",
4986
4936
  onClick: open ? collapse : expand,
4987
4937
  padding: 1,
4988
- ref: setExpandElement,
4938
+ ref: expandElementRef,
4989
4939
  selected: open,
4990
4940
  text: "\u2026"
4991
4941
  }
@@ -5110,8 +5060,8 @@ const Root$7 = styledComponents.styled(Layer)(responsivePaddingStyle, dialogStyl
5110
5060
  scheme,
5111
5061
  shadow: shadowProp,
5112
5062
  width: widthProp
5113
- } = 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;
5114
- react.useImperativeHandle(forwardedRef, () => ref.current), react.useImperativeHandle(
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(
5115
5065
  forwardedContentRef,
5116
5066
  () => contentRef.current
5117
5067
  ), react.useEffect(() => {
@@ -5126,20 +5076,13 @@ const Root$7 = styledComponents.styled(Layer)(responsivePaddingStyle, dialogStyl
5126
5076
  [boundaryElement, isTopLayer, onClose, portalElement]
5127
5077
  )
5128
5078
  ), useClickOutside(
5129
- react.useCallback(
5130
- (event) => {
5131
- if (!isTopLayer || !onClickOutside) return;
5132
- const target = event.target;
5133
- target && !isTargetWithinScope(boundaryElement, portalElement, target) || onClickOutside();
5134
- },
5135
- [boundaryElement, isTopLayer, onClickOutside, portalElement]
5136
- ),
5137
- [rootElement]
5138
- );
5139
- const setRef = react.useCallback((el) => {
5140
- setRootElement(el), ref.current = el;
5141
- }, []);
5142
- 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: [
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: [
5143
5086
  showHeader && /* @__PURE__ */ jsxRuntime.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(Flex, { align: "center", padding: 3, children: [
5144
5087
  /* @__PURE__ */ jsxRuntime.jsx(Box, { flex: 1, padding: 2, children: header && /* @__PURE__ */ jsxRuntime.jsx(Text, { id: labelId, size: 1, weight: "semibold", children: header }) }),
5145
5088
  showCloseButton && /* @__PURE__ */ jsxRuntime.jsx(Box, { flex: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -5317,13 +5260,13 @@ function _sortElements(rootElement, elements) {
5317
5260
  elements.sort(_sort);
5318
5261
  }
5319
5262
  function useMenuController(props) {
5320
- 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) => {
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) => {
5321
5264
  _setActiveIndex(nextActiveIndex), activeIndexRef.current = nextActiveIndex;
5322
5265
  }, []), mount = react.useCallback(
5323
5266
  (element, selected) => {
5324
5267
  if (!element) return () => {
5325
5268
  };
5326
- if (elementsRef.current.indexOf(element) === -1 && (elementsRef.current.push(element), _sortElements(rootElement, elementsRef.current)), selected) {
5269
+ if (elementsRef.current.indexOf(element) === -1 && (elementsRef.current.push(element), _sortElements(rootElementRef.current, elementsRef.current)), selected) {
5327
5270
  const selectedIndex = elementsRef.current.indexOf(element);
5328
5271
  setActiveIndex(selectedIndex);
5329
5272
  }
@@ -5332,7 +5275,7 @@ function useMenuController(props) {
5332
5275
  idx > -1 && elementsRef.current.splice(idx, 1);
5333
5276
  };
5334
5277
  },
5335
- [rootElement, setActiveIndex]
5278
+ [rootElementRef, setActiveIndex]
5336
5279
  ), handleKeyDown = react.useCallback(
5337
5280
  (event) => {
5338
5281
  if (event.key === "Tab") {
@@ -5387,13 +5330,13 @@ function useMenuController(props) {
5387
5330
  },
5388
5331
  [setActiveIndex]
5389
5332
  ), handleItemMouseLeave = react.useCallback(() => {
5390
- setActiveIndex(-2), rootElement == null || rootElement.focus();
5391
- }, [setActiveIndex, rootElement]);
5333
+ var _a;
5334
+ setActiveIndex(-2), (_a = rootElementRef.current) == null || _a.focus();
5335
+ }, [rootElementRef, setActiveIndex]);
5392
5336
  return react.useEffect(() => {
5393
5337
  if (!mounted) return;
5394
5338
  const rafId = window.requestAnimationFrame(() => {
5395
- const _activeIndex = activeIndexRef.current;
5396
- if (_activeIndex === -1) {
5339
+ if (activeIndex === -1) {
5397
5340
  if (shouldFocus === "first") {
5398
5341
  const el = _getFocusableElements(elementsRef.current)[0];
5399
5342
  if (el) {
@@ -5410,7 +5353,7 @@ function useMenuController(props) {
5410
5353
  }
5411
5354
  return;
5412
5355
  }
5413
- const element = elementsRef.current[_activeIndex] || null;
5356
+ const element = elementsRef.current[activeIndex] || null;
5414
5357
  element == null || element.focus();
5415
5358
  });
5416
5359
  return () => {
@@ -5422,9 +5365,7 @@ function useMenuController(props) {
5422
5365
  handleItemMouseEnter,
5423
5366
  handleItemMouseLeave,
5424
5367
  handleKeyDown,
5425
- mount,
5426
- rootElement,
5427
- setRootElement
5368
+ mount
5428
5369
  };
5429
5370
  }
5430
5371
  const Root$5 = styledComponents.styled(Box)`
@@ -5456,23 +5397,18 @@ const Root$5 = styledComponents.styled(Box)`
5456
5397
  handleItemMouseEnter,
5457
5398
  handleItemMouseLeave,
5458
5399
  handleKeyDown,
5459
- mount,
5460
- rootElement,
5461
- setRootElement
5462
- } = useMenuController({ onKeyDown, originElement, shouldFocus }), handleRefChange = react.useCallback(
5400
+ mount
5401
+ } = useMenuController({ onKeyDown, originElement, shouldFocus, rootElementRef: ref }), handleRefChange = react.useCallback(
5463
5402
  (el) => {
5464
- setRootElement(el), ref.current = el;
5403
+ ref.current = el, ref.current && registerElement && registerElement(ref.current);
5465
5404
  },
5466
- [setRootElement]
5405
+ [registerElement]
5467
5406
  );
5468
5407
  react.useEffect(() => {
5469
5408
  onItemSelect && onItemSelect(activeIndex);
5470
5409
  }, [activeIndex, onItemSelect]), useClickOutside(
5471
- react.useCallback(
5472
- (event) => isTopLayer && onClickOutside && onClickOutside(event),
5473
- [isTopLayer, onClickOutside]
5474
- ),
5475
- [rootElement]
5410
+ (event) => isTopLayer && onClickOutside && onClickOutside(event),
5411
+ () => [ref.current]
5476
5412
  ), useGlobalKeyDown(
5477
5413
  react.useCallback(
5478
5414
  (event) => {
@@ -5480,10 +5416,7 @@ const Root$5 = styledComponents.styled(Box)`
5480
5416
  },
5481
5417
  [isTopLayer, onEscape]
5482
5418
  )
5483
- ), react.useEffect(() => {
5484
- if (!(!rootElement || !registerElement))
5485
- return registerElement(rootElement);
5486
- }, [registerElement, rootElement]);
5419
+ );
5487
5420
  const value = react.useMemo(
5488
5421
  () => ({
5489
5422
  version: 0,
@@ -6159,7 +6092,7 @@ const CustomInline = styledComponents.styled(Inline)`
6159
6092
  }
6160
6093
  100% {
6161
6094
  width: 100%;
6162
- }
6095
+ }
6163
6096
  `, LOADING_BAR_HEIGHT = 2;
6164
6097
  function rootStyles(props) {
6165
6098
  const { color } = getTheme_v2.getTheme_v2(props.theme), loadingBarColor = color.button.default[props.tone].enabled.bg;
@@ -6856,6 +6789,7 @@ exports.useElementSize = useElementSize;
6856
6789
  exports.useForwardedRef = useForwardedRef;
6857
6790
  exports.useGlobalKeyDown = useGlobalKeyDown;
6858
6791
  exports.useLayer = useLayer;
6792
+ exports.useMatchMedia = useMatchMedia;
6859
6793
  exports.useMediaIndex = useMediaIndex;
6860
6794
  exports.usePortal = usePortal;
6861
6795
  exports.usePrefersDark = usePrefersDark;