import A,{createContext as Q,createRef as de,useContext as Z,useEffect as ee,useMemo as _,useReducer as ge,useRef as J,useState as ce}from"react";import{match as k}from'../../utils/match.js';import{forwardRefWithAs as X,render as Y,Features as te}from'../../utils/render.js';import{optionalRef as Se,useSyncRefs as j}from'../../hooks/use-sync-refs.js';import{useId as V}from'../../hooks/use-id.js';import{Keys as w}from'../keyboard.js';import{isDisabledReactIssue7711 as ve}from'../../utils/bugs.js';import{getFocusableElements as ne,Focus as G,focusIn as U,isFocusableElement as Ae,FocusableMode as Re,FocusResult as le}from'../../utils/focus-management.js';import{OpenClosedProvider as Oe,State as $,useOpenClosed as Te}from'../../internal/open-closed.js';import{useResolveButtonType as Ce}from'../../hooks/use-resolve-button-type.js';import{useOutsideClick as Me}from'../../hooks/use-outside-click.js';import{getOwnerDocument as Fe}from'../../utils/owner.js';import{useOwnerDocument as ae}from'../../hooks/use-owner.js';import{useEventListener as Ie}from'../../hooks/use-event-listener.js';import{Hidden as pe,Features as se}from'../../internal/hidden.js';import{useEvent as g}from'../../hooks/use-event.js';import{useTabDirection as me,Direction as N}from'../../hooks/use-tab-direction.js';import'../../utils/micro-task.js';import{useLatestValue as ye}from'../../hooks/use-latest-value.js';import{useIsoMorphicEffect as xe}from'../../hooks/use-iso-morphic-effect.js';import{useMainTreeNode as Le,useRootContainers as Be}from'../../hooks/use-root-containers.js';import{useNestedPortals as De}from'../../components/portal/portal.js';var he=(u=>(u[u.Open=0]="Open",u[u.Closed=1]="Closed",u))(he||{}),He=(e=>(e[e.TogglePopover=0]="TogglePopover",e[e.ClosePopover=1]="ClosePopover",e[e.SetButton=2]="SetButton",e[e.SetButtonId=3]="SetButtonId",e[e.SetPanel=4]="SetPanel",e[e.SetPanelId=5]="SetPanelId",e))(He||{});let _e={[0]:t=>{let o={...t,popoverState:k(t.popoverState,{[0]:1,[1]:0})};return o.popoverState===0&&(o.__demoMode=!1),o},[1](t){return t.popoverState===1?t:{...t,popoverState:1}},[2](t,o){return t.button===o.button?t:{...t,button:o.button}},[3](t,o){return t.buttonId===o.buttonId?t:{...t,buttonId:o.buttonId}},[4](t,o){return t.panel===o.panel?t:{...t,panel:o.panel}},[5](t,o){return t.panelId===o.panelId?t:{...t,panelId:o.panelId}}},ue=Q(null);ue.displayName="PopoverContext";function oe(t){let o=Z(ue);if(o===null){let u=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(u,oe),u}return o}let ie=Q(null);ie.displayName="PopoverAPIContext";function fe(t){let o=Z(ie);if(o===null){let u=new Error(`<${t} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(u,fe),u}return o}let Pe=Q(null);Pe.displayName="PopoverGroupContext";function Ee(){return Z(Pe)}let re=Q(null);re.displayName="PopoverPanelContext";function Ge(){return Z(re)}function Ne(t,o){return k(o.type,_e,t,o)}let ke="div";function we(t,o){var D;let{__demoMode:u=!1,...R}=t,O=J(null),n=j(o,Se(l=>{O.current=l})),e=J([]),v=ge(Ne,{__demoMode:u,popoverState:u?0:1,buttons:e,button:null,buttonId:null,panel:null,panelId:null,beforePanelSentinel:de(),afterPanelSentinel:de()}),[{popoverState:P,button:s,buttonId:I,panel:p,panelId:T,beforePanelSentinel:m,afterPanelSentinel:S},i]=v,a=ae((D=O.current)!=null?D:s),E=_(()=>{if(!s||!p)return!1;for(let K of document.querySelectorAll("body > *"))if(Number(K==null?void 0:K.contains(s))^Number(K==null?void 0:K.contains(p)))return!0;let l=ne(),F=l.indexOf(s),q=(F+l.length-1)%l.length,W=(F+1)%l.length,z=l[q],be=l[W];return!p.contains(z)&&!p.contains(be)},[s,p]),C=ye(I),H=ye(T),x=_(()=>({buttonId:C,panelId:H,close:()=>i({type:1})}),[C,H,i]),M=Ee(),h=M==null?void 0:M.registerPopover,f=g(()=>{var l;return(l=M==null?void 0:M.isFocusWithinPopoverGroup())!=null?l:(a==null?void 0:a.activeElement)&&((s==null?void 0:s.contains(a.activeElement))||(p==null?void 0:p.contains(a.activeElement)))});ee(()=>h==null?void 0:h(x),[h,x]);let[y,b]=De(),d=Be({mainTreeNodeRef:M==null?void 0:M.mainTreeNodeRef,portals:y,defaultContainers:[s,p]});Ie(a==null?void 0:a.defaultView,"focus",l=>{var F,q,W,z;l.target!==window&&l.target instanceof HTMLElement&&P===0&&(f()||s&&p&&(d.contains(l.target)||(q=(F=m.current)==null?void 0:F.contains)!=null&&q.call(F,l.target)||(z=(W=S.current)==null?void 0:W.contains)!=null&&z.call(W,l.target)||i({type:1})))},!0),Me(d.resolveContainers,(l,F)=>{i({type:1}),Ae(F,Re.Loose)||(l.preventDefault(),s==null||s.focus())},P===0);let L=g(l=>{i({type:1});let F=(()=>l?l instanceof HTMLElement?l:"current"in l&&l.current instanceof HTMLElement?l.current:s:s)();F==null||F.focus()}),r=_(()=>({close:L,isPortalled:E}),[L,E]),c=_(()=>({open:P===0,close:L}),[P,L]),B={ref:n};return A.createElement(re.Provider,{value:null},A.createElement(ue.Provider,{value:v},A.createElement(ie.Provider,{value:r},A.createElement(Oe,{value:k(P,{[0]:$.Open,[1]:$.Closed})},A.createElement(b,null,Y({ourProps:B,theirProps:R,slot:c,defaultTag:ke,name:"Popover"}),A.createElement(d.MainTreeNode,null))))))}let Ue="button";function We(t,o){let u=V(),{id:R=`headlessui-popover-button-${u}`,...O}=t,[n,e]=oe("Popover.Button"),{isPortalled:v}=fe("Popover.Button"),P=J(null),s=`headlessui-focus-sentinel-${V()}`,I=Ee(),p=I==null?void 0:I.closeOthers,m=Ge()!==null;ee(()=>{if(!m)return e({type:3,buttonId:R}),()=>{e({type:3,buttonId:null})}},[m,R,e]);let[S]=ce(()=>Symbol()),i=j(P,o,m?null:r=>{if(r)n.buttons.current.push(S);else{let c=n.buttons.current.indexOf(S);c!==-1&&n.buttons.current.splice(c,1)}n.buttons.current.length>1&&console.warn("You are already using a but only 1 is supported."),r&&e({type:2,button:r})}),a=j(P,o),E=ae(P),C=g(r=>{var c,B,D;if(m){if(n.popoverState===1)return;switch(r.key){case w.Space:case w.Enter:r.preventDefault(),(B=(c=r.target).click)==null||B.call(c),e({type:1}),(D=n.button)==null||D.focus();break}}else switch(r.key){case w.Space:case w.Enter:r.preventDefault(),r.stopPropagation(),n.popoverState===1&&(p==null||p(n.buttonId)),e({type:0});break;case w.Escape:if(n.popoverState!==0)return p==null?void 0:p(n.buttonId);if(!P.current||E!=null&&E.activeElement&&!P.current.contains(E.activeElement))return;r.preventDefault(),r.stopPropagation(),e({type:1});break}}),H=g(r=>{m||r.key===w.Space&&r.preventDefault()}),x=g(r=>{var c,B;ve(r.currentTarget)||t.disabled||(m?(e({type:1}),(c=n.button)==null||c.focus()):(r.preventDefault(),r.stopPropagation(),n.popoverState===1&&(p==null||p(n.buttonId)),e({type:0}),(B=n.button)==null||B.focus()))}),M=g(r=>{r.preventDefault(),r.stopPropagation()}),h=n.popoverState===0,f=_(()=>({open:h}),[h]),y=Ce(t,P),b=m?{ref:a,type:y,onKeyDown:C,onClick:x}:{ref:i,id:n.buttonId,type:y,"aria-expanded":n.popoverState===0,"aria-controls":n.panel?n.panelId:void 0,onKeyDown:C,onKeyUp:H,onClick:x,onMouseDown:M},d=me(),L=g(()=>{let r=n.panel;if(!r)return;function c(){k(d.current,{[N.Forwards]:()=>U(r,G.First),[N.Backwards]:()=>U(r,G.Last)})===le.Error&&U(ne().filter(D=>D.dataset.headlessuiFocusGuard!=="true"),k(d.current,{[N.Forwards]:G.Next,[N.Backwards]:G.Previous}),{relativeTo:n.button})}c()});return A.createElement(A.Fragment,null,Y({ourProps:b,theirProps:O,slot:f,defaultTag:Ue,name:"Popover.Button"}),h&&!m&&v&&A.createElement(pe,{id:s,features:se.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:L}))}let Ke="div",je=te.RenderStrategy|te.Static;function Ve(t,o){let u=V(),{id:R=`headlessui-popover-overlay-${u}`,...O}=t,[{popoverState:n},e]=oe("Popover.Overlay"),v=j(o),P=Te(),s=(()=>P!==null?(P&$.Open)===$.Open:n===0)(),I=g(m=>{if(ve(m.currentTarget))return m.preventDefault();e({type:1})}),p=_(()=>({open:n===0}),[n]);return Y({ourProps:{ref:v,id:R,"aria-hidden":!0,onClick:I},theirProps:O,slot:p,defaultTag:Ke,features:je,visible:s,name:"Popover.Overlay"})}let $e="div",Je=te.RenderStrategy|te.Static;function Xe(t,o){let u=V(),{id:R=`headlessui-popover-panel-${u}`,focus:O=!1,...n}=t,[e,v]=oe("Popover.Panel"),{close:P,isPortalled:s}=fe("Popover.Panel"),I=`headlessui-focus-sentinel-before-${V()}`,p=`headlessui-focus-sentinel-after-${V()}`,T=J(null),m=j(T,o,f=>{v({type:4,panel:f})}),S=ae(T);xe(()=>(v({type:5,panelId:R}),()=>{v({type:5,panelId:null})}),[R,v]);let i=Te(),a=(()=>i!==null?(i&$.Open)===$.Open:e.popoverState===0)(),E=g(f=>{var y;switch(f.key){case w.Escape:if(e.popoverState!==0||!T.current||S!=null&&S.activeElement&&!T.current.contains(S.activeElement))return;f.preventDefault(),f.stopPropagation(),v({type:1}),(y=e.button)==null||y.focus();break}});ee(()=>{var f;t.static||e.popoverState===1&&((f=t.unmount)==null||f)&&v({type:4,panel:null})},[e.popoverState,t.unmount,t.static,v]),ee(()=>{if(e.__demoMode||!O||e.popoverState!==0||!T.current)return;let f=S==null?void 0:S.activeElement;T.current.contains(f)||U(T.current,G.First)},[e.__demoMode,O,T,e.popoverState]);let C=_(()=>({open:e.popoverState===0,close:P}),[e,P]),H={ref:m,id:R,onKeyDown:E,onBlur:O&&e.popoverState===0?f=>{var b,d,L,r,c;let y=f.relatedTarget;y&&T.current&&((b=T.current)!=null&&b.contains(y)||(v({type:1}),((L=(d=e.beforePanelSentinel.current)==null?void 0:d.contains)!=null&&L.call(d,y)||(c=(r=e.afterPanelSentinel.current)==null?void 0:r.contains)!=null&&c.call(r,y))&&y.focus({preventScroll:!0})))}:void 0,tabIndex:-1},x=me(),M=g(()=>{let f=T.current;if(!f)return;function y(){k(x.current,{[N.Forwards]:()=>{var d;U(f,G.First)===le.Error&&((d=e.afterPanelSentinel.current)==null||d.focus())},[N.Backwards]:()=>{var b;(b=e.button)==null||b.focus({preventScroll:!0})}})}y()}),h=g(()=>{let f=T.current;if(!f)return;function y(){k(x.current,{[N.Forwards]:()=>{var B;if(!e.button)return;let b=ne(),d=b.indexOf(e.button),L=b.slice(0,d+1),c=[...b.slice(d+1),...L];for(let D of c.slice())if(D.dataset.headlessuiFocusGuard==="true"||(B=e.panel)!=null&&B.contains(D)){let l=c.indexOf(D);l!==-1&&c.splice(l,1)}U(c,G.First,{sorted:!1})},[N.Backwards]:()=>{var d;U(f,G.Previous)===le.Error&&((d=e.button)==null||d.focus())}})}y()});return A.createElement(re.Provider,{value:R},a&&s&&A.createElement(pe,{id:I,ref:e.beforePanelSentinel,features:se.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:M}),Y({ourProps:H,theirProps:n,slot:C,defaultTag:$e,features:Je,visible:a,name:"Popover.Panel"}),a&&s&&A.createElement(pe,{id:p,ref:e.afterPanelSentinel,features:se.Focusable,"data-headlessui-focus-guard":!0,as:"button",type:"button",onFocus:h}))}let Ye="div";function qe(t,o){let u=J(null),R=j(u,o),[O,n]=ce([]),e=Le(),v=g(i=>{n(a=>{let E=a.indexOf(i);if(E!==-1){let C=a.slice();return C.splice(E,1),C}return a})}),P=g(i=>(n(a=>[...a,i]),()=>v(i))),s=g(()=>{var E;let i=Fe(u);if(!i)return!1;let a=i.activeElement;return(E=u.current)!=null&&E.contains(a)?!0:O.some(C=>{var H,x;return((H=i.getElementById(C.buttonId.current))==null?void 0:H.contains(a))||((x=i.getElementById(C.panelId.current))==null?void 0:x.contains(a))})}),I=g(i=>{for(let a of O)a.buttonId.current!==i&&a.close()}),p=_(()=>({registerPopover:P,unregisterPopover:v,isFocusWithinPopoverGroup:s,closeOthers:I,mainTreeNodeRef:e.mainTreeNodeRef}),[P,v,s,I,e.mainTreeNodeRef]),T=_(()=>({}),[]),m=t,S={ref:R};return A.createElement(Pe.Provider,{value:p},Y({ourProps:S,theirProps:m,slot:T,defaultTag:Ye,name:"Popover.Group"}),A.createElement(e.MainTreeNode,null))}let ze=X(we),Qe=X(We),Ze=X(Ve),et=X(Xe),tt=X(qe),kt=Object.assign(ze,{Button:Qe,Overlay:Ze,Panel:et,Group:tt});export{kt as Popover};