@modastar/z-router 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var tt=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var Ut=Object.prototype.hasOwnProperty;var It=(t,n)=>{for(var e in n)tt(t,e,{get:n[e],enumerable:!0})},Xt=(t,n,e,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Gt(n))!Ut.call(t,o)&&o!==e&&tt(t,o,{get:()=>n[o],enumerable:!(s=Bt(n,o))||s.enumerable});return t};var Ht=t=>Xt(tt({},"__esModule",{value:!0}),t);var Jt={};It(Jt,{DefaultTransitionDuration:()=>Yt,Link:()=>qt,LocationContext:()=>W,LocationProvider:()=>D,Outlet:()=>et,RootRouteContext:()=>I,RouterContext:()=>$,RouterProvider:()=>Vt,Stack:()=>zt,buildPathnameFromMatches:()=>At,createRouterOptions:()=>Kt,matchPattern:()=>Mt,matchRoute:()=>it,parseLocation:()=>st,parseRoute:()=>at,redirect:()=>_t,resolveRelativePathname:()=>ct,useLocation:()=>B,useRootRoute:()=>X,useRoute:()=>ot,useRouteMatch:()=>j,useRouter:()=>w});module.exports=Ht(Jt);var mt=require("react");var pt=require("react"),$=(0,pt.createContext)(null);var w=()=>{let t=(0,mt.useContext)($);if(t===null)throw new Error("useRouter must be used within a Stack");return t};var dt=require("react"),lt=require("react/jsx-runtime"),qt=(0,dt.memo)(({to:t,replace:n,transition:e,duration:s,onFinish:o,...c})=>{let r=w();return(0,lt.jsx)("a",{...c,href:t,onClick:i=>{i.preventDefault(),r.navigate({to:t,replace:n,transition:e,duration:s,onFinish:o})}})});var ft=require("react"),W=(0,ft.createContext)(null);var N=require("react"),Rt=require("react/jsx-runtime"),D=(0,N.memo)(({location:t,...n})=>{let e=w(),s=(0,N.useCallback)(r=>t.state[r],[t]),o=(0,N.useCallback)((r,i)=>{e.setLocationState(t.index,{...t.state,[r]:i})},[e,t]),c=(0,N.useCallback)(r=>{delete t.state[r],e.setLocationState(t.index,t.state)},[e,t]);return(0,Rt.jsx)(W.Provider,{value:{...t,canGoBack:t.index>0,canGoForward:t.index<e.history.length-1,getState:s,setState:o,deleteState:c},...n})},(t,n)=>t.location===n.location);var ht=require("react"),Y=(0,ht.createContext)(0);var gt=require("react"),xt=()=>(0,gt.useContext)(Y);var yt=require("react"),_=(0,yt.createContext)(null);var vt=require("react"),j=()=>{let t=(0,vt.useContext)(_);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};var Ct=require("react/jsx-runtime"),Pt=({depth:t,...n})=>(0,Ct.jsx)(Y.Provider,{value:t,...n});var Lt=require("react");var B=()=>{let t=(0,Lt.useContext)(W);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};var bt=require("react"),G=(0,bt.createContext)(null);var wt=require("react"),ot=()=>{let t=(0,wt.useContext)(G);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};var K=require("react");var U=require("react/jsx-runtime"),V=({depth:t=0})=>{let n=w(),e=B(),s=j(),o=ot(),c=`_Z.${o.id}.pending`,[r,i]=(0,K.useState)(!!o?.beforeLoad&&o?.getState(c)!==!1);if((0,K.useEffect)(()=>{!o||t>=s.matches.length||r&&o?.beforeLoad&&(o.setState(c,!0),o.beforeLoad({location:e}).catch(({cause:R})=>{"to"in R&&n.navigate(R)}).finally(()=>{o.setState(c,!1),i(!1)}))},[]),!o)return null;if(t>=s.matches.length){let R=o.notFoundComponent;return(0,U.jsx)(R,{})}if(r){let R=o.pendingComponent;return(0,U.jsx)(R,{})}let u=o.component;return u?(0,U.jsx)(u,{}):(0,U.jsx)(et,{})};var St=require("react");var Ot=require("react"),I=(0,Ot.createContext)(null);var X=()=>{let t=(0,St.useContext)(I);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};var nt=require("react"),rt=require("react/jsx-runtime"),Z=({route:t,...n})=>{if(!t)return(0,rt.jsx)(G.Provider,{value:null,...n});let{state:e,getRouteState:s,setRouteState:o}=X(),c=(0,nt.useCallback)(i=>s(t.id,i),[s,t.id]),r=(0,nt.useCallback)((i,u)=>{o(t.id,i,u)},[o,t.id]);return(0,rt.jsx)(G.Provider,{value:{...t,state:e[t.id],getState:c,setState:r},...n})};var z=require("react/jsx-runtime"),et=()=>{let t=j(),n=xt()+1;return(0,z.jsx)(Pt,{depth:n,children:(0,z.jsx)(Z,{route:t.matches.at(n),children:(0,z.jsx)(V,{depth:n})})})};var y=require("react");var Tt={defaultTransitionDuration:300};var Yt=300,_t=t=>new Error("",{cause:t}),Mt=(t,n)=>{try{let e,s;if(n.startsWith("http://")||n.startsWith("https://")){let l=new URL(n);e=l.pathname,s=l.searchParams}else{let[l,m]=n.split("?");if(!l)return null;e=l,s=new URLSearchParams(m||"")}let o=e.replaceAll(/^\/|\/$/g,""),c=t.replaceAll(/^\/|\/$/g,""),r=o.split("/"),i=c.split("/");if(r.length!==i.length)return null;let u={};for(let l=0;l<i.length;l++){let m=i[l],L=r[l];if(m.startsWith(":")){let S=m.slice(1);u[S]=decodeURIComponent(L)}else if(m!==L)return null}let R=Object.fromEntries(s.entries());return{params:u,query:R}}catch{return null}},it=(t,n)=>{let e=(s,{children:o})=>{if(o&&o.length>0){for(let r of o){let i=e([...s,r],r);if(i)return i}return null}let c=Mt(At(s),n);return c?{matches:s,...c}:null};return e([t],t)||{matches:[],params:{},query:{}}},At=t=>{let n=[];for(let e of t)e.pathname!==void 0&&n.push(e.pathname.replaceAll(/^\/|\/$/g,""));return"/"+n.join("/")},st=({href:t,pathname:n,search:e})=>({index:0,href:t,state:{index:0},pathname:n,search:Object.fromEntries(new URLSearchParams(e))}),Kt=t=>({...Tt,...t}),at=t=>{let n=(e,s)=>{let o=e.name??(e.pathname?`${s}/${e.pathname.replaceAll(/^\/|\/$/g,"")}`:s);return{...e,id:o,children:e.children?.map(r=>n(r,o))}};return n(t,"")},kt=t=>t.length>0,ct=(t,n)=>{let e=t.split("/").filter(kt),s=n.split("/").filter(kt);for(let o of s)o!=="."&&(o===".."?e.pop():e.push(o));return"/"+e.join("/")};var ut=require("react/jsx-runtime"),Vt=({options:t,...n})=>{let[e,s]=(0,y.useState)([st(window.location)]),[o,c]=(0,y.useState)(0),r=e.at(o),[i,u]=(0,y.useState)(!1),[R,l]=(0,y.useState)(0),[m,L]=(0,y.useState)();(0,y.useEffect)(()=>{window.history.replaceState(r.state,"",r.pathname)},[]),(0,y.useEffect)(()=>{let p=({state:d})=>{c(d?.index)};return addEventListener("popstate",p),()=>{removeEventListener("popstate",p)}},[o]);let S=(0,y.useCallback)(({to:p,replace:d})=>{if(!p)return r;let h=d?o:o+1,g=p.startsWith("/")?p:ct(r.pathname,p),P={index:h};return{index:h,href:origin+g,search:{},state:P,pathname:g}},[o,r]),M=(p,d=t.defaultTransitionDuration,h)=>{u(!0),l(d),L(p),setTimeout(()=>{u(!1),L(void 0),h?.()},d)},b=(0,y.useCallback)(({to:p,replace:d,transition:h,duration:g,onFinish:P})=>{if(i)return;let x=d?o:o+1,f=S({to:p,replace:d}),F=()=>{d?(s(T=>[...T.slice(0,x),f,...T.slice(x+1)]),window.history.replaceState(f.state,"",f.pathname)):(s(T=>[...T.slice(0,x),f]),c(x),window.history.pushState(f.state,"",f.pathname)),P?.()};h??t.defaultUseTransition?.(r,f)?M(f,g,F):F()},[o,e,i,t]),q=(0,y.useCallback)(({transition:p,duration:d,onFinish:h,depth:g}={})=>{if(o===0||i)return;let P=g??1,x=e.at(o-P),f=()=>{window.history.go(-P),h?.()};x&&(p??t.defaultUseTransition?.(r,x))?M(x,d,f):f()},[o,e,i,t]),O=(0,y.useCallback)(({transition:p,duration:d,depth:h,onFinish:g}={})=>{if(o+1>=e.length||i)return;let P=h??1,x=e.at(o+P),f=()=>{window.history.go(P),g?.()};x&&(p??t.defaultUseTransition?.(r,x))?M(x,d,f):f()},[o,e,i,t]),E=(0,y.useCallback)((p,d)=>{s(h=>h.map(g=>g.index===p?{...g,state:d}:g)),p===o&&window.history.replaceState(d,"",r.pathname)},[o]);return(0,ut.jsx)($.Provider,{value:{options:t,history:e,location:r,canGoBack:o>0,canGoForward:o<e.length-1,isTransitioning:i,transitionDuration:R,transitioningToLocation:m,buildLocation:S,navigate:b,back:q,forward:O,setLocationState:E},children:(0,ut.jsx)(D,{location:r,...n})})};var v=require("react");var J=require("react/jsx-runtime"),Q=()=>{let t=X(),n=B(),e=it(t,n.pathname);return(0,J.jsx)(_.Provider,{value:e,children:(0,J.jsx)(Z,{route:t,children:(0,J.jsx)(V,{})})})};var H=require("react"),Dt=require("react/jsx-runtime"),Nt=({rootRoute:t,...n})=>{let e=at(t),[s,o]=(0,H.useState)({}),c=(0,H.useCallback)((i,u)=>s[i]?.[u],[s]),r=(0,H.useCallback)((i,u,R)=>{o(l=>({...l,[i]:{...l[i],[u]:R}}))},[]);return(0,Dt.jsx)(I.Provider,{value:{...e,state:s,getRouteState:c,setRouteState:r},...n})};var C=require("react/jsx-runtime"),Zt=({style:t,...n})=>{let{history:e,location:s,canGoBack:o,canGoForward:c,isTransitioning:r,transitioningToLocation:i,transitionDuration:u,back:R,forward:l}=w(),m=s.index,L=(0,v.useRef)(!1),S=(0,v.useRef)(0),M=(0,v.useRef)(0),[b,q]=(0,v.useState)(!1),[O,E]=(0,v.useState)(0),[p,d]=(0,v.useState)(!1),[h,g]=(0,v.useState)(!1),[P,x]=(0,v.useState)(!1),[f,F]=(0,v.useState)(!1);if((0,v.useEffect)(()=>{!r||!i||(F(!0),setTimeout(()=>{F(!1)},u))},[r,i,u]),m===void 0)return;let T=()=>{q(!1),E(0),d(!1),g(!1),x(!1)},Et=k=>{r||!c&&!o||(L.current=!0,S.current=k.touches[0].clientX,M.current=k.touches[0].clientY)},Ft=k=>{if(!L.current)return;let{clientX:Wt,clientY:jt}=k.touches[0];if(!b&&Math.abs(jt-M.current)>30){L.current=!1;return}let A=Wt-S.current;if(!(Math.abs(A)<10)){if(b||q(!0),A>0&&m===0||A<0&&m+1===e.length){E(0);return}!p&&A<0&&d(!0),!h&&A>0&&g(!0),E(Math.max(Math.min(A,window.innerWidth),-window.innerWidth))}},$t=(0,v.useCallback)(()=>{if(L.current=!1,!b)return;let k={onFinish:T};O>innerWidth*.3&&o?R(k):O<-innerWidth*.3&&c?l(k):(x(!0),setTimeout(T,u))},[R,l,b,O,o,c,u]);return(0,C.jsxs)("div",{style:{position:"relative",overflow:"hidden",...t},...n,children:[m>=1&&(b&&h||r&&i.index<m)&&(0,C.jsx)("div",{style:{position:"absolute",inset:0},children:(0,C.jsx)(D,{location:e.at(m-1),children:(0,C.jsx)(Q,{},m-1)})}),(0,C.jsx)("div",{style:{background:"white",position:"absolute",inset:0,transform:r&&i.index<m?"translateX(100%)":b&&O>0&&!P?`translateX(${O}px)`:"translateX(0px)",transition:P||r&&i.index<m?`transform ${u}ms ease-out`:""},onTouchStart:Et,onTouchMove:Ft,onTouchEnd:$t,children:(0,C.jsx)(Q,{})},m),(b&&p||r&&m<=i.index)&&(0,C.jsx)("div",{style:{background:"white",position:"absolute",inset:0,transform:`translateX(${f?"0px":r||P?"100%":`${innerWidth+O}px`})`,transition:`transform ${r||P?u:0}ms ease-in`},children:(0,C.jsx)(D,{location:r?i:e.at(m+1),children:(0,C.jsx)(Q,{},i?.index)})})]})},zt=({rootRoute:t,...n})=>(0,C.jsx)(Nt,{rootRoute:t,children:(0,C.jsx)(Zt,{...n})});0&&(module.exports={DefaultTransitionDuration,Link,LocationContext,LocationProvider,Outlet,RootRouteContext,RouterContext,RouterProvider,Stack,buildPathnameFromMatches,createRouterOptions,matchPattern,matchRoute,parseLocation,parseRoute,redirect,resolveRelativePathname,useLocation,useRootRoute,useRoute,useRouteMatch,useRouter});
1
+ "use strict";var tt=Object.defineProperty;var Bt=Object.getOwnPropertyDescriptor;var Gt=Object.getOwnPropertyNames;var Ut=Object.prototype.hasOwnProperty;var It=(t,n)=>{for(var e in n)tt(t,e,{get:n[e],enumerable:!0})},Xt=(t,n,e,s)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of Gt(n))!Ut.call(t,o)&&o!==e&&tt(t,o,{get:()=>n[o],enumerable:!(s=Bt(n,o))||s.enumerable});return t};var Ht=t=>Xt(tt({},"__esModule",{value:!0}),t);var Jt={};It(Jt,{DefaultTransitionDuration:()=>Yt,Link:()=>qt,LocationContext:()=>W,LocationProvider:()=>D,Outlet:()=>et,RootRouteContext:()=>I,RouterContext:()=>$,RouterProvider:()=>Vt,Stack:()=>zt,buildPathnameFromMatches:()=>At,createRouterOptions:()=>Kt,matchPattern:()=>Mt,matchRoute:()=>it,parseLocation:()=>st,parseRoute:()=>at,redirect:()=>_t,resolveRelativePathname:()=>ct,useLocation:()=>B,useRootRoute:()=>X,useRoute:()=>ot,useRouteMatch:()=>j,useRouter:()=>w});module.exports=Ht(Jt);var mt=require("react");var pt=require("react"),$=(0,pt.createContext)(null);var w=()=>{let t=(0,mt.useContext)($);if(t===null)throw new Error("useRouter must be used within a Stack");return t};var dt=require("react"),lt=require("react/jsx-runtime"),qt=(0,dt.memo)(({to:t,replace:n,transition:e,duration:s,onFinish:o,...c})=>{let r=w();return(0,lt.jsx)("a",{...c,href:t,onClick:i=>{i.preventDefault(),r.navigate({to:t,replace:n,transition:e,duration:s,onFinish:o})}})});var ft=require("react"),W=(0,ft.createContext)(null);var N=require("react"),Rt=require("react/jsx-runtime"),D=(0,N.memo)(({location:t,...n})=>{let e=w(),s=(0,N.useCallback)(r=>t.state[r],[t]),o=(0,N.useCallback)((r,i)=>{e.setLocationState(t.index,{...t.state,[r]:i})},[e,t]),c=(0,N.useCallback)(r=>{delete t.state[r],e.setLocationState(t.index,t.state)},[e,t]);return(0,Rt.jsx)(W.Provider,{value:{...t,canGoBack:t.index>0,canGoForward:t.index<e.history.length-1,getState:s,setState:o,deleteState:c},...n})},(t,n)=>t.location===n.location);var ht=require("react"),Y=(0,ht.createContext)(0);var gt=require("react"),xt=()=>(0,gt.useContext)(Y);var yt=require("react"),_=(0,yt.createContext)(null);var vt=require("react"),j=()=>{let t=(0,vt.useContext)(_);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};var Ct=require("react/jsx-runtime"),Pt=({depth:t,...n})=>(0,Ct.jsx)(Y.Provider,{value:t,...n});var Lt=require("react");var B=()=>{let t=(0,Lt.useContext)(W);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};var bt=require("react"),G=(0,bt.createContext)(null);var wt=require("react"),ot=()=>{let t=(0,wt.useContext)(G);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};var K=require("react");var U=require("react/jsx-runtime"),V=({depth:t=0})=>{let n=w(),e=B(),s=j(),o=ot(),c=`_Z.${o.id}.pending`,[r,i]=(0,K.useState)(!!o?.beforeLoad&&o?.getState(c)!==!1);if((0,K.useEffect)(()=>{!o||t>=s.matches.length||r&&o?.beforeLoad&&o.getState(c)!==!0&&(o.setState(c,!0),o.beforeLoad({location:e}).catch(({cause:R})=>{"to"in R&&n.navigate(R)}).finally(()=>{o.setState(c,!1),i(!1)}))},[o]),!o)return null;if(t>=s.matches.length){let R=o.notFoundComponent;return(0,U.jsx)(R,{})}if(r){let R=o.pendingComponent;return(0,U.jsx)(R,{})}let u=o.component;return u?(0,U.jsx)(u,{}):(0,U.jsx)(et,{})};var St=require("react");var Ot=require("react"),I=(0,Ot.createContext)(null);var X=()=>{let t=(0,St.useContext)(I);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};var nt=require("react"),rt=require("react/jsx-runtime"),Z=({route:t,...n})=>{if(!t)return(0,rt.jsx)(G.Provider,{value:null,...n});let{state:e,getRouteState:s,setRouteState:o}=X(),c=(0,nt.useCallback)(i=>s(t.id,i),[s,t.id]),r=(0,nt.useCallback)((i,u)=>{o(t.id,i,u)},[o,t.id]);return(0,rt.jsx)(G.Provider,{value:{...t,state:e[t.id],getState:c,setState:r},...n})};var z=require("react/jsx-runtime"),et=()=>{let t=j(),n=xt()+1;return(0,z.jsx)(Pt,{depth:n,children:(0,z.jsx)(Z,{route:t.matches.at(n),children:(0,z.jsx)(V,{depth:n})})})};var y=require("react");var Tt={defaultTransitionDuration:300};var Yt=300,_t=t=>new Error("",{cause:t}),Mt=(t,n)=>{try{let e,s;if(n.startsWith("http://")||n.startsWith("https://")){let l=new URL(n);e=l.pathname,s=l.searchParams}else{let[l,m]=n.split("?");if(!l)return null;e=l,s=new URLSearchParams(m||"")}let o=e.replaceAll(/^\/|\/$/g,""),c=t.replaceAll(/^\/|\/$/g,""),r=o.split("/"),i=c.split("/");if(r.length!==i.length)return null;let u={};for(let l=0;l<i.length;l++){let m=i[l],L=r[l];if(m.startsWith(":")){let S=m.slice(1);u[S]=decodeURIComponent(L)}else if(m!==L)return null}let R=Object.fromEntries(s.entries());return{params:u,query:R}}catch{return null}},it=(t,n)=>{let e=(s,{children:o})=>{if(o&&o.length>0){for(let r of o){let i=e([...s,r],r);if(i)return i}return null}let c=Mt(At(s),n);return c?{matches:s,...c}:null};return e([t],t)||{matches:[],params:{},query:{}}},At=t=>{let n=[];for(let e of t)e.pathname!==void 0&&n.push(e.pathname.replaceAll(/^\/|\/$/g,""));return"/"+n.join("/")},st=({href:t,pathname:n,search:e})=>({index:0,href:t,state:{index:0},pathname:n,search:Object.fromEntries(new URLSearchParams(e))}),Kt=t=>({...Tt,...t}),at=t=>{let n=(e,s)=>{let o=e.name??(e.pathname?`${s}/${e.pathname.replaceAll(/^\/|\/$/g,"")}`:s);return{...e,id:o,children:e.children?.map(r=>n(r,o))}};return n(t,"")},kt=t=>t.length>0,ct=(t,n)=>{let e=t.split("/").filter(kt),s=n.split("/").filter(kt);for(let o of s)o!=="."&&(o===".."?e.pop():e.push(o));return"/"+e.join("/")};var ut=require("react/jsx-runtime"),Vt=({options:t,...n})=>{let[e,s]=(0,y.useState)([st(window.location)]),[o,c]=(0,y.useState)(0),r=e.at(o),[i,u]=(0,y.useState)(!1),[R,l]=(0,y.useState)(0),[m,L]=(0,y.useState)();(0,y.useEffect)(()=>{window.history.replaceState(r.state,"",r.pathname)},[]),(0,y.useEffect)(()=>{let p=({state:d})=>{c(d?.index)};return addEventListener("popstate",p),()=>{removeEventListener("popstate",p)}},[o]);let S=(0,y.useCallback)(({to:p,replace:d})=>{if(!p)return r;let h=d?o:o+1,g=p.startsWith("/")?p:ct(r.pathname,p),P={index:h};return{index:h,href:origin+g,search:{},state:P,pathname:g}},[o,r]),M=(p,d=t.defaultTransitionDuration,h)=>{u(!0),l(d),L(p),setTimeout(()=>{u(!1),L(void 0),h?.()},d)},b=(0,y.useCallback)(({to:p,replace:d,transition:h,duration:g,onFinish:P})=>{if(i)return;let x=d?o:o+1,f=S({to:p,replace:d}),F=()=>{d?(s(T=>[...T.slice(0,x),f,...T.slice(x+1)]),window.history.replaceState(f.state,"",f.pathname)):(s(T=>[...T.slice(0,x),f]),c(x),window.history.pushState(f.state,"",f.pathname)),P?.()};h??t.defaultUseTransition?.(r,f)?M(f,g,F):F()},[o,e,i,t]),q=(0,y.useCallback)(({transition:p,duration:d,onFinish:h,depth:g}={})=>{if(o===0||i)return;let P=g??1,x=e.at(o-P),f=()=>{window.history.go(-P),h?.()};x&&(p??t.defaultUseTransition?.(r,x))?M(x,d,f):f()},[o,e,i,t]),O=(0,y.useCallback)(({transition:p,duration:d,depth:h,onFinish:g}={})=>{if(o+1>=e.length||i)return;let P=h??1,x=e.at(o+P),f=()=>{window.history.go(P),g?.()};x&&(p??t.defaultUseTransition?.(r,x))?M(x,d,f):f()},[o,e,i,t]),E=(0,y.useCallback)((p,d)=>{s(h=>h.map(g=>g.index===p?{...g,state:d}:g)),p===o&&window.history.replaceState(d,"",r.pathname)},[o]);return(0,ut.jsx)($.Provider,{value:{options:t,history:e,location:r,canGoBack:o>0,canGoForward:o<e.length-1,isTransitioning:i,transitionDuration:R,transitioningToLocation:m,buildLocation:S,navigate:b,back:q,forward:O,setLocationState:E},children:(0,ut.jsx)(D,{location:r,...n})})};var v=require("react");var J=require("react/jsx-runtime"),Q=()=>{let t=X(),n=B(),e=it(t,n.pathname);return(0,J.jsx)(_.Provider,{value:e,children:(0,J.jsx)(Z,{route:t,children:(0,J.jsx)(V,{})})})};var H=require("react"),Dt=require("react/jsx-runtime"),Nt=({rootRoute:t,...n})=>{let e=at(t),[s,o]=(0,H.useState)({}),c=(0,H.useCallback)((i,u)=>s[i]?.[u],[s]),r=(0,H.useCallback)((i,u,R)=>{o(l=>({...l,[i]:{...l[i],[u]:R}}))},[]);return(0,Dt.jsx)(I.Provider,{value:{...e,state:s,getRouteState:c,setRouteState:r},...n})};var C=require("react/jsx-runtime"),Zt=({style:t,...n})=>{let{history:e,location:s,canGoBack:o,canGoForward:c,isTransitioning:r,transitioningToLocation:i,transitionDuration:u,back:R,forward:l}=w(),m=s.index,L=(0,v.useRef)(!1),S=(0,v.useRef)(0),M=(0,v.useRef)(0),[b,q]=(0,v.useState)(!1),[O,E]=(0,v.useState)(0),[p,d]=(0,v.useState)(!1),[h,g]=(0,v.useState)(!1),[P,x]=(0,v.useState)(!1),[f,F]=(0,v.useState)(!1);if((0,v.useEffect)(()=>{!r||!i||(F(!0),setTimeout(()=>{F(!1)},u))},[r,i,u]),m===void 0)return;let T=()=>{q(!1),E(0),d(!1),g(!1),x(!1)},Et=k=>{r||!c&&!o||(L.current=!0,S.current=k.touches[0].clientX,M.current=k.touches[0].clientY)},Ft=k=>{if(!L.current)return;let{clientX:Wt,clientY:jt}=k.touches[0];if(!b&&Math.abs(jt-M.current)>30){L.current=!1;return}let A=Wt-S.current;if(!(Math.abs(A)<10)){if(b||q(!0),A>0&&m===0||A<0&&m+1===e.length){E(0);return}!p&&A<0&&d(!0),!h&&A>0&&g(!0),E(Math.max(Math.min(A,window.innerWidth),-window.innerWidth))}},$t=(0,v.useCallback)(()=>{if(L.current=!1,!b)return;let k={onFinish:T};O>innerWidth*.3&&o?R(k):O<-innerWidth*.3&&c?l(k):(x(!0),setTimeout(T,u))},[R,l,b,O,o,c,u]);return(0,C.jsxs)("div",{style:{position:"relative",overflow:"hidden",...t},...n,children:[m>=1&&(b&&h||r&&i.index<m)&&(0,C.jsx)("div",{style:{position:"absolute",inset:0},children:(0,C.jsx)(D,{location:e.at(m-1),children:(0,C.jsx)(Q,{},m-1)})}),(0,C.jsx)("div",{style:{background:"white",position:"absolute",inset:0,transform:r&&i.index<m?"translateX(100%)":b&&O>0&&!P?`translateX(${O}px)`:"translateX(0px)",transition:P||r&&i.index<m?`transform ${u}ms ease-out`:""},onTouchStart:Et,onTouchMove:Ft,onTouchEnd:$t,children:(0,C.jsx)(Q,{})},m),(b&&p||r&&m<=i.index)&&(0,C.jsx)("div",{style:{background:"white",position:"absolute",inset:0,transform:`translateX(${f?"0px":r||P?"100%":`${innerWidth+O}px`})`,transition:`transform ${r||P?u:0}ms ease-in`},children:(0,C.jsx)(D,{location:r?i:e.at(m+1),children:(0,C.jsx)(Q,{},i?.index)})})]})},zt=({rootRoute:t,...n})=>(0,C.jsx)(Nt,{rootRoute:t,children:(0,C.jsx)(Zt,{...n})});0&&(module.exports={DefaultTransitionDuration,Link,LocationContext,LocationProvider,Outlet,RootRouteContext,RouterContext,RouterProvider,Stack,buildPathnameFromMatches,createRouterOptions,matchPattern,matchRoute,parseLocation,parseRoute,redirect,resolveRelativePathname,useLocation,useRootRoute,useRoute,useRouteMatch,useRouter});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/hooks/useRouter.ts","../src/context/router-context.ts","../src/components/link.tsx","../src/context/location-context.ts","../src/components/location-provider.tsx","../src/context/outlet-context.ts","../src/hooks/useOutlet.ts","../src/context/route-match-context.ts","../src/hooks/useRouteMatch.ts","../src/components/outlet-provider.tsx","../src/hooks/useLocation.ts","../src/context/route-context.ts","../src/hooks/useRoute.ts","../src/components/route-component.tsx","../src/hooks/useRootRoute.ts","../src/context/root-route-context.ts","../src/components/route-provider.tsx","../src/components/outlet.tsx","../src/components/router-provider.tsx","../src/constants.ts","../src/utils.ts","../src/components/stack.tsx","../src/components/page-renderer.tsx","../src/components/root-route-provider.tsx"],"sourcesContent":["export * from \"./components/index.js\";\nexport * from \"./context/index.js\";\nexport * from \"./hooks/index.js\";\nexport * from \"./types.d.js\";\nexport * from \"./utils.js\";\n","import { useContext } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\n\nexport const useRouter = () => {\n const router = useContext(RouterContext);\n if (router === null) {\n throw new Error(\"useRouter must be used within a Stack\");\n }\n return router;\n};\n","import { createContext } from \"react\";\n\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n} from \"@/types.js\";\n\nexport interface RouterContextType {\n // Router Config\n options: RouterOptions;\n\n // Navigation State\n history: Location[];\n location: Location;\n canGoBack: boolean;\n canGoForward: boolean;\n\n // Transition state\n isTransitioning: boolean;\n transitionDuration: number;\n transitioningToLocation?: Location;\n\n // Utilities\n buildLocation: (to: NavigationOptions) => Location;\n\n // Navigation Actions\n navigate: (options: NavigateActionOptions) => void;\n back: (options?: BackActionOptions) => void;\n forward: (options?: ForwardActionOptions) => void;\n\n // Low-level state action\n setLocationState: (index: number, state: Record<string, any>) => void;\n}\n\nexport const RouterContext = createContext<RouterContextType | null>(null);\n","import { useRouter } from \"@/hooks/useRouter.js\";\nimport type { NavigateActionOptions } from \"@/types.js\";\nimport { memo } from \"react\";\n\nexport type LinkProps = React.ComponentPropsWithoutRef<\"a\"> &\n NavigateActionOptions;\n\nexport const Link: React.FC<LinkProps> = memo(\n ({ to, replace, transition, duration, onFinish, ...props }) => {\n const router = useRouter();\n return (\n <a\n {...props}\n href={to}\n onClick={(e) => {\n e.preventDefault();\n router.navigate({ to, replace, transition, duration, onFinish });\n }}\n />\n );\n }\n);\n","import { createContext } from \"react\";\n\nimport type { Location } from \"@/types.js\";\n\nexport interface LocationContextType extends Location {\n canGoBack: boolean;\n canGoForward: boolean;\n getState: (key: string) => any;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n}\n\nexport const LocationContext = createContext<LocationContextType | null>(null);\n","import { LocationContext } from \"@/context/location-context.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Location } from \"@/types.js\";\nimport { memo, useCallback } from \"react\";\n\nexport const LocationProvider = memo(\n ({\n location,\n ...props\n }: {\n location: Location;\n children: React.ReactNode;\n }) => {\n const router = useRouter();\n const getState = useCallback(\n (key: string) => {\n return location.state[key];\n },\n [location]\n );\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, {\n ...location.state,\n [key]: value,\n });\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n delete location.state[key];\n router.setLocationState(location.index, location.state);\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: location.index > 0,\n canGoForward: location.index < router.history.length - 1,\n getState,\n setState,\n deleteState,\n }}\n {...props}\n />\n );\n },\n (a, b) => a.location === b.location\n);\n","import { createContext } from \"react\";\n\nexport const OutletContext = createContext<number>(0);\n","import { OutletContext } from \"@/context/outlet-context.js\";\nimport { useContext } from \"react\";\n\nexport const useOutlet = () => useContext(OutletContext);\n","import type { RouteMatch } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport const RouteMatchContext = createContext<RouteMatch | null>(null);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRouteMatch = () => {\n const routeMatch = useContext(RouteMatchContext);\n if (routeMatch === null) {\n throw new Error(\"useRouteMatch must be used within a RouteMatchProvider\");\n }\n return routeMatch;\n};\n","import { OutletContext } from \"@/context/outlet-context.js\";\n\nexport const OutletProvider = ({\n depth,\n ...props\n}: {\n depth: number;\n children?: React.ReactNode;\n}) => <OutletContext.Provider value={depth} {...props} />;\n","import { useContext } from \"react\";\n\nimport { LocationContext } from \"@/context/location-context.js\";\n\nexport const useLocation = () => {\n const context = useContext(LocationContext);\n if (context === null) {\n throw new Error(\"useLocation must be used within a LocationProvider\");\n }\n return context;\n};\n","import type { ParsedRoute } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport interface RouteContextType extends ParsedRoute {\n state: Record<string, any>;\n getState: (key: string) => any;\n setState: (key: string, value: any) => void;\n}\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRoute = () => {\n const route = useContext(RouteContext);\n if (route === null) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n return route;\n};\n","import { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRoute } from \"@/hooks/useRoute.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport { useEffect, useState } from \"react\";\nimport { Outlet } from \"./outlet.js\";\n\nexport const RouteComponent = ({ depth = 0 }: { depth?: number }) => {\n const router = useRouter();\n const location = useLocation();\n const routeMatch = useRouteMatch();\n const route = useRoute();\n\n const pendingStateKey = `_Z.${route.id}.pending`;\n\n const [pending, setPending] = useState(\n !!route?.beforeLoad && route?.getState(pendingStateKey) !== false\n );\n\n useEffect(() => {\n if (!route || depth >= routeMatch.matches.length) {\n return;\n }\n if (pending && route?.beforeLoad) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad({ location })\n .catch(({ cause }: Error) => {\n if (\"to\" in (cause as any)) {\n router.navigate(cause as any);\n }\n })\n .finally(() => {\n route.setState(pendingStateKey, false);\n setPending(false);\n });\n }\n }, []);\n\n if (!route) {\n return null;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n const Component = route.component;\n return Component ? <Component /> : <Outlet />;\n};\n","import { useContext } from \"react\";\n\nimport { RootRouteContext } from \"@/context/root-route-context.js\";\n\nexport const useRootRoute = () => {\n const route = useContext(RootRouteContext);\n if (route === null) {\n throw new Error(\"useRootRoute must be used within a RootRouteProvider\");\n }\n return route;\n};\n","import { createContext } from \"react\";\n\nimport type { ParsedRoute } from \"@/types.js\";\n\nexport interface RootRouteContextType extends ParsedRoute {\n state: Record<string, Record<string, any>>;\n getRouteState: (id: string, key: string) => any;\n setRouteState: (id: string, key: string, value: any) => void;\n}\n\nexport const RootRouteContext = createContext<RootRouteContextType | null>(\n null\n);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport type { ParsedRoute } from \"@/types.js\";\nimport { useCallback } from \"react\";\n\nexport const RouteProvider = ({\n route,\n ...props\n}: {\n route?: ParsedRoute;\n children?: React.ReactNode;\n}) => {\n if (!route) {\n return <RouteContext.Provider value={null} {...props} />;\n }\n\n const { state, getRouteState, setRouteState } = useRootRoute();\n\n const getState = useCallback(\n (key: string) => getRouteState(route.id, key),\n [getRouteState, route.id]\n );\n\n const setState = useCallback(\n (key: string, value: any) => {\n setRouteState(route.id, key, value);\n },\n [setRouteState, route.id]\n );\n\n return (\n <RouteContext.Provider\n value={{ ...route, state: state[route.id], getState, setState }}\n {...props}\n />\n );\n};\n","import { useOutlet } from \"@/hooks/useOutlet.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { OutletProvider } from \"./outlet-provider.js\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const Outlet = () => {\n const routeMatch = useRouteMatch();\n const depth = useOutlet() + 1;\n return (\n <OutletProvider depth={depth}>\n <RouteProvider route={routeMatch.matches.at(depth)}>\n <RouteComponent depth={depth} />\n </RouteProvider>\n </OutletProvider>\n );\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n} from \"@/types.js\";\nimport { parseLocation, resolveRelativePathname } from \"@/utils.js\";\nimport { LocationProvider } from \"./location-provider.js\";\n\nexport const RouterProvider = ({\n options,\n ...props\n}: {\n options: RouterOptions;\n children: React.ReactNode;\n}) => {\n const [history, setHistory] = useState<Location[]>([\n parseLocation(window.location),\n ]);\n const [currentLocationIndex, setCurrentLocationIndex] = useState<number>(0);\n const location = history.at(currentLocationIndex)!;\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n\n useEffect(() => {\n window.history.replaceState(location.state, \"\", location.pathname);\n }, []);\n\n useEffect(() => {\n const handlePopState = ({ state }: PopStateEvent) => {\n setCurrentLocationIndex(state?.index);\n };\n\n addEventListener(\"popstate\", handlePopState);\n return () => {\n removeEventListener(\"popstate\", handlePopState);\n };\n }, [currentLocationIndex]);\n\n // Utilities\n const buildLocation = useCallback(\n ({ to, replace }: NavigationOptions): Location => {\n if (!to) return location;\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n\n // Resolve to with absolute or relative paths like \"..\" or \".\"\n const pathname = to.startsWith(\"/\")\n ? to\n : resolveRelativePathname(location.pathname, to);\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname,\n search: {},\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transition,\n duration,\n onFinish,\n }: NavigateActionOptions) => {\n if (isTransitioning) return;\n\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n const newLocation = buildLocation({ to, replace });\n\n const updateHistory = () => {\n if (replace) {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ...prevHistory.slice(index + 1),\n ]);\n window.history.replaceState(\n newLocation.state,\n \"\",\n newLocation.pathname\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(newLocation.state, \"\", newLocation.pathname);\n }\n onFinish?.();\n };\n\n if (transition ?? options.defaultUseTransition?.(location, newLocation)) {\n transitionTo(newLocation, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transition, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (currentLocationIndex === 0 || isTransitioning) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n if (\n newLocation &&\n (transition ?? options.defaultUseTransition?.(location, newLocation))\n ) {\n transitionTo(newLocation, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({ transition, duration, depth, onFinish }: ForwardActionOptions = {}) => {\n if (currentLocationIndex + 1 >= history.length || isTransitioning) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n\n if (\n newLocation &&\n (transition ?? options.defaultUseTransition?.(location, newLocation))\n ) {\n transitionTo(newLocation, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n // Low-level state action\n const setLocationState = useCallback(\n (index: number, state: Record<string, any>) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) =>\n location.index === index ? { ...location, state } : location\n )\n );\n if (index === currentLocationIndex) {\n window.history.replaceState(state, \"\", location.pathname);\n }\n },\n [currentLocationIndex]\n );\n\n return (\n <RouterContext.Provider\n // oxlint-disable-next-line jsx-no-new-object-as-prop\n value={{\n options,\n\n history,\n location,\n canGoBack: currentLocationIndex > 0,\n canGoForward: currentLocationIndex < history.length - 1,\n\n isTransitioning,\n transitionDuration,\n transitioningToLocation,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n }}\n >\n <LocationProvider location={location} {...props} />\n </RouterContext.Provider>\n );\n};\n","import type { RouterOptions } from \"./types.js\";\n\nexport const DefaultRouterOptions: RouterOptions = {\n defaultTransitionDuration: 300,\n};\n","import { DefaultRouterOptions } from \"./constants.js\";\nimport type {\n Location,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: { to: string; replace?: boolean }) => {\n return new Error(\"\", { cause: options });\n};\n\n/**\n * @param pattern pathname pattern like `/users/:id`. Leading and trailing slashes are optional.\n * @param url URL to match against the pattern. Can be href or pathname with query string.\n * @returns extracted params and query if matched, otherwise null\n */\nexport const matchPattern = (\n pattern: string,\n url: string\n): { params: Record<string, string>; query: Record<string, string> } | null => {\n try {\n // 解析 URL\n let pathname, searchParams;\n\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n searchParams = urlObj.searchParams;\n } else {\n // 處理相對路徑\n const [path, queryString] = url.split(\"?\");\n if (!path) {\n return null;\n }\n pathname = path;\n searchParams = new URLSearchParams(queryString || \"\");\n }\n\n // 移除路徑首尾的斜線以便比較\n const cleanPath = pathname.replaceAll(/^\\/|\\/$/g, \"\");\n const cleanPattern = pattern.replaceAll(/^\\/|\\/$/g, \"\");\n\n // 分割路徑段\n const pathSegments = cleanPath.split(\"/\");\n const patternSegments = cleanPattern.split(\"/\");\n\n // 路徑段數量不同則不匹配\n if (pathSegments.length !== patternSegments.length) {\n return null;\n }\n\n // 提取路徑參數\n const params: Record<string, string> = {};\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const pathSegment = pathSegments[i];\n\n if (patternSegment.startsWith(\":\")) {\n // 動態參數\n const paramName = patternSegment.slice(1);\n params[paramName] = decodeURIComponent(pathSegment);\n } else if (patternSegment !== pathSegment) {\n // 靜態段不匹配\n return null;\n }\n }\n\n // 提取查詢參數\n const query = Object.fromEntries(searchParams.entries());\n\n return { params, query };\n } catch {\n return null;\n }\n};\n\nexport const matchRoute = (route: ParsedRoute, url: string): RouteMatch => {\n const _matchRoute = (\n matches: ParsedRoute[],\n { children }: ParsedRoute\n ): RouteMatch | null => {\n if (children && children.length > 0) {\n for (const childRoute of children) {\n const matchesResult = _matchRoute([...matches, childRoute], childRoute);\n if (matchesResult) {\n return matchesResult;\n }\n }\n return null;\n }\n\n const result = matchPattern(buildPathnameFromMatches(matches), url);\n return result ? { matches, ...result } : null;\n };\n\n return (\n _matchRoute([route], route) || {\n matches: [],\n params: {},\n query: {},\n }\n );\n};\n\nexport const buildPathnameFromMatches = (matches: Route[]): string => {\n let cleanedPathnames: string[] = []; // pathnames without leading/trailing slashes\n for (const match of matches) {\n if (match.pathname === undefined) continue;\n cleanedPathnames.push(match.pathname.replaceAll(/^\\/|\\/$/g, \"\"));\n }\n return \"/\" + cleanedPathnames.join(\"/\");\n};\n\nexport const parseLocation = ({\n href,\n pathname,\n search,\n}: globalThis.Location): Location => ({\n index: 0,\n href,\n state: {\n index: 0,\n },\n pathname,\n search: Object.fromEntries(new URLSearchParams(search)),\n});\n\nexport const createRouterOptions = (\n options?: Partial<RouterOptions>\n): RouterOptions => ({\n ...DefaultRouterOptions,\n ...options,\n});\n\nexport const parseRoute = (route: Route): ParsedRoute => {\n const parseRouteRecursive = (route: Route, parentId: string): ParsedRoute => {\n const id =\n route.name ??\n (route.pathname\n ? `${parentId}/${route.pathname.replaceAll(/^\\/|\\/$/g, \"\")}`\n : parentId);\n\n const parsedRoute: ParsedRoute = {\n ...route,\n id,\n children: route.children?.map((child) => parseRouteRecursive(child, id)),\n };\n\n return parsedRoute;\n };\n return parseRouteRecursive(route, \"\");\n};\n\nconst isPathSegmentValid = (segment: string): boolean => segment.length > 0;\n\n/**\n * Resolves a relative path against a base pathname.\n * @param pathname The base pathname.\n * @param to The relative path to resolve.\n * @returns The resolved absolute pathname.\n */\nexport const resolveRelativePathname = (\n pathname: string,\n to: string\n): string => {\n const currentPathSegments = pathname.split(\"/\").filter(isPathSegmentValid);\n const toPathSegments = to.split(\"/\").filter(isPathSegmentValid);\n for (const segment of toPathSegments) {\n if (segment === \".\") {\n continue;\n } else if (segment === \"..\") {\n currentPathSegments.pop();\n } else {\n currentPathSegments.push(segment);\n }\n }\n return \"/\" + currentPathSegments.join(\"/\");\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Route } from \"@/types.js\";\n\nimport { LocationProvider } from \"./location-provider.js\";\nimport { PageRenderer } from \"./page-renderer.js\";\nimport { RootRouteProvider } from \"./root-route-provider.js\";\n\ntype StackComponentProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst StackComponent: React.FC<StackComponentProps> = ({ style, ...props }) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionDuration,\n back,\n forward,\n } = useRouter();\n const currentLocationIndex = location.index;\n\n const isTouching = useRef(false);\n const startX = useRef(0);\n const startY = useRef(0);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [draggedLeft, setDraggedLeft] = useState(false);\n const [draggedRight, setDraggedRight] = useState(false);\n const [isCanceling, setIsCanceling] = useState(false);\n const [isTransitionStarted, setIsTransitionStarted] = useState(false);\n\n useEffect(() => {\n if (!isTransitioning || !transitioningToLocation) return;\n setIsTransitionStarted(true);\n setTimeout(() => {\n setIsTransitionStarted(false);\n }, transitionDuration);\n }, [isTransitioning, transitioningToLocation, transitionDuration]);\n\n if (currentLocationIndex === undefined) return;\n\n const reset = () => {\n setIsDragging(false);\n setDragOffset(0);\n setDraggedLeft(false);\n setDraggedRight(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = (e: React.TouchEvent) => {\n if (isTransitioning || (!canGoForward && !canGoBack)) return;\n isTouching.current = true;\n startX.current = e.touches[0].clientX;\n startY.current = e.touches[0].clientY;\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!isTouching.current) return;\n // Skip vertical drag\n const { clientX, clientY } = e.touches[0];\n if (!isDragging && Math.abs(clientY - startY.current) > 30) {\n isTouching.current = false;\n return;\n }\n const offset = clientX - startX.current;\n if (Math.abs(offset) < 10) return;\n if (!isDragging) {\n setIsDragging(true);\n }\n if (\n (offset > 0 && currentLocationIndex === 0) ||\n (offset < 0 && currentLocationIndex + 1 === history.length)\n ) {\n setDragOffset(0);\n return;\n }\n if (!draggedLeft && offset < 0) setDraggedLeft(true);\n if (!draggedRight && offset > 0) setDraggedRight(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n };\n\n const handleTouchEnd = useCallback(() => {\n isTouching.current = false;\n if (!isDragging) return;\n\n const options = {\n onFinish: reset,\n };\n if (dragOffset > innerWidth * 0.3 && canGoBack) {\n back(options);\n } else if (dragOffset < -innerWidth * 0.3 && canGoForward) {\n forward(options);\n } else {\n setIsCanceling(true);\n setTimeout(reset, transitionDuration);\n }\n }, [\n back,\n forward,\n isDragging,\n dragOffset,\n canGoBack,\n canGoForward,\n transitionDuration,\n ]);\n\n return (\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n {currentLocationIndex >= 1 &&\n ((isDragging && draggedRight) ||\n (isTransitioning &&\n transitioningToLocation!.index < currentLocationIndex)) && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n }}\n >\n <LocationProvider location={history.at(currentLocationIndex - 1)!}>\n <PageRenderer key={currentLocationIndex - 1} />\n </LocationProvider>\n </div>\n )}\n <div\n key={currentLocationIndex}\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n transform:\n isTransitioning &&\n transitioningToLocation!.index < currentLocationIndex\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling ||\n (isTransitioning &&\n transitioningToLocation!.index < currentLocationIndex)\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n\n {((isDragging && draggedLeft) ||\n (isTransitioning &&\n currentLocationIndex <= transitioningToLocation!.index)) && (\n <div\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n transform: `translateX(${\n isTransitionStarted\n ? \"0px\"\n : isTransitioning || isCanceling\n ? \"100%\"\n : `${innerWidth + dragOffset}px`\n })`,\n transition: `transform ${\n isTransitioning || isCanceling ? transitionDuration : 0\n }ms ease-in`,\n }}\n >\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex + 1)!\n }\n >\n <PageRenderer key={transitioningToLocation?.index} />\n </LocationProvider>\n </div>\n )}\n </div>\n );\n};\n\nexport interface StackProps extends StackComponentProps {\n rootRoute: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ rootRoute, ...props }) => (\n <RootRouteProvider rootRoute={rootRoute}>\n <StackComponent {...props} />\n </RootRouteProvider>\n);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport { matchRoute } from \"@/utils.js\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = () => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = matchRoute(rootRoute, location.pathname);\n return (\n <RouteMatchContext.Provider value={routeMatch}>\n <RouteProvider route={rootRoute}>\n <RouteComponent />\n </RouteProvider>\n </RouteMatchContext.Provider>\n );\n};\n","import { RootRouteContext } from \"@/context/root-route-context.js\";\nimport type { Route } from \"@/types.js\";\nimport { parseRoute } from \"@/utils.js\";\nimport { useCallback, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n rootRoute,\n ...props\n}: {\n rootRoute: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = parseRoute(rootRoute);\n const [state, setState] = useState<Record<string, Record<string, any>>>({});\n\n const getRouteState = useCallback(\n (id: string, key: string) => {\n return state[id]?.[key];\n },\n [state]\n );\n\n const setRouteState = useCallback((id: string, key: string, value: any) => {\n setState((prevState) => ({\n ...prevState,\n [id]: {\n ...prevState[id],\n [key]: value,\n },\n }));\n }, []);\n\n return (\n <RootRouteContext.Provider\n value={{ ...parsedRoute, state, getRouteState, setRouteState }}\n {...props}\n />\n );\n};\n"],"mappings":"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","names":["index_exports","__export","DefaultTransitionDuration","Link","LocationContext","LocationProvider","Outlet","RootRouteContext","RouterContext","RouterProvider","Stack","buildPathnameFromMatches","createRouterOptions","matchPattern","matchRoute","parseLocation","parseRoute","redirect","resolveRelativePathname","useLocation","useRootRoute","useRoute","useRouteMatch","useRouter","__toCommonJS","import_react","import_react","RouterContext","useRouter","router","RouterContext","import_react","import_jsx_runtime","Link","to","replace","transition","duration","onFinish","props","router","useRouter","e","import_react","LocationContext","import_react","import_jsx_runtime","LocationProvider","location","props","router","useRouter","getState","key","setState","value","deleteState","LocationContext","a","b","import_react","OutletContext","import_react","useOutlet","OutletContext","import_react","RouteMatchContext","import_react","useRouteMatch","routeMatch","RouteMatchContext","import_jsx_runtime","OutletProvider","depth","props","OutletContext","import_react","useLocation","context","LocationContext","import_react","RouteContext","import_react","useRoute","route","RouteContext","import_react","import_jsx_runtime","RouteComponent","depth","router","useRouter","location","useLocation","routeMatch","useRouteMatch","route","useRoute","pendingStateKey","pending","setPending","cause","NotFoundComponent","PendingComponent","Component","Outlet","import_react","import_react","RootRouteContext","useRootRoute","route","RootRouteContext","import_react","import_jsx_runtime","RouteProvider","route","props","RouteContext","state","getRouteState","setRouteState","useRootRoute","getState","key","setState","value","import_jsx_runtime","Outlet","routeMatch","useRouteMatch","depth","useOutlet","OutletProvider","RouteProvider","RouteComponent","import_react","DefaultRouterOptions","DefaultTransitionDuration","redirect","options","matchPattern","pattern","url","pathname","searchParams","urlObj","path","queryString","cleanPath","cleanPattern","pathSegments","patternSegments","params","i","patternSegment","pathSegment","paramName","query","matchRoute","route","_matchRoute","matches","children","childRoute","matchesResult","result","buildPathnameFromMatches","cleanedPathnames","match","parseLocation","href","search","createRouterOptions","DefaultRouterOptions","parseRoute","parseRouteRecursive","parentId","id","child","isPathSegmentValid","segment","resolveRelativePathname","to","currentPathSegments","toPathSegments","import_jsx_runtime","RouterProvider","options","props","history","setHistory","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","isTransitioning","setIsTransitioning","transitionDuration","setTransitionDuration","transitioningToLocation","setTransitioningToLocation","handlePopState","state","buildLocation","to","replace","index","pathname","resolveRelativePathname","transitionTo","duration","callback","navigate","transition","onFinish","newLocation","updateHistory","prevHistory","back","depth","backDepth","forward","forwardDepth","setLocationState","RouterContext","LocationProvider","import_react","import_jsx_runtime","PageRenderer","rootRoute","useRootRoute","location","useLocation","routeMatch","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","import_react","import_jsx_runtime","RootRouteProvider","rootRoute","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","import_jsx_runtime","StackComponent","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","startX","startY","isDragging","setIsDragging","dragOffset","setDragOffset","draggedLeft","setDraggedLeft","draggedRight","setDraggedRight","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","reset","handleTouchStart","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","rootRoute","RootRouteProvider"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/hooks/useRouter.ts","../src/context/router-context.ts","../src/components/link.tsx","../src/context/location-context.ts","../src/components/location-provider.tsx","../src/context/outlet-context.ts","../src/hooks/useOutlet.ts","../src/context/route-match-context.ts","../src/hooks/useRouteMatch.ts","../src/components/outlet-provider.tsx","../src/hooks/useLocation.ts","../src/context/route-context.ts","../src/hooks/useRoute.ts","../src/components/route-component.tsx","../src/hooks/useRootRoute.ts","../src/context/root-route-context.ts","../src/components/route-provider.tsx","../src/components/outlet.tsx","../src/components/router-provider.tsx","../src/constants.ts","../src/utils.ts","../src/components/stack.tsx","../src/components/page-renderer.tsx","../src/components/root-route-provider.tsx"],"sourcesContent":["export * from \"./components/index.js\";\nexport * from \"./context/index.js\";\nexport * from \"./hooks/index.js\";\nexport * from \"./types.d.js\";\nexport * from \"./utils.js\";\n","import { useContext } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\n\nexport const useRouter = () => {\n const router = useContext(RouterContext);\n if (router === null) {\n throw new Error(\"useRouter must be used within a Stack\");\n }\n return router;\n};\n","import { createContext } from \"react\";\n\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n} from \"@/types.js\";\n\nexport interface RouterContextType {\n // Router Config\n options: RouterOptions;\n\n // Navigation State\n history: Location[];\n location: Location;\n canGoBack: boolean;\n canGoForward: boolean;\n\n // Transition state\n isTransitioning: boolean;\n transitionDuration: number;\n transitioningToLocation?: Location;\n\n // Utilities\n buildLocation: (to: NavigationOptions) => Location;\n\n // Navigation Actions\n navigate: (options: NavigateActionOptions) => void;\n back: (options?: BackActionOptions) => void;\n forward: (options?: ForwardActionOptions) => void;\n\n // Low-level state action\n setLocationState: (index: number, state: Record<string, any>) => void;\n}\n\nexport const RouterContext = createContext<RouterContextType | null>(null);\n","import { useRouter } from \"@/hooks/useRouter.js\";\nimport type { NavigateActionOptions } from \"@/types.js\";\nimport { memo } from \"react\";\n\nexport type LinkProps = React.ComponentPropsWithoutRef<\"a\"> &\n NavigateActionOptions;\n\nexport const Link: React.FC<LinkProps> = memo(\n ({ to, replace, transition, duration, onFinish, ...props }) => {\n const router = useRouter();\n return (\n <a\n {...props}\n href={to}\n onClick={(e) => {\n e.preventDefault();\n router.navigate({ to, replace, transition, duration, onFinish });\n }}\n />\n );\n }\n);\n","import { createContext } from \"react\";\n\nimport type { Location } from \"@/types.js\";\n\nexport interface LocationContextType extends Location {\n canGoBack: boolean;\n canGoForward: boolean;\n getState: (key: string) => any;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n}\n\nexport const LocationContext = createContext<LocationContextType | null>(null);\n","import { LocationContext } from \"@/context/location-context.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Location } from \"@/types.js\";\nimport { memo, useCallback } from \"react\";\n\nexport const LocationProvider = memo(\n ({\n location,\n ...props\n }: {\n location: Location;\n children: React.ReactNode;\n }) => {\n const router = useRouter();\n const getState = useCallback(\n (key: string) => {\n return location.state[key];\n },\n [location]\n );\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, {\n ...location.state,\n [key]: value,\n });\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n delete location.state[key];\n router.setLocationState(location.index, location.state);\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: location.index > 0,\n canGoForward: location.index < router.history.length - 1,\n getState,\n setState,\n deleteState,\n }}\n {...props}\n />\n );\n },\n (a, b) => a.location === b.location\n);\n","import { createContext } from \"react\";\n\nexport const OutletContext = createContext<number>(0);\n","import { OutletContext } from \"@/context/outlet-context.js\";\nimport { useContext } from \"react\";\n\nexport const useOutlet = () => useContext(OutletContext);\n","import type { RouteMatch } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport const RouteMatchContext = createContext<RouteMatch | null>(null);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRouteMatch = () => {\n const routeMatch = useContext(RouteMatchContext);\n if (routeMatch === null) {\n throw new Error(\"useRouteMatch must be used within a RouteMatchProvider\");\n }\n return routeMatch;\n};\n","import { OutletContext } from \"@/context/outlet-context.js\";\n\nexport const OutletProvider = ({\n depth,\n ...props\n}: {\n depth: number;\n children?: React.ReactNode;\n}) => <OutletContext.Provider value={depth} {...props} />;\n","import { useContext } from \"react\";\n\nimport { LocationContext } from \"@/context/location-context.js\";\n\nexport const useLocation = () => {\n const context = useContext(LocationContext);\n if (context === null) {\n throw new Error(\"useLocation must be used within a LocationProvider\");\n }\n return context;\n};\n","import type { ParsedRoute } from \"@/types.js\";\nimport { createContext } from \"react\";\n\nexport interface RouteContextType extends ParsedRoute {\n state: Record<string, any>;\n getState: (key: string) => any;\n setState: (key: string, value: any) => void;\n}\n\nexport const RouteContext = createContext<RouteContextType | null>(null);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useContext } from \"react\";\n\nexport const useRoute = () => {\n const route = useContext(RouteContext);\n if (route === null) {\n throw new Error(\"useRoute must be used within a RouteProvider\");\n }\n return route;\n};\n","import { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRoute } from \"@/hooks/useRoute.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport { useEffect, useState } from \"react\";\nimport { Outlet } from \"./outlet.js\";\n\nexport const RouteComponent = ({ depth = 0 }: { depth?: number }) => {\n const router = useRouter();\n const location = useLocation();\n const routeMatch = useRouteMatch();\n const route = useRoute();\n\n const pendingStateKey = `_Z.${route.id}.pending`;\n\n const [pending, setPending] = useState(\n !!route?.beforeLoad && route?.getState(pendingStateKey) !== false\n );\n\n useEffect(() => {\n if (!route || depth >= routeMatch.matches.length) {\n return;\n }\n if (\n pending &&\n route?.beforeLoad &&\n route.getState(pendingStateKey) !== true\n ) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad({ location })\n .catch(({ cause }: Error) => {\n if (\"to\" in (cause as any)) {\n router.navigate(cause as any);\n }\n })\n .finally(() => {\n route.setState(pendingStateKey, false);\n setPending(false);\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n const Component = route.component;\n return Component ? <Component /> : <Outlet />;\n};\n","import { useContext } from \"react\";\n\nimport { RootRouteContext } from \"@/context/root-route-context.js\";\n\nexport const useRootRoute = () => {\n const route = useContext(RootRouteContext);\n if (route === null) {\n throw new Error(\"useRootRoute must be used within a RootRouteProvider\");\n }\n return route;\n};\n","import { createContext } from \"react\";\n\nimport type { ParsedRoute } from \"@/types.js\";\n\nexport interface RootRouteContextType extends ParsedRoute {\n state: Record<string, Record<string, any>>;\n getRouteState: (id: string, key: string) => any;\n setRouteState: (id: string, key: string, value: any) => void;\n}\n\nexport const RootRouteContext = createContext<RootRouteContextType | null>(\n null\n);\n","import { RouteContext } from \"@/context/route-context.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport type { ParsedRoute } from \"@/types.js\";\nimport { useCallback } from \"react\";\n\nexport const RouteProvider = ({\n route,\n ...props\n}: {\n route?: ParsedRoute;\n children?: React.ReactNode;\n}) => {\n if (!route) {\n return <RouteContext.Provider value={null} {...props} />;\n }\n\n const { state, getRouteState, setRouteState } = useRootRoute();\n\n const getState = useCallback(\n (key: string) => getRouteState(route.id, key),\n [getRouteState, route.id]\n );\n\n const setState = useCallback(\n (key: string, value: any) => {\n setRouteState(route.id, key, value);\n },\n [setRouteState, route.id]\n );\n\n return (\n <RouteContext.Provider\n value={{ ...route, state: state[route.id], getState, setState }}\n {...props}\n />\n );\n};\n","import { useOutlet } from \"@/hooks/useOutlet.js\";\nimport { useRouteMatch } from \"@/hooks/useRouteMatch.js\";\nimport { OutletProvider } from \"./outlet-provider.js\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const Outlet = () => {\n const routeMatch = useRouteMatch();\n const depth = useOutlet() + 1;\n return (\n <OutletProvider depth={depth}>\n <RouteProvider route={routeMatch.matches.at(depth)}>\n <RouteComponent depth={depth} />\n </RouteProvider>\n </OutletProvider>\n );\n};\n","import { useCallback, useEffect, useState } from \"react\";\n\nimport { RouterContext } from \"@/context/router-context.js\";\nimport type {\n BackActionOptions,\n ForwardActionOptions,\n Location,\n NavigateActionOptions,\n NavigationOptions,\n RouterOptions,\n} from \"@/types.js\";\nimport { parseLocation, resolveRelativePathname } from \"@/utils.js\";\nimport { LocationProvider } from \"./location-provider.js\";\n\nexport const RouterProvider = ({\n options,\n ...props\n}: {\n options: RouterOptions;\n children: React.ReactNode;\n}) => {\n const [history, setHistory] = useState<Location[]>([\n parseLocation(window.location),\n ]);\n const [currentLocationIndex, setCurrentLocationIndex] = useState<number>(0);\n const location = history.at(currentLocationIndex)!;\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n\n useEffect(() => {\n window.history.replaceState(location.state, \"\", location.pathname);\n }, []);\n\n useEffect(() => {\n const handlePopState = ({ state }: PopStateEvent) => {\n setCurrentLocationIndex(state?.index);\n };\n\n addEventListener(\"popstate\", handlePopState);\n return () => {\n removeEventListener(\"popstate\", handlePopState);\n };\n }, [currentLocationIndex]);\n\n // Utilities\n const buildLocation = useCallback(\n ({ to, replace }: NavigationOptions): Location => {\n if (!to) return location;\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n\n // Resolve to with absolute or relative paths like \"..\" or \".\"\n const pathname = to.startsWith(\"/\")\n ? to\n : resolveRelativePathname(location.pathname, to);\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname,\n search: {},\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transition,\n duration,\n onFinish,\n }: NavigateActionOptions) => {\n if (isTransitioning) return;\n\n const index = replace ? currentLocationIndex : currentLocationIndex + 1;\n const newLocation = buildLocation({ to, replace });\n\n const updateHistory = () => {\n if (replace) {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ...prevHistory.slice(index + 1),\n ]);\n window.history.replaceState(\n newLocation.state,\n \"\",\n newLocation.pathname\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(newLocation.state, \"\", newLocation.pathname);\n }\n onFinish?.();\n };\n\n if (transition ?? options.defaultUseTransition?.(location, newLocation)) {\n transitionTo(newLocation, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transition, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (currentLocationIndex === 0 || isTransitioning) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n if (\n newLocation &&\n (transition ?? options.defaultUseTransition?.(location, newLocation))\n ) {\n transitionTo(newLocation, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({ transition, duration, depth, onFinish }: ForwardActionOptions = {}) => {\n if (currentLocationIndex + 1 >= history.length || isTransitioning) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n\n if (\n newLocation &&\n (transition ?? options.defaultUseTransition?.(location, newLocation))\n ) {\n transitionTo(newLocation, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n // Low-level state action\n const setLocationState = useCallback(\n (index: number, state: Record<string, any>) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) =>\n location.index === index ? { ...location, state } : location\n )\n );\n if (index === currentLocationIndex) {\n window.history.replaceState(state, \"\", location.pathname);\n }\n },\n [currentLocationIndex]\n );\n\n return (\n <RouterContext.Provider\n // oxlint-disable-next-line jsx-no-new-object-as-prop\n value={{\n options,\n\n history,\n location,\n canGoBack: currentLocationIndex > 0,\n canGoForward: currentLocationIndex < history.length - 1,\n\n isTransitioning,\n transitionDuration,\n transitioningToLocation,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n }}\n >\n <LocationProvider location={location} {...props} />\n </RouterContext.Provider>\n );\n};\n","import type { RouterOptions } from \"./types.js\";\n\nexport const DefaultRouterOptions: RouterOptions = {\n defaultTransitionDuration: 300,\n};\n","import { DefaultRouterOptions } from \"./constants.js\";\nimport type {\n Location,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: { to: string; replace?: boolean }) => {\n return new Error(\"\", { cause: options });\n};\n\n/**\n * @param pattern pathname pattern like `/users/:id`. Leading and trailing slashes are optional.\n * @param url URL to match against the pattern. Can be href or pathname with query string.\n * @returns extracted params and query if matched, otherwise null\n */\nexport const matchPattern = (\n pattern: string,\n url: string\n): { params: Record<string, string>; query: Record<string, string> } | null => {\n try {\n // 解析 URL\n let pathname, searchParams;\n\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n const urlObj = new URL(url);\n pathname = urlObj.pathname;\n searchParams = urlObj.searchParams;\n } else {\n // 處理相對路徑\n const [path, queryString] = url.split(\"?\");\n if (!path) {\n return null;\n }\n pathname = path;\n searchParams = new URLSearchParams(queryString || \"\");\n }\n\n // 移除路徑首尾的斜線以便比較\n const cleanPath = pathname.replaceAll(/^\\/|\\/$/g, \"\");\n const cleanPattern = pattern.replaceAll(/^\\/|\\/$/g, \"\");\n\n // 分割路徑段\n const pathSegments = cleanPath.split(\"/\");\n const patternSegments = cleanPattern.split(\"/\");\n\n // 路徑段數量不同則不匹配\n if (pathSegments.length !== patternSegments.length) {\n return null;\n }\n\n // 提取路徑參數\n const params: Record<string, string> = {};\n for (let i = 0; i < patternSegments.length; i++) {\n const patternSegment = patternSegments[i];\n const pathSegment = pathSegments[i];\n\n if (patternSegment.startsWith(\":\")) {\n // 動態參數\n const paramName = patternSegment.slice(1);\n params[paramName] = decodeURIComponent(pathSegment);\n } else if (patternSegment !== pathSegment) {\n // 靜態段不匹配\n return null;\n }\n }\n\n // 提取查詢參數\n const query = Object.fromEntries(searchParams.entries());\n\n return { params, query };\n } catch {\n return null;\n }\n};\n\nexport const matchRoute = (route: ParsedRoute, url: string): RouteMatch => {\n const _matchRoute = (\n matches: ParsedRoute[],\n { children }: ParsedRoute\n ): RouteMatch | null => {\n if (children && children.length > 0) {\n for (const childRoute of children) {\n const matchesResult = _matchRoute([...matches, childRoute], childRoute);\n if (matchesResult) {\n return matchesResult;\n }\n }\n return null;\n }\n\n const result = matchPattern(buildPathnameFromMatches(matches), url);\n return result ? { matches, ...result } : null;\n };\n\n return (\n _matchRoute([route], route) || {\n matches: [],\n params: {},\n query: {},\n }\n );\n};\n\nexport const buildPathnameFromMatches = (matches: Route[]): string => {\n let cleanedPathnames: string[] = []; // pathnames without leading/trailing slashes\n for (const match of matches) {\n if (match.pathname === undefined) continue;\n cleanedPathnames.push(match.pathname.replaceAll(/^\\/|\\/$/g, \"\"));\n }\n return \"/\" + cleanedPathnames.join(\"/\");\n};\n\nexport const parseLocation = ({\n href,\n pathname,\n search,\n}: globalThis.Location): Location => ({\n index: 0,\n href,\n state: {\n index: 0,\n },\n pathname,\n search: Object.fromEntries(new URLSearchParams(search)),\n});\n\nexport const createRouterOptions = (\n options?: Partial<RouterOptions>\n): RouterOptions => ({\n ...DefaultRouterOptions,\n ...options,\n});\n\nexport const parseRoute = (route: Route): ParsedRoute => {\n const parseRouteRecursive = (route: Route, parentId: string): ParsedRoute => {\n const id =\n route.name ??\n (route.pathname\n ? `${parentId}/${route.pathname.replaceAll(/^\\/|\\/$/g, \"\")}`\n : parentId);\n\n const parsedRoute: ParsedRoute = {\n ...route,\n id,\n children: route.children?.map((child) => parseRouteRecursive(child, id)),\n };\n\n return parsedRoute;\n };\n return parseRouteRecursive(route, \"\");\n};\n\nconst isPathSegmentValid = (segment: string): boolean => segment.length > 0;\n\n/**\n * Resolves a relative path against a base pathname.\n * @param pathname The base pathname.\n * @param to The relative path to resolve.\n * @returns The resolved absolute pathname.\n */\nexport const resolveRelativePathname = (\n pathname: string,\n to: string\n): string => {\n const currentPathSegments = pathname.split(\"/\").filter(isPathSegmentValid);\n const toPathSegments = to.split(\"/\").filter(isPathSegmentValid);\n for (const segment of toPathSegments) {\n if (segment === \".\") {\n continue;\n } else if (segment === \"..\") {\n currentPathSegments.pop();\n } else {\n currentPathSegments.push(segment);\n }\n }\n return \"/\" + currentPathSegments.join(\"/\");\n};\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { useRouter } from \"@/hooks/useRouter.js\";\nimport type { Route } from \"@/types.js\";\n\nimport { LocationProvider } from \"./location-provider.js\";\nimport { PageRenderer } from \"./page-renderer.js\";\nimport { RootRouteProvider } from \"./root-route-provider.js\";\n\ntype StackComponentProps = React.ComponentPropsWithoutRef<\"div\">;\n\nconst StackComponent: React.FC<StackComponentProps> = ({ style, ...props }) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionDuration,\n back,\n forward,\n } = useRouter();\n const currentLocationIndex = location.index;\n\n const isTouching = useRef(false);\n const startX = useRef(0);\n const startY = useRef(0);\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState(0);\n const [draggedLeft, setDraggedLeft] = useState(false);\n const [draggedRight, setDraggedRight] = useState(false);\n const [isCanceling, setIsCanceling] = useState(false);\n const [isTransitionStarted, setIsTransitionStarted] = useState(false);\n\n useEffect(() => {\n if (!isTransitioning || !transitioningToLocation) return;\n setIsTransitionStarted(true);\n setTimeout(() => {\n setIsTransitionStarted(false);\n }, transitionDuration);\n }, [isTransitioning, transitioningToLocation, transitionDuration]);\n\n if (currentLocationIndex === undefined) return;\n\n const reset = () => {\n setIsDragging(false);\n setDragOffset(0);\n setDraggedLeft(false);\n setDraggedRight(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = (e: React.TouchEvent) => {\n if (isTransitioning || (!canGoForward && !canGoBack)) return;\n isTouching.current = true;\n startX.current = e.touches[0].clientX;\n startY.current = e.touches[0].clientY;\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n if (!isTouching.current) return;\n // Skip vertical drag\n const { clientX, clientY } = e.touches[0];\n if (!isDragging && Math.abs(clientY - startY.current) > 30) {\n isTouching.current = false;\n return;\n }\n const offset = clientX - startX.current;\n if (Math.abs(offset) < 10) return;\n if (!isDragging) {\n setIsDragging(true);\n }\n if (\n (offset > 0 && currentLocationIndex === 0) ||\n (offset < 0 && currentLocationIndex + 1 === history.length)\n ) {\n setDragOffset(0);\n return;\n }\n if (!draggedLeft && offset < 0) setDraggedLeft(true);\n if (!draggedRight && offset > 0) setDraggedRight(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n };\n\n const handleTouchEnd = useCallback(() => {\n isTouching.current = false;\n if (!isDragging) return;\n\n const options = {\n onFinish: reset,\n };\n if (dragOffset > innerWidth * 0.3 && canGoBack) {\n back(options);\n } else if (dragOffset < -innerWidth * 0.3 && canGoForward) {\n forward(options);\n } else {\n setIsCanceling(true);\n setTimeout(reset, transitionDuration);\n }\n }, [\n back,\n forward,\n isDragging,\n dragOffset,\n canGoBack,\n canGoForward,\n transitionDuration,\n ]);\n\n return (\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n ...style,\n }}\n {...props}\n >\n {currentLocationIndex >= 1 &&\n ((isDragging && draggedRight) ||\n (isTransitioning &&\n transitioningToLocation!.index < currentLocationIndex)) && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n }}\n >\n <LocationProvider location={history.at(currentLocationIndex - 1)!}>\n <PageRenderer key={currentLocationIndex - 1} />\n </LocationProvider>\n </div>\n )}\n <div\n key={currentLocationIndex}\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n transform:\n isTransitioning &&\n transitioningToLocation!.index < currentLocationIndex\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling ||\n (isTransitioning &&\n transitioningToLocation!.index < currentLocationIndex)\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n\n {((isDragging && draggedLeft) ||\n (isTransitioning &&\n currentLocationIndex <= transitioningToLocation!.index)) && (\n <div\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n transform: `translateX(${\n isTransitionStarted\n ? \"0px\"\n : isTransitioning || isCanceling\n ? \"100%\"\n : `${innerWidth + dragOffset}px`\n })`,\n transition: `transform ${\n isTransitioning || isCanceling ? transitionDuration : 0\n }ms ease-in`,\n }}\n >\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex + 1)!\n }\n >\n <PageRenderer key={transitioningToLocation?.index} />\n </LocationProvider>\n </div>\n )}\n </div>\n );\n};\n\nexport interface StackProps extends StackComponentProps {\n rootRoute: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ rootRoute, ...props }) => (\n <RootRouteProvider rootRoute={rootRoute}>\n <StackComponent {...props} />\n </RootRouteProvider>\n);\n","import { RouteMatchContext } from \"@/context/route-match-context.js\";\nimport { useLocation } from \"@/hooks/useLocation.js\";\nimport { useRootRoute } from \"@/hooks/useRootRoute.js\";\nimport { matchRoute } from \"@/utils.js\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = () => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = matchRoute(rootRoute, location.pathname);\n return (\n <RouteMatchContext.Provider value={routeMatch}>\n <RouteProvider route={rootRoute}>\n <RouteComponent />\n </RouteProvider>\n </RouteMatchContext.Provider>\n );\n};\n","import { RootRouteContext } from \"@/context/root-route-context.js\";\nimport type { Route } from \"@/types.js\";\nimport { parseRoute } from \"@/utils.js\";\nimport { useCallback, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n rootRoute,\n ...props\n}: {\n rootRoute: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = parseRoute(rootRoute);\n const [state, setState] = useState<Record<string, Record<string, any>>>({});\n\n const getRouteState = useCallback(\n (id: string, key: string) => {\n return state[id]?.[key];\n },\n [state]\n );\n\n const setRouteState = useCallback((id: string, key: string, value: any) => {\n setState((prevState) => ({\n ...prevState,\n [id]: {\n ...prevState[id],\n [key]: value,\n },\n }));\n }, []);\n\n return (\n <RootRouteContext.Provider\n value={{ ...parsedRoute, state, getRouteState, setRouteState }}\n {...props}\n />\n );\n};\n"],"mappings":"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","names":["index_exports","__export","DefaultTransitionDuration","Link","LocationContext","LocationProvider","Outlet","RootRouteContext","RouterContext","RouterProvider","Stack","buildPathnameFromMatches","createRouterOptions","matchPattern","matchRoute","parseLocation","parseRoute","redirect","resolveRelativePathname","useLocation","useRootRoute","useRoute","useRouteMatch","useRouter","__toCommonJS","import_react","import_react","RouterContext","useRouter","router","RouterContext","import_react","import_jsx_runtime","Link","to","replace","transition","duration","onFinish","props","router","useRouter","e","import_react","LocationContext","import_react","import_jsx_runtime","LocationProvider","location","props","router","useRouter","getState","key","setState","value","deleteState","LocationContext","a","b","import_react","OutletContext","import_react","useOutlet","OutletContext","import_react","RouteMatchContext","import_react","useRouteMatch","routeMatch","RouteMatchContext","import_jsx_runtime","OutletProvider","depth","props","OutletContext","import_react","useLocation","context","LocationContext","import_react","RouteContext","import_react","useRoute","route","RouteContext","import_react","import_jsx_runtime","RouteComponent","depth","router","useRouter","location","useLocation","routeMatch","useRouteMatch","route","useRoute","pendingStateKey","pending","setPending","cause","NotFoundComponent","PendingComponent","Component","Outlet","import_react","import_react","RootRouteContext","useRootRoute","route","RootRouteContext","import_react","import_jsx_runtime","RouteProvider","route","props","RouteContext","state","getRouteState","setRouteState","useRootRoute","getState","key","setState","value","import_jsx_runtime","Outlet","routeMatch","useRouteMatch","depth","useOutlet","OutletProvider","RouteProvider","RouteComponent","import_react","DefaultRouterOptions","DefaultTransitionDuration","redirect","options","matchPattern","pattern","url","pathname","searchParams","urlObj","path","queryString","cleanPath","cleanPattern","pathSegments","patternSegments","params","i","patternSegment","pathSegment","paramName","query","matchRoute","route","_matchRoute","matches","children","childRoute","matchesResult","result","buildPathnameFromMatches","cleanedPathnames","match","parseLocation","href","search","createRouterOptions","DefaultRouterOptions","parseRoute","parseRouteRecursive","parentId","id","child","isPathSegmentValid","segment","resolveRelativePathname","to","currentPathSegments","toPathSegments","import_jsx_runtime","RouterProvider","options","props","history","setHistory","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","isTransitioning","setIsTransitioning","transitionDuration","setTransitionDuration","transitioningToLocation","setTransitioningToLocation","handlePopState","state","buildLocation","to","replace","index","pathname","resolveRelativePathname","transitionTo","duration","callback","navigate","transition","onFinish","newLocation","updateHistory","prevHistory","back","depth","backDepth","forward","forwardDepth","setLocationState","RouterContext","LocationProvider","import_react","import_jsx_runtime","PageRenderer","rootRoute","useRootRoute","location","useLocation","routeMatch","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","import_react","import_jsx_runtime","RootRouteProvider","rootRoute","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","import_jsx_runtime","StackComponent","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","startX","startY","isDragging","setIsDragging","dragOffset","setDragOffset","draggedLeft","setDraggedLeft","draggedRight","setDraggedRight","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","reset","handleTouchStart","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","rootRoute","RootRouteProvider"]}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{useContext as Lt}from"react";import{createContext as Ct}from"react";var B=Ct(null);var w=()=>{let t=Lt(B);if(t===null)throw new Error("useRouter must be used within a Stack");return t};import{memo as bt}from"react";import{jsx as wt}from"react/jsx-runtime";var ro=bt(({to:t,replace:r,transition:e,duration:s,onFinish:o,...u})=>{let n=w();return wt("a",{...u,href:t,onClick:i=>{i.preventDefault(),n.navigate({to:t,replace:r,transition:e,duration:s,onFinish:o})}})});import{createContext as Ot}from"react";var G=Ot(null);import{memo as St,useCallback as z}from"react";import{jsx as Tt}from"react/jsx-runtime";var E=St(({location:t,...r})=>{let e=w(),s=z(n=>t.state[n],[t]),o=z((n,i)=>{e.setLocationState(t.index,{...t.state,[n]:i})},[e,t]),u=z(n=>{delete t.state[n],e.setLocationState(t.index,t.state)},[e,t]);return Tt(G.Provider,{value:{...t,canGoBack:t.index>0,canGoForward:t.index<e.history.length-1,getState:s,setState:o,deleteState:u},...r})},(t,r)=>t.location===r.location);import{createContext as kt}from"react";var U=kt(0);import{useContext as Mt}from"react";var ot=()=>Mt(U);import{createContext as At}from"react";var I=At(null);import{useContext as Nt}from"react";var X=()=>{let t=Nt(I);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};import{jsx as Dt}from"react/jsx-runtime";var et=({depth:t,...r})=>Dt(U.Provider,{value:t,...r});import{useContext as Et}from"react";var H=()=>{let t=Et(G);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};import{createContext as Ft}from"react";var F=Ft(null);import{useContext as $t}from"react";var nt=()=>{let t=$t(F);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};import{useEffect as Wt,useState as jt}from"react";import{jsx as q}from"react/jsx-runtime";var Y=({depth:t=0})=>{let r=w(),e=H(),s=X(),o=nt(),u=`_Z.${o.id}.pending`,[n,i]=jt(!!o?.beforeLoad&&o?.getState(u)!==!1);if(Wt(()=>{!o||t>=s.matches.length||n&&o?.beforeLoad&&(o.setState(u,!0),o.beforeLoad({location:e}).catch(({cause:h})=>{"to"in h&&r.navigate(h)}).finally(()=>{o.setState(u,!1),i(!1)}))},[]),!o)return null;if(t>=s.matches.length){let h=o.notFoundComponent;return q(h,{})}if(n){let h=o.pendingComponent;return q(h,{})}let p=o.component;return p?q(p,{}):q(rt,{})};import{useContext as Gt}from"react";import{createContext as Bt}from"react";var _=Bt(null);var K=()=>{let t=Gt(_);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};import{useCallback as it}from"react";import{jsx as st}from"react/jsx-runtime";var V=({route:t,...r})=>{if(!t)return st(F.Provider,{value:null,...r});let{state:e,getRouteState:s,setRouteState:o}=K(),u=it(i=>s(t.id,i),[s,t.id]),n=it((i,p)=>{o(t.id,i,p)},[o,t.id]);return st(F.Provider,{value:{...t,state:e[t.id],getState:u,setState:n},...r})};import{jsx as J}from"react/jsx-runtime";var rt=()=>{let t=X(),r=ot()+1;return J(et,{depth:r,children:J(V,{route:t.matches.at(r),children:J(Y,{depth:r})})})};import{useCallback as $,useEffect as lt,useState as W}from"react";var at={defaultTransitionDuration:300};var Oe=300,Se=t=>new Error("",{cause:t}),Ut=(t,r)=>{try{let e,s;if(r.startsWith("http://")||r.startsWith("https://")){let f=new URL(r);e=f.pathname,s=f.searchParams}else{let[f,d]=r.split("?");if(!f)return null;e=f,s=new URLSearchParams(d||"")}let o=e.replaceAll(/^\/|\/$/g,""),u=t.replaceAll(/^\/|\/$/g,""),n=o.split("/"),i=u.split("/");if(n.length!==i.length)return null;let p={};for(let f=0;f<i.length;f++){let d=i[f],P=n[f];if(d.startsWith(":")){let O=d.slice(1);p[O]=decodeURIComponent(P)}else if(d!==P)return null}let h=Object.fromEntries(s.entries());return{params:p,query:h}}catch{return null}},ut=(t,r)=>{let e=(s,{children:o})=>{if(o&&o.length>0){for(let n of o){let i=e([...s,n],n);if(i)return i}return null}let u=Ut(It(s),r);return u?{matches:s,...u}:null};return e([t],t)||{matches:[],params:{},query:{}}},It=t=>{let r=[];for(let e of t)e.pathname!==void 0&&r.push(e.pathname.replaceAll(/^\/|\/$/g,""));return"/"+r.join("/")},pt=({href:t,pathname:r,search:e})=>({index:0,href:t,state:{index:0},pathname:r,search:Object.fromEntries(new URLSearchParams(e))}),Te=t=>({...at,...t}),mt=t=>{let r=(e,s)=>{let o=e.name??(e.pathname?`${s}/${e.pathname.replaceAll(/^\/|\/$/g,"")}`:s);return{...e,id:o,children:e.children?.map(n=>r(n,o))}};return r(t,"")},ct=t=>t.length>0,dt=(t,r)=>{let e=t.split("/").filter(ct),s=r.split("/").filter(ct);for(let o of s)o!=="."&&(o===".."?e.pop():e.push(o));return"/"+e.join("/")};import{jsx as ft}from"react/jsx-runtime";var Fe=({options:t,...r})=>{let[e,s]=W([pt(window.location)]),[o,u]=W(0),n=e.at(o),[i,p]=W(!1),[h,f]=W(0),[d,P]=W();lt(()=>{window.history.replaceState(n.state,"",n.pathname)},[]),lt(()=>{let m=({state:l})=>{u(l?.index)};return addEventListener("popstate",m),()=>{removeEventListener("popstate",m)}},[o]);let O=$(({to:m,replace:l})=>{if(!m)return n;let g=l?o:o+1,x=m.startsWith("/")?m:dt(n.pathname,m),v={index:g};return{index:g,href:origin+x,search:{},state:v,pathname:x}},[o,n]),k=(m,l=t.defaultTransitionDuration,g)=>{p(!0),f(l),P(m),setTimeout(()=>{p(!1),P(void 0),g?.()},l)},L=$(({to:m,replace:l,transition:g,duration:x,onFinish:v})=>{if(i)return;let y=l?o:o+1,R=O({to:m,replace:l}),D=()=>{l?(s(S=>[...S.slice(0,y),R,...S.slice(y+1)]),window.history.replaceState(R.state,"",R.pathname)):(s(S=>[...S.slice(0,y),R]),u(y),window.history.pushState(R.state,"",R.pathname)),v?.()};g??t.defaultUseTransition?.(n,R)?k(R,x,D):D()},[o,e,i,t]),j=$(({transition:m,duration:l,onFinish:g,depth:x}={})=>{if(o===0||i)return;let v=x??1,y=e.at(o-v),R=()=>{window.history.go(-v),g?.()};y&&(m??t.defaultUseTransition?.(n,y))?k(y,l,R):R()},[o,e,i,t]),b=$(({transition:m,duration:l,depth:g,onFinish:x}={})=>{if(o+1>=e.length||i)return;let v=g??1,y=e.at(o+v),R=()=>{window.history.go(v),x?.()};y&&(m??t.defaultUseTransition?.(n,y))?k(y,l,R):R()},[o,e,i,t]),N=$((m,l)=>{s(g=>g.map(x=>x.index===m?{...x,state:l}:x)),m===o&&window.history.replaceState(l,"",n.pathname)},[o]);return ft(B.Provider,{value:{options:t,history:e,location:n,canGoBack:o>0,canGoForward:o<e.length-1,isTransitioning:i,transitionDuration:h,transitioningToLocation:d,buildLocation:O,navigate:L,back:j,forward:b,setLocationState:N},children:ft(E,{location:n,...r})})};import{useCallback as qt,useEffect as Yt,useRef as tt,useState as A}from"react";import{jsx as Q}from"react/jsx-runtime";var Z=()=>{let t=K(),r=H(),e=ut(t,r.pathname);return Q(I.Provider,{value:e,children:Q(V,{route:t,children:Q(Y,{})})})};import{useCallback as Rt,useState as Xt}from"react";import{jsx as Ht}from"react/jsx-runtime";var ht=({rootRoute:t,...r})=>{let e=mt(t),[s,o]=Xt({}),u=Rt((i,p)=>s[i]?.[p],[s]),n=Rt((i,p,h)=>{o(f=>({...f,[i]:{...f[i],[p]:h}}))},[]);return Ht(_.Provider,{value:{...e,state:s,getRouteState:u,setRouteState:n},...r})};import{jsx as C,jsxs as Kt}from"react/jsx-runtime";var _t=({style:t,...r})=>{let{history:e,location:s,canGoBack:o,canGoForward:u,isTransitioning:n,transitioningToLocation:i,transitionDuration:p,back:h,forward:f}=w(),d=s.index,P=tt(!1),O=tt(0),k=tt(0),[L,j]=A(!1),[b,N]=A(0),[m,l]=A(!1),[g,x]=A(!1),[v,y]=A(!1),[R,D]=A(!1);if(Yt(()=>{!n||!i||(D(!0),setTimeout(()=>{D(!1)},p))},[n,i,p]),d===void 0)return;let S=()=>{j(!1),N(0),l(!1),x(!1),y(!1)},gt=T=>{n||!u&&!o||(P.current=!0,O.current=T.touches[0].clientX,k.current=T.touches[0].clientY)},xt=T=>{if(!P.current)return;let{clientX:vt,clientY:Pt}=T.touches[0];if(!L&&Math.abs(Pt-k.current)>30){P.current=!1;return}let M=vt-O.current;if(!(Math.abs(M)<10)){if(L||j(!0),M>0&&d===0||M<0&&d+1===e.length){N(0);return}!m&&M<0&&l(!0),!g&&M>0&&x(!0),N(Math.max(Math.min(M,window.innerWidth),-window.innerWidth))}},yt=qt(()=>{if(P.current=!1,!L)return;let T={onFinish:S};b>innerWidth*.3&&o?h(T):b<-innerWidth*.3&&u?f(T):(y(!0),setTimeout(S,p))},[h,f,L,b,o,u,p]);return Kt("div",{style:{position:"relative",overflow:"hidden",...t},...r,children:[d>=1&&(L&&g||n&&i.index<d)&&C("div",{style:{position:"absolute",inset:0},children:C(E,{location:e.at(d-1),children:C(Z,{},d-1)})}),C("div",{style:{background:"white",position:"absolute",inset:0,transform:n&&i.index<d?"translateX(100%)":L&&b>0&&!v?`translateX(${b}px)`:"translateX(0px)",transition:v||n&&i.index<d?`transform ${p}ms ease-out`:""},onTouchStart:gt,onTouchMove:xt,onTouchEnd:yt,children:C(Z,{})},d),(L&&m||n&&d<=i.index)&&C("div",{style:{background:"white",position:"absolute",inset:0,transform:`translateX(${R?"0px":n||v?"100%":`${innerWidth+b}px`})`,transition:`transform ${n||v?p:0}ms ease-in`},children:C(E,{location:n?i:e.at(d+1),children:C(Z,{},i?.index)})})]})},sn=({rootRoute:t,...r})=>C(ht,{rootRoute:t,children:C(_t,{...r})});export{Oe as DefaultTransitionDuration,ro as Link,G as LocationContext,E as LocationProvider,rt as Outlet,_ as RootRouteContext,B as RouterContext,Fe as RouterProvider,sn as Stack,It as buildPathnameFromMatches,Te as createRouterOptions,Ut as matchPattern,ut as matchRoute,pt as parseLocation,mt as parseRoute,Se as redirect,dt as resolveRelativePathname,H as useLocation,K as useRootRoute,nt as useRoute,X as useRouteMatch,w as useRouter};
1
+ import{useContext as Lt}from"react";import{createContext as Ct}from"react";var B=Ct(null);var w=()=>{let t=Lt(B);if(t===null)throw new Error("useRouter must be used within a Stack");return t};import{memo as bt}from"react";import{jsx as wt}from"react/jsx-runtime";var ro=bt(({to:t,replace:r,transition:e,duration:s,onFinish:o,...u})=>{let n=w();return wt("a",{...u,href:t,onClick:i=>{i.preventDefault(),n.navigate({to:t,replace:r,transition:e,duration:s,onFinish:o})}})});import{createContext as Ot}from"react";var G=Ot(null);import{memo as St,useCallback as z}from"react";import{jsx as Tt}from"react/jsx-runtime";var E=St(({location:t,...r})=>{let e=w(),s=z(n=>t.state[n],[t]),o=z((n,i)=>{e.setLocationState(t.index,{...t.state,[n]:i})},[e,t]),u=z(n=>{delete t.state[n],e.setLocationState(t.index,t.state)},[e,t]);return Tt(G.Provider,{value:{...t,canGoBack:t.index>0,canGoForward:t.index<e.history.length-1,getState:s,setState:o,deleteState:u},...r})},(t,r)=>t.location===r.location);import{createContext as kt}from"react";var U=kt(0);import{useContext as Mt}from"react";var ot=()=>Mt(U);import{createContext as At}from"react";var I=At(null);import{useContext as Nt}from"react";var X=()=>{let t=Nt(I);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};import{jsx as Dt}from"react/jsx-runtime";var et=({depth:t,...r})=>Dt(U.Provider,{value:t,...r});import{useContext as Et}from"react";var H=()=>{let t=Et(G);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};import{createContext as Ft}from"react";var F=Ft(null);import{useContext as $t}from"react";var nt=()=>{let t=$t(F);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};import{useEffect as Wt,useState as jt}from"react";import{jsx as q}from"react/jsx-runtime";var Y=({depth:t=0})=>{let r=w(),e=H(),s=X(),o=nt(),u=`_Z.${o.id}.pending`,[n,i]=jt(!!o?.beforeLoad&&o?.getState(u)!==!1);if(Wt(()=>{!o||t>=s.matches.length||n&&o?.beforeLoad&&o.getState(u)!==!0&&(o.setState(u,!0),o.beforeLoad({location:e}).catch(({cause:h})=>{"to"in h&&r.navigate(h)}).finally(()=>{o.setState(u,!1),i(!1)}))},[o]),!o)return null;if(t>=s.matches.length){let h=o.notFoundComponent;return q(h,{})}if(n){let h=o.pendingComponent;return q(h,{})}let p=o.component;return p?q(p,{}):q(rt,{})};import{useContext as Gt}from"react";import{createContext as Bt}from"react";var _=Bt(null);var K=()=>{let t=Gt(_);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};import{useCallback as it}from"react";import{jsx as st}from"react/jsx-runtime";var V=({route:t,...r})=>{if(!t)return st(F.Provider,{value:null,...r});let{state:e,getRouteState:s,setRouteState:o}=K(),u=it(i=>s(t.id,i),[s,t.id]),n=it((i,p)=>{o(t.id,i,p)},[o,t.id]);return st(F.Provider,{value:{...t,state:e[t.id],getState:u,setState:n},...r})};import{jsx as J}from"react/jsx-runtime";var rt=()=>{let t=X(),r=ot()+1;return J(et,{depth:r,children:J(V,{route:t.matches.at(r),children:J(Y,{depth:r})})})};import{useCallback as $,useEffect as lt,useState as W}from"react";var at={defaultTransitionDuration:300};var Oe=300,Se=t=>new Error("",{cause:t}),Ut=(t,r)=>{try{let e,s;if(r.startsWith("http://")||r.startsWith("https://")){let f=new URL(r);e=f.pathname,s=f.searchParams}else{let[f,d]=r.split("?");if(!f)return null;e=f,s=new URLSearchParams(d||"")}let o=e.replaceAll(/^\/|\/$/g,""),u=t.replaceAll(/^\/|\/$/g,""),n=o.split("/"),i=u.split("/");if(n.length!==i.length)return null;let p={};for(let f=0;f<i.length;f++){let d=i[f],P=n[f];if(d.startsWith(":")){let O=d.slice(1);p[O]=decodeURIComponent(P)}else if(d!==P)return null}let h=Object.fromEntries(s.entries());return{params:p,query:h}}catch{return null}},ut=(t,r)=>{let e=(s,{children:o})=>{if(o&&o.length>0){for(let n of o){let i=e([...s,n],n);if(i)return i}return null}let u=Ut(It(s),r);return u?{matches:s,...u}:null};return e([t],t)||{matches:[],params:{},query:{}}},It=t=>{let r=[];for(let e of t)e.pathname!==void 0&&r.push(e.pathname.replaceAll(/^\/|\/$/g,""));return"/"+r.join("/")},pt=({href:t,pathname:r,search:e})=>({index:0,href:t,state:{index:0},pathname:r,search:Object.fromEntries(new URLSearchParams(e))}),Te=t=>({...at,...t}),mt=t=>{let r=(e,s)=>{let o=e.name??(e.pathname?`${s}/${e.pathname.replaceAll(/^\/|\/$/g,"")}`:s);return{...e,id:o,children:e.children?.map(n=>r(n,o))}};return r(t,"")},ct=t=>t.length>0,dt=(t,r)=>{let e=t.split("/").filter(ct),s=r.split("/").filter(ct);for(let o of s)o!=="."&&(o===".."?e.pop():e.push(o));return"/"+e.join("/")};import{jsx as ft}from"react/jsx-runtime";var Fe=({options:t,...r})=>{let[e,s]=W([pt(window.location)]),[o,u]=W(0),n=e.at(o),[i,p]=W(!1),[h,f]=W(0),[d,P]=W();lt(()=>{window.history.replaceState(n.state,"",n.pathname)},[]),lt(()=>{let m=({state:l})=>{u(l?.index)};return addEventListener("popstate",m),()=>{removeEventListener("popstate",m)}},[o]);let O=$(({to:m,replace:l})=>{if(!m)return n;let g=l?o:o+1,x=m.startsWith("/")?m:dt(n.pathname,m),v={index:g};return{index:g,href:origin+x,search:{},state:v,pathname:x}},[o,n]),k=(m,l=t.defaultTransitionDuration,g)=>{p(!0),f(l),P(m),setTimeout(()=>{p(!1),P(void 0),g?.()},l)},L=$(({to:m,replace:l,transition:g,duration:x,onFinish:v})=>{if(i)return;let y=l?o:o+1,R=O({to:m,replace:l}),D=()=>{l?(s(S=>[...S.slice(0,y),R,...S.slice(y+1)]),window.history.replaceState(R.state,"",R.pathname)):(s(S=>[...S.slice(0,y),R]),u(y),window.history.pushState(R.state,"",R.pathname)),v?.()};g??t.defaultUseTransition?.(n,R)?k(R,x,D):D()},[o,e,i,t]),j=$(({transition:m,duration:l,onFinish:g,depth:x}={})=>{if(o===0||i)return;let v=x??1,y=e.at(o-v),R=()=>{window.history.go(-v),g?.()};y&&(m??t.defaultUseTransition?.(n,y))?k(y,l,R):R()},[o,e,i,t]),b=$(({transition:m,duration:l,depth:g,onFinish:x}={})=>{if(o+1>=e.length||i)return;let v=g??1,y=e.at(o+v),R=()=>{window.history.go(v),x?.()};y&&(m??t.defaultUseTransition?.(n,y))?k(y,l,R):R()},[o,e,i,t]),N=$((m,l)=>{s(g=>g.map(x=>x.index===m?{...x,state:l}:x)),m===o&&window.history.replaceState(l,"",n.pathname)},[o]);return ft(B.Provider,{value:{options:t,history:e,location:n,canGoBack:o>0,canGoForward:o<e.length-1,isTransitioning:i,transitionDuration:h,transitioningToLocation:d,buildLocation:O,navigate:L,back:j,forward:b,setLocationState:N},children:ft(E,{location:n,...r})})};import{useCallback as qt,useEffect as Yt,useRef as tt,useState as A}from"react";import{jsx as Q}from"react/jsx-runtime";var Z=()=>{let t=K(),r=H(),e=ut(t,r.pathname);return Q(I.Provider,{value:e,children:Q(V,{route:t,children:Q(Y,{})})})};import{useCallback as Rt,useState as Xt}from"react";import{jsx as Ht}from"react/jsx-runtime";var ht=({rootRoute:t,...r})=>{let e=mt(t),[s,o]=Xt({}),u=Rt((i,p)=>s[i]?.[p],[s]),n=Rt((i,p,h)=>{o(f=>({...f,[i]:{...f[i],[p]:h}}))},[]);return Ht(_.Provider,{value:{...e,state:s,getRouteState:u,setRouteState:n},...r})};import{jsx as C,jsxs as Kt}from"react/jsx-runtime";var _t=({style:t,...r})=>{let{history:e,location:s,canGoBack:o,canGoForward:u,isTransitioning:n,transitioningToLocation:i,transitionDuration:p,back:h,forward:f}=w(),d=s.index,P=tt(!1),O=tt(0),k=tt(0),[L,j]=A(!1),[b,N]=A(0),[m,l]=A(!1),[g,x]=A(!1),[v,y]=A(!1),[R,D]=A(!1);if(Yt(()=>{!n||!i||(D(!0),setTimeout(()=>{D(!1)},p))},[n,i,p]),d===void 0)return;let S=()=>{j(!1),N(0),l(!1),x(!1),y(!1)},gt=T=>{n||!u&&!o||(P.current=!0,O.current=T.touches[0].clientX,k.current=T.touches[0].clientY)},xt=T=>{if(!P.current)return;let{clientX:vt,clientY:Pt}=T.touches[0];if(!L&&Math.abs(Pt-k.current)>30){P.current=!1;return}let M=vt-O.current;if(!(Math.abs(M)<10)){if(L||j(!0),M>0&&d===0||M<0&&d+1===e.length){N(0);return}!m&&M<0&&l(!0),!g&&M>0&&x(!0),N(Math.max(Math.min(M,window.innerWidth),-window.innerWidth))}},yt=qt(()=>{if(P.current=!1,!L)return;let T={onFinish:S};b>innerWidth*.3&&o?h(T):b<-innerWidth*.3&&u?f(T):(y(!0),setTimeout(S,p))},[h,f,L,b,o,u,p]);return Kt("div",{style:{position:"relative",overflow:"hidden",...t},...r,children:[d>=1&&(L&&g||n&&i.index<d)&&C("div",{style:{position:"absolute",inset:0},children:C(E,{location:e.at(d-1),children:C(Z,{},d-1)})}),C("div",{style:{background:"white",position:"absolute",inset:0,transform:n&&i.index<d?"translateX(100%)":L&&b>0&&!v?`translateX(${b}px)`:"translateX(0px)",transition:v||n&&i.index<d?`transform ${p}ms ease-out`:""},onTouchStart:gt,onTouchMove:xt,onTouchEnd:yt,children:C(Z,{})},d),(L&&m||n&&d<=i.index)&&C("div",{style:{background:"white",position:"absolute",inset:0,transform:`translateX(${R?"0px":n||v?"100%":`${innerWidth+b}px`})`,transition:`transform ${n||v?p:0}ms ease-in`},children:C(E,{location:n?i:e.at(d+1),children:C(Z,{},i?.index)})})]})},sn=({rootRoute:t,...r})=>C(ht,{rootRoute:t,children:C(_t,{...r})});export{Oe as DefaultTransitionDuration,ro as Link,G as LocationContext,E as LocationProvider,rt as Outlet,_ as RootRouteContext,B as RouterContext,Fe as RouterProvider,sn as Stack,It as buildPathnameFromMatches,Te as createRouterOptions,Ut as matchPattern,ut as matchRoute,pt as parseLocation,mt as parseRoute,Se as redirect,dt as resolveRelativePathname,H as useLocation,K as useRootRoute,nt as useRoute,X as useRouteMatch,w as useRouter};
2
2
  //# sourceMappingURL=index.js.map