lostpage 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 (73) hide show
  1. package/README.md +24 -2
  2. package/dist/catalog.js +1 -1
  3. package/dist/catalog.json +1021 -4
  4. package/dist/cdn/c/broken-link-U47D6LR2.js +11 -0
  5. package/dist/cdn/c/brutalist-QFXIHFAD.js +15 -0
  6. package/dist/cdn/c/card-GH5VVMRG.js +15 -0
  7. package/dist/cdn/c/chunk-A44JMJWI.js +1 -0
  8. package/dist/cdn/c/chunk-QHXVYCR6.js +1 -0
  9. package/dist/cdn/c/chunk-YNREKTFR.js +70 -0
  10. package/dist/cdn/c/countdown-2TEFVO73.js +14 -0
  11. package/dist/cdn/c/divider-PMT4UZEF.js +9 -0
  12. package/dist/cdn/c/dot-grid-O7LJO44U.js +11 -0
  13. package/dist/cdn/c/editorial-4C5Z33WO.js +11 -0
  14. package/dist/cdn/c/emoji-EHAJDQSM.js +8 -0
  15. package/dist/cdn/c/gradient-404-YNSTOPNA.js +6 -0
  16. package/dist/cdn/c/helpful-links-UFGTWTRQ.js +18 -0
  17. package/dist/cdn/c/minimal-SB6FU3DE.js +9 -0
  18. package/dist/cdn/c/outline-404-REB5E5EN.js +9 -0
  19. package/dist/cdn/c/path-not-found-VUEXOVO7.js +14 -0
  20. package/dist/cdn/c/search-404-HFKZ4DUA.js +17 -0
  21. package/dist/cdn/c/server-default-RBMMRAHS.js +10 -0
  22. package/dist/cdn/c/soft-blobs-FYEFGINV.js +15 -0
  23. package/dist/cdn/c/split-panel-QGXZ24E4.js +12 -0
  24. package/dist/cdn/element.js +1 -1
  25. package/dist/cdn/index.js +1 -1
  26. package/dist/chunks/chunk-B2NBRLO2.js +1 -0
  27. package/dist/chunks/chunk-ES56TX4X.js +1 -0
  28. package/dist/chunks/chunk-URB3NNOB.js +70 -0
  29. package/dist/cli.js +1 -1
  30. package/dist/core/types.d.ts +1 -1
  31. package/dist/core.js +1 -1
  32. package/dist/generated/registry.d.ts +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/lostpage.global.js +401 -214
  35. package/dist/scenes/_simple.d.ts +10 -0
  36. package/dist/scenes/broken-link.d.ts +8 -0
  37. package/dist/scenes/broken-link.js +11 -0
  38. package/dist/scenes/brutalist.d.ts +7 -0
  39. package/dist/scenes/brutalist.js +15 -0
  40. package/dist/scenes/card.d.ts +8 -0
  41. package/dist/scenes/card.js +15 -0
  42. package/dist/scenes/countdown.d.ts +9 -0
  43. package/dist/scenes/countdown.js +14 -0
  44. package/dist/scenes/divider.d.ts +6 -0
  45. package/dist/scenes/divider.js +9 -0
  46. package/dist/scenes/dot-grid.d.ts +9 -0
  47. package/dist/scenes/dot-grid.js +11 -0
  48. package/dist/scenes/editorial.d.ts +6 -0
  49. package/dist/scenes/editorial.js +11 -0
  50. package/dist/scenes/emoji.d.ts +7 -0
  51. package/dist/scenes/emoji.js +8 -0
  52. package/dist/scenes/gradient-404.d.ts +9 -0
  53. package/dist/scenes/gradient-404.js +6 -0
  54. package/dist/scenes/helpful-links.d.ts +6 -0
  55. package/dist/scenes/helpful-links.js +18 -0
  56. package/dist/scenes/minimal.d.ts +6 -0
  57. package/dist/scenes/minimal.js +9 -0
  58. package/dist/scenes/outline-404.d.ts +8 -0
  59. package/dist/scenes/outline-404.js +9 -0
  60. package/dist/scenes/path-not-found.d.ts +6 -0
  61. package/dist/scenes/path-not-found.js +14 -0
  62. package/dist/scenes/search-404.d.ts +9 -0
  63. package/dist/scenes/search-404.js +17 -0
  64. package/dist/scenes/server-default.d.ts +6 -0
  65. package/dist/scenes/server-default.js +10 -0
  66. package/dist/scenes/soft-blobs.d.ts +9 -0
  67. package/dist/scenes/soft-blobs.js +15 -0
  68. package/dist/scenes/split-panel.d.ts +8 -0
  69. package/dist/scenes/split-panel.js +12 -0
  70. package/dist/vue.js +1 -1
  71. package/package.json +2 -2
  72. package/dist/cdn/c/chunk-JPP52QCZ.js +0 -70
  73. package/dist/chunks/chunk-UVHXBPO4.js +0 -70
