/* Swoop and the Bike Bell: Flipsy read-along story reader */
*,*::before,*::after{box-sizing:border-box}
body{margin:0}
[hidden]{display:none!important}
img{max-width:100%}
/* Layout: a storybook — illustrated page beside (landscape) or above (portrait) a paper text panel the parent reads from. One committed night-time look. */
:root{
  --night:#141B44; --night2:#1E2A5A; --ink:#15172B;
  --paper:#FFF8EC; --paperInk:#1E2A5A; --muted:#6A6F8F;
  --sun:#FFC928; --tomato:#FF4F3F; --sky:#2FA8FF; --grass:#3DCB6C; --bubble:#FF7AC6;
  --display:'Bagel Fat One', 'Arial Rounded MT Bold', system-ui, sans-serif;
  --read:'Andika', 'Trebuchet MS', system-ui, sans-serif;
  color-scheme: dark;
}
html,body{height:100%}
body{background:var(--night);color:#F4EEDD;font-family:var(--read);overflow:hidden;-webkit-tap-highlight-color:transparent}
.app{height:100%;box-sizing:border-box;display:flex;flex-direction:column;gap:10px;
  padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));padding-block:10px}

/* top bar */
.bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex:0 0 auto}
.brand{display:flex;align-items:baseline;gap:12px;min-width:0}
.wm{text-decoration:none;font-family:var(--display);font-size:22px;letter-spacing:.02em;display:inline-block;transform:rotate(180deg);
  background:linear-gradient(90deg,var(--tomato) 0 20%,var(--sun) 20% 40%,var(--grass) 40% 60%,var(--sky) 60% 80%,var(--bubble) 80% 100%);
  -webkit-background-clip:text;background-clip:text;color:transparent}
