Files
infocom-systems-design/node_modules/@headlessui/react/dist/components/dialog/dialog.js
2025-10-03 22:27:28 +03:00

2 lines
6.7 KiB
JavaScript

"use client";import l,{Fragment as $,createContext as pe,createRef as se,useCallback as de,useContext as ue,useEffect as Te,useMemo as fe,useReducer as ge,useRef as j}from"react";import{useEscape as ce}from'../../hooks/use-escape.js';import{useEvent as A}from'../../hooks/use-event.js';import{useId as k}from'../../hooks/use-id.js';import{useInertOthers as me}from'../../hooks/use-inert-others.js';import{useIsTouchDevice as De}from'../../hooks/use-is-touch-device.js';import{useIsoMorphicEffect as Pe}from'../../hooks/use-iso-morphic-effect.js';import{useOnDisappear as ye}from'../../hooks/use-on-disappear.js';import{useOutsideClick as Ee}from'../../hooks/use-outside-click.js';import{useOwnerDocument as Ae}from'../../hooks/use-owner.js';import{MainTreeProvider as Y,useMainTreeNode as _e,useRootContainers as Ce}from'../../hooks/use-root-containers.js';import{useScrollLock as Re}from'../../hooks/use-scroll-lock.js';import{useServerHandoffComplete as Fe}from'../../hooks/use-server-handoff-complete.js';import{useSlot as L}from'../../hooks/use-slot.js';import{useSyncRefs as G}from'../../hooks/use-sync-refs.js';import{CloseProvider as be}from'../../internal/close-provider.js';import{ResetOpenClosedProvider as ve,State as x,useOpenClosed as J}from'../../internal/open-closed.js';import{ForcePortalRoot as K}from'../../internal/portal-force-root.js';import{stackMachines as Le}from'../../machines/stack-machine.js';import{useSlice as xe}from'../../react-glue.js';import{match as he}from'../../utils/match.js';import{RenderFeatures as X,forwardRefWithAs as _,useRender as h}from'../../utils/render.js';import{Description as V,useDescriptions as Oe}from'../description/description.js';import{FocusTrap as Se,FocusTrapFeatures as C}from'../focus-trap/focus-trap.js';import{Portal as Ie,PortalGroup as Me,useNestedPortals as ke}from'../portal/portal.js';import{Transition as Ge,TransitionChild as q}from'../transition/transition.js';var we=(o=>(o[o.Open=0]="Open",o[o.Closed=1]="Closed",o))(we||{}),Be=(t=>(t[t.SetTitleId=0]="SetTitleId",t))(Be||{});let Ue={[0](e,t){return e.titleId===t.id?e:{...e,titleId:t.id}}},w=pe(null);w.displayName="DialogContext";function O(e){let t=ue(w);if(t===null){let o=new Error(`<${e} /> is missing a parent <Dialog /> component.`);throw Error.captureStackTrace&&Error.captureStackTrace(o,O),o}return t}function He(e,t){return he(t.type,Ue,e,t)}let z=_(function(t,o){let a=k(),{id:n=`headlessui-dialog-${a}`,open:i,onClose:p,initialFocus:d,role:s="dialog",autoFocus:f=!0,__demoMode:u=!1,unmount:y=!1,...S}=t,R=j(!1);s=function(){return s==="dialog"||s==="alertdialog"?s:(R.current||(R.current=!0,console.warn(`Invalid role [${s}] passed to <Dialog />. Only \`dialog\` and and \`alertdialog\` are supported. Using \`dialog\` instead.`)),"dialog")}();let g=J();i===void 0&&g!==null&&(i=(g&x.Open)===x.Open);let T=j(null),I=G(T,o),F=Ae(T.current),c=i?0:1,[b,Q]=ge(He,{titleId:null,descriptionId:null,panelRef:se()}),m=A(()=>p(!1)),B=A(r=>Q({type:0,id:r})),D=Fe()?c===0:!1,[Z,ee]=ke(),te={get current(){var r;return(r=b.panelRef.current)!=null?r:T.current}},v=_e(),{resolveContainers:M}=Ce({mainTreeNode:v,portals:Z,defaultContainers:[te]}),U=g!==null?(g&x.Closing)===x.Closing:!1;me(u||U?!1:D,{allowed:A(()=>{var r,W;return[(W=(r=T.current)==null?void 0:r.closest("[data-headlessui-portal]"))!=null?W:null]}),disallowed:A(()=>{var r;return[(r=v==null?void 0:v.closest("body > *:not(#headlessui-portal-root)"))!=null?r:null]})});let P=Le.get(null);Pe(()=>{if(D)return P.actions.push(n),()=>P.actions.pop(n)},[P,n,D]);let H=xe(P,de(r=>P.selectors.isTop(r,n),[P,n]));Ee(H,M,r=>{r.preventDefault(),m()}),ce(H,F==null?void 0:F.defaultView,r=>{r.preventDefault(),r.stopPropagation(),document.activeElement&&"blur"in document.activeElement&&typeof document.activeElement.blur=="function"&&document.activeElement.blur(),m()}),Re(u||U?!1:D,F,M),ye(D,T,m);let[oe,ne]=Oe(),re=fe(()=>[{dialogState:c,close:m,setTitleId:B,unmount:y},b],[c,m,B,y,b]),N=L({open:c===0}),le={ref:I,id:n,role:s,tabIndex:-1,"aria-modal":u?void 0:c===0?!0:void 0,"aria-labelledby":b.titleId,"aria-describedby":oe,unmount:y},ae=!De(),E=C.None;D&&!u&&(E|=C.RestoreFocus,E|=C.TabLock,f&&(E|=C.AutoFocus),ae&&(E|=C.InitialFocus));let ie=h();return l.createElement(ve,null,l.createElement(K,{force:!0},l.createElement(Ie,null,l.createElement(w.Provider,{value:re},l.createElement(Me,{target:T},l.createElement(K,{force:!1},l.createElement(ne,{slot:N},l.createElement(ee,null,l.createElement(Se,{initialFocus:d,initialFocusFallback:T,containers:M,features:E},l.createElement(be,{value:m},ie({ourProps:le,theirProps:S,slot:N,defaultTag:Ne,features:We,visible:c===0,name:"Dialog"})))))))))))}),Ne="div",We=X.RenderStrategy|X.Static;function $e(e,t){let{transition:o=!1,open:a,...n}=e,i=J(),p=e.hasOwnProperty("open")||i!==null,d=e.hasOwnProperty("onClose");if(!p&&!d)throw new Error("You have to provide an `open` and an `onClose` prop to the `Dialog` component.");if(!p)throw new Error("You provided an `onClose` prop to the `Dialog`, but forgot an `open` prop.");if(!d)throw new Error("You provided an `open` prop to the `Dialog`, but forgot an `onClose` prop.");if(!i&&typeof e.open!="boolean")throw new Error(`You provided an \`open\` prop to the \`Dialog\`, but the value is not a boolean. Received: ${e.open}`);if(typeof e.onClose!="function")throw new Error(`You provided an \`onClose\` prop to the \`Dialog\`, but the value is not a function. Received: ${e.onClose}`);return(a!==void 0||o)&&!n.static?l.createElement(Y,null,l.createElement(Ge,{show:a,transition:o,unmount:n.unmount},l.createElement(z,{ref:t,...n}))):l.createElement(Y,null,l.createElement(z,{ref:t,open:a,...n}))}let je="div";function Ye(e,t){let o=k(),{id:a=`headlessui-dialog-panel-${o}`,transition:n=!1,...i}=e,[{dialogState:p,unmount:d},s]=O("Dialog.Panel"),f=G(t,s.panelRef),u=L({open:p===0}),y=A(I=>{I.stopPropagation()}),S={ref:f,id:a,onClick:y},R=n?q:$,g=n?{unmount:d}:{},T=h();return l.createElement(R,{...g},T({ourProps:S,theirProps:i,slot:u,defaultTag:je,name:"Dialog.Panel"}))}let Je="div";function Ke(e,t){let{transition:o=!1,...a}=e,[{dialogState:n,unmount:i}]=O("Dialog.Backdrop"),p=L({open:n===0}),d={ref:t,"aria-hidden":!0},s=o?q:$,f=o?{unmount:i}:{},u=h();return l.createElement(s,{...f},u({ourProps:d,theirProps:a,slot:p,defaultTag:Je,name:"Dialog.Backdrop"}))}let Xe="h2";function Ve(e,t){let o=k(),{id:a=`headlessui-dialog-title-${o}`,...n}=e,[{dialogState:i,setTitleId:p}]=O("Dialog.Title"),d=G(t);Te(()=>(p(a),()=>p(null)),[a,p]);let s=L({open:i===0}),f={ref:d,id:a};return h()({ourProps:f,theirProps:n,slot:s,defaultTag:Xe,name:"Dialog.Title"})}let qe=_($e),ze=_(Ye),Lt=_(Ke),Qe=_(Ve),xt=V,ht=Object.assign(qe,{Panel:ze,Title:Qe,Description:V});export{ht as Dialog,Lt as DialogBackdrop,xt as DialogDescription,ze as DialogPanel,Qe as DialogTitle};