PageSourceSearch

https://asktori.ai/assets/dropdown-menu-CavHflgj.js

js asktori.ai collected 2026-10-05 11:50:48 UTC 53,853 bytes, 1,284 lines download raw bytes

vendor: 24,585 bytes, lines 1-570
1import { j as jsxRuntimeExports } from "./jsx-runtime-TULtkvNU.js";
2import { c as cn } from "./cn-QXBWQHlM.js";
3import { C as Circle } from "./circle-9empojJz.js";
4import { C as Check } from "./check-Ccg1Qj_f.js";
5import { C as ChevronRight } from "./chevron-right-DkUh7J1o.js";
6import { r as reactExports } from "./chunk-EPOLDU6W-CZGKYP5O.js";
7import { c as createContextScope, P as Presence, b as composeEventHandlers, u as useControllableState } from "./index-Du38QLBy.js";
8import { u as useComposedRefs, c as createSlot, b as composeRefs } from "./index-BY3iWFtl.js";
9import { P as Primitive, d as dispatchDiscreteCustomEvent } from "./index-Dkjh3IBy.js";
10import { c as createCollection, u as useDirection } from "./index-Cpxn6J7_.js";
11import { P as Portal$1, h as hideOthers, u as useFocusGuards, R as ReactRemoveScroll, F as FocusScope, D as DismissableLayer } from "./index-Dem3E75n.js";
12import { a as useCallbackRef, u as useId } from "./index-Df5UIE99.js";
13import { c as createPopperScope, R as Root2$1, A as Anchor, C as Content, a as Arrow } from "./index-ClARao6l.js";
14import { c as createRovingFocusGroupScope, I as Item, R as Root } from "./index-D_FTgCFl.js";
15var SELECTION_KEYS = ["Enter", " "];
16var FIRST_KEYS = ["ArrowDown", "PageUp", "Home"];
17var LAST_KEYS = ["ArrowUp", "PageDown", "End"];
18var FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS];
19var SUB_OPEN_KEYS = {
20  ltr: [...SELECTION_KEYS, "ArrowRight"],
21  rtl: [...SELECTION_KEYS, "ArrowLeft"]
22};
23var SUB_CLOSE_KEYS = {
24  ltr: ["ArrowLeft"],
25  rtl: ["ArrowRight"]
26};
27var MENU_NAME = "Menu";
28var [Collection, useCollection, createCollectionScope] = createCollection(MENU_NAME);
29var [createMenuContext, createMenuScope] = createContextScope(MENU_NAME, [
30  createCollectionScope,
31  createPopperScope,
32  createRovingFocusGroupScope
33]);
34var usePopperScope = createPopperScope();
35var useRovingFocusGroupScope = createRovingFocusGroupScope();
36var [MenuProvider, useMenuContext] = createMenuContext(MENU_NAME);
37var [MenuRootProvider, useMenuRootContext] = createMenuContext(MENU_NAME);
38var Menu = (props) => {
39  const { __scopeMenu, open = false, children, dir, onOpenChange, modal = true } = props;
40  const popperScope = usePopperScope(__scopeMenu);
41  const [content, setContent] = reactExports.useState(null);
42  const isUsingKeyboardRef = reactExports.useRef(false);
43  const handleOpenChange = useCallbackRef(onOpenChange);
44  const direction = useDirection(dir);
45  reactExports.useEffect(() => {
46    const handleKeyDown = () => {
47      isUsingKeyboardRef.current = true;
48      document.addEventListener("pointerdown", handlePointer, { capture: true, once: true });
49      document.addEventListener("pointermove", handlePointer, { capture: true, once: true });
50    };
51    const handlePointer = () => isUsingKeyboardRef.current = false;
52    document.addEventListener("keydown", handleKeyDown, { capture: true });
53    return () => {
54      document.removeEventListener("keydown", handleKeyDown, { capture: true });
55      document.removeEventListener("pointerdown", handlePointer, { capture: true });
56      document.removeEventListener("pointermove", handlePointer, { capture: true });
57    };
58  }, []);
59  return /* @__PURE__ */ jsxRuntimeExports.jsx(Root2$1, { ...popperScope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
60    MenuProvider,
61    {
62      scope: __scopeMenu,
63      open,
64      onOpenChange: handleOpenChange,
65      content,
66      onContentChange: setContent,
67      children: /* @__PURE__ */ jsxRuntimeExports.jsx(
68        MenuRootProvider,
69        {
70          scope: __scopeMenu,
71          onClose: reactExports.useCallback(() => handleOpenChange(false), [handleOpenChange]),
72          isUsingKeyboardRef,
73          dir: direction,
74          modal,
75          children
76        }
77      )
78    }
79  ) });
80};
81Menu.displayName = MENU_NAME;
82var ANCHOR_NAME = "MenuAnchor";
83var MenuAnchor = reactExports.forwardRef(
84  (props, forwardedRef) => {
85    const { __scopeMenu, ...anchorProps } = props;
86    const popperScope = usePopperScope(__scopeMenu);
87    return /* @__PURE__ */ jsxRuntimeExports.jsx(Anchor, { ...popperScope, ...anchorProps, ref: forwardedRef });
88  }
89);
90MenuAnchor.displayName = ANCHOR_NAME;
91var PORTAL_NAME$1 = "MenuPortal";
92var [PortalProvider, usePortalContext] = createMenuContext(PORTAL_NAME$1, {
93  forceMount: void 0
94});
95var MenuPortal = (props) => {
96  const { __scopeMenu, forceMount, children, container } = props;
97  const context = useMenuContext(PORTAL_NAME$1, __scopeMenu);
98  return /* @__PURE__ */ jsxRuntimeExports.jsx(PortalProvider, { scope: __scopeMenu, forceMount, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Portal$1, { asChild: true, container, children }) }) });
99};
100MenuPortal.displayName = PORTAL_NAME$1;
101var CONTENT_NAME$1 = "MenuContent";
102var [MenuContentProvider, useMenuContentContext] = createMenuContext(CONTENT_NAME$1);
103var MenuContent = reactExports.forwardRef(
104  (props, forwardedRef) => {
105    const portalContext = usePortalContext(CONTENT_NAME$1, props.__scopeMenu);
106    const { forceMount = portalContext.forceMount, ...contentProps } = props;
107    const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
108    const rootContext = useMenuRootContext(CONTENT_NAME$1, props.__scopeMenu);
109    return /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Slot, { scope: props.__scopeMenu, children: rootContext.modal ? /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContentModal, { ...contentProps, ref: forwardedRef }) : /* @__PURE__ */ jsxRuntimeExports.jsx(MenuRootContentNonModal, { ...contentProps, ref: forwardedRef }) }) }) });
110  }
111);
112var MenuRootContentModal = reactExports.forwardRef(
113  (props, forwardedRef) => {
114    const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
115    const ref = reactExports.useRef(null);
116    const composedRefs = useComposedRefs(forwardedRef, ref);
117    reactExports.useEffect(() => {
118      const content = ref.current;
119      if (content) return hideOthers(content);
120    }, []);
121    return /* @__PURE__ */ jsxRuntimeExports.jsx(
122      MenuContentImpl,
123      {
124        ...props,
125        ref: composedRefs,
126        trapFocus: context.open,
127        disableOutsidePointerEvents: context.open,
128        disableOutsideScroll: true,
129        onFocusOutside: composeEventHandlers(
130          props.onFocusOutside,
131          (event) => event.preventDefault(),
132          { checkForDefaultPrevented: false }
133        ),
134        onDismiss: () => context.onOpenChange(false)
135      }
136    );
137  }
138);
139var MenuRootContentNonModal = reactExports.forwardRef((props, forwardedRef) => {
140  const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
141  return /* @__PURE__ */ jsxRuntimeExports.jsx(
142    MenuContentImpl,
143    {
144      ...props,
145      ref: forwardedRef,
146      trapFocus: false,
147      disableOutsidePointerEvents: false,
148      disableOutsideScroll: false,
149      onDismiss: () => context.onOpenChange(false)
150    }
151  );
152});
153var Slot = createSlot("MenuContent.ScrollLock");
154var MenuContentImpl = reactExports.forwardRef(
155  (props, forwardedRef) => {
156    const {
157      __scopeMenu,
158      loop = false,
159      trapFocus,
160      onOpenAutoFocus,
161      onCloseAutoFocus,
162      disableOutsidePointerEvents,
163      onEntryFocus,
164      onEscapeKeyDown,
165      onPointerDownOutside,
166      onFocusOutside,
167      onInteractOutside,
168      onDismiss,
169      disableOutsideScroll,
170      ...contentProps
171    } = props;
172    const context = useMenuContext(CONTENT_NAME$1, __scopeMenu);
173    const rootContext = useMenuRootContext(CONTENT_NAME$1, __scopeMenu);
174    const popperScope = usePopperScope(__scopeMenu);
175    const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
176    const getItems = useCollection(__scopeMenu);
177    const [currentItemId, setCurrentItemId] = reactExports.useState(null);
178    const contentRef = reactExports.useRef(null);
179    const composedRefs = useComposedRefs(forwardedRef, contentRef, context.onContentChange);
180    const timerRef = reactExports.useRef(0);
181    const searchRef = reactExports.useRef("");
182    const pointerGraceTimerRef = reactExports.useRef(0);
183    const pointerGraceIntentRef = reactExports.useRef(null);
184    const pointerDirRef = reactExports.useRef("right");
185    const lastPointerXRef = reactExports.useRef(0);
186    const ScrollLockWrapper = disableOutsideScroll ? ReactRemoveScroll : reactExports.Fragment;
187    const scrollLockWrapperProps = disableOutsideScroll ? { as: Slot, allowPinchZoom: true } : void 0;
188    const handleTypeaheadSearch = (key) => {
189      const search = searchRef.current + key;
190      const items = getItems().filter((item) => !item.disabled);
191      const currentItem = document.activeElement;
192      const currentMatch = items.find((item) => item.ref.current === currentItem)?.textValue;
193      const values = items.map((item) => item.textValue);
194      const nextMatch = getNextMatch(values, search, currentMatch);
195      const newItem = items.find((item) => item.textValue === nextMatch)?.ref.current;
196      (function updateSearch(value) {
197        searchRef.current = value;
198        window.clearTimeout(timerRef.current);
199        if (value !== "") timerRef.current = window.setTimeout(() => updateSearch(""), 1e3);
200      })(search);
201      if (newItem) {
202        setTimeout(() => newItem.focus());
203      }
204    };
205    reactExports.useEffect(() => {
206      return () => window.clearTimeout(timerRef.current);
207    }, []);
208    useFocusGuards();
209    const isPointerMovingToSubmenu = reactExports.useCallback((event) => {
210      const isMovingTowards = pointerDirRef.current === pointerGraceIntentRef.current?.side;
211      return isMovingTowards && isPointerInGraceArea(event, pointerGraceIntentRef.current?.area);
212    }, []);
213    return /* @__PURE__ */ jsxRuntimeExports.jsx(
214      MenuContentProvider,
215      {
216        scope: __scopeMenu,
217        searchRef,
218        onItemEnter: reactExports.useCallback(
219          (event) => {
220            if (isPointerMovingToSubmenu(event)) event.preventDefault();
221          },
222          [isPointerMovingToSubmenu]
223        ),
224        onItemLeave: reactExports.useCallback(
225          (event) => {
226            if (isPointerMovingToSubmenu(event)) return;
227            contentRef.current?.focus();
228            setCurrentItemId(null);
229          },
230          [isPointerMovingToSubmenu]
231        ),
232        onTriggerLeave: reactExports.useCallback(
233          (event) => {
234            if (isPointerMovingToSubmenu(event)) event.preventDefault();
235          },
236          [isPointerMovingToSubmenu]
237        ),
238        pointerGraceTimerRef,
239        onPointerGraceIntentChange: reactExports.useCallback((intent) => {
240          pointerGraceIntentRef.current = intent;
241        }, []),
242        children: /* @__PURE__ */ jsxRuntimeExports.jsx(ScrollLockWrapper, { ...scrollLockWrapperProps, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
243          FocusScope,
244          {
245            asChild: true,
246            trapped: trapFocus,
247            onMountAutoFocus: composeEventHandlers(onOpenAutoFocus, (event) => {
248              event.preventDefault();
249              contentRef.current?.focus({ preventScroll: true });
250            }),
251            onUnmountAutoFocus: onCloseAutoFocus,
252            children: /* @__PURE__ */ jsxRuntimeExports.jsx(
253              DismissableLayer,
254              {
255                asChild: true,
256                disableOutsidePointerEvents,
257                onEscapeKeyDown,
258                onPointerDownOutside,
259                onFocusOutside,
260                onInteractOutside,
261                onDismiss,
262                children: /* @__PURE__ */ jsxRuntimeExports.jsx(
263                  Root,
264                  {
265                    asChild: true,
266                    ...rovingFocusGroupScope,
267                    dir: rootContext.dir,
268                    orientation: "vertical",
269                    loop,
270                    currentTabStopId: currentItemId,
271                    onCurrentTabStopIdChange: setCurrentItemId,
272                    onEntryFocus: composeEventHandlers(onEntryFocus, (event) => {
273                      if (!rootContext.isUsingKeyboardRef.current) event.preventDefault();
274                    }),
275                    preventScrollOnEntryFocus: true,
276                    children: /* @__PURE__ */ jsxRuntimeExports.jsx(
277                      Content,
278                      {
279                        role: "menu",
280                        "aria-orientation": "vertical",
281                        "data-state": getOpenState(context.open),
282                        "data-radix-menu-content": "",
283                        dir: rootContext.dir,
284                        ...popperScope,
285                        ...contentProps,
286                        ref: composedRefs,
287                        style: { outline: "none", ...contentProps.style },
288                        onKeyDown: composeEventHandlers(contentProps.onKeyDown, (event) => {
289                          const target = event.target;
290                          const isKeyDownInside = target.closest("[data-radix-menu-content]") === event.currentTarget;
291                          const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;
292                          const isCharacterKey = event.key.length === 1;
293                          if (isKeyDownInside) {
294                            if (event.key === "Tab") event.preventDefault();
295                            if (!isModifierKey && isCharacterKey) handleTypeaheadSearch(event.key);
296                          }
297                          const content = contentRef.current;
298                          if (event.target !== content) return;
299                          if (!FIRST_LAST_KEYS.includes(event.key)) return;
300                          event.preventDefault();
301                          const items = getItems().filter((item) => !item.disabled);
302                          const candidateNodes = items.map((item) => item.ref.current);
303                          if (LAST_KEYS.includes(event.key)) candidateNodes.reverse();
304                          focusFirst(candidateNodes);
305                        }),
306                        onBlur: composeEventHandlers(props.onBlur, (event) => {
307                          if (!event.currentTarget.contains(event.target)) {
308                            window.clearTimeout(timerRef.current);
309                            searchRef.current = "";
310                          }
311                        }),
312                        onPointerMove: composeEventHandlers(
313                          props.onPointerMove,
314                          whenMouse((event) => {
315                            const target = event.target;
316                            const pointerXHasChanged = lastPointerXRef.current !== event.clientX;
317                            if (event.currentTarget.contains(target) && pointerXHasChanged) {
318                              const newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
319                              pointerDirRef.current = newDir;
320                              lastPointerXRef.current = event.clientX;
321                            }
322                          })
323                        )
324                      }
325                    )
326                  }
327                )
328              }
329            )
330          }
331        ) })
332      }
333    );
334  }
335);
336MenuContent.displayName = CONTENT_NAME$1;
337var GROUP_NAME$1 = "MenuGroup";
338var MenuGroup = reactExports.forwardRef(
339  (props, forwardedRef) => {
340    const { __scopeMenu, ...groupProps } = props;
341    return /* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { role: "group", ...groupProps, ref: forwardedRef });
342  }
343);
344MenuGroup.displayName = GROUP_NAME$1;
345var LABEL_NAME$1 = "MenuLabel";
346var MenuLabel = reactExports.forwardRef(
347  (props, forwardedRef) => {
348    const { __scopeMenu, ...labelProps } = props;
349    return /* @__PURE__ */ jsxRuntimeExports.jsx(Primitive.div, { ...labelProps, ref: forwardedRef });
350  }
351);
352MenuLabel.displayName = LABEL_NAME$1;
353var ITEM_NAME$1 = "MenuItem";
354var ITEM_SELECT = "menu.itemSelect";
355var MenuItem = reactExports.forwardRef(
356  (props, forwardedRef) => {
357    const { disabled = false, onSelect, ...itemProps } = props;
358    const ref = reactExports.useRef(null);
359    const rootContext = useMenuRootContext(ITEM_NAME$1, props.__scopeMenu);
360    const contentContext = useMenuContentContext(ITEM_NAME$1, props.__scopeMenu);
361    const composedRefs = useComposedRefs(forwardedRef, ref);
362    const isPointerDownRef = reactExports.useRef(false);
363    const handleSelect = () => {
364      const menuItem = ref.current;
365      if (!disabled && menuItem) {
366        const itemSelectEvent = new CustomEvent(ITEM_SELECT, { bubbles: true, cancelable: true });
367        menuItem.addEventListener(ITEM_SELECT, (event) => onSelect?.(event), { once: true });
368        dispatchDiscreteCustomEvent(menuItem, itemSelectEvent);
369        if (itemSelectEvent.defaultPrevented) {
370          isPointerDownRef.current = false;
371        } else {
372          rootContext.onClose();
373        }
374      }
375    };
376    return /* @__PURE__ */ jsxRuntimeExports.jsx(
377      MenuItemImpl,
378      {
379        ...itemProps,
380        ref: composedRefs,
381        disabled,
382        onClick: composeEventHandlers(props.onClick, handleSelect),
383        onPointerDown: (event) => {
384          props.onPointerDown?.(event);
385          isPointerDownRef.current = true;
386        },
387        onPointerUp: composeEventHandlers(props.onPointerUp, (event) => {
388          if (!isPointerDownRef.current) event.currentTarget?.click();
389        }),
390        onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
391          const isTypingAhead = contentContext.searchRef.current !== "";
392          if (disabled || isTypingAhead && event.key === " ") return;
393          if (SELECTION_KEYS.includes(event.key)) {
394            event.currentTarget.click();
395            event.preventDefault();
396          }
397        })
398      }
399    );
400  }
401);
402MenuItem.displayName = ITEM_NAME$1;
403var MenuItemImpl = reactExports.forwardRef(
404  (props, forwardedRef) => {
405    const { __scopeMenu, disabled = false, textValue, ...itemProps } = props;
406    const contentContext = useMenuContentContext(ITEM_NAME$1, __scopeMenu);
407    const rovingFocusGroupScope = useRovingFocusGroupScope(__scopeMenu);
408    const ref = reactExports.useRef(null);
409    const composedRefs = useComposedRefs(forwardedRef, ref);
410    const [isFocused, setIsFocused] = reactExports.useState(false);
411    const [textContent, setTextContent] = reactExports.useState("");
412    reactExports.useEffect(() => {
413      const menuItem = ref.current;
414      if (menuItem) {
415        setTextContent((menuItem.textContent ?? "").trim());
416      }
417    }, [itemProps.children]);
418    return /* @__PURE__ */ jsxRuntimeExports.jsx(
419      Collection.ItemSlot,
420      {
421        scope: __scopeMenu,
422        disabled,
423        textValue: textValue ?? textContent,
424        children: /* @__PURE__ */ jsxRuntimeExports.jsx(Item, { asChild: true, ...rovingFocusGroupScope, focusable: !disabled, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
425          Primitive.div,
426          {
427            role: "menuitem",
428            "data-highlighted": isFocused ? "" : void 0,
429            "aria-disabled": disabled || void 0,
430            "data-disabled": disabled ? "" : void 0,
431            ...itemProps,
432            ref: composedRefs,
433            onPointerMove: composeEventHandlers(
434              props.onPointerMove,
435              whenMouse((event) => {
436                if (disabled) {
437                  contentContext.onItemLeave(event);
438                } else {
439                  contentContext.onItemEnter(event);
440                  if (!event.defaultPrevented) {
441                    const item = event.currentTarget;
442                    item.focus({ preventScroll: true });
443                  }
444                }
445              })
446            ),
447            onPointerLeave: composeEventHandlers(
448              props.onPointerLeave,
449              whenMouse((event) => contentContext.onItemLeave(event))
450            ),
451            onFocus: composeEventHandlers(props.onFocus, () => setIsFocused(true)),
452            onBlur: composeEventHandlers(props.onBlur, () => setIsFocused(false))
453          }
454        ) })
455      }
456    );
457  }
458);
459var CHECKBOX_ITEM_NAME$1 = "MenuCheckboxItem";
460var MenuCheckboxItem = reactExports.forwardRef(
461  (props, forwardedRef) => {
462    const { checked = false, onCheckedChange, ...checkboxItemProps } = props;
463    return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
464      MenuItem,
465      {
466        role: "menuitemcheckbox",
467        "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
468        ...checkboxItemProps,
469        ref: forwardedRef,
470        "data-state": getCheckedState(checked),
471        onSelect: composeEventHandlers(
472          checkboxItemProps.onSelect,
473          () => onCheckedChange?.(isIndeterminate(checked) ? true : !checked),
474          { checkForDefaultPrevented: false }
475        )
476      }
477    ) });
478  }
479);
480MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME$1;
481var RADIO_GROUP_NAME$1 = "MenuRadioGroup";
482var [RadioGroupProvider, useRadioGroupContext] = createMenuContext(
483  RADIO_GROUP_NAME$1,
484  { value: void 0, onValueChange: () => {
485  } }
486);
487var MenuRadioGroup = reactExports.forwardRef(
488  (props, forwardedRef) => {
489    const { value, onValueChange, ...groupProps } = props;
490    const handleValueChange = useCallbackRef(onValueChange);
491    return /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroupProvider, { scope: props.__scopeMenu, value, onValueChange: handleValueChange, children: /* @__PURE__ */ jsxRuntimeExports.jsx(MenuGroup, { ...groupProps, ref: forwardedRef }) });
492  }
493);
494MenuRadioGroup.displayName = RADIO_GROUP_NAME$1;
495var RADIO_ITEM_NAME$1 = "MenuRadioItem";
496var MenuRadioItem = reactExports.forwardRef(
497  (props, forwardedRef) => {
498    const { value, ...radioItemProps } = props;
499    const context = useRadioGroupContext(RADIO_ITEM_NAME$1, props.__scopeMenu);
500    const checked = value === context.value;
501    return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicatorProvider, { scope: props.__scopeMenu, checked, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
502      MenuItem,
503      {
504        role: "menuitemradio",
505        "aria-checked": checked,
506        ...radioItemProps,
507        ref: forwardedRef,
508        "data-state": getCheckedState(checked),
509        onSelect: composeEventHandlers(
510          radioItemProps.onSelect,
511          () => context.onValueChange?.(value),
512          { checkForDefaultPrevented: false }
513        )
514      }
515    ) });
516  }
517);
518MenuRadioItem.displayName = RADIO_ITEM_NAME$1;
519var ITEM_INDICATOR_NAME = "MenuItemIndicator";
520var [ItemIndicatorProvider, useItemIndicatorContext] = createMenuContext(
521  ITEM_INDICATOR_NAME,
522  { checked: false }
523);
524var MenuItemIndicator = reactExports.forwardRef(
525  (props, forwardedRef) => {
526    const { __scopeMenu, forceMount, ...itemIndicatorProps } = props;
527    const indicatorContext = useItemIndicatorContext(ITEM_INDICATOR_NAME, __scopeMenu);
528    return /* @__PURE__ */ jsxRuntimeExports.jsx(
529      Presence,
530      {
531        present: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === true,
532        children: /* @__PURE__ */ jsxRuntimeExports.jsx(
533          Primitive.span,
534          {
535            ...itemIndicatorProps,
536            ref: forwardedRef,
537            "data-state": getCheckedState(indicatorContext.checked)
538          }
539        )
540      }
541    );
542  }
543);
544MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
545var SEPARATOR_NAME$1 = "MenuSeparator";
546var MenuSeparator = reactExports.forwardRef(
547  (props, forwardedRef) => {
548    const { __scopeMenu, ...separatorProps } = props;
549    return /* @__PURE__ */ jsxRuntimeExports.jsx(
550      Primitive.div,
551      {
552        role: "separator",
553        "aria-orientation": "horizontal",
554        ...separatorProps,
555        ref: forwardedRef
556      }
557    );
558  }
559);
560MenuSeparator.displayName = SEPARATOR_NAME$1;
561var ARROW_NAME$1 = "MenuArrow";
562var MenuArrow = reactExports.forwardRef(
563  (props, forwardedRef) => {
564    const { __scopeMenu, ...arrowProps } = props;
565    const popperScope = usePopperScope(__scopeMenu);
566    return /* @__PURE__ */ jsxRuntimeExports.jsx(Arrow, { ...popperScope, ...arrowProps, ref: forwardedRef });
567  }
568);
569MenuArrow.displayName = ARROW_NAME$1;
570var SUB_NAME = "MenuSub";
vendor: 4,375 bytes, lines 571-671
571var [MenuSubProvider, useMenuSubContext] = createMenuContext(SUB_NAME);
572var MenuSub = (props) => {
573  const { __scopeMenu, children, open = false, onOpenChange } = props;
574  const parentMenuContext = useMenuContext(SUB_NAME, __scopeMenu);
575  const popperScope = usePopperScope(__scopeMenu);
576  const [trigger, setTrigger] = reactExports.useState(null);
577  const [content, setContent] = reactExports.useState(null);
578  const handleOpenChange = useCallbackRef(onOpenChange);
579  reactExports.useEffect(() => {
580    if (parentMenuContext.open === false) handleOpenChange(false);
581    return () => handleOpenChange(false);
582  }, [parentMenuContext.open, handleOpenChange]);
583  return /* @__PURE__ */ jsxRuntimeExports.jsx(Root2$1, { ...popperScope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
584    MenuProvider,
585    {
586      scope: __scopeMenu,
587      open,
588      onOpenChange: handleOpenChange,
589      content,
590      onContentChange: setContent,
591      children: /* @__PURE__ */ jsxRuntimeExports.jsx(
592        MenuSubProvider,
593        {
594          scope: __scopeMenu,
595          contentId: useId(),
596          triggerId: useId(),
597          trigger,
598          onTriggerChange: setTrigger,
599          children
600        }
601      )
602    }
603  ) });
604};
605MenuSub.displayName = SUB_NAME;
606var SUB_TRIGGER_NAME$1 = "MenuSubTrigger";
607var MenuSubTrigger = reactExports.forwardRef(
608  (props, forwardedRef) => {
609    const context = useMenuContext(SUB_TRIGGER_NAME$1, props.__scopeMenu);
610    const rootContext = useMenuRootContext(SUB_TRIGGER_NAME$1, props.__scopeMenu);
611    const subContext = useMenuSubContext(SUB_TRIGGER_NAME$1, props.__scopeMenu);
612    const contentContext = useMenuContentContext(SUB_TRIGGER_NAME$1, props.__scopeMenu);
613    const openTimerRef = reactExports.useRef(null);
614    const { pointerGraceTimerRef, onPointerGraceIntentChange } = contentContext;
615    const scope = { __scopeMenu: props.__scopeMenu };
616    const clearOpenTimer = reactExports.useCallback(() => {
617      if (openTimerRef.current) window.clearTimeout(openTimerRef.current);
618      openTimerRef.current = null;
619    }, []);
620    reactExports.useEffect(() => clearOpenTimer, [clearOpenTimer]);
621    reactExports.useEffect(() => {
622      const pointerGraceTimer = pointerGraceTimerRef.current;
623      return () => {
624        window.clearTimeout(pointerGraceTimer);
625        onPointerGraceIntentChange(null);
626      };
627    }, [pointerGraceTimerRef, onPointerGraceIntentChange]);
628    return /* @__PURE__ */ jsxRuntimeExports.jsx(MenuAnchor, { asChild: true, ...scope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
629      MenuItemImpl,
630      {
631        id: subContext.triggerId,
632        "aria-haspopup": "menu",
633        "aria-expanded": context.open,
634        "aria-controls": subContext.contentId,
635        "data-state": getOpenState(context.open),
636        ...props,
637        ref: composeRefs(forwardedRef, subContext.onTriggerChange),
638        onClick: (event) => {
639          props.onClick?.(event);
640          if (props.disabled || event.defaultPrevented) return;
641          event.currentTarget.focus();
642          if (!context.open) context.onOpenChange(true);
643        },
644        onPointerMove: composeEventHandlers(
645          props.onPointerMove,
646          whenMouse((event) => {
647            contentContext.onItemEnter(event);
648            if (event.defaultPrevented) return;
649            if (!props.disabled && !context.open && !openTimerRef.current) {
650              contentContext.onPointerGraceIntentChange(null);
651              openTimerRef.current = window.setTimeout(() => {
652                context.onOpenChange(true);
653                clearOpenTimer();
654              }, 100);
655            }
656          })
657        ),
658        onPointerLeave: composeEventHandlers(
659          props.onPointerLeave,
660          whenMouse((event) => {
661            clearOpenTimer();
662            const contentRect = context.content?.getBoundingClientRect();
663            if (contentRect) {
664              const side = context.content?.dataset.side;
665              const rightSide = side === "right";
666              const bleed = rightSide ? -5 : 5;
667              const contentNearEdge = contentRect[rightSide ? "left" : "right"];
668              const contentFarEdge = contentRect[rightSide ? "right" : "left"];
669              contentContext.onPointerGraceIntentChange({
670                area: [
671                  // Apply a bleed on clientX to ensure that our exit point is
vendor: 10,335 bytes, lines 672-927
672                  // consistently within polygon bounds
673                  { x: event.clientX + bleed, y: event.clientY },
674                  { x: contentNearEdge, y: contentRect.top },
675                  { x: contentFarEdge, y: contentRect.top },
676                  { x: contentFarEdge, y: contentRect.bottom },
677                  { x: contentNearEdge, y: contentRect.bottom }
678                ],
679                side
680              });
681              window.clearTimeout(pointerGraceTimerRef.current);
682              pointerGraceTimerRef.current = window.setTimeout(
683                () => contentContext.onPointerGraceIntentChange(null),
684                300
685              );
686            } else {
687              contentContext.onTriggerLeave(event);
688              if (event.defaultPrevented) return;
689              contentContext.onPointerGraceIntentChange(null);
690            }
691          })
692        ),
693        onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
694          const isTypingAhead = contentContext.searchRef.current !== "";
695          if (props.disabled || isTypingAhead && event.key === " ") return;
696          if (SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
697            context.onOpenChange(true);
698            context.content?.focus();
699            event.preventDefault();
700          }
701        })
702      }
703    ) });
704  }
705);
706MenuSubTrigger.displayName = SUB_TRIGGER_NAME$1;
707var SUB_CONTENT_NAME$1 = "MenuSubContent";
708var MenuSubContent = reactExports.forwardRef(
709  (props, forwardedRef) => {
710    const portalContext = usePortalContext(CONTENT_NAME$1, props.__scopeMenu);
711    const { forceMount = portalContext.forceMount, ...subContentProps } = props;
712    const context = useMenuContext(CONTENT_NAME$1, props.__scopeMenu);
713    const rootContext = useMenuRootContext(CONTENT_NAME$1, props.__scopeMenu);
714    const subContext = useMenuSubContext(SUB_CONTENT_NAME$1, props.__scopeMenu);
715    const ref = reactExports.useRef(null);
716    const composedRefs = useComposedRefs(forwardedRef, ref);
717    return /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Provider, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Presence, { present: forceMount || context.open, children: /* @__PURE__ */ jsxRuntimeExports.jsx(Collection.Slot, { scope: props.__scopeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
718      MenuContentImpl,
719      {
720        id: subContext.contentId,
721        "aria-labelledby": subContext.triggerId,
722        ...subContentProps,
723        ref: composedRefs,
724        align: "start",
725        side: rootContext.dir === "rtl" ? "left" : "right",
726        disableOutsidePointerEvents: false,
727        disableOutsideScroll: false,
728        trapFocus: false,
729        onOpenAutoFocus: (event) => {
730          if (rootContext.isUsingKeyboardRef.current) ref.current?.focus();
731          event.preventDefault();
732        },
733        onCloseAutoFocus: (event) => event.preventDefault(),
734        onFocusOutside: composeEventHandlers(props.onFocusOutside, (event) => {
735          if (event.target !== subContext.trigger) context.onOpenChange(false);
736        }),
737        onEscapeKeyDown: composeEventHandlers(props.onEscapeKeyDown, (event) => {
738          rootContext.onClose();
739          event.preventDefault();
740        }),
741        onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
742          const isKeyDownInside = event.currentTarget.contains(event.target);
743          const isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
744          if (isKeyDownInside && isCloseKey) {
745            context.onOpenChange(false);
746            subContext.trigger?.focus();
747            event.preventDefault();
748          }
749        })
750      }
751    ) }) }) });
752  }
753);
754MenuSubContent.displayName = SUB_CONTENT_NAME$1;
755function getOpenState(open) {
756  return open ? "open" : "closed";
757}
758function isIndeterminate(checked) {
759  return checked === "indeterminate";
760}
761function getCheckedState(checked) {
762  return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
763}
764function focusFirst(candidates) {
765  const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;
766  for (const candidate of candidates) {
767    if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;
768    candidate.focus();
769    if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;
770  }
771}
772function wrapArray(array, startIndex) {
773  return array.map((_, index) => array[(startIndex + index) % array.length]);
774}
775function getNextMatch(values, search, currentMatch) {
776  const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);
777  const normalizedSearch = isRepeated ? search[0] : search;
778  const currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1;
779  let wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0));
780  const excludeCurrentMatch = normalizedSearch.length === 1;
781  if (excludeCurrentMatch) wrappedValues = wrappedValues.filter((v) => v !== currentMatch);
782  const nextMatch = wrappedValues.find(
783    (value) => value.toLowerCase().startsWith(normalizedSearch.toLowerCase())
784  );
785  return nextMatch !== currentMatch ? nextMatch : void 0;
786}
787function isPointInPolygon(point, polygon) {
788  const { x, y } = point;
789  let inside = false;
790  for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
791    const ii = polygon[i];
792    const jj = polygon[j];
793    const xi = ii.x;
794    const yi = ii.y;
795    const xj = jj.x;
796    const yj = jj.y;
797    const intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
798    if (intersect) inside = !inside;
799  }
800  return inside;
801}
802function isPointerInGraceArea(event, area) {
803  if (!area) return false;
804  const cursorPos = { x: event.clientX, y: event.clientY };
805  return isPointInPolygon(cursorPos, area);
806}
807function whenMouse(handler) {
808  return (event) => event.pointerType === "mouse" ? handler(event) : void 0;
809}
810var Root3 = Menu;
811var Anchor2 = MenuAnchor;
812var Portal = MenuPortal;
813var Content2$1 = MenuContent;
814var Group = MenuGroup;
815var Label = MenuLabel;
816var Item2$1 = MenuItem;
817var CheckboxItem = MenuCheckboxItem;
818var RadioGroup = MenuRadioGroup;
819var RadioItem = MenuRadioItem;
820var ItemIndicator = MenuItemIndicator;
821var Separator = MenuSeparator;
822var Arrow2 = MenuArrow;
823var Sub = MenuSub;
824var SubTrigger = MenuSubTrigger;
825var SubContent = MenuSubContent;
826var DROPDOWN_MENU_NAME = "DropdownMenu";
827var [createDropdownMenuContext] = createContextScope(
828  DROPDOWN_MENU_NAME,
829  [createMenuScope]
830);
831var useMenuScope = createMenuScope();
832var [DropdownMenuProvider, useDropdownMenuContext] = createDropdownMenuContext(DROPDOWN_MENU_NAME);
833var DropdownMenu$1 = (props) => {
834  const {
835    __scopeDropdownMenu,
836    children,
837    dir,
838    open: openProp,
839    defaultOpen,
840    onOpenChange,
841    modal = true
842  } = props;
843  const menuScope = useMenuScope(__scopeDropdownMenu);
844  const triggerRef = reactExports.useRef(null);
845  const [open, setOpen] = useControllableState({
846    prop: openProp,
847    defaultProp: defaultOpen ?? false,
848    onChange: onOpenChange,
849    caller: DROPDOWN_MENU_NAME
850  });
851  return /* @__PURE__ */ jsxRuntimeExports.jsx(
852    DropdownMenuProvider,
853    {
854      scope: __scopeDropdownMenu,
855      triggerId: useId(),
856      triggerRef,
857      contentId: useId(),
858      open,
859      onOpenChange: setOpen,
860      onOpenToggle: reactExports.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen]),
861      modal,
862      children: /* @__PURE__ */ jsxRuntimeExports.jsx(Root3, { ...menuScope, open, onOpenChange: setOpen, dir, modal, children })
863    }
864  );
865};
866DropdownMenu$1.displayName = DROPDOWN_MENU_NAME;
867var TRIGGER_NAME = "DropdownMenuTrigger";
868var DropdownMenuTrigger$1 = reactExports.forwardRef(
869  (props, forwardedRef) => {
870    const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;
871    const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);
872    const menuScope = useMenuScope(__scopeDropdownMenu);
873    return /* @__PURE__ */ jsxRuntimeExports.jsx(Anchor2, { asChild: true, ...menuScope, children: /* @__PURE__ */ jsxRuntimeExports.jsx(
874      Primitive.button,
875      {
876        type: "button",
877        id: context.triggerId,
878        "aria-haspopup": "menu",
879        "aria-expanded": context.open,
880        "aria-controls": context.open ? context.contentId : void 0,
881        "data-state": context.open ? "open" : "closed",
882        "data-disabled": disabled ? "" : void 0,
883        disabled,
884        ...triggerProps,
885        ref: composeRefs(forwardedRef, context.triggerRef),
886        onPointerDown: composeEventHandlers(props.onPointerDown, (event) => {
887          if (!disabled && event.button === 0 && event.ctrlKey === false) {
888            context.onOpenToggle();
889            if (!context.open) event.preventDefault();
890          }
891        }),
892        onKeyDown: composeEventHandlers(props.onKeyDown, (event) => {
893          if (disabled) return;
894          if (["Enter", " "].includes(event.key)) context.onOpenToggle();
895          if (event.key === "ArrowDown") context.onOpenChange(true);
896          if (["Enter", " ", "ArrowDown"].includes(event.key)) event.preventDefault();
897        })
898      }
899    ) });
900  }
901);
902DropdownMenuTrigger$1.displayName = TRIGGER_NAME;
903var PORTAL_NAME = "DropdownMenuPortal";
904var DropdownMenuPortal = (props) => {
905  const { __scopeDropdownMenu, ...portalProps } = props;
906  const menuScope = useMenuScope(__scopeDropdownMenu);
907  return /* @__PURE__ */ jsxRuntimeExports.jsx(Portal, { ...menuScope, ...portalProps });
908};
909DropdownMenuPortal.displayName = PORTAL_NAME;
910var CONTENT_NAME = "DropdownMenuContent";
911var DropdownMenuContent$1 = reactExports.forwardRef(
912  (props, forwardedRef) => {
913    const { __scopeDropdownMenu, ...contentProps } = props;
914    const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);
915    const menuScope = useMenuScope(__scopeDropdownMenu);
916    const hasInteractedOutsideRef = reactExports.useRef(false);
917    return /* @__PURE__ */ jsxRuntimeExports.jsx(
918      Content2$1,
919      {
920        id: context.contentId,
921        "aria-labelledby": context.triggerId,
922        ...menuScope,
923        ...contentProps,
924        ref: forwardedRef,
925        onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, (event) => {
926          if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();
927          hasInteractedOutsideRef.current = false;
928          event.preventDefault();
929        }),
930        onInteractOutside: composeEventHandlers(props.onInteractOutside, (event) => {
931          const originalEvent = event.detail.originalEvent;
932          const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
933          const isRightClick = originalEvent.button === 2 || ctrlLeftClick;
934          if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;
935        }),
936        style: {
937          ...props.style,
938          // re-namespace exposed content custom properties
939          ...{
940            "--radix-dropdown-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
941            "--radix-dropdown-menu-content-available-width": "var(--radix-popper-available-width)",
942            "--radix-dropdown-menu-content-available-height": "var(--radix-popper-available-height)",
943            "--radix-dropdown-menu-trigger-width": "var(--radix-popper-anchor-width)",
944            "--radix-dropdown-menu-trigger-height": "var(--radix-popper-anchor-height)"
945          }
946        }
947      }
948    );
949  }
950);
951DropdownMenuContent$1.displayName = CONTENT_NAME;
952var GROUP_NAME = "DropdownMenuGroup";
953var DropdownMenuGroup$1 = reactExports.forwardRef(
954  (props, forwardedRef) => {
955    const { __scopeDropdownMenu, ...groupProps } = props;
956    const menuScope = useMenuScope(__scopeDropdownMenu);
957    return /* @__PURE__ */ jsxRuntimeExports.jsx(Group, { ...menuScope, ...groupProps, ref: forwardedRef });
958  }
959);
960DropdownMenuGroup$1.displayName = GROUP_NAME;
961var LABEL_NAME = "DropdownMenuLabel";
962var DropdownMenuLabel$1 = reactExports.forwardRef(
963  (props, forwardedRef) => {
964    const { __scopeDropdownMenu, ...labelProps } = props;
965    const menuScope = useMenuScope(__scopeDropdownMenu);
966    return /* @__PURE__ */ jsxRuntimeExports.jsx(Label, { ...menuScope, ...labelProps, ref: forwardedRef });
967  }
968);
969DropdownMenuLabel$1.displayName = LABEL_NAME;
970var ITEM_NAME = "DropdownMenuItem";
971var DropdownMenuItem$1 = reactExports.forwardRef(
972  (props, forwardedRef) => {
973    const { __scopeDropdownMenu, ...itemProps } = props;
974    const menuScope = useMenuScope(__scopeDropdownMenu);
975    return /* @__PURE__ */ jsxRuntimeExports.jsx(Item2$1, { ...menuScope, ...itemProps, ref: forwardedRef });
976  }
977);
978DropdownMenuItem$1.displayName = ITEM_NAME;
979var CHECKBOX_ITEM_NAME = "DropdownMenuCheckboxItem";
980var DropdownMenuCheckboxItem$1 = reactExports.forwardRef((props, forwardedRef) => {
981  const { __scopeDropdownMenu, ...checkboxItemProps } = props;
982  const menuScope = useMenuScope(__scopeDropdownMenu);
983  return /* @__PURE__ */ jsxRuntimeExports.jsx(CheckboxItem, { ...menuScope, ...checkboxItemProps, ref: forwardedRef });
984});
985DropdownMenuCheckboxItem$1.displayName = CHECKBOX_ITEM_NAME;
986var RADIO_GROUP_NAME = "DropdownMenuRadioGroup";
987var DropdownMenuRadioGroup$1 = reactExports.forwardRef((props, forwardedRef) => {
988  const { __scopeDropdownMenu, ...radioGroupProps } = props;
989  const menuScope = useMenuScope(__scopeDropdownMenu);
990  return /* @__PURE__ */ jsxRuntimeExports.jsx(RadioGroup, { ...menuScope, ...radioGroupProps, ref: forwardedRef });
991});
992DropdownMenuRadioGroup$1.displayName = RADIO_GROUP_NAME;
993var RADIO_ITEM_NAME = "DropdownMenuRadioItem";
994var DropdownMenuRadioItem$1 = reactExports.forwardRef((props, forwardedRef) => {
995  const { __scopeDropdownMenu, ...radioItemProps } = props;
996  const menuScope = useMenuScope(__scopeDropdownMenu);
997  return /* @__PURE__ */ jsxRuntimeExports.jsx(RadioItem, { ...menuScope, ...radioItemProps, ref: forwardedRef });
998});
999DropdownMenuRadioItem$1.displayName = RADIO_ITEM_NAME;
1000var INDICATOR_NAME = "DropdownMenuItemIndicator";
1001var DropdownMenuItemIndicator = reactExports.forwardRef((props, forwardedRef) => {
1002  const { __scopeDropdownMenu, ...itemIndicatorProps } = props;
1003  const menuScope = useMenuScope(__scopeDropdownMenu);
1004  return /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicator, { ...menuScope, ...itemIndicatorProps, ref: forwardedRef });
1005});
1006DropdownMenuItemIndicator.displayName = INDICATOR_NAME;
1007var SEPARATOR_NAME = "DropdownMenuSeparator";
1008var DropdownMenuSeparator$1 = reactExports.forwardRef((props, forwardedRef) => {
1009  const { __scopeDropdownMenu, ...separatorProps } = props;
1010  const menuScope = useMenuScope(__scopeDropdownMenu);
1011  return /* @__PURE__ */ jsxRuntimeExports.jsx(Separator, { ...menuScope, ...separatorProps, ref: forwardedRef });
1012});
1013DropdownMenuSeparator$1.displayName = SEPARATOR_NAME;
1014var ARROW_NAME = "DropdownMenuArrow";
1015var DropdownMenuArrow = reactExports.forwardRef(
1016  (props, forwardedRef) => {
1017    const { __scopeDropdownMenu, ...arrowProps } = props;
1018    const menuScope = useMenuScope(__scopeDropdownMenu);
1019    return /* @__PURE__ */ jsxRuntimeExports.jsx(Arrow2, { ...menuScope, ...arrowProps, ref: forwardedRef });
1020  }
1021);
1022DropdownMenuArrow.displayName = ARROW_NAME;
1023var DropdownMenuSub$1 = (props) => {
1024  const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;
1025  const menuScope = useMenuScope(__scopeDropdownMenu);
1026  const [open, setOpen] = useControllableState({
1027    prop: openProp,
1028    defaultProp: defaultOpen ?? false,
1029    onChange: onOpenChange,
1030    caller: "DropdownMenuSub"
1031  });
1032  return /* @__PURE__ */ jsxRuntimeExports.jsx(Sub, { ...menuScope, open, onOpenChange: setOpen, children });
1033};
1034var SUB_TRIGGER_NAME = "DropdownMenuSubTrigger";
1035var DropdownMenuSubTrigger$1 = reactExports.forwardRef((props, forwardedRef) => {
1036  const { __scopeDropdownMenu, ...subTriggerProps } = props;
1037  const menuScope = useMenuScope(__scopeDropdownMenu);
1038  return /* @__PURE__ */ jsxRuntimeExports.jsx(SubTrigger, { ...menuScope, ...subTriggerProps, ref: forwardedRef });
1039});
1040DropdownMenuSubTrigger$1.displayName = SUB_TRIGGER_NAME;
1041var SUB_CONTENT_NAME = "DropdownMenuSubContent";
1042var DropdownMenuSubContent$1 = reactExports.forwardRef((props, forwardedRef) => {
1043  const { __scopeDropdownMenu, ...subContentProps } = props;
1044  const menuScope = useMenuScope(__scopeDropdownMenu);
1045  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1046    SubContent,
1047    {
1048      ...menuScope,
1049      ...subContentProps,
1050      ref: forwardedRef,
1051      style: {
1052        ...props.style,
1053        // re-namespace exposed content custom properties
1054        ...{
1055          "--radix-dropdown-menu-content-transform-origin": "var(--radix-popper-transform-origin)",
1056          "--radix-dropdown-menu-content-available-width": "var(--radix-popper-available-width)",
1057          "--radix-dropdown-menu-content-available-height": "var(--radix-popper-available-height)",
1058          "--radix-dropdown-menu-trigger-width": "var(--radix-popper-anchor-width)",
1059          "--radix-dropdown-menu-trigger-height": "var(--radix-popper-anchor-height)"
1060        }
1061      }
1062    }
1063  );
1064});
1065DropdownMenuSubContent$1.displayName = SUB_CONTENT_NAME;
1066var Root2 = DropdownMenu$1;
1067var Trigger = DropdownMenuTrigger$1;
1068var Portal2 = DropdownMenuPortal;
1069var Content2 = DropdownMenuContent$1;
1070var Group2 = DropdownMenuGroup$1;
1071var Label2 = DropdownMenuLabel$1;
1072var Item2 = DropdownMenuItem$1;
1073var CheckboxItem2 = DropdownMenuCheckboxItem$1;
1074var RadioGroup2 = DropdownMenuRadioGroup$1;
1075var RadioItem2 = DropdownMenuRadioItem$1;
1076var ItemIndicator2 = DropdownMenuItemIndicator;
1077var Separator2 = DropdownMenuSeparator$1;
1078var Sub2 = DropdownMenuSub$1;
1079var SubTrigger2 = DropdownMenuSubTrigger$1;
1080var SubContent2 = DropdownMenuSubContent$1;
1081function DropdownMenu({
1082  ...props
1083}) {
1084  return /* @__PURE__ */ jsxRuntimeExports.jsx(Root2, { "data-slot": "dropdown-menu", ...props });
1085}
1086function DropdownMenuTrigger({
1087  ...props
1088}) {
1089  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1090    Trigger,
1091    {
1092      "data-slot": "dropdown-menu-trigger",
1093      ...props
1094    }
1095  );
1096}
1097function DropdownMenuContent({
1098  className,
1099  sideOffset = 4,
1100  ...props
1101}) {
1102  return /* @__PURE__ */ jsxRuntimeExports.jsx(Portal2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(
1103    Content2,
1104    {
1105      "data-slot": "dropdown-menu-content",
1106      sideOffset,
1107      className: cn(
1108        "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:sli
1108de-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
1109        className
1110      ),
1111      ...props
1112    }
1113  ) });
1114}
1115function DropdownMenuGroup({
1116  ...props
1117}) {
1118  return /* @__PURE__ */ jsxRuntimeExports.jsx(Group2, { "data-slot": "dropdown-menu-group", ...props });
1119}
1120function DropdownMenuItem({
1121  className,
1122  inset,
1123  variant = "default",
1124  ...props
1125}) {
1126  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1127    Item2,
1128    {
1129      "data-slot": "dropdown-menu-item",
1130      "data-inset": inset,
1131      "data-variant": variant,
1132      className: cn(
1133        "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1134        className
1135      ),
1136      ...props
1137    }
1138  );
1139}
1140function DropdownMenuCheckboxItem({
1141  className,
1142  children,
1143  checked,
1144  ...props
1145}) {
1146  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
1147    CheckboxItem2,
1148    {
1149      "data-slot": "dropdown-menu-checkbox-item",
1150      className: cn(
1151        "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1152        className
1153      ),
1154      checked,
1155      ...props,
1156      children: [
1157        /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicator2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Check, { className: "size-4" }) }) }),
1158        children
1159      ]
1160    }
1161  );
1162}
1163function DropdownMenuRadioGroup({
1164  ...props
1165}) {
1166  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1167    RadioGroup2,
1168    {
1169      "data-slot": "dropdown-menu-radio-group",
1170      ...props
1171    }
1172  );
1173}
1174function DropdownMenuRadioItem({
1175  className,
1176  children,
1177  ...props
1178}) {
1179  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
1180    RadioItem2,
1181    {
1182      "data-slot": "dropdown-menu-radio-item",
1183      className: cn(
1184        "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1185        className
1186      ),
1187      ...props,
1188      children: [
1189        /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "pointer-events-none absolute left-2 flex size-3.5 items-center justify-center", children: /* @__PURE__ */ jsxRuntimeExports.jsx(ItemIndicator2, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Circle, { className: "size-2 fill-current" }) }) }),
1190        children
1191      ]
1192    }
1193  );
1194}
1195function DropdownMenuLabel({
1196  className,
1197  inset,
1198  ...props
1199}) {
1200  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1201    Label2,
1202    {
1203      "data-slot": "dropdown-menu-label",
1204      "data-inset": inset,
1205      className: cn(
1206        "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
1207        className
1208      ),
1209      ...props
1210    }
1211  );
1212}
1213function DropdownMenuSeparator({
1214  className,
1215  ...props
1216}) {
1217  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1218    Separator2,
1219    {
1220      "data-slot": "dropdown-menu-separator",
1221      className: cn("bg-border -mx-1 my-1 h-px", className),
1222      ...props
1223    }
1224  );
1225}
1226function DropdownMenuSub({
1227  ...props
1228}) {
1229  return /* @__PURE__ */ jsxRuntimeExports.jsx(Sub2, { "data-slot": "dropdown-menu-sub", ...props });
1230}
1231function DropdownMenuSubTrigger({
1232  className,
1233  inset,
1234  children,
1235  ...props
1236}) {
1237  return /* @__PURE__ */ jsxRuntimeExports.jsxs(
1238    SubTrigger2,
1239    {
1240      "data-slot": "dropdown-menu-sub-trigger",
1241      "data-inset": inset,
1242      className: cn(
1243        "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
1244        className
1245      ),
1246      ...props,
1247      children: [
1248        children,
1249        /* @__PURE__ */ jsxRuntimeExports.jsx(ChevronRight, { className: "ml-auto size-4" })
1250      ]
1251    }
1252  );
1253}
1254function DropdownMenuSubContent({
1255  className,
1256  ...props
1257}) {
1258  return /* @__PURE__ */ jsxRuntimeExports.jsx(
1259    SubContent2,
1260    {
1261      "data-slot": "dropdown-menu-sub-content",
1262      className: cn(
1263        "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
1264        className
1265      ),
1266      ...props
1267    }
1268  );
1269}
1270export {
1271  DropdownMenu as D,
1272  DropdownMenuTrigger as a,
1273  DropdownMenuContent as b,
1274  DropdownMenuGroup as c,
1275  DropdownMenuLabel as d,
1276  DropdownMenuItem as e,
1277  DropdownMenuSub as f,
1278  DropdownMenuSubTrigger as g,
1279  DropdownMenuSubContent as h,
1280  DropdownMenuSeparator as i,
1281  DropdownMenuRadioGroup as j,
1282  DropdownMenuRadioItem as k,
1283  DropdownMenuCheckboxItem as l
1284};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.