@sanity/ui 4.4.4 → 4.5.0-panda.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 (34) hide show
  1. package/dist/{arrow-MMVAW3Ew.js → arrow-BVbVEhyN.js} +21 -25
  2. package/dist/arrow-BVbVEhyN.js.map +1 -0
  3. package/dist/autocomplete.js +8 -10
  4. package/dist/autocomplete.js.map +1 -1
  5. package/dist/breadcrumbs.js +5 -6
  6. package/dist/breadcrumbs.js.map +1 -1
  7. package/dist/{button-Bp0udHV9.js → button-DLiQy0Qz.js} +6 -7
  8. package/dist/button-DLiQy0Qz.js.map +1 -0
  9. package/dist/{hotkeys-BPJuQ-gO.js → hotkeys-D-yvp5RU.js} +4 -6
  10. package/dist/{hotkeys-BPJuQ-gO.js.map → hotkeys-D-yvp5RU.js.map} +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +41 -53
  13. package/dist/index.js.map +1 -1
  14. package/dist/{layer-DP8gT1ex.js → layer-CA793bFP.js} +2 -3
  15. package/dist/layer-CA793bFP.js.map +1 -0
  16. package/dist/menu.js +5 -7
  17. package/dist/menu.js.map +1 -1
  18. package/dist/{popover-BVbv1K3z.js → popover-bcCbXwoP.js} +2 -2
  19. package/dist/{popover-BVbv1K3z.js.map → popover-bcCbXwoP.js.map} +1 -1
  20. package/dist/popover.js +1 -1
  21. package/dist/{stack-CPdFknrG.js → stack-TOlBMvbq.js} +2 -3
  22. package/dist/stack-TOlBMvbq.js.map +1 -0
  23. package/dist/styles.css +694 -560
  24. package/dist/{textInput-CTqkq5UQ.js → textInput-ByCyqiAh.js} +8 -9
  25. package/dist/{textInput-CTqkq5UQ.js.map → textInput-ByCyqiAh.js.map} +1 -1
  26. package/dist/toast.js +10 -13
  27. package/dist/toast.js.map +1 -1
  28. package/dist/tooltip.js +5 -7
  29. package/dist/tooltip.js.map +1 -1
  30. package/package.json +14 -10
  31. package/dist/arrow-MMVAW3Ew.js.map +0 -1
  32. package/dist/button-Bp0udHV9.js.map +0 -1
  33. package/dist/layer-DP8gT1ex.js.map +0 -1
  34. package/dist/stack-CPdFknrG.js.map +0 -1
@@ -5,7 +5,6 @@ import { c } from "react/compiler-runtime";
5
5
  import { clsx } from "clsx/lite";
6
6
  import { useEffect, useImperativeHandle, useRef } from "react";
7
7
  import { jsx } from "react/jsx-runtime";
8
- var layer = "_1xz6t3i0";
9
8
  function LayerChildren(props) {
10
9
  let $ = c(29), children, className, forwardedRef, onActivate, onFocus, restProps, t0, t1;
11
10
  $[0] === props ? (children = $[1], className = $[2], forwardedRef = $[3], onActivate = $[4], onFocus = $[5], restProps = $[6], t0 = $[7], t1 = $[8]) : ({as: t0, children, className, onActivate, onFocus, ref: forwardedRef, style: t1, ...restProps} = props, $[0] = props, $[1] = children, $[2] = className, $[3] = forwardedRef, $[4] = onActivate, $[5] = onFocus, $[6] = restProps, $[7] = t0, $[8] = t1);
@@ -22,7 +21,7 @@ function LayerChildren(props) {
22
21
  isTopLayer && rootElement && target && isHTMLElement(target) && containsOrEqualsElement(rootElement, target) && (lastFocusedRef.current = target);
23
22
  }, $[14] = isTopLayer, $[15] = onFocus, $[16] = t5) : t5 = $[16];
24
23
  let handleFocus = t5, Component = as, t6;
25
- $[17] === className ? t6 = $[18] : (t6 = clsx(layer, className), $[17] = className, $[18] = t6);
24
+ $[17] === className ? t6 = $[18] : (t6 = clsx("emPzDJ", className), $[17] = className, $[18] = t6);
26
25
  let t7;
27
26
  $[19] !== style || $[20] !== zIndex ? (t7 = {
28
27
  ...style,
@@ -58,4 +57,4 @@ function Layer(props) {
58
57
  }
59
58
  export { Layer as t };
60
59
 
61
- //# sourceMappingURL=layer-DP8gT1ex.js.map
60
+ //# sourceMappingURL=layer-CA793bFP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer-CA793bFP.js","names":["as = 'div'","style = EMPTY_RECORD","() => ref.current","() => {\n const becameTopLayer = isTopLayerRef.current !== isTopLayer && isTopLayer\n\n if (becameTopLayer) {\n onActivate?.({activeElement: lastFocusedRef.current})\n }\n\n isTopLayerRef.current = isTopLayer\n }","[isTopLayer, onActivate]","(event: FocusEvent<HTMLDivElement, Element>) => {\n // Call the user-provided onFocus handler if any\n onFocus?.(event)\n\n const rootElement = ref.current\n const target = document.activeElement\n\n if (!isTopLayer || !rootElement || !target) return\n\n if (isHTMLElement(target) && containsOrEqualsElement(rootElement, target)) {\n lastFocusedRef.current = target\n }\n }","useCallback(\n // oxlint-disable-next-line no-unnecessary-type-arguments\n (event: FocusEvent<HTMLDivElement, Element>) => {\n // Call the user-provided onFocus handler if any\n onFocus?.(event)\n\n const rootElement = ref.current\n const target = document.activeElement\n\n if (!isTopLayer || !rootElement || !target) return\n\n if (isHTMLElement(target) && containsOrEqualsElement(rootElement, target)) {\n lastFocusedRef.current = target\n }\n },\n [isTopLayer, onFocus],\n )","clsx(layer, className)","{...style, zIndex}","<Component\n data-ui=\"Layer\"\n {...restProps}\n className={clsx(layer, className)}\n onFocus={handleFocus}\n ref={ref}\n style={{...style, zIndex}}\n >\n {children}\n </Component>","zOffset = 1","<LayerChildren {...restProps}>{children}</LayerChildren>","<LayerProvider zOffset={zOffset}>\n <LayerChildren {...restProps}>{children}</LayerChildren>\n </LayerProvider>","_c"],"sources":["../src/core/utils/layer/layer.css.ts","../src/core/utils/layer/layer.tsx"],"sourcesContent":["import {css} from '#styled-system/css'\n\nexport const layer = css({\n position: 'relative',\n})\n","import {clsx} from 'clsx/lite'\nimport {FocusEvent, useCallback, useEffect, useImperativeHandle, useRef} from 'react'\n\nimport {EMPTY_RECORD} from '../../constants'\nimport {containsOrEqualsElement, isHTMLElement} from '../../helpers/element'\nimport {LayerProvider} from './layerProvider'\nimport {useLayer} from './useLayer'\n\nimport {layer} from './layer.css'\n\n/**\n * @public\n */\nexport interface LayerProps {\n as?: React.ElementType | keyof React.JSX.IntrinsicElements\n /** A callback that fires when the layer becomes the top layer when it was not the top layer before. */\n onActivate?: (props: {activeElement: HTMLElement | null}) => void\n zOffset?: number | number[]\n}\n\ninterface LayerChildrenProps {\n as?: React.ElementType | keyof React.JSX.IntrinsicElements\n onActivate?: LayerProps['onActivate']\n}\n\nfunction LayerChildren(props: LayerChildrenProps & Omit<React.HTMLProps<HTMLDivElement>, 'as'>) {\n const {\n as = 'div',\n children,\n className,\n onActivate,\n onFocus,\n ref: forwardedRef,\n style = EMPTY_RECORD,\n ...restProps\n } = props\n const {zIndex, isTopLayer} = useLayer()\n const lastFocusedRef = useRef<HTMLElement | null>(null)\n const ref = useRef<HTMLDivElement | null>(null)\n const isTopLayerRef = useRef<boolean>(isTopLayer)\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)\n\n // When the layer very first mounts, it will be the top layer, but we don't want to fire\n // the callback in that case. We use a ref to track the previous value of isTopLayer to\n // determine if the layer has become the top layer since the last render.\n useEffect(() => {\n const becameTopLayer = isTopLayerRef.current !== isTopLayer && isTopLayer\n\n if (becameTopLayer) {\n onActivate?.({activeElement: lastFocusedRef.current})\n }\n\n isTopLayerRef.current = isTopLayer\n }, [isTopLayer, onActivate])\n\n const handleFocus = useCallback(\n // oxlint-disable-next-line no-unnecessary-type-arguments\n (event: FocusEvent<HTMLDivElement, Element>) => {\n // Call the user-provided onFocus handler if any\n onFocus?.(event)\n\n const rootElement = ref.current\n const target = document.activeElement\n\n if (!isTopLayer || !rootElement || !target) return\n\n if (isHTMLElement(target) && containsOrEqualsElement(rootElement, target)) {\n lastFocusedRef.current = target\n }\n },\n [isTopLayer, onFocus],\n )\n\n // Rendering the polymorphic `as` needs one concrete element type for JSX to\n // type-check the div-flavored props (the same widening styled-components'\n // `as` prop performed here before).\n // oxlint-disable-next-line no-unsafe-type-assertion\n const Component = as as 'div'\n\n return (\n <Component\n data-ui=\"Layer\"\n {...restProps}\n className={clsx(layer, className)}\n onFocus={handleFocus}\n ref={ref}\n style={{...style, zIndex}}\n >\n {children}\n </Component>\n )\n}\n\n/**\n * @public\n */\nexport function Layer(props: LayerProps & Omit<React.HTMLProps<HTMLDivElement>, 'as'>) {\n const {children, zOffset = 1, ...restProps} = props\n\n return (\n <LayerProvider zOffset={zOffset}>\n <LayerChildren {...restProps}>{children}</LayerChildren>\n </LayerProvider>\n )\n}\n"],"mappings":";;;;;;;ACyBA,SAAS,cAAc,OAAyE;gBAG5F,UACA,WAGK,cAFL,YACA,SAGG,WAPHA,IAMAC;CAEE,AAAA,EAAA,OAAA,+IATE,CACJ,IAAA,IACA,UACA,WACA,YACA,SACA,KAAK,cACL,OAAA,IACA,GAAA,aACE;CARF,IAAA,KAAA,OAAA,KAAA,IAAK,QAALD,IAMA,QAAA,OAAA,KAAA,IAAQ,eAARC,IAGI,EAAC,QAAQ,eAAc,SAAS,GAChC,iBAAiB,OAA2B,IAAI,GAChD,MAAM,OAA8B,IAAI,GACxC,gBAAgB,OAAgB,UAAU,GAEgCC;CAAhF,oDAAsF,WAAA,IAAI,iCAA1F,oBAAkE,cAAcA,EAAiB;CAKvFC,IAAAA,IAQPC;CARH,AACmD,EAAA,QAAA,cAAA,EAAA,QAG/C,cAJM,WAAM;EAOd,AANuB,cAAc,YAAY,cAAc,cAG7D,aAAa,EAAC,eAAe,eAAe,QAAO,CAAC,GAGtD,cAAc,UAAU;CAC1B,GAAG,KAAA,CAAC,YAAY,UAAU,GAPyB,EAAA,MAAA,YAG/C,EAAA,MAAA,gEAJJ,UAAUD,IAQPC,EAAwB;CAIzBC,IAAAA;CAOO,AAAA,EAAA,QAAA,cAAA,EAAA,QALL,WAFF,MAAC,UAA+C;EAE9C,UAAU,KAAK;EAEf,IAAM,cAAc,IAAI,SAClB,SAAS,SAAS;EAExB,AAAK,cAAe,eAAgB,UAEhC,cAAc,MAAM,KAAK,wBAAwB,aAAa,MAAM,MACtE,eAAe,UAAU;CAE7B,GALO,EAAA,MAAA,YALL,EAAA,MAAA;CAJJ,IAAM,cAAcC,IAsBd,YAAY,IAMHC;CAAY,AAAA,EAAA,QAAA,0BAAZ,KAAA,KAAK,UAAO,SAAS,GAAT,EAAA,MAAA;CAGhBC,IAAAA;CAAI,AAAA,EAAA,QAAA,SAAA,EAAA,QAAO,UAAX,KAAA;EAAC,GAAG;EAAO;CAAM,GAAb,EAAA,MAAA,OAAO,EAAA,MAAA;CANpBC,IAAAA;CADF,OACG,EAAA,QAAA,aAAA,EAAA,QAQE,YAAA,EAAA,QAJQ,eAAA,EAAA,QAFL,aAAA,EAAA,QACOF,MAAAA,EAAAA,QAGJC,MANT,KAAA,oBAAC,WAAD;EACE,WAAQ;EACR,GAAI;EACJ,WAAWD;EACX,SAAS;EACJ;EACL,OAAOC;EAEN;CACQ,CAAA,GATV,EAAA,MAAA,WAQE,EAAA,MAAA,UAJQ,EAAA,MAAA,aAFL,EAAA,MAAA,WACOD,EAAAA,MAAAA,IAGJC,EAAAA,MAAAA,8BANTC;AAWJ;;;;AAKA,SAAgB,MAAM,OAAiE;gBAC9E,UAA0B,WAAhBC;CAA6B,AAAA,EAAA,OAAA,0DAAxC,CAAC,UAAU,SAAA,IAAa,GAAA,aAAgB;CAA7B,IAAA,UAAA,OAAA,KAAA,IAAU,IAAVA,IAIbC;CAA+B,AAAA,EAAA,OAAA,YAAA,EAAA,OAAZ,aAAnB,KAAA,oBAAC,eAAD;EAAe,GAAI;EAAY;CAAwB,CAAA,GAAxB,EAAA,KAAA,UAAZ,EAAA,KAAA;CADrBC,IAAAA;CADF,OAEID,EAAAA,OAAAA,MAAAA,EAAAA,OADsB,WAAxB,KAAA,oBAAC,eAAD;EAAwB;EACtBA,UAAAA;CACa,CAAA,GADbA,EAAAA,KAAAA,IADsB,EAAA,KAAA,iCAAxBC;AAIJ"}
package/dist/menu.js CHANGED
@@ -4,11 +4,11 @@ import { i as isHTMLButtonElement, r as isHTMLAnchorElement } from "./element-BY
4
4
  import { t as getTheme_v2 } from "./getTheme_v2-y09KqtEb.js";
5
5
  import { d as createGlobalScopedContext, h as _cardColorStyle, l as useRootTheme, r as isRecord, t as useLayer, v as responsiveRadiusStyle, y as Box } from "./useLayer-D_TnC6On.js";
6
6
  import { t as Flex } from "./flex-ohP2jG9d.js";
7
- import { n as Text, t as Stack } from "./stack-CPdFknrG.js";
7
+ import { n as Text, t as Stack } from "./stack-TOlBMvbq.js";
8
8
  import { o as attachRef } from "./getElementRef-BLVMlHTn.js";
9
- import { t as Popover } from "./popover-BVbv1K3z.js";
9
+ import { t as Popover } from "./popover-bcCbXwoP.js";
10
10
  import { t as useClickOutsideEvent } from "./useClickOutsideEvent-CC1zgOmv.js";
11
- import { i as useGlobalKeyDown, t as Hotkeys } from "./hotkeys-BPJuQ-gO.js";
11
+ import { i as useGlobalKeyDown, t as Hotkeys } from "./hotkeys-D-yvp5RU.js";
12
12
  import { c } from "react/compiler-runtime";
13
13
  import { clsx } from "clsx/lite";
14
14
  import { cloneElement, isValidElement, startTransition, useContext, useEffect, useImperativeHandle, useRef, useState } from "react";
@@ -165,7 +165,6 @@ function useMenuController(props) {
165
165
  }, $[17] = activeElement, $[18] = activeIndex, $[19] = handleItemMouseLeave, $[20] = handleKeyDown, $[21] = mount, $[22] = t10) : t10 = $[22], t10;
166
166
  }
167
167
  function _temp$3() {}
