*{box-sizing:border-box}html{background:#c7c3df;overscroll-behavior:none}body{margin:0;height:620svh;color:#342f53}main{position:fixed;inset:0;overflow:hidden;background:#c7c3df}canvas,.fallback{position:absolute;inset:0;width:100%;height:100%}canvas{opacity:0;transition:opacity 1s}body.ready canvas{opacity:1}.fallback img{width:100%;height:100%;object-fit:cover}nav{position:fixed;z-index:4;right:max(24px,env(safe-area-inset-right));bottom:max(24px,env(safe-area-inset-bottom));display:flex;gap:8px}button{width:44px;height:44px;border:1px solid #ffffff66;background:#eeecf126;border-radius:50%;color:#463c63;display:grid;place-items:center;cursor:pointer;backdrop-filter:blur(12px);transition:background .2s}button:hover{background:#fff7}button:focus-visible{outline:2px solid #433274;outline-offset:5px}button svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}.play-mark{display:none}button[aria-pressed=true] .pause-mark{display:none}button[aria-pressed=true] .play-mark{display:block}.journey-line{position:fixed;left:30px;top:35%;height:30%;width:1px;background:#51427220;pointer-events:none}.journey-line i{display:block;background:#72628c99;width:1px;height:100%;transform:scaleY(0);transform-origin:top}.scroll-cue{position:fixed;left:calc(50% - 12px);bottom:26px;width:24px;height:36px;color:#51466a;pointer-events:none;transition:opacity .5s}.scroll-cue svg{fill:none;stroke:currentColor;stroke-width:1;animation:breathe 2.6s ease-in-out infinite}@keyframes breathe{50%{transform:translateY(5px);opacity:.35}}body.traveled .scroll-cue{opacity:0}body.paused .scroll-cue svg{animation:none}body.failed{height:100svh}body.failed canvas,body.failed .scroll-cue,body.failed .journey-line{display:none}@media(max-width:600px){.journey-line{left:14px}nav{right:14px;bottom:18px}}@media(prefers-reduced-motion:reduce){canvas{transition:none}.scroll-cue svg{animation:none}}body.reduced .scroll-cue svg{animation:none}
body.ready .fallback{visibility:hidden}
body.failed nav{display:none}
/* Twilight controls retain contrast without adding visible copy. */
html,main{background:#343452}
button{color:#e2fff3;background:#17273a80;border-color:#c0eddf66}
button:hover{background:#38586faa}
button:focus-visible{outline-color:#b8ffe2}
.scroll-cue{color:#c0eadb}
.journey-line{background:#b5e4d72b}.journey-line i{background:#bdffe0aa}
/* Six camera spans at the original 130svh per span: more travel, same opening pace. */
body{height:880svh}
.project-link{width:44px;height:44px;display:grid;place-items:center;border:1px solid #c0eddf66;border-radius:50%;color:#e2fff3;background:#17273a80;backdrop-filter:blur(12px)}
.project-link svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:1.3;stroke-linecap:round}
.project-link:hover{background:#38586faa}.project-link:focus-visible{outline:2px solid #b8ffe2;outline-offset:5px}
body.arrived .project-link{border-color:#d2ffe7;background:#38586faa}
body.failed nav{display:flex}body.failed nav button{display:none}
/* Licensed Pinyon Script: calligraphy remains real DOM text, not a texture. */
@font-face{font-family:"Grove Script";src:url("./PinyonScript-Regular.ttf") format("truetype");font-display:swap;font-style:normal;font-weight:400}
.poem{position:absolute;inset:0;pointer-events:none;z-index:2;color:#fff6e9}
.poem-line{position:absolute;margin:0;opacity:0;will-change:opacity,transform;text-shadow:0 2px 24px #182439,0 1px 3px #1d243dbb}
.poem-line p{font-family:"Grove Script","Snell Roundhand","Apple Chancery",cursive;font-size:clamp(64px,8.5vw,116px);font-weight:400;line-height:.95;margin:0;letter-spacing:0}
.poem-opening{left:6.5%;top:9%;opacity:1}
.poem-opening:before,.poem-passage:before{content:"";position:absolute;z-index:-1;inset:-50px -90px;background:radial-gradient(ellipse,#1c304966,transparent 70%);pointer-events:none}
.poem-opening h1{font:400 10px/1.4 system-ui,sans-serif;text-transform:uppercase;letter-spacing:.32em;margin:0 0 28px 9px;color:#e1f4e9}
.poem-passage{left:7%;top:18%}
.poem-passage p{font-size:clamp(62px,7.4vw,100px)}
.poem-arrival{top:7%;left:5%;width:90%;text-align:center}
.poem-arrival p{font-size:clamp(58px,7.7vw,108px);line-height:1.1}
.poem-arrival span{display:block;font:400 12px/1.5 Georgia,serif;letter-spacing:.08em;margin-top:14px;color:#eef6ec}
body.failed .poem-opening{opacity:1!important;transform:none!important}body.failed .poem-passage,body.failed .poem-arrival{display:none}
@media(max-width:600px){.poem-opening{left:8%;top:8%}.poem-opening p{font-size:76px}.poem-opening h1{font-size:9px;margin-bottom:24px}.poem-passage{left:8%;top:12%}.poem-passage p{font-size:66px}.poem-arrival{top:8%;left:7%;width:86%}.poem-arrival p{font-size:clamp(48px,12.5vw,70px);line-height:1.05}.poem-arrival span{max-width:220px;margin:12px auto 0;font-size:11px}}
@media(max-height:550px){.poem-opening,.poem-passage,.poem-arrival{top:5%}.poem-line p{font-size:60px}.poem-opening h1{margin-bottom:12px}.poem-arrival span{margin-top:8px}}
@media(prefers-reduced-motion:reduce){.poem-line{will-change:auto;transform:none!important}}
.ending{position:fixed;z-index:3;left:50%;bottom:22px;transform:translateX(-50%);width:min(440px,calc(100% - 48px));text-align:center;color:#effbef;animation:ending-arrives .6s ease-out both}
.ending[hidden],body.failed .ending{display:none}
.ending:before{content:"";position:absolute;inset:-22px -24px;z-index:-1;background:radial-gradient(ellipse,#142e3acf,transparent 72%);pointer-events:none}
.ending #send-light{margin:auto;width:auto;min-width:172px;border-radius:28px;padding:0 24px;font:400 13px/1.3 Georgia,serif;letter-spacing:.04em;color:#fff5df;border-color:#f4e4b299;background:#234b4bb3}
.ending #send-light:disabled{cursor:default;color:#e3e9dc;background:#234b4b80}
#light-status{font:400 11px/1.5 Georgia,serif;min-height:17px;margin:9px 0 3px;color:#f1f6e7;text-shadow:0 1px 4px #122c39}
.ending-links{display:flex;align-items:center;justify-content:center;gap:12px;font:400 12px/1.4 Georgia,serif}
.ending-links button,.ending-links a{border:0;background:none;backdrop-filter:none;color:#e2f0e9;width:auto;min-height:44px;padding:7px 2px;border-radius:2px;display:inline-flex;align-items:center;font:inherit;text-decoration:underline;text-decoration-color:#d8eee44d;text-underline-offset:5px}
.ending-links a:focus-visible{outline:2px solid #b8ffe2;outline-offset:5px}
@keyframes ending-arrives{from{opacity:0;translate:0 8px}to{opacity:1;translate:0 0}}
body.reduced .ending{animation:none}
@media(max-width:800px){.ending{bottom:92px}}
@media(prefers-reduced-motion:reduce){.ending{animation:none}}
@media(max-height:550px) and (min-width:1001px){.ending{bottom:22px;left:22px;transform:none;width:280px}.ending #send-light{min-width:150px}.ending-links{gap:10px}}
/* An exact hotspot over the unchanged fluid wake; never an independently lagging ring. */
.grove-pointer{position:fixed;left:0;top:0;z-index:20;pointer-events:none;opacity:0;will-change:transform;color:#f8fff1}
.grove-pointer.visible{opacity:1}
.grove-pointer b{position:absolute;width:7px;height:11px;left:-3.5px;top:-5.5px;border-radius:65% 35% 60% 40%;transform:rotate(-28deg);background:linear-gradient(120deg,#fffbea 18%,#a5f3db 55%,#6565a8);border:.6px solid #fffbecc9;box-shadow:0 0 0 1px #172e3c99,0 0 9px #a8ffe46b;transition:scale .12s ease,rotate .12s ease}
.grove-pointer[data-kind=light] b{scale:1.45;rotate:28deg;background:linear-gradient(130deg,#fffbe9,#ead399)}
.grove-pointer[data-kind=ui] b{scale:1.2}
.grove-pointer.pressed b{scale:.72}
.grove-pointer span{position:absolute;left:17px;top:13px;font:400 10px/1.3 Georgia,serif;letter-spacing:.05em;white-space:nowrap;color:#fff7e8;text-shadow:0 1px 3px #112533,0 0 9px #112533;background:#19364480;border-radius:9px;padding:3px 7px}
.grove-pointer span:empty{display:none}.grove-pointer.label-left span{left:auto;right:17px}.grove-pointer.label-above span{top:auto;bottom:13px}
@media(hover:hover) and (pointer:fine){body.cursor-present,body.cursor-present canvas,body.cursor-present button,body.cursor-present a{cursor:none}}
body.paused .grove-pointer,body.reduced .grove-pointer,body.failed .grove-pointer{display:none}
@media(prefers-reduced-motion:reduce),(pointer:coarse){.grove-pointer{display:none}}
/* Opaline seed: botanical silhouette, exact contact point, no extra render loop. */
.seed-aura,.seed-bloom{position:absolute;width:64px;height:64px;left:-32px;top:-32px;overflow:visible;fill:none;stroke:#f8ffe9;stroke-width:.65;pointer-events:none}
.seed-aura{transform:rotate(var(--seed-heading,-28deg));transition:transform .24s cubic-bezier(.2,.7,.2,1),opacity .2s;filter:drop-shadow(0 1px 1px #20304b99) drop-shadow(0 0 5px #c2ffdf55)}
.seed-petals{transform:scale(.48);opacity:.65;transition:transform .35s cubic-bezier(.2,.8,.2,1),opacity .2s}
.petal{fill:#dbfce81a;transform-origin:0 2px;transition:transform .4s cubic-bezier(.2,.8,.2,1)}
.petal-b{stroke:#d9d0ff;fill:#bda4ff20}.petal-c,.petal-d{opacity:.65}
.seed-vein{stroke-width:.4;opacity:.65}.seed-water{opacity:0;stroke:#dbfff0;transition:opacity .25s}
.grove-pointer[data-kind=leaf] .seed-petals{transform:scale(.75)}
.grove-pointer[data-kind=leaf] .petal-a{transform:rotate(-13deg)}
.grove-pointer[data-kind=leaf] .petal-b{transform:rotate(13deg)}
.grove-pointer[data-kind=light] .seed-aura{transform:rotate(-12deg)}
.grove-pointer[data-kind=light] .seed-petals{transform:scale(1.05);opacity:1}
.grove-pointer[data-kind=light] .petal-a{transform:rotate(-30deg)}
.grove-pointer[data-kind=light] .petal-b{transform:rotate(30deg)}
.grove-pointer[data-kind=light] .petal-c{transform:rotate(25deg)}
.grove-pointer[data-kind=light] .petal-d{transform:rotate(-25deg)}
.grove-pointer[data-kind=water] .seed-aura{transform:rotate(-12deg)}
.grove-pointer[data-kind=water] .seed-petals{opacity:0;transform:scale(.2)}
.grove-pointer[data-kind=water] .seed-water{opacity:.85}
.grove-pointer[data-kind=ui] .seed-aura{opacity:0}
.grove-pointer.pressed .seed-petals{transform:scale(.28)}
.seed-bloom{left:calc(-32px + var(--bloom-x,0px));top:calc(-32px + var(--bloom-y,0px));opacity:0;stroke:#fff9db;stroke-width:.5;fill:#e1fff333}
.grove-pointer[data-bloom=a] .seed-bloom{animation:seed-open-a .8s ease-out both}
.grove-pointer[data-bloom=b] .seed-bloom{animation:seed-open-b .8s ease-out both}
@keyframes seed-open-a{0%{opacity:0;transform:scale(.2) rotate(0)}15%{opacity:.8}100%{opacity:0;transform:scale(1.5) rotate(24deg)}}
@keyframes seed-open-b{0%{opacity:0;transform:scale(.2) rotate(0)}15%{opacity:.8}100%{opacity:0;transform:scale(1.5) rotate(24deg)}}
.grove-pointer span{left:30px;top:18px;font-style:italic;font-size:11px;letter-spacing:.03em;background:#19364459;padding:2px 6px}
.grove-pointer.label-left span{right:30px}.grove-pointer.label-above span{bottom:18px}
/* Controls share one reserved band; the ending never occupies that band. */
nav{right:max(18px,env(safe-area-inset-right));bottom:max(18px,env(safe-area-inset-bottom));align-items:center}
.quality-control select{height:44px;max-width:100px;padding:0 12px;border:1px solid #c0eddf66;border-radius:24px;background:#17273aeb;color:#e2fff3;font:12px Georgia,serif;cursor:pointer}
.quality-control select:focus-visible{outline:2px solid #b8ffe2;outline-offset:4px}
.sr-only,.journey-transcript{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}
@media(max-width:1000px){.ending{bottom:calc(82px + env(safe-area-inset-bottom));left:50%;transform:translateX(-50%);width:min(440px,calc(100% - 36px))}nav{gap:6px}.ending-links{flex-wrap:wrap;gap:8px}}
@media(max-height:550px) and (max-width:1000px){.ending:before{background:radial-gradient(ellipse,#142e3aeb,transparent 78%)}.ending #send-light{min-width:150px}}
body.reduced{height:340svh}
body.reduced canvas{transition:none}
body.reduced #pause{display:none}
.load-notice{position:fixed;z-index:5;left:24px;bottom:24px;max-width:min(480px,calc(100% - 48px));color:#fff6e9;font:13px/1.5 Georgia,serif;text-shadow:0 1px 5px #101f24}
.load-notice p{margin:0}.load-notice button{width:auto;padding:0 18px;margin-top:12px;border-radius:24px;font:inherit}
.load-notice button[hidden],body.ready .load-notice,body.loading:not(.slow-loading) #retry{display:none}
body.static{height:auto;min-height:100svh}
body.static main{position:relative;min-height:0;height:auto;padding:65px 7vw 28px;overflow:visible}
body.static .fallback{position:fixed;opacity:.48;pointer-events:none}
body.static .poem,body.static canvas,body.static .scroll-cue,body.static .journey-line,body.static nav button,body.static .quality-control{display:none}
body.static .journey-transcript{position:relative;clip-path:none;width:min(560px,100%);height:auto;margin:0;padding:28px;white-space:normal;color:#f5f4ed;background:#233346e8;border:1px solid #d8dafa44;border-radius:4px;font:17px/1.75 Georgia,serif}
body.static .journey-transcript h1{font:64px/1.1 'Grove Script',cursive;margin:0 0 28px}
body.static .journey-transcript p{margin:0 0 20px}
body.static .journey-transcript a{color:#ddfced;text-underline-offset:5px}
body.static .load-notice{position:relative;left:auto;bottom:auto;margin:0 7vw 90px;background:#233346f2;padding:12px 18px;border-radius:4px;max-width:560px;width:86vw}
@media(max-width:500px){body.static main{padding:28px 18px}.load-notice{left:18px}body.static .load-notice{margin-inline:18px;width:calc(100% - 36px)}body.static .journey-transcript{padding:22px}body.static .journey-transcript h1{font-size:52px}}
