/* Shoot Cards demo (/demo): a one-minute film in one frame. The story on the
   left, the camera on the right, a chapter bar underneath. Builds on the
   tokens and shared components (.btn, .cameras, .fld) in styles.css. */

.demo-nav-link{color:var(--ink-2);font-size:14px;font-weight:500;white-space:nowrap}
.demo-nav-link:hover{color:var(--ink)}
.demo-nav-link:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:4px}
.demo{max-width:var(--wide);margin:0 auto;padding:clamp(14px,2.2vw,28px) var(--gutter) clamp(40px,5vw,72px)}
.demo-noscript{text-align:center;color:var(--ink-2)}

/* ---------- the film: a frame and its chapter bar ---------- */
.film{
  --ease:cubic-bezier(.22,.7,.18,1);
  width:min(100%,1120px,calc((100vh - 200px) * 1.6667));width:min(100%,1120px,calc((100svh - 200px) * 1.6667));
  margin:0 auto;border-radius:28px;overflow:hidden;background:var(--surface);
  border:1px solid var(--border-soft);box-shadow:var(--shadow-lg);
}
.film.cut *,.film.cut *::before,.film.cut *::after{transition:none!important}
.stage{position:relative;isolation:isolate;aspect-ratio:16/9.6;overflow:hidden;container:stage/inline-size;background:#e9ece4}
/* backdrop: the homepage's hero photo (white wall, green leaves), blurred to a soft wash */
.stage::before{content:"";position:absolute;inset:-80px;z-index:-2;background:url(/assets/showcase/hero-poster.jpg) 30% 0/260% auto no-repeat,#eef0ea;filter:blur(46px) saturate(.72) brightness(1.08);transform:scale(1.06)}
.stage::after{content:"";position:absolute;inset:0;z-index:-1;background:radial-gradient(80% 90% at 75% 50%,rgba(255,255,255,0),rgba(255,255,255,.35) 85%),linear-gradient(90deg,rgba(255,255,255,.55),rgba(255,255,255,0) 50%)}

/* ---------- the story (left) ---------- */
.story{position:absolute;left:6%;top:13%;width:37%;transition:opacity .5s var(--ease),transform .7s var(--ease)}
/* with nothing under the words, they sit lower, level with the camera */
.film[data-scene="playback"] .story,.film[data-scene="day"] .story{transform:translateY(12cqw)}
/* on the day the lens pushes in on the card: the words make room */
@media (min-width:681px){.film[data-scene="day"] .story{width:33%}}
.film[data-scene="end"] .story{opacity:0;visibility:hidden;transform:translateY(-10px)}
.kicker{display:inline-flex;align-items:center;gap:9px;margin:0 0 clamp(10px,1.4cqw,18px);padding:4px 13px 4px 4px;border-radius:999px;background:rgba(255,255,255,.8);
  -webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-shadow:0 1px 2px rgba(0,0,0,.05);font-size:clamp(11.5px,1.05cqw,13px);font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--accent-2)}
.kicker b{display:grid;place-items:center;width:1.9em;height:1.9em;border-radius:50%;background:var(--accent);color:#fff;font-size:.95em}
.kicker-ok{color:var(--ok)}
.kicker-ok b{background:var(--ok)}
.cap-title{font-family:var(--serif);font-weight:400;font-size:clamp(24px,3.5cqw,46px);line-height:1.03;letter-spacing:-.012em;margin:0;color:var(--ink)}
.cap-title em{font-style:italic;color:var(--accent)}
.cap-title:focus{outline:none}
.cap-text{margin:clamp(10px,1.2cqw,16px) 0 0;max-width:30em;font-size:clamp(13.5px,1.4cqw,17px);line-height:1.5;color:var(--ink-2)}
@keyframes capIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
/* a headline arrives word by word, each rising out from under its own mask
   (demo.js words()); the line under it follows once the headline has landed */
.cap-title .w{display:inline-block;overflow:hidden;vertical-align:top;padding:0 .08em .14em 0;margin:0 -.08em -.14em 0}
.cap-title .w>span{display:inline-block}
.cap.in .w>span{animation:wordUp .8s var(--ease) both;animation-delay:calc(var(--i) * 42ms)}
.cap.in .cap-text{animation:capIn .7s var(--ease) .32s both}
@keyframes wordUp{from{transform:translateY(112%)}to{transform:none}}
/* the hook waits for its typeface rather than swapping it in front of you */
.film.fonts-wait .story{opacity:0}

/* ---------- the camera (right), seen from the back ---------- */
.rig{position:absolute;right:5%;top:50%;width:48%;transform:translateY(-50%);transition:transform .9s var(--ease),top .9s var(--ease)}
/* the lens (demo.js lensAt): pushes in on the screen, racks focus, drifts in the hand */
.cam-wrap{transform-origin:40% 54%;will-change:transform}
.film[data-scene="playback"] .rig,.film[data-scene="why"] .rig,.film[data-scene="board"] .rig{transform:translateY(-50%) scale(1.04)}
/* held upright for the pose cards, grip on top, like a photographer does */
.film[data-beat="tall"] .rig{transform:translateY(-50%) rotate(-90deg) scale(.96)}
.film[data-scene="make"] .rig{transform:translateY(-50%) scale(.95)}
.film[data-scene="sd"] .rig{transform:translateY(-48%) scale(.9) translateX(3%)}
.film[data-scene="day"] .rig{transform:translateY(-50%) scale(1.06)}
.cam-wrap{position:relative;width:100%;container-type:inline-size}
.dcam{
  position:relative;width:100%;margin-top:9cqw;padding:5.4cqw 10.5cqw 4.6cqw 4.6cqw;
  border-radius:5.2cqw 5.2cqw 6.4cqw 6.4cqw;
  background:linear-gradient(180deg,#2c2c30 0%,#1d1d20 14%,#161618 60%,#121214 100%);
  box-shadow:
    inset 0 1.5px 0 rgba(255,255,255,.14), inset 0 -3px 8px rgba(0,0,0,.55), inset 3px 0 6px rgba(255,255,255,.03),
    0 2px 3px rgba(0,0,0,.25), 0 24px 40px -14px rgba(20,24,12,.5), 0 50px 80px -30px rgba(20,24,12,.45);
}
/* the grip under your right thumb, with a fine leather grain */
.dcam::before{content:"";position:absolute;right:0;top:9%;bottom:9%;width:8.4cqw;border-radius:0 6cqw 6cqw 0;
  background:radial-gradient(rgba(255,255,255,.07) .6px,transparent 1.1px) 0 0/4px 4px,linear-gradient(90deg,#141416,#202023 60%,#19191b);
  box-shadow:inset 1px 0 0 rgba(255,255,255,.05)}
.dcam-evf{position:absolute;left:9%;top:-8.6cqw;width:29%;height:10.4cqw;border-radius:3.4cqw 3.4cqw 0 0;background:linear-gradient(180deg,#323236,#1f1f22 70%,#1d1d20);box-shadow:inset 0 1.5px 0 rgba(255,255,255,.14)}
.dcam-evf i{position:absolute;left:14%;right:14%;top:22%;height:9.6cqw;border-radius:2.6cqw;background:radial-gradient(ellipse at 50% 45%,#1c3a33 0 18%,#0a0b0c 34%,#09090a 60%),#0a0a0b;box-shadow:inset 0 0 0 .7cqw #19191b,inset 0 2px 0 rgba(255,255,255,.06),0 .5cqw 1cqw rgba(0,0,0,.45)}
.dcam-dial{position:absolute;right:22%;top:-3.6cqw;width:14%;height:4cqw;border-radius:1.2cqw 1.2cqw 0 0;background:repeating-linear-gradient(90deg,#2a2a2d 0 2px,#3c3c41 2px 4px);box-shadow:inset 0 1px 0 rgba(255,255,255,.12)}
.dcam-shutter{position:absolute;right:7%;top:-2.8cqw;width:10%;height:3.2cqw;border-radius:1.6cqw 1.6cqw .4cqw .4cqw;background:linear-gradient(180deg,#68686e,#2c2c30);box-shadow:inset 0 1px 0 rgba(255,255,255,.22)}
.dcam-face{position:relative;display:flex;align-items:center;gap:3.4cqw}
.dcam-screen{position:relative;flex:1 1 auto;min-width:0;padding:.9cqw;border-radius:1.8cqw;background:#050506;
  box-shadow:0 0 0 .55cqw #0c0c0e,0 0 0 .7cqw rgba(255,255,255,.06),inset 0 0 0 1px rgba(255,255,255,.04);overflow:hidden}
.dcam-screen canvas{display:block;width:100%;height:auto;border-radius:.9cqw;background:#000}
.dcam-screen::after{content:"";position:absolute;inset:0;z-index:3;border-radius:inherit;pointer-events:none;
  background:linear-gradient(118deg,rgba(255,255,255,.11),rgba(255,255,255,.02) 32%,rgba(255,255,255,0) 33%)}
.dcam-keys{position:relative;z-index:1;flex:0 0 auto;width:12.6cqw;display:flex;flex-direction:column;align-items:center;gap:2.3cqw}
.dkey{display:grid;place-items:center;width:6.6cqw;height:6.6cqw;border-radius:50%;
  background:radial-gradient(circle at 36% 30%,#4d4d53,#26262a 62%,#1d1d20);
  box-shadow:0 .35cqw .7cqw rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.14);
  font:700 1.55cqw/1 var(--sans);letter-spacing:.05em;color:#d4d4d9;transition:filter .12s,transform .12s}
.dkey.deco{width:5.4cqw;height:5.4cqw;font-size:1.45cqw;color:#8e8e95}
.dkey-menu{width:9.6cqw;height:4.8cqw;border-radius:1.4cqw}
.dkey-play::after{content:"";margin-left:.5cqw;border-left:1.9cqw solid #dcdce1;border-top:1.2cqw solid transparent;border-bottom:1.2cqw solid transparent}
.dwheel{position:relative;width:12.6cqw;height:12.6cqw;border-radius:50%;transition:filter .12s;
  background:repeating-conic-gradient(#28282b 0 5deg,#3b3b40 5deg 10deg);
  box-shadow:0 .6cqw 1.2cqw rgba(0,0,0,.6),inset 0 0 0 .45cqw #1b1b1e,inset 0 1px 0 .45cqw rgba(255,255,255,.06)}
.dwheel i{position:absolute;inset:27%;border-radius:50%;background:radial-gradient(circle at 36% 30%,#55555b,#252528 68%);box-shadow:0 0 0 .45cqw #161618,inset 0 1px 0 rgba(255,255,255,.16)}
.dkey.down{transform:translateY(1px);filter:brightness(1.45)}
.dwheel.down{filter:brightness(1.3)}
/* the 3D camera (cam3d.js) draws the body; the CSS one stays for layout, state and as the fallback */
.cam3d-gl{position:absolute;z-index:-1;pointer-events:none}
.dcam[data-cam3d-ready]{background:none;box-shadow:none;isolation:isolate}
.dcam[data-cam3d-ready]::before{visibility:hidden}
.dcam[data-cam3d-ready] .dcam-evf,.dcam[data-cam3d-ready] .dcam-dial,.dcam[data-cam3d-ready] .dcam-shutter,.dcam[data-cam3d-ready] .dcam-keys{visibility:hidden}
.dcam[data-cam3d-ready] .dcam-screen{background:none;box-shadow:none}
.dcam[data-cam3d-ready] .dcam-screen::after,.dcam[data-cam3d-ready] #screen-canvas{visibility:hidden}

/* what happens on the screen */
.dcam-screen.flash::before{content:"";position:absolute;inset:.9cqw;z-index:2;border-radius:.9cqw;background:#fff;pointer-events:none;animation:blink .35s ease-out forwards}
@keyframes blink{from{opacity:.85}to{opacity:0}}
#screen-canvas.slide-next{animation:slideNext .32s var(--ease)}
#screen-canvas.pop{animation:pop .5s cubic-bezier(.2,.8,.3,1.15)}
#screen-canvas.fade{animation:fade .4s ease-out}
@keyframes fade{from{opacity:.15}to{opacity:1}}
@keyframes slideNext{from{transform:translateX(9%);opacity:.2}to{transform:none;opacity:1}}
@keyframes pop{from{transform:scale(.9);opacity:.1}to{transform:none;opacity:1}}

/* ---------- 1. the phone you reach for ---------- */
.phone{position:absolute;z-index:4;left:14%;top:47%;width:min(17%,200px);background:#111;border-radius:12% / 6.5%;padding:1.1%;padding:4px;
  box-shadow:0 30px 60px -10px rgba(0,0,0,.4);opacity:0;transform:translateY(55%) rotate(-4deg);transition:opacity .45s var(--ease),transform .8s var(--ease)}
.film[data-beat="phone"] .phone{opacity:1;transform:translateY(0) rotate(-4deg)}
.phone-screen{background:#fff;border-radius:10% / 5.5%;padding:12% 7% 8%;aspect-ratio:9/18;display:flex;flex-direction:column;gap:6%;overflow:hidden}
.phone-time{margin:0;font:700 clamp(18px,2.2cqw,28px)/1 var(--sans);color:var(--err);text-align:center;font-variant-numeric:tabular-nums}
.phone-search{margin:0;background:var(--surface-2);border-radius:999px;padding:5% 8%;font-size:clamp(8px,.85cqw,11px);color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.phone-feed{flex:1;min-height:0;overflow:hidden;border-radius:6px}
.phone-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}
.phone-grid i{background:#e7e5e1;border-radius:4px;aspect-ratio:3/4}
.phone-grid i:nth-child(3n+2){background:#d8d4cd}
.phone-grid i:nth-child(4n){background:#efe1d9}

/* ---------- 3. the studio, in miniature ---------- */
.studio{position:absolute;z-index:3;left:6%;top:43%;width:37%;padding:1.5cqw 1.7cqw;border-radius:18px;background:#fff;border:1px solid rgba(0,0,0,.07);
  box-shadow:0 24px 48px -20px rgba(30,40,20,.4),0 2px 6px rgba(0,0,0,.05);font-size:clamp(10px,1.08cqw,13.5px);color:var(--ink);
  opacity:0;transform:translateY(28px);transition:opacity .5s var(--ease),transform .8s var(--ease);pointer-events:none}
.film[data-scene="make"] .studio{opacity:1;transform:none}
.studio-h{display:flex;justify-content:space-between;align-items:center;margin:0 0 .4em;font-size:1.12em}
.studio-type{padding:.3em .8em;border-radius:999px;background:#fff4f4;box-shadow:inset 0 0 0 1px var(--accent);color:var(--accent-2);font-size:.82em;font-weight:600}
.studio-lbl{margin:.85em 0 .4em;font-size:.88em;font-weight:600;color:var(--ink-2)}
.studio-in{display:flex;align-items:center;min-height:2.5em;margin:0;padding:0 .85em;border:1px solid var(--border);border-radius:.7em;background:var(--surface-2);font-size:1.05em;transition:border-color .2s,box-shadow .2s,background .2s}
.studio-in b{font-weight:500}
.studio.typing .studio-in{border-color:var(--accent);background:#fff;box-shadow:0 0 0 3px var(--accent-soft)}
.caret{display:inline-block;width:1.5px;height:1.15em;margin-left:1px;background:var(--accent);opacity:0}
.studio.typing .caret{opacity:1;animation:caret 1s steps(1) infinite}
@keyframes caret{50%{opacity:0}}
.studio-chips{display:flex;flex-wrap:wrap;gap:.4em}
.schip{display:inline-flex;align-items:center;gap:.4em;padding:.38em .75em;border:1px solid var(--border);border-radius:999px;background:#fff;color:var(--ink-2);font-size:.93em;transition:background .25s,border-color .25s,color .25s,box-shadow .25s}
.schip b{font-weight:700;color:var(--accent-2)}
.schip.on{border-color:var(--accent);background:#fff4f4;color:var(--accent-2);box-shadow:inset 0 0 0 1px var(--accent);font-weight:600}
.schip.on::before{content:"\2713";font-weight:700}
.studio-row{display:flex;align-items:center;gap:.6em;margin-top:1em}
.studio-cams{display:inline-flex;gap:2px;padding:3px;border-radius:.75em;background:var(--surface-2)}
.studio-cams span{padding:.5em .8em;border-radius:.55em;font-weight:600;color:var(--ink-2);transition:background .25s,color .25s,box-shadow .25s}
.studio-cams span.on{background:#fff;color:var(--accent-2);box-shadow:0 1px 3px rgba(0,0,0,.1),inset 0 0 0 1px var(--accent)}
.studio-go{flex:1 1 auto;padding:.7em 1em;border-radius:.75em;background:var(--accent);color:#fff;font-weight:600;text-align:center;white-space:nowrap;box-shadow:0 6px 18px rgba(164,0,0,.22);transition:background .35s,opacity .35s}
.studio-go.is-busy{opacity:.7}
.studio-go.is-made{background:var(--ok);box-shadow:0 6px 18px rgba(4,120,87,.25)}

/* ---------- 3. any picture? a saved image, which the camera can't show ---------- */
.pngchip{position:absolute;z-index:5;left:6%;top:50%;display:flex;align-items:center;gap:1cqw;padding:.7cqw 1.2cqw .7cqw .7cqw;border-radius:14px;background:#fff;border:1px solid rgba(0,0,0,.08);
  box-shadow:0 14px 30px -12px rgba(30,40,20,.4);font-size:clamp(10.5px,1.15cqw,14px);color:var(--ink);
  opacity:0;transform:translateY(16px);transition:opacity .45s var(--ease),transform .9s var(--ease),left .95s var(--ease),top .95s var(--ease)}
.pngchip span{display:flex;flex-direction:column;gap:2px}
.pngchip small{color:var(--muted);font-size:.86em}
/* a plain picture: sky, a sun, two hills */
.png-thumb{flex:0 0 auto;width:3.4cqw;height:4.4cqw;min-width:30px;min-height:38px;border-radius:5px;border:1px solid var(--border-soft);
  background:radial-gradient(circle at 70% 30%,#fff3c4 0 12%,transparent 13%),radial-gradient(120% 60% at 30% 100%,#8aa36f 0 45%,transparent 46%),radial-gradient(120% 70% at 85% 105%,#6f8a59 0 45%,transparent 46%),linear-gradient(180deg,#cfe0ee,#f2e6d6)}
.film[data-scene="why"] .pngchip{opacity:1;transform:none}
/* dragged onto the camera: it travels first, then melts in */
.film[data-beat="drop"] .pngchip,.film[data-beat="err"] .pngchip{left:68%;top:44%;opacity:0;transform:scale(.35);
  transition:left .9s var(--ease),top .9s var(--ease),transform .9s var(--ease),opacity .3s ease .7s}

/* ---------- 4. her board: the bride's pins, sent over like a message ---------- */
.herboard{position:absolute;z-index:5;left:6%;top:52%;width:30%;padding:1.1cqw;border-radius:18px 18px 18px 5px;background:#fff;border:1px solid rgba(0,0,0,.08);
  box-shadow:0 18px 36px -14px rgba(30,40,20,.42);font-size:clamp(10.5px,1.15cqw,14px);color:var(--ink);
  opacity:0;transform:translateY(16px);transition:opacity .45s var(--ease),transform .9s var(--ease),left .95s var(--ease),top .95s var(--ease)}
.hb-from{display:flex;align-items:center;gap:.7em;margin:0 0 .8em}
.hb-from span:last-child{display:flex;flex-direction:column;gap:1px}
.hb-from small{color:var(--ink-2);font-size:.95em}
.hb-av{display:grid;place-items:center;flex:0 0 auto;width:2.3em;height:2.3em;border-radius:50%;background:#f3e3e3;color:var(--accent-2);font-weight:700}
.hb-pins{display:grid;grid-template-columns:repeat(4,1fr);gap:5px}
.hb-pins img{display:block;width:100%;height:auto;aspect-ratio:3/4;object-fit:cover;border-radius:8px}
.hb-more{position:relative;display:block}
.hb-more b{position:absolute;inset:0;display:grid;place-items:center;border-radius:8px;background:rgba(0,0,0,.5);color:#fff;font-size:1.2em}
.hb-meta{margin:.7em 0 0;color:var(--muted);font-size:.88em}
.film[data-beat="msg"] .herboard{opacity:1;transform:none}
/* dragged onto the camera: it travels first, then melts in */
.film[data-beat="drop"] .herboard,.film[data-scene="board"][data-beat="on"] .herboard,.film[data-scene="board"][data-beat="tall"] .herboard{left:62%;top:40%;opacity:0;transform:scale(.35);
  transition:left .9s var(--ease),top .9s var(--ease),transform .9s var(--ease),opacity .3s ease .7s}

/* ---------- 5. the ZIP, the SD card, the folder ---------- */
.zipchip{position:absolute;z-index:5;left:6%;top:52%;display:flex;align-items:center;gap:1cqw;padding:.7cqw 1.2cqw .7cqw .7cqw;border-radius:14px;background:#fff;border:1px solid rgba(0,0,0,.08);
  box-shadow:0 14px 30px -12px rgba(30,40,20,.4);font-size:clamp(10.5px,1.15cqw,14px);color:var(--ink);
  opacity:0;transform:translateY(16px);transition:opacity .45s var(--ease),transform .9s var(--ease),left .95s var(--ease),top .95s var(--ease)}
.zipchip canvas{display:block;width:4.4cqw;height:2.95cqw;border-radius:4px;border:1px solid var(--border-soft);background:#fff}
.zipchip span{display:flex;flex-direction:column;gap:2px}
.zipchip small{color:var(--muted);font-size:.86em}
.film[data-scene="sd"] .zipchip{opacity:1;transform:none}
/* dragged onto the card: it travels first, then melts in */
.film[data-beat="copy"] .zipchip,.film[data-beat="copied"] .zipchip,.film[data-beat="insert"] .zipchip,.film[data-beat="inserted"] .zipchip{
  left:29%;top:51%;opacity:0;transform:scale(.35);
  transition:left .9s var(--ease),top .9s var(--ease),transform .9s var(--ease),opacity .3s ease .7s}

.sdcard{position:absolute;z-index:4;left:31%;top:47%;width:6.6%;aspect-ratio:24/32;
  opacity:0;transform:translateY(16px);transition:opacity .45s var(--ease),transform .9s var(--ease),left 1s var(--ease),top 1s var(--ease);
  filter:drop-shadow(0 12px 18px rgba(20,24,12,.35))}
.sdcard::before{content:"";position:absolute;inset:0;background:linear-gradient(165deg,#36405a,#151a26 70%);clip-path:polygon(0 0,72% 0,100% 17%,100% 100%,0 100%);border-radius:3px}
.sd-pins{position:absolute;left:10%;top:5%;width:56%;height:15%;background:repeating-linear-gradient(90deg,#e1bd62 0 11%,transparent 11% 15%)}
.sd-face{position:absolute;left:10%;right:10%;bottom:8%;display:flex;flex-direction:column;color:#fff}
.sd-face b{font:italic 800 2.1cqw/1 var(--sans);letter-spacing:-.04em}
.sd-face small{font-size:.8cqw;font-weight:600;opacity:.75}
.sd-ok{position:absolute;right:-22%;top:-12%;display:grid;place-items:center;width:2.4cqw;height:2.4cqw;min-width:18px;min-height:18px;border-radius:50%;background:var(--ok);color:#fff;font-size:clamp(10px,1.2cqw,14px);font-weight:700;box-shadow:0 0 0 3px #fff;opacity:0;transform:scale(.4);transition:opacity .3s,transform .45s cubic-bezier(.2,.8,.3,1.4)}
.film[data-scene="sd"] .sdcard{opacity:1;transform:none}
.film[data-beat="copied"] .sd-ok,.film[data-beat="insert"] .sd-ok{opacity:1;transform:none}
/* into the slot on the grip side */
.film[data-beat="insert"] .sdcard{left:89.6%;top:40%;transform:rotate(90deg) scale(.6)}
.film[data-beat="insert"] .sd-ok{opacity:0}
.film[data-beat="inserted"] .sdcard{left:92.5%;top:40%;opacity:0;transform:rotate(90deg) scale(.45)}

/* the folder it goes into, under the card */
.sd-path{position:absolute;z-index:3;left:34.3%;top:64%;margin:0;display:flex;align-items:center;gap:.5em;white-space:nowrap;font-size:clamp(11px,1.15cqw,14px);color:var(--ink-2);
  opacity:0;transform:translate(-50%,10px);transition:opacity .45s var(--ease) .15s,transform .7s var(--ease) .15s}
.sd-path span{color:var(--accent)}
.sd-path b{padding:.35em .75em;border-radius:8px;background:rgba(255,255,255,.88);color:var(--ink);font-family:var(--mono);font-size:.92em;font-weight:600;box-shadow:0 1px 2px rgba(0,0,0,.06)}
.film[data-scene="sd"] .sd-path{opacity:1;transform:translate(-50%,0)}
.film[data-beat="insert"] .sd-path,.film[data-beat="inserted"] .sd-path{opacity:0;transform:translate(-50%,-6px)}

/* ---------- the end: make it yours ---------- */
.end{position:absolute;z-index:6;left:6%;top:11%;width:37%;display:flex;flex-direction:column;align-items:flex-start;animation:capIn .7s var(--ease) both}
.end[hidden]{display:none}
.end .cap-title{margin-bottom:clamp(12px,1.6cqw,22px)}
.end-fld{width:100%;max-width:340px;margin:0 0 12px}
.end-fld input{background:rgba(255,255,255,.92)}
.end-cams{margin:0 0 16px;background:rgba(255,255,255,.7)}
.end-cta{width:100%;max-width:340px}
.end-fine{margin:12px 0 0;max-width:340px;font-size:13px;line-height:1.5;color:var(--ink-2)}
.end-replay{padding:0 0 0 4px;font-size:13px;white-space:nowrap}

/* ---------- the finger that presses ---------- */
.finger{position:absolute;z-index:20;left:0;top:0;width:34px;height:34px;margin:-17px 0 0 -17px;pointer-events:none;opacity:0;--ring:1}
.finger::before{content:"";position:absolute;inset:0;border-radius:50%;background:rgba(255,255,255,.82);border:1.5px solid rgba(0,0,0,.12);
  box-shadow:0 6px 16px rgba(0,0,0,.28);transition:transform .12s ease,background .12s}
.finger.down::before{transform:scale(.82);background:rgba(255,255,255,.96)}
.finger::after{content:"";position:absolute;inset:-4px;border-radius:50%;border:2px solid rgba(255,255,255,.95);
  transform:scale(calc(.85 + var(--ring) * 1.3));opacity:calc(1 - var(--ring))}

/* ---------- the chapter bar ---------- */
.bar{display:flex;align-items:center;gap:clamp(10px,1.6vw,18px);padding:12px clamp(14px,2vw,22px) 14px;border-top:1px solid var(--border-soft)}
.bar-play{position:relative;flex:0 0 auto;width:42px;height:42px;padding:0;border:0;border-radius:50%;background:var(--accent);cursor:pointer;box-shadow:0 6px 16px rgba(164,0,0,.25);transition:background .15s,transform .05s}
.bar-play:hover{background:var(--accent-strong)}
.bar-play:active{transform:translateY(1px)}
.bar-play:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.bar-play::before,.bar-play::after{content:"";position:absolute;top:50%;left:50%}
.bar-play[data-state="play"]::before{margin:-7px 0 0 -4px;border-left:13px solid #fff;border-top:7px solid transparent;border-bottom:7px solid transparent}
.bar-play[data-state="pause"]::before,.bar-play[data-state="pause"]::after{width:4px;height:14px;margin-top:-7px;border-radius:1px;background:#fff}
.bar-play[data-state="pause"]::before{margin-left:-6px}
.bar-play[data-state="pause"]::after{margin-left:2px}
.bar-play[data-state="replay"]::before{content:"\21BA";margin:-11px 0 0 -8px;color:#fff;font:700 19px/22px var(--sans)}
.bar-chs{flex:1 1 auto;display:grid;grid-template-columns:11.5fr 13fr 8.5fr 9.5fr 11fr 7fr 7fr;gap:8px;list-style:none;margin:0;padding:0;min-width:0}
.ch{display:flex;flex-direction:column;gap:7px;width:100%;padding:4px 0;border:0;background:none;text-align:left;cursor:pointer;font:500 12.5px/1.2 var(--sans);color:var(--muted)}
.ch:hover{color:var(--ink)}
.ch:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:4px}
.ch.now{color:var(--ink);font-weight:600}
.ch-name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ch-track{display:block;height:4px;border-radius:2px;background:rgba(0,0,0,.08);overflow:hidden}
.ch-track i{display:block;height:100%;background:var(--accent);border-radius:inherit;transform:scaleX(0);transform-origin:left}
.bar-now{display:none}
.bar-skip{flex:0 0 auto;color:var(--muted);padding-right:0}

/* ---------- motion off: the film still plays, it just cuts ---------- */
@media (prefers-reduced-motion:reduce){
  .film *,.film *::before,.film *::after{transition:none!important;animation:none!important}
  .finger{display:none}
}

/* ---------- phones: story on top, camera in the middle, the rest slides up from below ---------- */
@media (max-width:680px){
  .demo{padding-top:10px;padding-left:12px;padding-right:12px}
  .film{width:100%;border-radius:22px}
  .stage{aspect-ratio:10/17}
  .stage::before{background-size:420% auto;background-position:28% 0}
  .stage::after{background:linear-gradient(180deg,rgba(255,255,255,.55),rgba(255,255,255,0) 38%,rgba(255,255,255,0) 55%,rgba(255,255,255,.6)),radial-gradient(90% 60% at 50% 60%,rgba(255,255,255,0),rgba(255,255,255,.3))}
  .story{left:6%;right:6%;top:4.5%;width:auto}
  .film[data-scene="playback"] .story,.film[data-scene="day"] .story{transform:none}
  .kicker{margin-bottom:10px;font-size:11px}
  .cap-title{font-size:6.6cqw}
  .cap-text{margin-top:8px;font-size:clamp(13px,3.8cqw,15.5px)}
  .rig{left:6%;right:6%;width:auto;top:60%}
  .film[data-scene="playback"] .rig,.film[data-scene="day"] .rig,.film[data-scene="board"] .rig{transform:translateY(-50%) scale(1.02)}
  .film[data-scene="board"] .rig{top:68%}
  .film[data-beat="tall"] .rig{top:62%;transform:translateY(-50%) rotate(-90deg) scale(.8)}
  .film[data-scene="make"] .rig{top:36%;transform:translateY(-50%) scale(.74)}
  .film[data-scene="make"] .cap-text,.film[data-scene="why"] .cap-text,.film[data-scene="board"] .cap-text{display:none}
  .film[data-scene="why"] .rig{top:62%;transform:translateY(-50%)}
  .pngchip{left:6%;top:27%;padding:8px 12px 8px 8px}
  .herboard{left:6%;top:22%;width:62%;padding:10px}
  .film[data-beat="drop"] .herboard,.film[data-scene="board"][data-beat="on"] .herboard,.film[data-scene="board"][data-beat="tall"] .herboard{left:30%;top:52%}
  .film[data-beat="drop"] .pngchip,.film[data-beat="err"] .pngchip{left:38%;top:58%}
  .film[data-scene="sd"] .rig{top:44%;transform:translateY(-50%) scale(.8)}
  .film[data-scene="end"] .rig{top:27%;transform:translateY(-50%) scale(.76)}
  .phone{left:9%;top:46%;width:34%}
  .studio{left:4%;right:4%;top:auto;bottom:3%;width:auto;padding:12px 14px;font-size:clamp(10px,2.9cqw,12px)}
  .zipchip{left:6%;top:76%;padding:8px 12px 8px 8px}
  .zipchip canvas{width:44px;height:30px}
  .film[data-beat="copy"] .zipchip,.film[data-beat="copied"] .zipchip,.film[data-beat="insert"] .zipchip,.film[data-beat="inserted"] .zipchip{left:62%;top:74%}
  .sdcard{left:68%;top:70%;width:14%}
  .sd-face b{font-size:5cqw}
  .sd-face small{font-size:2cqw}
  .film[data-beat="insert"] .sdcard{left:82%;top:38%}
  .film[data-beat="inserted"] .sdcard{left:86%;top:38%}
  .sd-path{left:50%;top:91%}
  .end{left:5%;right:5%;top:auto;bottom:3%;width:auto;padding:16px;border-radius:18px;background:rgba(255,255,255,.88);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);box-shadow:0 18px 40px -18px rgba(0,0,0,.35)}
  .end .kicker{display:none}
  .end .cap-title{font-size:7cqw;margin-bottom:12px}
  .end-fld{margin-bottom:10px}
  .end-cams{width:100%;margin-bottom:12px}
  .end-cams .cam{flex:1 1 0;padding:10px 6px}
  .bar{flex-wrap:wrap;gap:10px 12px;padding:12px 14px}
  .ch-name{display:none}
  .ch{padding:8px 0}
  .bar-chs{gap:5px}
  .bar-now{display:flex;order:4;flex:1 0 100%;gap:8px;margin:0;padding-left:54px;font-size:13px;color:var(--muted)}
  .bar-now b{color:var(--accent-2)}
}