.btitle{font-size:15px;color:#C9CCE8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tools{display:flex;gap:8px}
.tool{display:flex;align-items:center;gap:6px;height:40px;padding:0 14px;border-radius:20px;border:2px solid #3A4585;background:transparent;color:#DDE0F5;font:600 14px var(--read);cursor:pointer}
.tool svg{width:18px;height:18px;flex:none}
.tool[aria-pressed="true"]{background:var(--sun);border-color:var(--sun);color:var(--ink)}
.tool:focus-visible,.nav button:focus-visible,.dot:focus-visible,.endbtn:focus-visible{outline:3px solid var(--sky);outline-offset:2px}
@media (max-width:560px){.tool span{display:none}.tool{padding:0 10px}.btitle{display:none}}

/* book */
.book{flex:1 1 auto;min-height:0;display:flex;flex-direction:column;gap:12px;touch-action:pan-y}
.artwrap{flex:1 1 56%;min-height:0;display:grid;place-items:center;container-type:size}
.art{position:relative;width:min(100cqw,133.33cqh);aspect-ratio:4/3;max-width:100%;border-radius:20px;overflow:hidden;background:#BFE6FF;
  box-shadow:0 0 0 4px var(--ink),0 18px 40px rgba(0,0,0,.45)}
.page{position:absolute;inset:0;opacity:0;transition:opacity .5s ease}
.page.show{opacity:1}
.page svg{display:block;width:100%;height:100%}

.panel{flex:0 1 auto;max-height:46%;min-height:0;overflow:auto;background:var(--paper);color:var(--paperInk);border-radius:20px;
  padding:20px 24px 16px;display:flex;flex-direction:column;gap:14px;box-shadow:0 0 0 4px var(--ink)}
.story{margin:0;font-size:clamp(20px,2.3vw + 8px,30px);line-height:1.45;text-wrap:pretty;max-width:34ch;transition:opacity .3s}
.story.fade{opacity:0}
.sfx{font-family:var(--display);color:var(--tomato);letter-spacing:.02em;font-weight:400}
.story em{font-style:normal;font-weight:700;text-decoration:underline;text-decoration-color:var(--sun);text-decoration-thickness:4px;text-underline-offset:3px}
.say{color:#2B3A8A}
.tip{display:flex;gap:10px;align-items:flex-start;background:#FFF0C9;border-radius:14px;padding:10px 14px;font-size:16px;line-height:1.4;color:#4A4030;max-width:46ch}
.tip svg{width:20px;height:20px;flex:none;margin-top:1px}
.tip b{display:block;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#9A7B1F;margin-bottom:1px}
body.notips .tip{display:none}
.endrow{display:flex;flex-wrap:wrap;gap:10px}
.endbtn{display:inline-flex;align-items:center;gap:8px;height:46px;padding:0 20px;border-radius:23px;border:3px solid var(--ink);background:var(--sun);color:var(--ink);font:700 17px var(--read);text-decoration:none;cursor:pointer}
.endbtn.alt{background:#fff}
.nav{margin-top:auto;display:flex;align-items:center;gap:12px;padding-top:4px}
.nav button.arrow{width:52px;height:52px;border-radius:50%;border:3px solid var(--ink);background:#fff;color:var(--ink);display:grid;place-items:center;cursor:pointer;flex:none}
.nav button.next{width:auto;padding:0 22px 0 24px;border-radius:26px;background:var(--sun);gap:8px;display:flex;align-items:center;font:700 18px var(--read)}
.nav button:disabled{opacity:.3;cursor:default}
.nav svg{width:22px;height:22px}
.dots{flex:1;display:flex;justify-content:center;gap:6px;flex-wrap:wrap;min-width:0}
.dot{width:10px;height:10px;border-radius:50%;border:2px solid var(--paperInk);background:transparent;padding:0;cursor:pointer}
.dot.on{background:var(--paperInk)}

@media (min-aspect-ratio:5/4) and (min-width:700px){
  .book{flex-direction:row;align-items:stretch}
  .artwrap{flex:1.55 1 0}
  .panel{flex:1 1 0;max-height:none;justify-content:center;padding:28px 30px 20px}
  .story{font-size:clamp(20px,1.5vw + 8px,30px)}
}

/* bedtime mode: dimmer, warmer, no bright paper */
body.bedtime .art{filter:brightness(.72) sepia(.28) saturate(.85)}
body.bedtime .panel{background:#2C2645;color:#F2E2BF}
body.bedtime .say{color:#FFD98A}
body.bedtime .tip{background:#3A3258;color:#E8DCC0}
body.bedtime .tip b{color:#E9C46A}
body.bedtime .dot{border-color:#F2E2BF}
body.bedtime .dot.on{background:#F2E2BF}
body.bedtime .story em{text-decoration-color:#9C7B2A}

/* ---- scene animation (inside SVG) ---- */
.blink,.hint,.pop,.wat,.bellg,.ties,.zoom,.slow,.fly,.note,.cnt,.cloud,.lf{transform-box:fill-box}
.blink{transform-origin:center;animation:blink 5s infinite}
@keyframes blink{0%,91%,100%{transform:scaleY(1)}94%{transform:scaleY(.08)}97%{transform:scaleY(1)}}
.hint{transform-origin:center;animation:hint 1.8s ease-out infinite;pointer-events:none}
@keyframes hint{0%{transform:scale(.8);opacity:1}100%{transform:scale(1.35);opacity:0}}
.pop{opacity:0;transform-origin:50% 100%;transform:scale(.6);transition:opacity .25s,transform .35s cubic-bezier(.3,1.6,.5,1)}
.say-on .pop{opacity:1;transform:scale(1)}
.say-on .q2{transition-delay:.5s}
.cloud{animation:drift 14s ease-in-out infinite alternate}
.cloud.c2{animation-duration:18s}
@keyframes drift{to{transform:translateX(40px)}}
.wat{transform-origin:50% 100%}
.shake{animation:shake .6s ease-in-out}
@keyframes shake{20%{transform:rotate(-6deg)}40%{transform:rotate(5deg)}60%{transform:rotate(-4deg)}80%{transform:rotate(2deg)}}
.bellg{transform-origin:50% 0}
.ring{animation:ring .6s ease-in-out}
@keyframes ring{20%{transform:rotate(-24deg) scale(1.3)}40%{transform:rotate(20deg) scale(1.3)}60%{transform:rotate(-14deg)}80%{transform:rotate(8deg)}}
.ties{transform-origin:50% 100%}
.wob .ties{animation:tiewob .3s ease-in-out 4}
@keyframes tiewob{25%{transform:rotate(-8deg)}75%{transform:rotate(8deg)}}
.zoom{animation:zoom 4.2s linear infinite}
.zoom.once{animation-iteration-count:1}
@keyframes zoom{from{transform:translateX(0)}to{transform:translateX(1300px)}}
.slow{animation:zoom 13s linear infinite}
.fly{animation:fly 7s ease-in-out infinite;opacity:0}
.fly.f2{animation-duration:8s}
@keyframes fly{0%{transform:translate(860px,60px);opacity:1}35%{transform:translate(560px,170px)}55%{transform:translate(420px,90px)}100%{transform:translate(-120px,140px);opacity:1}}
.note{fill:#1E2A5A;font-family:'Bagel Fat One',sans-serif;opacity:0;animation:note 3s ease-out infinite}
.note.once{animation-iteration-count:1}
@keyframes note{0%{opacity:0;transform:translate(0,0) scale(.6)}20%{opacity:1}100%{opacity:0;transform:translate(-50px,-110px) scale(1.2)}}
.cnt{transform-origin:center;animation:cnt .45s cubic-bezier(.3,1.6,.5,1)}
@keyframes cnt{from{transform:scale(.4);opacity:0}}
.povB{opacity:0;transition:opacity .6s}
.povA{transition:opacity .6s}
.pov .povB{opacity:1}.pov .povA{opacity:0}
.lf{transform-origin:50% 100%;animation:leaf 4s ease-in-out infinite}
@keyframes leaf{50%{transform:rotate(1.5deg)}}

@media (prefers-reduced-motion:reduce){
  .art svg *,.front svg *{animation:none!important;transition:none!important}
  .page,.fpage,.story{transition:none}
  /* with animations switched off, park the bikes on the path instead of leaving them off-screen */
  .art svg .zoom{transform:translateX(720px)}
  .art svg .zoom~.zoom{transform:translateX(450px)}
  .art svg .zoom.once{display:none}
  .art svg .slow{transform:translateX(560px)}
  .art svg .fly{opacity:1;transform:translate(560px,120px)}
  .art svg .note{opacity:1}
}
.front{position:absolute;inset:0;z-index:6;pointer-events:none}
.fpage{position:absolute;inset:0;opacity:0;transition:opacity .5s ease}
.fpage.show{opacity:1}
.fpage svg{display:block;width:100%;height:100%}


/* Flipsy (Rive) hiding on each page */
.flipsy{position:absolute;z-index:7;aspect-ratio:4/5;transition:left .5s ease,top .5s ease,width .5s ease,opacity .3s}
.flipsy canvas{position:absolute;inset:0;width:100%;height:100%;display:block}
.flipsy .hit{cursor:pointer;touch-action:manipulation}
.flipsy.off{opacity:0;pointer-events:none}
.found{display:inline-flex;align-items:center;gap:6px;height:40px;padding:0 14px;border-radius:20px;background:#232C66;color:#F4EEDD;font:700 14px var(--read);white-space:nowrap}
.found b{font-family:var(--display);font-weight:400;font-size:16px;color:var(--sun)}
.found.bump{animation:fpop .5s cubic-bezier(.3,1.6,.5,1)}
@keyframes fpop{40%{transform:scale(1.15)}}
@media (max-width:560px){.found .lbl{display:none}}

/* Swoop: his picture until swoop.riv (Rive) is uploaded */
.swoopR{position:absolute;z-index:4;aspect-ratio:420/688;transition:left .5s ease,top .5s ease,width .5s ease,opacity .35s;cursor:pointer;touch-action:manipulation}
.swoopR.off{opacity:0;pointer-events:none}
.swoopR img,.swoopR canvas{position:absolute;inset:0;width:100%;height:100%;display:block;transform-origin:50% 100%}
.swoopR canvas{display:none}
.swoopR.rive canvas{display:block}.swoopR.rive img{display:none}
/* the Rive artboard has spare room around Swoop for his moves: scale him up to the same size as his picture */
.swoopR.rive canvas{transform:translateY(3.5%) scale(1.45);transform-origin:50% 100%}
.swoopR.bob img{animation:sbob 2.8s ease-in-out infinite}
@keyframes sbob{50%{transform:translateY(-2.5%) rotate(-1deg)}}
.swoopR.shiver img{animation:shiv .16s linear infinite}
@keyframes shiv{0%,100%{transform:translateX(-1.5%)}50%{transform:translateX(1.5%)}}
.swoopR.peekup img{animation:peekup 1.2s ease-in-out}
@keyframes peekup{30%,70%{transform:translateY(-22%)}}
.swoopR.sing img{animation:sing 1.4s ease-in-out infinite}
.swoopR.singing img{animation:sing .5s ease-in-out 3}
@keyframes sing{50%{transform:rotate(-6deg) translateY(-2%)}}
.swoopR.tiewob img{animation:squash .45s cubic-bezier(.3,1.6,.5,1)}
@keyframes squash{40%{transform:scale(1.05,.95)}}
.swoopR .ring{position:absolute;left:58%;top:9%;width:62%;aspect-ratio:1;transform:translate(-50%,-50%);border-radius:50%;border:4px dashed var(--tomato);pointer-events:none;animation:ringp 1.8s ease-out infinite}
@keyframes ringp{0%{transform:translate(-50%,-50%) scale(.8);opacity:1}100%{transform:translate(-50%,-50%) scale(1.3);opacity:0}}
@media (prefers-reduced-motion:reduce){.swoopR img{animation:none!important}.swoopR .ring{animation:none}}

