index.js 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. var $cnSS2$babelruntimehelpersextends = require("@babel/runtime/helpers/extends");
  2. var $cnSS2$react = require("react");
  3. var $cnSS2$radixuiprimitive = require("@radix-ui/primitive");
  4. var $cnSS2$radixuireactcollection = require("@radix-ui/react-collection");
  5. var $cnSS2$radixuireactcomposerefs = require("@radix-ui/react-compose-refs");
  6. var $cnSS2$radixuireactcontext = require("@radix-ui/react-context");
  7. var $cnSS2$radixuireactdirection = require("@radix-ui/react-direction");
  8. var $cnSS2$radixuireactdismissablelayer = require("@radix-ui/react-dismissable-layer");
  9. var $cnSS2$radixuireactfocusguards = require("@radix-ui/react-focus-guards");
  10. var $cnSS2$radixuireactfocusscope = require("@radix-ui/react-focus-scope");
  11. var $cnSS2$radixuireactid = require("@radix-ui/react-id");
  12. var $cnSS2$radixuireactpopper = require("@radix-ui/react-popper");
  13. var $cnSS2$radixuireactportal = require("@radix-ui/react-portal");
  14. var $cnSS2$radixuireactpresence = require("@radix-ui/react-presence");
  15. var $cnSS2$radixuireactprimitive = require("@radix-ui/react-primitive");
  16. var $cnSS2$radixuireactrovingfocus = require("@radix-ui/react-roving-focus");
  17. var $cnSS2$radixuireactslot = require("@radix-ui/react-slot");
  18. var $cnSS2$radixuireactusecallbackref = require("@radix-ui/react-use-callback-ref");
  19. var $cnSS2$ariahidden = require("aria-hidden");
  20. var $cnSS2$reactremovescroll = require("react-remove-scroll");
  21. function $parcel$export(e, n, v, s) {
  22. Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
  23. }
  24. function $parcel$interopDefault(a) {
  25. return a && a.__esModule ? a.default : a;
  26. }
  27. $parcel$export(module.exports, "createMenuScope", () => $213e4d2df823067d$export$4027731b685e72eb);
  28. $parcel$export(module.exports, "Menu", () => $213e4d2df823067d$export$d9b273488cd8ce6f);
  29. $parcel$export(module.exports, "MenuAnchor", () => $213e4d2df823067d$export$9fa5ebd18bee4d43);
  30. $parcel$export(module.exports, "MenuPortal", () => $213e4d2df823067d$export$793392f970497feb);
  31. $parcel$export(module.exports, "MenuContent", () => $213e4d2df823067d$export$479f0f2f71193efe);
  32. $parcel$export(module.exports, "MenuGroup", () => $213e4d2df823067d$export$22a631d1f72787bb);
  33. $parcel$export(module.exports, "MenuLabel", () => $213e4d2df823067d$export$dd37bec0e8a99143);
  34. $parcel$export(module.exports, "MenuItem", () => $213e4d2df823067d$export$2ce376c2cc3355c8);
  35. $parcel$export(module.exports, "MenuCheckboxItem", () => $213e4d2df823067d$export$f6f243521332502d);
  36. $parcel$export(module.exports, "MenuRadioGroup", () => $213e4d2df823067d$export$ea2200c9eee416b3);
  37. $parcel$export(module.exports, "MenuRadioItem", () => $213e4d2df823067d$export$69bd225e9817f6d0);
  38. $parcel$export(module.exports, "MenuItemIndicator", () => $213e4d2df823067d$export$a2593e23056970a3);
  39. $parcel$export(module.exports, "MenuSeparator", () => $213e4d2df823067d$export$1cec7dcdd713e220);
  40. $parcel$export(module.exports, "MenuArrow", () => $213e4d2df823067d$export$bcdda4773debf5fa);
  41. $parcel$export(module.exports, "MenuSub", () => $213e4d2df823067d$export$71bdb9d1e2909932);
  42. $parcel$export(module.exports, "MenuSubTrigger", () => $213e4d2df823067d$export$5fbbb3ba7297405f);
  43. $parcel$export(module.exports, "MenuSubContent", () => $213e4d2df823067d$export$e7142ab31822bde6);
  44. $parcel$export(module.exports, "Root", () => $213e4d2df823067d$export$be92b6f5f03c0fe9);
  45. $parcel$export(module.exports, "Anchor", () => $213e4d2df823067d$export$b688253958b8dfe7);
  46. $parcel$export(module.exports, "Portal", () => $213e4d2df823067d$export$602eac185826482c);
  47. $parcel$export(module.exports, "Content", () => $213e4d2df823067d$export$7c6e2c02157bb7d2);
  48. $parcel$export(module.exports, "Group", () => $213e4d2df823067d$export$eb2fcfdbd7ba97d4);
  49. $parcel$export(module.exports, "Label", () => $213e4d2df823067d$export$b04be29aa201d4f5);
  50. $parcel$export(module.exports, "Item", () => $213e4d2df823067d$export$6d08773d2e66f8f2);
  51. $parcel$export(module.exports, "CheckboxItem", () => $213e4d2df823067d$export$16ce288f89fa631c);
  52. $parcel$export(module.exports, "RadioGroup", () => $213e4d2df823067d$export$a98f0dcb43a68a25);
  53. $parcel$export(module.exports, "RadioItem", () => $213e4d2df823067d$export$371ab307eab489c0);
  54. $parcel$export(module.exports, "ItemIndicator", () => $213e4d2df823067d$export$c3468e2714d175fa);
  55. $parcel$export(module.exports, "Separator", () => $213e4d2df823067d$export$1ff3c3f08ae963c0);
  56. $parcel$export(module.exports, "Arrow", () => $213e4d2df823067d$export$21b07c8f274aebd5);
  57. $parcel$export(module.exports, "Sub", () => $213e4d2df823067d$export$d7a01e11500dfb6f);
  58. $parcel$export(module.exports, "SubTrigger", () => $213e4d2df823067d$export$2ea8a7a591ac5eac);
  59. $parcel$export(module.exports, "SubContent", () => $213e4d2df823067d$export$6d4de93b380beddf);
  60. const $213e4d2df823067d$var$SELECTION_KEYS = [
  61. 'Enter',
  62. ' '
  63. ];
  64. const $213e4d2df823067d$var$FIRST_KEYS = [
  65. 'ArrowDown',
  66. 'PageUp',
  67. 'Home'
  68. ];
  69. const $213e4d2df823067d$var$LAST_KEYS = [
  70. 'ArrowUp',
  71. 'PageDown',
  72. 'End'
  73. ];
  74. const $213e4d2df823067d$var$FIRST_LAST_KEYS = [
  75. ...$213e4d2df823067d$var$FIRST_KEYS,
  76. ...$213e4d2df823067d$var$LAST_KEYS
  77. ];
  78. const $213e4d2df823067d$var$SUB_OPEN_KEYS = {
  79. ltr: [
  80. ...$213e4d2df823067d$var$SELECTION_KEYS,
  81. 'ArrowRight'
  82. ],
  83. rtl: [
  84. ...$213e4d2df823067d$var$SELECTION_KEYS,
  85. 'ArrowLeft'
  86. ]
  87. };
  88. const $213e4d2df823067d$var$SUB_CLOSE_KEYS = {
  89. ltr: [
  90. 'ArrowLeft'
  91. ],
  92. rtl: [
  93. 'ArrowRight'
  94. ]
  95. };
  96. /* -------------------------------------------------------------------------------------------------
  97. * Menu
  98. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$MENU_NAME = 'Menu';
  99. const [$213e4d2df823067d$var$Collection, $213e4d2df823067d$var$useCollection, $213e4d2df823067d$var$createCollectionScope] = $cnSS2$radixuireactcollection.createCollection($213e4d2df823067d$var$MENU_NAME);
  100. const [$213e4d2df823067d$var$createMenuContext, $213e4d2df823067d$export$4027731b685e72eb] = $cnSS2$radixuireactcontext.createContextScope($213e4d2df823067d$var$MENU_NAME, [
  101. $213e4d2df823067d$var$createCollectionScope,
  102. $cnSS2$radixuireactpopper.createPopperScope,
  103. $cnSS2$radixuireactrovingfocus.createRovingFocusGroupScope
  104. ]);
  105. const $213e4d2df823067d$var$usePopperScope = $cnSS2$radixuireactpopper.createPopperScope();
  106. const $213e4d2df823067d$var$useRovingFocusGroupScope = $cnSS2$radixuireactrovingfocus.createRovingFocusGroupScope();
  107. const [$213e4d2df823067d$var$MenuProvider, $213e4d2df823067d$var$useMenuContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$MENU_NAME);
  108. const [$213e4d2df823067d$var$MenuRootProvider, $213e4d2df823067d$var$useMenuRootContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$MENU_NAME);
  109. const $213e4d2df823067d$export$d9b273488cd8ce6f = (props)=>{
  110. const { __scopeMenu: __scopeMenu , open: open = false , children: children , dir: dir , onOpenChange: onOpenChange , modal: modal = true } = props;
  111. const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu);
  112. const [content, setContent] = $cnSS2$react.useState(null);
  113. const isUsingKeyboardRef = $cnSS2$react.useRef(false);
  114. const handleOpenChange = $cnSS2$radixuireactusecallbackref.useCallbackRef(onOpenChange);
  115. const direction = $cnSS2$radixuireactdirection.useDirection(dir);
  116. $cnSS2$react.useEffect(()=>{
  117. // Capture phase ensures we set the boolean before any side effects execute
  118. // in response to the key or pointer event as they might depend on this value.
  119. const handleKeyDown = ()=>{
  120. isUsingKeyboardRef.current = true;
  121. document.addEventListener('pointerdown', handlePointer, {
  122. capture: true,
  123. once: true
  124. });
  125. document.addEventListener('pointermove', handlePointer, {
  126. capture: true,
  127. once: true
  128. });
  129. };
  130. const handlePointer = ()=>isUsingKeyboardRef.current = false
  131. ;
  132. document.addEventListener('keydown', handleKeyDown, {
  133. capture: true
  134. });
  135. return ()=>{
  136. document.removeEventListener('keydown', handleKeyDown, {
  137. capture: true
  138. });
  139. document.removeEventListener('pointerdown', handlePointer, {
  140. capture: true
  141. });
  142. document.removeEventListener('pointermove', handlePointer, {
  143. capture: true
  144. });
  145. };
  146. }, []);
  147. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpopper.Root, popperScope, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuProvider, {
  148. scope: __scopeMenu,
  149. open: open,
  150. onOpenChange: handleOpenChange,
  151. content: content,
  152. onContentChange: setContent
  153. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuRootProvider, {
  154. scope: __scopeMenu,
  155. onClose: $cnSS2$react.useCallback(()=>handleOpenChange(false)
  156. , [
  157. handleOpenChange
  158. ]),
  159. isUsingKeyboardRef: isUsingKeyboardRef,
  160. dir: direction,
  161. modal: modal
  162. }, children)));
  163. };
  164. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$d9b273488cd8ce6f, {
  165. displayName: $213e4d2df823067d$var$MENU_NAME
  166. });
  167. /* -------------------------------------------------------------------------------------------------
  168. * MenuAnchor
  169. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$ANCHOR_NAME = 'MenuAnchor';
  170. const $213e4d2df823067d$export$9fa5ebd18bee4d43 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  171. const { __scopeMenu: __scopeMenu , ...anchorProps } = props;
  172. const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu);
  173. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpopper.Anchor, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, popperScope, anchorProps, {
  174. ref: forwardedRef
  175. }));
  176. });
  177. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$9fa5ebd18bee4d43, {
  178. displayName: $213e4d2df823067d$var$ANCHOR_NAME
  179. });
  180. /* -------------------------------------------------------------------------------------------------
  181. * MenuPortal
  182. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$PORTAL_NAME = 'MenuPortal';
  183. const [$213e4d2df823067d$var$PortalProvider, $213e4d2df823067d$var$usePortalContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$PORTAL_NAME, {
  184. forceMount: undefined
  185. });
  186. const $213e4d2df823067d$export$793392f970497feb = (props)=>{
  187. const { __scopeMenu: __scopeMenu , forceMount: forceMount , children: children , container: container } = props;
  188. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$PORTAL_NAME, __scopeMenu);
  189. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$PortalProvider, {
  190. scope: __scopeMenu,
  191. forceMount: forceMount
  192. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, {
  193. present: forceMount || context.open
  194. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactportal.Portal, {
  195. asChild: true,
  196. container: container
  197. }, children)));
  198. };
  199. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$793392f970497feb, {
  200. displayName: $213e4d2df823067d$var$PORTAL_NAME
  201. });
  202. /* -------------------------------------------------------------------------------------------------
  203. * MenuContent
  204. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$CONTENT_NAME = 'MenuContent';
  205. const [$213e4d2df823067d$var$MenuContentProvider, $213e4d2df823067d$var$useMenuContentContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$CONTENT_NAME);
  206. const $213e4d2df823067d$export$479f0f2f71193efe = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  207. const portalContext = $213e4d2df823067d$var$usePortalContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  208. const { forceMount: forceMount = portalContext.forceMount , ...contentProps } = props;
  209. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  210. const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  211. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$Collection.Provider, {
  212. scope: props.__scopeMenu
  213. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, {
  214. present: forceMount || context.open
  215. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$Collection.Slot, {
  216. scope: props.__scopeMenu
  217. }, rootContext.modal ? /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuRootContentModal, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, contentProps, {
  218. ref: forwardedRef
  219. })) : /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuRootContentNonModal, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, contentProps, {
  220. ref: forwardedRef
  221. })))));
  222. });
  223. /* ---------------------------------------------------------------------------------------------- */ const $213e4d2df823067d$var$MenuRootContentModal = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  224. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  225. const ref = $cnSS2$react.useRef(null);
  226. const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref); // Hide everything from ARIA except the `MenuContent`
  227. $cnSS2$react.useEffect(()=>{
  228. const content = ref.current;
  229. if (content) return $cnSS2$ariahidden.hideOthers(content);
  230. }, []);
  231. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuContentImpl, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, props, {
  232. ref: composedRefs // we make sure we're not trapping once it's been closed
  233. ,
  234. trapFocus: context.open // make sure to only disable pointer events when open
  235. ,
  236. disableOutsidePointerEvents: context.open,
  237. disableOutsideScroll: true // When focus is trapped, a `focusout` event may still happen.
  238. ,
  239. onFocusOutside: $cnSS2$radixuiprimitive.composeEventHandlers(props.onFocusOutside, (event)=>event.preventDefault()
  240. , {
  241. checkForDefaultPrevented: false
  242. }),
  243. onDismiss: ()=>context.onOpenChange(false)
  244. }));
  245. });
  246. const $213e4d2df823067d$var$MenuRootContentNonModal = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  247. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  248. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuContentImpl, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, props, {
  249. ref: forwardedRef,
  250. trapFocus: false,
  251. disableOutsidePointerEvents: false,
  252. disableOutsideScroll: false,
  253. onDismiss: ()=>context.onOpenChange(false)
  254. }));
  255. });
  256. /* ---------------------------------------------------------------------------------------------- */ const $213e4d2df823067d$var$MenuContentImpl = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  257. const { __scopeMenu: __scopeMenu , loop: loop = false , trapFocus: trapFocus , onOpenAutoFocus: onOpenAutoFocus , onCloseAutoFocus: onCloseAutoFocus , disableOutsidePointerEvents: disableOutsidePointerEvents , onEntryFocus: onEntryFocus , onEscapeKeyDown: onEscapeKeyDown , onPointerDownOutside: onPointerDownOutside , onFocusOutside: onFocusOutside , onInteractOutside: onInteractOutside , onDismiss: onDismiss , disableOutsideScroll: disableOutsideScroll , ...contentProps } = props;
  258. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, __scopeMenu);
  259. const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$CONTENT_NAME, __scopeMenu);
  260. const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu);
  261. const rovingFocusGroupScope = $213e4d2df823067d$var$useRovingFocusGroupScope(__scopeMenu);
  262. const getItems = $213e4d2df823067d$var$useCollection(__scopeMenu);
  263. const [currentItemId, setCurrentItemId] = $cnSS2$react.useState(null);
  264. const contentRef = $cnSS2$react.useRef(null);
  265. const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, contentRef, context.onContentChange);
  266. const timerRef = $cnSS2$react.useRef(0);
  267. const searchRef = $cnSS2$react.useRef('');
  268. const pointerGraceTimerRef = $cnSS2$react.useRef(0);
  269. const pointerGraceIntentRef = $cnSS2$react.useRef(null);
  270. const pointerDirRef = $cnSS2$react.useRef('right');
  271. const lastPointerXRef = $cnSS2$react.useRef(0);
  272. const ScrollLockWrapper = disableOutsideScroll ? $cnSS2$reactremovescroll.RemoveScroll : $cnSS2$react.Fragment;
  273. const scrollLockWrapperProps = disableOutsideScroll ? {
  274. as: $cnSS2$radixuireactslot.Slot,
  275. allowPinchZoom: true
  276. } : undefined;
  277. const handleTypeaheadSearch = (key)=>{
  278. var _items$find, _items$find2;
  279. const search = searchRef.current + key;
  280. const items = getItems().filter((item)=>!item.disabled
  281. );
  282. const currentItem = document.activeElement;
  283. const currentMatch = (_items$find = items.find((item)=>item.ref.current === currentItem
  284. )) === null || _items$find === void 0 ? void 0 : _items$find.textValue;
  285. const values = items.map((item)=>item.textValue
  286. );
  287. const nextMatch = $213e4d2df823067d$var$getNextMatch(values, search, currentMatch);
  288. const newItem = (_items$find2 = items.find((item)=>item.textValue === nextMatch
  289. )) === null || _items$find2 === void 0 ? void 0 : _items$find2.ref.current; // Reset `searchRef` 1 second after it was last updated
  290. (function updateSearch(value) {
  291. searchRef.current = value;
  292. window.clearTimeout(timerRef.current);
  293. if (value !== '') timerRef.current = window.setTimeout(()=>updateSearch('')
  294. , 1000);
  295. })(search);
  296. if (newItem) /**
  297. * Imperative focus during keydown is risky so we prevent React's batching updates
  298. * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332
  299. */ setTimeout(()=>newItem.focus()
  300. );
  301. };
  302. $cnSS2$react.useEffect(()=>{
  303. return ()=>window.clearTimeout(timerRef.current)
  304. ;
  305. }, []); // Make sure the whole tree has focus guards as our `MenuContent` may be
  306. // the last element in the DOM (beacuse of the `Portal`)
  307. $cnSS2$radixuireactfocusguards.useFocusGuards();
  308. const isPointerMovingToSubmenu = $cnSS2$react.useCallback((event)=>{
  309. var _pointerGraceIntentRe, _pointerGraceIntentRe2;
  310. const isMovingTowards = pointerDirRef.current === ((_pointerGraceIntentRe = pointerGraceIntentRef.current) === null || _pointerGraceIntentRe === void 0 ? void 0 : _pointerGraceIntentRe.side);
  311. return isMovingTowards && $213e4d2df823067d$var$isPointerInGraceArea(event, (_pointerGraceIntentRe2 = pointerGraceIntentRef.current) === null || _pointerGraceIntentRe2 === void 0 ? void 0 : _pointerGraceIntentRe2.area);
  312. }, []);
  313. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuContentProvider, {
  314. scope: __scopeMenu,
  315. searchRef: searchRef,
  316. onItemEnter: $cnSS2$react.useCallback((event)=>{
  317. if (isPointerMovingToSubmenu(event)) event.preventDefault();
  318. }, [
  319. isPointerMovingToSubmenu
  320. ]),
  321. onItemLeave: $cnSS2$react.useCallback((event)=>{
  322. var _contentRef$current;
  323. if (isPointerMovingToSubmenu(event)) return;
  324. (_contentRef$current = contentRef.current) === null || _contentRef$current === void 0 || _contentRef$current.focus();
  325. setCurrentItemId(null);
  326. }, [
  327. isPointerMovingToSubmenu
  328. ]),
  329. onTriggerLeave: $cnSS2$react.useCallback((event)=>{
  330. if (isPointerMovingToSubmenu(event)) event.preventDefault();
  331. }, [
  332. isPointerMovingToSubmenu
  333. ]),
  334. pointerGraceTimerRef: pointerGraceTimerRef,
  335. onPointerGraceIntentChange: $cnSS2$react.useCallback((intent)=>{
  336. pointerGraceIntentRef.current = intent;
  337. }, [])
  338. }, /*#__PURE__*/ $cnSS2$react.createElement(ScrollLockWrapper, scrollLockWrapperProps, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactfocusscope.FocusScope, {
  339. asChild: true,
  340. trapped: trapFocus,
  341. onMountAutoFocus: $cnSS2$radixuiprimitive.composeEventHandlers(onOpenAutoFocus, (event)=>{
  342. var _contentRef$current2;
  343. // when opening, explicitly focus the content area only and leave
  344. // `onEntryFocus` in control of focusing first item
  345. event.preventDefault();
  346. (_contentRef$current2 = contentRef.current) === null || _contentRef$current2 === void 0 || _contentRef$current2.focus();
  347. }),
  348. onUnmountAutoFocus: onCloseAutoFocus
  349. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactdismissablelayer.DismissableLayer, {
  350. asChild: true,
  351. disableOutsidePointerEvents: disableOutsidePointerEvents,
  352. onEscapeKeyDown: onEscapeKeyDown,
  353. onPointerDownOutside: onPointerDownOutside,
  354. onFocusOutside: onFocusOutside,
  355. onInteractOutside: onInteractOutside,
  356. onDismiss: onDismiss
  357. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactrovingfocus.Root, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  358. asChild: true
  359. }, rovingFocusGroupScope, {
  360. dir: rootContext.dir,
  361. orientation: "vertical",
  362. loop: loop,
  363. currentTabStopId: currentItemId,
  364. onCurrentTabStopIdChange: setCurrentItemId,
  365. onEntryFocus: $cnSS2$radixuiprimitive.composeEventHandlers(onEntryFocus, (event)=>{
  366. // only focus first item when using keyboard
  367. if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
  368. })
  369. }), /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpopper.Content, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  370. role: "menu",
  371. "aria-orientation": "vertical",
  372. "data-state": $213e4d2df823067d$var$getOpenState(context.open),
  373. "data-radix-menu-content": "",
  374. dir: rootContext.dir
  375. }, popperScope, contentProps, {
  376. ref: composedRefs,
  377. style: {
  378. outline: 'none',
  379. ...contentProps.style
  380. },
  381. onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(contentProps.onKeyDown, (event)=>{
  382. // submenu key events bubble through portals. We only care about keys in this menu.
  383. const target = event.target;
  384. const isKeyDownInside = target.closest('[data-radix-menu-content]') === event.currentTarget;
  385. const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
  386. const isCharacterKey = event.key.length === 1;
  387. if (isKeyDownInside) {
  388. // menus should not be navigated using tab key so we prevent it
  389. if (event.key === 'Tab') event.preventDefault();
  390. if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
  391. } // focus first/last item based on key pressed
  392. const content = contentRef.current;
  393. if (event.target !== content) return;
  394. if (!$213e4d2df823067d$var$FIRST_LAST_KEYS.includes(event.key)) return;
  395. event.preventDefault();
  396. const items = getItems().filter((item)=>!item.disabled
  397. );
  398. const candidateNodes = items.map((item)=>item.ref.current
  399. );
  400. if ($213e4d2df823067d$var$LAST_KEYS.includes(event.key)) candidateNodes.reverse();
  401. $213e4d2df823067d$var$focusFirst(candidateNodes);
  402. }),
  403. onBlur: $cnSS2$radixuiprimitive.composeEventHandlers(props.onBlur, (event)=>{
  404. // clear search buffer when leaving the menu
  405. if (!event.currentTarget.contains(event.target)) {
  406. window.clearTimeout(timerRef.current);
  407. searchRef.current = '';
  408. }
  409. }),
  410. onPointerMove: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerMove, $213e4d2df823067d$var$whenMouse((event)=>{
  411. const target = event.target;
  412. const pointerXHasChanged = lastPointerXRef.current !== event.clientX; // We don't use `event.movementX` for this check because Safari will
  413. // always return `0` on a pointer event.
  414. if (event.currentTarget.contains(target) && pointerXHasChanged) {
  415. const newDir = event.clientX > lastPointerXRef.current ? 'right' : 'left';
  416. pointerDirRef.current = newDir;
  417. lastPointerXRef.current = event.clientX;
  418. }
  419. }))
  420. })))))));
  421. });
  422. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$479f0f2f71193efe, {
  423. displayName: $213e4d2df823067d$var$CONTENT_NAME
  424. });
  425. /* -------------------------------------------------------------------------------------------------
  426. * MenuGroup
  427. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$GROUP_NAME = 'MenuGroup';
  428. const $213e4d2df823067d$export$22a631d1f72787bb = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  429. const { __scopeMenu: __scopeMenu , ...groupProps } = props;
  430. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  431. role: "group"
  432. }, groupProps, {
  433. ref: forwardedRef
  434. }));
  435. });
  436. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$22a631d1f72787bb, {
  437. displayName: $213e4d2df823067d$var$GROUP_NAME
  438. });
  439. /* -------------------------------------------------------------------------------------------------
  440. * MenuLabel
  441. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$LABEL_NAME = 'MenuLabel';
  442. const $213e4d2df823067d$export$dd37bec0e8a99143 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  443. const { __scopeMenu: __scopeMenu , ...labelProps } = props;
  444. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, labelProps, {
  445. ref: forwardedRef
  446. }));
  447. });
  448. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$dd37bec0e8a99143, {
  449. displayName: $213e4d2df823067d$var$LABEL_NAME
  450. });
  451. /* -------------------------------------------------------------------------------------------------
  452. * MenuItem
  453. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$ITEM_NAME = 'MenuItem';
  454. const $213e4d2df823067d$var$ITEM_SELECT = 'menu.itemSelect';
  455. const $213e4d2df823067d$export$2ce376c2cc3355c8 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  456. const { disabled: disabled = false , onSelect: onSelect , ...itemProps } = props;
  457. const ref = $cnSS2$react.useRef(null);
  458. const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$ITEM_NAME, props.__scopeMenu);
  459. const contentContext = $213e4d2df823067d$var$useMenuContentContext($213e4d2df823067d$var$ITEM_NAME, props.__scopeMenu);
  460. const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref);
  461. const isPointerDownRef = $cnSS2$react.useRef(false);
  462. const handleSelect = ()=>{
  463. const menuItem = ref.current;
  464. if (!disabled && menuItem) {
  465. const itemSelectEvent = new CustomEvent($213e4d2df823067d$var$ITEM_SELECT, {
  466. bubbles: true,
  467. cancelable: true
  468. });
  469. menuItem.addEventListener($213e4d2df823067d$var$ITEM_SELECT, (event)=>onSelect === null || onSelect === void 0 ? void 0 : onSelect(event)
  470. , {
  471. once: true
  472. });
  473. $cnSS2$radixuireactprimitive.dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
  474. if (itemSelectEvent.defaultPrevented) isPointerDownRef.current = false;
  475. else rootContext.onClose();
  476. }
  477. };
  478. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuItemImpl, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, itemProps, {
  479. ref: composedRefs,
  480. disabled: disabled,
  481. onClick: $cnSS2$radixuiprimitive.composeEventHandlers(props.onClick, handleSelect),
  482. onPointerDown: (event)=>{
  483. var _props$onPointerDown;
  484. (_props$onPointerDown = props.onPointerDown) === null || _props$onPointerDown === void 0 || _props$onPointerDown.call(props, event);
  485. isPointerDownRef.current = true;
  486. },
  487. onPointerUp: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerUp, (event)=>{
  488. var _event$currentTarget;
  489. // Pointer down can move to a different menu item which should activate it on pointer up.
  490. // We dispatch a click for selection to allow composition with click based triggers and to
  491. // prevent Firefox from getting stuck in text selection mode when the menu closes.
  492. if (!isPointerDownRef.current) (_event$currentTarget = event.currentTarget) === null || _event$currentTarget === void 0 || _event$currentTarget.click();
  493. }),
  494. onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onKeyDown, (event)=>{
  495. const isTypingAhead = contentContext.searchRef.current !== '';
  496. if (disabled || isTypingAhead && event.key === ' ') return;
  497. if ($213e4d2df823067d$var$SELECTION_KEYS.includes(event.key)) {
  498. event.currentTarget.click();
  499. /**
  500. * We prevent default browser behaviour for selection keys as they should trigger
  501. * a selection only:
  502. * - prevents space from scrolling the page.
  503. * - if keydown causes focus to move, prevents keydown from firing on the new target.
  504. */ event.preventDefault();
  505. }
  506. })
  507. }));
  508. });
  509. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$2ce376c2cc3355c8, {
  510. displayName: $213e4d2df823067d$var$ITEM_NAME
  511. });
  512. /* ---------------------------------------------------------------------------------------------- */ const $213e4d2df823067d$var$MenuItemImpl = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  513. const { __scopeMenu: __scopeMenu , disabled: disabled = false , textValue: textValue , ...itemProps } = props;
  514. const contentContext = $213e4d2df823067d$var$useMenuContentContext($213e4d2df823067d$var$ITEM_NAME, __scopeMenu);
  515. const rovingFocusGroupScope = $213e4d2df823067d$var$useRovingFocusGroupScope(__scopeMenu);
  516. const ref = $cnSS2$react.useRef(null);
  517. const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref);
  518. const [isFocused, setIsFocused] = $cnSS2$react.useState(false); // get the item's `.textContent` as default strategy for typeahead `textValue`
  519. const [textContent, setTextContent] = $cnSS2$react.useState('');
  520. $cnSS2$react.useEffect(()=>{
  521. const menuItem = ref.current;
  522. if (menuItem) {
  523. var _menuItem$textContent;
  524. setTextContent(((_menuItem$textContent = menuItem.textContent) !== null && _menuItem$textContent !== void 0 ? _menuItem$textContent : '').trim());
  525. }
  526. }, [
  527. itemProps.children
  528. ]);
  529. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$Collection.ItemSlot, {
  530. scope: __scopeMenu,
  531. disabled: disabled,
  532. textValue: textValue !== null && textValue !== void 0 ? textValue : textContent
  533. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactrovingfocus.Item, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  534. asChild: true
  535. }, rovingFocusGroupScope, {
  536. focusable: !disabled
  537. }), /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  538. role: "menuitem",
  539. "data-highlighted": isFocused ? '' : undefined,
  540. "aria-disabled": disabled || undefined,
  541. "data-disabled": disabled ? '' : undefined
  542. }, itemProps, {
  543. ref: composedRefs,
  544. onPointerMove: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerMove, $213e4d2df823067d$var$whenMouse((event)=>{
  545. if (disabled) contentContext.onItemLeave(event);
  546. else {
  547. contentContext.onItemEnter(event);
  548. if (!event.defaultPrevented) {
  549. const item = event.currentTarget;
  550. item.focus();
  551. }
  552. }
  553. })),
  554. onPointerLeave: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerLeave, $213e4d2df823067d$var$whenMouse((event)=>contentContext.onItemLeave(event)
  555. )),
  556. onFocus: $cnSS2$radixuiprimitive.composeEventHandlers(props.onFocus, ()=>setIsFocused(true)
  557. ),
  558. onBlur: $cnSS2$radixuiprimitive.composeEventHandlers(props.onBlur, ()=>setIsFocused(false)
  559. )
  560. }))));
  561. });
  562. /* -------------------------------------------------------------------------------------------------
  563. * MenuCheckboxItem
  564. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$CHECKBOX_ITEM_NAME = 'MenuCheckboxItem';
  565. const $213e4d2df823067d$export$f6f243521332502d = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  566. const { checked: checked = false , onCheckedChange: onCheckedChange , ...checkboxItemProps } = props;
  567. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$ItemIndicatorProvider, {
  568. scope: props.__scopeMenu,
  569. checked: checked
  570. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$export$2ce376c2cc3355c8, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  571. role: "menuitemcheckbox",
  572. "aria-checked": $213e4d2df823067d$var$isIndeterminate(checked) ? 'mixed' : checked
  573. }, checkboxItemProps, {
  574. ref: forwardedRef,
  575. "data-state": $213e4d2df823067d$var$getCheckedState(checked),
  576. onSelect: $cnSS2$radixuiprimitive.composeEventHandlers(checkboxItemProps.onSelect, ()=>onCheckedChange === null || onCheckedChange === void 0 ? void 0 : onCheckedChange($213e4d2df823067d$var$isIndeterminate(checked) ? true : !checked)
  577. , {
  578. checkForDefaultPrevented: false
  579. })
  580. })));
  581. });
  582. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$f6f243521332502d, {
  583. displayName: $213e4d2df823067d$var$CHECKBOX_ITEM_NAME
  584. });
  585. /* -------------------------------------------------------------------------------------------------
  586. * MenuRadioGroup
  587. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$RADIO_GROUP_NAME = 'MenuRadioGroup';
  588. const [$213e4d2df823067d$var$RadioGroupProvider, $213e4d2df823067d$var$useRadioGroupContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$RADIO_GROUP_NAME, {
  589. value: undefined,
  590. onValueChange: ()=>{}
  591. });
  592. const $213e4d2df823067d$export$ea2200c9eee416b3 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  593. const { value: value , onValueChange: onValueChange , ...groupProps } = props;
  594. const handleValueChange = $cnSS2$radixuireactusecallbackref.useCallbackRef(onValueChange);
  595. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$RadioGroupProvider, {
  596. scope: props.__scopeMenu,
  597. value: value,
  598. onValueChange: handleValueChange
  599. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$export$22a631d1f72787bb, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, groupProps, {
  600. ref: forwardedRef
  601. })));
  602. });
  603. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$ea2200c9eee416b3, {
  604. displayName: $213e4d2df823067d$var$RADIO_GROUP_NAME
  605. });
  606. /* -------------------------------------------------------------------------------------------------
  607. * MenuRadioItem
  608. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$RADIO_ITEM_NAME = 'MenuRadioItem';
  609. const $213e4d2df823067d$export$69bd225e9817f6d0 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  610. const { value: value , ...radioItemProps } = props;
  611. const context = $213e4d2df823067d$var$useRadioGroupContext($213e4d2df823067d$var$RADIO_ITEM_NAME, props.__scopeMenu);
  612. const checked = value === context.value;
  613. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$ItemIndicatorProvider, {
  614. scope: props.__scopeMenu,
  615. checked: checked
  616. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$export$2ce376c2cc3355c8, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  617. role: "menuitemradio",
  618. "aria-checked": checked
  619. }, radioItemProps, {
  620. ref: forwardedRef,
  621. "data-state": $213e4d2df823067d$var$getCheckedState(checked),
  622. onSelect: $cnSS2$radixuiprimitive.composeEventHandlers(radioItemProps.onSelect, ()=>{
  623. var _context$onValueChang;
  624. return (_context$onValueChang = context.onValueChange) === null || _context$onValueChang === void 0 ? void 0 : _context$onValueChang.call(context, value);
  625. }, {
  626. checkForDefaultPrevented: false
  627. })
  628. })));
  629. });
  630. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$69bd225e9817f6d0, {
  631. displayName: $213e4d2df823067d$var$RADIO_ITEM_NAME
  632. });
  633. /* -------------------------------------------------------------------------------------------------
  634. * MenuItemIndicator
  635. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$ITEM_INDICATOR_NAME = 'MenuItemIndicator';
  636. const [$213e4d2df823067d$var$ItemIndicatorProvider, $213e4d2df823067d$var$useItemIndicatorContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$ITEM_INDICATOR_NAME, {
  637. checked: false
  638. });
  639. const $213e4d2df823067d$export$a2593e23056970a3 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  640. const { __scopeMenu: __scopeMenu , forceMount: forceMount , ...itemIndicatorProps } = props;
  641. const indicatorContext = $213e4d2df823067d$var$useItemIndicatorContext($213e4d2df823067d$var$ITEM_INDICATOR_NAME, __scopeMenu);
  642. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, {
  643. present: forceMount || $213e4d2df823067d$var$isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true
  644. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.span, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, itemIndicatorProps, {
  645. ref: forwardedRef,
  646. "data-state": $213e4d2df823067d$var$getCheckedState(indicatorContext.checked)
  647. })));
  648. });
  649. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$a2593e23056970a3, {
  650. displayName: $213e4d2df823067d$var$ITEM_INDICATOR_NAME
  651. });
  652. /* -------------------------------------------------------------------------------------------------
  653. * MenuSeparator
  654. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$SEPARATOR_NAME = 'MenuSeparator';
  655. const $213e4d2df823067d$export$1cec7dcdd713e220 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  656. const { __scopeMenu: __scopeMenu , ...separatorProps } = props;
  657. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactprimitive.Primitive.div, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  658. role: "separator",
  659. "aria-orientation": "horizontal"
  660. }, separatorProps, {
  661. ref: forwardedRef
  662. }));
  663. });
  664. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$1cec7dcdd713e220, {
  665. displayName: $213e4d2df823067d$var$SEPARATOR_NAME
  666. });
  667. /* -------------------------------------------------------------------------------------------------
  668. * MenuArrow
  669. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$ARROW_NAME = 'MenuArrow';
  670. const $213e4d2df823067d$export$bcdda4773debf5fa = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  671. const { __scopeMenu: __scopeMenu , ...arrowProps } = props;
  672. const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu);
  673. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpopper.Arrow, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({}, popperScope, arrowProps, {
  674. ref: forwardedRef
  675. }));
  676. });
  677. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$bcdda4773debf5fa, {
  678. displayName: $213e4d2df823067d$var$ARROW_NAME
  679. });
  680. /* -------------------------------------------------------------------------------------------------
  681. * MenuSub
  682. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$SUB_NAME = 'MenuSub';
  683. const [$213e4d2df823067d$var$MenuSubProvider, $213e4d2df823067d$var$useMenuSubContext] = $213e4d2df823067d$var$createMenuContext($213e4d2df823067d$var$SUB_NAME);
  684. const $213e4d2df823067d$export$71bdb9d1e2909932 = (props)=>{
  685. const { __scopeMenu: __scopeMenu , children: children , open: open = false , onOpenChange: onOpenChange } = props;
  686. const parentMenuContext = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$SUB_NAME, __scopeMenu);
  687. const popperScope = $213e4d2df823067d$var$usePopperScope(__scopeMenu);
  688. const [trigger, setTrigger] = $cnSS2$react.useState(null);
  689. const [content, setContent] = $cnSS2$react.useState(null);
  690. const handleOpenChange = $cnSS2$radixuireactusecallbackref.useCallbackRef(onOpenChange); // Prevent the parent menu from reopening with open submenus.
  691. $cnSS2$react.useEffect(()=>{
  692. if (parentMenuContext.open === false) handleOpenChange(false);
  693. return ()=>handleOpenChange(false)
  694. ;
  695. }, [
  696. parentMenuContext.open,
  697. handleOpenChange
  698. ]);
  699. return /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpopper.Root, popperScope, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuProvider, {
  700. scope: __scopeMenu,
  701. open: open,
  702. onOpenChange: handleOpenChange,
  703. content: content,
  704. onContentChange: setContent
  705. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuSubProvider, {
  706. scope: __scopeMenu,
  707. contentId: $cnSS2$radixuireactid.useId(),
  708. triggerId: $cnSS2$radixuireactid.useId(),
  709. trigger: trigger,
  710. onTriggerChange: setTrigger
  711. }, children)));
  712. };
  713. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$71bdb9d1e2909932, {
  714. displayName: $213e4d2df823067d$var$SUB_NAME
  715. });
  716. /* -------------------------------------------------------------------------------------------------
  717. * MenuSubTrigger
  718. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$SUB_TRIGGER_NAME = 'MenuSubTrigger';
  719. const $213e4d2df823067d$export$5fbbb3ba7297405f = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  720. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu);
  721. const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu);
  722. const subContext = $213e4d2df823067d$var$useMenuSubContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu);
  723. const contentContext = $213e4d2df823067d$var$useMenuContentContext($213e4d2df823067d$var$SUB_TRIGGER_NAME, props.__scopeMenu);
  724. const openTimerRef = $cnSS2$react.useRef(null);
  725. const { pointerGraceTimerRef: pointerGraceTimerRef , onPointerGraceIntentChange: onPointerGraceIntentChange } = contentContext;
  726. const scope = {
  727. __scopeMenu: props.__scopeMenu
  728. };
  729. const clearOpenTimer = $cnSS2$react.useCallback(()=>{
  730. if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
  731. openTimerRef.current = null;
  732. }, []);
  733. $cnSS2$react.useEffect(()=>clearOpenTimer
  734. , [
  735. clearOpenTimer
  736. ]);
  737. $cnSS2$react.useEffect(()=>{
  738. const pointerGraceTimer = pointerGraceTimerRef.current;
  739. return ()=>{
  740. window.clearTimeout(pointerGraceTimer);
  741. onPointerGraceIntentChange(null);
  742. };
  743. }, [
  744. pointerGraceTimerRef,
  745. onPointerGraceIntentChange
  746. ]);
  747. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$export$9fa5ebd18bee4d43, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  748. asChild: true
  749. }, scope), /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuItemImpl, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  750. id: subContext.triggerId,
  751. "aria-haspopup": "menu",
  752. "aria-expanded": context.open,
  753. "aria-controls": subContext.contentId,
  754. "data-state": $213e4d2df823067d$var$getOpenState(context.open)
  755. }, props, {
  756. ref: $cnSS2$radixuireactcomposerefs.composeRefs(forwardedRef, subContext.onTriggerChange) // This is redundant for mouse users but we cannot determine pointer type from
  757. ,
  758. onClick: (event)=>{
  759. var _props$onClick;
  760. (_props$onClick = props.onClick) === null || _props$onClick === void 0 || _props$onClick.call(props, event);
  761. if (props.disabled || event.defaultPrevented) return;
  762. /**
  763. * We manually focus because iOS Safari doesn't always focus on click (e.g. buttons)
  764. * and we rely heavily on `onFocusOutside` for submenus to close when switching
  765. * between separate submenus.
  766. */ event.currentTarget.focus();
  767. if (!context.open) context.onOpenChange(true);
  768. },
  769. onPointerMove: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerMove, $213e4d2df823067d$var$whenMouse((event)=>{
  770. contentContext.onItemEnter(event);
  771. if (event.defaultPrevented) return;
  772. if (!props.disabled && !context.open && !openTimerRef.current) {
  773. contentContext.onPointerGraceIntentChange(null);
  774. openTimerRef.current = window.setTimeout(()=>{
  775. context.onOpenChange(true);
  776. clearOpenTimer();
  777. }, 100);
  778. }
  779. })),
  780. onPointerLeave: $cnSS2$radixuiprimitive.composeEventHandlers(props.onPointerLeave, $213e4d2df823067d$var$whenMouse((event)=>{
  781. var _context$content;
  782. clearOpenTimer();
  783. const contentRect = (_context$content = context.content) === null || _context$content === void 0 ? void 0 : _context$content.getBoundingClientRect();
  784. if (contentRect) {
  785. var _context$content2;
  786. // TODO: make sure to update this when we change positioning logic
  787. const side = (_context$content2 = context.content) === null || _context$content2 === void 0 ? void 0 : _context$content2.dataset.side;
  788. const rightSide = side === 'right';
  789. const bleed = rightSide ? -5 : 5;
  790. const contentNearEdge = contentRect[rightSide ? 'left' : 'right'];
  791. const contentFarEdge = contentRect[rightSide ? 'right' : 'left'];
  792. contentContext.onPointerGraceIntentChange({
  793. area: [
  794. // consistently within polygon bounds
  795. {
  796. x: event.clientX + bleed,
  797. y: event.clientY
  798. },
  799. {
  800. x: contentNearEdge,
  801. y: contentRect.top
  802. },
  803. {
  804. x: contentFarEdge,
  805. y: contentRect.top
  806. },
  807. {
  808. x: contentFarEdge,
  809. y: contentRect.bottom
  810. },
  811. {
  812. x: contentNearEdge,
  813. y: contentRect.bottom
  814. }
  815. ],
  816. side: side
  817. });
  818. window.clearTimeout(pointerGraceTimerRef.current);
  819. pointerGraceTimerRef.current = window.setTimeout(()=>contentContext.onPointerGraceIntentChange(null)
  820. , 300);
  821. } else {
  822. contentContext.onTriggerLeave(event);
  823. if (event.defaultPrevented) return; // There's 100ms where the user may leave an item before the submenu was opened.
  824. contentContext.onPointerGraceIntentChange(null);
  825. }
  826. })),
  827. onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onKeyDown, (event)=>{
  828. const isTypingAhead = contentContext.searchRef.current !== '';
  829. if (props.disabled || isTypingAhead && event.key === ' ') return;
  830. if ($213e4d2df823067d$var$SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
  831. var _context$content3;
  832. context.onOpenChange(true); // The trigger may hold focus if opened via pointer interaction
  833. // so we ensure content is given focus again when switching to keyboard.
  834. (_context$content3 = context.content) === null || _context$content3 === void 0 || _context$content3.focus(); // prevent window from scrolling
  835. event.preventDefault();
  836. }
  837. })
  838. })));
  839. });
  840. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$5fbbb3ba7297405f, {
  841. displayName: $213e4d2df823067d$var$SUB_TRIGGER_NAME
  842. });
  843. /* -------------------------------------------------------------------------------------------------
  844. * MenuSubContent
  845. * -----------------------------------------------------------------------------------------------*/ const $213e4d2df823067d$var$SUB_CONTENT_NAME = 'MenuSubContent';
  846. const $213e4d2df823067d$export$e7142ab31822bde6 = /*#__PURE__*/ $cnSS2$react.forwardRef((props, forwardedRef)=>{
  847. const portalContext = $213e4d2df823067d$var$usePortalContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  848. const { forceMount: forceMount = portalContext.forceMount , ...subContentProps } = props;
  849. const context = $213e4d2df823067d$var$useMenuContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  850. const rootContext = $213e4d2df823067d$var$useMenuRootContext($213e4d2df823067d$var$CONTENT_NAME, props.__scopeMenu);
  851. const subContext = $213e4d2df823067d$var$useMenuSubContext($213e4d2df823067d$var$SUB_CONTENT_NAME, props.__scopeMenu);
  852. const ref = $cnSS2$react.useRef(null);
  853. const composedRefs = $cnSS2$radixuireactcomposerefs.useComposedRefs(forwardedRef, ref);
  854. return /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$Collection.Provider, {
  855. scope: props.__scopeMenu
  856. }, /*#__PURE__*/ $cnSS2$react.createElement($cnSS2$radixuireactpresence.Presence, {
  857. present: forceMount || context.open
  858. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$Collection.Slot, {
  859. scope: props.__scopeMenu
  860. }, /*#__PURE__*/ $cnSS2$react.createElement($213e4d2df823067d$var$MenuContentImpl, ($parcel$interopDefault($cnSS2$babelruntimehelpersextends))({
  861. id: subContext.contentId,
  862. "aria-labelledby": subContext.triggerId
  863. }, subContentProps, {
  864. ref: composedRefs,
  865. align: "start",
  866. side: rootContext.dir === 'rtl' ? 'left' : 'right',
  867. disableOutsidePointerEvents: false,
  868. disableOutsideScroll: false,
  869. trapFocus: false,
  870. onOpenAutoFocus: (event)=>{
  871. var _ref$current;
  872. // when opening a submenu, focus content for keyboard users only
  873. if (rootContext.isUsingKeyboardRef.current) (_ref$current = ref.current) === null || _ref$current === void 0 || _ref$current.focus();
  874. event.preventDefault();
  875. } // The menu might close because of focusing another menu item in the parent menu. We
  876. ,
  877. onCloseAutoFocus: (event)=>event.preventDefault()
  878. ,
  879. onFocusOutside: $cnSS2$radixuiprimitive.composeEventHandlers(props.onFocusOutside, (event)=>{
  880. // We prevent closing when the trigger is focused to avoid triggering a re-open animation
  881. // on pointer interaction.
  882. if (event.target !== subContext.trigger) context.onOpenChange(false);
  883. }),
  884. onEscapeKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onEscapeKeyDown, (event)=>{
  885. rootContext.onClose(); // ensure pressing escape in submenu doesn't escape full screen mode
  886. event.preventDefault();
  887. }),
  888. onKeyDown: $cnSS2$radixuiprimitive.composeEventHandlers(props.onKeyDown, (event)=>{
  889. // Submenu key events bubble through portals. We only care about keys in this menu.
  890. const isKeyDownInside = event.currentTarget.contains(event.target);
  891. const isCloseKey = $213e4d2df823067d$var$SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
  892. if (isKeyDownInside && isCloseKey) {
  893. var _subContext$trigger;
  894. context.onOpenChange(false); // We focus manually because we prevented it in `onCloseAutoFocus`
  895. (_subContext$trigger = subContext.trigger) === null || _subContext$trigger === void 0 || _subContext$trigger.focus(); // prevent window from scrolling
  896. event.preventDefault();
  897. }
  898. })
  899. })))));
  900. });
  901. /*#__PURE__*/ Object.assign($213e4d2df823067d$export$e7142ab31822bde6, {
  902. displayName: $213e4d2df823067d$var$SUB_CONTENT_NAME
  903. });
  904. /* -----------------------------------------------------------------------------------------------*/ function $213e4d2df823067d$var$getOpenState(open) {
  905. return open ? 'open' : 'closed';
  906. }
  907. function $213e4d2df823067d$var$isIndeterminate(checked) {
  908. return checked === 'indeterminate';
  909. }
  910. function $213e4d2df823067d$var$getCheckedState(checked) {
  911. return $213e4d2df823067d$var$isIndeterminate(checked) ? 'indeterminate' : checked ? 'checked' : 'unchecked';
  912. }
  913. function $213e4d2df823067d$var$focusFirst(candidates) {
  914. const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
  915. for (const candidate of candidates){
  916. // if focus is already where we want to go, we don't want to keep going through the candidates
  917. if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
  918. candidate.focus();
  919. if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
  920. }
  921. }
  922. /**
  923. * Wraps an array around itself at a given start index
  924. * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`
  925. */ function $213e4d2df823067d$var$wrapArray(array, startIndex) {
  926. return array.map((_, index)=>array[(startIndex + index) % array.length]
  927. );
  928. }
  929. /**
  930. * This is the "meat" of the typeahead matching logic. It takes in all the values,
  931. * the search and the current match, and returns the next match (or `undefined`).
  932. *
  933. * We normalize the search because if a user has repeatedly pressed a character,
  934. * we want the exact same behavior as if we only had that one character
  935. * (ie. cycle through options starting with that character)
  936. *
  937. * We also reorder the values by wrapping the array around the current match.
  938. * This is so we always look forward from the current match, and picking the first
  939. * match will always be the correct one.
  940. *
  941. * Finally, if the normalized search is exactly one character, we exclude the
  942. * current match from the values because otherwise it would be the first to match always
  943. * and focus would never move. This is as opposed to the regular case, where we
  944. * don't want focus to move if the current match still matches.
  945. */ function $213e4d2df823067d$var$getNextMatch(values, search, currentMatch) {
  946. const isRepeated = search.length > 1 && Array.from(search).every((char)=>char === search[0]
  947. );
  948. const normalizedSearch = isRepeated ? search[0] : search;
  949. const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
  950. let wrappedValues = $213e4d2df823067d$var$wrapArray(values, Math.max(currentMatchIndex, 0));
  951. const excludeCurrentMatch = normalizedSearch.length === 1;
  952. if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v)=>v !== currentMatch
  953. );
  954. const nextMatch = wrappedValues.find((value)=>value.toLowerCase().startsWith(normalizedSearch.toLowerCase())
  955. );
  956. return nextMatch !== currentMatch ? nextMatch : undefined;
  957. }
  958. // Determine if a point is inside of a polygon.
  959. // Based on https://github.com/substack/point-in-polygon
  960. function $213e4d2df823067d$var$isPointInPolygon(point, polygon) {
  961. const { x: x , y: y } = point;
  962. let inside = false;
  963. for(let i = 0, j = polygon.length - 1; i < polygon.length; j = i++){
  964. const xi = polygon[i].x;
  965. const yi = polygon[i].y;
  966. const xj = polygon[j].x;
  967. const yj = polygon[j].y; // prettier-ignore
  968. const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
  969. if (intersect) inside = !inside;
  970. }
  971. return inside;
  972. }
  973. function $213e4d2df823067d$var$isPointerInGraceArea(event, area) {
  974. if (!area) return false;
  975. const cursorPos = {
  976. x: event.clientX,
  977. y: event.clientY
  978. };
  979. return $213e4d2df823067d$var$isPointInPolygon(cursorPos, area);
  980. }
  981. function $213e4d2df823067d$var$whenMouse(handler) {
  982. return (event)=>event.pointerType === 'mouse' ? handler(event) : undefined
  983. ;
  984. }
  985. const $213e4d2df823067d$export$be92b6f5f03c0fe9 = $213e4d2df823067d$export$d9b273488cd8ce6f;
  986. const $213e4d2df823067d$export$b688253958b8dfe7 = $213e4d2df823067d$export$9fa5ebd18bee4d43;
  987. const $213e4d2df823067d$export$602eac185826482c = $213e4d2df823067d$export$793392f970497feb;
  988. const $213e4d2df823067d$export$7c6e2c02157bb7d2 = $213e4d2df823067d$export$479f0f2f71193efe;
  989. const $213e4d2df823067d$export$eb2fcfdbd7ba97d4 = $213e4d2df823067d$export$22a631d1f72787bb;
  990. const $213e4d2df823067d$export$b04be29aa201d4f5 = $213e4d2df823067d$export$dd37bec0e8a99143;
  991. const $213e4d2df823067d$export$6d08773d2e66f8f2 = $213e4d2df823067d$export$2ce376c2cc3355c8;
  992. const $213e4d2df823067d$export$16ce288f89fa631c = $213e4d2df823067d$export$f6f243521332502d;
  993. const $213e4d2df823067d$export$a98f0dcb43a68a25 = $213e4d2df823067d$export$ea2200c9eee416b3;
  994. const $213e4d2df823067d$export$371ab307eab489c0 = $213e4d2df823067d$export$69bd225e9817f6d0;
  995. const $213e4d2df823067d$export$c3468e2714d175fa = $213e4d2df823067d$export$a2593e23056970a3;
  996. const $213e4d2df823067d$export$1ff3c3f08ae963c0 = $213e4d2df823067d$export$1cec7dcdd713e220;
  997. const $213e4d2df823067d$export$21b07c8f274aebd5 = $213e4d2df823067d$export$bcdda4773debf5fa;
  998. const $213e4d2df823067d$export$d7a01e11500dfb6f = $213e4d2df823067d$export$71bdb9d1e2909932;
  999. const $213e4d2df823067d$export$2ea8a7a591ac5eac = $213e4d2df823067d$export$5fbbb3ba7297405f;
  1000. const $213e4d2df823067d$export$6d4de93b380beddf = $213e4d2df823067d$export$e7142ab31822bde6;
  1001. //# sourceMappingURL=index.js.map