@modastar/z-router 0.0.14 → 0.0.15
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 +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/.oxlintrc.json +0 -24
- package/.vscode/settings.json +0 -6
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var at=Object.defineProperty;var Ht=Object.getOwnPropertyDescriptor;var qt=Object.getOwnPropertyNames;var Yt=Object.prototype.hasOwnProperty;var zt=(t,o)=>{for(var n in o)at(t,n,{get:o[n],enumerable:!0})},_t=(t,o,n,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of qt(o))!Yt.call(t,e)&&e!==n&&at(t,e,{get:()=>o[e],enumerable:!(s=Ht(o,e))||s.enumerable});return t};var Kt=t=>_t(at({},"__esModule",{value:!0}),t);var re={};zt(re,{DefaultTransitionDuration:()=>Zt,Link:()=>Vt,LocationContext:()=>X,LocationProvider:()=>j,Outlet:()=>ut,RootRouteContext:()=>_,RouterContext:()=>I,RouterProvider:()=>te,Stack:()=>ne,buildPathnameFromMatches:()=>Gt,buildUrlFromLocation:()=>A,createRouterOptions:()=>Qt,matchPattern:()=>Wt,matchRoute:()=>dt,parseLocation:()=>lt,parseRoute:()=>ft,redirect:()=>Jt,resolveRelativeUrl:()=>Rt,useLocation:()=>q,useRootRoute:()=>K,useRoute:()=>ct,useRouteMatch:()=>H,useRouter:()=>w});module.exports=Kt(re);var xt=require("react");var gt=require("react"),I=(0,gt.createContext)(null);var w=()=>{let t=(0,xt.useContext)(I);if(t===null)throw new Error("useRouter must be used within a Stack");return t};var yt=require("react"),vt=require("react/jsx-runtime"),Vt=(0,yt.memo)(({to:t,replace:o,transitionType:n,duration:s,onFinish:e,...u})=>{let a=w();return(0,vt.jsx)("a",{...u,href:t,onClick:i=>{i.preventDefault(),a.navigate({to:t,replace:o,transitionType:n,duration:s,onFinish:e})}})});var Tt=require("react"),X=(0,Tt.createContext)(null);var k=require("react"),Pt=require("react/jsx-runtime"),j=(0,k.memo)(({location:t,...o})=>{let n=w(),s=(0,k.useMemo)(()=>t.state,[t]),e=(0,k.useCallback)((i,r)=>{n.setLocationState(t.index,T=>({...T,[i]:r}))},[n,t]),u=(0,k.useCallback)(i=>{n.setLocationState(t.index,r=>(delete r[i],r))},[n,t]),a=(0,k.useCallback)((i,r)=>{n.setLocationSearch(t.index,{...t.search,[i]:r})},[n,t]);return(0,Pt.jsx)(X.Provider,{value:{...t,canGoBack:!n.isTransitioning&&t.index>0,canGoForward:!n.isTransitioning&&t.index+1<n.history.length,state:s,setState:e,deleteState:u,setSearch:a},...o})},(t,o)=>t.location===o.location);var Lt=require("react"),Q=(0,Lt.createContext)(0);var Ct=require("react"),St=()=>(0,Ct.useContext)(Q);var wt=require("react"),tt=(0,wt.createContext)(null);var bt=require("react"),H=()=>{let t=(0,bt.useContext)(tt);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};var kt=require("react/jsx-runtime"),Ot=({depth:t,...o})=>(0,kt.jsx)(Q.Provider,{value:t,...o});var Mt=require("react");var q=()=>{let t=(0,Mt.useContext)(X);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};var Nt=require("react"),Y=(0,Nt.createContext)(null);var At=require("react"),ct=()=>{let t=(0,At.useContext)(Y);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};var Ft=require("react");var z=require("react/jsx-runtime"),et=({depth:t=0})=>{let o=w(),n=q(),s=H(),e=ct(),u=`_Z.${e.id}.pending`,a=!!e.beforeLoad&&e.getState(u)!==!1;if((0,Ft.useEffect)(()=>{e&&e.beforeLoad&&e.getState(u)===void 0&&(e.setState(u,!0),e.beforeLoad?.({location:n}).then(()=>e.setState(u,!1)).catch(({cause:r})=>{r&&"to"in r?(console.log("Redirecting to:",r.to),o.navigate({...r,onFinish:()=>{e.setState(u,!1)}})):e.setState(u,!1)}))},[e]),!e)return null;if(a){let r=e.pendingComponent;return(0,z.jsx)(r,{})}if(t>=s.matches.length){let r=e.notFoundComponent;return(0,z.jsx)(r,{})}let i=e.component;return i?(0,z.jsx)(i,{}):(0,z.jsx)(ut,{})};var Dt=require("react");var Et=require("react"),_=(0,Et.createContext)(null);var K=()=>{let t=(0,Dt.useContext)(_);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};var pt=require("react"),mt=require("react/jsx-runtime"),ot=({route:t,...o})=>{if(!t)return(0,mt.jsx)(Y.Provider,{value:null,...o});let{state:n,getRouteState:s,setRouteState:e}=K(),u=(0,pt.useCallback)(i=>s(t.id,i),[s,t.id]),a=(0,pt.useCallback)((i,r)=>{e(t.id,i,r)},[e,t.id]);return(0,mt.jsx)(Y.Provider,{value:{...t,state:n[t.id],getState:u,setState:a},...o})};var nt=require("react/jsx-runtime"),ut=()=>{let t=H(),o=St()+1;return(0,nt.jsx)(Ot,{depth:o,children:(0,nt.jsx)(ot,{route:t.matches.at(o),children:(0,nt.jsx)(et,{depth:o})})})};var x=require("react");var $t={defaultTransitionDuration:300};var Zt=300,Jt=t=>new Error("",{cause:t}),Wt=(t,o)=>{try{let n,s;if(o.startsWith("http://")||o.startsWith("https://")){let l=new URL(o);n=l.pathname,s=l.searchParams}else{let[l,v]=o.split("?");if(!l)return null;n=l,s=new URLSearchParams(v||"")}let e=n.replaceAll(/^\/|\/$/g,""),u=t.replaceAll(/^\/|\/$/g,""),a=e.split("/"),i=u.split("/");if(a.length!==i.length)return null;let r={};for(let l=0;l<i.length;l++){let v=i[l],b=a[l];if(v.startsWith(":")){let E=v.slice(1);r[E]=decodeURIComponent(b)}else if(v!==b)return null}let T=Object.fromEntries(s.entries());return{params:r,query:T}}catch{return null}},dt=(t,o)=>{let n=(s,{children:e})=>{if(e&&e.length>0){for(let a of e){let i=n([...s,a],a);if(i)return i}return null}let u=Wt(Gt(s),o);return u?{matches:s,...u}:null};return n([t],t)||{matches:[],params:{},query:{}}},Gt=t=>{let o=[];for(let n of t)n.pathname!==void 0&&o.push(n.pathname.replaceAll(/^\/|\/$/g,""));return"/"+o.join("/")},lt=({href:t,pathname:o,search:n})=>({index:0,href:t,state:{index:0},pathname:o,search:Object.fromEntries(new URLSearchParams(n))}),Qt=t=>({...$t,...t}),ft=t=>{let o=(n,s)=>{let e=n.name??(n.pathname?`${s}/${n.pathname.replaceAll(/^\/|\/$/g,"")}`:s);return{...n,id:e,children:n.children?.map(a=>o(a,e))}};return o(t,"")},jt=t=>t.length>0,Rt=(t,o)=>{let n=t.split("/").filter(jt),s=o.split("/").filter(jt);for(let e of s)e!=="."&&(e===".."?n.pop():n.push(e));return"/"+n.join("/")},A=t=>{let o=new URLSearchParams(t.search).toString();return o?`${t.pathname}?${o}`:t.pathname};var ht=require("react/jsx-runtime"),te=({options:t,...o})=>{let[n,s]=(0,x.useState)([lt(window.location)]),[e,u]=(0,x.useState)(0),a=(0,x.useMemo)(()=>n.at(e),[n,e]),[i,r]=(0,x.useState)(!1),[T,l]=(0,x.useState)(),[v,b]=(0,x.useState)(),[E,S]=(0,x.useState)(0),M=!i&&e>0,W=!i&&e+1<n.length;(0,x.useEffect)(()=>{window.history.replaceState(a.state,"",A(a))},[]),(0,x.useEffect)(()=>{let p=({state:m})=>{console.log("popstate event:",m),u(m?.index)};return addEventListener("popstate",p),()=>{removeEventListener("popstate",p)}},[e]);let G=(0,x.useCallback)(({to:p,replace:m})=>{if(!p)return a;let R=m?e:e+1,d=p.startsWith("/")?p:Rt(a.pathname,p),[g,f]=d.split("?"),h=new URLSearchParams(f??""),C={index:R};return{index:R,href:origin+g+(f?`?${h.toString()}`:""),search:Object.fromEntries(h.entries()),state:C,pathname:g}},[e,a]),L=(p,m,R=t.defaultTransitionDuration,d)=>{r(!0),b(m),S(R),l(p),setTimeout(()=>{r(!1),b(void 0),l(void 0),d?.()},R)},V=(0,x.useCallback)(({to:p,replace:m,transitionType:R,duration:d,onFinish:g})=>{if(i)return;let f=m?e:e+1,h=G({to:p,replace:m}),C=()=>{m?(s(D=>[...D.slice(0,f),h,...D.slice(f+1)]),window.history.replaceState(h.state,"",A(h))):(s(D=>[...D.slice(0,f),h]),u(f),window.history.pushState(h.state,"",A(h))),g?.()},J=R??t.defaultTransitionType?.(a,h)??"slide-left";J?L(h,J,d,C):C()},[e,n,i,t]),O=(0,x.useCallback)(({transitionType:p,duration:m,onFinish:R,depth:d}={})=>{if(!M)return;let g=d??1,f=n.at(e-g);if(!f)return;let h=()=>{window.history.go(-g),R?.()},C=p??t.defaultTransitionType?.(a,f)??"slide-right";C?L(f,C,m,h):h()},[e,n,i,t]),U=(0,x.useCallback)(({transitionType:p,duration:m,depth:R,onFinish:d}={})=>{if(!W)return;let g=R??1,f=n.at(e+g);if(!f)return;let h=()=>{window.history.go(g),d?.()},C=p??t.defaultTransitionType?.(a,f)??"slide-left";C?L(f,C,m,h):h()},[e,n,i,t]),B=(0,x.useCallback)((p,m)=>{s(R=>R.map(d=>{if(d.index!==p)return d;let g=typeof m=="function"?m(d.state):m,f={...d,state:g};return p===e&&window.history.replaceState(g,"",A(f)),f}))},[e]),Z=(0,x.useCallback)((p,m)=>{s(R=>R.map(d=>{if(d.index!==p)return d;let g={...d,search:{...d.search,...m}};return p===e&&window.history.replaceState(g.state,"",A(g)),g}))},[]);return(0,ht.jsx)(I.Provider,{value:{options:t,history:n,location:a,canGoBack:M,canGoForward:W,isTransitioning:i,transitioningToLocation:T,transitionType:v,transitionDuration:E,buildLocation:G,navigate:V,back:O,forward:U,setLocationState:B,setLocationSearch:Z},children:(0,ht.jsx)(j,{location:a,...o})})};var y=require("react");var it=require("react");var rt=require("react/jsx-runtime"),st=(0,it.memo)(()=>{let t=K(),o=q(),n=(0,it.useMemo)(()=>dt(t,o.pathname),[t,o.pathname]);return(0,rt.jsx)(tt.Provider,{value:n,children:(0,rt.jsx)(ot,{route:t,children:(0,rt.jsx)(et,{})})})});var F=require("react"),Bt=require("react/jsx-runtime"),Ut=({route:t,...o})=>{let n=(0,F.useMemo)(()=>ft(t),[t]),[s,e]=(0,F.useState)({}),u=(0,F.useCallback)((i,r)=>s[i]?.[r],[s]),a=(0,F.useCallback)((i,r,T)=>{e(l=>({...l,[i]:{...l[i],[r]:T}}))},[]);return(0,Bt.jsx)(_.Provider,{value:{...n,state:s,getRouteState:u,setRouteState:a},...o})};var P=require("react/jsx-runtime"),ee={position:"absolute",inset:0,zIndex:-1},oe=({allowSwipeBack:t=!0,allowSwipeForward:o=!0,style:n,...s})=>{let{history:e,location:u,canGoBack:a,canGoForward:i,isTransitioning:r,transitioningToLocation:T,transitionType:l,transitionDuration:v,back:b,forward:E}=w(),S=u.index,M=(0,y.useRef)(!1),W=(0,y.useRef)(0),G=(0,y.useRef)(0),[L,V]=(0,y.useState)(!1),[O,U]=(0,y.useState)(0),[B,Z]=(0,y.useState)(!1),[p,m]=(0,y.useState)(!1),[R,d]=(0,y.useState)(!1),[g,f]=(0,y.useState)(!1);if((0,y.useEffect)(()=>{!r||!T||(f(!0),setTimeout(()=>{f(!1)},v))},[r,T,v]),S===void 0)return;let h=()=>{V(!1),U(0),Z(!1),m(!1),d(!1)},C=(0,y.useCallback)(N=>{r||!i&&!a||(M.current=!0,W.current=N.touches[0].clientX,G.current=N.touches[0].clientY)},[r,a,i]),J=(0,y.useCallback)(N=>{if(!M.current)return;let{clientX:It,clientY:Xt}=N.touches[0];if(!L&&Math.abs(Xt-G.current)>30){M.current=!1;return}let $=It-W.current;if(!(Math.abs($)<10)){if(L||V(!0),$>0&&S===0||$<0&&S+1===e.length){U(0);return}!B&&$<0&&o&&Z(!0),!p&&$>0&&t&&m(!0),U(Math.max(Math.min($,window.innerWidth),-window.innerWidth))}},[L,S,e.length,B,p,t,o]),D=(0,y.useCallback)(()=>{if(M.current=!1,!L)return;let N={onFinish:h};O>innerWidth*.3&&a&&t?b(N):O<-innerWidth*.3&&i&&o?E(N):(d(!0),setTimeout(h,v))},[b,E,L,O,a,i,v]);return(0,P.jsxs)("div",{style:{position:"relative",overflow:"hidden",...n},...s,children:[(r&&l==="slide-right"||L&&p)&&(0,P.jsx)("div",{style:ee,children:(0,P.jsx)(j,{location:r?T:e.at(S-1),children:(0,P.jsx)(st,{},S-1)})}),(0,P.jsx)("div",{style:{background:"white",position:"absolute",inset:0,transform:r&&l==="slide-right"?"translateX(100%)":L&&O>0&&!R?`translateX(${O}px)`:"translateX(0px)",transition:R||r&&l==="slide-right"?`transform ${v}ms ease-out`:""},onTouchStart:C,onTouchMove:J,onTouchEnd:D,children:(0,P.jsx)(st,{})},S),(r&&l==="slide-left"||L&&B)&&(0,P.jsx)("div",{style:{background:"white",position:"absolute",inset:0,zIndex:1,transform:`translateX(${g?"0px":r||R?"100%":`${innerWidth+O}px`})`,transition:`transform ${r||R?v:0}ms ease-in`},children:(0,P.jsx)(j,{location:r?T:e.at(S+1),children:(0,P.jsx)(st,{},T?.index)})})]})},ne=({route:t,...o})=>(0,P.jsx)(Ut,{route:t,children:(0,P.jsx)(oe,{...o})});0&&(module.exports={DefaultTransitionDuration,Link,LocationContext,LocationProvider,Outlet,RootRouteContext,RouterContext,RouterProvider,Stack,buildPathnameFromMatches,buildUrlFromLocation,createRouterOptions,matchPattern,matchRoute,parseLocation,parseRoute,redirect,resolveRelativeUrl,useLocation,useRootRoute,useRoute,useRouteMatch,useRouter});
|
|
1
|
+
"use strict";var at=Object.defineProperty;var Ht=Object.getOwnPropertyDescriptor;var qt=Object.getOwnPropertyNames;var Yt=Object.prototype.hasOwnProperty;var zt=(t,o)=>{for(var n in o)at(t,n,{get:o[n],enumerable:!0})},_t=(t,o,n,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of qt(o))!Yt.call(t,e)&&e!==n&&at(t,e,{get:()=>o[e],enumerable:!(s=Ht(o,e))||s.enumerable});return t};var Kt=t=>_t(at({},"__esModule",{value:!0}),t);var re={};zt(re,{DefaultTransitionDuration:()=>Zt,Link:()=>Vt,LocationContext:()=>X,LocationProvider:()=>j,Outlet:()=>ut,RootRouteContext:()=>_,RouterContext:()=>I,RouterProvider:()=>te,Stack:()=>ne,buildPathnameFromMatches:()=>Gt,buildUrlFromLocation:()=>A,createRouterOptions:()=>Qt,matchPattern:()=>Wt,matchRoute:()=>dt,parseLocation:()=>lt,parseRoute:()=>ft,redirect:()=>Jt,resolveRelativeUrl:()=>Rt,useLocation:()=>q,useRootRoute:()=>K,useRoute:()=>ct,useRouteMatch:()=>H,useRouter:()=>w});module.exports=Kt(re);var xt=require("react");var gt=require("react"),I=(0,gt.createContext)(null);var w=()=>{let t=(0,xt.useContext)(I);if(t===null)throw new Error("useRouter must be used within a Stack");return t};var yt=require("react"),vt=require("react/jsx-runtime"),Vt=(0,yt.memo)(({to:t,replace:o,transitionType:n,duration:s,onFinish:e,...u})=>{let a=w();return(0,vt.jsx)("a",{...u,href:t,onClick:i=>{i.preventDefault(),a.navigate({to:t,replace:o,transitionType:n,duration:s,onFinish:e})}})});var Tt=require("react"),X=(0,Tt.createContext)(null);var k=require("react"),Pt=require("react/jsx-runtime"),j=(0,k.memo)(({location:t,...o})=>{let n=w(),s=(0,k.useMemo)(()=>t.state,[t]),e=(0,k.useCallback)((i,r)=>{n.setLocationState(t.index,T=>({...T,[i]:r}))},[n,t]),u=(0,k.useCallback)(i=>{n.setLocationState(t.index,r=>(delete r[i],r))},[n,t]),a=(0,k.useCallback)((i,r)=>{n.setLocationSearch(t.index,{...t.search,[i]:r})},[n,t]);return(0,Pt.jsx)(X.Provider,{value:{...t,canGoBack:!n.isTransitioning&&t.index>0,canGoForward:!n.isTransitioning&&t.index+1<n.history.length,state:s,setState:e,deleteState:u,setSearch:a},...o})},(t,o)=>t.location===o.location);var Lt=require("react"),Q=(0,Lt.createContext)(0);var Ct=require("react"),St=()=>(0,Ct.useContext)(Q);var wt=require("react"),tt=(0,wt.createContext)(null);var Ot=require("react"),H=()=>{let t=(0,Ot.useContext)(tt);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};var kt=require("react/jsx-runtime"),bt=({depth:t,...o})=>(0,kt.jsx)(Q.Provider,{value:t,...o});var Mt=require("react");var q=()=>{let t=(0,Mt.useContext)(X);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};var Nt=require("react"),Y=(0,Nt.createContext)(null);var At=require("react"),ct=()=>{let t=(0,At.useContext)(Y);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};var Ft=require("react");var z=require("react/jsx-runtime"),et=({depth:t=0})=>{let o=w(),n=q(),s=H(),e=ct(),u=`_Z.${e.id}.pending`,a=!!e.beforeLoad&&e.getState(u)!==!1;if((0,Ft.useEffect)(()=>{e&&e.beforeLoad&&e.getState(u)===void 0&&(e.setState(u,!0),e.beforeLoad?.({location:n}).then(()=>e.setState(u,!1)).catch(({cause:r})=>{r&&"to"in r?(console.log("Redirecting to:",r.to),o.navigate({...r,onFinish:()=>{e.setState(u,!1)}})):e.setState(u,!1)}))},[e]),!e)return null;if(a){let r=e.pendingComponent;return(0,z.jsx)(r,{})}if(t>=s.matches.length){let r=e.notFoundComponent;return(0,z.jsx)(r,{})}let i=e.component;return i?(0,z.jsx)(i,{}):(0,z.jsx)(ut,{})};var Dt=require("react");var Et=require("react"),_=(0,Et.createContext)(null);var K=()=>{let t=(0,Dt.useContext)(_);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};var pt=require("react"),mt=require("react/jsx-runtime"),ot=({route:t,...o})=>{if(!t)return(0,mt.jsx)(Y.Provider,{value:null,...o});let{state:n,getRouteState:s,setRouteState:e}=K(),u=(0,pt.useCallback)(i=>s(t.id,i),[s,t.id]),a=(0,pt.useCallback)((i,r)=>{e(t.id,i,r)},[e,t.id]);return(0,mt.jsx)(Y.Provider,{value:{...t,state:n[t.id],getState:u,setState:a},...o})};var nt=require("react/jsx-runtime"),ut=()=>{let t=H(),o=St()+1;return(0,nt.jsx)(bt,{depth:o,children:(0,nt.jsx)(ot,{route:t.matches.at(o),children:(0,nt.jsx)(et,{depth:o})})})};var x=require("react");var $t={defaultTransitionDuration:300};var Zt=300,Jt=t=>new Error("",{cause:t}),Wt=(t,o)=>{try{let n,s;if(o.startsWith("http://")||o.startsWith("https://")){let l=new URL(o);n=l.pathname,s=l.searchParams}else{let[l,v]=o.split("?");if(!l)return null;n=l,s=new URLSearchParams(v||"")}let e=n.replaceAll(/^\/|\/$/g,""),u=t.replaceAll(/^\/|\/$/g,""),a=e.split("/"),i=u.split("/");if(a.length!==i.length)return null;let r={};for(let l=0;l<i.length;l++){let v=i[l],O=a[l];if(v.startsWith(":")){let E=v.slice(1);r[E]=decodeURIComponent(O)}else if(v!==O)return null}let T=Object.fromEntries(s.entries());return{params:r,query:T}}catch{return null}},dt=(t,o)=>{let n=(s,{children:e})=>{if(e&&e.length>0){for(let a of e){let i=n([...s,a],a);if(i)return i}return null}let u=Wt(Gt(s),o);return u?{matches:s,...u}:null};return n([t],t)||{matches:[],params:{},query:{}}},Gt=t=>{let o=[];for(let n of t)n.pathname!==void 0&&o.push(n.pathname.replaceAll(/^\/|\/$/g,""));return"/"+o.join("/")},lt=({href:t,pathname:o,search:n})=>({index:0,href:t,state:{index:0},pathname:o,search:Object.fromEntries(new URLSearchParams(n))}),Qt=t=>({...$t,...t}),ft=t=>{let o=(n,s)=>{let e=n.name??(n.pathname?`${s}/${n.pathname.replaceAll(/^\/|\/$/g,"")}`:s);return{...n,id:e,children:n.children?.map(a=>o(a,e))}};return o(t,"")},jt=t=>t.length>0,Rt=(t,o)=>{let n=t.split("/").filter(jt),s=o.split("/").filter(jt);for(let e of s)e!=="."&&(e===".."?n.pop():n.push(e));return"/"+n.join("/")},A=t=>{let o=new URLSearchParams(t.search).toString();return o?`${t.pathname}?${o}`:t.pathname};var ht=require("react/jsx-runtime"),te=({options:t,...o})=>{let[n,s]=(0,x.useState)([lt(window.location)]),[e,u]=(0,x.useState)(0),a=(0,x.useMemo)(()=>n.at(e),[n,e]),[i,r]=(0,x.useState)(!1),[T,l]=(0,x.useState)(),[v,O]=(0,x.useState)(),[E,S]=(0,x.useState)(0),M=!i&&e>0,W=!i&&e+1<n.length;(0,x.useEffect)(()=>{window.history.replaceState(a.state,"",A(a))},[]),(0,x.useEffect)(()=>{let p=({state:m})=>{u(m?.index)};return addEventListener("popstate",p),()=>{removeEventListener("popstate",p)}},[e]);let G=(0,x.useCallback)(({to:p,replace:m})=>{if(!p)return a;let R=m?e:e+1,d=p.startsWith("/")?p:Rt(a.pathname,p),[g,f]=d.split("?"),h=new URLSearchParams(f??""),C={index:R};return{index:R,href:origin+g+(f?`?${h.toString()}`:""),search:Object.fromEntries(h.entries()),state:C,pathname:g}},[e,a]),L=(p,m,R=t.defaultTransitionDuration,d)=>{r(!0),O(m),S(R),l(p),setTimeout(()=>{r(!1),O(void 0),l(void 0),d?.()},R)},V=(0,x.useCallback)(({to:p,replace:m,transitionType:R,duration:d,onFinish:g})=>{if(i)return;let f=m?e:e+1,h=G({to:p,replace:m}),C=()=>{m?(s(D=>[...D.slice(0,f),h,...D.slice(f+1)]),window.history.replaceState(h.state,"",A(h))):(s(D=>[...D.slice(0,f),h]),u(f),window.history.pushState(h.state,"",A(h))),g?.()},J=R??t.defaultTransitionType?.(a,h)??"slide-left";J?L(h,J,d,C):C()},[e,n,i,t]),b=(0,x.useCallback)(({transitionType:p,duration:m,onFinish:R,depth:d}={})=>{if(!M)return;let g=d??1,f=n.at(e-g);if(!f)return;let h=()=>{window.history.go(-g),R?.()},C=p??t.defaultTransitionType?.(a,f)??"slide-right";C?L(f,C,m,h):h()},[e,n,i,t]),U=(0,x.useCallback)(({transitionType:p,duration:m,depth:R,onFinish:d}={})=>{if(!W)return;let g=R??1,f=n.at(e+g);if(!f)return;let h=()=>{window.history.go(g),d?.()},C=p??t.defaultTransitionType?.(a,f)??"slide-left";C?L(f,C,m,h):h()},[e,n,i,t]),B=(0,x.useCallback)((p,m)=>{s(R=>R.map(d=>{if(d.index!==p)return d;let g=typeof m=="function"?m(d.state):m,f={...d,state:g};return p===e&&window.history.replaceState(g,"",A(f)),f}))},[e]),Z=(0,x.useCallback)((p,m)=>{s(R=>R.map(d=>{if(d.index!==p)return d;let g={...d,search:{...d.search,...m}};return p===e&&window.history.replaceState(g.state,"",A(g)),g}))},[]);return(0,ht.jsx)(I.Provider,{value:{options:t,history:n,location:a,canGoBack:M,canGoForward:W,isTransitioning:i,transitioningToLocation:T,transitionType:v,transitionDuration:E,buildLocation:G,navigate:V,back:b,forward:U,setLocationState:B,setLocationSearch:Z},children:(0,ht.jsx)(j,{location:a,...o})})};var y=require("react");var it=require("react");var rt=require("react/jsx-runtime"),st=(0,it.memo)(()=>{let t=K(),o=q(),n=(0,it.useMemo)(()=>dt(t,o.pathname),[t,o.pathname]);return(0,rt.jsx)(tt.Provider,{value:n,children:(0,rt.jsx)(ot,{route:t,children:(0,rt.jsx)(et,{})})})});var F=require("react"),Bt=require("react/jsx-runtime"),Ut=({route:t,...o})=>{let n=(0,F.useMemo)(()=>ft(t),[t]),[s,e]=(0,F.useState)({}),u=(0,F.useCallback)((i,r)=>s[i]?.[r],[s]),a=(0,F.useCallback)((i,r,T)=>{e(l=>({...l,[i]:{...l[i],[r]:T}}))},[]);return(0,Bt.jsx)(_.Provider,{value:{...n,state:s,getRouteState:u,setRouteState:a},...o})};var P=require("react/jsx-runtime"),ee={position:"absolute",inset:0,zIndex:-1},oe=({allowSwipeBack:t=!0,allowSwipeForward:o=!0,style:n,...s})=>{let{history:e,location:u,canGoBack:a,canGoForward:i,isTransitioning:r,transitioningToLocation:T,transitionType:l,transitionDuration:v,back:O,forward:E}=w(),S=u.index,M=(0,y.useRef)(!1),W=(0,y.useRef)(0),G=(0,y.useRef)(0),[L,V]=(0,y.useState)(!1),[b,U]=(0,y.useState)(0),[B,Z]=(0,y.useState)(!1),[p,m]=(0,y.useState)(!1),[R,d]=(0,y.useState)(!1),[g,f]=(0,y.useState)(!1);if((0,y.useEffect)(()=>{!r||!T||(f(!0),setTimeout(()=>{f(!1)},v))},[r,T,v]),S===void 0)return;let h=()=>{V(!1),U(0),Z(!1),m(!1),d(!1)},C=(0,y.useCallback)(N=>{r||!i&&!a||(M.current=!0,W.current=N.touches[0].clientX,G.current=N.touches[0].clientY)},[r,a,i]),J=(0,y.useCallback)(N=>{if(!M.current)return;let{clientX:It,clientY:Xt}=N.touches[0];if(!L&&Math.abs(Xt-G.current)>30){M.current=!1;return}let $=It-W.current;if(!(Math.abs($)<10)){if(L||V(!0),$>0&&S===0||$<0&&S+1===e.length){U(0);return}!B&&$<0&&o&&Z(!0),!p&&$>0&&t&&m(!0),U(Math.max(Math.min($,window.innerWidth),-window.innerWidth))}},[L,S,e.length,B,p,t,o]),D=(0,y.useCallback)(()=>{if(M.current=!1,!L)return;let N={onFinish:h};b>innerWidth*.3&&a&&t?O(N):b<-innerWidth*.3&&i&&o?E(N):(d(!0),setTimeout(h,v))},[O,E,L,b,a,i,v]);return(0,P.jsxs)("div",{style:{position:"relative",overflow:"hidden",...n},...s,children:[(r&&l==="slide-right"||L&&p)&&(0,P.jsx)("div",{style:ee,children:(0,P.jsx)(j,{location:r?T:e.at(S-1),children:(0,P.jsx)(st,{},S-1)})}),(0,P.jsx)("div",{style:{position:"absolute",inset:0,transform:r&&l==="slide-right"?"translateX(100%)":L&&b>0&&!R?`translateX(${b}px)`:"translateX(0px)",transition:R||r&&l==="slide-right"?`transform ${v}ms ease-out`:""},onTouchStart:C,onTouchMove:J,onTouchEnd:D,children:(0,P.jsx)(st,{})},S),(r&&l==="slide-left"||L&&B)&&(0,P.jsx)("div",{style:{position:"absolute",inset:0,zIndex:1,transform:`translateX(${g?"0px":r||R?"100%":`${innerWidth+b}px`})`,transition:`transform ${r||R?v:0}ms ease-in`},children:(0,P.jsx)(j,{location:r?T:e.at(S+1),children:(0,P.jsx)(st,{},T?.index)})})]})},ne=({route:t,...o})=>(0,P.jsx)(Ut,{route:t,children:(0,P.jsx)(oe,{...o})});0&&(module.exports={DefaultTransitionDuration,Link,LocationContext,LocationProvider,Outlet,RootRouteContext,RouterContext,RouterProvider,Stack,buildPathnameFromMatches,buildUrlFromLocation,createRouterOptions,matchPattern,matchRoute,parseLocation,parseRoute,redirect,resolveRelativeUrl,useLocation,useRootRoute,useRoute,useRouteMatch,useRouter});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 TransitionType,\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 transitioningToLocation?: Location;\n transitionType?: TransitionType;\n transitionDuration: number;\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: (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => void;\n setLocationSearch: (\n locationIndex: number,\n search: Record<string, string>\n ) => 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, transitionType, 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({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n });\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 state: Record<string, any>;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n setSearch: (key: string, value: 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, useMemo } 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 state = useMemo(() => location.state, [location]);\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, (prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n router.setLocationState(location.index, (prev) => {\n delete prev[key];\n return prev;\n });\n },\n [router, location]\n );\n const setSearch = useCallback(\n (key: string, value: string) => {\n router.setLocationSearch(location.index, {\n ...location.search,\n [key]: value,\n });\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: !router.isTransitioning && location.index > 0,\n canGoForward:\n !router.isTransitioning &&\n location.index + 1 < router.history.length,\n state,\n setState,\n deleteState,\n setSearch,\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 } 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 const pending =\n !!route.beforeLoad && route.getState(pendingStateKey) !== false;\n\n useEffect(() => {\n if (!route) {\n return;\n }\n if (route.beforeLoad && route.getState(pendingStateKey) === undefined) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad?.({ location })\n .then(() => route.setState(pendingStateKey, false))\n .catch(({ cause }: Error) => {\n if (!!cause && \"to\" in (cause as any)) {\n console.log(\"Redirecting to:\", (cause as any).to);\n router.navigate({\n ...(cause as any),\n onFinish: () => {\n route.setState(pendingStateKey, false);\n },\n });\n } else {\n route.setState(pendingStateKey, false);\n }\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\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, useMemo, 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 TransitionType,\n} from \"@/types.js\";\nimport {\n buildUrlFromLocation,\n parseLocation,\n resolveRelativeUrl,\n} 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 = useMemo(\n () => history.at(currentLocationIndex)!,\n [history, currentLocationIndex]\n );\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n const [transitionType, setTransitionType] = useState<TransitionType>();\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n\n const canGoBack = !isTransitioning && currentLocationIndex > 0;\n const canGoForward =\n !isTransitioning && currentLocationIndex + 1 < history.length;\n\n useEffect(() => {\n window.history.replaceState(\n location.state,\n \"\",\n buildUrlFromLocation(location)\n );\n }, []);\n\n useEffect(() => {\n const handlePopState = ({ state }: PopStateEvent) => {\n console.log(\"popstate event:\", state);\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 url = to.startsWith(\"/\")\n ? to\n : resolveRelativeUrl(location.pathname, to);\n const [pathname, search] = url.split(\"?\");\n const searchParams = new URLSearchParams(search ?? \"\");\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname + (search ? `?${searchParams.toString()}` : \"\"),\n search: Object.fromEntries(searchParams.entries()),\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n transitionType: TransitionType,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionType(transitionType);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitionType(undefined);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transitionType,\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 buildUrlFromLocation(newLocation)\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transitionType, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (!canGoBack) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-right\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({\n transitionType,\n duration,\n depth,\n onFinish,\n }: ForwardActionOptions = {}) => {\n if (!canGoForward) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, 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 (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) => {\n if (location.index !== index) {\n return location;\n }\n const newState =\n typeof state === \"function\" ? state(location.state) : state;\n const newLocation = { ...location, state: newState };\n if (index === currentLocationIndex) {\n window.history.replaceState(\n newState,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n [currentLocationIndex]\n );\n\n const setLocationSearch = useCallback(\n (locationIndex: number, search: Record<string, string>) => {\n setHistory((prev) =>\n prev.map((location) => {\n if (location.index !== locationIndex) return location;\n const newLocation = {\n ...location,\n search: {\n ...location.search,\n ...search,\n },\n };\n if (locationIndex === currentLocationIndex) {\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n []\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,\n canGoForward,\n\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n setLocationSearch,\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 NavigateActionOptions,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: NavigateActionOptions) => {\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 url.\n * @param url The base url.\n * @param to The relative path to resolve.\n * @returns The resolved absolute url.\n */\nexport const resolveRelativeUrl = (url: string, to: string): string => {\n const currentPathSegments = url.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\nexport const buildUrlFromLocation = (location: Location): string => {\n const searchParams = new URLSearchParams(location.search).toString();\n return searchParams\n ? `${location.pathname}?${searchParams}`\n : location.pathname;\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\nconst PreviousComponentStyle = {\n position: \"absolute\",\n inset: 0,\n zIndex: -1,\n} as const;\n\nexport interface StackComponentProps\n extends React.ComponentPropsWithoutRef<\"div\"> {\n allowSwipeForward?: boolean;\n allowSwipeBack?: boolean;\n}\n\nconst StackComponent: React.FC<StackComponentProps> = ({\n allowSwipeBack = true,\n allowSwipeForward = true,\n style,\n ...props\n}) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionType,\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 [showPreviousComponent, setShowPreviousComponent] = useState(false);\n const [showNextComponent, setShowNextComponent] = 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 setShowPreviousComponent(false);\n setShowNextComponent(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = useCallback(\n (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 [isTransitioning, canGoBack, canGoForward]\n );\n\n const handleTouchMove = useCallback(\n (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 (!showPreviousComponent && offset < 0 && allowSwipeForward)\n setShowPreviousComponent(true);\n if (!showNextComponent && offset > 0 && allowSwipeBack)\n setShowNextComponent(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n },\n [\n isDragging,\n currentLocationIndex,\n history.length,\n showPreviousComponent,\n showNextComponent,\n allowSwipeBack,\n allowSwipeForward,\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 && allowSwipeBack) {\n back(options);\n } else if (\n dragOffset < -innerWidth * 0.3 &&\n canGoForward &&\n allowSwipeForward\n ) {\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 {((isTransitioning && transitionType === \"slide-right\") ||\n (isDragging && showNextComponent)) && (\n <div style={PreviousComponentStyle}>\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex - 1)!\n }\n >\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 && transitionType === \"slide-right\"\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling || (isTransitioning && transitionType === \"slide-right\")\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n {((isTransitioning && transitionType === \"slide-left\") ||\n (isDragging && showPreviousComponent)) && (\n <div\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n zIndex: 1,\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 route: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ route, ...props }) => (\n <RootRouteProvider route={route}>\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 { memo, useMemo } from \"react\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = memo(() => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = useMemo(\n () => matchRoute(rootRoute, location.pathname),\n [rootRoute, location.pathname]\n );\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, useMemo, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n route,\n ...props\n}: {\n route: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = useMemo(() => parseRoute(route), [route]);\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","buildUrlFromLocation","createRouterOptions","matchPattern","matchRoute","parseLocation","parseRoute","redirect","resolveRelativeUrl","useLocation","useRootRoute","useRoute","useRouteMatch","useRouter","__toCommonJS","import_react","import_react","RouterContext","useRouter","router","RouterContext","import_react","import_jsx_runtime","Link","to","replace","transitionType","duration","onFinish","props","router","useRouter","e","import_react","LocationContext","import_react","import_jsx_runtime","LocationProvider","location","props","router","useRouter","state","setState","key","value","prev","deleteState","setSearch","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","cause","PendingComponent","NotFoundComponent","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","resolveRelativeUrl","to","currentPathSegments","toPathSegments","buildUrlFromLocation","location","import_jsx_runtime","RouterProvider","options","props","history","setHistory","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","isTransitioning","setIsTransitioning","transitioningToLocation","setTransitioningToLocation","transitionType","setTransitionType","transitionDuration","setTransitionDuration","canGoBack","canGoForward","buildUrlFromLocation","handlePopState","state","buildLocation","to","replace","index","url","resolveRelativeUrl","pathname","search","searchParams","transitionTo","duration","callback","navigate","onFinish","newLocation","updateHistory","prevHistory","finalTransitionType","back","depth","backDepth","forward","forwardDepth","setLocationState","newState","setLocationSearch","locationIndex","prev","RouterContext","LocationProvider","import_react","import_react","import_jsx_runtime","PageRenderer","rootRoute","useRootRoute","location","useLocation","routeMatch","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","import_react","import_jsx_runtime","RootRouteProvider","route","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","import_jsx_runtime","PreviousComponentStyle","StackComponent","allowSwipeBack","allowSwipeForward","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionType","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","startX","startY","isDragging","setIsDragging","dragOffset","setDragOffset","showPreviousComponent","setShowPreviousComponent","showNextComponent","setShowNextComponent","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","reset","handleTouchStart","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","route","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 TransitionType,\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 transitioningToLocation?: Location;\n transitionType?: TransitionType;\n transitionDuration: number;\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: (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => void;\n setLocationSearch: (\n locationIndex: number,\n search: Record<string, string>\n ) => 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, transitionType, 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({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n });\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 state: Record<string, any>;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n setSearch: (key: string, value: 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, useMemo } 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 state = useMemo(() => location.state, [location]);\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, (prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n router.setLocationState(location.index, (prev) => {\n delete prev[key];\n return prev;\n });\n },\n [router, location]\n );\n const setSearch = useCallback(\n (key: string, value: string) => {\n router.setLocationSearch(location.index, {\n ...location.search,\n [key]: value,\n });\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: !router.isTransitioning && location.index > 0,\n canGoForward:\n !router.isTransitioning &&\n location.index + 1 < router.history.length,\n state,\n setState,\n deleteState,\n setSearch,\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 } 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 const pending =\n !!route.beforeLoad && route.getState(pendingStateKey) !== false;\n\n useEffect(() => {\n if (!route) {\n return;\n }\n if (route.beforeLoad && route.getState(pendingStateKey) === undefined) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad?.({ location })\n .then(() => route.setState(pendingStateKey, false))\n .catch(({ cause }: Error) => {\n if (!!cause && \"to\" in (cause as any)) {\n console.log(\"Redirecting to:\", (cause as any).to);\n router.navigate({\n ...(cause as any),\n onFinish: () => {\n route.setState(pendingStateKey, false);\n },\n });\n } else {\n route.setState(pendingStateKey, false);\n }\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\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, useMemo, 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 TransitionType,\n} from \"@/types.js\";\nimport {\n buildUrlFromLocation,\n parseLocation,\n resolveRelativeUrl,\n} 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 = useMemo(\n () => history.at(currentLocationIndex)!,\n [history, currentLocationIndex]\n );\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n const [transitionType, setTransitionType] = useState<TransitionType>();\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n\n const canGoBack = !isTransitioning && currentLocationIndex > 0;\n const canGoForward =\n !isTransitioning && currentLocationIndex + 1 < history.length;\n\n useEffect(() => {\n window.history.replaceState(\n location.state,\n \"\",\n buildUrlFromLocation(location)\n );\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 url = to.startsWith(\"/\")\n ? to\n : resolveRelativeUrl(location.pathname, to);\n const [pathname, search] = url.split(\"?\");\n const searchParams = new URLSearchParams(search ?? \"\");\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname + (search ? `?${searchParams.toString()}` : \"\"),\n search: Object.fromEntries(searchParams.entries()),\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n transitionType: TransitionType,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionType(transitionType);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitionType(undefined);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transitionType,\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 buildUrlFromLocation(newLocation)\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transitionType, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (!canGoBack) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-right\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({\n transitionType,\n duration,\n depth,\n onFinish,\n }: ForwardActionOptions = {}) => {\n if (!canGoForward) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, 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 (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) => {\n if (location.index !== index) {\n return location;\n }\n const newState =\n typeof state === \"function\" ? state(location.state) : state;\n const newLocation = { ...location, state: newState };\n if (index === currentLocationIndex) {\n window.history.replaceState(\n newState,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n [currentLocationIndex]\n );\n\n const setLocationSearch = useCallback(\n (locationIndex: number, search: Record<string, string>) => {\n setHistory((prev) =>\n prev.map((location) => {\n if (location.index !== locationIndex) return location;\n const newLocation = {\n ...location,\n search: {\n ...location.search,\n ...search,\n },\n };\n if (locationIndex === currentLocationIndex) {\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n []\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,\n canGoForward,\n\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n setLocationSearch,\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 NavigateActionOptions,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: NavigateActionOptions) => {\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 url.\n * @param url The base url.\n * @param to The relative path to resolve.\n * @returns The resolved absolute url.\n */\nexport const resolveRelativeUrl = (url: string, to: string): string => {\n const currentPathSegments = url.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\nexport const buildUrlFromLocation = (location: Location): string => {\n const searchParams = new URLSearchParams(location.search).toString();\n return searchParams\n ? `${location.pathname}?${searchParams}`\n : location.pathname;\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\nconst PreviousComponentStyle = {\n position: \"absolute\",\n inset: 0,\n zIndex: -1,\n} as const;\n\nexport interface StackComponentProps\n extends React.ComponentPropsWithoutRef<\"div\"> {\n allowSwipeForward?: boolean;\n allowSwipeBack?: boolean;\n}\n\nconst StackComponent: React.FC<StackComponentProps> = ({\n allowSwipeBack = true,\n allowSwipeForward = true,\n style,\n ...props\n}) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionType,\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 [showPreviousComponent, setShowPreviousComponent] = useState(false);\n const [showNextComponent, setShowNextComponent] = 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 setShowPreviousComponent(false);\n setShowNextComponent(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = useCallback(\n (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 [isTransitioning, canGoBack, canGoForward]\n );\n\n const handleTouchMove = useCallback(\n (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 (!showPreviousComponent && offset < 0 && allowSwipeForward)\n setShowPreviousComponent(true);\n if (!showNextComponent && offset > 0 && allowSwipeBack)\n setShowNextComponent(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n },\n [\n isDragging,\n currentLocationIndex,\n history.length,\n showPreviousComponent,\n showNextComponent,\n allowSwipeBack,\n allowSwipeForward,\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 && allowSwipeBack) {\n back(options);\n } else if (\n dragOffset < -innerWidth * 0.3 &&\n canGoForward &&\n allowSwipeForward\n ) {\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 {((isTransitioning && transitionType === \"slide-right\") ||\n (isDragging && showNextComponent)) && (\n <div style={PreviousComponentStyle}>\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex - 1)!\n }\n >\n <PageRenderer key={currentLocationIndex - 1} />\n </LocationProvider>\n </div>\n )}\n <div\n key={currentLocationIndex}\n style={{\n position: \"absolute\",\n inset: 0,\n transform:\n isTransitioning && transitionType === \"slide-right\"\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling || (isTransitioning && transitionType === \"slide-right\")\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n {((isTransitioning && transitionType === \"slide-left\") ||\n (isDragging && showPreviousComponent)) && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 1,\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 route: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ route, ...props }) => (\n <RootRouteProvider route={route}>\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 { memo, useMemo } from \"react\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = memo(() => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = useMemo(\n () => matchRoute(rootRoute, location.pathname),\n [rootRoute, location.pathname]\n );\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, useMemo, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n route,\n ...props\n}: {\n route: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = useMemo(() => parseRoute(route), [route]);\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","buildUrlFromLocation","createRouterOptions","matchPattern","matchRoute","parseLocation","parseRoute","redirect","resolveRelativeUrl","useLocation","useRootRoute","useRoute","useRouteMatch","useRouter","__toCommonJS","import_react","import_react","RouterContext","useRouter","router","RouterContext","import_react","import_jsx_runtime","Link","to","replace","transitionType","duration","onFinish","props","router","useRouter","e","import_react","LocationContext","import_react","import_jsx_runtime","LocationProvider","location","props","router","useRouter","state","setState","key","value","prev","deleteState","setSearch","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","cause","PendingComponent","NotFoundComponent","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","resolveRelativeUrl","to","currentPathSegments","toPathSegments","buildUrlFromLocation","location","import_jsx_runtime","RouterProvider","options","props","history","setHistory","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","isTransitioning","setIsTransitioning","transitioningToLocation","setTransitioningToLocation","transitionType","setTransitionType","transitionDuration","setTransitionDuration","canGoBack","canGoForward","buildUrlFromLocation","handlePopState","state","buildLocation","to","replace","index","url","resolveRelativeUrl","pathname","search","searchParams","transitionTo","duration","callback","navigate","onFinish","newLocation","updateHistory","prevHistory","finalTransitionType","back","depth","backDepth","forward","forwardDepth","setLocationState","newState","setLocationSearch","locationIndex","prev","RouterContext","LocationProvider","import_react","import_react","import_jsx_runtime","PageRenderer","rootRoute","useRootRoute","location","useLocation","routeMatch","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","import_react","import_jsx_runtime","RootRouteProvider","route","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","import_jsx_runtime","PreviousComponentStyle","StackComponent","allowSwipeBack","allowSwipeForward","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionType","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","startX","startY","isDragging","setIsDragging","dragOffset","setDragOffset","showPreviousComponent","setShowPreviousComponent","showNextComponent","setShowNextComponent","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","reset","handleTouchStart","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","route","RootRouteProvider"]}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useContext as Ot}from"react";import{createContext as bt}from"react";var Y=bt(null);var b=()=>{let t=Ot(Y);if(t===null)throw new Error("useRouter must be used within a Stack");return t};import{memo as kt}from"react";import{jsx as Mt}from"react/jsx-runtime";var le=kt(({to:t,replace:n,transitionType:o,duration:a,onFinish:e,...p})=>{let s=b();return Mt("a",{...p,href:t,onClick:i=>{i.preventDefault(),s.navigate({to:t,replace:n,transitionType:o,duration:a,onFinish:e})}})});import{createContext as Nt}from"react";var z=Nt(null);import{memo as At,useCallback as rt,useMemo as Ft}from"react";import{jsx as Et}from"react/jsx-runtime";var B=At(({location:t,...n})=>{let o=b(),a=Ft(()=>t.state,[t]),e=rt((i,r)=>{o.setLocationState(t.index,v=>({...v,[i]:r}))},[o,t]),p=rt(i=>{o.setLocationState(t.index,r=>(delete r[i],r))},[o,t]),s=rt((i,r)=>{o.setLocationSearch(t.index,{...t.search,[i]:r})},[o,t]);return Et(z.Provider,{value:{...t,canGoBack:!o.isTransitioning&&t.index>0,canGoForward:!o.isTransitioning&&t.index+1<o.history.length,state:a,setState:e,deleteState:p,setSearch:s},...n})},(t,n)=>t.location===n.location);import{createContext as Dt}from"react";var _=Dt(0);import{useContext as $t}from"react";var ut=()=>$t(_);import{createContext as jt}from"react";var K=jt(null);import{useContext as Wt}from"react";var V=()=>{let t=Wt(K);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};import{jsx as Gt}from"react/jsx-runtime";var pt=({depth:t,...n})=>Gt(_.Provider,{value:t,...n});import{useContext as Ut}from"react";var Z=()=>{let t=Ut(z);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};import{createContext as Bt}from"react";var I=Bt(null);import{useContext as It}from"react";var mt=()=>{let t=It(I);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};import{useEffect as Xt}from"react";import{jsx as J}from"react/jsx-runtime";var Q=({depth:t=0})=>{let n=b(),o=Z(),a=V(),e=mt(),p=`_Z.${e.id}.pending`,s=!!e.beforeLoad&&e.getState(p)!==!1;if(Xt(()=>{e&&e.beforeLoad&&e.getState(p)===void 0&&(e.setState(p,!0),e.beforeLoad?.({location:o}).then(()=>e.setState(p,!1)).catch(({cause:r})=>{r&&"to"in r?(console.log("Redirecting to:",r.to),n.navigate({...r,onFinish:()=>{e.setState(p,!1)}})):e.setState(p,!1)}))},[e]),!e)return null;if(s){let r=e.pendingComponent;return J(r,{})}if(t>=a.matches.length){let r=e.notFoundComponent;return J(r,{})}let i=e.component;return i?J(i,{}):J(dt,{})};import{useContext as qt}from"react";import{createContext as Ht}from"react";var tt=Ht(null);var et=()=>{let t=qt(tt);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};import{useCallback as lt}from"react";import{jsx as ft}from"react/jsx-runtime";var ot=({route:t,...n})=>{if(!t)return ft(I.Provider,{value:null,...n});let{state:o,getRouteState:a,setRouteState:e}=et(),p=lt(i=>a(t.id,i),[a,t.id]),s=lt((i,r)=>{e(t.id,i,r)},[e,t.id]);return ft(I.Provider,{value:{...t,state:o[t.id],getState:p,setState:s},...n})};import{jsx as it}from"react/jsx-runtime";var dt=()=>{let t=V(),n=ut()+1;return it(pt,{depth:n,children:it(ot,{route:t.matches.at(n),children:it(Q,{depth:n})})})};import{useCallback as E,useEffect as Tt,useMemo as _t,useState as D}from"react";var Rt={defaultTransitionDuration:300};var Do=300,$o=t=>new Error("",{cause:t}),Yt=(t,n)=>{try{let o,a;if(n.startsWith("http://")||n.startsWith("https://")){let f=new URL(n);o=f.pathname,a=f.searchParams}else{let[f,y]=n.split("?");if(!f)return null;o=f,a=new URLSearchParams(y||"")}let e=o.replaceAll(/^\/|\/$/g,""),p=t.replaceAll(/^\/|\/$/g,""),s=e.split("/"),i=p.split("/");if(s.length!==i.length)return null;let r={};for(let f=0;f<i.length;f++){let y=i[f],S=s[f];if(y.startsWith(":")){let M=y.slice(1);r[M]=decodeURIComponent(S)}else if(y!==S)return null}let v=Object.fromEntries(a.entries());return{params:r,query:v}}catch{return null}},gt=(t,n)=>{let o=(a,{children:e})=>{if(e&&e.length>0){for(let s of e){let i=o([...a,s],s);if(i)return i}return null}let p=Yt(zt(a),n);return p?{matches:a,...p}:null};return o([t],t)||{matches:[],params:{},query:{}}},zt=t=>{let n=[];for(let o of t)o.pathname!==void 0&&n.push(o.pathname.replaceAll(/^\/|\/$/g,""));return"/"+n.join("/")},xt=({href:t,pathname:n,search:o})=>({index:0,href:t,state:{index:0},pathname:n,search:Object.fromEntries(new URLSearchParams(o))}),jo=t=>({...Rt,...t}),yt=t=>{let n=(o,a)=>{let e=o.name??(o.pathname?`${a}/${o.pathname.replaceAll(/^\/|\/$/g,"")}`:a);return{...o,id:e,children:o.children?.map(s=>n(s,e))}};return n(t,"")},ht=t=>t.length>0,vt=(t,n)=>{let o=t.split("/").filter(ht),a=n.split("/").filter(ht);for(let e of a)e!=="."&&(e===".."?o.pop():o.push(e));return"/"+o.join("/")},F=t=>{let n=new URLSearchParams(t.search).toString();return n?`${t.pathname}?${n}`:t.pathname};import{jsx as Pt}from"react/jsx-runtime";var Ho=({options:t,...n})=>{let[o,a]=D([xt(window.location)]),[e,p]=D(0),s=_t(()=>o.at(e),[o,e]),[i,r]=D(!1),[v,f]=D(),[y,S]=D(),[M,L]=D(0),O=!i&&e>0,j=!i&&e+1<o.length;Tt(()=>{window.history.replaceState(s.state,"",F(s))},[]),Tt(()=>{let m=({state:d})=>{console.log("popstate event:",d),p(d?.index)};return addEventListener("popstate",m),()=>{removeEventListener("popstate",m)}},[e]);let W=E(({to:m,replace:d})=>{if(!m)return s;let h=d?e:e+1,l=m.startsWith("/")?m:vt(s.pathname,m),[x,R]=l.split("?"),g=new URLSearchParams(R??""),P={index:h};return{index:h,href:origin+x+(R?`?${g.toString()}`:""),search:Object.fromEntries(g.entries()),state:P,pathname:x}},[e,s]),T=(m,d,h=t.defaultTransitionDuration,l)=>{r(!0),S(d),L(h),f(m),setTimeout(()=>{r(!1),S(void 0),f(void 0),l?.()},h)},X=E(({to:m,replace:d,transitionType:h,duration:l,onFinish:x})=>{if(i)return;let R=d?e:e+1,g=W({to:m,replace:d}),P=()=>{d?(a(N=>[...N.slice(0,R),g,...N.slice(R+1)]),window.history.replaceState(g.state,"",F(g))):(a(N=>[...N.slice(0,R),g]),p(R),window.history.pushState(g.state,"",F(g))),x?.()},q=h??t.defaultTransitionType?.(s,g)??"slide-left";q?T(g,q,l,P):P()},[e,o,i,t]),w=E(({transitionType:m,duration:d,onFinish:h,depth:l}={})=>{if(!O)return;let x=l??1,R=o.at(e-x);if(!R)return;let g=()=>{window.history.go(-x),h?.()},P=m??t.defaultTransitionType?.(s,R)??"slide-right";P?T(R,P,d,g):g()},[e,o,i,t]),G=E(({transitionType:m,duration:d,depth:h,onFinish:l}={})=>{if(!j)return;let x=h??1,R=o.at(e+x);if(!R)return;let g=()=>{window.history.go(x),l?.()},P=m??t.defaultTransitionType?.(s,R)??"slide-left";P?T(R,P,d,g):g()},[e,o,i,t]),U=E((m,d)=>{a(h=>h.map(l=>{if(l.index!==m)return l;let x=typeof d=="function"?d(l.state):d,R={...l,state:x};return m===e&&window.history.replaceState(x,"",F(R)),R}))},[e]),H=E((m,d)=>{a(h=>h.map(l=>{if(l.index!==m)return l;let x={...l,search:{...l.search,...d}};return m===e&&window.history.replaceState(x.state,"",F(x)),x}))},[]);return Pt(Y.Provider,{value:{options:t,history:o,location:s,canGoBack:O,canGoForward:j,isTransitioning:i,transitioningToLocation:v,transitionType:y,transitionDuration:M,buildLocation:W,navigate:X,back:w,forward:G,setLocationState:U,setLocationSearch:H},children:Pt(B,{location:s,...n})})};import{useCallback as at,useEffect as te,useRef as ct,useState as $}from"react";import{memo as Kt,useMemo as Vt}from"react";import{jsx as st}from"react/jsx-runtime";var nt=Kt(()=>{let t=et(),n=Z(),o=Vt(()=>gt(t,n.pathname),[t,n.pathname]);return st(K.Provider,{value:o,children:st(ot,{route:t,children:st(Q,{})})})});import{useCallback as Lt,useMemo as Zt,useState as Jt}from"react";import{jsx as Qt}from"react/jsx-runtime";var Ct=({route:t,...n})=>{let o=Zt(()=>yt(t),[t]),[a,e]=Jt({}),p=Lt((i,r)=>a[i]?.[r],[a]),s=Lt((i,r,v)=>{e(f=>({...f,[i]:{...f[i],[r]:v}}))},[]);return Qt(tt.Provider,{value:{...o,state:a,getRouteState:p,setRouteState:s},...n})};import{jsx as C,jsxs as ne}from"react/jsx-runtime";var ee={position:"absolute",inset:0,zIndex:-1},oe=({allowSwipeBack:t=!0,allowSwipeForward:n=!0,style:o,...a})=>{let{history:e,location:p,canGoBack:s,canGoForward:i,isTransitioning:r,transitioningToLocation:v,transitionType:f,transitionDuration:y,back:S,forward:M}=b(),L=p.index,O=ct(!1),j=ct(0),W=ct(0),[T,X]=$(!1),[w,G]=$(0),[U,H]=$(!1),[m,d]=$(!1),[h,l]=$(!1),[x,R]=$(!1);if(te(()=>{!r||!v||(R(!0),setTimeout(()=>{R(!1)},y))},[r,v,y]),L===void 0)return;let g=()=>{X(!1),G(0),H(!1),d(!1),l(!1)},P=at(k=>{r||!i&&!s||(O.current=!0,j.current=k.touches[0].clientX,W.current=k.touches[0].clientY)},[r,s,i]),q=at(k=>{if(!O.current)return;let{clientX:St,clientY:wt}=k.touches[0];if(!T&&Math.abs(wt-W.current)>30){O.current=!1;return}let A=St-j.current;if(!(Math.abs(A)<10)){if(T||X(!0),A>0&&L===0||A<0&&L+1===e.length){G(0);return}!U&&A<0&&n&&H(!0),!m&&A>0&&t&&d(!0),G(Math.max(Math.min(A,window.innerWidth),-window.innerWidth))}},[T,L,e.length,U,m,t,n]),N=at(()=>{if(O.current=!1,!T)return;let k={onFinish:g};w>innerWidth*.3&&s&&t?S(k):w<-innerWidth*.3&&i&&n?M(k):(l(!0),setTimeout(g,y))},[S,M,T,w,s,i,y]);return ne("div",{style:{position:"relative",overflow:"hidden",...o},...a,children:[(r&&f==="slide-right"||T&&m)&&C("div",{style:ee,children:C(B,{location:r?v:e.at(L-1),children:C(nt,{},L-1)})}),C("div",{style:{background:"white",position:"absolute",inset:0,transform:r&&f==="slide-right"?"translateX(100%)":T&&w>0&&!h?`translateX(${w}px)`:"translateX(0px)",transition:h||r&&f==="slide-right"?`transform ${y}ms ease-out`:""},onTouchStart:P,onTouchMove:q,onTouchEnd:N,children:C(nt,{})},L),(r&&f==="slide-left"||T&&U)&&C("div",{style:{background:"white",position:"absolute",inset:0,zIndex:1,transform:`translateX(${x?"0px":r||h?"100%":`${innerWidth+w}px`})`,transition:`transform ${r||h?y:0}ms ease-in`},children:C(B,{location:r?v:e.at(L+1),children:C(nt,{},v?.index)})})]})},hn=({route:t,...n})=>C(Ct,{route:t,children:C(oe,{...n})});export{Do as DefaultTransitionDuration,le as Link,z as LocationContext,B as LocationProvider,dt as Outlet,tt as RootRouteContext,Y as RouterContext,Ho as RouterProvider,hn as Stack,zt as buildPathnameFromMatches,F as buildUrlFromLocation,jo as createRouterOptions,Yt as matchPattern,gt as matchRoute,xt as parseLocation,yt as parseRoute,$o as redirect,vt as resolveRelativeUrl,Z as useLocation,et as useRootRoute,mt as useRoute,V as useRouteMatch,b as useRouter};
|
|
1
|
+
import{useContext as bt}from"react";import{createContext as Ot}from"react";var Y=Ot(null);var O=()=>{let t=bt(Y);if(t===null)throw new Error("useRouter must be used within a Stack");return t};import{memo as kt}from"react";import{jsx as Mt}from"react/jsx-runtime";var le=kt(({to:t,replace:n,transitionType:o,duration:a,onFinish:e,...p})=>{let s=O();return Mt("a",{...p,href:t,onClick:i=>{i.preventDefault(),s.navigate({to:t,replace:n,transitionType:o,duration:a,onFinish:e})}})});import{createContext as Nt}from"react";var z=Nt(null);import{memo as At,useCallback as rt,useMemo as Ft}from"react";import{jsx as Et}from"react/jsx-runtime";var B=At(({location:t,...n})=>{let o=O(),a=Ft(()=>t.state,[t]),e=rt((i,r)=>{o.setLocationState(t.index,v=>({...v,[i]:r}))},[o,t]),p=rt(i=>{o.setLocationState(t.index,r=>(delete r[i],r))},[o,t]),s=rt((i,r)=>{o.setLocationSearch(t.index,{...t.search,[i]:r})},[o,t]);return Et(z.Provider,{value:{...t,canGoBack:!o.isTransitioning&&t.index>0,canGoForward:!o.isTransitioning&&t.index+1<o.history.length,state:a,setState:e,deleteState:p,setSearch:s},...n})},(t,n)=>t.location===n.location);import{createContext as Dt}from"react";var _=Dt(0);import{useContext as $t}from"react";var ut=()=>$t(_);import{createContext as jt}from"react";var K=jt(null);import{useContext as Wt}from"react";var V=()=>{let t=Wt(K);if(t===null)throw new Error("useRouteMatch must be used within a RouteMatchProvider");return t};import{jsx as Gt}from"react/jsx-runtime";var pt=({depth:t,...n})=>Gt(_.Provider,{value:t,...n});import{useContext as Ut}from"react";var Z=()=>{let t=Ut(z);if(t===null)throw new Error("useLocation must be used within a LocationProvider");return t};import{createContext as Bt}from"react";var I=Bt(null);import{useContext as It}from"react";var mt=()=>{let t=It(I);if(t===null)throw new Error("useRoute must be used within a RouteProvider");return t};import{useEffect as Xt}from"react";import{jsx as J}from"react/jsx-runtime";var Q=({depth:t=0})=>{let n=O(),o=Z(),a=V(),e=mt(),p=`_Z.${e.id}.pending`,s=!!e.beforeLoad&&e.getState(p)!==!1;if(Xt(()=>{e&&e.beforeLoad&&e.getState(p)===void 0&&(e.setState(p,!0),e.beforeLoad?.({location:o}).then(()=>e.setState(p,!1)).catch(({cause:r})=>{r&&"to"in r?(console.log("Redirecting to:",r.to),n.navigate({...r,onFinish:()=>{e.setState(p,!1)}})):e.setState(p,!1)}))},[e]),!e)return null;if(s){let r=e.pendingComponent;return J(r,{})}if(t>=a.matches.length){let r=e.notFoundComponent;return J(r,{})}let i=e.component;return i?J(i,{}):J(dt,{})};import{useContext as qt}from"react";import{createContext as Ht}from"react";var tt=Ht(null);var et=()=>{let t=qt(tt);if(t===null)throw new Error("useRootRoute must be used within a RootRouteProvider");return t};import{useCallback as lt}from"react";import{jsx as ft}from"react/jsx-runtime";var ot=({route:t,...n})=>{if(!t)return ft(I.Provider,{value:null,...n});let{state:o,getRouteState:a,setRouteState:e}=et(),p=lt(i=>a(t.id,i),[a,t.id]),s=lt((i,r)=>{e(t.id,i,r)},[e,t.id]);return ft(I.Provider,{value:{...t,state:o[t.id],getState:p,setState:s},...n})};import{jsx as it}from"react/jsx-runtime";var dt=()=>{let t=V(),n=ut()+1;return it(pt,{depth:n,children:it(ot,{route:t.matches.at(n),children:it(Q,{depth:n})})})};import{useCallback as E,useEffect as Tt,useMemo as _t,useState as D}from"react";var Rt={defaultTransitionDuration:300};var Do=300,$o=t=>new Error("",{cause:t}),Yt=(t,n)=>{try{let o,a;if(n.startsWith("http://")||n.startsWith("https://")){let f=new URL(n);o=f.pathname,a=f.searchParams}else{let[f,y]=n.split("?");if(!f)return null;o=f,a=new URLSearchParams(y||"")}let e=o.replaceAll(/^\/|\/$/g,""),p=t.replaceAll(/^\/|\/$/g,""),s=e.split("/"),i=p.split("/");if(s.length!==i.length)return null;let r={};for(let f=0;f<i.length;f++){let y=i[f],S=s[f];if(y.startsWith(":")){let M=y.slice(1);r[M]=decodeURIComponent(S)}else if(y!==S)return null}let v=Object.fromEntries(a.entries());return{params:r,query:v}}catch{return null}},gt=(t,n)=>{let o=(a,{children:e})=>{if(e&&e.length>0){for(let s of e){let i=o([...a,s],s);if(i)return i}return null}let p=Yt(zt(a),n);return p?{matches:a,...p}:null};return o([t],t)||{matches:[],params:{},query:{}}},zt=t=>{let n=[];for(let o of t)o.pathname!==void 0&&n.push(o.pathname.replaceAll(/^\/|\/$/g,""));return"/"+n.join("/")},xt=({href:t,pathname:n,search:o})=>({index:0,href:t,state:{index:0},pathname:n,search:Object.fromEntries(new URLSearchParams(o))}),jo=t=>({...Rt,...t}),yt=t=>{let n=(o,a)=>{let e=o.name??(o.pathname?`${a}/${o.pathname.replaceAll(/^\/|\/$/g,"")}`:a);return{...o,id:e,children:o.children?.map(s=>n(s,e))}};return n(t,"")},ht=t=>t.length>0,vt=(t,n)=>{let o=t.split("/").filter(ht),a=n.split("/").filter(ht);for(let e of a)e!=="."&&(e===".."?o.pop():o.push(e));return"/"+o.join("/")},F=t=>{let n=new URLSearchParams(t.search).toString();return n?`${t.pathname}?${n}`:t.pathname};import{jsx as Pt}from"react/jsx-runtime";var Ho=({options:t,...n})=>{let[o,a]=D([xt(window.location)]),[e,p]=D(0),s=_t(()=>o.at(e),[o,e]),[i,r]=D(!1),[v,f]=D(),[y,S]=D(),[M,L]=D(0),b=!i&&e>0,j=!i&&e+1<o.length;Tt(()=>{window.history.replaceState(s.state,"",F(s))},[]),Tt(()=>{let m=({state:d})=>{p(d?.index)};return addEventListener("popstate",m),()=>{removeEventListener("popstate",m)}},[e]);let W=E(({to:m,replace:d})=>{if(!m)return s;let h=d?e:e+1,l=m.startsWith("/")?m:vt(s.pathname,m),[x,R]=l.split("?"),g=new URLSearchParams(R??""),P={index:h};return{index:h,href:origin+x+(R?`?${g.toString()}`:""),search:Object.fromEntries(g.entries()),state:P,pathname:x}},[e,s]),T=(m,d,h=t.defaultTransitionDuration,l)=>{r(!0),S(d),L(h),f(m),setTimeout(()=>{r(!1),S(void 0),f(void 0),l?.()},h)},X=E(({to:m,replace:d,transitionType:h,duration:l,onFinish:x})=>{if(i)return;let R=d?e:e+1,g=W({to:m,replace:d}),P=()=>{d?(a(N=>[...N.slice(0,R),g,...N.slice(R+1)]),window.history.replaceState(g.state,"",F(g))):(a(N=>[...N.slice(0,R),g]),p(R),window.history.pushState(g.state,"",F(g))),x?.()},q=h??t.defaultTransitionType?.(s,g)??"slide-left";q?T(g,q,l,P):P()},[e,o,i,t]),w=E(({transitionType:m,duration:d,onFinish:h,depth:l}={})=>{if(!b)return;let x=l??1,R=o.at(e-x);if(!R)return;let g=()=>{window.history.go(-x),h?.()},P=m??t.defaultTransitionType?.(s,R)??"slide-right";P?T(R,P,d,g):g()},[e,o,i,t]),G=E(({transitionType:m,duration:d,depth:h,onFinish:l}={})=>{if(!j)return;let x=h??1,R=o.at(e+x);if(!R)return;let g=()=>{window.history.go(x),l?.()},P=m??t.defaultTransitionType?.(s,R)??"slide-left";P?T(R,P,d,g):g()},[e,o,i,t]),U=E((m,d)=>{a(h=>h.map(l=>{if(l.index!==m)return l;let x=typeof d=="function"?d(l.state):d,R={...l,state:x};return m===e&&window.history.replaceState(x,"",F(R)),R}))},[e]),H=E((m,d)=>{a(h=>h.map(l=>{if(l.index!==m)return l;let x={...l,search:{...l.search,...d}};return m===e&&window.history.replaceState(x.state,"",F(x)),x}))},[]);return Pt(Y.Provider,{value:{options:t,history:o,location:s,canGoBack:b,canGoForward:j,isTransitioning:i,transitioningToLocation:v,transitionType:y,transitionDuration:M,buildLocation:W,navigate:X,back:w,forward:G,setLocationState:U,setLocationSearch:H},children:Pt(B,{location:s,...n})})};import{useCallback as at,useEffect as te,useRef as ct,useState as $}from"react";import{memo as Kt,useMemo as Vt}from"react";import{jsx as st}from"react/jsx-runtime";var nt=Kt(()=>{let t=et(),n=Z(),o=Vt(()=>gt(t,n.pathname),[t,n.pathname]);return st(K.Provider,{value:o,children:st(ot,{route:t,children:st(Q,{})})})});import{useCallback as Lt,useMemo as Zt,useState as Jt}from"react";import{jsx as Qt}from"react/jsx-runtime";var Ct=({route:t,...n})=>{let o=Zt(()=>yt(t),[t]),[a,e]=Jt({}),p=Lt((i,r)=>a[i]?.[r],[a]),s=Lt((i,r,v)=>{e(f=>({...f,[i]:{...f[i],[r]:v}}))},[]);return Qt(tt.Provider,{value:{...o,state:a,getRouteState:p,setRouteState:s},...n})};import{jsx as C,jsxs as ne}from"react/jsx-runtime";var ee={position:"absolute",inset:0,zIndex:-1},oe=({allowSwipeBack:t=!0,allowSwipeForward:n=!0,style:o,...a})=>{let{history:e,location:p,canGoBack:s,canGoForward:i,isTransitioning:r,transitioningToLocation:v,transitionType:f,transitionDuration:y,back:S,forward:M}=O(),L=p.index,b=ct(!1),j=ct(0),W=ct(0),[T,X]=$(!1),[w,G]=$(0),[U,H]=$(!1),[m,d]=$(!1),[h,l]=$(!1),[x,R]=$(!1);if(te(()=>{!r||!v||(R(!0),setTimeout(()=>{R(!1)},y))},[r,v,y]),L===void 0)return;let g=()=>{X(!1),G(0),H(!1),d(!1),l(!1)},P=at(k=>{r||!i&&!s||(b.current=!0,j.current=k.touches[0].clientX,W.current=k.touches[0].clientY)},[r,s,i]),q=at(k=>{if(!b.current)return;let{clientX:St,clientY:wt}=k.touches[0];if(!T&&Math.abs(wt-W.current)>30){b.current=!1;return}let A=St-j.current;if(!(Math.abs(A)<10)){if(T||X(!0),A>0&&L===0||A<0&&L+1===e.length){G(0);return}!U&&A<0&&n&&H(!0),!m&&A>0&&t&&d(!0),G(Math.max(Math.min(A,window.innerWidth),-window.innerWidth))}},[T,L,e.length,U,m,t,n]),N=at(()=>{if(b.current=!1,!T)return;let k={onFinish:g};w>innerWidth*.3&&s&&t?S(k):w<-innerWidth*.3&&i&&n?M(k):(l(!0),setTimeout(g,y))},[S,M,T,w,s,i,y]);return ne("div",{style:{position:"relative",overflow:"hidden",...o},...a,children:[(r&&f==="slide-right"||T&&m)&&C("div",{style:ee,children:C(B,{location:r?v:e.at(L-1),children:C(nt,{},L-1)})}),C("div",{style:{position:"absolute",inset:0,transform:r&&f==="slide-right"?"translateX(100%)":T&&w>0&&!h?`translateX(${w}px)`:"translateX(0px)",transition:h||r&&f==="slide-right"?`transform ${y}ms ease-out`:""},onTouchStart:P,onTouchMove:q,onTouchEnd:N,children:C(nt,{})},L),(r&&f==="slide-left"||T&&U)&&C("div",{style:{position:"absolute",inset:0,zIndex:1,transform:`translateX(${x?"0px":r||h?"100%":`${innerWidth+w}px`})`,transition:`transform ${r||h?y:0}ms ease-in`},children:C(B,{location:r?v:e.at(L+1),children:C(nt,{},v?.index)})})]})},hn=({route:t,...n})=>C(Ct,{route:t,children:C(oe,{...n})});export{Do as DefaultTransitionDuration,le as Link,z as LocationContext,B as LocationProvider,dt as Outlet,tt as RootRouteContext,Y as RouterContext,Ho as RouterProvider,hn as Stack,zt as buildPathnameFromMatches,F as buildUrlFromLocation,jo as createRouterOptions,Yt as matchPattern,gt as matchRoute,xt as parseLocation,yt as parseRoute,$o as redirect,vt as resolveRelativeUrl,Z as useLocation,et as useRootRoute,mt as useRoute,V as useRouteMatch,O as useRouter};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["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 TransitionType,\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 transitioningToLocation?: Location;\n transitionType?: TransitionType;\n transitionDuration: number;\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: (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => void;\n setLocationSearch: (\n locationIndex: number,\n search: Record<string, string>\n ) => 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, transitionType, 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({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n });\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 state: Record<string, any>;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n setSearch: (key: string, value: 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, useMemo } 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 state = useMemo(() => location.state, [location]);\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, (prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n router.setLocationState(location.index, (prev) => {\n delete prev[key];\n return prev;\n });\n },\n [router, location]\n );\n const setSearch = useCallback(\n (key: string, value: string) => {\n router.setLocationSearch(location.index, {\n ...location.search,\n [key]: value,\n });\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: !router.isTransitioning && location.index > 0,\n canGoForward:\n !router.isTransitioning &&\n location.index + 1 < router.history.length,\n state,\n setState,\n deleteState,\n setSearch,\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 } 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 const pending =\n !!route.beforeLoad && route.getState(pendingStateKey) !== false;\n\n useEffect(() => {\n if (!route) {\n return;\n }\n if (route.beforeLoad && route.getState(pendingStateKey) === undefined) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad?.({ location })\n .then(() => route.setState(pendingStateKey, false))\n .catch(({ cause }: Error) => {\n if (!!cause && \"to\" in (cause as any)) {\n console.log(\"Redirecting to:\", (cause as any).to);\n router.navigate({\n ...(cause as any),\n onFinish: () => {\n route.setState(pendingStateKey, false);\n },\n });\n } else {\n route.setState(pendingStateKey, false);\n }\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\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, useMemo, 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 TransitionType,\n} from \"@/types.js\";\nimport {\n buildUrlFromLocation,\n parseLocation,\n resolveRelativeUrl,\n} 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 = useMemo(\n () => history.at(currentLocationIndex)!,\n [history, currentLocationIndex]\n );\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n const [transitionType, setTransitionType] = useState<TransitionType>();\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n\n const canGoBack = !isTransitioning && currentLocationIndex > 0;\n const canGoForward =\n !isTransitioning && currentLocationIndex + 1 < history.length;\n\n useEffect(() => {\n window.history.replaceState(\n location.state,\n \"\",\n buildUrlFromLocation(location)\n );\n }, []);\n\n useEffect(() => {\n const handlePopState = ({ state }: PopStateEvent) => {\n console.log(\"popstate event:\", state);\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 url = to.startsWith(\"/\")\n ? to\n : resolveRelativeUrl(location.pathname, to);\n const [pathname, search] = url.split(\"?\");\n const searchParams = new URLSearchParams(search ?? \"\");\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname + (search ? `?${searchParams.toString()}` : \"\"),\n search: Object.fromEntries(searchParams.entries()),\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n transitionType: TransitionType,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionType(transitionType);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitionType(undefined);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transitionType,\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 buildUrlFromLocation(newLocation)\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transitionType, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (!canGoBack) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-right\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({\n transitionType,\n duration,\n depth,\n onFinish,\n }: ForwardActionOptions = {}) => {\n if (!canGoForward) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, 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 (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) => {\n if (location.index !== index) {\n return location;\n }\n const newState =\n typeof state === \"function\" ? state(location.state) : state;\n const newLocation = { ...location, state: newState };\n if (index === currentLocationIndex) {\n window.history.replaceState(\n newState,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n [currentLocationIndex]\n );\n\n const setLocationSearch = useCallback(\n (locationIndex: number, search: Record<string, string>) => {\n setHistory((prev) =>\n prev.map((location) => {\n if (location.index !== locationIndex) return location;\n const newLocation = {\n ...location,\n search: {\n ...location.search,\n ...search,\n },\n };\n if (locationIndex === currentLocationIndex) {\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n []\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,\n canGoForward,\n\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n setLocationSearch,\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 NavigateActionOptions,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: NavigateActionOptions) => {\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 url.\n * @param url The base url.\n * @param to The relative path to resolve.\n * @returns The resolved absolute url.\n */\nexport const resolveRelativeUrl = (url: string, to: string): string => {\n const currentPathSegments = url.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\nexport const buildUrlFromLocation = (location: Location): string => {\n const searchParams = new URLSearchParams(location.search).toString();\n return searchParams\n ? `${location.pathname}?${searchParams}`\n : location.pathname;\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\nconst PreviousComponentStyle = {\n position: \"absolute\",\n inset: 0,\n zIndex: -1,\n} as const;\n\nexport interface StackComponentProps\n extends React.ComponentPropsWithoutRef<\"div\"> {\n allowSwipeForward?: boolean;\n allowSwipeBack?: boolean;\n}\n\nconst StackComponent: React.FC<StackComponentProps> = ({\n allowSwipeBack = true,\n allowSwipeForward = true,\n style,\n ...props\n}) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionType,\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 [showPreviousComponent, setShowPreviousComponent] = useState(false);\n const [showNextComponent, setShowNextComponent] = 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 setShowPreviousComponent(false);\n setShowNextComponent(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = useCallback(\n (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 [isTransitioning, canGoBack, canGoForward]\n );\n\n const handleTouchMove = useCallback(\n (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 (!showPreviousComponent && offset < 0 && allowSwipeForward)\n setShowPreviousComponent(true);\n if (!showNextComponent && offset > 0 && allowSwipeBack)\n setShowNextComponent(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n },\n [\n isDragging,\n currentLocationIndex,\n history.length,\n showPreviousComponent,\n showNextComponent,\n allowSwipeBack,\n allowSwipeForward,\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 && allowSwipeBack) {\n back(options);\n } else if (\n dragOffset < -innerWidth * 0.3 &&\n canGoForward &&\n allowSwipeForward\n ) {\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 {((isTransitioning && transitionType === \"slide-right\") ||\n (isDragging && showNextComponent)) && (\n <div style={PreviousComponentStyle}>\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex - 1)!\n }\n >\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 && transitionType === \"slide-right\"\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling || (isTransitioning && transitionType === \"slide-right\")\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n {((isTransitioning && transitionType === \"slide-left\") ||\n (isDragging && showPreviousComponent)) && (\n <div\n style={{\n background: \"white\",\n position: \"absolute\",\n inset: 0,\n zIndex: 1,\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 route: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ route, ...props }) => (\n <RootRouteProvider route={route}>\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 { memo, useMemo } from \"react\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = memo(() => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = useMemo(\n () => matchRoute(rootRoute, location.pathname),\n [rootRoute, location.pathname]\n );\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, useMemo, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n route,\n ...props\n}: {\n route: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = useMemo(() => parseRoute(route), [route]);\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":["useContext","createContext","RouterContext","useRouter","router","useContext","RouterContext","memo","jsx","Link","to","replace","transitionType","duration","onFinish","props","router","useRouter","e","createContext","LocationContext","memo","useCallback","useMemo","jsx","LocationProvider","location","props","router","useRouter","state","setState","key","value","prev","deleteState","setSearch","LocationContext","a","b","createContext","OutletContext","useContext","useOutlet","OutletContext","createContext","RouteMatchContext","useContext","useRouteMatch","routeMatch","RouteMatchContext","jsx","OutletProvider","depth","props","OutletContext","useContext","useLocation","context","useContext","LocationContext","createContext","RouteContext","useContext","useRoute","route","RouteContext","useEffect","jsx","RouteComponent","depth","router","useRouter","location","useLocation","routeMatch","useRouteMatch","route","useRoute","pendingStateKey","pending","useEffect","cause","PendingComponent","NotFoundComponent","Component","Outlet","useContext","createContext","RootRouteContext","useRootRoute","route","useContext","RootRouteContext","useCallback","jsx","RouteProvider","route","props","RouteContext","state","getRouteState","setRouteState","useRootRoute","getState","key","setState","value","jsx","Outlet","routeMatch","useRouteMatch","depth","useOutlet","OutletProvider","RouteProvider","RouteComponent","useCallback","useEffect","useMemo","useState","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","resolveRelativeUrl","to","currentPathSegments","toPathSegments","buildUrlFromLocation","location","jsx","RouterProvider","options","props","history","setHistory","useState","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","useMemo","isTransitioning","setIsTransitioning","transitioningToLocation","setTransitioningToLocation","transitionType","setTransitionType","transitionDuration","setTransitionDuration","canGoBack","canGoForward","useEffect","buildUrlFromLocation","handlePopState","state","buildLocation","useCallback","to","replace","index","url","resolveRelativeUrl","pathname","search","searchParams","transitionTo","duration","callback","navigate","onFinish","newLocation","updateHistory","prevHistory","finalTransitionType","back","depth","backDepth","forward","forwardDepth","setLocationState","newState","setLocationSearch","locationIndex","prev","RouterContext","LocationProvider","useCallback","useEffect","useRef","useState","memo","useMemo","jsx","PageRenderer","memo","rootRoute","useRootRoute","location","useLocation","routeMatch","useMemo","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","useCallback","useMemo","useState","jsx","RootRouteProvider","route","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","jsx","jsxs","PreviousComponentStyle","StackComponent","allowSwipeBack","allowSwipeForward","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionType","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","useRef","startX","startY","isDragging","setIsDragging","useState","dragOffset","setDragOffset","showPreviousComponent","setShowPreviousComponent","showNextComponent","setShowNextComponent","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","useEffect","reset","handleTouchStart","useCallback","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","route","RootRouteProvider"]}
|
|
1
|
+
{"version":3,"sources":["../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":["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 TransitionType,\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 transitioningToLocation?: Location;\n transitionType?: TransitionType;\n transitionDuration: number;\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: (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => void;\n setLocationSearch: (\n locationIndex: number,\n search: Record<string, string>\n ) => 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, transitionType, 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({\n to,\n replace,\n transitionType,\n duration,\n onFinish,\n });\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 state: Record<string, any>;\n setState: (key: string, value: any) => void;\n deleteState: (key: string) => void;\n setSearch: (key: string, value: 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, useMemo } 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 state = useMemo(() => location.state, [location]);\n const setState = useCallback(\n (key: string, value: any) => {\n router.setLocationState(location.index, (prev) => ({\n ...prev,\n [key]: value,\n }));\n },\n [router, location]\n );\n const deleteState = useCallback(\n (key: string) => {\n router.setLocationState(location.index, (prev) => {\n delete prev[key];\n return prev;\n });\n },\n [router, location]\n );\n const setSearch = useCallback(\n (key: string, value: string) => {\n router.setLocationSearch(location.index, {\n ...location.search,\n [key]: value,\n });\n },\n [router, location]\n );\n return (\n <LocationContext.Provider\n value={{\n ...location,\n canGoBack: !router.isTransitioning && location.index > 0,\n canGoForward:\n !router.isTransitioning &&\n location.index + 1 < router.history.length,\n state,\n setState,\n deleteState,\n setSearch,\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 } 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 const pending =\n !!route.beforeLoad && route.getState(pendingStateKey) !== false;\n\n useEffect(() => {\n if (!route) {\n return;\n }\n if (route.beforeLoad && route.getState(pendingStateKey) === undefined) {\n route.setState(pendingStateKey, true);\n route\n .beforeLoad?.({ location })\n .then(() => route.setState(pendingStateKey, false))\n .catch(({ cause }: Error) => {\n if (!!cause && \"to\" in (cause as any)) {\n console.log(\"Redirecting to:\", (cause as any).to);\n router.navigate({\n ...(cause as any),\n onFinish: () => {\n route.setState(pendingStateKey, false);\n },\n });\n } else {\n route.setState(pendingStateKey, false);\n }\n });\n }\n }, [route]);\n\n if (!route) {\n return null;\n }\n\n if (pending) {\n const PendingComponent = route.pendingComponent!;\n return <PendingComponent />;\n }\n\n if (depth >= routeMatch.matches.length) {\n const NotFoundComponent = route.notFoundComponent!;\n return <NotFoundComponent />;\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, useMemo, 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 TransitionType,\n} from \"@/types.js\";\nimport {\n buildUrlFromLocation,\n parseLocation,\n resolveRelativeUrl,\n} 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 = useMemo(\n () => history.at(currentLocationIndex)!,\n [history, currentLocationIndex]\n );\n const [isTransitioning, setIsTransitioning] = useState<boolean>(false);\n const [transitioningToLocation, setTransitioningToLocation] =\n useState<Location>();\n const [transitionType, setTransitionType] = useState<TransitionType>();\n const [transitionDuration, setTransitionDuration] = useState<number>(0);\n\n const canGoBack = !isTransitioning && currentLocationIndex > 0;\n const canGoForward =\n !isTransitioning && currentLocationIndex + 1 < history.length;\n\n useEffect(() => {\n window.history.replaceState(\n location.state,\n \"\",\n buildUrlFromLocation(location)\n );\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 url = to.startsWith(\"/\")\n ? to\n : resolveRelativeUrl(location.pathname, to);\n const [pathname, search] = url.split(\"?\");\n const searchParams = new URLSearchParams(search ?? \"\");\n const state = {\n index,\n };\n return {\n index,\n href: origin + pathname + (search ? `?${searchParams.toString()}` : \"\"),\n search: Object.fromEntries(searchParams.entries()),\n state,\n pathname,\n };\n },\n [currentLocationIndex, location]\n );\n\n // Transition helper\n const transitionTo = (\n location: Location,\n transitionType: TransitionType,\n duration: number = options.defaultTransitionDuration,\n callback?: () => void\n ) => {\n setIsTransitioning(true);\n setTransitionType(transitionType);\n setTransitionDuration(duration);\n setTransitioningToLocation(location);\n setTimeout(() => {\n setIsTransitioning(false);\n setTransitionType(undefined);\n setTransitioningToLocation(undefined);\n callback?.();\n }, duration);\n };\n\n // Navigation actions\n const navigate = useCallback(\n ({\n to,\n replace,\n transitionType,\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 buildUrlFromLocation(newLocation)\n );\n } else {\n setHistory((prevHistory) => [\n ...prevHistory.slice(0, index),\n newLocation,\n ]);\n setCurrentLocationIndex(index);\n window.history.pushState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const back = useCallback(\n ({ transitionType, duration, onFinish, depth }: BackActionOptions = {}) => {\n if (!canGoBack) return;\n const backDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex - backDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(-backDepth);\n onFinish?.();\n };\n\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-right\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, duration, updateHistory);\n } else {\n updateHistory();\n }\n },\n [currentLocationIndex, history, isTransitioning, options]\n );\n\n const forward = useCallback(\n ({\n transitionType,\n duration,\n depth,\n onFinish,\n }: ForwardActionOptions = {}) => {\n if (!canGoForward) return;\n const forwardDepth = depth ?? 1;\n const newLocation = history.at(currentLocationIndex + forwardDepth);\n if (!newLocation) return;\n\n const updateHistory = () => {\n window.history.go(forwardDepth);\n onFinish?.();\n };\n const finalTransitionType =\n transitionType ??\n options.defaultTransitionType?.(location, newLocation) ??\n \"slide-left\";\n if (finalTransitionType) {\n transitionTo(newLocation, finalTransitionType, 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 (\n index: number,\n state:\n | Record<string, any>\n | ((prev: Record<string, any>) => Record<string, any>)\n ) => {\n setHistory((prevHistory) =>\n prevHistory.map((location) => {\n if (location.index !== index) {\n return location;\n }\n const newState =\n typeof state === \"function\" ? state(location.state) : state;\n const newLocation = { ...location, state: newState };\n if (index === currentLocationIndex) {\n window.history.replaceState(\n newState,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n [currentLocationIndex]\n );\n\n const setLocationSearch = useCallback(\n (locationIndex: number, search: Record<string, string>) => {\n setHistory((prev) =>\n prev.map((location) => {\n if (location.index !== locationIndex) return location;\n const newLocation = {\n ...location,\n search: {\n ...location.search,\n ...search,\n },\n };\n if (locationIndex === currentLocationIndex) {\n window.history.replaceState(\n newLocation.state,\n \"\",\n buildUrlFromLocation(newLocation)\n );\n }\n return newLocation;\n })\n );\n },\n []\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,\n canGoForward,\n\n isTransitioning,\n transitioningToLocation,\n transitionType,\n transitionDuration,\n\n buildLocation,\n\n navigate,\n back,\n forward,\n\n setLocationState,\n setLocationSearch,\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 NavigateActionOptions,\n ParsedRoute,\n Route,\n RouteMatch,\n RouterOptions,\n} from \"./types.js\";\n\nexport const DefaultTransitionDuration = 300;\n\nexport const redirect = (options: NavigateActionOptions) => {\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 url.\n * @param url The base url.\n * @param to The relative path to resolve.\n * @returns The resolved absolute url.\n */\nexport const resolveRelativeUrl = (url: string, to: string): string => {\n const currentPathSegments = url.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\nexport const buildUrlFromLocation = (location: Location): string => {\n const searchParams = new URLSearchParams(location.search).toString();\n return searchParams\n ? `${location.pathname}?${searchParams}`\n : location.pathname;\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\nconst PreviousComponentStyle = {\n position: \"absolute\",\n inset: 0,\n zIndex: -1,\n} as const;\n\nexport interface StackComponentProps\n extends React.ComponentPropsWithoutRef<\"div\"> {\n allowSwipeForward?: boolean;\n allowSwipeBack?: boolean;\n}\n\nconst StackComponent: React.FC<StackComponentProps> = ({\n allowSwipeBack = true,\n allowSwipeForward = true,\n style,\n ...props\n}) => {\n const {\n history,\n location,\n canGoBack,\n canGoForward,\n isTransitioning,\n transitioningToLocation,\n transitionType,\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 [showPreviousComponent, setShowPreviousComponent] = useState(false);\n const [showNextComponent, setShowNextComponent] = 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 setShowPreviousComponent(false);\n setShowNextComponent(false);\n setIsCanceling(false);\n };\n\n const handleTouchStart = useCallback(\n (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 [isTransitioning, canGoBack, canGoForward]\n );\n\n const handleTouchMove = useCallback(\n (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 (!showPreviousComponent && offset < 0 && allowSwipeForward)\n setShowPreviousComponent(true);\n if (!showNextComponent && offset > 0 && allowSwipeBack)\n setShowNextComponent(true);\n setDragOffset(\n Math.max(Math.min(offset, window.innerWidth), -window.innerWidth)\n );\n },\n [\n isDragging,\n currentLocationIndex,\n history.length,\n showPreviousComponent,\n showNextComponent,\n allowSwipeBack,\n allowSwipeForward,\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 && allowSwipeBack) {\n back(options);\n } else if (\n dragOffset < -innerWidth * 0.3 &&\n canGoForward &&\n allowSwipeForward\n ) {\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 {((isTransitioning && transitionType === \"slide-right\") ||\n (isDragging && showNextComponent)) && (\n <div style={PreviousComponentStyle}>\n <LocationProvider\n location={\n isTransitioning\n ? transitioningToLocation!\n : history.at(currentLocationIndex - 1)!\n }\n >\n <PageRenderer key={currentLocationIndex - 1} />\n </LocationProvider>\n </div>\n )}\n <div\n key={currentLocationIndex}\n style={{\n position: \"absolute\",\n inset: 0,\n transform:\n isTransitioning && transitionType === \"slide-right\"\n ? `translateX(100%)`\n : isDragging && dragOffset > 0 && !isCanceling\n ? `translateX(${dragOffset}px)`\n : \"translateX(0px)\",\n transition:\n isCanceling || (isTransitioning && transitionType === \"slide-right\")\n ? `transform ${transitionDuration}ms ease-out`\n : \"\",\n }}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n >\n <PageRenderer />\n </div>\n {((isTransitioning && transitionType === \"slide-left\") ||\n (isDragging && showPreviousComponent)) && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 1,\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 route: Route;\n}\n\nexport const Stack: React.FC<StackProps> = ({ route, ...props }) => (\n <RootRouteProvider route={route}>\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 { memo, useMemo } from \"react\";\nimport { RouteComponent } from \"./route-component.js\";\nimport { RouteProvider } from \"./route-provider.js\";\n\nexport const PageRenderer = memo(() => {\n const rootRoute = useRootRoute();\n const location = useLocation();\n const routeMatch = useMemo(\n () => matchRoute(rootRoute, location.pathname),\n [rootRoute, location.pathname]\n );\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, useMemo, useState } from \"react\";\n\nexport const RootRouteProvider = ({\n route,\n ...props\n}: {\n route: Route;\n children: React.ReactNode;\n}) => {\n const parsedRoute = useMemo(() => parseRoute(route), [route]);\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":["useContext","createContext","RouterContext","useRouter","router","useContext","RouterContext","memo","jsx","Link","to","replace","transitionType","duration","onFinish","props","router","useRouter","e","createContext","LocationContext","memo","useCallback","useMemo","jsx","LocationProvider","location","props","router","useRouter","state","setState","key","value","prev","deleteState","setSearch","LocationContext","a","b","createContext","OutletContext","useContext","useOutlet","OutletContext","createContext","RouteMatchContext","useContext","useRouteMatch","routeMatch","RouteMatchContext","jsx","OutletProvider","depth","props","OutletContext","useContext","useLocation","context","useContext","LocationContext","createContext","RouteContext","useContext","useRoute","route","RouteContext","useEffect","jsx","RouteComponent","depth","router","useRouter","location","useLocation","routeMatch","useRouteMatch","route","useRoute","pendingStateKey","pending","useEffect","cause","PendingComponent","NotFoundComponent","Component","Outlet","useContext","createContext","RootRouteContext","useRootRoute","route","useContext","RootRouteContext","useCallback","jsx","RouteProvider","route","props","RouteContext","state","getRouteState","setRouteState","useRootRoute","getState","key","setState","value","jsx","Outlet","routeMatch","useRouteMatch","depth","useOutlet","OutletProvider","RouteProvider","RouteComponent","useCallback","useEffect","useMemo","useState","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","resolveRelativeUrl","to","currentPathSegments","toPathSegments","buildUrlFromLocation","location","jsx","RouterProvider","options","props","history","setHistory","useState","parseLocation","currentLocationIndex","setCurrentLocationIndex","location","useMemo","isTransitioning","setIsTransitioning","transitioningToLocation","setTransitioningToLocation","transitionType","setTransitionType","transitionDuration","setTransitionDuration","canGoBack","canGoForward","useEffect","buildUrlFromLocation","handlePopState","state","buildLocation","useCallback","to","replace","index","url","resolveRelativeUrl","pathname","search","searchParams","transitionTo","duration","callback","navigate","onFinish","newLocation","updateHistory","prevHistory","finalTransitionType","back","depth","backDepth","forward","forwardDepth","setLocationState","newState","setLocationSearch","locationIndex","prev","RouterContext","LocationProvider","useCallback","useEffect","useRef","useState","memo","useMemo","jsx","PageRenderer","memo","rootRoute","useRootRoute","location","useLocation","routeMatch","useMemo","matchRoute","RouteMatchContext","RouteProvider","RouteComponent","useCallback","useMemo","useState","jsx","RootRouteProvider","route","props","parsedRoute","parseRoute","state","setState","getRouteState","id","key","setRouteState","value","prevState","RootRouteContext","jsx","jsxs","PreviousComponentStyle","StackComponent","allowSwipeBack","allowSwipeForward","style","props","history","location","canGoBack","canGoForward","isTransitioning","transitioningToLocation","transitionType","transitionDuration","back","forward","useRouter","currentLocationIndex","isTouching","useRef","startX","startY","isDragging","setIsDragging","useState","dragOffset","setDragOffset","showPreviousComponent","setShowPreviousComponent","showNextComponent","setShowNextComponent","isCanceling","setIsCanceling","isTransitionStarted","setIsTransitionStarted","useEffect","reset","handleTouchStart","useCallback","e","handleTouchMove","clientX","clientY","offset","handleTouchEnd","options","LocationProvider","PageRenderer","Stack","route","RootRouteProvider"]}
|
package/package.json
CHANGED
package/.oxlintrc.json
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"plugins": [
|
|
3
|
-
"import",
|
|
4
|
-
"typescript",
|
|
5
|
-
"unicorn",
|
|
6
|
-
"vitest",
|
|
7
|
-
"oxc",
|
|
8
|
-
"eslint",
|
|
9
|
-
"react",
|
|
10
|
-
"react-perf"
|
|
11
|
-
],
|
|
12
|
-
"categories": {
|
|
13
|
-
"correctness": "error",
|
|
14
|
-
"suspicious": "warn",
|
|
15
|
-
"perf": "warn"
|
|
16
|
-
},
|
|
17
|
-
"env": {
|
|
18
|
-
"browser": true
|
|
19
|
-
},
|
|
20
|
-
"rules": {
|
|
21
|
-
"react/react-in-jsx-scope": "off",
|
|
22
|
-
"react/exhaustive-deps": "off"
|
|
23
|
-
}
|
|
24
|
-
}
|