@@ -1,70 +0,0 @@
1
- import{a as F,b as _,c as Q,g as V}from"./chunk-HXSSPN2I.js";import{e as A}from"./chunk-URWX3LLV.js";var Z={back:'<svg data-dir="back" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13 8H3M7 4 3 8l4 4"/></svg>',arrow:'<svg data-dir="arrow" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 11 11 5M6 5h5v5"/></svg>',home:'<svg data-dir="home" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.5 7.5 8 3l5.5 4.5M4 6.5V13h8V6.5"/></svg>'};function u(o,n,i){let r=document.createElement(o);return r.className=n,i!==void 0&&(r.textContent=i),r}function pe(o,n){let i=o.variant??"primary",r=o.href!==void 0?u("a",`lp-btn lp-btn--${i}`):u("button",`lp-btn lp-btn--${i}`);r instanceof HTMLAnchorElement?r.href=o.href:r.type="button";let a=o.icon??(i==="primary"?"back":"arrow"),d=u("span","lp-btn-label",o.label);if(a!=="none"&&Z[a]){let l=document.createElement("span");l.innerHTML=Z[a];let c=l.firstChild;a==="arrow"?r.append(d,c):r.append(c,d)}else r.append(d);return r.addEventListener("click",l=>{let c=l;o.onClick?.(c),!c.defaultPrevented&&o.href!==void 0&&n&&!(c.metaKey||c.ctrlKey||c.shiftKey||c.button===1)&&(c.preventDefault(),n(o.href,c))}),r}function W(o,n,i){let r=u("div",`lp-overlay lp-layout-${n} lp-fadein`),a=u("div","lp-head");if(o.eyebrow&&a.append(u("p","lp-eyebrow",o.eyebrow)),o.code){let l=u("div","lp-code",o.code);l.setAttribute("aria-hidden","true"),a.append(l)}let d=u("div","lp-body");if(o.title){let l=u("h1","lp-title");o.code&&l.append(u("span","lp-sr",`Error ${o.code}: `)),l.append(o.title),d.append(l)}if(o.message&&d.append(u("p","lp-message",o.message)),o.actions?.length){let l=u("div","lp-actions");for(let c of o.actions)l.append(pe(c,i));d.append(l)}return r.append(a,d),r}var ce=`
2
- .lp-root{
3
- --lp-bg:#0b0d12;--lp-fg:#f5f6f8;--lp-muted:color-mix(in srgb,var(--lp-fg) 64%,transparent);
4
- --lp-accent:var(--lp-fg);--lp-accent-fg:var(--lp-bg);
5
- --lp-font:"Inter","Manrope",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
6
- --lp-font-display:var(--lp-font);
7
- --lp-font-mono:"JetBrains Mono","IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
8
- --lp-font-serif:"Fraunces","Playfair Display",ui-serif,Georgia,"Times New Roman",serif;
9
- --lp-code-color:color-mix(in srgb,var(--lp-fg) 22%,transparent);
10
- --lp-code-size:clamp(64px,23cqw,300px);--lp-code-weight:500;
11
- --lp-title-size:clamp(22px,4.6cqw,58px);--lp-title-weight:500;
12
- --lp-radius:999px;--lp-pad:clamp(14px,5cqw,72px);
13
- position:relative;box-sizing:border-box;overflow:hidden;width:100%;
14
- height:var(--lp-height,100vh);height:var(--lp-height,100dvh);
15
- background:var(--lp-bg);color:var(--lp-fg);font-family:var(--lp-font);
16
- isolation:isolate;container-type:size;container-name:lp;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
17
- text-rendering:optimizeLegibility;touch-action:manipulation;
18
- }
19
- .lp-root *,.lp-root *::before,.lp-root *::after{box-sizing:border-box}
20
- .lp-root [hidden]{display:none!important}
21
- .lp-stage{position:absolute;inset:0;z-index:0;overflow:hidden}
22
- .lp-stage>canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
23
- .lp-custom{position:absolute;inset:0;z-index:3}
24
- .lp-overlay{position:absolute;inset:0;z-index:2;display:flex;flex-direction:column;align-items:center;
25
- justify-content:center;gap:clamp(12px,3cqh,32px);padding:var(--lp-pad) max(16px,var(--lp-pad));pointer-events:none}
26
- .lp-overlay a,.lp-overlay button,.lp-overlay [data-lp-interactive]{pointer-events:auto}
27
- .lp-head,.lp-body{display:flex;flex-direction:column;align-items:center;text-align:center;max-width:100%}
28
- .lp-eyebrow{margin:0 0 6px;font-size:11px;font-weight:600;letter-spacing:.32em;text-transform:uppercase;color:var(--lp-muted)}
29
- .lp-code{margin:0;font-family:var(--lp-font-display);font-weight:var(--lp-code-weight);font-size:var(--lp-code-size);
30
- line-height:.86;letter-spacing:-.045em;color:var(--lp-code-color);user-select:none;white-space:nowrap}
31
- .lp-title{margin:0;font-family:var(--lp-font-display);font-size:var(--lp-title-size);font-weight:var(--lp-title-weight);
32
- letter-spacing:-.035em;line-height:1.04;text-wrap:balance}
33
- .lp-message{margin:14px 0 0;max-width:36ch;color:var(--lp-muted);font-size:clamp(12.5px,1.25cqw,16px);line-height:1.6;text-wrap:pretty}
34
- .lp-actions{margin-top:clamp(20px,3.2cqh,32px);display:flex;gap:10px 22px;flex-wrap:wrap;align-items:center;justify-content:center}
35
- .lp-btn{display:inline-flex;align-items:center;gap:10px;font:inherit;font-size:13px;font-weight:500;letter-spacing:.01em;
36
- text-decoration:none;cursor:pointer;border:0;transition:transform .25s cubic-bezier(.2,.8,.2,1),background .25s,color .25s,box-shadow .25s}
37
- .lp-btn--primary{padding:13px 22px;border-radius:var(--lp-radius);background:var(--lp-accent);color:var(--lp-accent-fg)}
38
- .lp-btn--primary:hover{transform:translateY(-1px);box-shadow:0 10px 30px -10px color-mix(in srgb,var(--lp-accent) 60%,transparent)}
39
- .lp-btn--secondary{padding:13px 4px;background:none;color:var(--lp-fg);border-bottom:1px solid color-mix(in srgb,var(--lp-fg) 30%,transparent);border-radius:0}
40
- .lp-btn--secondary:hover{border-bottom-color:var(--lp-fg)}
41
- .lp-btn svg{width:14px;height:14px;flex:none;transition:transform .25s cubic-bezier(.2,.8,.2,1)}
42
- .lp-btn:hover svg[data-dir=back]{transform:translateX(-3px)}
43
- .lp-btn:hover svg[data-dir=arrow]{transform:translate(2px,-2px)}
44
- .lp-btn:focus-visible{outline:2px solid var(--lp-accent);outline-offset:3px}
45
- .lp-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
46
-
47
- .lp-layout-split{justify-content:space-between}
48
- .lp-layout-split .lp-head{padding-top:clamp(8px,4cqh,48px)}
49
- .lp-layout-split .lp-body{padding-bottom:clamp(8px,3cqh,40px)}
50
- .lp-layout-bottom{justify-content:flex-end}
51
- .lp-layout-top{justify-content:flex-start}
52
- .lp-layout-bottom-left{justify-content:flex-end;align-items:flex-start}
53
- .lp-layout-bottom-left .lp-head,.lp-layout-bottom-left .lp-body,
54
- .lp-layout-left .lp-head,.lp-layout-left .lp-body{align-items:flex-start;text-align:left}
55
- .lp-layout-bottom-left .lp-actions,.lp-layout-left .lp-actions{justify-content:flex-start}
56
- .lp-layout-left{align-items:flex-start;padding-left:max(16px,calc(var(--lp-pad) * 1.4))}
57
- .lp-layout-right{align-items:flex-end}
58
- .lp-layout-right .lp-head,.lp-layout-right .lp-body{align-items:flex-end;text-align:right}
59
- .lp-layout-right .lp-actions{justify-content:flex-end}
60
- .lp-layout-none .lp-head,.lp-layout-none .lp-body{display:none}
61
- .lp-code-hidden .lp-code{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
62
-
63
- .lp-fadein .lp-head,.lp-fadein .lp-body{animation:lp-rise 1.1s cubic-bezier(.2,.8,.2,1) both}
64
- .lp-fadein .lp-body{animation-delay:.18s}
65
- @keyframes lp-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
66
- @container (max-width:640px){.lp-layout-left,.lp-layout-right{align-items:center}
67
- .lp-layout-left .lp-head,.lp-layout-left .lp-body,.lp-layout-right .lp-head,.lp-layout-right .lp-body{align-items:center;text-align:center}
68
- .lp-layout-left .lp-actions,.lp-layout-right .lp-actions{justify-content:center}}
69
- @media (prefers-reduced-motion:reduce){.lp-fadein .lp-head,.lp-fadein .lp-body{animation:none}.lp-btn,.lp-btn svg{transition:none}}
70
- `,Y=new Set;function ee(o,n){if(typeof document>"u"||Y.has(o))return;if(document.querySelector(`style[data-lostpage="${o}"]`)){Y.add(o);return}let i=document.createElement("style");i.setAttribute("data-lostpage",o),i.textContent=n,document.head.appendChild(i),Y.add(o)}function te(){ee("base",ce)}function oe(o,n){n&&ee(`scene:${o}`,n.replace(/&/g,`.lp-s-${o}`))}function ne(o,n,i={}){let r=null,a=!1,d=!1,l=i,c=typeof n=="object"?n:null,C=typeof o=="string"?V()?document.querySelector(o):null:o,z=()=>{a||!c||!C||(r?.destroy(),r=de(C,c,l),d&&r.pause())},P=(async()=>{if(!(!V()||!C)){if(!c){if(typeof n=="string")throw new Error(`[lostpage] "lostpage/core" can't load "${n}" by id. Import mount from "lostpage", or pass the scene object from "lostpage/scenes/${n}".`);c=await n()}z()}})();return P.catch(g=>console.error(g)),{get root(){return r?.root??null},ready:P,update(g){let j=l;if(l={...l,...g},!r)return;["preset","params","motion","interactive","seed","maxDpr","overlay"].some(p=>p in g&&JSON.stringify(g[p])!==JSON.stringify(j[p]))?z():r.refreshCopy(l)},pause(){d=!0,r?.pause()},resume(){d=!1,r?.resume()},destroy(){a=!0,r?.destroy(),r=null}}}function de(o,n,i){te(),oe(n.id,n.css);let r=A(n,i),a=document.createElement("div");a.className=`lp-root lp-s-${n.id} lp-p-${r.preset}${n.codeInScene?" lp-code-hidden":""}${i.className?" "+i.className:""}`,a.setAttribute("data-lostpage",n.id),i.height&&a.style.setProperty("--lp-height",i.height);let d=e=>{for(let[t,s]of Object.entries(e))a.style.setProperty(t.startsWith("--")?t:`--lp-${t}`,s)};d(r.theme);let l=document.createElement("div");l.className="lp-stage",l.setAttribute("aria-hidden","true"),a.append(l);let c=null;i.overlay!==!1&&(c=W(r.copy,n.layout,i.onNavigate),a.append(c)),o.append(a);let z=window.matchMedia?.("(prefers-reduced-motion: reduce)"),P=i.motion==="reduce"||i.motion!=="full"&&!!z?.matches,g=i.interactive!==!1,j=i.maxDpr??2,h=n.motion==="static"||P&&n.motion!=="game",p={x:0,y:0,nx:0,ny:0,sx:0,sy:0,down:!1,inside:!1,engaged:!1},M=[],T=[],v=0,b=0,x=1,y=1,O=!0,I=!document.hidden,$=!1,m=0,k=0,H=0,B=!0,S={},L=!1,f={root:a,stage:l,overlay:c,params:r.params,copy:r.copy,preset:r.preset,get width(){return v},get height(){return b},get dpr(){return x*y},pointer:p,reducedMotion:P,interactive:g,random:Q(i.seed??1337),canvas(e={}){let t=document.createElement("canvas");t.style.zIndex=String(e.z??0),l.append(t);let s={el:t,scale:e.scale??1,adaptive:!!e.adaptive};return M.push(s),N(s),t},on(e,t,s){a.addEventListener(e,t,s),T.push(()=>a.removeEventListener(e,t,s))},onWindow(e,t,s){window.addEventListener(e,t,s),T.push(()=>window.removeEventListener(e,t,s))},invalidate(){B=!0,!m&&!L&&E()},visible:()=>O&&I,navigate(e,t){i.onNavigate?i.onNavigate(e,t??new MouseEvent("click")):location.assign(e)},cssVar:e=>getComputedStyle(a).getPropertyValue(e.startsWith("--")?e:`--lp-${e}`).trim()};function N(e){let t=x*e.scale*(e.adaptive?y:1),s=Math.max(1,Math.round(v*t)),w=Math.max(1,Math.round(b*t));(e.el.width!==s||e.el.height!==w)&&(e.el.width=s,e.el.height=w)}function ae(){let e=a.getBoundingClientRect();v=Math.max(1,Math.round(e.width)),b=Math.max(1,Math.round(e.height)),x=Math.min(window.devicePixelRatio||1,j);for(let t of M)N(t);try{S.resize?.(v,b,x)}catch(t){q(t)}f.invalidate()}if(g){let e=t=>{let s=a.getBoundingClientRect();p.x=t.clientX-s.left,p.y=t.clientY-s.top,p.nx=F(p.x/s.width*2-1,-1,1),p.ny=F(1-p.y/s.height*2,-1,1),p.engaged=!0};f.on("pointermove",t=>{e(t),p.inside=!0,h&&f.invalidate()}),f.on("pointerdown",t=>{e(t),p.down=!0,h&&f.invalidate()}),f.onWindow("pointerup",()=>{p.down=!1}),f.on("pointerleave",()=>{p.inside=!1})}function se(e){if(m=0,L)return;let t=k?Math.min((e-k)/1e3,1/20):1/60;k=e,p.sx=_(p.sx,p.nx,3,t),p.sy=_(p.sy,p.ny,3,t),h?(H=n.stillTime??4,p.sx=p.nx,p.sy=p.ny):H+=t;try{S.frame?.(H,h?0:t)}catch(s){q(s);return}h||le(t),B=!1,h||E()}function E(){m||L||$||!(O&&I)||h&&!B||(m=requestAnimationFrame(se))}let D=0,R=0,K=1.5;function le(e){if(!M.some(w=>w.adaptive))return;if(K>0){K-=e;return}if(D+=e,R++,D<1)return;let t=D/R;D=0,R=0;let s=y;if(t>1/45?s=Math.max(.5,y*.85):t<1/58&&y<1&&(s=Math.min(1,y*1.08)),Math.abs(s-y)>.01){y=s;for(let w of M)w.adaptive&&N(w);S.resize?.(v,b,x)}}function q(e){L=!0,m&&cancelAnimationFrame(m),m=0,a.classList.add("lp-fallback");for(let t of M)t.el.style.display="none";console.warn(`[lostpage] scene "${n.id}" could not render, showing text only.`,e)}let U=new IntersectionObserver(e=>{O=e[e.length-1].isIntersecting,O&&(k=0,E())});U.observe(a);let G=()=>{I=!document.hidden,I&&(k=0,E())};document.addEventListener("visibilitychange",G);let J=new ResizeObserver(()=>ae());J.observe(a);let X=a.getBoundingClientRect();v=Math.max(1,Math.round(X.width)),b=Math.max(1,Math.round(X.height)),x=Math.min(window.devicePixelRatio||1,j);try{S=n.setup(f)||{},S.resize?.(v,b,x)}catch(e){q(e)}return E(),{root:a,pause(){$=!0,m&&cancelAnimationFrame(m),m=0},resume(){$=!1,k=0,E()},refreshCopy(e){let t=A(n,e);if(d(t.theme),c){let s=W(t.copy,n.layout,e.onNavigate);s.classList.remove("lp-fadein"),c.replaceWith(s),c=s,f.overlay=s}Object.assign(f.copy,t.copy)},destroy(){m&&cancelAnimationFrame(m),m=0,L=!0,U.disconnect(),J.disconnect(),document.removeEventListener("visibilitychange",G);for(let e of T)e();try{S.destroy?.()}catch{}for(let e of M)e.el.__lpgl?.getExtension("WEBGL_lose_context")?.loseContext();a.remove()}}}var re={"ascii-3d":()=>import("./ascii-3d-LO5K5SPJ.js"),astronaut:()=>import("./astronaut-LH5N45GT.js"),aurora:()=>import("./aurora-XF7DCQ7M.js"),autumn:()=>import("./autumn-V5GRVYCX.js"),"balloon-404":()=>import("./balloon-404-KV6ISJWV.js"),beach:()=>import("./beach-OGS53KAQ.js"),"black-hole":()=>import("./black-hole-635WWF67.js"),"block-drop":()=>import("./block-drop-QU7NYBNQ.js"),"blue-screen":()=>import("./blue-screen-GKLGT7XD.js"),breakout:()=>import("./breakout-EGDE3QDC.js"),bricks:()=>import("./bricks-C6XPPQ64.js"),"bubble-wrap":()=>import("./bubble-wrap-45ZWIQMW.js"),campfire:()=>import("./campfire-TFG4DUUS.js"),cassette:()=>import("./cassette-33OUQ4CF.js"),chalkboard:()=>import("./chalkboard-NAPUHNER.js"),"chrome-404":()=>import("./chrome-404-QVPFIQEF.js"),"circuit-board":()=>import("./circuit-board-V6VT4OTX.js"),"claw-machine":()=>import("./claw-machine-LLCPLZ6W.js"),"clay-404":()=>import("./clay-404-SMDVAQCV.js"),constellation:()=>import("./constellation-J5QMY7IB.js"),"cross-stitch":()=>import("./cross-stitch-N5H5GLAG.js"),"deep-sea":()=>import("./deep-sea-ILDVMW5M.js"),dna:()=>import("./dna-CAAKBMRK.js"),dominoes:()=>import("./dominoes-VLA5MBXM.js"),elevator:()=>import("./elevator-EFNB6FVO.js"),"error-cascade":()=>import("./error-cascade-CIJCQLP3.js"),"evidence-board":()=>import("./evidence-board-Z7DXMGNE.js"),eyes:()=>import("./eyes-VPOHW2CX.js"),fireworks:()=>import("./fireworks-QLWJ3S43.js"),flashlight:()=>import("./flashlight-QXI7QT74.js"),flatline:()=>import("./flatline-3GBK7IVS.js"),flock:()=>import("./flock-RLSZ7EZQ.js"),"foggy-glass":()=>import("./foggy-glass-A56REA7E.js"),gears:()=>import("./gears-4HJO7H74.js"),"glass-404":()=>import("./glass-404-WZRMDFTP.js"),glitch:()=>import("./glitch-Y4CIADF3.js"),halftone:()=>import("./halftone-XZ7F75B4.js"),"hanging-letters":()=>import("./hanging-letters-Y3VH7EVP.js"),"hanging-sign":()=>import("./hanging-sign-2KUXPLZE.js"),hyperspace:()=>import("./hyperspace-R34QNI7J.js"),hypnosis:()=>import("./hypnosis-MK6AV3SC.js"),ink:()=>import("./ink-S332BOPS.js"),invaders:()=>import("./invaders-ZSY3Z443.js"),kaleidoscope:()=>import("./kaleidoscope-BLGSIK4F.js"),"lava-lamp":()=>import("./lava-lamp-VYY5XFG5.js"),life:()=>import("./life-QBWZL5FY.js"),lighthouse:()=>import("./lighthouse-QX7QIIPX.js"),loading:()=>import("./loading-LIS67QF7.js"),"lost-at-sea":()=>import("./lost-at-sea-QNURIHBY.js"),"magic-8-ball":()=>import("./magic-8-ball-W3TRJALZ.js"),"matrix-rain":()=>import("./matrix-rain-4V4SVGGG.js"),maze:()=>import("./maze-QL5TRCE5.js"),"mesh-gradient":()=>import("./mesh-gradient-UISGI62K.js"),"metro-map":()=>import("./metro-map-H64EHOZM.js"),"milk-carton":()=>import("./milk-carton-3SDLA5AY.js"),mirage:()=>import("./mirage-IQ3IA3VB.js"),"moon-landing":()=>import("./moon-landing-TKZE4Q6G.js"),"neon-sign":()=>import("./neon-sign-XGMN75MH.js"),newspaper:()=>import("./newspaper-YECAUY77.js"),nixie:()=>import("./nixie-CQBRCVDE.js"),"no-signal":()=>import("./no-signal-HL4A4CFZ.js"),"one-bit":()=>import("./one-bit-AFIZQPHK.js"),"paint-splash":()=>import("./paint-splash-GZGPOURW.js"),"paper-plane":()=>import("./paper-plane-KDCSE3RM.js"),particles:()=>import("./particles-7UMRMT2M.js"),planet:()=>import("./planet-H6QGPDVC.js"),pond:()=>import("./pond-6DL43VUQ.js"),pong:()=>import("./pong-B2ZGAY7T.js"),radar:()=>import("./radar-22JCPGQZ.js"),"rainy-window":()=>import("./rainy-window-DTGLJVAR.js"),receipt:()=>import("./receipt-ZOYUSMN3.js"),"road-closed":()=>import("./road-closed-3OS55UBX.js"),"rpg-dialog":()=>import("./rpg-dialog-FV53YYNJ.js"),runner:()=>import("./runner-NANXJTQG.js"),"scratch-card":()=>import("./scratch-card-GC6U4ZZN.js"),screensaver:()=>import("./screensaver-UXKJVQUU.js"),"server-room":()=>import("./server-room-QSKAUFUY.js"),skyline:()=>import("./skyline-OMZMF5R6.js"),skywriting:()=>import("./skywriting-RYNQWJ6I.js"),"slot-machine":()=>import("./slot-machine-XXCVI2HK.js"),snake:()=>import("./snake-6Z5V3QA3.js"),"snow-globe":()=>import("./snow-globe-RLDPNA2J.js"),"solar-system":()=>import("./solar-system-CQAP6WFU.js"),"split-flap":()=>import("./split-flap-O7JGD5Q4.js"),stage:()=>import("./stage-GBZR3JQS.js"),"swiss-poster":()=>import("./swiss-poster-OON4HBUG.js"),terminal:()=>import("./terminal-7BTUDZDB.js"),thunderstorm:()=>import("./thunderstorm-FRCKHKXY.js"),topographic:()=>import("./topographic-3RIQXKIQ.js"),"torn-page":()=>import("./torn-page-6UT5ZQHG.js"),"treasure-map":()=>import("./treasure-map-FALAEBL5.js"),typewriter:()=>import("./typewriter-7TIO42MH.js"),ufo:()=>import("./ufo-6UW34TI3.js"),unplugged:()=>import("./unplugged-QXKDDH4S.js"),"vending-machine":()=>import("./vending-machine-SH3MNFMY.js"),vinyl:()=>import("./vinyl-3FUP3LSO.js"),"voxel-404":()=>import("./voxel-404-LMC43X4B.js"),wormhole:()=>import("./wormhole-I2RWIMRW.js"),"zen-garden":()=>import("./zen-garden-HMAMASJK.js")},ie=["ascii-3d","astronaut","aurora","autumn","balloon-404","beach","black-hole","block-drop","blue-screen","breakout","bricks","bubble-wrap","campfire","cassette","chalkboard","chrome-404","circuit-board","claw-machine","clay-404","constellation","cross-stitch","deep-sea","dna","dominoes","elevator","error-cascade","evidence-board","eyes","fireworks","flashlight","flatline","flock","foggy-glass","gears","glass-404","glitch","halftone","hanging-letters","hanging-sign","hyperspace","hypnosis","ink","invaders","kaleidoscope","lava-lamp","life","lighthouse","loading","lost-at-sea","magic-8-ball","matrix-rain","maze","mesh-gradient","metro-map","milk-carton","mirage","moon-landing","neon-sign","newspaper","nixie","no-signal","one-bit","paint-splash","paper-plane","particles","planet","pond","pong","radar","rainy-window","receipt","road-closed","rpg-dialog","runner","scratch-card","screensaver","server-room","skyline","skywriting","slot-machine","snake","snow-globe","solar-system","split-flap","stage","swiss-poster","terminal","thunderstorm","topographic","torn-page","treasure-map","typewriter","ufo","unplugged","vending-machine","vinyl","voxel-404","wormhole","zen-garden"];async function me(o){let n=re[o];if(!n)throw new Error(`[lostpage] unknown scene "${o}". Available: ${ie.join(", ")}`);return(await n()).default}function Oe(o,n,i){return ne(o,typeof n=="string"?()=>me(n):n,i)}export{ie as a,me as b,Oe as c};
@@ -1,70 +0,0 @@
1
- import{clamp,damp,isBrowser,rng}from"./chunk-FVGCB66F.js";import{resolve}from"./chunk-KIYSQVWX.js";var ICONS={back:'<svg data-dir="back" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M13 8H3M7 4 3 8l4 4"/></svg>',arrow:'<svg data-dir="arrow" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 11 11 5M6 5h5v5"/></svg>',home:'<svg data-dir="home" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2.5 7.5 8 3l5.5 4.5M4 6.5V13h8V6.5"/></svg>'};function el(tag,cls,text){let n=document.createElement(tag);return n.className=cls,text!==void 0&&(n.textContent=text),n}function buildAction(a,onNavigate){let variant=a.variant??"primary",node=a.href!==void 0?el("a",`lp-btn lp-btn--${variant}`):el("button",`lp-btn lp-btn--${variant}`);node instanceof HTMLAnchorElement?node.href=a.href:node.type="button";let icon=a.icon??(variant==="primary"?"back":"arrow"),label=el("span","lp-btn-label",a.label);if(icon!=="none"&&ICONS[icon]){let holder=document.createElement("span");holder.innerHTML=ICONS[icon];let svg=holder.firstChild;icon==="arrow"?node.append(label,svg):node.append(svg,label)}else node.append(label);return node.addEventListener("click",ev=>{let e=ev;a.onClick?.(e),!e.defaultPrevented&&a.href!==void 0&&onNavigate&&!(e.metaKey||e.ctrlKey||e.shiftKey||e.button===1)&&(e.preventDefault(),onNavigate(a.href,e))}),node}function buildOverlay(copy,layout,onNavigate){let overlay=el("div",`lp-overlay lp-layout-${layout} lp-fadein`),head=el("div","lp-head");if(copy.eyebrow&&head.append(el("p","lp-eyebrow",copy.eyebrow)),copy.code){let code=el("div","lp-code",copy.code);code.setAttribute("aria-hidden","true"),head.append(code)}let body=el("div","lp-body");if(copy.title){let h1=el("h1","lp-title");copy.code&&h1.append(el("span","lp-sr",`Error ${copy.code}: `)),h1.append(copy.title),body.append(h1)}if(copy.message&&body.append(el("p","lp-message",copy.message)),copy.actions?.length){let actions=el("div","lp-actions");for(let a of copy.actions)actions.append(buildAction(a,onNavigate));body.append(actions)}return overlay.append(head,body),overlay}var BASE_CSS=`
2
- .lp-root{
3
- --lp-bg:#0b0d12;--lp-fg:#f5f6f8;--lp-muted:color-mix(in srgb,var(--lp-fg) 64%,transparent);
4
- --lp-accent:var(--lp-fg);--lp-accent-fg:var(--lp-bg);
5
- --lp-font:"Inter","Manrope",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
6
- --lp-font-display:var(--lp-font);
7
- --lp-font-mono:"JetBrains Mono","IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
8
- --lp-font-serif:"Fraunces","Playfair Display",ui-serif,Georgia,"Times New Roman",serif;
9
- --lp-code-color:color-mix(in srgb,var(--lp-fg) 22%,transparent);
10
- --lp-code-size:clamp(64px,23cqw,300px);--lp-code-weight:500;
11
- --lp-title-size:clamp(22px,4.6cqw,58px);--lp-title-weight:500;
12
- --lp-radius:999px;--lp-pad:clamp(14px,5cqw,72px);
13
- position:relative;box-sizing:border-box;overflow:hidden;width:100%;
14
- height:var(--lp-height,100vh);height:var(--lp-height,100dvh);
15
- background:var(--lp-bg);color:var(--lp-fg);font-family:var(--lp-font);
16
- isolation:isolate;container-type:size;container-name:lp;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
17
- text-rendering:optimizeLegibility;touch-action:manipulation;
18
- }
19
- .lp-root *,.lp-root *::before,.lp-root *::after{box-sizing:border-box}
20
- .lp-root [hidden]{display:none!important}
21
- .lp-stage{position:absolute;inset:0;z-index:0;overflow:hidden}
22
- .lp-stage>canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
23
- .lp-custom{position:absolute;inset:0;z-index:3}
24
- .lp-overlay{position:absolute;inset:0;z-index:2;display:flex;flex-direction:column;align-items:center;
25
- justify-content:center;gap:clamp(12px,3cqh,32px);padding:var(--lp-pad) max(16px,var(--lp-pad));pointer-events:none}
26
- .lp-overlay a,.lp-overlay button,.lp-overlay [data-lp-interactive]{pointer-events:auto}
27
- .lp-head,.lp-body{display:flex;flex-direction:column;align-items:center;text-align:center;max-width:100%}
28
- .lp-eyebrow{margin:0 0 6px;font-size:11px;font-weight:600;letter-spacing:.32em;text-transform:uppercase;color:var(--lp-muted)}
29
- .lp-code{margin:0;font-family:var(--lp-font-display);font-weight:var(--lp-code-weight);font-size:var(--lp-code-size);
30
- line-height:.86;letter-spacing:-.045em;color:var(--lp-code-color);user-select:none;white-space:nowrap}
31
- .lp-title{margin:0;font-family:var(--lp-font-display);font-size:var(--lp-title-size);font-weight:var(--lp-title-weight);
32
- letter-spacing:-.035em;line-height:1.04;text-wrap:balance}
33
- .lp-message{margin:14px 0 0;max-width:36ch;color:var(--lp-muted);font-size:clamp(12.5px,1.25cqw,16px);line-height:1.6;text-wrap:pretty}
34
- .lp-actions{margin-top:clamp(20px,3.2cqh,32px);display:flex;gap:10px 22px;flex-wrap:wrap;align-items:center;justify-content:center}
35
- .lp-btn{display:inline-flex;align-items:center;gap:10px;font:inherit;font-size:13px;font-weight:500;letter-spacing:.01em;
36
- text-decoration:none;cursor:pointer;border:0;transition:transform .25s cubic-bezier(.2,.8,.2,1),background .25s,color .25s,box-shadow .25s}
37
- .lp-btn--primary{padding:13px 22px;border-radius:var(--lp-radius);background:var(--lp-accent);color:var(--lp-accent-fg)}
38
- .lp-btn--primary:hover{transform:translateY(-1px);box-shadow:0 10px 30px -10px color-mix(in srgb,var(--lp-accent) 60%,transparent)}
39
- .lp-btn--secondary{padding:13px 4px;background:none;color:var(--lp-fg);border-bottom:1px solid color-mix(in srgb,var(--lp-fg) 30%,transparent);border-radius:0}
40
- .lp-btn--secondary:hover{border-bottom-color:var(--lp-fg)}
41
- .lp-btn svg{width:14px;height:14px;flex:none;transition:transform .25s cubic-bezier(.2,.8,.2,1)}
42
- .lp-btn:hover svg[data-dir=back]{transform:translateX(-3px)}
43
- .lp-btn:hover svg[data-dir=arrow]{transform:translate(2px,-2px)}
44
- .lp-btn:focus-visible{outline:2px solid var(--lp-accent);outline-offset:3px}
45
- .lp-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
46
-
47
- .lp-layout-split{justify-content:space-between}
48
- .lp-layout-split .lp-head{padding-top:clamp(8px,4cqh,48px)}
49
- .lp-layout-split .lp-body{padding-bottom:clamp(8px,3cqh,40px)}
50
- .lp-layout-bottom{justify-content:flex-end}
51
- .lp-layout-top{justify-content:flex-start}
52
- .lp-layout-bottom-left{justify-content:flex-end;align-items:flex-start}
53
- .lp-layout-bottom-left .lp-head,.lp-layout-bottom-left .lp-body,
54
- .lp-layout-left .lp-head,.lp-layout-left .lp-body{align-items:flex-start;text-align:left}
55
- .lp-layout-bottom-left .lp-actions,.lp-layout-left .lp-actions{justify-content:flex-start}
56
- .lp-layout-left{align-items:flex-start;padding-left:max(16px,calc(var(--lp-pad) * 1.4))}
57
- .lp-layout-right{align-items:flex-end}
58
- .lp-layout-right .lp-head,.lp-layout-right .lp-body{align-items:flex-end;text-align:right}
59
- .lp-layout-right .lp-actions{justify-content:flex-end}
60
- .lp-layout-none .lp-head,.lp-layout-none .lp-body{display:none}
61
- .lp-code-hidden .lp-code{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}
62
-
63
- .lp-fadein .lp-head,.lp-fadein .lp-body{animation:lp-rise 1.1s cubic-bezier(.2,.8,.2,1) both}
64
- .lp-fadein .lp-body{animation-delay:.18s}
65
- @keyframes lp-rise{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}}
66
- @container (max-width:640px){.lp-layout-left,.lp-layout-right{align-items:center}
67
- .lp-layout-left .lp-head,.lp-layout-left .lp-body,.lp-layout-right .lp-head,.lp-layout-right .lp-body{align-items:center;text-align:center}
68
- .lp-layout-left .lp-actions,.lp-layout-right .lp-actions{justify-content:center}}
69
- @media (prefers-reduced-motion:reduce){.lp-fadein .lp-head,.lp-fadein .lp-body{animation:none}.lp-btn,.lp-btn svg{transition:none}}
70
- `,injected=new Set;function inject(key,css){if(typeof document>"u"||injected.has(key))return;if(document.querySelector(`style[data-lostpage="${key}"]`)){injected.add(key);return}let el2=document.createElement("style");el2.setAttribute("data-lostpage",key),el2.textContent=css,document.head.appendChild(el2),injected.add(key)}function injectBase(){inject("base",BASE_CSS)}function injectScene(id,css){css&&inject(`scene:${id}`,css.replace(/&/g,`.lp-s-${id}`))}function mount(target,scene,options={}){let current=null,destroyed=!1,paused=!1,opts=options,def=typeof scene=="object"?scene:null,host=typeof target=="string"?isBrowser()?document.querySelector(target):null:target,start=()=>{destroyed||!def||!host||(current?.destroy(),current=createInstance(host,def,opts),paused&&current.pause())},ready=(async()=>{if(!(!isBrowser()||!host)){if(!def){if(typeof scene=="string")throw new Error(`[lostpage] "lostpage/core" can't load "${scene}" by id. Import mount from "lostpage", or pass the scene object from "lostpage/scenes/${scene}".`);def=await scene()}start()}})();return ready.catch(e=>console.error(e)),{get root(){return current?.root??null},ready,update(next){let prev=opts;if(opts={...opts,...next},!current)return;["preset","params","motion","interactive","seed","maxDpr","overlay"].some(k=>k in next&&JSON.stringify(next[k])!==JSON.stringify(prev[k]))?start():current.refreshCopy(opts)},pause(){paused=!0,current?.pause()},resume(){paused=!1,current?.resume()},destroy(){destroyed=!0,current?.destroy(),current=null}}}function createInstance(host,def,opts){injectBase(),injectScene(def.id,def.css);let r=resolve(def,opts),root=document.createElement("div");root.className=`lp-root lp-s-${def.id} lp-p-${r.preset}${def.codeInScene?" lp-code-hidden":""}${opts.className?" "+opts.className:""}`,root.setAttribute("data-lostpage",def.id),opts.height&&root.style.setProperty("--lp-height",opts.height);let applyTheme=theme=>{for(let[k,v]of Object.entries(theme))root.style.setProperty(k.startsWith("--")?k:`--lp-${k}`,v)};applyTheme(r.theme);let stage=document.createElement("div");stage.className="lp-stage",stage.setAttribute("aria-hidden","true"),root.append(stage);let overlay=null;opts.overlay!==!1&&(overlay=buildOverlay(r.copy,def.layout,opts.onNavigate),root.append(overlay)),host.append(root);let reduceQuery=window.matchMedia?.("(prefers-reduced-motion: reduce)"),reducedMotion=opts.motion==="reduce"||opts.motion!=="full"&&!!reduceQuery?.matches,interactive=opts.interactive!==!1,maxDpr=opts.maxDpr??2,motionless=def.motion==="static"||reducedMotion&&def.motion!=="game",pointer={x:0,y:0,nx:0,ny:0,sx:0,sy:0,down:!1,inside:!1,engaged:!1},canvases=[],cleanups=[],width=0,height=0,dpr=1,quality=1,inView=!0,pageVisible=!document.hidden,pausedByUser=!1,raf=0,last=0,t=0,needsFrame=!0,instance={},failed=!1,ctx={root,stage,overlay,params:r.params,copy:r.copy,preset:r.preset,get width(){return width},get height(){return height},get dpr(){return dpr*quality},pointer,reducedMotion,interactive,random:rng(opts.seed??1337),canvas(o={}){let el2=document.createElement("canvas");el2.style.zIndex=String(o.z??0),stage.append(el2);let mc={el:el2,scale:o.scale??1,adaptive:!!o.adaptive};return canvases.push(mc),sizeCanvas(mc),el2},on(type,fn,o){root.addEventListener(type,fn,o),cleanups.push(()=>root.removeEventListener(type,fn,o))},onWindow(type,fn,o){window.addEventListener(type,fn,o),cleanups.push(()=>window.removeEventListener(type,fn,o))},invalidate(){needsFrame=!0,!raf&&!failed&&schedule()},visible:()=>inView&&pageVisible,navigate(href,e){opts.onNavigate?opts.onNavigate(href,e??new MouseEvent("click")):location.assign(href)},cssVar:name=>getComputedStyle(root).getPropertyValue(name.startsWith("--")?name:`--lp-${name}`).trim()};function sizeCanvas(mc){let s=dpr*mc.scale*(mc.adaptive?quality:1),w=Math.max(1,Math.round(width*s)),h=Math.max(1,Math.round(height*s));(mc.el.width!==w||mc.el.height!==h)&&(mc.el.width=w,mc.el.height=h)}function measure(){let rect2=root.getBoundingClientRect();width=Math.max(1,Math.round(rect2.width)),height=Math.max(1,Math.round(rect2.height)),dpr=Math.min(window.devicePixelRatio||1,maxDpr);for(let mc of canvases)sizeCanvas(mc);try{instance.resize?.(width,height,dpr)}catch(e){fail(e)}ctx.invalidate()}if(interactive){let setPos=e=>{let rect2=root.getBoundingClientRect();pointer.x=e.clientX-rect2.left,pointer.y=e.clientY-rect2.top,pointer.nx=clamp(pointer.x/rect2.width*2-1,-1,1),pointer.ny=clamp(1-pointer.y/rect2.height*2,-1,1),pointer.engaged=!0};ctx.on("pointermove",e=>{setPos(e),pointer.inside=!0,motionless&&ctx.invalidate()}),ctx.on("pointerdown",e=>{setPos(e),pointer.down=!0,motionless&&ctx.invalidate()}),ctx.onWindow("pointerup",()=>{pointer.down=!1}),ctx.on("pointerleave",()=>{pointer.inside=!1})}function frame(now){if(raf=0,failed)return;let dt=last?Math.min((now-last)/1e3,1/20):1/60;last=now,pointer.sx=damp(pointer.sx,pointer.nx,3,dt),pointer.sy=damp(pointer.sy,pointer.ny,3,dt),motionless?(t=def.stillTime??4,pointer.sx=pointer.nx,pointer.sy=pointer.ny):t+=dt;try{instance.frame?.(t,motionless?0:dt)}catch(e){fail(e);return}motionless||govern(dt),needsFrame=!1,motionless||schedule()}function schedule(){raf||failed||pausedByUser||!(inView&&pageVisible)||motionless&&!needsFrame||(raf=requestAnimationFrame(frame))}let acc=0,frames=0,warmup=1.5;function govern(dt){if(!canvases.some(c=>c.adaptive))return;if(warmup>0){warmup-=dt;return}if(acc+=dt,frames++,acc<1)return;let avg=acc/frames;acc=0,frames=0;let next=quality;if(avg>1/45?next=Math.max(.5,quality*.85):avg<1/58&&quality<1&&(next=Math.min(1,quality*1.08)),Math.abs(next-quality)>.01){quality=next;for(let mc of canvases)mc.adaptive&&sizeCanvas(mc);instance.resize?.(width,height,dpr)}}function fail(e){failed=!0,raf&&cancelAnimationFrame(raf),raf=0,root.classList.add("lp-fallback");for(let mc of canvases)mc.el.style.display="none";console.warn(`[lostpage] scene "${def.id}" could not render, showing text only.`,e)}let io=new IntersectionObserver(entries=>{inView=entries[entries.length-1].isIntersecting,inView&&(last=0,schedule())});io.observe(root);let onVis=()=>{pageVisible=!document.hidden,pageVisible&&(last=0,schedule())};document.addEventListener("visibilitychange",onVis);let ro=new ResizeObserver(()=>measure());ro.observe(root);let rect=root.getBoundingClientRect();width=Math.max(1,Math.round(rect.width)),height=Math.max(1,Math.round(rect.height)),dpr=Math.min(window.devicePixelRatio||1,maxDpr);try{instance=def.setup(ctx)||{},instance.resize?.(width,height,dpr)}catch(e){fail(e)}return schedule(),{root,pause(){pausedByUser=!0,raf&&cancelAnimationFrame(raf),raf=0},resume(){pausedByUser=!1,last=0,schedule()},refreshCopy(next){let nr=resolve(def,next);if(applyTheme(nr.theme),overlay){let fresh=buildOverlay(nr.copy,def.layout,next.onNavigate);fresh.classList.remove("lp-fadein"),overlay.replaceWith(fresh),overlay=fresh,ctx.overlay=fresh}Object.assign(ctx.copy,nr.copy)},destroy(){raf&&cancelAnimationFrame(raf),raf=0,failed=!0,io.disconnect(),ro.disconnect(),document.removeEventListener("visibilitychange",onVis);for(let c of cleanups)c();try{instance.destroy?.()}catch{}for(let mc of canvases)mc.el.__lpgl?.getExtension("WEBGL_lose_context")?.loseContext();root.remove()}}}export{mount};