168
- var menu = "_196sf460";
169
168
  /**
170
169
  * The `Menu` component is a building block for application menus.
171
170
  *
@@ -210,7 +209,7 @@ function Menu(props) {
210
209
  registerElement
211
210
  }, $[30] = activeElement, $[31] = handleItemMouseEnter, $[32] = handleItemMouseLeave, $[33] = mount, $[34] = onClickOutside, $[35] = onEscape, $[36] = onItemClick, $[37] = registerElement, $[38] = t10) : t10 = $[38];
212
211
  let value = t10, t11;
213
- $[39] === className ? t11 = $[40] : (t11 = clsx(menu, className), $[39] = className, $[40] = t11);
212
+ $[39] === className ? t11 = $[40] : (t11 = clsx("dFXmkO gWzzAr", className), $[39] = className, $[40] = t11);
214
213
  let t12;
215
214
  $[41] !== children || $[42] !== gap ? (t12 = /* @__PURE__ */ jsx(Stack, {
216
215
  gap,
@@ -353,12 +352,11 @@ function useButtonRef(forwardedRef, setButtonElement) {
353
352
  let $ = c(3), lastNodeRef = useRef(null), t0;
354
353
  return $[0] !== forwardedRef || $[1] !== setButtonElement ? (t0 = (node) => (lastNodeRef.current && lastNodeRef.current !== node && setButtonElement((element) => element && node), lastNodeRef.current = node, attachRef(forwardedRef, node)), $[0] = forwardedRef, $[1] = setButtonElement, $[2] = t0) : t0 = $[2], t0;
355
354
  }
356
- var menuDivider = "_17s3sc10";
357
355
  function MenuDividerComponent(props) {
358
356
  let $ = c(12), className, ref, restProps, t0;
359
357
  $[0] === props ? (className = $[1], ref = $[2], restProps = $[3], t0 = $[4]) : ({as: t0, className, ref, ...restProps} = props, $[0] = props, $[1] = className, $[2] = ref, $[3] = restProps, $[4] = t0);
360
358
  let Component = t0 === void 0 ? "hr" : t0, t1;
361
- $[5] === className ? t1 = $[6] : (t1 = clsx(menuDivider, className), $[5] = className, $[6] = t1);
359
+ $[5] === className ? t1 = $[6] : (t1 = clsx("cCeIjY MrtSM huoTQe jZsjHW", className), $[5] = className, $[6] = t1);
362
360
  let t2;
363
361
  return $[7] !== Component || $[8] !== ref || $[9] !== restProps || $[10] !== t1 ? (t2 = /* @__PURE__ */ jsx(Component, {
364
362
  "data-ui": "MenuDivider",
package/dist/menu.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","names":["[]","(nextActiveIndex: number) => {\n _setActiveIndex(nextActiveIndex)\n activeIndexRef.current = nextActiveIndex\n setActiveElement(elementsRef.current[nextActiveIndex] || null)\n }","useCallback((nextActiveIndex: number) => {\n _setActiveIndex(nextActiveIndex)\n activeIndexRef.current = nextActiveIndex\n setActiveElement(elementsRef.current[nextActiveIndex] || null)\n }, [])","(element: HTMLElement | null, selected?: boolean): (() => void) => {\n if (!element) return () => undefined\n\n if (elementsRef.current.indexOf(element) === -1) {\n elementsRef.current.push(element)\n _sortElements(rootElementRef.current, elementsRef.current)\n }\n\n if (selected) {\n const selectedIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(selectedIndex)\n }\n\n return () => {\n const idx = elementsRef.current.indexOf(element)\n\n if (idx > -1) {\n elementsRef.current.splice(idx, 1)\n }\n }\n }","rootElementRef.current","() => undefined","useCallback(\n (element: HTMLElement | null, selected?: boolean): (() => void) => {\n if (!element) return () => undefined\n\n if (elementsRef.current.indexOf(element) === -1) {\n elementsRef.current.push(element)\n _sortElements(rootElementRef.current, elementsRef.current)\n }\n\n if (selected) {\n const selectedIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(selectedIndex)\n }\n\n return () => {\n const idx = elementsRef.current.indexOf(element)\n\n if (idx > -1) {\n elementsRef.current.splice(idx, 1)\n }\n }\n },\n [rootElementRef, setActiveIndex],\n )","() => {\n return () => setActiveIndex(-1)\n }","[setActiveIndex]","(event: React.KeyboardEvent<HTMLDivElement>) => {\n // Move focus to the element that opened the menu before handling the `Tab` press\n if (event.key === 'Tab') {\n if (originElement) {\n originElement.focus()\n }\n\n return\n }\n\n // Move focus to the first focusable menuitem\n if (event.key === 'Home') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n // Move focus to the last focusable menuitem\n if (event.key === 'End') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex - 1 + focusableLen) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex + 1) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (onKeyDown) {\n onKeyDown(event)\n }\n }","focusableElements","el","currentIndex","focusableLen","focusedElement","focusedIndex","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Move focus to the element that opened the menu before handling the `Tab` press\n if (event.key === 'Tab') {\n if (originElement) {\n originElement.focus()\n }\n\n return\n }\n\n // Move focus to the first focusable menuitem\n if (event.key === 'Home') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n // Move focus to the last focusable menuitem\n if (event.key === 'End') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex - 1 + focusableLen) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex + 1) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (onKeyDown) {\n onKeyDown(event)\n }\n },\n [onKeyDown, originElement, setActiveIndex],\n )","(event: React.SyntheticEvent<HTMLElement>) => {\n const element = event.currentTarget\n const currentIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(currentIndex)\n }","element","event","useCallback(\n (event: React.SyntheticEvent<HTMLElement>) => {\n const element = event.currentTarget\n const currentIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(currentIndex)\n },\n [setActiveIndex],\n )","() => {\n // Set the active index to -2 to deactivate all menu items\n // when the user moves the mouse away from the menu item.\n // We avoid using -1 because it would focus the first menu item,\n // which would be incorrect when the user hovers over a gap\n // between two menu items or a menu divider.\n setActiveIndex(-2)\n rootElementRef.current?.focus()\n }","rootElementRef.current?.focus","useCallback(() => {\n // Set the active index to -2 to deactivate all menu items\n // when the user moves the mouse away from the menu item.\n // We avoid using -1 because it would focus the first menu item,\n // which would be incorrect when the user hovers over a gap\n // between two menu items or a menu divider.\n setActiveIndex(-2)\n rootElementRef.current?.focus()\n }, [rootElementRef, setActiveIndex])","() => {\n if (!rootElementRef.current) return\n\n const rafId = requestAnimationFrame(() => {\n if (activeIndex === -1) {\n if (shouldFocus === 'first') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n if (shouldFocus === 'last') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n return\n }\n\n const element = elementsRef.current[activeIndex] || null\n\n element?.focus()\n })\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }","[activeIndex, rootElementRef, setActiveIndex, shouldFocus]","{\n activeElement,\n activeIndex,\n handleItemMouseEnter,\n handleItemMouseLeave,\n handleKeyDown,\n mount,\n }","_c","_temp","padding = 1","shouldFocus = null","gap = 1","() => ref.current","{onKeyDown, originElement, shouldFocus, rootElementRef: ref}","(el: HTMLDivElement | null) => {\n // Run cleanup of previously registered elements\n if (unregisterElementRef.current) {\n // 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.\n // Since we can't change the `registerElement` implementation itself without making breaking change,\n // that is explained in the code comments for createGlobalScopedContext.tsx,\n // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.\n unregisterElementRef.current()\n unregisterElementRef.current = null\n }\n\n ref.current = el\n\n // Register root element (for nested menus)\n if (ref.current && registerElement) {\n unregisterElementRef.current = registerElement(ref.current)\n }\n }","useCallback(\n (el: HTMLDivElement | null) => {\n // Run cleanup of previously registered elements\n if (unregisterElementRef.current) {\n // 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.\n // Since we can't change the `registerElement` implementation itself without making breaking change,\n // that is explained in the code comments for createGlobalScopedContext.tsx,\n // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.\n unregisterElementRef.current()\n unregisterElementRef.current = null\n }\n\n ref.current = el\n\n // Register root element (for nested menus)\n if (ref.current && registerElement) {\n unregisterElementRef.current = registerElement(ref.current)\n }\n },\n [registerElement],\n )","() => {\n if (onItemSelect) onItemSelect(activeIndex)\n }","[activeIndex, onItemSelect]","() => [ref.current]","(event) => {\n if (!isTopLayer) return\n\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (onEscape) onEscape()\n }\n }","useCallback(\n (event) => {\n if (!isTopLayer) return\n\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (onEscape) onEscape()\n }\n },\n [isTopLayer, onEscape],\n )","{\n version: 2,\n activeElement,\n mount,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemMouseEnter: handleItemMouseEnter,\n onItemMouseLeave: handleItemMouseLeave,\n registerElement,\n }","clsx(menu, className)","<Stack gap={gap}>{children}</Stack>","<Box\n className={clsx(menu, className)}\n data-ui=\"Menu\"\n {...restProps}\n onKeyDown={handleKeyDown}\n padding={padding}\n ref={handleRefChange}\n role=\"menu\"\n tabIndex={-1}\n >\n <Stack gap={gap}>{children}</Stack>\n </Box>","<MenuContext.Provider value={value}>\n <Box\n className={clsx(menu, className)}\n data-ui=\"Menu\"\n {...restProps}\n onKeyDown={handleKeyDown}\n padding={padding}\n ref={handleRefChange}\n role=\"menu\"\n tabIndex={-1}\n >\n <Stack gap={gap}>{children}</Stack>\n </Box>\n </MenuContext.Provider>","MenuContext.Provider","_c","disableRestoreFocusOnClose = false","() => new Set<HTMLElement>()","buttonProp?.props ?? {}","props","(event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonClick?.(event)\n setOpen((v) => !v)\n setShouldFocus(null)\n setButtonElement(event.currentTarget)\n }","(v) => !v","useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonClick?.(event)\n setOpen((v) => !v)\n setShouldFocus(null)\n setButtonElement(event.currentTarget)\n },\n [onButtonClick, setOpen],\n )","(event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonMouseDown?.(event)\n if (open) event.preventDefault()\n }","event","useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonMouseDown?.(event)\n if (open) event.preventDefault()\n },\n [onButtonMouseDown, open],\n )","(event: React.KeyboardEvent<HTMLButtonElement>) => {\n onButtonKeyDown?.(event)\n\n // On `ArrowDown`, `Enter` and `Space`\n // - Opens menu and moves focus to first menuitem\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('first')\n setButtonElement(event.currentTarget)\n\n return\n }\n\n // On `ArrowUp`\n // - \tOpens menu and moves focus to last menuitem\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('last')\n setButtonElement(event.currentTarget)\n\n return\n }\n }","useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onButtonKeyDown?.(event)\n\n // On `ArrowDown`, `Enter` and `Space`\n // - Opens menu and moves focus to first menuitem\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('first')\n setButtonElement(event.currentTarget)\n\n return\n }\n\n // On `ArrowUp`\n // - \tOpens menu and moves focus to last menuitem\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('last')\n setButtonElement(event.currentTarget)\n\n return\n }\n },\n [onButtonKeyDown, setOpen],\n )","(event: MouseEvent) => {\n const target = event.target\n\n if (!(target instanceof Node)) {\n return\n }\n\n if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {\n return\n }\n\n for (const el of menuElements) {\n if (target === el || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n }","useCallback(\n (event: MouseEvent) => {\n const target = event.target\n\n if (!(target instanceof Node)) {\n return\n }\n\n if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {\n return\n }\n\n for (const el of menuElements) {\n if (target === el || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [buttonElement, menuElements, setOpen],\n )","() => {\n setOpen(false, returnFocusTo)\n }","useCallback(() => {\n setOpen(false, returnFocusTo)\n }, [returnFocusTo, setOpen])","(event: FocusEvent) => {\n const target = event.relatedTarget\n\n if (!(target instanceof Node)) {\n return\n }\n\n for (const el of menuElements) {\n if (el === target || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n }","target","el","useCallback(\n (event: FocusEvent) => {\n const target = event.relatedTarget\n\n if (!(target instanceof Node)) {\n return\n }\n\n for (const el of menuElements) {\n if (el === target || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [menuElements, setOpen],\n )","(el: HTMLElement) => {\n menuElements.add(el)\n\n return () => {\n menuElements.delete(el)\n }\n }","useCallback(\n (el: HTMLElement) => {\n menuElements.add(el)\n\n return () => {\n menuElements.delete(el)\n }\n },\n [menuElements],\n )","menuProp && cloneElement(menuProp, menuProps)","buttonProp &&\n cloneElement(buttonProp, {\n 'data-ui': 'MenuButton',\n id,\n 'onClick': handleButtonClick,\n 'onKeyDown': handleButtonKeyDown,\n 'onMouseDown': handleMouseDown,\n 'aria-haspopup': true,\n 'aria-expanded': open,\n 'ref': setButton,\n 'selected': buttonProp.props.selected ?? open,\n })","useMemo(\n () =>\n buttonProp &&\n cloneElement(buttonProp, {\n 'data-ui': 'MenuButton',\n id,\n 'onClick': handleButtonClick,\n 'onKeyDown': handleButtonKeyDown,\n 'onMouseDown': handleMouseDown,\n 'aria-haspopup': true,\n 'aria-expanded': open,\n 'ref': setButton,\n 'selected': buttonProp.props.selected ?? open,\n }),\n [buttonProp, handleButtonClick, handleButtonKeyDown, handleMouseDown, id, open, setButton],\n )","popover || {}","{\n overflow: 'auto',\n portal: true,\n // oxlint-disable-next-line no-useless-fallback-in-spread\n ...(popover || {}),\n }","useMemo(\n () => ({\n overflow: 'auto',\n portal: true,\n // oxlint-disable-next-line no-useless-fallback-in-spread\n ...(popover || {}),\n }),\n [popover],\n )","button || <></>","<Popover data-ui=\"MenuButton__popover\" {...popoverProps} content={menu} open={open}>\n {button || <></>}\n </Popover>","(action: React.SetStateAction<boolean>, returnFocusTo?: HTMLElement | null) => {\n const nextOpen = typeof action === 'function' ? action(openRef.current) : action\n const changed = openRef.current !== nextOpen\n openRef.current = nextOpen\n if (changed) setOpenState(nextOpen)\n // Focus handlers run synchronously: the close that the menu's blur causes must find the menu\n // closed already, and a change that another handler makes supersedes this one\n returnFocusTo?.focus()\n if (!changed || openRef.current !== nextOpen) return\n if (nextOpen) {\n onOpen?.()\n } else {\n onClose?.()\n }\n }","useCallback(\n (action: React.SetStateAction<boolean>, returnFocusTo?: HTMLElement | null) => {\n const nextOpen = typeof action === 'function' ? action(openRef.current) : action\n const changed = openRef.current !== nextOpen\n openRef.current = nextOpen\n if (changed) setOpenState(nextOpen)\n // Focus handlers run synchronously: the close that the menu's blur causes must find the menu\n // closed already, and a change that another handler makes supersedes this one\n returnFocusTo?.focus()\n if (!changed || openRef.current !== nextOpen) return\n if (nextOpen) {\n onOpen?.()\n } else {\n onClose?.()\n }\n },\n [onClose, onOpen],\n )","[open, setOpen]","(node: HTMLButtonElement) => {\n if (lastNodeRef.current && lastNodeRef.current !== node) {\n setButtonElement((element) => element && node)\n }\n lastNodeRef.current = node\n\n return attachRef(forwardedRef, node)\n }","useCallback(\n (node: HTMLButtonElement) => {\n if (lastNodeRef.current && lastNodeRef.current !== node) {\n setButtonElement((element) => element && node)\n }\n lastNodeRef.current = node\n\n return attachRef(forwardedRef, node)\n },\n [forwardedRef, setButtonElement],\n )","_c","_temp","_Fragment","as = 'hr'","clsx(menuDivider, className)","<Component\n data-ui=\"MenuDivider\"\n className={clsx(menuDivider, className)}\n ref={ref}\n {...restProps}\n />","_c","as = 'button'","fontSize = 1","padding = 3","radius = 2","gap = 3","tone = 'default'","(current) => current + 1","(event: React.MouseEvent<HTMLElement>) => {\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => setOpenedIn(activation))\n }","useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => setOpenedIn(activation))\n },\n [activation, onItemMouseEnter],\n )","(event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.stopPropagation()\n\n startTransition(() => setOpenedIn(null))\n\n requestAnimationFrame(() => {\n rootElement?.focus()\n })\n }\n }","rootElement?.focus","event","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.stopPropagation()\n\n startTransition(() => setOpenedIn(null))\n\n requestAnimationFrame(() => {\n rootElement?.focus()\n })\n }\n },\n [rootElement],\n )","(event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n }","useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n },\n [activation, onClick, onItemMouseEnter],\n )","() => {\n startTransition(() => setOpenedIn(null))\n onItemClick?.()\n }","useCallback(() => {\n startTransition(() => setOpenedIn(null))\n onItemClick?.()\n }, [onItemClick])","() => setWithinMenu(true)","useCallback(() => setWithinMenu(true), [])","() => mount(rootElement)","[mount, rootElement]","() => {\n if (!shouldFocus) return\n // The useMenuController effect that handles `shouldFocus` schedules a request animation frame where it's processed.\n // By doing the same here, we ensure that the reset is processed after the focus change.\n const rafId = requestAnimationFrame(() => setShouldFocus(null))\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }","[shouldFocus]","<Menu\n {...menuProps}\n onClickOutside={onClickOutside}\n onEscape={onEscape}\n onItemClick={handleChildItemClick}\n onKeyDown={handleMenuKeyDown}\n onMouseEnter={handleMenuMouseEnter}\n registerElement={registerElement}\n shouldFocus={shouldFocus}\n >\n {children}\n </Menu>","(event: React.KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n\n if (document.activeElement !== target) {\n return\n }\n\n if (event.key === 'ArrowRight') {\n setWithinMenu(true)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n\n return\n }\n }","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n\n if (document.activeElement !== target) {\n return\n }\n\n if (event.key === 'ArrowRight') {\n setWithinMenu(true)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n\n return\n }\n },\n [activation, onItemMouseEnter],\n )","_getArrayProp(radius)","IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )","<Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>","<ChevronRightIcon />","<Text size={fontSize}>\n <ChevronRightIcon />\n </Text>","<Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>","<Selectable\n data-as={as}\n data-ui=\"MenuGroup\"\n forwardedAs={as}\n {...restProps}\n aria-pressed={as === 'button' ? pressed : undefined}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={!pressed && active ? '' : undefined}\n $radius={_getArrayProp(radius)}\n $tone={tone}\n $scheme={scheme}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n ref={setRootElement}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n <Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>\n </Selectable>","as === 'button' ? pressed : undefined","as !== 'button' && pressed ? '' : undefined","!pressed && active ? '' : undefined","as === 'button' ? 'button' : undefined","<Popover {...popover} content={childMenu} data-ui=\"MenuGroup__popover\" open={childMenuOpen}>\n <Selectable\n data-as={as}\n data-ui=\"MenuGroup\"\n forwardedAs={as}\n {...restProps}\n aria-pressed={as === 'button' ? pressed : undefined}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={!pressed && active ? '' : undefined}\n $radius={_getArrayProp(radius)}\n $tone={tone}\n $scheme={scheme}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n ref={setRootElement}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n <Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>\n </Selectable>\n </Popover>","_c","_temp","as = 'button'","fontSize = 1","padding = 3","radius = 2","gap = 3","tone = 'default'","() => ref.current","() => mount(rootElement, selectedProp)","[mount, rootElement, selectedProp]","(event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n if (onClick) onClick(event)\n if (onItemClick) onItemClick()\n }","useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n if (onClick) onClick(event)\n if (onItemClick) onItemClick()\n },\n [disabled, onClick, onItemClick],\n )","{\n padding,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n }","useMemo(\n () => ({\n padding,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n }),\n [padding, paddingX, paddingY, paddingTop, paddingRight, paddingBottom, paddingLeft],\n )","_getArrayProp(fontSize).map((s) => s - 1)","(s) => s - 1","(el: HTMLDivElement | null) => {\n ref.current = el\n setRootElement(el)\n }","useCallback((el: HTMLDivElement | null) => {\n ref.current = el\n setRootElement(el)\n }, [])","_getArrayProp(radius)","_getArrayProp(0)","(IconComponent || text || IconRightComponent) && (\n <Flex as=\"span\" gap={gap} align=\"center\" {...paddingProps}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n {text && (\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n )}\n\n {hotkeys && (\n <Hotkeys\n fontSize={hotkeysFontSize}\n keys={hotkeys}\n style={{marginTop: -4, marginBottom: -4}}\n />\n )}\n\n {IconRightComponent && (\n <Text size={fontSize}>\n {isValidElement(IconRightComponent) && IconRightComponent}\n {isValidElementType(IconRightComponent) && <IconRightComponent />}\n </Text>\n )}\n </Flex>\n )","children && (\n <Box as=\"span\" {...paddingProps}>\n {children}\n </Box>\n )","<Selectable\n data-ui=\"MenuItem\"\n role=\"menuitem\"\n {...restProps}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={active ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n forwardedAs={as}\n $radius={_getArrayProp(radius)}\n $padding={_getArrayProp(0)}\n $tone={disabled ? 'default' : tone}\n $scheme={scheme}\n disabled={disabled}\n onClick={handleClick}\n onMouseEnter={onItemMouseEnter}\n onMouseLeave={onItemMouseLeave}\n ref={setRef}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n {(IconComponent || text || IconRightComponent) && (\n <Flex as=\"span\" gap={gap} align=\"center\" {...paddingProps}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n {text && (\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n )}\n\n {hotkeys && (\n <Hotkeys\n fontSize={hotkeysFontSize}\n keys={hotkeys}\n style={{marginTop: -4, marginBottom: -4}}\n />\n )}\n\n {IconRightComponent && (\n <Text size={fontSize}>\n {isValidElement(IconRightComponent) && IconRightComponent}\n {isValidElementType(IconRightComponent) && <IconRightComponent />}\n </Text>\n )}\n </Flex>\n )}\n {children && (\n <Box as=\"span\" {...paddingProps}>\n {children}\n </Box>\n )}\n </Selectable>","as !== 'button' && pressed ? '' : undefined","active ? '' : undefined","disabled ? '' : undefined","disabled ? 'default' : tone","as === 'button' ? 'button' : undefined","_c","\"onBlurCapture\"","\"onClickOutside\"","\"onEscape\"","\"onItemClick\"","\"originElement\"","\"onClick\"","\"onKeyDown\"","\"onMouseDown\"","\"ref\"","\"selected\""],"sources":["../src/core/components/menu/menuContext.ts","../src/core/components/menu/helpers.ts","../src/core/components/menu/useMenuController.ts","../src/core/components/menu/menu.css.ts","../src/core/components/menu/menu.tsx","../src/core/components/menu/menuButton.tsx","../src/core/components/menu/menuDivider.css.ts","../src/core/components/menu/menuDivider.tsx","../src/core/primitives/_selectable/style.ts","../src/core/primitives/_selectable/selectable.tsx","../src/core/components/menu/useMenu.ts","../src/core/components/menu/menuGroup.tsx","../src/core/components/menu/menuItem.tsx"],"sourcesContent":["import {createGlobalScopedContext} from '../../lib/createGlobalScopedContext'\n\nexport interface MenuContextValue {\n version: 2\n activeElement: HTMLElement | null\n mount: (element: HTMLElement | null, selected?: boolean) => () => void\n onClickOutside?: (event: MouseEvent) => void\n onEscape?: () => void\n onItemClick?: () => void\n /** Makes `event.currentTarget` the active item, also on a click or key press */\n onItemMouseEnter: (event: React.SyntheticEvent<HTMLElement>) => void\n onItemMouseLeave: (event: React.MouseEvent<HTMLElement>) => void\n registerElement?: (el: HTMLElement) => () => void\n}\n\nexport const MenuContext = createGlobalScopedContext<MenuContextValue | null>(\n '@sanity/ui/context/menu',\n null,\n)\n","import {isHTMLAnchorElement, isHTMLButtonElement} from '../../helpers/element'\n\n/**\n * @internal\n */\nfunction _isFocusable(element: HTMLElement) {\n return (\n (isHTMLAnchorElement(element) && element.getAttribute('data-disabled') !== 'true') ||\n (isHTMLButtonElement(element) && !element.disabled)\n )\n}\n\n/**\n * @internal\n */\nexport function _getFocusableElements(elements: HTMLElement[]): HTMLElement[] {\n return elements.filter(_isFocusable)\n}\n\nfunction _getDOMPath(rootElement: HTMLElement, el: HTMLElement): number[] {\n const path: number[] = []\n\n let e = el\n\n while (e !== rootElement) {\n const parentElement = e.parentElement\n\n if (!parentElement) return path\n\n const children = Array.from(parentElement.childNodes)\n const index = children.indexOf(e)\n\n path.unshift(index)\n\n if (parentElement === rootElement) {\n return path\n }\n\n e = parentElement\n }\n\n return path\n}\n\nconst EMPTY_PATH: number[] = []\n\n/**\n * @internal\n */\nexport function _sortElements(rootElement: HTMLElement | null, elements: HTMLElement[]): void {\n if (!rootElement) return\n\n const map = new WeakMap<HTMLElement, number[]>()\n\n for (const el of elements) {\n map.set(el, _getDOMPath(rootElement, el))\n }\n\n const _sort = (a: HTMLElement, b: HTMLElement) => {\n const _a = map.get(a) || EMPTY_PATH\n const _b = map.get(b) || EMPTY_PATH\n\n const len = Math.max(_a.length, _b.length)\n\n // Loop until there are different indexes\n for (let i = 0; i < len; i += 1) {\n const aIndex = _a[i] || -1\n const bIndex = _b[i] || -1\n\n if (aIndex !== bIndex) {\n return aIndex - bIndex\n }\n }\n\n return 0\n }\n\n elements.sort(_sort)\n}\n","import {useCallback, useEffect, useRef, useState} from 'react'\n\nimport {_getFocusableElements, _sortElements} from './helpers'\n\n/**\n * @internal\n */\nexport interface MenuController {\n activeElement: HTMLElement | null\n activeIndex: number\n handleItemMouseEnter: (event: React.SyntheticEvent<HTMLElement>) => void\n handleItemMouseLeave: () => void\n handleKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void\n mount: (element: HTMLElement | null, selected?: boolean) => () => void\n}\n\n/**\n * This controller is responsible for controlling UI menu state.\n *\n * @internal\n */\nexport function useMenuController(props: {\n onKeyDown?: React.KeyboardEventHandler\n originElement?: HTMLElement | null\n shouldFocus: 'first' | 'last' | null\n rootElementRef: React.RefObject<HTMLDivElement | null>\n}): MenuController {\n const {onKeyDown, originElement, shouldFocus, rootElementRef} = props\n const elementsRef = useRef<HTMLElement[]>([])\n const [activeIndex, _setActiveIndex] = useState(-1)\n const activeIndexRef = useRef(activeIndex)\n const [activeElement, setActiveElement] = useState<HTMLElement | null>(null)\n\n const setActiveIndex = useCallback((nextActiveIndex: number) => {\n _setActiveIndex(nextActiveIndex)\n activeIndexRef.current = nextActiveIndex\n setActiveElement(elementsRef.current[nextActiveIndex] || null)\n }, [])\n\n const mount = useCallback(\n (element: HTMLElement | null, selected?: boolean): (() => void) => {\n if (!element) return () => undefined\n\n if (elementsRef.current.indexOf(element) === -1) {\n elementsRef.current.push(element)\n _sortElements(rootElementRef.current, elementsRef.current)\n }\n\n if (selected) {\n const selectedIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(selectedIndex)\n }\n\n return () => {\n const idx = elementsRef.current.indexOf(element)\n\n if (idx > -1) {\n elementsRef.current.splice(idx, 1)\n }\n }\n },\n [rootElementRef, setActiveIndex],\n )\n\n // Reset the active item when the menu unmounts, or is hidden inside an <Activity> boundary\n // (which unmounts effects while preserving state), so that reopening behaves like a fresh\n // mount: `shouldFocus` applies again and `selected` items re-register through `mount`.\n useEffect(() => {\n return () => setActiveIndex(-1)\n }, [setActiveIndex])\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Move focus to the element that opened the menu before handling the `Tab` press\n if (event.key === 'Tab') {\n if (originElement) {\n originElement.focus()\n }\n\n return\n }\n\n // Move focus to the first focusable menuitem\n if (event.key === 'Home') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n // Move focus to the last focusable menuitem\n if (event.key === 'End') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex - 1 + focusableLen) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex + 1) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (onKeyDown) {\n onKeyDown(event)\n }\n },\n [onKeyDown, originElement, setActiveIndex],\n )\n\n const handleItemMouseEnter = useCallback(\n (event: React.SyntheticEvent<HTMLElement>) => {\n const element = event.currentTarget\n const currentIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(currentIndex)\n },\n [setActiveIndex],\n )\n\n const handleItemMouseLeave = useCallback(() => {\n // Set the active index to -2 to deactivate all menu items\n // when the user moves the mouse away from the menu item.\n // We avoid using -1 because it would focus the first menu item,\n // which would be incorrect when the user hovers over a gap\n // between two menu items or a menu divider.\n setActiveIndex(-2)\n rootElementRef.current?.focus()\n }, [rootElementRef, setActiveIndex])\n\n // Set focus on the currently active element\n useEffect(() => {\n if (!rootElementRef.current) return\n\n const rafId = requestAnimationFrame(() => {\n if (activeIndex === -1) {\n if (shouldFocus === 'first') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n if (shouldFocus === 'last') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n return\n }\n\n const element = elementsRef.current[activeIndex] || null\n\n element?.focus()\n })\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }, [activeIndex, rootElementRef, setActiveIndex, shouldFocus])\n\n return {\n activeElement,\n activeIndex,\n handleItemMouseEnter,\n handleItemMouseLeave,\n handleKeyDown,\n mount,\n }\n}\n","import {style} from '@vanilla-extract/css'\n\nexport const menu = style({\n outline: 'none',\n overflow: 'auto',\n})\n","import {clsx} from 'clsx/lite'\nimport {useCallback, useEffect, useImperativeHandle, useMemo, useRef} from 'react'\n\nimport {useClickOutsideEvent} from '../../hooks/useClickOutsideEvent'\nimport {useGlobalKeyDown} from '../../hooks/useGlobalKeyDown'\nimport {Box} from '../../primitives/box/box'\nimport {Stack} from '../../primitives/stack/stack'\nimport {ResponsivePaddingProps} from '../../primitives/types'\nimport {useLayer} from '../../utils/layer/useLayer'\nimport {MenuContext, MenuContextValue} from './menuContext'\nimport {useMenuController} from './useMenuController'\n\nimport {menu} from './menu.css'\n\n/**\n * @public\n */\nexport interface MenuProps extends ResponsivePaddingProps {\n /**\n * @deprecated Use `shouldFocus=\"first\"` instead.\n */\n 'focusFirst'?: never\n /**\n * @deprecated Use `shouldFocus=\"last\"` instead.\n */\n 'focusLast'?: never\n 'onClickOutside'?: (event: MouseEvent) => void\n 'onEscape'?: () => void\n 'onItemClick'?: () => void\n 'onItemSelect'?: (index: number) => void\n 'originElement'?: HTMLElement | null\n 'registerElement'?: (el: HTMLElement) => () => void\n 'shouldFocus'?: 'first' | 'last' | null\n 'gap'?: number | number[]\n /**\n * @deprecated Use `gap` instead.\n */\n 'space'?: never\n 'aria-labelledby'?: string\n 'onBlurCapture'?: (event: FocusEvent) => void\n}\n\n/**\n * The `Menu` component is a building block for application menus.\n *\n * @public\n */\nexport function Menu(\n props: MenuProps & Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'height' | 'role' | 'tabIndex'>,\n) {\n const {\n children,\n className,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemSelect,\n onKeyDown,\n originElement,\n padding = 1,\n ref: forwardedRef,\n registerElement,\n shouldFocus = null,\n gap = 1,\n ...restProps\n } = props\n\n const ref = useRef<HTMLDivElement | null>(null)\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)\n\n const {isTopLayer} = useLayer()\n\n const {\n activeElement,\n activeIndex,\n handleItemMouseEnter,\n handleItemMouseLeave,\n handleKeyDown,\n mount,\n } = useMenuController({onKeyDown, originElement, shouldFocus, rootElementRef: ref})\n\n const unregisterElementRef = useRef<(() => void) | null>(null)\n const handleRefChange = useCallback(\n (el: HTMLDivElement | null) => {\n // Run cleanup of previously registered elements\n if (unregisterElementRef.current) {\n // 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.\n // Since we can't change the `registerElement` implementation itself without making breaking change,\n // that is explained in the code comments for createGlobalScopedContext.tsx,\n // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.\n unregisterElementRef.current()\n unregisterElementRef.current = null\n }\n\n ref.current = el\n\n // Register root element (for nested menus)\n if (ref.current && registerElement) {\n unregisterElementRef.current = registerElement(ref.current)\n }\n },\n [registerElement],\n )\n\n // Trigger `onItemSelect` when active index changes\n useEffect(() => {\n if (onItemSelect) onItemSelect(activeIndex)\n }, [activeIndex, onItemSelect])\n\n // Close menu when clicking outside\n useClickOutsideEvent(isTopLayer && onClickOutside, () => [ref.current])\n\n // Close menu when pressing Escape\n useGlobalKeyDown(\n useCallback(\n (event) => {\n if (!isTopLayer) return\n\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (onEscape) onEscape()\n }\n },\n [isTopLayer, onEscape],\n ),\n )\n\n const value = useMemo(\n () =>\n ({\n version: 2,\n activeElement,\n mount,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemMouseEnter: handleItemMouseEnter,\n onItemMouseLeave: handleItemMouseLeave,\n registerElement,\n }) satisfies MenuContextValue,\n [\n activeElement,\n mount,\n handleItemMouseEnter,\n handleItemMouseLeave,\n onClickOutside,\n onEscape,\n onItemClick,\n registerElement,\n ],\n )\n\n return (\n <MenuContext.Provider value={value}>\n <Box\n className={clsx(menu, className)}\n data-ui=\"Menu\"\n {...restProps}\n onKeyDown={handleKeyDown}\n padding={padding}\n ref={handleRefChange}\n role=\"menu\"\n tabIndex={-1}\n >\n <Stack gap={gap}>{children}</Stack>\n </Box>\n </MenuContext.Provider>\n )\n}\n","import {cloneElement, useCallback, useMemo, useRef, useState} from 'react'\n\nimport {Popover, PopoverProps} from '../../primitives/popover/popover'\nimport {attachRef} from '../../utils/attachRef'\nimport {MenuProps} from './menu'\n\n/**\n * @public\n */\nexport interface MenuButtonProps {\n /**\n * @beta Do not use in production.\n */\n __unstable_disableRestoreFocusOnClose?: boolean\n /**\n * @deprecated Use `popover={{floatingBoundary: element}}` and/or `popover={{referenceBoundary: element}}` instead.\n */\n boundaryElement?: never\n /**\n * Its `onClick`, `onKeyDown` and `onMouseDown` run before `MenuButton`'s handlers, which act on\n * the event even when those called `event.preventDefault()`. Disable the button to keep its\n * menu closed. Enter and Space open the menu on `keydown` and don't trigger `onClick`.\n */\n button: React.JSX.Element\n id: string\n menu?: React.JSX.Element\n onClose?: () => void\n onOpen?: () => void\n /**\n * @deprecated Use `popover={{placement: 'top'}}` instead.\n */\n placement?: never\n popover?: Omit<PopoverProps, 'content' | 'open'>\n /**\n * @deprecated Use `popover={{scheme: 'dark'}}` instead.\n */\n popoverScheme?: never\n /**\n * @deprecated Use `popover={{radius: 2}}` instead.\n */\n popoverRadius?: never\n /**\n * @beta Do not use in production.\n * @deprecated Use `popover={{portal: true}}` instead.\n */\n portal?: never\n /**\n * @deprecated Use `popover={{preventOverflow: true}}` instead.\n */\n preventOverflow?: never\n ref?: React.Ref<HTMLButtonElement | null>\n}\n\n/**\n * The `MenuButton` component follows the WAI-ARIA specification for menu buttons.\n *\n * @public\n */\nexport function MenuButton(props: MenuButtonProps) {\n const {\n __unstable_disableRestoreFocusOnClose: disableRestoreFocusOnClose = false,\n button: buttonProp,\n id,\n menu: menuProp,\n onClose,\n onOpen,\n popover,\n ref: forwardedRef,\n } = props\n const [open, setOpen] = useOpenState(onOpen, onClose)\n const [shouldFocus, setShouldFocus] = useState<'first' | 'last' | null>(null)\n // Set by the button's event handlers, the only way the menu opens, rather than whenever the\n // button attaches: a state update from a ref callback re-renders synchronously on every mount\n // and `<Activity>` reveal, which holds up a view transition of the button (see\n // `useReferenceElement`)\n const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)\n // Mutated in place: only event handlers read it, so registering a menu element needs no render\n const [menuElements] = useState(() => new Set<HTMLElement>())\n const {\n onClick: onButtonClick,\n onKeyDown: onButtonKeyDown,\n onMouseDown: onButtonMouseDown,\n }: React.DOMAttributes<HTMLButtonElement> = buttonProp?.props ?? {}\n\n const handleButtonClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonClick?.(event)\n setOpen((v) => !v)\n setShouldFocus(null)\n setButtonElement(event.currentTarget)\n },\n [onButtonClick, setOpen],\n )\n\n // Prevent mouse event propagation when the menu is open.\n // This is to ensure that `handleBlur` isn't triggered when clicking the menu button whilst open,\n // which can lead to `setOpen` being triggered multiple times (once by `handleBlur`, and again by `handleButtonClick`).\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonMouseDown?.(event)\n if (open) event.preventDefault()\n },\n [onButtonMouseDown, open],\n )\n\n const handleButtonKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onButtonKeyDown?.(event)\n\n // On `ArrowDown`, `Enter` and `Space`\n // - Opens menu and moves focus to first menuitem\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('first')\n setButtonElement(event.currentTarget)\n\n return\n }\n\n // On `ArrowUp`\n // - \tOpens menu and moves focus to last menuitem\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('last')\n setButtonElement(event.currentTarget)\n\n return\n }\n },\n [onButtonKeyDown, setOpen],\n )\n\n const handleMenuClickOutside = useCallback(\n (event: MouseEvent) => {\n const target = event.target\n\n if (!(target instanceof Node)) {\n return\n }\n\n if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {\n return\n }\n\n for (const el of menuElements) {\n if (target === el || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [buttonElement, menuElements, setOpen],\n )\n\n const returnFocusTo = disableRestoreFocusOnClose ? null : buttonElement\n\n const handleMenuEscape = useCallback(() => {\n setOpen(false, returnFocusTo)\n }, [returnFocusTo, setOpen])\n\n const handleBlur = useCallback(\n (event: FocusEvent) => {\n const target = event.relatedTarget\n\n if (!(target instanceof Node)) {\n return\n }\n\n for (const el of menuElements) {\n if (el === target || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [menuElements, setOpen],\n )\n\n const handleItemClick = useCallback(() => {\n setOpen(false, returnFocusTo)\n }, [returnFocusTo, setOpen])\n\n const registerElement = useCallback(\n (el: HTMLElement) => {\n menuElements.add(el)\n\n return () => {\n menuElements.delete(el)\n }\n },\n [menuElements],\n )\n\n const menuProps: MenuProps = {\n 'aria-labelledby': id,\n 'onBlurCapture': handleBlur,\n 'onClickOutside': handleMenuClickOutside,\n 'onEscape': handleMenuEscape,\n 'onItemClick': handleItemClick,\n 'originElement': buttonElement,\n registerElement,\n shouldFocus,\n }\n\n const menu = menuProp && cloneElement(menuProp, menuProps)\n\n const setButton = useButtonRef(forwardedRef, setButtonElement)\n\n const button = useMemo(\n () =>\n buttonProp &&\n cloneElement(buttonProp, {\n 'data-ui': 'MenuButton',\n id,\n 'onClick': handleButtonClick,\n 'onKeyDown': handleButtonKeyDown,\n 'onMouseDown': handleMouseDown,\n 'aria-haspopup': true,\n 'aria-expanded': open,\n 'ref': setButton,\n 'selected': buttonProp.props.selected ?? open,\n }),\n [buttonProp, handleButtonClick, handleButtonKeyDown, handleMouseDown, id, open, setButton],\n )\n\n const popoverProps: MenuButtonProps['popover'] = useMemo(\n () => ({\n overflow: 'auto',\n portal: true,\n // oxlint-disable-next-line no-useless-fallback-in-spread\n ...(popover || {}),\n }),\n [popover],\n )\n\n return (\n <Popover data-ui=\"MenuButton__popover\" {...popoverProps} content={menu} open={open}>\n {button || <></>}\n </Popover>\n )\n}\n\n/**\n * The open state, with `onOpen` and `onClose` called by `setOpen` when it changes. A hook because\n * `setOpen` reads a ref, and the React Compiler rejects passing such a function to `cloneElement`.\n */\nfunction useOpenState(onOpen?: () => void, onClose?: () => void) {\n const [open, setOpenState] = useState(false)\n const openRef = useRef(false)\n\n const setOpen = useCallback(\n (action: React.SetStateAction<boolean>, returnFocusTo?: HTMLElement | null) => {\n const nextOpen = typeof action === 'function' ? action(openRef.current) : action\n const changed = openRef.current !== nextOpen\n openRef.current = nextOpen\n if (changed) setOpenState(nextOpen)\n // Focus handlers run synchronously: the close that the menu's blur causes must find the menu\n // closed already, and a change that another handler makes supersedes this one\n returnFocusTo?.focus()\n if (!changed || openRef.current !== nextOpen) return\n if (nextOpen) {\n onOpen?.()\n } else {\n onClose?.()\n }\n },\n [onClose, onOpen],\n )\n\n return [open, setOpen] as const\n}\n\n/**\n * The button's ref callback: attaches the forwarded ref, and moves `buttonElement` to a button\n * that replaces the one it is set to. The same button attaching again (an `<Activity>` showing\n * it, a new forwarded ref) schedules nothing. A hook because the React Compiler skips a component\n * that passes a callback reading a ref to `cloneElement`.\n */\nfunction useButtonRef(\n forwardedRef: React.Ref<HTMLButtonElement | null> | undefined,\n setButtonElement: React.Dispatch<React.SetStateAction<HTMLButtonElement | null>>,\n): (node: HTMLButtonElement) => () => void {\n const lastNodeRef = useRef<HTMLButtonElement | null>(null)\n\n return useCallback(\n (node: HTMLButtonElement) => {\n if (lastNodeRef.current && lastNodeRef.current !== node) {\n setButtonElement((element) => element && node)\n }\n lastNodeRef.current = node\n\n return attachRef(forwardedRef, node)\n },\n [forwardedRef, setButtonElement],\n )\n}\n","import {style} from '@vanilla-extract/css'\n\nexport const menuDivider = style({\n height: '1px',\n border: 0,\n background: 'var(--card-hairline-soft-color)',\n margin: 0,\n})\n","import {clsx} from 'clsx/lite'\n\nimport {ElementType, EmptyProps, Props} from '../../types/component'\n\nimport {menuDivider} from './menuDivider.css'\n\n/**\n * @public\n */\nexport type MenuDividerProps<E extends ElementType = 'hr'> = Props<EmptyProps, E>\n\nfunction MenuDividerComponent(\n props: {as?: ElementType} & Omit<React.HTMLProps<HTMLHRElement>, 'as'>,\n) {\n const {as = 'hr', className, ref, ...restProps} = props\n // Rendering the polymorphic `as` needs one concrete element type for JSX to\n // type-check the hr-flavored props (the same widening styled-components'\n // `as` prop performed here before).\n // oxlint-disable-next-line no-unsafe-type-assertion\n const Component = as as 'hr'\n\n return (\n <Component\n data-ui=\"MenuDivider\"\n className={clsx(menuDivider, className)}\n ref={ref}\n {...restProps}\n />\n )\n}\n\n/**\n * @public\n */\nexport const MenuDivider: <E extends ElementType = 'hr'>(\n props: MenuDividerProps<E>,\n) => React.JSX.Element = MenuDividerComponent\n","import {css} from 'styled-components'\n\nimport {getTheme_v2} from '../../../theme/versioning/getTheme_v2'\nimport {_cardColorStyle} from '../../styles/card/_cardColorStyle'\nimport {ThemeProps} from '../../styles/types'\nimport {SelectableTone} from '../../types/selectable'\n\n/**\n * @internal\n */\nexport interface SelectableStyleProps {\n $tone: SelectableTone\n}\n\nexport const selectableBaseStyle = css`\n background-color: var(--card-bg-color);\n color: var(--card-fg-color);\n outline: none;\n\n &[data-as='button'] {\n -webkit-font-smoothing: inherit;\n appearance: none;\n outline: none;\n font: inherit;\n text-align: inherit;\n border: 0;\n width: -moz-available;\n width: -webkit-fill-available;\n width: stretch;\n }\n\n /* &:is(a) */\n &[data-as='a'] {\n text-decoration: none;\n }\n`\n\nexport function selectableColorStyle(\n props: SelectableStyleProps & ThemeProps,\n): ReturnType<typeof css> {\n const {$tone} = props\n const {color} = getTheme_v2(props.theme)\n const tone = color.selectable[$tone]\n\n // A selectable is either a button or a link, so their state rules can share selector lists\n return css`\n ${_cardColorStyle(color, tone.enabled)}\n\n &[data-as='button']:not(:disabled)[aria-pressed='true'],\n &[data-as='a']:not([data-disabled])[data-pressed] {\n ${_cardColorStyle(color, tone.pressed)}\n }\n\n &[data-as='button']:not(:disabled)[data-selected],\n &[data-as='button']:not(:disabled)[aria-selected='true'] > &[data-as='button']:not(:disabled),\n &[data-as='a']:not([data-disabled])[data-selected] {\n ${_cardColorStyle(color, tone.selected)}\n }\n\n @media (hover: hover) {\n &[data-as='button']:not(:disabled):not([data-selected]),\n &[data-as='a']:not([data-disabled]):not([data-selected]) {\n &[data-hovered],\n &:hover {\n ${_cardColorStyle(color, tone.hovered)}\n }\n\n &:active {\n ${_cardColorStyle(color, tone.pressed)}\n }\n }\n }\n `\n}\n\nexport function selectableDisabledStyle(\n props: SelectableStyleProps & ThemeProps,\n): ReturnType<typeof css> {\n const {color} = getTheme_v2(props.theme)\n\n return css`\n &[data-as='button']:disabled,\n &[data-as='a'][data-disabled] {\n ${_cardColorStyle(color, color.selectable[props.$tone].disabled)}\n }\n `\n}\n\nexport function selectableStyle(props: ThemeProps): ReturnType<typeof css> {\n const {style} = getTheme_v2(props.theme)\n\n return css`\n ${style?.card?.root}\n `\n}\n","import {styled} from 'styled-components'\n\nimport {responsiveRadiusStyle} from '../../styles/radius/radiusStyle'\nimport {ResponsiveRadiusStyleProps} from '../../styles/radius/types'\nimport {Box} from '../box/box'\nimport {\n selectableBaseStyle,\n selectableColorStyle,\n selectableDisabledStyle,\n selectableStyle,\n SelectableStyleProps,\n} from './style'\n\nconst SelectableBase = styled(Box)`\n ${selectableBaseStyle}\n`\n\nconst SelectableColor = styled(SelectableBase)<SelectableStyleProps>(selectableColorStyle)\n\nconst SelectableDisabled = styled(SelectableColor)<SelectableStyleProps>(selectableDisabledStyle)\n\n/**\n * @internal\n */\nexport const Selectable = styled(SelectableDisabled)<ResponsiveRadiusStyleProps>(\n responsiveRadiusStyle,\n selectableStyle,\n)\n","import {useContext} from 'react'\n\nimport {isRecord} from '../../lib/isRecord'\nimport {MenuContext, MenuContextValue} from './menuContext'\n\nexport function useMenu(): MenuContextValue {\n const value = useContext(MenuContext)\n\n if (!value) {\n throw new Error('useMenu(): missing context value')\n }\n\n // NOTE: This check is for future-compatiblity\n // - If the value is not an object, it’s not compatible with the current version\n // - If the value is an object, but doesn’t have `version: 2`, it’s not compatible with the current version\n if (!isRecord(value) || value.version !== 2) {\n throw new Error('useMenu(): the context value is not compatible')\n }\n\n return value\n}\n","import {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {isValidElement, startTransition, useCallback, useEffect, useState} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {Selectable} from '../../primitives/_selectable/selectable'\nimport {Box} from '../../primitives/box/box'\nimport {Flex} from '../../primitives/flex/flex'\nimport {Popover, PopoverProps} from '../../primitives/popover/popover'\nimport {Text} from '../../primitives/text/text'\nimport {_getArrayProp} from '../../styles/helpers'\nimport {useRootTheme} from '../../theme/useRootTheme'\nimport {ElementType, Props} from '../../types/component'\nimport {Radius} from '../../types/radius'\nimport {SelectableTone} from '../../types/selectable'\nimport {Menu, MenuProps} from './menu'\nimport {useMenu} from './useMenu'\n\n/**\n * @public\n */\nexport interface MenuGroupOwnProps {\n fontSize?: number | number[]\n // oxlint-disable-next-line no-redundant-type-constituents\n icon?: React.ElementType | React.ReactNode\n menu?: Omit<\n MenuProps,\n | 'onClickOutside'\n | 'onEscape'\n | 'onItemClick'\n | 'onKeyDown'\n | 'onMouseEnter'\n | 'registerElement'\n | 'shouldFocus'\n | 'onBlurCapture'\n >\n padding?: number | number[]\n popover?: Omit<PopoverProps, 'content' | 'open'>\n radius?: Radius | Radius[]\n gap?: number | number[]\n /**\n * @deprecated Use `gap` instead.\n */\n space?: never\n text: React.ReactNode\n tone?: SelectableTone\n}\n\n/**\n * @public\n */\nexport type MenuGroupProps<E extends ElementType = 'button'> = Props<MenuGroupOwnProps, E>\n\nconst MenuGroupComponent = function MenuGroup(\n props: Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'height' | 'popover' | 'ref' | 'tabIndex'> &\n MenuGroupOwnProps & {as?: ElementType},\n): React.JSX.Element {\n const {\n as = 'button',\n children,\n fontSize = 1,\n icon: IconComponent,\n menu: menuProps,\n onClick,\n padding = 3,\n popover,\n radius = 2,\n gap = 3,\n text,\n tone = 'default',\n ...restProps\n } = props\n const menu = useMenu()\n const {scheme} = useRootTheme()\n const {\n activeElement,\n mount,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemMouseEnter: _onItemMouseEnter,\n registerElement,\n } = menu\n const onItemMouseEnter = _onItemMouseEnter ?? menu.onItemMouseEnter\n const [rootElement, setRootElement] = useState<HTMLButtonElement | HTMLDivElement | null>(null)\n const [shouldFocus, setShouldFocus] = useState<'first' | 'last' | null>(null)\n const active = Boolean(activeElement) && activeElement === rootElement\n const [withinMenu, setWithinMenu] = useState(false)\n\n // The child menu is open while the item is active and was opened during this activation. The\n // end of an activation is counted rather than reset in `openedIn`, which the openers set in\n // transitions: React does not rebase a render-phase update over a pending lower-priority one\n // (`rerenderReducer`), so the reset would be lost under an open that is still rendering.\n const [activation, setActivation] = useState(0)\n const [openedIn, setOpenedIn] = useState<number | null>(null)\n const [prevActive, setPrevActive] = useState(active)\n\n if (active !== prevActive) {\n setPrevActive(active)\n if (!active) setActivation((current) => current + 1)\n }\n\n const childMenuOpen = active && openedIn === activation\n // Every opener sets `withinMenu`, so it needs no reset when the child menu closes\n const pressed = childMenuOpen && withinMenu\n\n // The child menu opens and closes in transitions, as `Popover` asks of `open`. `shouldFocus` goes\n // with the open: it is reset a frame after it commits, which must not come before the open.\n const handleMouseEnter = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => setOpenedIn(activation))\n },\n [activation, onItemMouseEnter],\n )\n\n const handleMenuKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.stopPropagation()\n\n startTransition(() => setOpenedIn(null))\n\n requestAnimationFrame(() => {\n rootElement?.focus()\n })\n }\n },\n [rootElement],\n )\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n },\n [activation, onClick, onItemMouseEnter],\n )\n\n const handleChildItemClick = useCallback(() => {\n startTransition(() => setOpenedIn(null))\n onItemClick?.()\n }, [onItemClick])\n\n const handleMenuMouseEnter = useCallback(() => setWithinMenu(true), [])\n\n // Register the menu item element\n useEffect(() => mount(rootElement), [mount, rootElement])\n\n // Reset the shouldFocus state after it has been used\n useEffect(() => {\n if (!shouldFocus) return\n // The useMenuController effect that handles `shouldFocus` schedules a request animation frame where it's processed.\n // By doing the same here, we ensure that the reset is processed after the focus change.\n const rafId = requestAnimationFrame(() => setShouldFocus(null))\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }, [shouldFocus])\n\n const childMenu = (\n <Menu\n {...menuProps}\n onClickOutside={onClickOutside}\n onEscape={onEscape}\n onItemClick={handleChildItemClick}\n onKeyDown={handleMenuKeyDown}\n onMouseEnter={handleMenuMouseEnter}\n registerElement={registerElement}\n shouldFocus={shouldFocus}\n >\n {children}\n </Menu>\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n\n if (document.activeElement !== target) {\n return\n }\n\n if (event.key === 'ArrowRight') {\n setWithinMenu(true)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n\n return\n }\n },\n [activation, onItemMouseEnter],\n )\n\n return (\n <Popover {...popover} content={childMenu} data-ui=\"MenuGroup__popover\" open={childMenuOpen}>\n <Selectable\n data-as={as}\n data-ui=\"MenuGroup\"\n forwardedAs={as}\n {...restProps}\n aria-pressed={as === 'button' ? pressed : undefined}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={!pressed && active ? '' : undefined}\n $radius={_getArrayProp(radius)}\n $tone={tone}\n $scheme={scheme}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n ref={setRootElement}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n <Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>\n </Selectable>\n </Popover>\n )\n}\n\n/**\n * @public\n */\nexport const MenuGroup: <E extends ElementType = 'button'>(\n props: MenuGroupProps<E>,\n) => React.JSX.Element = MenuGroupComponent\n","import {\n isValidElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {Selectable} from '../../primitives/_selectable/selectable'\nimport {Box} from '../../primitives/box/box'\nimport {Flex} from '../../primitives/flex/flex'\nimport {Text} from '../../primitives/text/text'\nimport {ResponsivePaddingProps, ResponsiveRadiusProps} from '../../primitives/types'\nimport {_getArrayProp} from '../../styles/helpers'\nimport {useRootTheme} from '../../theme/useRootTheme'\nimport {ElementType, Props} from '../../types/component'\nimport {SelectableTone} from '../../types/selectable'\nimport {Hotkeys} from '../hotkeys/hotkeys'\nimport {useMenu} from './useMenu'\n\n/**\n * @public\n */\nexport interface MenuItemOwnProps extends ResponsivePaddingProps, ResponsiveRadiusProps {\n fontSize?: number | number[]\n hotkeys?: string[]\n // oxlint-disable-next-line no-redundant-type-constituents\n icon?: React.ElementType | React.ReactNode\n // oxlint-disable-next-line no-redundant-type-constituents\n iconRight?: React.ElementType | React.ReactNode\n pressed?: boolean\n selected?: boolean\n gap?: number | number[]\n /**\n * @deprecated Use `gap` instead.\n */\n space?: never\n text?: React.ReactNode\n tone?: SelectableTone\n}\n\n/**\n * @public\n */\nexport type MenuItemProps<E extends ElementType = 'button'> = Props<MenuItemOwnProps, E>\n\nconst MenuItemComponent = function MenuItem(\n props: MenuItemOwnProps & {as?: ElementType} & Omit<\n React.HTMLProps<HTMLDivElement>,\n 'as' | 'height' | 'selected' | 'tabIndex'\n >,\n) {\n const {\n as = 'button',\n children,\n disabled,\n fontSize = 1,\n hotkeys,\n icon: IconComponent,\n iconRight: IconRightComponent,\n onClick,\n padding = 3,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n pressed,\n radius = 2,\n ref: forwardedRef,\n selected: selectedProp,\n gap = 3,\n text,\n tone = 'default',\n ...restProps\n } = props\n const {scheme} = useRootTheme()\n const menu = useMenu()\n const {\n activeElement,\n mount,\n onItemClick,\n onItemMouseEnter: _onItemMouseEnter,\n onItemMouseLeave: _onItemMouseLeave,\n } = menu\n const onItemMouseEnter = _onItemMouseEnter ?? menu.onItemMouseEnter\n const onItemMouseLeave = _onItemMouseLeave ?? menu.onItemMouseLeave\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n const active = Boolean(activeElement) && activeElement === rootElement\n const ref = useRef<HTMLDivElement | null>(null)\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)\n\n useEffect(() => mount(rootElement, selectedProp), [mount, rootElement, selectedProp])\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n if (onClick) onClick(event)\n if (onItemClick) onItemClick()\n },\n [disabled, onClick, onItemClick],\n )\n\n const paddingProps = useMemo(\n () => ({\n padding,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n }),\n [padding, paddingX, paddingY, paddingTop, paddingRight, paddingBottom, paddingLeft],\n )\n\n const hotkeysFontSize = _getArrayProp(fontSize).map((s) => s - 1)\n\n const setRef = useCallback((el: HTMLDivElement | null) => {\n ref.current = el\n setRootElement(el)\n }, [])\n\n return (\n <Selectable\n data-ui=\"MenuItem\"\n role=\"menuitem\"\n {...restProps}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={active ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n forwardedAs={as}\n $radius={_getArrayProp(radius)}\n $padding={_getArrayProp(0)}\n $tone={disabled ? 'default' : tone}\n $scheme={scheme}\n disabled={disabled}\n onClick={handleClick}\n onMouseEnter={onItemMouseEnter}\n onMouseLeave={onItemMouseLeave}\n ref={setRef}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n {(IconComponent || text || IconRightComponent) && (\n <Flex as=\"span\" gap={gap} align=\"center\" {...paddingProps}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n {text && (\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n )}\n\n {hotkeys && (\n <Hotkeys\n fontSize={hotkeysFontSize}\n keys={hotkeys}\n style={{marginTop: -4, marginBottom: -4}}\n />\n )}\n\n {IconRightComponent && (\n <Text size={fontSize}>\n {isValidElement(IconRightComponent) && IconRightComponent}\n {isValidElementType(IconRightComponent) && <IconRightComponent />}\n </Text>\n )}\n </Flex>\n )}\n {children && (\n <Box as=\"span\" {...paddingProps}>\n {children}\n </Box>\n )}\n </Selectable>\n )\n}\n\n/**\n * @public\n */\nexport const MenuItem: <E extends ElementType = 'button'>(\n props: MenuItemProps<E>,\n) => React.JSX.Element = MenuItemComponent\n"],"mappings":"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"}
1
+ {"version":3,"file":"menu.js","names":["[]","(nextActiveIndex: number) => {\n _setActiveIndex(nextActiveIndex)\n activeIndexRef.current = nextActiveIndex\n setActiveElement(elementsRef.current[nextActiveIndex] || null)\n }","useCallback((nextActiveIndex: number) => {\n _setActiveIndex(nextActiveIndex)\n activeIndexRef.current = nextActiveIndex\n setActiveElement(elementsRef.current[nextActiveIndex] || null)\n }, [])","(element: HTMLElement | null, selected?: boolean): (() => void) => {\n if (!element) return () => undefined\n\n if (elementsRef.current.indexOf(element) === -1) {\n elementsRef.current.push(element)\n _sortElements(rootElementRef.current, elementsRef.current)\n }\n\n if (selected) {\n const selectedIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(selectedIndex)\n }\n\n return () => {\n const idx = elementsRef.current.indexOf(element)\n\n if (idx > -1) {\n elementsRef.current.splice(idx, 1)\n }\n }\n }","rootElementRef.current","() => undefined","useCallback(\n (element: HTMLElement | null, selected?: boolean): (() => void) => {\n if (!element) return () => undefined\n\n if (elementsRef.current.indexOf(element) === -1) {\n elementsRef.current.push(element)\n _sortElements(rootElementRef.current, elementsRef.current)\n }\n\n if (selected) {\n const selectedIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(selectedIndex)\n }\n\n return () => {\n const idx = elementsRef.current.indexOf(element)\n\n if (idx > -1) {\n elementsRef.current.splice(idx, 1)\n }\n }\n },\n [rootElementRef, setActiveIndex],\n )","() => {\n return () => setActiveIndex(-1)\n }","[setActiveIndex]","(event: React.KeyboardEvent<HTMLDivElement>) => {\n // Move focus to the element that opened the menu before handling the `Tab` press\n if (event.key === 'Tab') {\n if (originElement) {\n originElement.focus()\n }\n\n return\n }\n\n // Move focus to the first focusable menuitem\n if (event.key === 'Home') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n // Move focus to the last focusable menuitem\n if (event.key === 'End') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex - 1 + focusableLen) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex + 1) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (onKeyDown) {\n onKeyDown(event)\n }\n }","focusableElements","el","currentIndex","focusableLen","focusedElement","focusedIndex","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Move focus to the element that opened the menu before handling the `Tab` press\n if (event.key === 'Tab') {\n if (originElement) {\n originElement.focus()\n }\n\n return\n }\n\n // Move focus to the first focusable menuitem\n if (event.key === 'Home') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n // Move focus to the last focusable menuitem\n if (event.key === 'End') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex - 1 + focusableLen) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex + 1) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (onKeyDown) {\n onKeyDown(event)\n }\n },\n [onKeyDown, originElement, setActiveIndex],\n )","(event: React.SyntheticEvent<HTMLElement>) => {\n const element = event.currentTarget\n const currentIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(currentIndex)\n }","element","event","useCallback(\n (event: React.SyntheticEvent<HTMLElement>) => {\n const element = event.currentTarget\n const currentIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(currentIndex)\n },\n [setActiveIndex],\n )","() => {\n // Set the active index to -2 to deactivate all menu items\n // when the user moves the mouse away from the menu item.\n // We avoid using -1 because it would focus the first menu item,\n // which would be incorrect when the user hovers over a gap\n // between two menu items or a menu divider.\n setActiveIndex(-2)\n rootElementRef.current?.focus()\n }","rootElementRef.current?.focus","useCallback(() => {\n // Set the active index to -2 to deactivate all menu items\n // when the user moves the mouse away from the menu item.\n // We avoid using -1 because it would focus the first menu item,\n // which would be incorrect when the user hovers over a gap\n // between two menu items or a menu divider.\n setActiveIndex(-2)\n rootElementRef.current?.focus()\n }, [rootElementRef, setActiveIndex])","() => {\n if (!rootElementRef.current) return\n\n const rafId = requestAnimationFrame(() => {\n if (activeIndex === -1) {\n if (shouldFocus === 'first') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n if (shouldFocus === 'last') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n return\n }\n\n const element = elementsRef.current[activeIndex] || null\n\n element?.focus()\n })\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }","[activeIndex, rootElementRef, setActiveIndex, shouldFocus]","{\n activeElement,\n activeIndex,\n handleItemMouseEnter,\n handleItemMouseLeave,\n handleKeyDown,\n mount,\n }","_c","_temp","padding = 1","shouldFocus = null","gap = 1","() => ref.current","{onKeyDown, originElement, shouldFocus, rootElementRef: ref}","(el: HTMLDivElement | null) => {\n // Run cleanup of previously registered elements\n if (unregisterElementRef.current) {\n // 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.\n // Since we can't change the `registerElement` implementation itself without making breaking change,\n // that is explained in the code comments for createGlobalScopedContext.tsx,\n // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.\n unregisterElementRef.current()\n unregisterElementRef.current = null\n }\n\n ref.current = el\n\n // Register root element (for nested menus)\n if (ref.current && registerElement) {\n unregisterElementRef.current = registerElement(ref.current)\n }\n }","useCallback(\n (el: HTMLDivElement | null) => {\n // Run cleanup of previously registered elements\n if (unregisterElementRef.current) {\n // 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.\n // Since we can't change the `registerElement` implementation itself without making breaking change,\n // that is explained in the code comments for createGlobalScopedContext.tsx,\n // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.\n unregisterElementRef.current()\n unregisterElementRef.current = null\n }\n\n ref.current = el\n\n // Register root element (for nested menus)\n if (ref.current && registerElement) {\n unregisterElementRef.current = registerElement(ref.current)\n }\n },\n [registerElement],\n )","() => {\n if (onItemSelect) onItemSelect(activeIndex)\n }","[activeIndex, onItemSelect]","() => [ref.current]","(event) => {\n if (!isTopLayer) return\n\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (onEscape) onEscape()\n }\n }","useCallback(\n (event) => {\n if (!isTopLayer) return\n\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (onEscape) onEscape()\n }\n },\n [isTopLayer, onEscape],\n )","{\n version: 2,\n activeElement,\n mount,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemMouseEnter: handleItemMouseEnter,\n onItemMouseLeave: handleItemMouseLeave,\n registerElement,\n }","clsx(menu, className)","<Stack gap={gap}>{children}</Stack>","<Box\n className={clsx(menu, className)}\n data-ui=\"Menu\"\n {...restProps}\n onKeyDown={handleKeyDown}\n padding={padding}\n ref={handleRefChange}\n role=\"menu\"\n tabIndex={-1}\n >\n <Stack gap={gap}>{children}</Stack>\n </Box>","<MenuContext.Provider value={value}>\n <Box\n className={clsx(menu, className)}\n data-ui=\"Menu\"\n {...restProps}\n onKeyDown={handleKeyDown}\n padding={padding}\n ref={handleRefChange}\n role=\"menu\"\n tabIndex={-1}\n >\n <Stack gap={gap}>{children}</Stack>\n </Box>\n </MenuContext.Provider>","MenuContext.Provider","_c","disableRestoreFocusOnClose = false","() => new Set<HTMLElement>()","buttonProp?.props ?? {}","props","(event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonClick?.(event)\n setOpen((v) => !v)\n setShouldFocus(null)\n setButtonElement(event.currentTarget)\n }","(v) => !v","useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonClick?.(event)\n setOpen((v) => !v)\n setShouldFocus(null)\n setButtonElement(event.currentTarget)\n },\n [onButtonClick, setOpen],\n )","(event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonMouseDown?.(event)\n if (open) event.preventDefault()\n }","event","useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonMouseDown?.(event)\n if (open) event.preventDefault()\n },\n [onButtonMouseDown, open],\n )","(event: React.KeyboardEvent<HTMLButtonElement>) => {\n onButtonKeyDown?.(event)\n\n // On `ArrowDown`, `Enter` and `Space`\n // - Opens menu and moves focus to first menuitem\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('first')\n setButtonElement(event.currentTarget)\n\n return\n }\n\n // On `ArrowUp`\n // - \tOpens menu and moves focus to last menuitem\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('last')\n setButtonElement(event.currentTarget)\n\n return\n }\n }","useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onButtonKeyDown?.(event)\n\n // On `ArrowDown`, `Enter` and `Space`\n // - Opens menu and moves focus to first menuitem\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('first')\n setButtonElement(event.currentTarget)\n\n return\n }\n\n // On `ArrowUp`\n // - \tOpens menu and moves focus to last menuitem\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('last')\n setButtonElement(event.currentTarget)\n\n return\n }\n },\n [onButtonKeyDown, setOpen],\n )","(event: MouseEvent) => {\n const target = event.target\n\n if (!(target instanceof Node)) {\n return\n }\n\n if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {\n return\n }\n\n for (const el of menuElements) {\n if (target === el || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n }","useCallback(\n (event: MouseEvent) => {\n const target = event.target\n\n if (!(target instanceof Node)) {\n return\n }\n\n if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {\n return\n }\n\n for (const el of menuElements) {\n if (target === el || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [buttonElement, menuElements, setOpen],\n )","() => {\n setOpen(false, returnFocusTo)\n }","useCallback(() => {\n setOpen(false, returnFocusTo)\n }, [returnFocusTo, setOpen])","(event: FocusEvent) => {\n const target = event.relatedTarget\n\n if (!(target instanceof Node)) {\n return\n }\n\n for (const el of menuElements) {\n if (el === target || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n }","target","el","useCallback(\n (event: FocusEvent) => {\n const target = event.relatedTarget\n\n if (!(target instanceof Node)) {\n return\n }\n\n for (const el of menuElements) {\n if (el === target || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [menuElements, setOpen],\n )","(el: HTMLElement) => {\n menuElements.add(el)\n\n return () => {\n menuElements.delete(el)\n }\n }","useCallback(\n (el: HTMLElement) => {\n menuElements.add(el)\n\n return () => {\n menuElements.delete(el)\n }\n },\n [menuElements],\n )","menuProp && cloneElement(menuProp, menuProps)","buttonProp &&\n cloneElement(buttonProp, {\n 'data-ui': 'MenuButton',\n id,\n 'onClick': handleButtonClick,\n 'onKeyDown': handleButtonKeyDown,\n 'onMouseDown': handleMouseDown,\n 'aria-haspopup': true,\n 'aria-expanded': open,\n 'ref': setButton,\n 'selected': buttonProp.props.selected ?? open,\n })","useMemo(\n () =>\n buttonProp &&\n cloneElement(buttonProp, {\n 'data-ui': 'MenuButton',\n id,\n 'onClick': handleButtonClick,\n 'onKeyDown': handleButtonKeyDown,\n 'onMouseDown': handleMouseDown,\n 'aria-haspopup': true,\n 'aria-expanded': open,\n 'ref': setButton,\n 'selected': buttonProp.props.selected ?? open,\n }),\n [buttonProp, handleButtonClick, handleButtonKeyDown, handleMouseDown, id, open, setButton],\n )","popover || {}","{\n overflow: 'auto',\n portal: true,\n // oxlint-disable-next-line no-useless-fallback-in-spread\n ...(popover || {}),\n }","useMemo(\n () => ({\n overflow: 'auto',\n portal: true,\n // oxlint-disable-next-line no-useless-fallback-in-spread\n ...(popover || {}),\n }),\n [popover],\n )","button || <></>","<Popover data-ui=\"MenuButton__popover\" {...popoverProps} content={menu} open={open}>\n {button || <></>}\n </Popover>","(action: React.SetStateAction<boolean>, returnFocusTo?: HTMLElement | null) => {\n const nextOpen = typeof action === 'function' ? action(openRef.current) : action\n const changed = openRef.current !== nextOpen\n openRef.current = nextOpen\n if (changed) setOpenState(nextOpen)\n // Focus handlers run synchronously: the close that the menu's blur causes must find the menu\n // closed already, and a change that another handler makes supersedes this one\n returnFocusTo?.focus()\n if (!changed || openRef.current !== nextOpen) return\n if (nextOpen) {\n onOpen?.()\n } else {\n onClose?.()\n }\n }","useCallback(\n (action: React.SetStateAction<boolean>, returnFocusTo?: HTMLElement | null) => {\n const nextOpen = typeof action === 'function' ? action(openRef.current) : action\n const changed = openRef.current !== nextOpen\n openRef.current = nextOpen\n if (changed) setOpenState(nextOpen)\n // Focus handlers run synchronously: the close that the menu's blur causes must find the menu\n // closed already, and a change that another handler makes supersedes this one\n returnFocusTo?.focus()\n if (!changed || openRef.current !== nextOpen) return\n if (nextOpen) {\n onOpen?.()\n } else {\n onClose?.()\n }\n },\n [onClose, onOpen],\n )","[open, setOpen]","(node: HTMLButtonElement) => {\n if (lastNodeRef.current && lastNodeRef.current !== node) {\n setButtonElement((element) => element && node)\n }\n lastNodeRef.current = node\n\n return attachRef(forwardedRef, node)\n }","useCallback(\n (node: HTMLButtonElement) => {\n if (lastNodeRef.current && lastNodeRef.current !== node) {\n setButtonElement((element) => element && node)\n }\n lastNodeRef.current = node\n\n return attachRef(forwardedRef, node)\n },\n [forwardedRef, setButtonElement],\n )","_c","_temp","_Fragment","as = 'hr'","clsx(menuDivider, className)","<Component\n data-ui=\"MenuDivider\"\n className={clsx(menuDivider, className)}\n ref={ref}\n {...restProps}\n />","_c","as = 'button'","fontSize = 1","padding = 3","radius = 2","gap = 3","tone = 'default'","(current) => current + 1","(event: React.MouseEvent<HTMLElement>) => {\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => setOpenedIn(activation))\n }","useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => setOpenedIn(activation))\n },\n [activation, onItemMouseEnter],\n )","(event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.stopPropagation()\n\n startTransition(() => setOpenedIn(null))\n\n requestAnimationFrame(() => {\n rootElement?.focus()\n })\n }\n }","rootElement?.focus","event","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.stopPropagation()\n\n startTransition(() => setOpenedIn(null))\n\n requestAnimationFrame(() => {\n rootElement?.focus()\n })\n }\n },\n [rootElement],\n )","(event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n }","useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n },\n [activation, onClick, onItemMouseEnter],\n )","() => {\n startTransition(() => setOpenedIn(null))\n onItemClick?.()\n }","useCallback(() => {\n startTransition(() => setOpenedIn(null))\n onItemClick?.()\n }, [onItemClick])","() => setWithinMenu(true)","useCallback(() => setWithinMenu(true), [])","() => mount(rootElement)","[mount, rootElement]","() => {\n if (!shouldFocus) return\n // The useMenuController effect that handles `shouldFocus` schedules a request animation frame where it's processed.\n // By doing the same here, we ensure that the reset is processed after the focus change.\n const rafId = requestAnimationFrame(() => setShouldFocus(null))\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }","[shouldFocus]","<Menu\n {...menuProps}\n onClickOutside={onClickOutside}\n onEscape={onEscape}\n onItemClick={handleChildItemClick}\n onKeyDown={handleMenuKeyDown}\n onMouseEnter={handleMenuMouseEnter}\n registerElement={registerElement}\n shouldFocus={shouldFocus}\n >\n {children}\n </Menu>","(event: React.KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n\n if (document.activeElement !== target) {\n return\n }\n\n if (event.key === 'ArrowRight') {\n setWithinMenu(true)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n\n return\n }\n }","useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n\n if (document.activeElement !== target) {\n return\n }\n\n if (event.key === 'ArrowRight') {\n setWithinMenu(true)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n\n return\n }\n },\n [activation, onItemMouseEnter],\n )","_getArrayProp(radius)","IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )","<Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>","<ChevronRightIcon />","<Text size={fontSize}>\n <ChevronRightIcon />\n </Text>","<Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>","<Selectable\n data-as={as}\n data-ui=\"MenuGroup\"\n forwardedAs={as}\n {...restProps}\n aria-pressed={as === 'button' ? pressed : undefined}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={!pressed && active ? '' : undefined}\n $radius={_getArrayProp(radius)}\n $tone={tone}\n $scheme={scheme}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n ref={setRootElement}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n <Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>\n </Selectable>","as === 'button' ? pressed : undefined","as !== 'button' && pressed ? '' : undefined","!pressed && active ? '' : undefined","as === 'button' ? 'button' : undefined","<Popover {...popover} content={childMenu} data-ui=\"MenuGroup__popover\" open={childMenuOpen}>\n <Selectable\n data-as={as}\n data-ui=\"MenuGroup\"\n forwardedAs={as}\n {...restProps}\n aria-pressed={as === 'button' ? pressed : undefined}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={!pressed && active ? '' : undefined}\n $radius={_getArrayProp(radius)}\n $tone={tone}\n $scheme={scheme}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n ref={setRootElement}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n <Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>\n </Selectable>\n </Popover>","_c","_temp","as = 'button'","fontSize = 1","padding = 3","radius = 2","gap = 3","tone = 'default'","() => ref.current","() => mount(rootElement, selectedProp)","[mount, rootElement, selectedProp]","(event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n if (onClick) onClick(event)\n if (onItemClick) onItemClick()\n }","useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n if (onClick) onClick(event)\n if (onItemClick) onItemClick()\n },\n [disabled, onClick, onItemClick],\n )","{\n padding,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n }","useMemo(\n () => ({\n padding,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n }),\n [padding, paddingX, paddingY, paddingTop, paddingRight, paddingBottom, paddingLeft],\n )","_getArrayProp(fontSize).map((s) => s - 1)","(s) => s - 1","(el: HTMLDivElement | null) => {\n ref.current = el\n setRootElement(el)\n }","useCallback((el: HTMLDivElement | null) => {\n ref.current = el\n setRootElement(el)\n }, [])","_getArrayProp(radius)","_getArrayProp(0)","(IconComponent || text || IconRightComponent) && (\n <Flex as=\"span\" gap={gap} align=\"center\" {...paddingProps}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n {text && (\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n )}\n\n {hotkeys && (\n <Hotkeys\n fontSize={hotkeysFontSize}\n keys={hotkeys}\n style={{marginTop: -4, marginBottom: -4}}\n />\n )}\n\n {IconRightComponent && (\n <Text size={fontSize}>\n {isValidElement(IconRightComponent) && IconRightComponent}\n {isValidElementType(IconRightComponent) && <IconRightComponent />}\n </Text>\n )}\n </Flex>\n )","children && (\n <Box as=\"span\" {...paddingProps}>\n {children}\n </Box>\n )","<Selectable\n data-ui=\"MenuItem\"\n role=\"menuitem\"\n {...restProps}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={active ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n forwardedAs={as}\n $radius={_getArrayProp(radius)}\n $padding={_getArrayProp(0)}\n $tone={disabled ? 'default' : tone}\n $scheme={scheme}\n disabled={disabled}\n onClick={handleClick}\n onMouseEnter={onItemMouseEnter}\n onMouseLeave={onItemMouseLeave}\n ref={setRef}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n {(IconComponent || text || IconRightComponent) && (\n <Flex as=\"span\" gap={gap} align=\"center\" {...paddingProps}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n {text && (\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n )}\n\n {hotkeys && (\n <Hotkeys\n fontSize={hotkeysFontSize}\n keys={hotkeys}\n style={{marginTop: -4, marginBottom: -4}}\n />\n )}\n\n {IconRightComponent && (\n <Text size={fontSize}>\n {isValidElement(IconRightComponent) && IconRightComponent}\n {isValidElementType(IconRightComponent) && <IconRightComponent />}\n </Text>\n )}\n </Flex>\n )}\n {children && (\n <Box as=\"span\" {...paddingProps}>\n {children}\n </Box>\n )}\n </Selectable>","as !== 'button' && pressed ? '' : undefined","active ? '' : undefined","disabled ? '' : undefined","disabled ? 'default' : tone","as === 'button' ? 'button' : undefined","_c","\"onBlurCapture\"","\"onClickOutside\"","\"onEscape\"","\"onItemClick\"","\"originElement\"","\"onClick\"","\"onKeyDown\"","\"onMouseDown\"","\"ref\"","\"selected\""],"sources":["../src/core/components/menu/menuContext.ts","../src/core/components/menu/helpers.ts","../src/core/components/menu/useMenuController.ts","../src/core/components/menu/menu.css.ts","../src/core/components/menu/menu.tsx","../src/core/components/menu/menuButton.tsx","../src/core/components/menu/menuDivider.css.ts","../src/core/components/menu/menuDivider.tsx","../src/core/primitives/_selectable/style.ts","../src/core/primitives/_selectable/selectable.tsx","../src/core/components/menu/useMenu.ts","../src/core/components/menu/menuGroup.tsx","../src/core/components/menu/menuItem.tsx"],"sourcesContent":["import {createGlobalScopedContext} from '../../lib/createGlobalScopedContext'\n\nexport interface MenuContextValue {\n version: 2\n activeElement: HTMLElement | null\n mount: (element: HTMLElement | null, selected?: boolean) => () => void\n onClickOutside?: (event: MouseEvent) => void\n onEscape?: () => void\n onItemClick?: () => void\n /** Makes `event.currentTarget` the active item, also on a click or key press */\n onItemMouseEnter: (event: React.SyntheticEvent<HTMLElement>) => void\n onItemMouseLeave: (event: React.MouseEvent<HTMLElement>) => void\n registerElement?: (el: HTMLElement) => () => void\n}\n\nexport const MenuContext = createGlobalScopedContext<MenuContextValue | null>(\n '@sanity/ui/context/menu',\n null,\n)\n","import {isHTMLAnchorElement, isHTMLButtonElement} from '../../helpers/element'\n\n/**\n * @internal\n */\nfunction _isFocusable(element: HTMLElement) {\n return (\n (isHTMLAnchorElement(element) && element.getAttribute('data-disabled') !== 'true') ||\n (isHTMLButtonElement(element) && !element.disabled)\n )\n}\n\n/**\n * @internal\n */\nexport function _getFocusableElements(elements: HTMLElement[]): HTMLElement[] {\n return elements.filter(_isFocusable)\n}\n\nfunction _getDOMPath(rootElement: HTMLElement, el: HTMLElement): number[] {\n const path: number[] = []\n\n let e = el\n\n while (e !== rootElement) {\n const parentElement = e.parentElement\n\n if (!parentElement) return path\n\n const children = Array.from(parentElement.childNodes)\n const index = children.indexOf(e)\n\n path.unshift(index)\n\n if (parentElement === rootElement) {\n return path\n }\n\n e = parentElement\n }\n\n return path\n}\n\nconst EMPTY_PATH: number[] = []\n\n/**\n * @internal\n */\nexport function _sortElements(rootElement: HTMLElement | null, elements: HTMLElement[]): void {\n if (!rootElement) return\n\n const map = new WeakMap<HTMLElement, number[]>()\n\n for (const el of elements) {\n map.set(el, _getDOMPath(rootElement, el))\n }\n\n const _sort = (a: HTMLElement, b: HTMLElement) => {\n const _a = map.get(a) || EMPTY_PATH\n const _b = map.get(b) || EMPTY_PATH\n\n const len = Math.max(_a.length, _b.length)\n\n // Loop until there are different indexes\n for (let i = 0; i < len; i += 1) {\n const aIndex = _a[i] || -1\n const bIndex = _b[i] || -1\n\n if (aIndex !== bIndex) {\n return aIndex - bIndex\n }\n }\n\n return 0\n }\n\n elements.sort(_sort)\n}\n","import {useCallback, useEffect, useRef, useState} from 'react'\n\nimport {_getFocusableElements, _sortElements} from './helpers'\n\n/**\n * @internal\n */\nexport interface MenuController {\n activeElement: HTMLElement | null\n activeIndex: number\n handleItemMouseEnter: (event: React.SyntheticEvent<HTMLElement>) => void\n handleItemMouseLeave: () => void\n handleKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void\n mount: (element: HTMLElement | null, selected?: boolean) => () => void\n}\n\n/**\n * This controller is responsible for controlling UI menu state.\n *\n * @internal\n */\nexport function useMenuController(props: {\n onKeyDown?: React.KeyboardEventHandler\n originElement?: HTMLElement | null\n shouldFocus: 'first' | 'last' | null\n rootElementRef: React.RefObject<HTMLDivElement | null>\n}): MenuController {\n const {onKeyDown, originElement, shouldFocus, rootElementRef} = props\n const elementsRef = useRef<HTMLElement[]>([])\n const [activeIndex, _setActiveIndex] = useState(-1)\n const activeIndexRef = useRef(activeIndex)\n const [activeElement, setActiveElement] = useState<HTMLElement | null>(null)\n\n const setActiveIndex = useCallback((nextActiveIndex: number) => {\n _setActiveIndex(nextActiveIndex)\n activeIndexRef.current = nextActiveIndex\n setActiveElement(elementsRef.current[nextActiveIndex] || null)\n }, [])\n\n const mount = useCallback(\n (element: HTMLElement | null, selected?: boolean): (() => void) => {\n if (!element) return () => undefined\n\n if (elementsRef.current.indexOf(element) === -1) {\n elementsRef.current.push(element)\n _sortElements(rootElementRef.current, elementsRef.current)\n }\n\n if (selected) {\n const selectedIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(selectedIndex)\n }\n\n return () => {\n const idx = elementsRef.current.indexOf(element)\n\n if (idx > -1) {\n elementsRef.current.splice(idx, 1)\n }\n }\n },\n [rootElementRef, setActiveIndex],\n )\n\n // Reset the active item when the menu unmounts, or is hidden inside an <Activity> boundary\n // (which unmounts effects while preserving state), so that reopening behaves like a fresh\n // mount: `shouldFocus` applies again and `selected` items re-register through `mount`.\n useEffect(() => {\n return () => setActiveIndex(-1)\n }, [setActiveIndex])\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n // Move focus to the element that opened the menu before handling the `Tab` press\n if (event.key === 'Tab') {\n if (originElement) {\n originElement.focus()\n }\n\n return\n }\n\n // Move focus to the first focusable menuitem\n if (event.key === 'Home') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n // Move focus to the last focusable menuitem\n if (event.key === 'End') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (!el) return\n\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex - 1 + focusableLen) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n event.stopPropagation()\n\n const focusableElements = _getFocusableElements(elementsRef.current)\n const focusableLen = focusableElements.length\n\n if (focusableLen === 0) return\n\n const focusedElement = elementsRef.current[activeIndexRef.current]\n\n let focusedIndex = focusableElements.indexOf(focusedElement)\n\n focusedIndex = (focusedIndex + 1) % focusableLen\n\n const el = focusableElements[focusedIndex]\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n\n return\n }\n\n if (onKeyDown) {\n onKeyDown(event)\n }\n },\n [onKeyDown, originElement, setActiveIndex],\n )\n\n const handleItemMouseEnter = useCallback(\n (event: React.SyntheticEvent<HTMLElement>) => {\n const element = event.currentTarget\n const currentIndex = elementsRef.current.indexOf(element)\n\n setActiveIndex(currentIndex)\n },\n [setActiveIndex],\n )\n\n const handleItemMouseLeave = useCallback(() => {\n // Set the active index to -2 to deactivate all menu items\n // when the user moves the mouse away from the menu item.\n // We avoid using -1 because it would focus the first menu item,\n // which would be incorrect when the user hovers over a gap\n // between two menu items or a menu divider.\n setActiveIndex(-2)\n rootElementRef.current?.focus()\n }, [rootElementRef, setActiveIndex])\n\n // Set focus on the currently active element\n useEffect(() => {\n if (!rootElementRef.current) return\n\n const rafId = requestAnimationFrame(() => {\n if (activeIndex === -1) {\n if (shouldFocus === 'first') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[0]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n if (shouldFocus === 'last') {\n const focusableElements = _getFocusableElements(elementsRef.current)\n const el = focusableElements[focusableElements.length - 1]\n\n if (el) {\n const currentIndex = elementsRef.current.indexOf(el)\n\n setActiveIndex(currentIndex)\n }\n }\n\n return\n }\n\n const element = elementsRef.current[activeIndex] || null\n\n element?.focus()\n })\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }, [activeIndex, rootElementRef, setActiveIndex, shouldFocus])\n\n return {\n activeElement,\n activeIndex,\n handleItemMouseEnter,\n handleItemMouseLeave,\n handleKeyDown,\n mount,\n }\n}\n","import {css} from '#styled-system/css'\n\nexport const menu = css({\n outline: 'none',\n overflow: 'auto',\n})\n","import {clsx} from 'clsx/lite'\nimport {useCallback, useEffect, useImperativeHandle, useMemo, useRef} from 'react'\n\nimport {useClickOutsideEvent} from '../../hooks/useClickOutsideEvent'\nimport {useGlobalKeyDown} from '../../hooks/useGlobalKeyDown'\nimport {Box} from '../../primitives/box/box'\nimport {Stack} from '../../primitives/stack/stack'\nimport {ResponsivePaddingProps} from '../../primitives/types'\nimport {useLayer} from '../../utils/layer/useLayer'\nimport {MenuContext, MenuContextValue} from './menuContext'\nimport {useMenuController} from './useMenuController'\n\nimport {menu} from './menu.css'\n\n/**\n * @public\n */\nexport interface MenuProps extends ResponsivePaddingProps {\n /**\n * @deprecated Use `shouldFocus=\"first\"` instead.\n */\n 'focusFirst'?: never\n /**\n * @deprecated Use `shouldFocus=\"last\"` instead.\n */\n 'focusLast'?: never\n 'onClickOutside'?: (event: MouseEvent) => void\n 'onEscape'?: () => void\n 'onItemClick'?: () => void\n 'onItemSelect'?: (index: number) => void\n 'originElement'?: HTMLElement | null\n 'registerElement'?: (el: HTMLElement) => () => void\n 'shouldFocus'?: 'first' | 'last' | null\n 'gap'?: number | number[]\n /**\n * @deprecated Use `gap` instead.\n */\n 'space'?: never\n 'aria-labelledby'?: string\n 'onBlurCapture'?: (event: FocusEvent) => void\n}\n\n/**\n * The `Menu` component is a building block for application menus.\n *\n * @public\n */\nexport function Menu(\n props: MenuProps & Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'height' | 'role' | 'tabIndex'>,\n) {\n const {\n children,\n className,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemSelect,\n onKeyDown,\n originElement,\n padding = 1,\n ref: forwardedRef,\n registerElement,\n shouldFocus = null,\n gap = 1,\n ...restProps\n } = props\n\n const ref = useRef<HTMLDivElement | null>(null)\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)\n\n const {isTopLayer} = useLayer()\n\n const {\n activeElement,\n activeIndex,\n handleItemMouseEnter,\n handleItemMouseLeave,\n handleKeyDown,\n mount,\n } = useMenuController({onKeyDown, originElement, shouldFocus, rootElementRef: ref})\n\n const unregisterElementRef = useRef<(() => void) | null>(null)\n const handleRefChange = useCallback(\n (el: HTMLDivElement | null) => {\n // Run cleanup of previously registered elements\n if (unregisterElementRef.current) {\n // 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.\n // Since we can't change the `registerElement` implementation itself without making breaking change,\n // that is explained in the code comments for createGlobalScopedContext.tsx,\n // we need to handle with a ref that holds on to the cleanup function last returned when the ref callback is called.\n unregisterElementRef.current()\n unregisterElementRef.current = null\n }\n\n ref.current = el\n\n // Register root element (for nested menus)\n if (ref.current && registerElement) {\n unregisterElementRef.current = registerElement(ref.current)\n }\n },\n [registerElement],\n )\n\n // Trigger `onItemSelect` when active index changes\n useEffect(() => {\n if (onItemSelect) onItemSelect(activeIndex)\n }, [activeIndex, onItemSelect])\n\n // Close menu when clicking outside\n useClickOutsideEvent(isTopLayer && onClickOutside, () => [ref.current])\n\n // Close menu when pressing Escape\n useGlobalKeyDown(\n useCallback(\n (event) => {\n if (!isTopLayer) return\n\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (onEscape) onEscape()\n }\n },\n [isTopLayer, onEscape],\n ),\n )\n\n const value = useMemo(\n () =>\n ({\n version: 2,\n activeElement,\n mount,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemMouseEnter: handleItemMouseEnter,\n onItemMouseLeave: handleItemMouseLeave,\n registerElement,\n }) satisfies MenuContextValue,\n [\n activeElement,\n mount,\n handleItemMouseEnter,\n handleItemMouseLeave,\n onClickOutside,\n onEscape,\n onItemClick,\n registerElement,\n ],\n )\n\n return (\n <MenuContext.Provider value={value}>\n <Box\n className={clsx(menu, className)}\n data-ui=\"Menu\"\n {...restProps}\n onKeyDown={handleKeyDown}\n padding={padding}\n ref={handleRefChange}\n role=\"menu\"\n tabIndex={-1}\n >\n <Stack gap={gap}>{children}</Stack>\n </Box>\n </MenuContext.Provider>\n )\n}\n","import {cloneElement, useCallback, useMemo, useRef, useState} from 'react'\n\nimport {Popover, PopoverProps} from '../../primitives/popover/popover'\nimport {attachRef} from '../../utils/attachRef'\nimport {MenuProps} from './menu'\n\n/**\n * @public\n */\nexport interface MenuButtonProps {\n /**\n * @beta Do not use in production.\n */\n __unstable_disableRestoreFocusOnClose?: boolean\n /**\n * @deprecated Use `popover={{floatingBoundary: element}}` and/or `popover={{referenceBoundary: element}}` instead.\n */\n boundaryElement?: never\n /**\n * Its `onClick`, `onKeyDown` and `onMouseDown` run before `MenuButton`'s handlers, which act on\n * the event even when those called `event.preventDefault()`. Disable the button to keep its\n * menu closed. Enter and Space open the menu on `keydown` and don't trigger `onClick`.\n */\n button: React.JSX.Element\n id: string\n menu?: React.JSX.Element\n onClose?: () => void\n onOpen?: () => void\n /**\n * @deprecated Use `popover={{placement: 'top'}}` instead.\n */\n placement?: never\n popover?: Omit<PopoverProps, 'content' | 'open'>\n /**\n * @deprecated Use `popover={{scheme: 'dark'}}` instead.\n */\n popoverScheme?: never\n /**\n * @deprecated Use `popover={{radius: 2}}` instead.\n */\n popoverRadius?: never\n /**\n * @beta Do not use in production.\n * @deprecated Use `popover={{portal: true}}` instead.\n */\n portal?: never\n /**\n * @deprecated Use `popover={{preventOverflow: true}}` instead.\n */\n preventOverflow?: never\n ref?: React.Ref<HTMLButtonElement | null>\n}\n\n/**\n * The `MenuButton` component follows the WAI-ARIA specification for menu buttons.\n *\n * @public\n */\nexport function MenuButton(props: MenuButtonProps) {\n const {\n __unstable_disableRestoreFocusOnClose: disableRestoreFocusOnClose = false,\n button: buttonProp,\n id,\n menu: menuProp,\n onClose,\n onOpen,\n popover,\n ref: forwardedRef,\n } = props\n const [open, setOpen] = useOpenState(onOpen, onClose)\n const [shouldFocus, setShouldFocus] = useState<'first' | 'last' | null>(null)\n // Set by the button's event handlers, the only way the menu opens, rather than whenever the\n // button attaches: a state update from a ref callback re-renders synchronously on every mount\n // and `<Activity>` reveal, which holds up a view transition of the button (see\n // `useReferenceElement`)\n const [buttonElement, setButtonElement] = useState<HTMLButtonElement | null>(null)\n // Mutated in place: only event handlers read it, so registering a menu element needs no render\n const [menuElements] = useState(() => new Set<HTMLElement>())\n const {\n onClick: onButtonClick,\n onKeyDown: onButtonKeyDown,\n onMouseDown: onButtonMouseDown,\n }: React.DOMAttributes<HTMLButtonElement> = buttonProp?.props ?? {}\n\n const handleButtonClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonClick?.(event)\n setOpen((v) => !v)\n setShouldFocus(null)\n setButtonElement(event.currentTarget)\n },\n [onButtonClick, setOpen],\n )\n\n // Prevent mouse event propagation when the menu is open.\n // This is to ensure that `handleBlur` isn't triggered when clicking the menu button whilst open,\n // which can lead to `setOpen` being triggered multiple times (once by `handleBlur`, and again by `handleButtonClick`).\n const handleMouseDown = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n onButtonMouseDown?.(event)\n if (open) event.preventDefault()\n },\n [onButtonMouseDown, open],\n )\n\n const handleButtonKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onButtonKeyDown?.(event)\n\n // On `ArrowDown`, `Enter` and `Space`\n // - Opens menu and moves focus to first menuitem\n if (event.key === 'ArrowDown' || event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('first')\n setButtonElement(event.currentTarget)\n\n return\n }\n\n // On `ArrowUp`\n // - \tOpens menu and moves focus to last menuitem\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n setOpen(true)\n setShouldFocus('last')\n setButtonElement(event.currentTarget)\n\n return\n }\n },\n [onButtonKeyDown, setOpen],\n )\n\n const handleMenuClickOutside = useCallback(\n (event: MouseEvent) => {\n const target = event.target\n\n if (!(target instanceof Node)) {\n return\n }\n\n if (buttonElement && (target === buttonElement || buttonElement.contains(target))) {\n return\n }\n\n for (const el of menuElements) {\n if (target === el || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [buttonElement, menuElements, setOpen],\n )\n\n const returnFocusTo = disableRestoreFocusOnClose ? null : buttonElement\n\n const handleMenuEscape = useCallback(() => {\n setOpen(false, returnFocusTo)\n }, [returnFocusTo, setOpen])\n\n const handleBlur = useCallback(\n (event: FocusEvent) => {\n const target = event.relatedTarget\n\n if (!(target instanceof Node)) {\n return\n }\n\n for (const el of menuElements) {\n if (el === target || el.contains(target)) {\n return\n }\n }\n\n setOpen(false)\n },\n [menuElements, setOpen],\n )\n\n const handleItemClick = useCallback(() => {\n setOpen(false, returnFocusTo)\n }, [returnFocusTo, setOpen])\n\n const registerElement = useCallback(\n (el: HTMLElement) => {\n menuElements.add(el)\n\n return () => {\n menuElements.delete(el)\n }\n },\n [menuElements],\n )\n\n const menuProps: MenuProps = {\n 'aria-labelledby': id,\n 'onBlurCapture': handleBlur,\n 'onClickOutside': handleMenuClickOutside,\n 'onEscape': handleMenuEscape,\n 'onItemClick': handleItemClick,\n 'originElement': buttonElement,\n registerElement,\n shouldFocus,\n }\n\n const menu = menuProp && cloneElement(menuProp, menuProps)\n\n const setButton = useButtonRef(forwardedRef, setButtonElement)\n\n const button = useMemo(\n () =>\n buttonProp &&\n cloneElement(buttonProp, {\n 'data-ui': 'MenuButton',\n id,\n 'onClick': handleButtonClick,\n 'onKeyDown': handleButtonKeyDown,\n 'onMouseDown': handleMouseDown,\n 'aria-haspopup': true,\n 'aria-expanded': open,\n 'ref': setButton,\n 'selected': buttonProp.props.selected ?? open,\n }),\n [buttonProp, handleButtonClick, handleButtonKeyDown, handleMouseDown, id, open, setButton],\n )\n\n const popoverProps: MenuButtonProps['popover'] = useMemo(\n () => ({\n overflow: 'auto',\n portal: true,\n // oxlint-disable-next-line no-useless-fallback-in-spread\n ...(popover || {}),\n }),\n [popover],\n )\n\n return (\n <Popover data-ui=\"MenuButton__popover\" {...popoverProps} content={menu} open={open}>\n {button || <></>}\n </Popover>\n )\n}\n\n/**\n * The open state, with `onOpen` and `onClose` called by `setOpen` when it changes. A hook because\n * `setOpen` reads a ref, and the React Compiler rejects passing such a function to `cloneElement`.\n */\nfunction useOpenState(onOpen?: () => void, onClose?: () => void) {\n const [open, setOpenState] = useState(false)\n const openRef = useRef(false)\n\n const setOpen = useCallback(\n (action: React.SetStateAction<boolean>, returnFocusTo?: HTMLElement | null) => {\n const nextOpen = typeof action === 'function' ? action(openRef.current) : action\n const changed = openRef.current !== nextOpen\n openRef.current = nextOpen\n if (changed) setOpenState(nextOpen)\n // Focus handlers run synchronously: the close that the menu's blur causes must find the menu\n // closed already, and a change that another handler makes supersedes this one\n returnFocusTo?.focus()\n if (!changed || openRef.current !== nextOpen) return\n if (nextOpen) {\n onOpen?.()\n } else {\n onClose?.()\n }\n },\n [onClose, onOpen],\n )\n\n return [open, setOpen] as const\n}\n\n/**\n * The button's ref callback: attaches the forwarded ref, and moves `buttonElement` to a button\n * that replaces the one it is set to. The same button attaching again (an `<Activity>` showing\n * it, a new forwarded ref) schedules nothing. A hook because the React Compiler skips a component\n * that passes a callback reading a ref to `cloneElement`.\n */\nfunction useButtonRef(\n forwardedRef: React.Ref<HTMLButtonElement | null> | undefined,\n setButtonElement: React.Dispatch<React.SetStateAction<HTMLButtonElement | null>>,\n): (node: HTMLButtonElement) => () => void {\n const lastNodeRef = useRef<HTMLButtonElement | null>(null)\n\n return useCallback(\n (node: HTMLButtonElement) => {\n if (lastNodeRef.current && lastNodeRef.current !== node) {\n setButtonElement((element) => element && node)\n }\n lastNodeRef.current = node\n\n return attachRef(forwardedRef, node)\n },\n [forwardedRef, setButtonElement],\n )\n}\n","import {css} from '#styled-system/css'\n\nexport const menuDivider = css({\n height: '1px',\n border: 0,\n background: 'var(--card-hairline-soft-color)',\n margin: 0,\n})\n","import {clsx} from 'clsx/lite'\n\nimport {ElementType, EmptyProps, Props} from '../../types/component'\n\nimport {menuDivider} from './menuDivider.css'\n\n/**\n * @public\n */\nexport type MenuDividerProps<E extends ElementType = 'hr'> = Props<EmptyProps, E>\n\nfunction MenuDividerComponent(\n props: {as?: ElementType} & Omit<React.HTMLProps<HTMLHRElement>, 'as'>,\n) {\n const {as = 'hr', className, ref, ...restProps} = props\n // Rendering the polymorphic `as` needs one concrete element type for JSX to\n // type-check the hr-flavored props (the same widening styled-components'\n // `as` prop performed here before).\n // oxlint-disable-next-line no-unsafe-type-assertion\n const Component = as as 'hr'\n\n return (\n <Component\n data-ui=\"MenuDivider\"\n className={clsx(menuDivider, className)}\n ref={ref}\n {...restProps}\n />\n )\n}\n\n/**\n * @public\n */\nexport const MenuDivider: <E extends ElementType = 'hr'>(\n props: MenuDividerProps<E>,\n) => React.JSX.Element = MenuDividerComponent\n","import {css} from 'styled-components'\n\nimport {getTheme_v2} from '../../../theme/versioning/getTheme_v2'\nimport {_cardColorStyle} from '../../styles/card/_cardColorStyle'\nimport {ThemeProps} from '../../styles/types'\nimport {SelectableTone} from '../../types/selectable'\n\n/**\n * @internal\n */\nexport interface SelectableStyleProps {\n $tone: SelectableTone\n}\n\nexport const selectableBaseStyle = css`\n background-color: var(--card-bg-color);\n color: var(--card-fg-color);\n outline: none;\n\n &[data-as='button'] {\n -webkit-font-smoothing: inherit;\n appearance: none;\n outline: none;\n font: inherit;\n text-align: inherit;\n border: 0;\n width: -moz-available;\n width: -webkit-fill-available;\n width: stretch;\n }\n\n /* &:is(a) */\n &[data-as='a'] {\n text-decoration: none;\n }\n`\n\nexport function selectableColorStyle(\n props: SelectableStyleProps & ThemeProps,\n): ReturnType<typeof css> {\n const {$tone} = props\n const {color} = getTheme_v2(props.theme)\n const tone = color.selectable[$tone]\n\n // A selectable is either a button or a link, so their state rules can share selector lists\n return css`\n ${_cardColorStyle(color, tone.enabled)}\n\n &[data-as='button']:not(:disabled)[aria-pressed='true'],\n &[data-as='a']:not([data-disabled])[data-pressed] {\n ${_cardColorStyle(color, tone.pressed)}\n }\n\n &[data-as='button']:not(:disabled)[data-selected],\n &[data-as='button']:not(:disabled)[aria-selected='true'] > &[data-as='button']:not(:disabled),\n &[data-as='a']:not([data-disabled])[data-selected] {\n ${_cardColorStyle(color, tone.selected)}\n }\n\n @media (hover: hover) {\n &[data-as='button']:not(:disabled):not([data-selected]),\n &[data-as='a']:not([data-disabled]):not([data-selected]) {\n &[data-hovered],\n &:hover {\n ${_cardColorStyle(color, tone.hovered)}\n }\n\n &:active {\n ${_cardColorStyle(color, tone.pressed)}\n }\n }\n }\n `\n}\n\nexport function selectableDisabledStyle(\n props: SelectableStyleProps & ThemeProps,\n): ReturnType<typeof css> {\n const {color} = getTheme_v2(props.theme)\n\n return css`\n &[data-as='button']:disabled,\n &[data-as='a'][data-disabled] {\n ${_cardColorStyle(color, color.selectable[props.$tone].disabled)}\n }\n `\n}\n\nexport function selectableStyle(props: ThemeProps): ReturnType<typeof css> {\n const {style} = getTheme_v2(props.theme)\n\n return css`\n ${style?.card?.root}\n `\n}\n","import {styled} from 'styled-components'\n\nimport {responsiveRadiusStyle} from '../../styles/radius/radiusStyle'\nimport {ResponsiveRadiusStyleProps} from '../../styles/radius/types'\nimport {Box} from '../box/box'\nimport {\n selectableBaseStyle,\n selectableColorStyle,\n selectableDisabledStyle,\n selectableStyle,\n SelectableStyleProps,\n} from './style'\n\nconst SelectableBase = styled(Box)`\n ${selectableBaseStyle}\n`\n\nconst SelectableColor = styled(SelectableBase)<SelectableStyleProps>(selectableColorStyle)\n\nconst SelectableDisabled = styled(SelectableColor)<SelectableStyleProps>(selectableDisabledStyle)\n\n/**\n * @internal\n */\nexport const Selectable = styled(SelectableDisabled)<ResponsiveRadiusStyleProps>(\n responsiveRadiusStyle,\n selectableStyle,\n)\n","import {useContext} from 'react'\n\nimport {isRecord} from '../../lib/isRecord'\nimport {MenuContext, MenuContextValue} from './menuContext'\n\nexport function useMenu(): MenuContextValue {\n const value = useContext(MenuContext)\n\n if (!value) {\n throw new Error('useMenu(): missing context value')\n }\n\n // NOTE: This check is for future-compatiblity\n // - If the value is not an object, it’s not compatible with the current version\n // - If the value is an object, but doesn’t have `version: 2`, it’s not compatible with the current version\n if (!isRecord(value) || value.version !== 2) {\n throw new Error('useMenu(): the context value is not compatible')\n }\n\n return value\n}\n","import {ChevronRightIcon} from '@sanity/icons/ChevronRight'\nimport {isValidElement, startTransition, useCallback, useEffect, useState} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {Selectable} from '../../primitives/_selectable/selectable'\nimport {Box} from '../../primitives/box/box'\nimport {Flex} from '../../primitives/flex/flex'\nimport {Popover, PopoverProps} from '../../primitives/popover/popover'\nimport {Text} from '../../primitives/text/text'\nimport {_getArrayProp} from '../../styles/helpers'\nimport {useRootTheme} from '../../theme/useRootTheme'\nimport {ElementType, Props} from '../../types/component'\nimport {Radius} from '../../types/radius'\nimport {SelectableTone} from '../../types/selectable'\nimport {Menu, MenuProps} from './menu'\nimport {useMenu} from './useMenu'\n\n/**\n * @public\n */\nexport interface MenuGroupOwnProps {\n fontSize?: number | number[]\n // oxlint-disable-next-line no-redundant-type-constituents\n icon?: React.ElementType | React.ReactNode\n menu?: Omit<\n MenuProps,\n | 'onClickOutside'\n | 'onEscape'\n | 'onItemClick'\n | 'onKeyDown'\n | 'onMouseEnter'\n | 'registerElement'\n | 'shouldFocus'\n | 'onBlurCapture'\n >\n padding?: number | number[]\n popover?: Omit<PopoverProps, 'content' | 'open'>\n radius?: Radius | Radius[]\n gap?: number | number[]\n /**\n * @deprecated Use `gap` instead.\n */\n space?: never\n text: React.ReactNode\n tone?: SelectableTone\n}\n\n/**\n * @public\n */\nexport type MenuGroupProps<E extends ElementType = 'button'> = Props<MenuGroupOwnProps, E>\n\nconst MenuGroupComponent = function MenuGroup(\n props: Omit<React.HTMLProps<HTMLDivElement>, 'as' | 'height' | 'popover' | 'ref' | 'tabIndex'> &\n MenuGroupOwnProps & {as?: ElementType},\n): React.JSX.Element {\n const {\n as = 'button',\n children,\n fontSize = 1,\n icon: IconComponent,\n menu: menuProps,\n onClick,\n padding = 3,\n popover,\n radius = 2,\n gap = 3,\n text,\n tone = 'default',\n ...restProps\n } = props\n const menu = useMenu()\n const {scheme} = useRootTheme()\n const {\n activeElement,\n mount,\n onClickOutside,\n onEscape,\n onItemClick,\n onItemMouseEnter: _onItemMouseEnter,\n registerElement,\n } = menu\n const onItemMouseEnter = _onItemMouseEnter ?? menu.onItemMouseEnter\n const [rootElement, setRootElement] = useState<HTMLButtonElement | HTMLDivElement | null>(null)\n const [shouldFocus, setShouldFocus] = useState<'first' | 'last' | null>(null)\n const active = Boolean(activeElement) && activeElement === rootElement\n const [withinMenu, setWithinMenu] = useState(false)\n\n // The child menu is open while the item is active and was opened during this activation. The\n // end of an activation is counted rather than reset in `openedIn`, which the openers set in\n // transitions: React does not rebase a render-phase update over a pending lower-priority one\n // (`rerenderReducer`), so the reset would be lost under an open that is still rendering.\n const [activation, setActivation] = useState(0)\n const [openedIn, setOpenedIn] = useState<number | null>(null)\n const [prevActive, setPrevActive] = useState(active)\n\n if (active !== prevActive) {\n setPrevActive(active)\n if (!active) setActivation((current) => current + 1)\n }\n\n const childMenuOpen = active && openedIn === activation\n // Every opener sets `withinMenu`, so it needs no reset when the child menu closes\n const pressed = childMenuOpen && withinMenu\n\n // The child menu opens and closes in transitions, as `Popover` asks of `open`. `shouldFocus` goes\n // with the open: it is reset a frame after it commits, which must not come before the open.\n const handleMouseEnter = useCallback(\n (event: React.MouseEvent<HTMLElement>) => {\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => setOpenedIn(activation))\n },\n [activation, onItemMouseEnter],\n )\n\n const handleMenuKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'ArrowLeft') {\n event.stopPropagation()\n\n startTransition(() => setOpenedIn(null))\n\n requestAnimationFrame(() => {\n rootElement?.focus()\n })\n }\n },\n [rootElement],\n )\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event)\n\n setWithinMenu(false)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n },\n [activation, onClick, onItemMouseEnter],\n )\n\n const handleChildItemClick = useCallback(() => {\n startTransition(() => setOpenedIn(null))\n onItemClick?.()\n }, [onItemClick])\n\n const handleMenuMouseEnter = useCallback(() => setWithinMenu(true), [])\n\n // Register the menu item element\n useEffect(() => mount(rootElement), [mount, rootElement])\n\n // Reset the shouldFocus state after it has been used\n useEffect(() => {\n if (!shouldFocus) return\n // The useMenuController effect that handles `shouldFocus` schedules a request animation frame where it's processed.\n // By doing the same here, we ensure that the reset is processed after the focus change.\n const rafId = requestAnimationFrame(() => setShouldFocus(null))\n\n // oxlint-disable-next-line consistent-return\n return () => cancelAnimationFrame(rafId)\n }, [shouldFocus])\n\n const childMenu = (\n <Menu\n {...menuProps}\n onClickOutside={onClickOutside}\n onEscape={onEscape}\n onItemClick={handleChildItemClick}\n onKeyDown={handleMenuKeyDown}\n onMouseEnter={handleMenuMouseEnter}\n registerElement={registerElement}\n shouldFocus={shouldFocus}\n >\n {children}\n </Menu>\n )\n\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const target = event.currentTarget\n\n if (document.activeElement !== target) {\n return\n }\n\n if (event.key === 'ArrowRight') {\n setWithinMenu(true)\n onItemMouseEnter(event)\n startTransition(() => {\n setShouldFocus('first')\n setOpenedIn(activation)\n })\n\n return\n }\n },\n [activation, onItemMouseEnter],\n )\n\n return (\n <Popover {...popover} content={childMenu} data-ui=\"MenuGroup__popover\" open={childMenuOpen}>\n <Selectable\n data-as={as}\n data-ui=\"MenuGroup\"\n forwardedAs={as}\n {...restProps}\n aria-pressed={as === 'button' ? pressed : undefined}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={!pressed && active ? '' : undefined}\n $radius={_getArrayProp(radius)}\n $tone={tone}\n $scheme={scheme}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n onMouseEnter={handleMouseEnter}\n ref={setRootElement}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n <Flex gap={gap} padding={padding}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n\n <Text size={fontSize}>\n <ChevronRightIcon />\n </Text>\n </Flex>\n </Selectable>\n </Popover>\n )\n}\n\n/**\n * @public\n */\nexport const MenuGroup: <E extends ElementType = 'button'>(\n props: MenuGroupProps<E>,\n) => React.JSX.Element = MenuGroupComponent\n","import {\n isValidElement,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport {isValidElementType} from 'react-is'\n\nimport {Selectable} from '../../primitives/_selectable/selectable'\nimport {Box} from '../../primitives/box/box'\nimport {Flex} from '../../primitives/flex/flex'\nimport {Text} from '../../primitives/text/text'\nimport {ResponsivePaddingProps, ResponsiveRadiusProps} from '../../primitives/types'\nimport {_getArrayProp} from '../../styles/helpers'\nimport {useRootTheme} from '../../theme/useRootTheme'\nimport {ElementType, Props} from '../../types/component'\nimport {SelectableTone} from '../../types/selectable'\nimport {Hotkeys} from '../hotkeys/hotkeys'\nimport {useMenu} from './useMenu'\n\n/**\n * @public\n */\nexport interface MenuItemOwnProps extends ResponsivePaddingProps, ResponsiveRadiusProps {\n fontSize?: number | number[]\n hotkeys?: string[]\n // oxlint-disable-next-line no-redundant-type-constituents\n icon?: React.ElementType | React.ReactNode\n // oxlint-disable-next-line no-redundant-type-constituents\n iconRight?: React.ElementType | React.ReactNode\n pressed?: boolean\n selected?: boolean\n gap?: number | number[]\n /**\n * @deprecated Use `gap` instead.\n */\n space?: never\n text?: React.ReactNode\n tone?: SelectableTone\n}\n\n/**\n * @public\n */\nexport type MenuItemProps<E extends ElementType = 'button'> = Props<MenuItemOwnProps, E>\n\nconst MenuItemComponent = function MenuItem(\n props: MenuItemOwnProps & {as?: ElementType} & Omit<\n React.HTMLProps<HTMLDivElement>,\n 'as' | 'height' | 'selected' | 'tabIndex'\n >,\n) {\n const {\n as = 'button',\n children,\n disabled,\n fontSize = 1,\n hotkeys,\n icon: IconComponent,\n iconRight: IconRightComponent,\n onClick,\n padding = 3,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n pressed,\n radius = 2,\n ref: forwardedRef,\n selected: selectedProp,\n gap = 3,\n text,\n tone = 'default',\n ...restProps\n } = props\n const {scheme} = useRootTheme()\n const menu = useMenu()\n const {\n activeElement,\n mount,\n onItemClick,\n onItemMouseEnter: _onItemMouseEnter,\n onItemMouseLeave: _onItemMouseLeave,\n } = menu\n const onItemMouseEnter = _onItemMouseEnter ?? menu.onItemMouseEnter\n const onItemMouseLeave = _onItemMouseLeave ?? menu.onItemMouseLeave\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null)\n const active = Boolean(activeElement) && activeElement === rootElement\n const ref = useRef<HTMLDivElement | null>(null)\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(forwardedRef, () => ref.current)\n\n useEffect(() => mount(rootElement, selectedProp), [mount, rootElement, selectedProp])\n\n const handleClick = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return\n if (onClick) onClick(event)\n if (onItemClick) onItemClick()\n },\n [disabled, onClick, onItemClick],\n )\n\n const paddingProps = useMemo(\n () => ({\n padding,\n paddingX,\n paddingY,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n }),\n [padding, paddingX, paddingY, paddingTop, paddingRight, paddingBottom, paddingLeft],\n )\n\n const hotkeysFontSize = _getArrayProp(fontSize).map((s) => s - 1)\n\n const setRef = useCallback((el: HTMLDivElement | null) => {\n ref.current = el\n setRootElement(el)\n }, [])\n\n return (\n <Selectable\n data-ui=\"MenuItem\"\n role=\"menuitem\"\n {...restProps}\n data-pressed={as !== 'button' && pressed ? '' : undefined}\n data-selected={active ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n forwardedAs={as}\n $radius={_getArrayProp(radius)}\n $padding={_getArrayProp(0)}\n $tone={disabled ? 'default' : tone}\n $scheme={scheme}\n disabled={disabled}\n onClick={handleClick}\n onMouseEnter={onItemMouseEnter}\n onMouseLeave={onItemMouseLeave}\n ref={setRef}\n tabIndex={-1}\n type={as === 'button' ? 'button' : undefined}\n >\n {(IconComponent || text || IconRightComponent) && (\n <Flex as=\"span\" gap={gap} align=\"center\" {...paddingProps}>\n {IconComponent && (\n <Text size={fontSize}>\n {isValidElement(IconComponent) && IconComponent}\n {isValidElementType(IconComponent) && <IconComponent />}\n </Text>\n )}\n\n {text && (\n <Box flex={1}>\n <Text size={fontSize} textOverflow=\"ellipsis\" weight=\"medium\">\n {text}\n </Text>\n </Box>\n )}\n\n {hotkeys && (\n <Hotkeys\n fontSize={hotkeysFontSize}\n keys={hotkeys}\n style={{marginTop: -4, marginBottom: -4}}\n />\n )}\n\n {IconRightComponent && (\n <Text size={fontSize}>\n {isValidElement(IconRightComponent) && IconRightComponent}\n {isValidElementType(IconRightComponent) && <IconRightComponent />}\n </Text>\n )}\n </Flex>\n )}\n {children && (\n <Box as=\"span\" {...paddingProps}>\n {children}\n </Box>\n )}\n </Selectable>\n )\n}\n\n/**\n * @public\n */\nexport const MenuItem: <E extends ElementType = 'button'>(\n props: MenuItemProps<E>,\n) => React.JSX.Element = MenuItemComponent\n"],"mappings":"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"}