UNPKG

@loke/ui

Version:
2 lines (1 loc) 28.2 kB
var __create=Object.create;var{getPrototypeOf:__getProtoOf,defineProperty:__defProp,getOwnPropertyNames:__getOwnPropNames,getOwnPropertyDescriptor:__getOwnPropDesc}=Object,__hasOwnProp=Object.prototype.hasOwnProperty;function __accessProp(key){return this[key]}var __toESMCache_node,__toESMCache_esm,__toESM=(mod,isNodeMode,target)=>{var canCache=mod!=null&&typeof mod==="object";if(canCache){var cache=isNodeMode?__toESMCache_node??=new WeakMap:__toESMCache_esm??=new WeakMap,cached=cache.get(mod);if(cached)return cached}target=mod!=null?__create(__getProtoOf(mod)):{};let to=isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target;for(let key of __getOwnPropNames(mod))if(!__hasOwnProp.call(to,key))__defProp(to,key,{get:__accessProp.bind(mod,key),enumerable:!0});if(canCache)cache.set(mod,to);return to},__toCommonJS=(from)=>{var entry=(__moduleCache??=new WeakMap).get(from),desc;if(entry)return entry;if(entry=__defProp({},"__esModule",{value:!0}),from&&typeof from==="object"||typeof from==="function"){for(var key of __getOwnPropNames(from))if(!__hasOwnProp.call(entry,key))__defProp(entry,key,{get:__accessProp.bind(from,key),enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return __moduleCache.set(from,entry),entry},__moduleCache;var __returnValue=(v)=>v;function __exportSetter(name,newValue){this[name]=__returnValue.bind(null,newValue)}var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0,configurable:!0,set:__exportSetter.bind(all,name)})};var exports_menu={};__export(exports_menu,{createMenuScope:()=>createMenuScope,SubTrigger:()=>SubTrigger,SubContent:()=>SubContent,Sub:()=>Sub,Separator:()=>Separator,Root:()=>Root3,RadioItem:()=>RadioItem,RadioGroup:()=>RadioGroup,Portal:()=>Portal,MenuSubTrigger:()=>MenuSubTrigger,MenuSubContent:()=>MenuSubContent,MenuSub:()=>MenuSub,MenuSeparator:()=>MenuSeparator,MenuRadioItem:()=>MenuRadioItem,MenuRadioGroup:()=>MenuRadioGroup,MenuPortal:()=>MenuPortal,MenuLabel:()=>MenuLabel,MenuItemIndicator:()=>MenuItemIndicator,MenuItem:()=>MenuItem,MenuGroup:()=>MenuGroup,MenuContent:()=>MenuContent,MenuCheckboxItem:()=>MenuCheckboxItem,MenuArrow:()=>MenuArrow,MenuAnchor:()=>MenuAnchor,Menu:()=>Menu,Label:()=>Label,ItemIndicator:()=>ItemIndicator,Item:()=>Item2,Group:()=>Group,Content:()=>Content2,CheckboxItem:()=>CheckboxItem,Arrow:()=>Arrow2,Anchor:()=>Anchor2});module.exports=__toCommonJS(exports_menu);var import_collection=require("@loke/ui/collection"),import_compose_events=require("@loke/ui/compose-events"),import_compose_refs=require("@loke/ui/compose-refs"),import_context=require("@loke/ui/context"),import_dismissable_layer=require("@loke/ui/dismissable-layer"),import_focus_guards=require("@loke/ui/focus-guards"),import_focus_scope=require("@loke/ui/focus-scope"),PopperPrimitive=__toESM(require("@loke/ui/popper")),import_popper=require("@loke/ui/popper"),import_portal=require("@loke/ui/portal"),import_presence=require("@loke/ui/presence"),import_primitive=require("@loke/ui/primitive"),RovingFocusGroup=__toESM(require("@loke/ui/roving-focus")),import_roving_focus=require("@loke/ui/roving-focus"),import_slot=require("@loke/ui/slot"),import_use_callback_ref=require("@loke/ui/use-callback-ref"),import_use_direction=require("@loke/ui/use-direction"),import_use_id=require("@loke/ui/use-id"),import_aria_hidden=require("aria-hidden"),import_react=require("react"),import_jsx_runtime=require("react/jsx-runtime"),import_react_remove_scroll=require("react-remove-scroll"),jsx_runtime=require("react/jsx-runtime"),SELECTION_KEYS=["Enter"," "],FIRST_KEYS=["ArrowDown","PageUp","Home"],LAST_KEYS=["ArrowUp","PageDown","End"],FIRST_LAST_KEYS=[...FIRST_KEYS,...LAST_KEYS],SUB_OPEN_KEYS={ltr:[...SELECTION_KEYS,"ArrowRight"],rtl:[...SELECTION_KEYS,"ArrowLeft"]},SUB_CLOSE_KEYS={ltr:["ArrowLeft"],rtl:["ArrowRight"]},MENU_NAME="Menu",[Collection,useCollection,createCollectionScope]=import_collection.createCollection(MENU_NAME),[createMenuContext,createMenuScope]=import_context.createContextScope(MENU_NAME,[createCollectionScope,import_popper.createPopperScope,import_roving_focus.createRovingFocusGroupScope]),usePopperScope=import_popper.createPopperScope(),useRovingFocusGroupScope=import_roving_focus.createRovingFocusGroupScope(),[MenuProvider,useMenuContext]=createMenuContext(MENU_NAME),[MenuRootProvider,useMenuRootContext]=createMenuContext(MENU_NAME),Menu=(props)=>{let{__scopeMenu,open=!1,children,dir,onOpenChange,modal=!0}=props,popperScope=usePopperScope(__scopeMenu),[content,setContent]=import_react.useState(null),isUsingKeyboardRef=import_react.useRef(!1),handleOpenChange=import_use_callback_ref.useCallbackRef(onOpenChange),direction=import_use_direction.useDirection(dir);return import_react.useEffect(()=>{let handleKeyDown=()=>{isUsingKeyboardRef.current=!0,document.addEventListener("pointerdown",handlePointer,{capture:!0,once:!0}),document.addEventListener("pointermove",handlePointer,{capture:!0,once:!0})},handlePointer=()=>isUsingKeyboardRef.current=!1;return document.addEventListener("keydown",handleKeyDown,{capture:!0}),()=>{document.removeEventListener("keydown",handleKeyDown,{capture:!0}),document.removeEventListener("pointerdown",handlePointer,{capture:!0}),document.removeEventListener("pointermove",handlePointer,{capture:!0})}},[]),jsx_runtime.jsx(PopperPrimitive.Root,{...popperScope,children:jsx_runtime.jsx(MenuProvider,{content,onContentChange:setContent,onOpenChange:handleOpenChange,open,scope:__scopeMenu,children:jsx_runtime.jsx(MenuRootProvider,{dir:direction,isUsingKeyboardRef,modal,onClose:import_react.useCallback(()=>handleOpenChange(!1),[handleOpenChange]),scope:__scopeMenu,children})})})};Menu.displayName=MENU_NAME;var ANCHOR_NAME="MenuAnchor",MenuAnchor=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,...anchorProps}=props,popperScope=usePopperScope(__scopeMenu);return jsx_runtime.jsx(PopperPrimitive.Anchor,{...popperScope,...anchorProps,ref:forwardedRef})});MenuAnchor.displayName=ANCHOR_NAME;var PORTAL_NAME="MenuPortal",[PortalProvider,usePortalContext]=createMenuContext(PORTAL_NAME,{forceMount:void 0}),MenuPortal=(props)=>{let{__scopeMenu,forceMount,children,container}=props,context=useMenuContext(PORTAL_NAME,__scopeMenu);return jsx_runtime.jsx(PortalProvider,{forceMount,scope:__scopeMenu,children:jsx_runtime.jsx(import_presence.Presence,{present:forceMount||context.open,children:jsx_runtime.jsx(import_portal.Portal,{asChild:!0,container,children})})})};MenuPortal.displayName=PORTAL_NAME;var CONTENT_NAME="MenuContent",[MenuContentProvider,useMenuContentContext]=createMenuContext(CONTENT_NAME),MenuContent=import_react.forwardRef((props,forwardedRef)=>{let portalContext=usePortalContext(CONTENT_NAME,props.__scopeMenu),{forceMount=portalContext.forceMount,...contentProps}=props,context=useMenuContext(CONTENT_NAME,props.__scopeMenu),rootContext=useMenuRootContext(CONTENT_NAME,props.__scopeMenu);return jsx_runtime.jsx(Collection.Provider,{scope:props.__scopeMenu,children:jsx_runtime.jsx(import_presence.Presence,{present:forceMount||context.open,children:jsx_runtime.jsx(Collection.Slot,{scope:props.__scopeMenu,children:rootContext.modal?jsx_runtime.jsx(MenuRootContentModal,{...contentProps,ref:forwardedRef}):jsx_runtime.jsx(MenuRootContentNonModal,{...contentProps,ref:forwardedRef})})})})}),MenuRootContentModal=import_react.forwardRef((props,forwardedRef)=>{let context=useMenuContext(CONTENT_NAME,props.__scopeMenu),ref=import_react.useRef(null),composedRefs=import_compose_refs.useComposedRefs(forwardedRef,ref);return import_react.useEffect(()=>{let content=ref.current;if(content)return import_aria_hidden.hideOthers(content)},[]),jsx_runtime.jsx(MenuContentImpl,{...props,disableOutsidePointerEvents:context.open,disableOutsideScroll:!0,onDismiss:()=>context.onOpenChange(!1),onFocusOutside:import_compose_events.composeEventHandlers(props.onFocusOutside,(event)=>event.preventDefault(),{checkForDefaultPrevented:!1}),ref:composedRefs,trapFocus:context.open})}),MenuRootContentNonModal=import_react.forwardRef((props,forwardedRef)=>{let context=useMenuContext(CONTENT_NAME,props.__scopeMenu);return jsx_runtime.jsx(MenuContentImpl,{...props,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>context.onOpenChange(!1),ref:forwardedRef,trapFocus:!1})}),Slot=import_slot.createSlot("MenuContent.ScrollLock"),MenuContentImpl=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,loop=!1,trapFocus,onOpenAutoFocus,onCloseAutoFocus,disableOutsidePointerEvents,onEntryFocus,onEscapeKeyDown,onPointerDownOutside,onFocusOutside,onInteractOutside,onDismiss,disableOutsideScroll,...contentProps}=props,context=useMenuContext(CONTENT_NAME,__scopeMenu),rootContext=useMenuRootContext(CONTENT_NAME,__scopeMenu),popperScope=usePopperScope(__scopeMenu),rovingFocusGroupScope=useRovingFocusGroupScope(__scopeMenu),getItems=useCollection(__scopeMenu),[currentItemId,setCurrentItemId]=import_react.useState(null),contentRef=import_react.useRef(null),composedRefs=import_compose_refs.useComposedRefs(forwardedRef,contentRef,context.onContentChange),timerRef=import_react.useRef(0),searchRef=import_react.useRef(""),pointerGraceTimerRef=import_react.useRef(0),pointerGraceIntentRef=import_react.useRef(null),pointerDirRef=import_react.useRef("right"),lastPointerXRef=import_react.useRef(0),ScrollLockWrapper=disableOutsideScroll?import_react_remove_scroll.RemoveScroll:import_jsx_runtime.Fragment,scrollLockWrapperProps=disableOutsideScroll?{allowPinchZoom:!0,as:Slot}:void 0,handleTypeaheadSearch=(key)=>{let search=searchRef.current+key,items=getItems().filter((item)=>!item.disabled),currentItem=document.activeElement,currentMatch=items.find((item)=>item.ref.current===currentItem)?.textValue,values=items.map((item)=>item.textValue),nextMatch=getNextMatch(values,search,currentMatch),newItem=items.find((item)=>item.textValue===nextMatch)?.ref.current;if(function updateSearch(value){if(searchRef.current=value,window.clearTimeout(timerRef.current),value!=="")timerRef.current=window.setTimeout(()=>updateSearch(""),1000)}(search),newItem)setTimeout(()=>newItem.focus())};import_react.useEffect(()=>{return()=>window.clearTimeout(timerRef.current)},[]),import_focus_guards.useFocusGuards();let isPointerMovingToSubmenu=import_react.useCallback((event)=>{return pointerDirRef.current===pointerGraceIntentRef.current?.side&&isPointerInGraceArea(event,pointerGraceIntentRef.current?.area)},[]);return jsx_runtime.jsx(MenuContentProvider,{onItemEnter:import_react.useCallback((event)=>{if(isPointerMovingToSubmenu(event))event.preventDefault()},[isPointerMovingToSubmenu]),onItemLeave:import_react.useCallback((event)=>{if(isPointerMovingToSubmenu(event))return;contentRef.current?.focus(),setCurrentItemId(null)},[isPointerMovingToSubmenu]),onPointerGraceIntentChange:import_react.useCallback((intent)=>{pointerGraceIntentRef.current=intent},[]),onTriggerLeave:import_react.useCallback((event)=>{if(isPointerMovingToSubmenu(event))event.preventDefault()},[isPointerMovingToSubmenu]),pointerGraceTimerRef,scope:__scopeMenu,searchRef,children:jsx_runtime.jsx(ScrollLockWrapper,{...scrollLockWrapperProps,children:jsx_runtime.jsx(import_focus_scope.FocusScope,{asChild:!0,onMountAutoFocus:import_compose_events.composeEventHandlers(onOpenAutoFocus,(event)=>{event.preventDefault(),contentRef.current?.focus({preventScroll:!0})}),onUnmountAutoFocus:onCloseAutoFocus,trapped:trapFocus,children:jsx_runtime.jsx(import_dismissable_layer.DismissableLayer,{asChild:!0,disableOutsidePointerEvents,onDismiss,onEscapeKeyDown,onFocusOutside,onInteractOutside,onPointerDownOutside,children:jsx_runtime.jsx(RovingFocusGroup.Root,{asChild:!0,...rovingFocusGroupScope,currentTabStopId:currentItemId,dir:rootContext.dir,loop,onCurrentTabStopIdChange:setCurrentItemId,onEntryFocus:import_compose_events.composeEventHandlers(onEntryFocus,(event)=>{if(!rootContext.isUsingKeyboardRef.current)event.preventDefault()}),orientation:"vertical",preventScrollOnEntryFocus:!0,children:jsx_runtime.jsx(PopperPrimitive.Content,{"aria-orientation":"vertical","data-loke-menu-content":"","data-state":getOpenState(context.open),dir:rootContext.dir,role:"menu",...popperScope,...contentProps,onBlur:import_compose_events.composeEventHandlers(props.onBlur,(event)=>{if(!event.currentTarget.contains(event.target))window.clearTimeout(timerRef.current),searchRef.current=""}),onKeyDown:import_compose_events.composeEventHandlers(contentProps.onKeyDown,(event)=>{let isKeyDownInside=event.target.closest("[data-loke-menu-content]")===event.currentTarget,isModifierKey=event.ctrlKey||event.altKey||event.metaKey,isCharacterKey=event.key.length===1;if(isKeyDownInside){if(event.key==="Tab")event.preventDefault();if(!isModifierKey&&isCharacterKey)handleTypeaheadSearch(event.key)}let content=contentRef.current;if(event.target!==content)return;if(!FIRST_LAST_KEYS.includes(event.key))return;event.preventDefault();let candidateNodes=getItems().filter((item)=>!item.disabled).map((item)=>item.ref.current).filter((node)=>node!=null);if(LAST_KEYS.includes(event.key))candidateNodes.reverse();focusFirst(candidateNodes)}),onPointerMove:import_compose_events.composeEventHandlers(props.onPointerMove,whenMouse((event)=>{let target=event.target,pointerXHasChanged=lastPointerXRef.current!==event.clientX;if(event.currentTarget.contains(target)&&pointerXHasChanged){let newDir=event.clientX>lastPointerXRef.current?"right":"left";pointerDirRef.current=newDir,lastPointerXRef.current=event.clientX}})),ref:composedRefs,style:{outline:"none",...contentProps.style}})})})})})})});MenuContent.displayName=CONTENT_NAME;var GROUP_NAME="MenuGroup",MenuGroup=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,...groupProps}=props;return jsx_runtime.jsx(import_primitive.Primitive.div,{role:"group",...groupProps,ref:forwardedRef})});MenuGroup.displayName=GROUP_NAME;var LABEL_NAME="MenuLabel",MenuLabel=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,...labelProps}=props;return jsx_runtime.jsx(import_primitive.Primitive.div,{...labelProps,ref:forwardedRef})});MenuLabel.displayName=LABEL_NAME;var ITEM_NAME="MenuItem",ITEM_SELECT="menu.itemSelect",MenuItem=import_react.forwardRef((props,forwardedRef)=>{let{disabled=!1,onSelect,...itemProps}=props,ref=import_react.useRef(null),rootContext=useMenuRootContext(ITEM_NAME,props.__scopeMenu),contentContext=useMenuContentContext(ITEM_NAME,props.__scopeMenu),composedRefs=import_compose_refs.useComposedRefs(forwardedRef,ref),isPointerDownRef=import_react.useRef(!1),handleSelect=()=>{let menuItem=ref.current;if(!disabled&&menuItem){let itemSelectEvent=new CustomEvent(ITEM_SELECT,{bubbles:!0,cancelable:!0});if(menuItem.addEventListener(ITEM_SELECT,(event)=>onSelect?.(event),{once:!0}),import_primitive.dispatchDiscreteCustomEvent(menuItem,itemSelectEvent),itemSelectEvent.defaultPrevented)isPointerDownRef.current=!1;else rootContext.onClose()}};return jsx_runtime.jsx(MenuItemImpl,{...itemProps,disabled,onClick:import_compose_events.composeEventHandlers(props.onClick,handleSelect),onKeyDown:import_compose_events.composeEventHandlers(props.onKeyDown,(event)=>{let isTypingAhead=contentContext.searchRef.current!=="";if(disabled||isTypingAhead&&event.key===" ")return;if(SELECTION_KEYS.includes(event.key))event.currentTarget.click(),event.preventDefault()}),onPointerDown:(event)=>{props.onPointerDown?.(event),isPointerDownRef.current=!0},onPointerUp:import_compose_events.composeEventHandlers(props.onPointerUp,(event)=>{if(!isPointerDownRef.current)event.currentTarget?.click()}),ref:composedRefs})});MenuItem.displayName=ITEM_NAME;var MenuItemImpl=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,disabled=!1,textValue,...itemProps}=props,contentContext=useMenuContentContext(ITEM_NAME,__scopeMenu),rovingFocusGroupScope=useRovingFocusGroupScope(__scopeMenu),ref=import_react.useRef(null),composedRefs=import_compose_refs.useComposedRefs(forwardedRef,ref),[isFocused,setIsFocused]=import_react.useState(!1),[textContent,setTextContent]=import_react.useState("");return import_react.useEffect(()=>{let menuItem=ref.current;if(menuItem)setTextContent((menuItem.textContent??"").trim())},[itemProps.children]),jsx_runtime.jsx(Collection.ItemSlot,{disabled,scope:__scopeMenu,textValue:textValue??textContent,children:jsx_runtime.jsx(RovingFocusGroup.Item,{asChild:!0,...rovingFocusGroupScope,focusable:!disabled,children:jsx_runtime.jsx(import_primitive.Primitive.div,{"aria-disabled":disabled||void 0,"data-disabled":disabled?"":void 0,"data-highlighted":isFocused?"":void 0,role:"menuitem",...itemProps,onBlur:import_compose_events.composeEventHandlers(props.onBlur,()=>setIsFocused(!1)),onFocus:import_compose_events.composeEventHandlers(props.onFocus,()=>setIsFocused(!0)),onPointerLeave:import_compose_events.composeEventHandlers(props.onPointerLeave,whenMouse((event)=>contentContext.onItemLeave(event))),onPointerMove:import_compose_events.composeEventHandlers(props.onPointerMove,whenMouse((event)=>{if(disabled)contentContext.onItemLeave(event);else if(contentContext.onItemEnter(event),!event.defaultPrevented)event.currentTarget.focus({preventScroll:!0})})),ref:composedRefs})})})}),CHECKBOX_ITEM_NAME="MenuCheckboxItem",MenuCheckboxItem=import_react.forwardRef((props,forwardedRef)=>{let{checked=!1,onCheckedChange,...checkboxItemProps}=props;return jsx_runtime.jsx(ItemIndicatorProvider,{checked,scope:props.__scopeMenu,children:jsx_runtime.jsx(MenuItem,{"aria-checked":isIndeterminate(checked)?"mixed":checked,role:"menuitemcheckbox",...checkboxItemProps,"data-state":getCheckedState(checked),onSelect:import_compose_events.composeEventHandlers(checkboxItemProps.onSelect,()=>onCheckedChange?.(isIndeterminate(checked)?!0:!checked),{checkForDefaultPrevented:!1}),ref:forwardedRef})})});MenuCheckboxItem.displayName=CHECKBOX_ITEM_NAME;var RADIO_GROUP_NAME="MenuRadioGroup",[RadioGroupProvider,useRadioGroupContext]=createMenuContext(RADIO_GROUP_NAME,{onValueChange:()=>{return},value:void 0}),MenuRadioGroup=import_react.forwardRef((props,forwardedRef)=>{let{value,onValueChange,...groupProps}=props,handleValueChange=import_use_callback_ref.useCallbackRef(onValueChange);return jsx_runtime.jsx(RadioGroupProvider,{onValueChange:handleValueChange,scope:props.__scopeMenu,value,children:jsx_runtime.jsx(MenuGroup,{...groupProps,ref:forwardedRef})})});MenuRadioGroup.displayName=RADIO_GROUP_NAME;var RADIO_ITEM_NAME="MenuRadioItem",MenuRadioItem=import_react.forwardRef((props,forwardedRef)=>{let{value,...radioItemProps}=props,context=useRadioGroupContext(RADIO_ITEM_NAME,props.__scopeMenu),checked=value===context.value;return jsx_runtime.jsx(ItemIndicatorProvider,{checked,scope:props.__scopeMenu,children:jsx_runtime.jsx(MenuItem,{"aria-checked":checked,role:"menuitemradio",...radioItemProps,"data-state":getCheckedState(checked),onSelect:import_compose_events.composeEventHandlers(radioItemProps.onSelect,()=>context.onValueChange?.(value),{checkForDefaultPrevented:!1}),ref:forwardedRef})})});MenuRadioItem.displayName=RADIO_ITEM_NAME;var ITEM_INDICATOR_NAME="MenuItemIndicator",[ItemIndicatorProvider,useItemIndicatorContext]=createMenuContext(ITEM_INDICATOR_NAME,{checked:!1}),MenuItemIndicator=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,forceMount,...itemIndicatorProps}=props,indicatorContext=useItemIndicatorContext(ITEM_INDICATOR_NAME,__scopeMenu);return jsx_runtime.jsx(import_presence.Presence,{present:forceMount||isIndeterminate(indicatorContext.checked)||indicatorContext.checked===!0,children:jsx_runtime.jsx(import_primitive.Primitive.span,{...itemIndicatorProps,"data-state":getCheckedState(indicatorContext.checked),ref:forwardedRef})})});MenuItemIndicator.displayName=ITEM_INDICATOR_NAME;var SEPARATOR_NAME="MenuSeparator",MenuSeparator=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,...separatorProps}=props;return jsx_runtime.jsx(import_primitive.Primitive.div,{"aria-orientation":"horizontal",role:"separator",...separatorProps,ref:forwardedRef})});MenuSeparator.displayName=SEPARATOR_NAME;var ARROW_NAME="MenuArrow",MenuArrow=import_react.forwardRef((props,forwardedRef)=>{let{__scopeMenu,...arrowProps}=props,popperScope=usePopperScope(__scopeMenu);return jsx_runtime.jsx(PopperPrimitive.Arrow,{...popperScope,...arrowProps,ref:forwardedRef})});MenuArrow.displayName=ARROW_NAME;var SUB_NAME="MenuSub",[MenuSubProvider,useMenuSubContext]=createMenuContext(SUB_NAME),MenuSub=(props)=>{let{__scopeMenu,children,open=!1,onOpenChange}=props,parentMenuContext=useMenuContext(SUB_NAME,__scopeMenu),popperScope=usePopperScope(__scopeMenu),[trigger,setTrigger]=import_react.useState(null),[content,setContent]=import_react.useState(null),handleOpenChange=import_use_callback_ref.useCallbackRef(onOpenChange);return import_react.useEffect(()=>{if(parentMenuContext.open===!1)handleOpenChange(!1);return()=>handleOpenChange(!1)},[parentMenuContext.open,handleOpenChange]),jsx_runtime.jsx(PopperPrimitive.Root,{...popperScope,children:jsx_runtime.jsx(MenuProvider,{content,onContentChange:setContent,onOpenChange:handleOpenChange,open,scope:__scopeMenu,children:jsx_runtime.jsx(MenuSubProvider,{contentId:import_use_id.useId(),onTriggerChange:setTrigger,scope:__scopeMenu,trigger,triggerId:import_use_id.useId(),children})})})};MenuSub.displayName=SUB_NAME;var SUB_TRIGGER_NAME="MenuSubTrigger",MenuSubTrigger=import_react.forwardRef((props,forwardedRef)=>{let context=useMenuContext(SUB_TRIGGER_NAME,props.__scopeMenu),rootContext=useMenuRootContext(SUB_TRIGGER_NAME,props.__scopeMenu),subContext=useMenuSubContext(SUB_TRIGGER_NAME,props.__scopeMenu),contentContext=useMenuContentContext(SUB_TRIGGER_NAME,props.__scopeMenu),openTimerRef=import_react.useRef(null),{pointerGraceTimerRef,onPointerGraceIntentChange}=contentContext,scope={__scopeMenu:props.__scopeMenu},clearOpenTimer=import_react.useCallback(()=>{if(openTimerRef.current)window.clearTimeout(openTimerRef.current);openTimerRef.current=null},[]);return import_react.useEffect(()=>clearOpenTimer,[clearOpenTimer]),import_react.useEffect(()=>{let pointerGraceTimer=pointerGraceTimerRef.current;return()=>{window.clearTimeout(pointerGraceTimer),onPointerGraceIntentChange(null)}},[pointerGraceTimerRef,onPointerGraceIntentChange]),jsx_runtime.jsx(MenuAnchor,{asChild:!0,...scope,children:jsx_runtime.jsx(MenuItemImpl,{"aria-controls":subContext.contentId,"aria-expanded":context.open,"aria-haspopup":"menu","data-state":getOpenState(context.open),id:subContext.triggerId,...props,onClick:(event)=>{if(props.onClick?.(event),props.disabled||event.defaultPrevented)return;if(event.currentTarget.focus(),!context.open)context.onOpenChange(!0)},onKeyDown:import_compose_events.composeEventHandlers(props.onKeyDown,(event)=>{let isTypingAhead=contentContext.searchRef.current!=="";if(props.disabled||isTypingAhead&&event.key===" ")return;if(SUB_OPEN_KEYS[rootContext.dir].includes(event.key))context.onOpenChange(!0),context.content?.focus(),event.preventDefault()}),onPointerLeave:import_compose_events.composeEventHandlers(props.onPointerLeave,whenMouse((event)=>{clearOpenTimer();let contentRect=context.content?.getBoundingClientRect();if(contentRect){let side=context.content?.dataset.side,rightSide=side==="right",bleed=rightSide?-5:5,contentNearEdge=contentRect[rightSide?"left":"right"],contentFarEdge=contentRect[rightSide?"right":"left"];contentContext.onPointerGraceIntentChange({area:[{x:event.clientX+bleed,y:event.clientY},{x:contentNearEdge,y:contentRect.top},{x:contentFarEdge,y:contentRect.top},{x:contentFarEdge,y:contentRect.bottom},{x:contentNearEdge,y:contentRect.bottom}],side}),window.clearTimeout(pointerGraceTimerRef.current),pointerGraceTimerRef.current=window.setTimeout(()=>contentContext.onPointerGraceIntentChange(null),300)}else{if(contentContext.onTriggerLeave(event),event.defaultPrevented)return;contentContext.onPointerGraceIntentChange(null)}})),onPointerMove:import_compose_events.composeEventHandlers(props.onPointerMove,whenMouse((event)=>{if(contentContext.onItemEnter(event),event.defaultPrevented)return;if(!(props.disabled||context.open||openTimerRef.current))contentContext.onPointerGraceIntentChange(null),openTimerRef.current=window.setTimeout(()=>{context.onOpenChange(!0),clearOpenTimer()},100)})),ref:import_compose_refs.composeRefs(forwardedRef,subContext.onTriggerChange)})})});MenuSubTrigger.displayName=SUB_TRIGGER_NAME;var SUB_CONTENT_NAME="MenuSubContent",MenuSubContent=import_react.forwardRef((props,forwardedRef)=>{let portalContext=usePortalContext(CONTENT_NAME,props.__scopeMenu),{forceMount=portalContext.forceMount,...subContentProps}=props,context=useMenuContext(CONTENT_NAME,props.__scopeMenu),rootContext=useMenuRootContext(CONTENT_NAME,props.__scopeMenu),subContext=useMenuSubContext(SUB_CONTENT_NAME,props.__scopeMenu),ref=import_react.useRef(null),composedRefs=import_compose_refs.useComposedRefs(forwardedRef,ref);return jsx_runtime.jsx(Collection.Provider,{scope:props.__scopeMenu,children:jsx_runtime.jsx(import_presence.Presence,{present:forceMount||context.open,children:jsx_runtime.jsx(Collection.Slot,{scope:props.__scopeMenu,children:jsx_runtime.jsx(MenuContentImpl,{"aria-labelledby":subContext.triggerId,id:subContext.contentId,...subContentProps,align:"start",disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onCloseAutoFocus:(event)=>event.preventDefault(),onEscapeKeyDown:import_compose_events.composeEventHandlers(props.onEscapeKeyDown,(event)=>{rootContext.onClose(),event.preventDefault()}),onFocusOutside:import_compose_events.composeEventHandlers(props.onFocusOutside,(event)=>{if(event.target!==subContext.trigger)context.onOpenChange(!1)}),onKeyDown:import_compose_events.composeEventHandlers(props.onKeyDown,(event)=>{let isKeyDownInside=event.currentTarget.contains(event.target),isCloseKey=SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);if(isKeyDownInside&&isCloseKey)context.onOpenChange(!1),subContext.trigger?.focus(),event.preventDefault()}),onOpenAutoFocus:(event)=>{if(rootContext.isUsingKeyboardRef.current)ref.current?.focus();event.preventDefault()},ref:composedRefs,side:rootContext.dir==="rtl"?"left":"right",trapFocus:!1})})})})});MenuSubContent.displayName=SUB_CONTENT_NAME;function getOpenState(open){return open?"open":"closed"}function isIndeterminate(checked){return checked==="indeterminate"}function getCheckedState(checked){if(isIndeterminate(checked))return"indeterminate";return checked?"checked":"unchecked"}function focusFirst(candidates){let PREVIOUSLY_FOCUSED_ELEMENT=document.activeElement;for(let candidate of candidates){if(candidate===PREVIOUSLY_FOCUSED_ELEMENT)return;if(candidate.focus(),document.activeElement!==PREVIOUSLY_FOCUSED_ELEMENT)return}}function wrapArray(array,startIndex){return array.map((_,index)=>array[(startIndex+index)%array.length])}function getNextMatch(values,search,currentMatch){let normalizedSearch=search.length>1&&Array.from(search).every((char)=>char===search[0])?search.charAt(0):search,currentMatchIndex=currentMatch?values.indexOf(currentMatch):-1,wrappedValues=wrapArray(values,Math.max(currentMatchIndex,0));if(normalizedSearch.length===1)wrappedValues=wrappedValues.filter((v)=>v!==currentMatch);let nextMatch=wrappedValues.find((value)=>value.toLowerCase().startsWith(normalizedSearch.toLowerCase()));return nextMatch!==currentMatch?nextMatch:void 0}function isPointInPolygon(point,polygon){let{x,y}=point,inside=!1;for(let i=0,j=polygon.length-1;i<polygon.length;j=i++){let ii=polygon[i],jj=polygon[j],xi=ii.x,yi=ii.y,xj=jj.x,yj=jj.y;if(yi>y!==yj>y&&x<(xj-xi)*(y-yi)/(yj-yi)+xi)inside=!inside}return inside}function isPointerInGraceArea(event,area){if(!area)return!1;let cursorPos={x:event.clientX,y:event.clientY};return isPointInPolygon(cursorPos,area)}function whenMouse(handler){return(event)=>event.pointerType==="mouse"?handler(event):void 0}var Root3=Menu,Anchor2=MenuAnchor,Portal=MenuPortal,Content2=MenuContent,Group=MenuGroup,Label=MenuLabel,Item2=MenuItem,CheckboxItem=MenuCheckboxItem,RadioGroup=MenuRadioGroup,RadioItem=MenuRadioItem,ItemIndicator=MenuItemIndicator,Separator=MenuSeparator,Arrow2=MenuArrow,Sub=MenuSub,SubTrigger=MenuSubTrigger,SubContent=MenuSubContent;