pageturn 0.1.0 → 0.2.0

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.
Files changed (75) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +179 -4
  3. package/dist/astro.js +0 -2
  4. package/dist/chunks/chunk-3ABPYO7H.js +43 -0
  5. package/dist/chunks/chunk-6FXXBNAF.js +197 -0
  6. package/dist/chunks/chunk-AEOAXMU3.js +33 -0
  7. package/dist/chunks/chunk-BOM5VXA5.js +167 -0
  8. package/dist/chunks/chunk-C3T7BGNG.js +30 -0
  9. package/dist/chunks/chunk-FYSSNYA4.js +17 -0
  10. package/dist/chunks/chunk-JHM7F4CH.js +172 -0
  11. package/dist/chunks/chunk-LM3XLSCW.js +799 -0
  12. package/dist/chunks/{chunk-QJ7GGFM4.js → chunk-YAL4MNCU.js} +4 -6
  13. package/dist/core.js +4 -3
  14. package/dist/dev/chunks/chunk-3JAWIMHB.js +184 -0
  15. package/dist/dev/chunks/chunk-3SU4CIKL.js +799 -0
  16. package/dist/dev/chunks/chunk-AEOAXMU3.js +33 -0
  17. package/dist/dev/chunks/chunk-C3T7BGNG.js +30 -0
  18. package/dist/dev/chunks/chunk-FYSSNYA4.js +17 -0
  19. package/dist/dev/chunks/chunk-I4SBUABE.js +175 -0
  20. package/dist/dev/chunks/chunk-U3XN54YY.js +219 -0
  21. package/dist/dev/chunks/chunk-Y6TD2T53.js +43 -0
  22. package/dist/dev/chunks/chunk-YAL4MNCU.js +22 -0
  23. package/dist/dev/core.js +19 -0
  24. package/dist/dev/index.js +21 -0
  25. package/dist/dev/morph-markup.js +34 -0
  26. package/dist/dev/morph.js +457 -0
  27. package/dist/dev/native.js +3 -0
  28. package/dist/dev/next.js +79 -0
  29. package/dist/dev/nuxt-plugin.js +24 -0
  30. package/dist/dev/prefetch.js +2 -0
  31. package/dist/dev/react-router.js +46 -0
  32. package/dist/dev/router.js +9 -0
  33. package/dist/dev/sveltekit.js +32 -0
  34. package/dist/dev/testing.js +48 -0
  35. package/dist/dev/turbo.js +49 -0
  36. package/dist/dev/vue.js +11 -0
  37. package/dist/head-core.js +1 -1
  38. package/dist/head-string.js +6 -6
  39. package/dist/head.js +1 -1
  40. package/dist/index.js +6 -5
  41. package/dist/morph-head.js +1 -1
  42. package/dist/morph-markup.js +11 -9
  43. package/dist/morph.js +145 -287
  44. package/dist/native.js +3 -2
  45. package/dist/next.js +79 -0
  46. package/dist/nuxt-plugin.js +24 -0
  47. package/dist/nuxt.js +34 -0
  48. package/dist/pageturn-morph.js +1 -1
  49. package/dist/pageturn.js +1 -1
  50. package/dist/prefetch.js +2 -2
  51. package/dist/react-router.js +46 -0
  52. package/dist/router.js +5 -183
  53. package/dist/sveltekit-server.js +22 -0
  54. package/dist/sveltekit.js +32 -0
  55. package/dist/testing.js +12 -22
  56. package/dist/turbo.js +49 -0
  57. package/dist/types/astro/integration.d.ts +0 -4
  58. package/dist/types/common/dev.d.ts +6 -0
  59. package/dist/types/common/page.d.ts +5 -0
  60. package/dist/types/common/registry.d.ts +3 -1
  61. package/dist/types/next/next.d.ts +27 -0
  62. package/dist/types/nuxt/module.d.ts +32 -0
  63. package/dist/types/react-router/react-router.d.ts +12 -0
  64. package/dist/types/router/router.d.ts +4 -2
  65. package/dist/types/sveltekit/server.d.ts +21 -0
  66. package/dist/types/sveltekit/sveltekit.d.ts +32 -0
  67. package/dist/types/turbo/turbo.d.ts +1 -0
  68. package/dist/types/vue/vue.d.ts +36 -0
  69. package/dist/vue.js +11 -0
  70. package/package.json +102 -23
  71. package/dist/chunks/chunk-237GNQNZ.js +0 -37
  72. package/dist/chunks/chunk-7LMNJ25V.js +0 -244
  73. package/dist/chunks/chunk-QC36TQP3.js +0 -24
  74. package/dist/chunks/chunk-WTHN3UIQ.js +0 -1000
  75. package/dist/chunks/chunk-YBAP3PHO.js +0 -247
