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