Files
2024-06-11 23:18:25 +02:00

2 lines
6.1 KiB
JavaScript

import m,{Fragment as Y,createContext as Z,useContext as B,useEffect as F,useMemo as $,useRef as C,useState as J}from"react";import{Features as ce,forwardRefWithAs as X,render as ee,RenderStrategy as N}from'../../utils/render.js';import{OpenClosedProvider as pe,State as E,useOpenClosed as te}from'../../internal/open-closed.js';import{match as L}from'../../utils/match.js';import{useIsMounted as he}from'../../hooks/use-is-mounted.js';import{useIsoMorphicEffect as ve}from'../../hooks/use-iso-morphic-effect.js';import{useLatestValue as I}from'../../hooks/use-latest-value.js';import{useServerHandoffComplete as ne}from'../../hooks/use-server-handoff-complete.js';import{useSyncRefs as re}from'../../hooks/use-sync-refs.js';import{useTransition as ge}from'../../hooks/use-transition.js';import{useEvent as b}from'../../hooks/use-event.js';import{useDisposables as Ce}from'../../hooks/use-disposables.js';import{classNames as ie}from'../../utils/class-names.js';import{useFlags as Ee}from'../../hooks/use-flags.js';function S(t=""){return t.split(" ").filter(n=>n.trim().length>1)}let _=Z(null);_.displayName="TransitionContext";var be=(r=>(r.Visible="visible",r.Hidden="hidden",r))(be||{});function Se(){let t=B(_);if(t===null)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return t}function Ne(){let t=B(M);if(t===null)throw new Error("A <Transition.Child /> is used but it is missing a parent <Transition /> or <Transition.Root />.");return t}let M=Z(null);M.displayName="NestingContext";function U(t){return"children"in t?U(t.children):t.current.filter(({el:n})=>n.current!==null).filter(({state:n})=>n==="visible").length>0}function oe(t,n){let r=I(t),s=C([]),y=he(),D=Ce(),c=b((i,e=N.Hidden)=>{let a=s.current.findIndex(({el:o})=>o===i);a!==-1&&(L(e,{[N.Unmount](){s.current.splice(a,1)},[N.Hidden](){s.current[a].state="hidden"}}),D.microTask(()=>{var o;!U(s)&&y.current&&((o=r.current)==null||o.call(r))}))}),x=b(i=>{let e=s.current.find(({el:a})=>a===i);return e?e.state!=="visible"&&(e.state="visible"):s.current.push({el:i,state:"visible"}),()=>c(i,N.Unmount)}),p=C([]),h=C(Promise.resolve()),u=C({enter:[],leave:[],idle:[]}),v=b((i,e,a)=>{p.current.splice(0),n&&(n.chains.current[e]=n.chains.current[e].filter(([o])=>o!==i)),n==null||n.chains.current[e].push([i,new Promise(o=>{p.current.push(o)})]),n==null||n.chains.current[e].push([i,new Promise(o=>{Promise.all(u.current[e].map(([f,P])=>P)).then(()=>o())})]),e==="enter"?h.current=h.current.then(()=>n==null?void 0:n.wait.current).then(()=>a(e)):a(e)}),d=b((i,e,a)=>{Promise.all(u.current[e].splice(0).map(([o,f])=>f)).then(()=>{var o;(o=p.current.shift())==null||o()}).then(()=>a(e))});return $(()=>({children:s,register:x,unregister:c,onStart:v,onStop:d,wait:h,chains:u}),[x,c,s,v,d,u,h])}function xe(){}let Pe=["beforeEnter","afterEnter","beforeLeave","afterLeave"];function se(t){var r;let n={};for(let s of Pe)n[s]=(r=t[s])!=null?r:xe;return n}function Re(t){let n=C(se(t));return F(()=>{n.current=se(t)},[t]),n}let ye="div",ae=ce.RenderStrategy;function De(t,n){var K,Q;let{beforeEnter:r,afterEnter:s,beforeLeave:y,afterLeave:D,enter:c,enterFrom:x,enterTo:p,entered:h,leave:u,leaveFrom:v,leaveTo:d,...i}=t,e=C(null),a=re(e,n),o=(K=i.unmount)==null||K?N.Unmount:N.Hidden,{show:f,appear:P,initial:T}=Se(),[l,j]=J(f?"visible":"hidden"),q=Ne(),{register:O,unregister:V}=q;F(()=>O(e),[O,e]),F(()=>{if(o===N.Hidden&&e.current){if(f&&l!=="visible"){j("visible");return}return L(l,{["hidden"]:()=>V(e),["visible"]:()=>O(e)})}},[l,e,O,V,f,o]);let k=I({base:S(i.className),enter:S(c),enterFrom:S(x),enterTo:S(p),entered:S(h),leave:S(u),leaveFrom:S(v),leaveTo:S(d)}),w=Re({beforeEnter:r,afterEnter:s,beforeLeave:y,afterLeave:D}),G=ne();F(()=>{if(G&&l==="visible"&&e.current===null)throw new Error("Did you forget to passthrough the `ref` to the actual DOM node?")},[e,l,G]);let ue=T&&!P,z=P&&f&&T,Te=(()=>!G||ue?"idle":f?"enter":"leave")(),H=Ee(0),de=b(g=>L(g,{enter:()=>{H.addFlag(E.Opening),w.current.beforeEnter()},leave:()=>{H.addFlag(E.Closing),w.current.beforeLeave()},idle:()=>{}})),fe=b(g=>L(g,{enter:()=>{H.removeFlag(E.Opening),w.current.afterEnter()},leave:()=>{H.removeFlag(E.Closing),w.current.afterLeave()},idle:()=>{}})),A=oe(()=>{j("hidden"),V(e)},q);ge({immediate:z,container:e,classes:k,direction:Te,onStart:I(g=>{A.onStart(e,g,de)}),onStop:I(g=>{A.onStop(e,g,fe),g==="leave"&&!U(A)&&(j("hidden"),V(e))})});let R=i,me={ref:a};return z?R={...R,className:ie(i.className,...k.current.enter,...k.current.enterFrom)}:(R.className=ie(i.className,(Q=e.current)==null?void 0:Q.className),R.className===""&&delete R.className),m.createElement(M.Provider,{value:A},m.createElement(pe,{value:L(l,{["visible"]:E.Open,["hidden"]:E.Closed})|H.flags},ee({ourProps:me,theirProps:R,defaultTag:ye,features:ae,visible:l==="visible",name:"Transition.Child"})))}function He(t,n){let{show:r,appear:s=!1,unmount:y=!0,...D}=t,c=C(null),x=re(c,n);ne();let p=te();if(r===void 0&&p!==null&&(r=(p&E.Open)===E.Open),![!0,!1].includes(r))throw new Error("A <Transition /> is used but it is missing a `show={true | false}` prop.");let[h,u]=J(r?"visible":"hidden"),v=oe(()=>{u("hidden")}),[d,i]=J(!0),e=C([r]);ve(()=>{d!==!1&&e.current[e.current.length-1]!==r&&(e.current.push(r),i(!1))},[e,r]);let a=$(()=>({show:r,appear:s,initial:d}),[r,s,d]);F(()=>{if(r)u("visible");else if(!U(v))u("hidden");else{let T=c.current;if(!T)return;let l=T.getBoundingClientRect();l.x===0&&l.y===0&&l.width===0&&l.height===0&&u("hidden")}},[r,v]);let o={unmount:y},f=b(()=>{var T;d&&i(!1),(T=t.beforeEnter)==null||T.call(t)}),P=b(()=>{var T;d&&i(!1),(T=t.beforeLeave)==null||T.call(t)});return m.createElement(M.Provider,{value:v},m.createElement(_.Provider,{value:a},ee({ourProps:{...o,as:Y,children:m.createElement(le,{ref:x,...o,...D,beforeEnter:f,beforeLeave:P})},theirProps:{},defaultTag:Y,features:ae,visible:h==="visible",name:"Transition"})))}function Fe(t,n){let r=B(_)!==null,s=te()!==null;return m.createElement(m.Fragment,null,!r&&s?m.createElement(W,{ref:n,...t}):m.createElement(le,{ref:n,...t}))}let W=X(He),le=X(De),Le=X(Fe),tt=Object.assign(W,{Child:Le,Root:W});export{tt as Transition};