package/dist/next.js ADDED
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import "./chunks/chunk-6FXXBNAF.js";
3
+ import {
4
+ startNavigation
5
+ } from "./chunks/chunk-BOM5VXA5.js";
6
+ import "./chunks/chunk-JHM7F4CH.js";
7
+ import {
8
+ inBrowser
9
+ } from "./chunks/chunk-AEOAXMU3.js";
10
+ import "./chunks/chunk-YAL4MNCU.js";
11
+
12
+ // src/next/next.ts
13
+ import NextLink from "next/link.js";
14
+ import { usePathname, useRouter, useSearchParams } from "next/navigation.js";
15
+ import {
16
+ createElement,
17
+ Suspense,
18
+ useLayoutEffect,
19
+ useMemo,
20
+ useRef
21
+ } from "react";
22
+ var pending = null, shownAt = null;
23
+ function go(router, href, how, link, options) {
24
+ let turn = startNavigation({
25
+ to: link ? link.href : new URL(href, location.href),
26
+ via: link ? "link" : "script",
27
+ link
28
+ });
29
+ pending = turn, router.prefetch(href), turn.left.then(() => {
30
+ pending === turn && router[how](href, options);
31
+ });
32
+ }
33
+ function Link(props) {
34
+ let router = useRouter(), anchor = useRef(null), { href, replace, scroll, onNavigate, ref } = props;
35
+ return createElement(NextLink, {
36
+ ...props,
37
+ ref(element) {
38
+ anchor.current = element, typeof ref == "function" ? ref(element) : ref && (ref.current = element);
39
+ },
40
+ onNavigate(event) {
41
+ let isStopped = !1;
42
+ onNavigate?.({
43
+ preventDefault() {
44
+ isStopped = !0, event.preventDefault();
45
+ }
46
+ }), !(isStopped || typeof href != "string" || !inBrowser) && (event.preventDefault(), go(router, href, replace ? "replace" : "push", anchor.current, {
47
+ scroll: scroll !== !1
48
+ }));
49
+ }
50
+ });
51
+ }
52
+ function usePageturnRouter() {
53
+ let router = useRouter();
54
+ return useMemo(
55
+ () => ({
56
+ ...router,
57
+ push: (href, options) => go(router, href, "push", null, options),
58
+ replace: (href, options) => go(router, href, "replace", null, options)
59
+ }),
60
+ [router]
61
+ );
62
+ }
63
+ function Watcher() {
64
+ let pathname = usePathname(), search = useSearchParams().toString();
65
+ return useLayoutEffect(() => {
66
+ let here = location.href, isFirst = shownAt === null;
67
+ if (shownAt = here, isFirst) return;
68
+ let turn = pending ?? startNavigation({ to: here, via: "history" });
69
+ pending = null, turn.swapped();
70
+ }, [pathname, search]), null;
71
+ }
72
+ function Pageturn() {
73
+ return createElement(Suspense, { fallback: null }, createElement(Watcher));
74
+ }
75
+ export {
76
+ Link,
77
+ Pageturn,
78
+ usePageturnRouter
79
+ };
@@ -0,0 +1,24 @@
1
+ import {
2
+ pageturn
3
+ } from "./chunks/chunk-3ABPYO7H.js";
4
+ import "./chunks/chunk-6FXXBNAF.js";
5
+ import "./chunks/chunk-BOM5VXA5.js";
6
+ import "./chunks/chunk-JHM7F4CH.js";
7
+ import "./chunks/chunk-AEOAXMU3.js";
8
+ import "./chunks/chunk-YAL4MNCU.js";
9
+
10
+ // src/nuxt/plugin.ts
11
+ var SHOWN_MAX_MS = 4e3;
12
+ function pageturnPlugin(nuxtApp) {
13
+ pageturn(nuxtApp.$router, {
14
+ whenShown(swap) {
15
+ let isDone = !1, once = () => {
16
+ isDone || (isDone = !0, swap());
17
+ };
18
+ nuxtApp.hooks.hookOnce("page:finish", once), setTimeout(once, SHOWN_MAX_MS);
19
+ }
20
+ });
21
+ }
22
+ export {
23
+ pageturnPlugin as default
24
+ };
package/dist/nuxt.js ADDED
@@ -0,0 +1,34 @@
1
+ // src/nuxt/module.ts
2
+ import { fileURLToPath } from "node:url";
3
+ import { coreHeadScript, headScript } from "./head-string.js";
4
+ function pageturnNuxt(options = {}, nuxt) {
5
+ const { css = true } = options;
6
+ nuxt.options.app.head.script = [
7
+ // Before every other script: it marks the page before its first frame.
8
+ {
9
+ innerHTML: css === true ? headScript : coreHeadScript,
10
+ tagPriority: "critical"
11
+ },
12
+ ...nuxt.options.app.head.script ?? []
13
+ ];
14
+ if (css) {
15
+ nuxt.options.css.push(
16
+ css === true ? "pageturn/pageturn.css" : "pageturn/no-native.css"
17
+ );
18
+ }
19
+ nuxt.options.plugins.push({
20
+ // In development, the build with the warnings (as package.json's development condition).
21
+ src: fileURLToPath(
22
+ new URL(
23
+ nuxt.options.dev ? "./dev/nuxt-plugin.js" : "./nuxt-plugin.js",
24
+ import.meta.url
25
+ )
26
+ ),
27
+ mode: "client"
28
+ });
29
+ }
30
+ pageturnNuxt.meta = { name: "pageturn" };
31
+ var module_default = pageturnNuxt;
32
+ export {
33
+ module_default as default
34
+ };
@@ -1 +1 @@
1
- (()=>{var mt=Object.defineProperty;var ut=(e,t)=>{for(var i in t)mt(e,i,{get:t[i],enumerable:!0})};var pe=()=>performance.getEntriesByType("navigation")[0];function I(e){let t=pe();(t?t.domContentLoadedEventStart>0:document.readyState!=="loading")?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}var Ce;function j(){return Ce??=matchMedia("(prefers-reduced-motion: reduce)"),Ce.matches}function He(){window.pageturn&&(window.pageturn.l=!0),delete document.documentElement.dataset.turnEntering}var me=Symbol.for("pageturn.focusBack"),ue=globalThis;function $e(e,t){ue[me]=e;try{e.focus(t)}finally{delete ue[me]}}var Pe=e=>ue[me]===e;function k(e){try{let t=sessionStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function T(e,t){try{return sessionStorage.setItem(e,JSON.stringify(t)),!0}catch{return!1}}function J(e){try{sessionStorage.getItem(e)!==null&&sessionStorage.removeItem(e)}catch{}}var w="pageturn:morph",Fe=e=>`:is(${e}):not([data-turn-layer] *)`,v=e=>document.querySelector(Fe(e));function D(e){document.readyState==="loading"?document.addEventListener("readystatechange",e,{once:!0}):e()}function Be(e,t,i=!1,o=[],n){let r=document.documentElement;r.dataset.turnRestoring="",He();let s=[];D(()=>{let c=null;try{c=e?v(e):null}catch{}c?.setAttribute("data-turn-origin",t);for(let[a,d,l]of o)try{let m=document.querySelector(a);l===null?m?.removeAttribute(d):m?.setAttribute(d,l)}catch{}for(let a=c?.parentElement?.closest("[popover]");i&&a;a=a.parentElement?.closest("[popover]"))s.unshift(a);for(let a of s)try{a.showPopover()}catch{}}),I(()=>requestAnimationFrame(()=>requestAnimationFrame(()=>{n&&pt(n,s),delete r.dataset.turnRestoring})))}var fe=(e,t)=>[...document.querySelectorAll("a[href]")].filter(i=>i.href===e)[t];function pt([e,t,i],o){let n=document.activeElement,r=fe(e,t);r&&(!n||n===document.body||o.some(s=>s.contains(n)))&&$e(r,{preventScroll:!0,focusVisible:i})}function he(e){e.setAttribute("aria-hidden","true"),e.setAttribute("popover","manual"),e.dataset.turnLayer="",document.documentElement.append(e);try{e.showPopover()}catch{}}function L(){if(window.top!==window){try{let c=JSON.parse(window.name.split(`${w}:`)[1]??"");D(()=>scrollTo(c.x,c.y)),Be(c.p,c.o,c.v,c.w),window.pageturn&&(window.pageturn.behind={move:c.m,data:c.d})}catch{}return null}let e=k(w);if(J(w),!e||e.n!==window.pageturn?.arrival?.move)return null;let t=document.createElement("div");t.innerHTML=e.h;let i=t.firstElementChild;if(!(i instanceof HTMLElement))return null;let o=null;if(e.s)try{let c=new CSSStyleSheet;c.insertRule(`${Fe(e.s)}{visibility:hidden!important}`),document.adoptedStyleSheets=[...document.adoptedStyleSheets,c],o=c}catch{}for(let c of[i,...i.querySelectorAll("[data-turn-style]")])c.style.cssText=c.dataset.turnStyle??"";he(i);let n={flight:e,layer:i,sheet:o,taken:!1};e.b&&(document.documentElement.dataset.turnBehind="");let{x:r=0,y:s}=e;return s!==void 0&&D(()=>scrollTo(r,s)),e.o&&Be(e.s,e.o,e.v,e.w,e.l),I(()=>setTimeout(()=>n.taken||K(n))),n}function K(e){e.taken=!0,document.querySelector("[data-turn-origin]")?.removeAttribute("data-turn-origin"),e.layer.remove(),document.adoptedStyleSheets=document.adoptedStyleSheets.filter(t=>t!==e.sheet)}window.pageturnMorph===void 0&&(window.pageturnMorph=L());var Re=Symbol.for("pageturn.registry"),Ne=globalThis;Ne[Re]??={b:new Map,d:[],e:null,settings:{defaultMove:"page",prefetch:!0,leaveTimeout:4e3,stuckTimeout:4e3,arrivalEnds:"animations"},k:!1,f:Object.freeze({})};var ye=Ne[Re],_=e=>e===ye.f||e===!1;var V=(e,t)=>window.pageturn?.defineMove?.(e,t)??(()=>{}),ge=()=>window.pageturn?.arrival??null;var ft=e=>new Promise(t=>setTimeout(t,e)),A=(e,t)=>Promise.race([e,ft(t).then(()=>null)]),C=e=>Number.isFinite(e.effect?.getComputedTiming().endTime),ht=["TopLeft","TopRight","BottomRight","BottomLeft"],U=e=>typeof e=="number"?[e,e,e,e]:e,Ie=e=>e.every(t=>t===e[0])?e[0]:e;function O(e,t,i=1){return Ie(ht.map(o=>{let n=e[`border${o}Radius`],r=Number.parseFloat(n)||0;return n.includes("%")?r/100*t:r*i}))}var M=(e,t=1)=>U(e).map(i=>`${i/t}px`).join(" ");function yt(e,t){let i=[...U(O(getComputedStyle(e),t.width))],o=(n,r)=>Math.abs(n-r)<1;for(let n=e.parentElement;n&&n!==document.body;n=n.parentElement){let r=getComputedStyle(n);if(r.overflow==="visible"&&!/paint|strict|content/.test(r.contain))continue;let s=n.getBoundingClientRect(),c=s.left+n.clientLeft,a=s.top+n.clientTop,d=o(t.right,c+n.clientWidth),l=o(t.bottom,a+n.clientHeight),m=o(t.left,c),p=o(t.top,a),u=U(O(r,s.width)),f=Math.max(n.clientLeft,n.clientTop);[m&&p,d&&p,d&&l,m&&l].forEach((b,h)=>{b&&(i[h]=Math.max(i[h]??0,(u[h]??0)-f))})}return Ie(i)}function X(e){let t=e.getBoundingClientRect(),{left:i,top:o,width:n,height:r}=t,s={box:{left:i,top:o,width:n,height:r},radius:yt(e,t)},c=e.matches("img")?e:e.querySelector("img");return c?.sizes&&(s.sizes=c.sizes),s}var H=(e,t,i)=>({...e,box:{...e.box,left:e.box.left+t,top:e.box.top+i}}),De=(e,t)=>{let i=n=>[n.box.left,n.box.top,n.box.width,n.box.height,...U(n.radius),n.rotate??0,n.text?.box.left??0,n.text?.box.top??0,Number.parseFloat(n.text?.type.fontSize??"0")],o=i(t);return i(e).every((n,r)=>Math.abs(n-(o[r]??0))<.5)&&e.text?.color===t.text?.color&&e.background===t.background};function q(e,t){let i=e.filter(C),o=i.map(n=>n.currentTime);for(let n of i)n.currentTime=n.effect?.getComputedTiming().endTime;try{return t()}finally{i.forEach((n,r)=>{n.currentTime=o[r]??null})}}var $="position:fixed;inset:auto;left:0;top:0;margin:0;border:0;padding:0;overflow:visible;background:none;color:inherit;pointer-events:none;z-index:2147483647;transform-origin:50% 50%;max-width:none;max-height:none",G="margin:0;max-width:none;max-height:none;box-sizing:border-box;visibility:visible;translate:none;rotate:none;scale:none;transform:none";function Q(e){let t=e.cloneNode(!0);for(let i of[t,...t.querySelectorAll("[id]")])i.removeAttribute("id");return t}var Z=e=>[Number.parseFloat(e.style.width),Number.parseFloat(e.style.height)],ee=(e,t,i)=>`${e.left+(e.width-t)/2}px ${e.top+(e.height-i)/2}px`,te=(e,t)=>({...e.move,opacity:t.opacity??1});function Ke(e,t,i){let o=t.pose(e)(i);Object.assign(e.style,te(o,i)),Object.assign(o.on.style,o.look),o.inner&&Object.assign(o.inner.on.style,o.inner.look)}function P(e){let t=e.cloneNode(!0);for(let o of t.querySelectorAll("[data-turn-shot]"))o.remove();let i=e.querySelectorAll("img");t.querySelectorAll("img").forEach((o,n)=>{let r=i[n],s=r?.complete&&r.naturalWidth?r.currentSrc:o.dataset.turnFile;if(s){o.src=s,o.removeAttribute("srcset"),o.removeAttribute("sizes");for(let c of o.parentElement?.querySelectorAll("source")??[])c.remove()}});for(let o of[t,...t.querySelectorAll("[style]")])o.dataset.turnStyle=o.style.cssText,o.removeAttribute("style");return t.outerHTML}var gt=250,W="img,video,canvas";async function qe(e){let t=e.matches("img")?e:e.querySelector("img");t instanceof HTMLImageElement&&await A(t.decode(),gt).catch(()=>{})}function bt(e,t,i,o){let{naturalWidth:n,naturalHeight:r}=e;if(!e.complete||!n||!r)return null;let s=document.createElement("canvas"),c=Math.max(t/n,i/r),a=t/c,d=i/c,[l=.5,m=.5]=o.split(" ").map(p=>p.endsWith("%")?Number.parseFloat(p)/100:.5);s.width=Math.round(a),s.height=Math.round(d);try{s.getContext("2d")?.drawImage(e,(n-a)*l,(r-d)*m,a,d,0,0,s.width,s.height)}catch{return null}return s.dataset.turnShot="",s.style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;z-index:-1",s}function _e(e){let t=e.querySelectorAll(W);return e.matches(W)?e:t.length===1?t[0]:null}var We={read(e,t){let i=_e(e);if(!i||i===e)return;let o=getComputedStyle(i),n=new DOMMatrix(o.transform),r=Math.hypot(n.a,n.b)*(Number.parseFloat(o.scale)||1);Math.abs(r-1)>.001&&(t.zoom=r)},build(e,t,i){let o=document.createElement("div"),n=_e(e),r=Q(n?n.closest("picture")??n:e),s=r.matches(W)?r:(n&&r.querySelector(W))??r;s!==r&&(r.style.cssText="display:contents"),r.dataset.turnContent="",s.style.cssText+=`;display:block;width:100%;height:100%;${G}`,n&&(s.style.objectFit="cover",s.style.objectPosition=getComputedStyle(n).objectPosition);let{width:c,height:a}=(i??t).box;if(o.style.cssText=`${$};width:${c}px;height:${a}px`,o.append(r),s instanceof HTMLImageElement&&n instanceof HTMLImageElement){if(s.loading="eager",s.decoding="sync",s.dataset.turnFile=n.currentSrc,i){let l=i.sizes??`${Math.ceil(c)}px`;for(let m of o.querySelectorAll("img[srcset],source[srcset]"))m.sizes=l}let d=bt(n,c,a,s.style.objectPosition);if(d){o.append(d);let l=()=>{s.decode().then(()=>d.remove(),()=>{})};s.complete&&s.naturalWidth?l():s.addEventListener("load",l,{once:!0})}}return o},pose(e){let[t,i]=Z(e),o=e.querySelector(W)??e.firstElementChild;return({box:n,rotate:r=0,radius:s,zoom:c=1})=>{let a=Math.max(n.width/t,n.height/i);return{move:{translate:ee(n,t,i),rotate:`${r}deg`,scale:`${a}`},look:{clipPath:`inset(${(i-n.height/a)/2}px ${(t-n.width/a)/2}px round ${M(s,a)})`},on:e,inner:{look:{scale:`${c}`},on:o}}}},fit(e,t){e.style.width=`${t.box.width}px`,e.style.height=`${t.box.height}px`}};var B=(e,t={})=>({...e,duration:t.duration??e.duration,delay:t.delay??e.delay,easing:t.easing??e.easing});var xt=500,wt="cubic-bezier(0.2, 0, 0, 1)",Et=300;function we(){return window.pageturnMorph===void 0&&(window.pageturnMorph=L()),window.pageturnMorph}var be=!1,ze=()=>be;function Ye(e){let t=e;return t.style.visibility="hidden",t}var xe=new Set,je=e=>xe.has(e);function ne(e,t){if(window.top!==window||j())return()=>{};xe.add(e);let i=t.as??We,o=[t.find??[]].flat(),n=a=>a.ownerDocument!==document?r.read(a):q(document.getAnimations().filter(d=>{let{effect:l}=d;return l instanceof KeyframeEffect&&l.target?.contains(a)}),()=>r.read(a)),r={name:e,morph:t,live:null,endOf:X,onLeave:[],onStay:[],onPlay:[],onRemove:[],siteAnimations:[],atRest:n,read(a){let d=r.endOf(a);return i.read?.(a,d,a.matches(t.to)),d},timing:a=>B(B({duration:xt,delay:0,easing:wt,fill:"both"},t),a),about:(a,d)=>({back:d,link:a,decline:()=>ye.f,measure(l,m){let p=r.read(l);if(!m)return p;let u=r.read(m),f=p.text?.box??p.box,b=u.text?.box??u.box,h=b.left-f.left,y=b.top-f.top,g=H(p,h,y);return g.text&&(g.text={...g.text,box:{...g.text.box,left:g.text.box.left+h,top:g.text.box.top+y}}),g},scroll:{x:scrollX,y:scrollY}}),layer(a,d,l){let m=i.build(a,d,l);return Ke(m,i,d),m},async put(a,d,l){let m=r.layer(a,d,l);return r.live={layer:m,hidden:Ye(a)},he(m),m},async travel(a,d,l,m,p=!0,u=null){let f=r.live?.layer;if(!f)return;let b=i.pose(f),h=b(a),y=b(d);f.animate([te(h,a),te(y,d)],m),h.on.animate([h.look,y.look],m),h.inner&&y.inner&&JSON.stringify(h.inner.look)!==JSON.stringify(y.inner.look)&&h.inner.on.animate([h.inner.look,y.inner.look],m);let g=()=>{},E=new Promise(x=>{g=x});try{i.play?.(f,a,d,m,l.back);for(let x of r.onPlay)x(f,a,d,m,E);p&&t.during?.({...l,layer:f,content:f.firstElementChild,box:f.querySelector("[data-turn-box]"),words:f.querySelector("[data-turn-words]"),animate(x,R,Y){let z=x.animate(R,{...m,...Y});return r.siteAnimations.push(z),z},start:a,stop:d,timing:m,behind:u,finished:E,atEnd:x=>q(f.getAnimations({subtree:!0}),x)})}catch(x){reportError(x)}u&&u.getAnimations().length===0&&u.animate({opacity:[0,1]},B(m,r.appear));let S=()=>[...f.getAnimations({subtree:!0}),...u?.getAnimations()??[]].filter(C);await Promise.all([...S(),...r.siteAnimations.filter(C)].map(x=>x.finished)).catch(()=>{});for(let x of S()){try{x.commitStyles()}catch{}x.cancel()}g()},hand(a){be=!0,T(w,a)},async land(a,d,l,m={x:scrollX,y:scrollY},p){let u={...l,scroll:m};a.taken=!0;let{flight:f,layer:b}=a;try{document.readyState==="loading"&&await new Promise(g=>D(g));let h=d();if(!h)return;r.live={layer:b,hidden:Ye(h)};let y=H(n(h),scrollX-m.x,scrollY-m.y);if(f.t){let g=u.back?{from:y,to:f.f??null}:{from:f.f??y,to:y};f.f&&t.ends?.(g,u);let E=(u.back?g.from:g.to)??y;De(f.e,E)||await r.travel(f.e,E,u,{...r.timing(p),delay:0,duration:Et},!1)}else{let g=u.back?{from:y,to:f.e}:{from:f.e,to:y};if(!_(t.ends?.(g,u))){let E=(u.back?g.to:g.from)??f.e,S=(u.back?g.from:g.to)??y;i.fit?.(b,S),await r.travel(E,S,u,r.timing(p))}}await qe(h)}catch(h){reportError(h)}finally{r.drop(),K(a)}},drop(){for(let a of r.siteAnimations.splice(0))a.cancel();r.live?.layer.remove(),r.live?.hidden.style.removeProperty("visibility"),r.live=null}},s=V(e,{match:a=>t.match?t.match(a):!!t.from?.(a.link),async leave(a){let d=t.from?.(a.link);if(!d||!a.canHandOver||r.live)return a.decline();let l=r.about(a.link,!1),m={from:r.read(d),to:null};for(let y of o)try{m.to??=await y(a.to,t.to,n)}catch(g){reportError(g)}if(_(t.ends?.(m,l)))return a.decline();let{from:p,to:u}=m;if(p.box.width===0||p.box.height===0)return a.decline();let f=await r.put(d,p,u),b=a.leaving();u&&await r.travel(p,u,l,r.timing()),await b,r.hand({n:t.arriveAs??e,m:e,h:P(f),e:u??p,...u?{f:p}:{},t:!!u,s:t.to});let h={arriveAs:t.arriveAs??e,data:t.data?.(a)??null};for(let y of r.onLeave)h={...h,...y(a,d,p,h.data)};return h},stay(a,d){be=!1,r.drop();for(let l of r.onStay)l(d);t.stay?.(a,d)}});for(let a of[...o.map(d=>d.start),...t.use??[]])a?.(r);let c=we();return c&&!c.taken&&c.flight.m===e&&r.land(c,()=>v(t.to),r.about(null,!1)),()=>{s(),xe.delete(e);for(let a of r.onRemove)a()}}var Ee=e=>`${w}:from:${e}`;function Ve(e){let t=k(Ee(e)),i=pe();return t&&window.top===window&&new URL(t.u).pathname===location.pathname&&i?.type==="navigate"&&window.pageturn?.arrival?.move!==t.a?(ve(e),null):t}function ve(e){window.top===window&&J(Ee(e))}var oe=.25;function re({left:e,top:t,width:i,height:o}){let n=Math.min(e+i,innerWidth)-Math.max(e,0),r=Math.min(t+o,innerHeight)-Math.max(t,0);return Math.max(n,0)*Math.max(r,0)/(i*o||1)}function vt(e){let t="";for(let i=e;i!==document.body&&i.parentElement;i=i.parentElement){let o=[...i.parentElement.children].indexOf(i)+1;t=`>${i.localName}:nth-child(${o})${t}`}return`body${t}`}function St(){try{return document.getElementById(decodeURIComponent(location.hash.slice(1)))}catch{return null}}function Tt(){return St()?.scrollIntoView({behavior:"instant"}),{x:scrollX,y:scrollY}}function kt(e){try{return e.parentElement?.closest(":popover-open")!=null}catch{return!1}}var Ue=()=>[...document.querySelectorAll("a[href]")],Je=new WeakMap;function Mt(e){let t=[];for(let[i,o]of Object.entries(e)){let n=null;try{n=document.querySelector(i)}catch{}if(n)for(let r of[o].flat())t.push([i,r,n.getAttribute(r)])}return t}function Lt(e){let{href:t}=e,i=0;for(let o of Ue()){if(o===e)return i;o.href===t&&(i+=1)}return-1}var ie=(e,t)=>({s:e?.p??"",...e?{...Se(e,t),l:[e.u,e.k,!!e.i]}:{}}),Se=(e,t)=>({o:t,v:e.v,...e.w?.length?{w:e.w}:{}});function F(e){let t=Je.get(e);if(t)return t;let i=Ee(e.name),o={name:`${e.name}-back`,origin:()=>Ve(e.name),keep:{}};Je.set(e,o),e.onLeave.push((s,c,a,d)=>{T(i,{d,a:e.morph.arriveAs??e.name,f:location.pathname,u:s.link.href,k:Lt(s.link),p:vt(c),v:kt(c),w:Mt(o.keep),i:s.link.matches(":focus-visible"),x:scrollX,y:scrollY,e:a})});function n(){let s=o.origin();return s?.f===location.pathname?s:null}function r(s,c){let a=ge(),d=a?.via==="history"?o.byHistory:o.byLink;if(!a||!d)return;let l=n(),m=Ue().filter(y=>y.pathname===a.from),p=l?fe(l.u,l.k):void 0,u=p&&m.includes(p)?p:m.find(y=>e.morph.from?.(y));if(!u)return;u!==p&&(document.adoptedStyleSheets=document.adoptedStyleSheets.filter(y=>y!==s.sheet));let f=a.via==="link",{x:b=0,y:h}=s.flight;h!==void 0&&scrollTo(b,h),e.land(s,()=>e.morph.from?.(u)??null,e.about(u,!0),h!==void 0?{x:b,y:h}:l&&!f&&!c?{x:l.x,y:l.y}:f?Tt():{x:scrollX,y:scrollY},d)}return queueMicrotask(()=>{let s=we();s&&!s.taken&&s.flight.m===o.name&&r(s,!1)}),e.onStay.push(s=>{if(s.reason!=="returned"||!ge())return;let c=L();c?.flight.m===o.name&&(r(c,!0),c.taken||K(c))}),o}function Xe(e){let t=Ve(e);return t&&{page:t.f,scroll:{x:t.x,y:t.y},data:t.d}}function se(e={}){return t=>{let i=F(t);i.byHistory=e,Object.assign(i.keep,e.keep),t.onLeave.push((n,r,s,c)=>({returnAs:i.name,remember:c}));let o=()=>{if(ze())return;let n=i.origin(),r=v(t.morph.to),s=r&&t.read(r),c=window.pageturn?.i,a={from:location.pathname,at:Date.now(),data:null};if(!r||!s||re(s.box)<(e.inView??oe)){n&&new URL(n.u).pathname===location.pathname&&c?.p({...a,none:!0});return}c&&!c.o()&&c.p(a);let d=t.layer(r,s,null);T(w,{n:i.name,m:i.name,h:P(d),e:s,t:!1,...ie(n,t.name)})};addEventListener("pagehide",o),t.onRemove.push(()=>removeEventListener("pagehide",o))}}var Ot=`${w}:seen:`;function Qe(){return(e,t,i)=>{let o=v(t);return o&&H(i(o),scrollX,scrollY)}}var Ge=e=>`${Ot}${e}:${innerWidth}x${innerHeight}`,At=20;function ae(){let e=(t,i)=>{let o=k(Ge(i))??{},n=Object.keys(o).filter(r=>r!==location.pathname);return o[t.pathname]??o[n[n.length-1]??""]??null};return e.start=({morph:t,atRest:i})=>{let o=()=>{let n=v(t.to);if(!n)return;let r=i(n);if(r.box.width>0){let s=Ge(t.to),{[location.pathname]:c,...a}=k(s)??{},d=Object.entries(a).slice(1-At);T(s,{...Object.fromEntries(d),[location.pathname]:H(r,scrollX,scrollY)})}};document.readyState==="complete"?o():addEventListener("load",o,{once:!0})},e}var Te="data-turn-morph";function Ct(){let e=new Set([...document.querySelectorAll(`[${Te}]`)].map(t=>t.getAttribute(Te)??""));for(let t of e){if(!t||je(t))continue;let i=`[${Te}="${CSS.escape(t)}"]`;ne(t,{from:o=>o.querySelector(i)??o.closest(i),to:i,find:ae(),use:[se()]})}}I(Ct);var Oe={};ut(Oe,{back:()=>se,behind:()=>et,copy:()=>tt,defineMorph:()=>ne,forgetWayOut:()=>ve,here:()=>Qe,linkBack:()=>nt,peek:()=>ot,seen:()=>ae,shadow:()=>rt,text:()=>st,turned:()=>at,wayOut:()=>Xe});var Ht="position:fixed;top:0;border:0;margin:0;padding:0;max-width:none;max-height:none;pointer-events:none";function ce(e,t,i=""){return new Promise(o=>{let n=document.createElement("iframe");n.name=i,n.setAttribute("aria-hidden","true"),n.tabIndex=-1,n.inert=!0,n.style.cssText=`${Ht};width:${document.documentElement.clientWidth}px;height:${innerHeight}px;${t}`;let r=()=>{n.remove(),o(null)};n.addEventListener("error",r),n.addEventListener("load",async()=>{try{if(await n.contentDocument?.fonts.ready,!n.contentDocument?.body)throw new Error("no page");o(n)}catch{r()}}),n.src=e,document.documentElement.append(n)})}var Ze=["pointerover","focusin","touchstart"];function le(e){let t=null,i=o=>{let n=o.target instanceof Element?o.target.closest("a[href]"):null;n!==t&&(t=n,n&&!Pe(n)&&!j()&&e({link:n,via:"link",from:new URL(location.href),to:new URL(n.href),canHandOver:!0}))};for(let o of Ze)addEventListener(o,i,{passive:!0,capture:!0});return()=>{for(let o of Ze)removeEventListener(o,i,{capture:!0})}}var $t=800;function et(e={}){return t=>{let i=F(t);t.appear=e.appear;let o=null,n=()=>{o?.frame.then(s=>s?.remove()),o=null};function r(s,c){if(o?.address!==s){n();let a=ce(s,"left:0;opacity:0;z-index:2147483646",`${w}:${JSON.stringify({x:c.x,y:c.y,m:i.name,d:c.d,p:c.p,...Se(c,t.name)})}`).then(d=>{let l=d?.contentWindow;if(!d||!l)return null;l.scrollTo(c.x,c.y);let m=d.contentDocument?.querySelector(c.p);return m&&(m.style.visibility="hidden"),new Promise(p=>l.requestAnimationFrame(()=>l.requestAnimationFrame(()=>p(d))))});o={address:s,frame:a}}return o.frame}i.aims=(s,c,a)=>{let d={from:{...s.e},to:c};return _(t.morph.ends?.(d,a))?!1:{stop:d.from,end:d.to??c}},i.frameBehind=(s,c)=>A(r(s.to.href,c),e.wait??$t),i.dropFrame=n,t.onRemove.push(n,le(s=>{let c=i.origin();c&&i.leadsBack?.(s)&&r(s.to.href,c)}))}}function tt(){return{build(e){let t=document.createElement("div"),i=Q(e),o=e,n=o.offsetWidth&&o.offsetHeight?null:e.getBoundingClientRect(),r=o.offsetWidth||(n?.width??0),s=o.offsetHeight||(n?.height??0);return i.style.cssText+=`;width:${r}px;height:${s}px;${G}`,i.dataset.turnContent="",t.style.cssText=`${$};width:${r}px;height:${s}px`,t.append(i),t},pose(e){let[t,i]=Z(e);return({box:o,rotate:n=0,radius:r})=>{let s=o.width/t,c=o.height/i;return{move:{translate:ee(o,t,i),rotate:`${n}deg`,scale:`${s} ${c}`},look:{borderRadius:`${M(r,s)} / ${M(r,c)}`},on:e.firstElementChild}}}}}function nt(e={}){return t=>{let i=F(t);i.byLink=e,Object.assign(i.keep,e.keep);let o=r=>r.getAttribute("data-turn-back")===t.name;i.leadsBack=r=>o(r.link)?!0:e.match?e.match(r):r.to.pathname===i.origin()?.f;let n=i.origin();for(let r of document.querySelectorAll("a[data-turn-back]"))if(o(r)&&(r.dataset.turn=i.name,n&&n.f!==r.pathname)){r.href=n.f;let s=r.dataset.turnBackLabel;s&&r.setAttribute("aria-label",s)}t.onRemove.push(V(i.name,{match:i.leadsBack,async leave(r){let s=i.origin(),c=s?.f===r.to.pathname?s:null,a=v(t.morph.to);if(!a||!r.canHandOver||t.live)return r.decline();let d=t.about(null,!0),l=t.read(a),m=null;if(c&&i.aims){let h=i.aims(c,l,d);if(h===!1)return r.decline();({stop:m,end:l}=h)}if(re(l.box)<(e.inView??oe))return r.decline();let p=c&&m?await i.frameBehind?.(r,c)??null:null,u=await t.put(a,l,m),f=r.leaving();m&&await t.travel(l,m,d,t.timing(e),!0,p),await f;let b=c&&(m||e.scroll!==!1&&!r.to.hash);return t.hand({n:i.name,m:i.name,h:P(u),e:m??l,...m?{f:l}:{},t:!!m,b:!!p,...ie(c,t.name),...c&&b?{x:c.x,y:c.y}:{}}),{data:c?.d??null}},stay(r,s){t.drop(),i.dropFrame?.(),t.morph.stay?.(r,s)}}))}}var Pt=1500;function ot(e={}){let t=new Map,i=(n,r,s)=>{let c=`${n.href} ${r} ${innerWidth}x${innerHeight}`,a=t.get(c);return a||(a=ce(n.href,"left:-200vw;visibility:hidden").then(d=>{let l=d?.contentDocument,m=l?.querySelector(r);for(let u of l?.getAnimations()??[])C(u)&&u.finish();let p=m?s(m):null;return d?.remove(),p||t.delete(c),p}),t.set(c,a)),a},o=(n,r,s)=>A(i(n,r,s),e.wait??Pt);return(e.warm??!0)&&(o.start=n=>{n.onRemove.push(le(r=>{let{match:s,from:c}=n.morph;(s?s(r):c?.(r.link))&&i(r.to,n.morph.to,n.read)}))}),o}function ke(e){if(/^[-\d.]/.test(e))return e;let[,t,i,o,n]=/^(.*?\)|\S+) (\S+) (\S+) (\S+)/.exec(e)??[];return t&&n?`${i} ${o} ${n} ${t}`:void 0}var Me=e=>`drop-shadow(${e})`;function rt(){return e=>{let{read:t}=e;e.read=i=>{let o=t(i),n=ke(getComputedStyle(i).boxShadow);return n&&(o.shadow=n),o},e.onPlay.push((i,o,n,r,s)=>{let c=o.shadow&&ke(o.shadow),a=n.shadow&&ke(n.shadow),d=c??a;if(!d)return;let l=document.createElement("div");l.setAttribute("aria-hidden","true"),l.dataset.turnShadow="",l.style.cssText=`position:fixed;left:0;top:0;z-index:2147483646;pointer-events:none;filter:${Me(d)}`;let m=document.createElement("div");m.style.cssText=`background:#000;width:${i.style.width};height:${i.style.height}`;for(let p of i.getAnimations()){let{effect:u}=p;u instanceof KeyframeEffect&&m.animate(u.getKeyframes(),r)}l.animate(c&&a?{filter:[Me(c),Me(a)]}:{opacity:c?[1,0]:[0,1]},r),l.append(m),i.before(l),s.then(()=>l.remove())})}}var Bt=["fontSize","fontWeight","fontStretch","letterSpacing","fontVariationSettings"],it=["fontFamily","fontStyle","textTransform","fontKerning","fontFeatureSettings"];function Le(e){let t=e.ownerDocument.createRange();t.selectNodeContents(e);let{left:i,top:o,width:n,height:r}=t.getBoundingClientRect();return{left:i,top:o,width:n,height:r}}function Ft(e,t){let i=Math.min(e.length,t.length),o=0;for(;o<i&&e[o]===t[o];)o++;let n=0;for(;n<i-o&&e[e.length-1-n]===t[t.length-1-n];)n++;return[e.slice(0,o),e.slice(o,e.length-n),t.slice(o,t.length-n),t.slice(t.length-n)]}function st(e={}){let t=o=>typeof e.box=="object"?e.box[o?"to":"from"]:e.box,i=(o,n)=>o.querySelector(`[data-turn-part="${n}"]`);return{read(o,n,r){let s=getComputedStyle(o),c={};for(let l of Bt)c[l]=s[l];c.letterSpacing==="normal"&&(c.letterSpacing="0px"),c.fontVariationSettings==="normal"&&(c.fontVariationSettings=`"opsz" ${Number.parseFloat(s.fontSize)}`);let a=Le(o),d=(o.textContent??"").replace(/\s+/g," ").trim();if(n.background=s.backgroundColor,o.getClientRects().length===0){let l=document.createElement("span");l.style.cssText="position:fixed;left:0;top:0;white-space:nowrap;line-height:1;font-optical-sizing:none;visibility:hidden";for(let m of it)l.style[m]=s[m];Object.assign(l.style,c),l.textContent=d,document.documentElement.append(l),a=Le(l),l.remove(),n.box={...a}}else if(t(r)){let l=getComputedStyle(o,t(r)),[m,p,u,f]=[l.left,l.top,l.width,l.height].map(Number.parseFloat);if(l.content!=="none"&&[m,p,u,f].every(Number.isFinite)){let b=o.getBoundingClientRect();n.box={left:b.left+o.clientLeft+(m??0),top:b.top+o.clientTop+(p??0),width:u??0,height:f??0},n.radius=O(l,u??0),n.background=l.backgroundColor}}n.text={box:a,type:c,color:s.color,words:d}},build(o,n){let r=document.createElement("div"),s=document.createElement("span"),c=document.createElement("span"),a=getComputedStyle(o),d=n.text?.type??{};r.style.cssText=`${$};width:0;height:0;white-space:nowrap;line-height:1;font-optical-sizing:none`;for(let l of it)r.style[l]=a[l];return Object.assign(r.style,d),s.style.cssText="position:absolute;left:0;top:0",s.textContent=n.text?.words??"",s.dataset.turnContent="",s.dataset.turnWords="",c.style.cssText="position:absolute;z-index:-1",c.dataset.turnBox="",r.append(s,c),r},pose(o){let n=o.lastElementChild,r=s=>{let c=o.cloneNode(!1),a=document.createElement("span");c.removeAttribute("popover"),delete c.dataset.turnLayer,Object.assign(c.style,s.type,{translate:"none",rotate:"none",visibility:"hidden"}),a.style.cssText="position:absolute;left:0;top:0",a.textContent=s.words,c.append(a),document.documentElement.append(c);let d=c.getBoundingClientRect(),l=Le(a);return c.remove(),[l.left-d.left,l.top-d.top]};return({text:s,rotate:c=0,box:a,radius:d,background:l})=>{if(!s)throw new Error("pageturn/morph: an end has no text");let[m,p]=r(s),u=s.box.left-m,f=s.box.top-p;return{move:{translate:`${u}px ${f}px`,rotate:`${c}deg`},look:{...s.type,color:s.color,transformOrigin:`${a.left-u+a.width/2}px ${a.top-f+a.height/2}px`},on:o,inner:{on:n,look:{left:`${a.left-u}px`,top:`${a.top-f}px`,width:`${a.width}px`,height:`${a.height}px`,borderRadius:M(d),backgroundColor:l??"transparent"}}}}},play(o,n,r,s,c){let a=o.firstElementChild,[d,l]=[n.text?.words??"",r.text?.words??""];if(d===l||!l||a.firstElementChild)return;let[m,p,u,f]=Ft(d,l),b=(typeof e.swap=="function"?e.swap({back:c}):e.swap)??{},h=(N,ct,lt)=>`<span data-turn-part="${N}" style="${lt}">${ct.replace(/[&<]/g,dt=>dt==="&"?"&amp;":"&lt;")}</span>`;a.innerHTML=h("head",m,"")+`<span style="position:relative;display:inline-block">${h("arriving",u,"display:inline-block")}${h("leaving",p,"position:absolute;left:0;top:0")}</span><span data-turn-part="fit" style="display:inline-block">${h("rest",f,"display:inline-block;white-space:pre")}</span>`;let[y,g,E,S]=["fit","rest","leaving","arriving"].map(N=>i(o,N)),x=S?.parentElement;b.clip&&(x.style.clipPath=b.clip);let R=N=>N?.getBoundingClientRect().width??0,Y=()=>100*(R(S)-R(E))/(R(g)||1),z=Y(),Ae=q(o.getAnimations(),Y),de=B(s,b);y?.animate({translate:[`${-z}% 0`,`${-Ae}% 0`]},s),g?.animate({translate:["0% 0",`${Ae}% 0`]},de),E?.animate(b.leave??[{opacity:1},{opacity:0}],de),S?.animate(b.arrive??[{opacity:0},{opacity:1}],de)}}}function Rt(e){let[t=1,i=t]=e.scale.split(" ").map(Number.parseFloat);return new DOMMatrix().rotate(Number.parseFloat(e.rotate)||0).scale(t||1,i||1).multiply(new DOMMatrix(e.transform))}function at(){return e=>{e.endOf=t=>{let i=X(t),o=new DOMMatrix;for(let m=t;m;m=m.parentElement)o=Rt(getComputedStyle(m)).multiply(o);let n=Math.atan2(o.b,o.a)*180/Math.PI,r=Math.hypot(o.a,o.b),s=t,c=Math.abs(n)>.01&&s.offsetWidth>0,{box:a}=i,d=c?s.offsetWidth*r:a.width,l=c?s.offsetHeight*Math.hypot(o.c,o.d):a.height;return{...i,box:{left:a.left+(a.width-d)/2,top:a.top+(a.height-l)/2,width:d,height:l},rotate:n,radius:O(getComputedStyle(t),d,r)}}}}window.pageturn&&(window.pageturn.morph=Oe);})();
1
+ (()=>{var ut=Object.defineProperty;var pt=(e,t)=>{for(var i in t)ut(e,i,{get:t[i],enumerable:!0})};var L=typeof document<"u",fe=()=>performance.getEntriesByType("navigation")[0];function D(e){let t=fe();(t?t.domContentLoadedEventStart>0:document.readyState!=="loading")?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}var He;function J(){return He??=matchMedia("(prefers-reduced-motion: reduce)"),He.matches}function $e(){window.pageturn&&(window.pageturn.l=!0),delete document.documentElement.dataset.turnEntering}var ue=Symbol.for("pageturn.focusBack"),pe=globalThis;function Pe(e,t){pe[ue]=e;try{e.focus(t)}finally{delete pe[ue]}}var Be=e=>pe[ue]===e;function k(e){try{let t=sessionStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function T(e,t){try{return sessionStorage.setItem(e,JSON.stringify(t)),!0}catch{return!1}}function V(e){try{sessionStorage.getItem(e)!==null&&sessionStorage.removeItem(e)}catch{}}var w="pageturn:morph",Re=e=>`:is(${e}):not([data-turn-layer] *)`,v=e=>document.querySelector(Re(e));function K(e){document.readyState==="loading"?document.addEventListener("readystatechange",e,{once:!0}):e()}function Fe(e,t,i=!1,o=[],n){let r=document.documentElement;r.dataset.turnRestoring="",$e();let s=[];K(()=>{let c=null;try{c=e?v(e):null}catch{}c?.setAttribute("data-turn-origin",t);for(let[a,d,l]of o)try{let m=document.querySelector(a);l===null?m?.removeAttribute(d):m?.setAttribute(d,l)}catch{}for(let a=c?.parentElement?.closest("[popover]");i&&a;a=a.parentElement?.closest("[popover]"))s.unshift(a);for(let a of s)try{a.showPopover()}catch{}}),D(()=>requestAnimationFrame(()=>requestAnimationFrame(()=>{n&&ft(n,s),delete r.dataset.turnRestoring})))}var he=(e,t)=>[...document.querySelectorAll("a[href]")].filter(i=>i.href===e)[t];function ft([e,t,i],o){let n=document.activeElement,r=he(e,t);r&&(!n||n===document.body||o.some(s=>s.contains(n)))&&Pe(r,{preventScroll:!0,focusVisible:i})}function ye(e){e.setAttribute("aria-hidden","true"),e.setAttribute("popover","manual"),e.dataset.turnLayer="",document.documentElement.append(e);try{e.showPopover()}catch{}}function O(){if(window.top!==window){try{let c=JSON.parse(window.name.split(`${w}:`)[1]??"");K(()=>scrollTo(c.x,c.y)),Fe(c.p,c.o,c.v,c.w),window.pageturn&&(window.pageturn.behind={move:c.m,data:c.d})}catch{}return null}let e=k(w);if(V(w),!e||e.n!==window.pageturn?.arrival?.move)return null;let t=document.createElement("div");t.innerHTML=e.h;let i=t.firstElementChild;if(!(i instanceof HTMLElement))return null;let o=null;if(e.s)try{let c=new CSSStyleSheet;c.insertRule(`${Re(e.s)}{visibility:hidden!important}`),document.adoptedStyleSheets=[...document.adoptedStyleSheets,c],o=c}catch{}for(let c of[i,...i.querySelectorAll("[data-turn-style]")])c.style.cssText=c.dataset.turnStyle??"";ye(i);let n={flight:e,layer:i,sheet:o,taken:!1};e.b&&(document.documentElement.dataset.turnBehind="");let{x:r=0,y:s}=e;return s!==void 0&&K(()=>scrollTo(r,s)),e.o&&Fe(e.s,e.o,e.v,e.w,e.l),D(()=>setTimeout(()=>n.taken||_(n))),n}function _(e){e.taken=!0,document.querySelector("[data-turn-origin]")?.removeAttribute("data-turn-origin"),e.layer.remove(),document.adoptedStyleSheets=document.adoptedStyleSheets.filter(t=>t!==e.sheet)}window.pageturnMorph===void 0&&(window.pageturnMorph=O());var Ne=Symbol.for("pageturn.registry"),Ie=globalThis;Ie[Ne]??={b:new Map,d:[],e:null,settings:{defaultMove:"page",prefetch:!0,leaveTimeout:4e3,stuckTimeout:4e3,arrivalEnds:"animations"},g:!1,f:Object.freeze({})};var ge=Ie[Ne],q=e=>e===ge.f;var U=(e,t)=>window.pageturn?.defineMove?.(e,t)??(()=>{}),be=()=>window.pageturn?.arrival??null;var ht=e=>new Promise(t=>setTimeout(t,e)),C=(e,t)=>Promise.race([e,ht(t).then(()=>null)]),H=e=>Number.isFinite(e.effect?.getComputedTiming().endTime),yt=["TopLeft","TopRight","BottomRight","BottomLeft"],X=e=>typeof e=="number"?[e,e,e,e]:e,De=e=>e.every(t=>t===e[0])?e[0]:e;function A(e,t,i=1){return De(yt.map(o=>{let n=e[`border${o}Radius`],r=Number.parseFloat(n)||0;return n.includes("%")?r/100*t:r*i}))}var M=(e,t=1)=>X(e).map(i=>`${i/t}px`).join(" ");function gt(e,t){let i=[...X(A(getComputedStyle(e),t.width))],o=(n,r)=>Math.abs(n-r)<1;for(let n=e.parentElement;n&&n!==document.body;n=n.parentElement){let r=getComputedStyle(n);if(r.overflow==="visible"&&!/paint|strict|content/.test(r.contain))continue;let s=n.getBoundingClientRect(),c=s.left+n.clientLeft,a=s.top+n.clientTop,d=o(t.right,c+n.clientWidth),l=o(t.bottom,a+n.clientHeight),m=o(t.left,c),p=o(t.top,a),u=X(A(r,s.width)),f=Math.max(n.clientLeft,n.clientTop);[m&&p,d&&p,d&&l,m&&l].forEach((b,h)=>{b&&(i[h]=Math.max(i[h]??0,(u[h]??0)-f))})}return De(i)}function G(e){let t=e.getBoundingClientRect(),{left:i,top:o,width:n,height:r}=t,s={box:{left:i,top:o,width:n,height:r},radius:gt(e,t)},c=e.matches("img")?e:e.querySelector("img");return c?.sizes&&(s.sizes=c.sizes),s}var $=(e,t,i)=>({...e,box:{...e.box,left:e.box.left+t,top:e.box.top+i}}),Ke=(e,t)=>{let i=n=>[n.box.left,n.box.top,n.box.width,n.box.height,...X(n.radius),n.rotate??0,n.text?.box.left??0,n.text?.box.top??0,Number.parseFloat(n.text?.type.fontSize??"0")],o=i(t);return i(e).every((n,r)=>Math.abs(n-(o[r]??0))<.5)&&e.text?.color===t.text?.color&&e.background===t.background};function W(e,t){let i=e.filter(H),o=i.map(n=>n.currentTime);for(let n of i)n.currentTime=n.effect?.getComputedTiming().endTime;try{return t()}finally{i.forEach((n,r)=>{n.currentTime=o[r]??null})}}var P="position:fixed;inset:auto;left:0;top:0;margin:0;border:0;padding:0;overflow:visible;background:none;color:inherit;pointer-events:none;z-index:2147483647;transform-origin:50% 50%;max-width:none;max-height:none",Q="margin:0;max-width:none;max-height:none;box-sizing:border-box;visibility:visible;translate:none;rotate:none;scale:none;transform:none";function Z(e){let t=e.cloneNode(!0);for(let i of[t,...t.querySelectorAll("[id]")])i.removeAttribute("id");return t}var ee=e=>[Number.parseFloat(e.style.width),Number.parseFloat(e.style.height)],te=(e,t,i)=>`${e.left+(e.width-t)/2}px ${e.top+(e.height-i)/2}px`,ne=(e,t)=>({...e.move,opacity:t.opacity??1});function _e(e,t,i){let o=t.pose(e)(i);Object.assign(e.style,ne(o,i)),Object.assign(o.on.style,o.look),o.inner&&Object.assign(o.inner.on.style,o.inner.look)}function B(e){let t=e.cloneNode(!0);for(let o of t.querySelectorAll("[data-turn-shot]"))o.remove();let i=e.querySelectorAll("img");t.querySelectorAll("img").forEach((o,n)=>{let r=i[n],s=r?.complete&&r.naturalWidth?r.currentSrc:o.dataset.turnFile;if(s){o.src=s,o.removeAttribute("srcset"),o.removeAttribute("sizes");for(let c of o.parentElement?.querySelectorAll("source")??[])c.remove()}});for(let o of[t,...t.querySelectorAll("[style]")])o.dataset.turnStyle=o.style.cssText,o.removeAttribute("style");return t.outerHTML}var bt=250,Y="img,video,canvas";async function We(e){let t=e.matches("img")?e:e.querySelector("img");t instanceof HTMLImageElement&&await C(t.decode(),bt).catch(()=>{})}function xt(e,t,i,o){let{naturalWidth:n,naturalHeight:r}=e;if(!e.complete||!n||!r)return null;let s=document.createElement("canvas"),c=Math.max(t/n,i/r),a=t/c,d=i/c,[l=.5,m=.5]=o.split(" ").map(p=>p.endsWith("%")?Number.parseFloat(p)/100:.5);s.width=Math.round(a),s.height=Math.round(d);try{s.getContext("2d")?.drawImage(e,(n-a)*l,(r-d)*m,a,d,0,0,s.width,s.height)}catch{return null}return s.dataset.turnShot="",s.style.cssText="position:absolute;left:0;top:0;width:100%;height:100%;z-index:-1",s}function qe(e){let t=e.querySelectorAll(Y);return e.matches(Y)?e:t.length===1?t[0]:null}var Ye={read(e,t){let i=qe(e);if(!i||i===e)return;let o=getComputedStyle(i),n=new DOMMatrix(o.transform),r=Math.hypot(n.a,n.b)*(Number.parseFloat(o.scale)||1);Math.abs(r-1)>.001&&(t.zoom=r)},build(e,t,i){let o=document.createElement("div"),n=qe(e),r=Z(n?n.closest("picture")??n:e),s=r.matches(Y)?r:(n&&r.querySelector(Y))??r;s!==r&&(r.style.cssText="display:contents"),r.dataset.turnContent="",s.style.cssText+=`;display:block;width:100%;height:100%;${Q}`,n&&(s.style.objectFit="cover",s.style.objectPosition=getComputedStyle(n).objectPosition);let{width:c,height:a}=(i??t).box;if(o.style.cssText=`${P};width:${c}px;height:${a}px`,o.append(r),s instanceof HTMLImageElement&&n instanceof HTMLImageElement){if(s.loading="eager",s.decoding="sync",s.dataset.turnFile=n.currentSrc,i){let l=i.sizes??`${Math.ceil(c)}px`;for(let m of o.querySelectorAll("img[srcset],source[srcset]"))m.sizes=l}let d=xt(n,c,a,s.style.objectPosition);if(d){o.append(d);let l=()=>{s.decode().then(()=>d.remove(),()=>{})};s.complete&&s.naturalWidth?l():s.addEventListener("load",l,{once:!0})}}return o},pose(e){let[t,i]=ee(e),o=e.querySelector(Y)??e.firstElementChild;return({box:n,rotate:r=0,radius:s,zoom:c=1})=>{let a=Math.max(n.width/t,n.height/i);return{move:{translate:te(n,t,i),rotate:`${r}deg`,scale:`${a}`},look:{clipPath:`inset(${(i-n.height/a)/2}px ${(t-n.width/a)/2}px round ${M(s,a)})`},on:e,inner:{look:{scale:`${c}`},on:o}}}},fit(e,t){e.style.width=`${t.box.width}px`,e.style.height=`${t.box.height}px`}};var F=(e,t={})=>({...e,duration:t.duration??e.duration,delay:t.delay??e.delay,easing:t.easing??e.easing});var wt=500,Et="cubic-bezier(0.2, 0, 0, 1)",vt=300;function Ee(){return window.pageturnMorph===void 0&&(window.pageturnMorph=O()),window.pageturnMorph}var xe=!1,je=()=>xe;function ze(e){let t=e;return t.style.visibility="hidden",t}var we=new Set,Je=e=>we.has(e);function oe(e,t){if(!L||window.top!==window||J())return()=>{};we.add(e);let i=t.as??Ye,o=[t.find??[]].flat(),n=a=>a.ownerDocument!==document?r.read(a):W(document.getAnimations().filter(d=>{let{effect:l}=d;return l instanceof KeyframeEffect&&l.target?.contains(a)}),()=>r.read(a)),r={name:e,morph:t,live:null,endOf:G,onLeave:[],onStay:[],onPlay:[],onRemove:[],siteAnimations:[],atRest:n,read(a){let d=r.endOf(a);return i.read?.(a,d,a.matches(t.to)),d},timing:a=>F(F({duration:wt,delay:0,easing:Et,fill:"both"},t),a),about:(a,d)=>({back:d,link:a,decline:()=>ge.f,measure(l,m){let p=r.read(l);if(!m)return p;let u=r.read(m),f=p.text?.box??p.box,b=u.text?.box??u.box,h=b.left-f.left,y=b.top-f.top,g=$(p,h,y);return g.text&&(g.text={...g.text,box:{...g.text.box,left:g.text.box.left+h,top:g.text.box.top+y}}),g},scroll:{x:scrollX,y:scrollY}}),layer(a,d,l){let m=i.build(a,d,l);return _e(m,i,d),m},async put(a,d,l){let m=r.layer(a,d,l);return r.live={layer:m,hidden:ze(a)},ye(m),m},async travel(a,d,l,m,p=!0,u=null){let f=r.live?.layer;if(!f)return;let b=i.pose(f),h=b(a),y=b(d);f.animate([ne(h,a),ne(y,d)],m),h.on.animate([h.look,y.look],m),h.inner&&y.inner&&JSON.stringify(h.inner.look)!==JSON.stringify(y.inner.look)&&h.inner.on.animate([h.inner.look,y.inner.look],m);let g=()=>{},E=new Promise(x=>{g=x});try{i.play?.(f,a,d,m,l.back);for(let x of r.onPlay)x(f,a,d,m,E);p&&t.during?.({...l,layer:f,content:f.firstElementChild,box:f.querySelector("[data-turn-box]"),words:f.querySelector("[data-turn-words]"),animate(x,N,z){let j=x.animate(N,{...m,...z});return r.siteAnimations.push(j),j},start:a,stop:d,timing:m,behind:u,finished:E,atEnd:x=>W(f.getAnimations({subtree:!0}),x)})}catch(x){reportError(x)}u&&u.getAnimations().length===0&&u.animate({opacity:[0,1]},F(m,r.appear));let S=()=>[...f.getAnimations({subtree:!0}),...u?.getAnimations()??[]].filter(H);await Promise.all([...S(),...r.siteAnimations.filter(H)].map(x=>x.finished)).catch(()=>{});for(let x of S()){try{x.commitStyles()}catch{}x.cancel()}g()},hand(a){xe=!0,T(w,a)},async land(a,d,l,m={x:scrollX,y:scrollY},p){let u={...l,scroll:m};a.taken=!0;let{flight:f,layer:b}=a;try{document.readyState==="loading"&&await new Promise(g=>K(g));let h=d();if(!h)return;r.live={layer:b,hidden:ze(h)};let y=$(n(h),scrollX-m.x,scrollY-m.y);if(f.t){let g=u.back?{from:y,to:f.f??null}:{from:f.f??y,to:y};f.f&&t.ends?.(g,u);let E=(u.back?g.from:g.to)??y;Ke(f.e,E)||await r.travel(f.e,E,u,{...r.timing(p),delay:0,duration:vt},!1)}else{let g=u.back?{from:y,to:f.e}:{from:f.e,to:y};if(!q(t.ends?.(g,u))){let E=(u.back?g.to:g.from)??f.e,S=(u.back?g.from:g.to)??y;i.fit?.(b,S),await r.travel(E,S,u,r.timing(p))}}await We(h)}catch(h){reportError(h)}finally{r.drop(),_(a)}},drop(){for(let a of r.siteAnimations.splice(0))a.cancel();r.live?.layer.remove(),r.live?.hidden.style.removeProperty("visibility"),r.live=null}},s=U(e,{match:a=>t.match?t.match(a):!!t.from?.(a.link),async leave(a){let d=t.from?.(a.link);if(!d||!a.canHandOver||r.live)return a.decline();let l=r.about(a.link,!1),m={from:r.read(d),to:null};for(let y of o)try{m.to??=await y(a.to,t.to,n)}catch(g){reportError(g)}if(q(t.ends?.(m,l)))return a.decline();let{from:p,to:u}=m;if(p.box.width===0||p.box.height===0)return a.decline();let f=await r.put(d,p,u),b=a.leaving();u&&await r.travel(p,u,l,r.timing()),await b,r.hand({n:t.arriveAs??e,m:e,h:B(f),e:u??p,...u?{f:p}:{},t:!!u,s:t.to});let h={arriveAs:t.arriveAs??e,data:t.data?.(a)??null};for(let y of r.onLeave)h={...h,...y(a,d,p,h.data)};return h},stay(a,d){xe=!1,r.drop();for(let l of r.onStay)l(d);t.stay?.(a,d)}});for(let a of[...o.map(d=>d.start),...t.use??[]])a?.(r);let c=Ee();return c&&!c.taken&&c.flight.m===e&&r.land(c,()=>v(t.to),r.about(null,!1)),()=>{s(),we.delete(e);for(let a of r.onRemove)a()}}var ve=e=>`${w}:from:${e}`;function Ue(e){let t=k(ve(e)),i=fe();return t&&window.top===window&&new URL(t.u).pathname===location.pathname&&i?.type==="navigate"&&window.pageturn?.arrival?.move!==t.a?(Se(e),null):t}function Se(e){!L||window.top!==window||V(ve(e))}var re=.25;function ie({left:e,top:t,width:i,height:o}){let n=Math.min(e+i,innerWidth)-Math.max(e,0),r=Math.min(t+o,innerHeight)-Math.max(t,0);return Math.max(n,0)*Math.max(r,0)/(i*o||1)}function St(e){let t="";for(let i=e;i!==document.body&&i.parentElement;i=i.parentElement){let o=[...i.parentElement.children].indexOf(i)+1;t=`>${i.localName}:nth-child(${o})${t}`}return`body${t}`}function Tt(){try{return document.getElementById(decodeURIComponent(location.hash.slice(1)))}catch{return null}}function kt(){return Tt()?.scrollIntoView({behavior:"instant"}),{x:scrollX,y:scrollY}}function Mt(e){try{return e.parentElement?.closest(":popover-open")!=null}catch{return!1}}var Xe=()=>[...document.querySelectorAll("a[href]")],Ve=new WeakMap;function Lt(e){let t=[];for(let[i,o]of Object.entries(e)){let n=null;try{n=document.querySelector(i)}catch{}if(n)for(let r of[o].flat())t.push([i,r,n.getAttribute(r)])}return t}function Ot(e){let{href:t}=e,i=0;for(let o of Xe()){if(o===e)return i;o.href===t&&(i+=1)}return-1}var se=(e,t)=>({s:e?.p??"",...e?{...Te(e,t),l:[e.u,e.k,!!e.i]}:{}}),Te=(e,t)=>({o:t,v:e.v,...e.w?.length?{w:e.w}:{}});function R(e){let t=Ve.get(e);if(t)return t;let i=ve(e.name),o={name:`${e.name}-back`,origin:()=>Ue(e.name),keep:{}};Ve.set(e,o),e.onLeave.push((s,c,a,d)=>{T(i,{d,a:e.morph.arriveAs??e.name,f:location.pathname,u:s.link.href,k:Ot(s.link),p:St(c),v:Mt(c),w:Lt(o.keep),i:s.link.matches(":focus-visible"),x:scrollX,y:scrollY,e:a})});function n(){let s=o.origin();return s?.f===location.pathname?s:null}function r(s,c){let a=be(),d=a?.via==="history"?o.byHistory:o.byLink;if(!a||!d)return;let l=n(),m=Xe().filter(y=>y.pathname===a.from),p=l?he(l.u,l.k):void 0,u=p&&m.includes(p)?p:m.find(y=>e.morph.from?.(y));if(!u)return;u!==p&&(document.adoptedStyleSheets=document.adoptedStyleSheets.filter(y=>y!==s.sheet));let f=a.via==="link",{x:b=0,y:h}=s.flight;h!==void 0&&scrollTo(b,h),e.land(s,()=>e.morph.from?.(u)??null,e.about(u,!0),h!==void 0?{x:b,y:h}:l&&!f&&!c?{x:l.x,y:l.y}:f?kt():{x:scrollX,y:scrollY},d)}return queueMicrotask(()=>{let s=Ee();s&&!s.taken&&s.flight.m===o.name&&r(s,!1)}),e.onStay.push(s=>{if(s.reason!=="returned"||!be())return;let c=O();c?.flight.m===o.name&&(r(c,!0),c.taken||_(c))}),o}function Ge(e){let t=Ue(e);return t&&{page:t.f,scroll:{x:t.x,y:t.y},data:t.d}}function ae(e={}){return t=>{let i=R(t);i.byHistory=e,Object.assign(i.keep,e.keep),t.onLeave.push((n,r,s,c)=>({returnAs:i.name,remember:c}));let o=()=>{if(je())return;let n=i.origin(),r=v(t.morph.to),s=r&&t.read(r),c=window.pageturn?.j,a={from:location.pathname,at:Date.now(),data:null};if(!r||!s||ie(s.box)<(e.inView??re)){n&&new URL(n.u).pathname===location.pathname&&c?.p({...a,none:!0});return}c&&!c.o()&&c.p(a);let d=t.layer(r,s,null);T(w,{n:i.name,m:i.name,h:B(d),e:s,t:!1,...se(n,t.name)})};addEventListener("pagehide",o),t.onRemove.push(()=>removeEventListener("pagehide",o))}}var At=`${w}:seen:`;function Ze(){return(e,t,i)=>{let o=v(t);return o&&$(i(o),scrollX,scrollY)}}var Qe=e=>`${At}${e}:${innerWidth}x${innerHeight}`,Ct=20;function ce(){let e=(t,i)=>{let o=k(Qe(i))??{},n=Object.keys(o).filter(r=>r!==location.pathname);return o[t.pathname]??o[n[n.length-1]??""]??null};return e.start=({morph:t,atRest:i})=>{let o=()=>{let n=v(t.to);if(!n)return;let r=i(n);if(r.box.width>0){let s=Qe(t.to),{[location.pathname]:c,...a}=k(s)??{},d=Object.entries(a).slice(1-Ct);T(s,{...Object.fromEntries(d),[location.pathname]:$(r,scrollX,scrollY)})}};document.readyState==="complete"?o():addEventListener("load",o,{once:!0})},e}var ke="data-turn-morph";function Ht(){let e=new Set([...document.querySelectorAll(`[${ke}]`)].map(t=>t.getAttribute(ke)??""));for(let t of e){if(!t||Je(t))continue;let i=`[${ke}="${CSS.escape(t)}"]`;oe(t,{from:o=>o.querySelector(i)??o.closest(i),to:i,find:ce(),use:[ae()]})}}L&&D(Ht);var Ae={};pt(Ae,{back:()=>ae,behind:()=>tt,copy:()=>nt,defineMorph:()=>oe,forgetWayOut:()=>Se,here:()=>Ze,linkBack:()=>ot,peek:()=>rt,seen:()=>ce,shadow:()=>it,text:()=>at,turned:()=>ct,wayOut:()=>Ge});var $t="position:fixed;top:0;border:0;margin:0;padding:0;max-width:none;max-height:none;pointer-events:none";function le(e,t,i=""){return new Promise(o=>{let n=document.createElement("iframe");n.name=i,n.setAttribute("aria-hidden","true"),n.tabIndex=-1,n.inert=!0,n.style.cssText=`${$t};width:${document.documentElement.clientWidth}px;height:${innerHeight}px;${t}`;let r=()=>{n.remove(),o(null)};n.addEventListener("error",r),n.addEventListener("load",async()=>{try{if(await n.contentDocument?.fonts.ready,!n.contentDocument?.body)throw new Error("no page");o(n)}catch{r()}}),n.src=e,document.documentElement.append(n)})}var et=["pointerover","focusin","touchstart"];function de(e){let t=null,i=o=>{let n=o.target instanceof Element?o.target.closest("a[href]"):null;n!==t&&(t=n,n&&!Be(n)&&!J()&&e({link:n,via:"link",from:new URL(location.href),to:new URL(n.href),canHandOver:!0}))};for(let o of et)addEventListener(o,i,{passive:!0,capture:!0});return()=>{for(let o of et)removeEventListener(o,i,{capture:!0})}}var Pt=800;function tt(e={}){return t=>{let i=R(t);t.appear=e.appear;let o=null,n=()=>{o?.frame.then(s=>s?.remove()),o=null};function r(s,c){if(o?.address!==s){n();let a=le(s,"left:0;opacity:0;z-index:2147483646",`${w}:${JSON.stringify({x:c.x,y:c.y,m:i.name,d:c.d,p:c.p,...Te(c,t.name)})}`).then(d=>{let l=d?.contentWindow;if(!d||!l)return null;l.scrollTo(c.x,c.y);let m=d.contentDocument?.querySelector(c.p);return m&&(m.style.visibility="hidden"),new Promise(p=>l.requestAnimationFrame(()=>l.requestAnimationFrame(()=>p(d))))});o={address:s,frame:a}}return o.frame}i.aims=(s,c,a)=>{let d={from:{...s.e},to:c};return q(t.morph.ends?.(d,a))?!1:{stop:d.from,end:d.to??c}},i.frameBehind=(s,c)=>C(r(s.to.href,c),e.wait??Pt),i.dropFrame=n,t.onRemove.push(n,de(s=>{let c=i.origin();c&&i.leadsBack?.(s)&&r(s.to.href,c)}))}}function nt(){return{build(e){let t=document.createElement("div"),i=Z(e),o=e,n=o.offsetWidth&&o.offsetHeight?null:e.getBoundingClientRect(),r=o.offsetWidth||(n?.width??0),s=o.offsetHeight||(n?.height??0);return i.style.cssText+=`;width:${r}px;height:${s}px;${Q}`,i.dataset.turnContent="",t.style.cssText=`${P};width:${r}px;height:${s}px`,t.append(i),t},pose(e){let[t,i]=ee(e);return({box:o,rotate:n=0,radius:r})=>{let s=o.width/t,c=o.height/i;return{move:{translate:te(o,t,i),rotate:`${n}deg`,scale:`${s} ${c}`},look:{borderRadius:`${M(r,s)} / ${M(r,c)}`},on:e.firstElementChild}}}}}function ot(e={}){return t=>{let i=R(t);i.byLink=e,Object.assign(i.keep,e.keep);let o=r=>r.getAttribute("data-turn-back")===t.name;i.leadsBack=r=>o(r.link)?!0:e.match?e.match(r):r.to.pathname===i.origin()?.f;let n=i.origin();for(let r of document.querySelectorAll("a[data-turn-back]"))if(o(r)&&(r.dataset.turn=i.name,n&&n.f!==r.pathname)){r.href=n.f;let s=r.dataset.turnBackLabel;s&&r.setAttribute("aria-label",s)}t.onRemove.push(U(i.name,{match:i.leadsBack,async leave(r){let s=i.origin(),c=s?.f===r.to.pathname?s:null,a=v(t.morph.to);if(!a||!r.canHandOver||t.live)return r.decline();let d=t.about(null,!0),l=t.read(a),m=null;if(c&&i.aims){let h=i.aims(c,l,d);if(h===!1)return r.decline();({stop:m,end:l}=h)}if(ie(l.box)<(e.inView??re))return r.decline();let p=c&&m?await i.frameBehind?.(r,c)??null:null,u=await t.put(a,l,m),f=r.leaving();m&&await t.travel(l,m,d,t.timing(e),!0,p),await f;let b=c&&(m||e.scroll!==!1&&!r.to.hash);return t.hand({n:i.name,m:i.name,h:B(u),e:m??l,...m?{f:l}:{},t:!!m,b:!!p,...se(c,t.name),...c&&b?{x:c.x,y:c.y}:{}}),{data:c?.d??null}},stay(r,s){t.drop(),i.dropFrame?.(),t.morph.stay?.(r,s)}}))}}var Bt=1500;function rt(e={}){let t=new Map,i=(n,r,s)=>{let c=`${n.href} ${r} ${innerWidth}x${innerHeight}`,a=t.get(c);return a||(a=le(n.href,"left:-200vw;visibility:hidden").then(d=>{let l=d?.contentDocument,m=l?.querySelector(r);for(let u of l?.getAnimations()??[])H(u)&&u.finish();let p=m?s(m):null;return d?.remove(),p||t.delete(c),p}),t.set(c,a)),a},o=(n,r,s)=>C(i(n,r,s),e.wait??Bt);return(e.warm??!0)&&(o.start=n=>{n.onRemove.push(de(r=>{let{match:s,from:c}=n.morph;(s?s(r):c?.(r.link))&&i(r.to,n.morph.to,n.read)}))}),o}function Me(e){if(/^[-\d.]/.test(e))return e;let[,t,i,o,n]=/^(.*?\)|\S+) (\S+) (\S+) (\S+)/.exec(e)??[];return t&&n?`${i} ${o} ${n} ${t}`:void 0}var Le=e=>`drop-shadow(${e})`;function it(){return e=>{let{read:t}=e;e.read=i=>{let o=t(i),n=Me(getComputedStyle(i).boxShadow);return n&&(o.shadow=n),o},e.onPlay.push((i,o,n,r,s)=>{let c=o.shadow&&Me(o.shadow),a=n.shadow&&Me(n.shadow),d=c??a;if(!d)return;let l=document.createElement("div");l.setAttribute("aria-hidden","true"),l.dataset.turnShadow="",l.style.cssText=`position:fixed;left:0;top:0;z-index:2147483646;pointer-events:none;filter:${Le(d)}`;let m=document.createElement("div");m.style.cssText=`background:#000;width:${i.style.width};height:${i.style.height}`;for(let p of i.getAnimations()){let{effect:u}=p;u instanceof KeyframeEffect&&m.animate(u.getKeyframes(),r)}l.animate(c&&a?{filter:[Le(c),Le(a)]}:{opacity:c?[1,0]:[0,1]},r),l.append(m),i.before(l),s.then(()=>l.remove())})}}var Ft=["fontSize","fontWeight","fontStretch","letterSpacing","fontVariationSettings"],st=["fontFamily","fontStyle","textTransform","fontKerning","fontFeatureSettings"];function Oe(e){let t=e.ownerDocument.createRange();t.selectNodeContents(e);let{left:i,top:o,width:n,height:r}=t.getBoundingClientRect();return{left:i,top:o,width:n,height:r}}function Rt(e,t){let i=Math.min(e.length,t.length),o=0;for(;o<i&&e[o]===t[o];)o++;let n=0;for(;n<i-o&&e[e.length-1-n]===t[t.length-1-n];)n++;return[e.slice(0,o),e.slice(o,e.length-n),t.slice(o,t.length-n),t.slice(t.length-n)]}function at(e={}){let t=o=>typeof e.box=="object"?e.box[o?"to":"from"]:e.box,i=(o,n)=>o.querySelector(`[data-turn-part="${n}"]`);return{read(o,n,r){let s=getComputedStyle(o),c={};for(let l of Ft)c[l]=s[l];c.letterSpacing==="normal"&&(c.letterSpacing="0px"),c.fontVariationSettings==="normal"&&(c.fontVariationSettings=`"opsz" ${Number.parseFloat(s.fontSize)}`);let a=Oe(o),d=(o.textContent??"").replace(/\s+/g," ").trim();if(n.background=s.backgroundColor,o.getClientRects().length===0){let l=document.createElement("span");l.style.cssText="position:fixed;left:0;top:0;white-space:nowrap;line-height:1;font-optical-sizing:none;visibility:hidden";for(let m of st)l.style[m]=s[m];Object.assign(l.style,c),l.textContent=d,document.documentElement.append(l),a=Oe(l),l.remove(),n.box={...a}}else if(t(r)){let l=getComputedStyle(o,t(r)),[m,p,u,f]=[l.left,l.top,l.width,l.height].map(Number.parseFloat);if(l.content!=="none"&&[m,p,u,f].every(Number.isFinite)){let b=o.getBoundingClientRect();n.box={left:b.left+o.clientLeft+(m??0),top:b.top+o.clientTop+(p??0),width:u??0,height:f??0},n.radius=A(l,u??0),n.background=l.backgroundColor}}n.text={box:a,type:c,color:s.color,words:d}},build(o,n){let r=document.createElement("div"),s=document.createElement("span"),c=document.createElement("span"),a=getComputedStyle(o),d=n.text?.type??{};r.style.cssText=`${P};width:0;height:0;white-space:nowrap;line-height:1;font-optical-sizing:none`;for(let l of st)r.style[l]=a[l];return Object.assign(r.style,d),s.style.cssText="position:absolute;left:0;top:0",s.textContent=n.text?.words??"",s.dataset.turnContent="",s.dataset.turnWords="",c.style.cssText="position:absolute;z-index:-1",c.dataset.turnBox="",r.append(s,c),r},pose(o){let n=o.lastElementChild,r=s=>{let c=o.cloneNode(!1),a=document.createElement("span");c.removeAttribute("popover"),delete c.dataset.turnLayer,Object.assign(c.style,s.type,{translate:"none",rotate:"none",visibility:"hidden"}),a.style.cssText="position:absolute;left:0;top:0",a.textContent=s.words,c.append(a),document.documentElement.append(c);let d=c.getBoundingClientRect(),l=Oe(a);return c.remove(),[l.left-d.left,l.top-d.top]};return({text:s,rotate:c=0,box:a,radius:d,background:l})=>{if(!s)throw new Error("pageturn/morph: an end has no text");let[m,p]=r(s),u=s.box.left-m,f=s.box.top-p;return{move:{translate:`${u}px ${f}px`,rotate:`${c}deg`},look:{...s.type,color:s.color,transformOrigin:`${a.left-u+a.width/2}px ${a.top-f+a.height/2}px`},on:o,inner:{on:n,look:{left:`${a.left-u}px`,top:`${a.top-f}px`,width:`${a.width}px`,height:`${a.height}px`,borderRadius:M(d),backgroundColor:l??"transparent"}}}}},play(o,n,r,s,c){let a=o.firstElementChild,[d,l]=[n.text?.words??"",r.text?.words??""];if(d===l||!l||a.firstElementChild)return;let[m,p,u,f]=Rt(d,l),b=(typeof e.swap=="function"?e.swap({back:c}):e.swap)??{},h=(I,lt,dt)=>`<span data-turn-part="${I}" style="${dt}">${lt.replace(/[&<]/g,mt=>mt==="&"?"&amp;":"&lt;")}</span>`;a.innerHTML=h("head",m,"")+`<span style="position:relative;display:inline-block">${h("arriving",u,"display:inline-block")}${h("leaving",p,"position:absolute;left:0;top:0")}</span><span data-turn-part="fit" style="display:inline-block">${h("rest",f,"display:inline-block;white-space:pre")}</span>`;let[y,g,E,S]=["fit","rest","leaving","arriving"].map(I=>i(o,I)),x=S?.parentElement;b.clip&&(x.style.clipPath=b.clip);let N=I=>I?.getBoundingClientRect().width??0,z=()=>100*(N(S)-N(E))/(N(g)||1),j=z(),Ce=W(o.getAnimations(),z),me=F(s,b);y?.animate({translate:[`${-j}% 0`,`${-Ce}% 0`]},s),g?.animate({translate:["0% 0",`${Ce}% 0`]},me),E?.animate(b.leave??[{opacity:1},{opacity:0}],me),S?.animate(b.arrive??[{opacity:0},{opacity:1}],me)}}}function Nt(e){let[t=1,i=t]=e.scale.split(" ").map(Number.parseFloat);return new DOMMatrix().rotate(Number.parseFloat(e.rotate)||0).scale(t||1,i||1).multiply(new DOMMatrix(e.transform))}function ct(){return e=>{e.endOf=t=>{let i=G(t),o=new DOMMatrix;for(let m=t;m;m=m.parentElement)o=Nt(getComputedStyle(m)).multiply(o);let n=Math.atan2(o.b,o.a)*180/Math.PI,r=Math.hypot(o.a,o.b),s=t,c=Math.abs(n)>.01&&s.offsetWidth>0,{box:a}=i,d=c?s.offsetWidth*r:a.width,l=c?s.offsetHeight*Math.hypot(o.c,o.d):a.height;return{...i,box:{left:a.left+(a.width-d)/2,top:a.top+(a.height-l)/2,width:d,height:l},rotate:n,radius:A(getComputedStyle(t),d,r)}}}}window.pageturn&&(window.pageturn.morph=Ae);})();
package/dist/pageturn.js CHANGED
@@ -1 +1 @@
1
- (()=>{var R=()=>performance.getEntriesByType("navigation")[0];function W(e){let t=R();(t?t.domContentLoadedEventStart>0:document.readyState!=="loading")?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}var q;function E(){return q??=matchMedia("(prefers-reduced-motion: reduce)"),q.matches}function $(){window.pageturn&&(window.pageturn.l=!0),delete document.documentElement.dataset.turnEntering}function C(e){try{let t=sessionStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function b(e,t){try{return sessionStorage.setItem(e,JSON.stringify(t)),!0}catch{return!1}}function A(e){try{sessionStorage.getItem(e)!==null&&sessionStorage.removeItem(e)}catch{}}var O=2,f="pageturn",Y="pageturn:left",Ee=1e4,be=3e3,G=(e,t)=>{let n=Date.now()-e;return n>=0&&n<t};function X(){let e=C(f);return A(f),e&&G(e.at,Ee)?e:null}var P=e=>e.pathname+e.search,Ae=(e,t)=>b(f,{...e,to:P(t)}),Se=()=>A(f);function D(){let e=C(Y);return e&&G(e.at,be)?e:null}var Te=e=>b(Y,e);function xe(){let e=`${f}:probe`,t=b(e,0);return A(e),t}function ke(){let e=history.state;return e&&typeof e=="object"?e:null}function F(){let e=ke()?.[f];return e&&typeof e=="object"?e:null}function Le(e){let t=history.state;if(t!==null&&(typeof t!="object"||Object.getPrototypeOf(t)!==Object.prototype))return;let{[f]:n,...r}=t??{};if(!(!e&&!n))try{history.replaceState(e?{...r,[f]:e}:r,"")}catch{}}function V(e,t){return!e?.returnAs||!t||t.none||t.from!==e.to?null:{move:e.returnAs,via:"history",from:t.from,data:null,remembered:e.remember??null,reported:t.data??null}}var z={m:O,g:Ae,n:Se,o:D,p:Te,q:xe,r:F,h:Le,s:V};var s=document.documentElement,Me="--turn-",S=new Map;function Q(e){if(!e||s.dataset.turnArriving===e){delete s.dataset.turnArriving,delete s.dataset.turnEntering,delete s.dataset.turnWith;for(let[t,{covered:n,own:r}]of S)s.style.getPropertyValue(t)===r&&(n?s.style.setProperty(t,n):s.style.removeProperty(t));S.clear()}}function H(e){if(typeof e=="object")for(let[t,n]of Object.entries(e??{}))if(/^(string|number)$/.test(typeof n)){let r=Me+t,i=`${n}`;S.set(r,{covered:S.get(r)?.covered??s.style.getPropertyValue(r),own:i}),s.style.setProperty(r,i)}else n===!0&&(s.dataset.turnWith=`${s.dataset.turnWith??""} ${t}`.trim())}function ee(e){H(e.remembered),H(e.reported),H(e.data)}function Z(e){s.dataset.turnArriving=e.move,ee(e)}function Re(){let e={arrival:null,endArrival:Q,t:Z};if(window.pageturn=e,window.top!==window)return;e.i=z,e.a=!0;let t=X();if(E())return;let n=R(),r=t&&n?.type!=="reload"&&n?.type!=="back_forward"&&(!t.to||t.to===P(location)||(n?.redirectCount??0)>0)?t:null;e.arrival=r?{move:r.move,via:"link",from:r.from,data:r.data??null,remembered:null,reported:null}:n?.type==="back_forward"?V(F(),D()):null;let i=!!(r?.a&&"CSSViewTransitionRule"in window),{arrival:a}=e;if(a&&(i?ee(a):Z(a)),n?.type!=="back_forward"){s.dataset.turnEntering="";let l=["wheel","touchstart","keydown","pointerdown"],c=!0,u=()=>{c&&(scrollX||scrollY)&&($(),h())},v=new ResizeObserver(u),h=()=>{c=!1,v.disconnect(),removeEventListener("scroll",u);for(let M of l)removeEventListener(M,h,!0)},B=()=>{c&&(v.observe(s),requestAnimationFrame(B))};B(),addEventListener("scroll",u);for(let M of l)addEventListener(M,h,!0);addEventListener("load",()=>requestAnimationFrame(()=>requestAnimationFrame(h)))}addEventListener("pagehide",l=>{l.persisted&&(e.j=null,i=!1)}),addEventListener("pagereveal",l=>{let c=l.viewTransition;e.j=c;let{arrival:u}=e;u&&(i?c?c.types.add(u.move):s.dataset.turnArriving=u.move:c?.skipTransition(),i=!1)}),addEventListener("pagehide",l=>{l.persisted&&(e.arrival=null,Q())})}window.pageturn||Re();var te=Symbol.for("pageturn.registry"),ne=globalThis;ne[te]??={b:new Map,d:[],e:null,settings:{defaultMove:"page",prefetch:!0,leaveTimeout:4e3,stuckTimeout:4e3,arrivalEnds:"animations"},k:!1,f:Object.freeze({})};var o=ne[te],re=e=>e===o.f||e===!1;var oe=new Set;o.u??=e=>{let t=e.href.split("#")[0]??e.href;if(oe.has(t))return;let n=navigator.connection;if(n?.saveData||/2g/.test(n?.effectiveType??""))return;oe.add(t);let r=document.createElement("link");r.relList.supports("prefetch")?(r.rel="prefetch",r.href=t,document.head.append(r)):fetch(t,{priority:"low"}).catch(()=>{})};var g;o.a||(addEventListener("pageswap",e=>{let t=e.viewTransition;g===null?t?.skipTransition():g&&t?.types.add(g),g=void 0}),o.a={v(e,t){let n=window.pageturn?.i;return n&&window.pageturn?.a&&"CSSViewTransitionRule"in window&&getComputedStyle(document.documentElement).getPropertyValue("--pageturn-native").trim()!==""?(n.g({move:e,data:null,from:location.pathname,at:Date.now(),a:!0},t),n.h(null),g=e,!0):!1},c:e=>{g=e}});function T(e,t){let n=getComputedStyle(document.documentElement).getPropertyValue(e),r=Number.parseFloat(n)*(/ms\s*$/.test(n)?1:1e3);return r>=0?Math.min(r,t):t}var x=e=>e.effect?.getTiming().iterations!==1/0,k=(e,t)=>Promise.race([Promise.allSettled(e.map(n=>n.finished)),new Promise(n=>setTimeout(n,t))]);var p=document.documentElement,m=null,w=null,Ce=1e4,_=()=>"turnArriving"in p.dataset||"turnEntering"in p.dataset,N=()=>new Promise(e=>requestAnimationFrame(e));function I(e){_()&&(w=e,window.pageturn?.endArrival())}function J(){if(K(),!_())return;let e=p.dataset.turnArriving??null,t="turnEntering"in p.dataset,n=!1;w=null;let r=new MutationObserver(()=>{if(e=p.dataset.turnArriving??e,t&&!("turnEntering"in p.dataset)&&window.pageturn?.l?t=!1:w===null&&(n=!0),_()||(r.disconnect(),m===r&&(m=null),!t&&e===null))return;let i=o.settings.arrivalEnds==="manually",a=w!=="leave"&&(i||w==="settled"&&!n);document.dispatchEvent(new CustomEvent("pageturn:arrived",{detail:{move:e,entering:t,whole:a}}))});m=r,r.observe(p,{attributeFilter:["data-turn-arriving","data-turn-entering"]}),W(async()=>{await N(),await N(),m===r&&o.settings.arrivalEnds!=="manually"&&Oe(r)})}async function Oe(e){let t=performance.now()+T("--turn-arrive-max",Ce);for(;;){let n=document.getAnimations().filter(i=>i.playState==="running"&&!(typeof CSSTransition<"u"&&i instanceof CSSTransition)&&x(i)),r=t-performance.now();if(n.length===0||r<=0)break;if(await k(n,r),await N(),m!==e)return}m===e&&I("settled")}function L(e){try{o.b.get(e.move)?.arrive?.(e)}catch(t){reportError(t)}}function K(){m?.disconnect(),m=null}function ie(e,t){let n=document.documentElement,r=new Set(document.getAnimations());n.dataset.turnLeaving=e;let i=document.getAnimations().filter(a=>!r.has(a)&&x(a));return i.length===0?Promise.resolve():k(i,T("--turn-leave-max",t)).then(()=>{})}function se(e){let t=e.link.closest("[data-turn]")?.getAttribute("data-turn");if(t)return t==="none"?null:t;try{for(let n of o.d){let r=n(e);if(r!==void 0)return r}for(let[n,r]of o.b)if(r.match?.(e))return n}catch(n){reportError(n)}return o.settings.defaultMove}function U(e,t){let n;return{...e,move:t,leaving:()=>(n||I("leave"),n??=ie(t,o.settings.leaveTimeout),n),decline:()=>o.f}}function ae(e,t){let n=new Promise(r=>setTimeout(r,o.settings.leaveTimeout,null));return Promise.race([le(e,t).catch(()=>null),n])}async function le(e,t){t(e);let n=await o.b.get(e.move)?.leave?.(e);if(re(n)){let r=o.settings.defaultMove;if(r===null)return null;if(r!==e.move)return le(U(e,r),t)}else if(n)return n;return await e.leaving(),{}}var Pe=document.documentElement,d,y=null,j;function ce(){let e=window.pageturn?.i;o.k||e?.m!==O||(d=e,o.k=!0,addEventListener("click",De,!0),addEventListener("pointerdown",Fe,!0),addEventListener("pagehide",He,!0),addEventListener("pageshow",_e),J())}function De(){removeEventListener("click",ue),addEventListener("click",ue)}function de(e){for(let t of e.composedPath()){if(t instanceof HTMLAnchorElement)return t.hasAttribute("href")?t:null;if(t instanceof SVGAElement)return null}return null}function fe(e){let[t]=e.composedPath();return t instanceof HTMLElement&&t.isContentEditable}function me(e){let t=e.target||document.querySelector("base[target]")?.getAttribute("target");if(t&&t!=="_self"||e.hasAttribute("download"))return null;let n=new URL(e.href),r=n.pathname===location.pathname&&n.search===location.search;return n.origin===location.origin&&!r?n:null}function pe(e){o.settings.prefetch&&o.u?.(e)}function Fe(e){if(e.button!==0||fe(e))return;let t=de(e),n=t&&me(t);n&&pe(n)}function ue(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||fe(e))return;let t=de(e),n=t&&me(t);if(!t||!n)return;if(y){e.preventDefault();return}if(d.n(),e.detail===0&&pe(n),E())return;let{a:r}=o,i={link:t,via:"link",from:new URL(location.href),to:n,canHandOver:d.q()},a=se(i);if(a===null){r?.c(null);return}let l=U(i,a);if(!document.dispatchEvent(new CustomEvent("pageturn:leaving",{cancelable:!0,detail:l}))){r?.c(null);return}if(a===o.settings.defaultMove&&!o.b.get(a)?.leave&&r?.v(a,n))return;e.preventDefault();let u={turn:l};y=u,ae(l,v=>{u.turn=v}).then(v=>Ve(u,v))}function Ve(e,t){if(y!==e||e.handover!==void 0)return;let{turn:n}=e;e.handover=t,t&&t.arriveAs!==null&&d.g({move:t.arriveAs??n.move,data:t.data??null,from:location.pathname,at:Date.now()},n.to),e.entry=t?.returnAs?{move:n.move,to:n.to.pathname,returnAs:t.returnAs,remember:t.remember??null}:null,d.h(e.entry),o.a?.c(null),location.assign(n.to.href),j=setTimeout(()=>ve(e,"stuck"),o.settings.stuckTimeout)}function ve(e,t){if(y!==e)return;y=null,clearTimeout(j),o.a?.c(void 0),delete Pe.dataset.turnLeaving;let n={reason:t,handover:e.handover??null};try{o.b.get(e.turn.move)?.stay?.(e.turn,n)}catch(r){reportError(r)}document.dispatchEvent(new CustomEvent("pageturn:stayed",{detail:{turn:e.turn,stay:n}}))}function He(){clearTimeout(j),K();let{e}=o;if(!e&&!window.pageturn?.arrival)return;let t=null;try{t=e?.({decline:()=>o.f})??null}catch(r){reportError(r)}let n=t===o.f;d.p({from:location.pathname,at:Date.now(),data:n?null:t,...n?{none:!0}:{}})}function _e(e){if(!e.persisted)return;o.a?.c(void 0);let t=y,n=window.pageturn;if(!n)return;let r=t?t.entry??null:d.r(),i=d.s(r,d.o());n.arrival=i,i&&(n.t?.(i),n.j?.skipTransition(),J()),t&&ve(t,"returned"),i&&L(i)}function ge(e,t){let n=t;o.b.set(e,n);let r=window.pageturn?.arrival;return r?.move===e&&n.arrive&&queueMicrotask(()=>{o.b.get(e)===n&&L(r)}),()=>{o.b.get(e)===n&&o.b.delete(e)}}function ye(e){let t=e;return o.d.push(t),()=>{let n=o.d.indexOf(t);n>=0&&o.d.splice(n,1)}}function we(e){let t=e;return o.e=t,()=>{o.e===t&&(o.e=null)}}function he(e){for(let[t,n]of Object.entries(e))n!==void 0&&Object.assign(o.settings,{[t]:n})}ce();Object.assign(window.pageturn??{},{defineMove:ge,chooseMove:ye,whenLeft:we,configure:he});})();
1
+ (()=>{var g=typeof document<"u",P=()=>performance.getEntriesByType("navigation")[0];function W(e){let t=P();(t?t.domContentLoadedEventStart>0:document.readyState!=="loading")?e():document.addEventListener("DOMContentLoaded",e,{once:!0})}var q;function b(){return q??=matchMedia("(prefers-reduced-motion: reduce)"),q.matches}function Y(){window.pageturn&&(window.pageturn.l=!0),delete document.documentElement.dataset.turnEntering}function C(e){try{let t=sessionStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function A(e,t){try{return sessionStorage.setItem(e,JSON.stringify(t)),!0}catch{return!1}}function S(e){try{sessionStorage.getItem(e)!==null&&sessionStorage.removeItem(e)}catch{}}var D=2,f="pageturn",G="pageturn:left",be=1e4,Ae=3e3,X=(e,t)=>{let n=Date.now()-e;return n>=0&&n<t};function z(){let e=C(f);return S(f),e&&X(e.at,be)?e:null}var T=e=>e.pathname+e.search,Se=(e,t)=>A(f,{...e,to:T(t)}),Te=()=>S(f);function V(){let e=C(G);return e&&X(e.at,Ae)?e:null}var xe=e=>A(G,e);function ke(){let e=`${f}:probe`,t=A(e,0);return S(e),t}function Le(){let e=history.state;return e&&typeof e=="object"?e:null}function F(){let e=Le()?.[f];return e&&typeof e=="object"?e:null}function Me(e){let t=history.state;if(t!==null&&(typeof t!="object"||Object.getPrototypeOf(t)!==Object.prototype))return;let{[f]:n,...r}=t??{};if(!(!e&&!n))try{history.replaceState(e?{...r,[f]:e}:r,"")}catch{}}function H(e,t){return!e?.returnAs||!t||t.none||t.from!==e.to?null:{move:e.returnAs,via:"history",from:t.from,data:null,remembered:e.remember??null,reported:t.data??null}}var Q={m:D,h:Se,n:Te,o:V,p:xe,q:ke,r:F,i:Me,s:H};var u=document.documentElement,Re="--turn-",x=new Map;function Z(e){if(!e||u.dataset.turnArriving===e){delete u.dataset.turnArriving,delete u.dataset.turnEntering,delete u.dataset.turnWith;for(let[t,{covered:n,own:r}]of x)u.style.getPropertyValue(t)===r&&(n?u.style.setProperty(t,n):u.style.removeProperty(t));x.clear()}}function _(e){if(typeof e=="object")for(let[t,n]of Object.entries(e??{}))if(/^(string|number)$/.test(typeof n)){let r=Re+t,i=`${n}`;x.set(r,{covered:x.get(r)?.covered??u.style.getPropertyValue(r),own:i}),u.style.setProperty(r,i)}else n===!0&&(u.dataset.turnWith=`${u.dataset.turnWith??""} ${t}`.trim())}function te(e){_(e.remembered),_(e.reported),_(e.data)}function ee(e){u.dataset.turnArriving=e.move,te(e)}function Oe(){let e={arrival:null,endArrival:Z,t:ee};if(window.pageturn=e,window.top!==window)return;e.j=Q,e.a=!0;let t=z();if(b())return;let n=P(),r=t&&n?.type!=="reload"&&n?.type!=="back_forward"&&(!t.to||t.to===T(location)||(n?.redirectCount??0)>0)?t:null;e.arrival=r?{move:r.move,via:"link",from:r.from,data:r.data??null,remembered:null,reported:null}:n?.type==="back_forward"?H(F(),V()):null;let i=!!(r?.a&&"CSSViewTransitionRule"in window),{arrival:a}=e;if(a&&(i?te(a):ee(a)),n?.type!=="back_forward"){u.dataset.turnEntering="";let s=["wheel","touchstart","keydown","pointerdown"],c=!0,l=()=>{c&&(scrollX||scrollY)&&(Y(),E())},v=new ResizeObserver(l),E=()=>{c=!1,v.disconnect(),removeEventListener("scroll",l);for(let O of s)removeEventListener(O,E,!0)},$=()=>{c&&(v.observe(u),requestAnimationFrame($))};$(),addEventListener("scroll",l);for(let O of s)addEventListener(O,E,!0);addEventListener("load",()=>requestAnimationFrame(()=>requestAnimationFrame(E)))}addEventListener("pagehide",s=>{s.persisted&&(e.k=null,i=!1)}),addEventListener("pagereveal",s=>{let c=s.viewTransition;e.k=c;let{arrival:l}=e;l&&(i?c?c.types.add(l.move):u.dataset.turnArriving=l.move:c?.skipTransition(),i=!1)}),addEventListener("pagehide",s=>{s.persisted&&(e.arrival=null,Z())})}window.pageturn||Oe();var ne=Symbol.for("pageturn.registry"),re=globalThis;re[ne]??={b:new Map,d:[],e:null,settings:{defaultMove:"page",prefetch:!0,leaveTimeout:4e3,stuckTimeout:4e3,arrivalEnds:"animations"},g:!1,f:Object.freeze({})};var o=re[ne],oe=e=>e===o.f;var ie=new Set;o.u??=e=>{let t=e.href.split("#")[0]??e.href;if(ie.has(t))return;let n=navigator.connection;if(n?.saveData||/2g/.test(n?.effectiveType??""))return;ie.add(t);let r=document.createElement("link");r.relList.supports("prefetch")?(r.rel="prefetch",r.href=t,document.head.append(r)):fetch(t,{priority:"low"}).catch(()=>{})};var y;!o.a&&g&&(addEventListener("pageswap",e=>{let t=e.viewTransition;y===null?t?.skipTransition():y&&t?.types.add(y),y=void 0}),o.a={v(e,t){let n=window.pageturn?.j;return n&&window.pageturn?.a&&"CSSViewTransitionRule"in window&&getComputedStyle(document.documentElement).getPropertyValue("--pageturn-native").trim()!==""?(n.h({move:e,data:null,from:location.pathname,at:Date.now(),a:!0},t),n.i(null),y=e,!0):!1},c:e=>{y=e}});function k(e,t){let n=getComputedStyle(document.documentElement).getPropertyValue(e),r=Number.parseFloat(n)*(/ms\s*$/.test(n)?1:1e3);return r>=0?Math.min(r,t):t}var L=e=>e.effect?.getTiming().iterations!==1/0,M=(e,t)=>Promise.race([Promise.allSettled(e.map(n=>n.finished)),new Promise(n=>setTimeout(n,t))]);var p=()=>document.documentElement,m=null,h=null,Pe=1e4,N=()=>"turnArriving"in p().dataset||"turnEntering"in p().dataset,I=()=>new Promise(e=>requestAnimationFrame(e));function J(e){N()&&(h=e,window.pageturn?.endArrival())}function B(){if(U(),!N())return;let e=p().dataset.turnArriving??null,t="turnEntering"in p().dataset,n=!1;h=null;let r=new MutationObserver(()=>{if(e=p().dataset.turnArriving??e,t&&!("turnEntering"in p().dataset)&&window.pageturn?.l?t=!1:h===null&&(n=!0),N()||(r.disconnect(),m===r&&(m=null),!t&&e===null))return;let i=o.settings.arrivalEnds==="manually",a=h!=="leave"&&(i||h==="settled"&&!n);document.dispatchEvent(new CustomEvent("pageturn:arrived",{detail:{move:e,entering:t,whole:a}}))});m=r,r.observe(p(),{attributeFilter:["data-turn-arriving","data-turn-entering"]}),W(async()=>{await I(),await I(),m===r&&o.settings.arrivalEnds!=="manually"&&Ce(r)})}async function Ce(e){let t=performance.now()+k("--turn-arrive-max",Pe);for(let n=!0;;n=!1){let r=document.getAnimations().filter(s=>s.playState==="running"&&!(typeof CSSTransition<"u"&&s instanceof CSSTransition)&&L(s)),i=window.pageturn?.arrival,a=t-performance.now();if(r.length===0||a<=0)break;if(await M(r,a),await I(),m!==e)return}m===e&&J("settled")}function R(e){try{o.b.get(e.move)?.arrive?.(e)}catch(t){reportError(t)}}function U(){m?.disconnect(),m=null}function ae(e,t){let n=document.documentElement,r=new Set(document.getAnimations());n.dataset.turnLeaving=e;let i=document.getAnimations().filter(a=>!r.has(a)&&L(a));return i.length===0?Promise.resolve():M(i,k("--turn-leave-max",t)).then(()=>{})}function se(e){let t=e.link.closest("[data-turn]")?.getAttribute("data-turn");if(t)return t==="none"?null:t;try{for(let n of o.d){let r=n(e);if(r!==void 0)return r}for(let[n,r]of o.b)if(r.match?.(e))return n}catch(n){reportError(n)}return o.settings.defaultMove}function K(e,t){let n;return{...e,move:t,leaving:()=>(n||J("leave"),n??=ae(t,o.settings.leaveTimeout),n),decline:()=>o.f}}function ue(e,t){let n=new Promise(r=>setTimeout(r,o.settings.leaveTimeout,null));return Promise.race([le(e,t).catch(()=>null),n])}async function le(e,t){t(e);let n=await o.b.get(e.move)?.leave?.(e);if(oe(n)){let r=o.settings.defaultMove;if(r===null)return null;if(r!==e.move)return le(K(e,r),t)}else if(n)return n;return await e.leaving(),{}}var d,w=null,j;function de(){if(!g)return;let e=window.pageturn?.j;o.g||e?.m!==D||(d=e,o.g=!0,addEventListener("click",De,!0),addEventListener("pointerdown",Ve,!0),addEventListener("pagehide",He,!0),addEventListener("pageshow",_e),B())}function De(){removeEventListener("click",ce),addEventListener("click",ce)}function fe(e){for(let t of e.composedPath()){if(t instanceof HTMLAnchorElement)return t.hasAttribute("href")?t:null;if(t instanceof SVGAElement)return null}return null}function me(e){let[t]=e.composedPath();return t instanceof HTMLElement&&t.isContentEditable}function pe(e){let t=e.target||document.querySelector("base[target]")?.getAttribute("target");if(t&&t!=="_self"||e.hasAttribute("download"))return null;let n=new URL(e.href),r=n.pathname===location.pathname&&n.search===location.search;return n.origin===location.origin&&!r?n:null}function ve(e){o.settings.prefetch&&o.u?.(e)}function Ve(e){if(e.button!==0||me(e))return;let t=fe(e),n=t&&pe(t);n&&ve(n)}function ce(e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||me(e))return;let t=fe(e),n=t&&pe(t);if(!t||!n)return;if(w){e.preventDefault();return}if(d.n(),e.detail===0&&ve(n),b())return;let{a:r}=o,i={link:t,via:"link",from:new URL(location.href),to:n,canHandOver:d.q()},a=se(i);if(a===null){r?.c(null);return}let s=K(i,a);if(!document.dispatchEvent(new CustomEvent("pageturn:leaving",{cancelable:!0,detail:s}))){r?.c(null);return}if(a===o.settings.defaultMove&&!o.b.get(a)?.leave&&r?.v(a,n))return;e.preventDefault();let l={turn:s};w=l,ue(s,v=>{l.turn=v}).then(v=>Fe(l,v))}function Fe(e,t){if(w!==e||e.handover!==void 0)return;let{turn:n}=e;e.handover=t,t&&t.arriveAs!==null&&d.h({move:t.arriveAs??n.move,data:t.data??null,from:location.pathname,at:Date.now()},n.to),e.entry=t?.returnAs?{move:n.move,to:n.to.pathname,returnAs:t.returnAs,remember:t.remember??null}:null,d.i(e.entry),o.a?.c(null),location.assign(n.to.href),j=setTimeout(()=>ge(e,"stuck"),o.settings.stuckTimeout)}function ge(e,t){if(w!==e)return;w=null,clearTimeout(j),o.a?.c(void 0),delete document.documentElement.dataset.turnLeaving;let n={reason:t,handover:e.handover??null};try{o.b.get(e.turn.move)?.stay?.(e.turn,n)}catch(r){reportError(r)}document.dispatchEvent(new CustomEvent("pageturn:stayed",{detail:{turn:e.turn,stay:n}}))}function He(){clearTimeout(j),U();let{e}=o;if(!e&&!window.pageturn?.arrival)return;let t=null;try{t=e?.({decline:()=>o.f})??null}catch(r){reportError(r)}let n=t===o.f;d.p({from:location.pathname,at:Date.now(),data:n?null:t,...n?{none:!0}:{}})}function _e(e){if(!e.persisted)return;o.a?.c(void 0);let t=w,n=window.pageturn;if(!n)return;let r=t?t.entry??null:d.r(),i=d.s(r,d.o());n.arrival=i,i&&(n.t?.(i),n.k?.skipTransition(),B()),t&&ge(t,"returned"),i&&R(i)}function ye(e,t){let n=t;o.b.set(e,n);let r=g?window.pageturn?.arrival:null;return r?.move===e&&n.arrive&&queueMicrotask(()=>{o.b.get(e)===n&&R(r)}),()=>{o.b.get(e)===n&&o.b.delete(e)}}function we(e){let t=e;return o.d.push(t),()=>{let n=o.d.indexOf(t);n>=0&&o.d.splice(n,1)}}function he(e){let t=e;return o.e=t,()=>{o.e===t&&(o.e=null)}}function Ee(e){for(let[t,n]of Object.entries(e))n!==void 0&&Object.assign(o.settings,{[t]:n})}de();Object.assign(window.pageturn??{},{defineMove:ye,chooseMove:we,whenLeft:he,configure:Ee});})();
package/dist/prefetch.js CHANGED
@@ -1,2 +1,2 @@
1
- import "./chunks/chunk-QC36TQP3.js";
2
- import "./chunks/chunk-QJ7GGFM4.js";
1
+ import "./chunks/chunk-FYSSNYA4.js";
2
+ import "./chunks/chunk-YAL4MNCU.js";
@@ -0,0 +1,46 @@
1
+ import "./chunks/chunk-6FXXBNAF.js";
2
+ import {
3
+ startNavigation
4
+ } from "./chunks/chunk-BOM5VXA5.js";
5
+ import "./chunks/chunk-JHM7F4CH.js";
6
+ import {
7
+ inBrowser
8
+ } from "./chunks/chunk-AEOAXMU3.js";
9
+ import "./chunks/chunk-YAL4MNCU.js";
10
+
11
+ // src/react-router/react-router.ts
12
+ import { useLayoutEffect } from "react";
13
+ import { useLocation } from "react-router";
14
+ var current = null, popped = !1, isMounted = !1;
15
+ inBrowser && addEventListener(
16
+ "popstate",
17
+ () => {
18
+ popped = !0;
19
+ },
20
+ !0
21
+ );
22
+ var pageturnMiddleware = async ({ request }, next) => {
23
+ let via = popped ? "history" : "link";
24
+ if (popped = !1, !isMounted) return next();
25
+ let turn = startNavigation({ to: request.url, via });
26
+ current = turn, request.signal.addEventListener("abort", () => {
27
+ setTimeout(() => {
28
+ current === turn && (current = null, turn.cancelled());
29
+ });
30
+ });
31
+ let [result] = await Promise.all([next(), turn.left]);
32
+ return result;
33
+ };
34
+ function usePageturn() {
35
+ let { key } = useLocation();
36
+ useLayoutEffect(() => {
37
+ isMounted = !0;
38
+ }, []), useLayoutEffect(() => {
39
+ let turn = current;
40
+ current = null, turn?.swapped();
41
+ }, [key]);
42
+ }
43
+ export {
44
+ pageturnMiddleware,
45
+ usePageturn
46
+ };
package/dist/router.js CHANGED
@@ -1,187 +1,9 @@
1
1
  import {
2
- addressOf,
3
- choose,
4
- followArrival,
5
- leave,
6
- readSession,
7
- reducesMotion,
8
- returnArrival,
9
- tellArrival,
10
- turnOf,
11
- writeSession
12
- } from "./chunks/chunk-YBAP3PHO.js";
13
- import {
14
- registry
15
- } from "./chunks/chunk-QJ7GGFM4.js";
16
-
17
- // src/router/router.ts
18
- var ENTRIES_KEY = "pageturn:router:entries";
19
- var KEPT_ENTRIES = 50;
20
- var CLICK_FRESH_MS = 1e3;
21
- var root = document.documentElement;
22
- var INERT = {
23
- left: Promise.resolve(),
24
- swapped() {
25
- },
26
- cancelled() {
27
- }
28
- };
29
- var current = null;
30
- var shown = location.href;
31
- var lastClick = null;
32
- addEventListener(
33
- "click",
34
- (event) => {
35
- const link = event.composedPath().find((target) => target instanceof HTMLAnchorElement);
36
- if (link) lastClick = { link, at: Date.now() };
37
- },
38
- true
39
- );
40
- function keyOf(url) {
41
- const api = window.navigation;
42
- const here = api?.currentEntry;
43
- for (const entry of here ? [here, api.entries()[here.index - 1]] : []) {
44
- if (entry?.url && addressOf(new URL(entry.url)) === addressOf(url)) {
45
- return entry.key;
46
- }
47
- }
48
- return addressOf(url);
49
- }
50
- var readEntries = () => readSession(ENTRIES_KEY) ?? {};
51
- function writeEntry(key, entry) {
52
- const { [key]: _, ...entries } = readEntries();
53
- const kept = Object.entries(entries).slice(1 - KEPT_ENTRIES);
54
- writeSession(ENTRIES_KEY, {
55
- ...Object.fromEntries(kept),
56
- ...entry ? { [key]: entry } : {}
57
- });
58
- }
59
- function reportOf(from) {
60
- const { e: report } = registry;
61
- if (!report && !window.pageturn?.arrival) return null;
62
- let data = null;
63
- try {
64
- data = report?.({ decline: () => registry.f }) ?? null;
65
- } catch (error) {
66
- reportError(error);
67
- }
68
- const isNone = data === registry.f;
69
- return {
70
- from: from.pathname,
71
- at: Date.now(),
72
- data: isNone ? null : data,
73
- ...isNone ? { none: true } : {}
74
- };
75
- }
76
- function clickedTo(to) {
77
- const click = lastClick;
78
- return click && Date.now() - click.at < CLICK_FRESH_MS && addressOf(new URL(click.link.href)) === addressOf(to) ? click.link : null;
79
- }
80
- function startNavigation(start) {
81
- const to = new URL(start.to, location.href);
82
- if (!window.pageturn || window.top !== window || reducesMotion()) {
83
- shown = to.href;
84
- return INERT;
85
- }
86
- if (current) end(current, "superseded");
87
- const from = new URL(shown);
88
- const playing = {
89
- via: start.via,
90
- to,
91
- from,
92
- leftKey: start.via === "history" ? "" : keyOf(from),
93
- e: reportOf(from)
94
- };
95
- current = playing;
96
- const drive = {
97
- left: Promise.resolve(),
98
- swapped: () => swapped(playing),
99
- cancelled: () => {
100
- if (current === playing) end(playing, "cancelled");
101
- }
102
- };
103
- if (start.via === "history") return drive;
104
- const visit = {
105
- link: start.link ?? clickedTo(to) ?? Object.assign(document.createElement("a"), { href: to.href }),
106
- via: start.via,
107
- from,
108
- to,
109
- canHandOver: true
110
- };
111
- const name = start.move !== void 0 ? start.move : start.via === "link" ? choose(visit) : registry.settings.defaultMove;
112
- if (name === null) return drive;
113
- const turn = turnOf(visit, name);
114
- const isWanted = document.dispatchEvent(
115
- new CustomEvent("pageturn:leaving", { cancelable: true, detail: turn })
116
- );
117
- if (!isWanted) return drive;
118
- playing.turn = turn;
119
- return {
120
- ...drive,
121
- left: leave(turn, (played) => {
122
- playing.turn = played;
123
- }).then((handover) => {
124
- if (current === playing) playing.handover = handover;
125
- })
126
- };
127
- }
128
- function swapped(playing) {
129
- if (current !== playing) return;
130
- current = null;
131
- shown = playing.to.href;
132
- const published = window.pageturn;
133
- if (!published) return;
134
- published.endArrival();
135
- delete root.dataset.turnLeaving;
136
- let arrival = null;
137
- if (playing.via === "history") {
138
- arrival = returnArrival(
139
- readEntries()[keyOf(playing.to)] ?? null,
140
- playing.e
141
- );
142
- } else {
143
- const { turn, handover } = playing;
144
- if (turn && handover && handover.arriveAs !== null) {
145
- arrival = {
146
- move: handover.arriveAs ?? turn.move,
147
- via: "link",
148
- from: playing.from.pathname,
149
- data: handover.data ?? null,
150
- remembered: null,
151
- reported: null
152
- };
153
- }
154
- writeEntry(
155
- playing.leftKey,
156
- turn && handover?.returnAs ? {
157
- move: turn.move,
158
- to: playing.to.pathname,
159
- returnAs: handover.returnAs,
160
- remember: handover.remember ?? null
161
- } : null
162
- );
163
- root.dataset.turnEntering = "";
164
- }
165
- published.arrival = arrival;
166
- if (arrival) published.t?.(arrival);
167
- followArrival();
168
- if (arrival) tellArrival(arrival);
169
- }
170
- function end(playing, reason) {
171
- current = null;
172
- delete root.dataset.turnLeaving;
173
- const { turn } = playing;
174
- if (!turn) return;
175
- const stay = { reason, handover: playing.handover ?? null };
176
- try {
177
- registry.b.get(turn.move)?.stay?.(turn, stay);
178
- } catch (error) {
179
- reportError(error);
180
- }
181
- document.dispatchEvent(
182
- new CustomEvent("pageturn:stayed", { detail: { turn, stay } })
183
- );
184
- }
2
+ startNavigation
3
+ } from "./chunks/chunk-BOM5VXA5.js";
4
+ import "./chunks/chunk-JHM7F4CH.js";
5
+ import "./chunks/chunk-AEOAXMU3.js";
6
+ import "./chunks/chunk-YAL4MNCU.js";
185
7
  export {
186
8
  startNavigation
187
9
  };
@@ -0,0 +1,22 @@
1
+ // src/sveltekit/server.ts
2
+ import {
3
+ coreHeadScript,
4
+ headScript,
5
+ morphHeadScript
6
+ } from "./head-string.js";
7
+ function pageturnHandle({
8
+ native = true,
9
+ morph = false
10
+ } = {}) {
11
+ const script = `<script>${native ? headScript : coreHeadScript}</script>${morph ? `<script>${morphHeadScript}</script>` : ""}`;
12
+ return ({ event, resolve }) => resolve(event, {
13
+ // The head is in the first chunk; the later ones have no <head> to match.
14
+ transformPageChunk: ({ html }) => html.replace(
15
+ /<head(\s[^>]*)?>(\s*<meta\s+charset[^>]*>)?/i,
16
+ (opening) => `${opening}${script}`
17
+ )
18
+ });
19
+ }
20
+ export {
21
+ pageturnHandle
22
+ };
@@ -0,0 +1,32 @@
1
+ import "./chunks/chunk-6FXXBNAF.js";
2
+ import {
3
+ startNavigation
4
+ } from "./chunks/chunk-BOM5VXA5.js";
5
+ import "./chunks/chunk-JHM7F4CH.js";
6
+ import "./chunks/chunk-AEOAXMU3.js";
7
+ import "./chunks/chunk-YAL4MNCU.js";
8
+
9
+ // src/sveltekit/sveltekit.ts
10
+ var started = null;
11
+ function begin(navigation) {
12
+ if (!navigation.to || navigation.willUnload) return null;
13
+ let turn = startNavigation({
14
+ to: navigation.to.url,
15
+ via: navigation.type === "link" ? "link" : navigation.type === "popstate" ? "history" : "script"
16
+ });
17
+ return navigation.complete.catch(() => {
18
+ started === turn && (started = null), turn.cancelled();
19
+ }), turn;
20
+ }
21
+ function pageturn({ beforeNavigate, onNavigate }) {
22
+ beforeNavigate((navigation) => {
23
+ started = begin(navigation);
24
+ }), onNavigate(async (navigation) => {
25
+ let turn = started ?? begin(navigation);
26
+ if (started = null, !!turn)
27
+ return await turn.left, () => turn.swapped();
28
+ });
29
+ }
30
+ export {
31
+ pageturn
32
+ };