/* Beluga Wigs — POMU theme. Layout is the 440px Figma frame scaled by --u; nothing in the design is moved.
   Extra sea decoration lives in .sea-bg (behind) or as small add-ons that never shift a designed element. */
@font-face{font-family:'Billa Mount';src:url(fonts/billa-mount.woff2) format('woff2'),url(fonts/billa-mount.woff) format('woff');font-display:swap}
@font-face{font-family:'bellisa';src:url(fonts/bellisa.woff2) format('woff2'),url(fonts/bellisa.woff) format('woff');font-display:swap}
@font-face{font-family:'Ryder';src:url(fonts/ryder.woff2) format('woff2'),url(fonts/ryder.woff) format('woff');font-weight:500;font-display:swap}
@font-face{font-family:'CHT APPLE PIE';src:url(fonts/cht-apple-pie.woff2) format('woff2'),url(fonts/cht-apple-pie.woff) format('woff');font-display:swap}
@font-face{font-family:'Anak Baik';src:url(fonts/anak-baik.woff2) format('woff2'),url(fonts/anak-baik.woff) format('woff');font-display:swap}
@font-face{font-family:'Heart Paerlies';src:url(fonts/heart-paerlies.woff2) format('woff2'),url(fonts/heart-paerlies.woff) format('woff');font-display:swap}

:root{
  --u:calc(min(100vw,440px) / 440);
  --paper:#fdfeff; --mist:#b2c7e0; --ink:#6b88ab; --foam:#dde6f1; --ice:#f4faff; --hue:#b3c8e1;
  --paid:#6bab6e; --dep:#d9a75a; --unpaid:#b2c7e0;
  --f-ryder:'Ryder','Mali',ui-rounded,system-ui,sans-serif;
  --f-num:'CHT APPLE PIE','Mali','Ryder',ui-rounded,sans-serif;
  --f-anak:'Anak Baik','Ryder','Mali',ui-rounded,sans-serif;
  --f-cera:'Cera Round Pro','Quicksand','Mali',ui-rounded,sans-serif;
  color-scheme:light;
}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;background:var(--paper);color:var(--ink)}
body{min-height:100vh;overflow-x:hidden;font-family:var(--f-ryder)}
img{display:block;max-width:none;user-select:none;-webkit-user-drag:none}
button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer}
[hidden]{display:none!important}
p{margin:0}

/* ---------- frame + positioning helpers ---------- */
.stage{position:relative;width:calc(440 * var(--u));margin:0 auto;height:calc(var(--H,956) * var(--u));z-index:2}
.ab{position:absolute;left:calc(var(--x) * var(--u));top:calc(var(--y) * var(--u));width:calc(var(--w) * var(--u));height:calc(var(--h) * var(--u))}
.ab>img:not(.ab){width:100%;height:100%}
img.ab{object-fit:fill}
.tc{width:auto;height:auto;transform:translate(-50%,-50%);white-space:nowrap}
.ryder{font-family:var(--f-ryder);font-weight:500;font-size:calc(var(--fs) * var(--u));line-height:calc(15 * var(--u));color:var(--ink)}
.ltr{width:auto;height:auto;font-size:calc(96 * var(--u));line-height:normal;color:var(--mist);white-space:nowrap}
.billa{font-family:'Billa Mount',cursive}
.bellisa{font-family:'bellisa',cursive}
.page{position:absolute;inset:0}
.page.in{animation:pageIn .7s cubic-bezier(.2,.8,.2,1)}
@keyframes pageIn{from{opacity:0;transform:translateY(calc(14 * var(--u)))}}

/* ---------- ambient sea (behind the frame, also fills desktop sides) ---------- */
.sea-bg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;
  background:var(--paper)}
.rays{position:absolute;left:-30%;right:-30%;top:-10%;height:80%;opacity:.28;
  background:repeating-linear-gradient(103deg,transparent 0 60px,rgba(221,230,241,.55) 60px 96px,transparent 96px 170px);
  -webkit-mask-image:linear-gradient(#000,transparent);mask-image:linear-gradient(#000,transparent);animation:rays 14s ease-in-out infinite alternate}
@keyframes rays{to{transform:translateX(60px) skewX(-3deg)}}
.caustic{position:absolute;width:70vmax;height:70vmax;border-radius:50%;filter:blur(40px);opacity:.3;mix-blend-mode:multiply}
.caustic.c1{left:-20vmax;top:30%;background:radial-gradient(circle,#e7eff8 0,transparent 65%);animation:drift1 22s ease-in-out infinite alternate}
.caustic.c2{right:-25vmax;top:-10%;background:radial-gradient(circle,#e9f1f9 0,transparent 60%);animation:drift2 26s ease-in-out infinite alternate}
@keyframes drift1{to{transform:translate(18vw,-12vh) scale(1.15)}}
@keyframes drift2{to{transform:translate(-14vw,20vh) scale(.9)}}
#bubbles{position:absolute;inset:0;width:100%;height:100%}
.swimmers{position:absolute;inset:0}
.swim{position:absolute;left:0;width:22px;opacity:.22;animation:swimAcross linear forwards}
.swim img{width:100%;height:auto;animation:wiggle 1.6s ease-in-out infinite}
.swim.rev img{transform:scaleX(-1)}
@keyframes swimAcross{from{transform:translateX(var(--from))}to{transform:translateX(var(--to))}}
@keyframes wiggle{50%{translate:0 -4px}}

/* ---------- header ---------- */
.twinkle-l{animation:letterGlow 6s ease-in-out infinite}
.twinkle-l.d1{animation-delay:-1.5s}.twinkle-l.d2{animation-delay:-3s}.twinkle-l.d3{animation-delay:-4.5s}
@keyframes letterGlow{50%{text-shadow:0 0 calc(10*var(--u)) rgba(221,230,241,.95),0 0 calc(2*var(--u)) #fff}}
.fishtop{animation:fishBob 4.5s ease-in-out infinite;transform-origin:30% 60%}
@keyframes fishBob{25%{transform:translate(calc(-3*var(--u)),calc(-4*var(--u))) rotate(-4deg)}75%{transform:translate(calc(2*var(--u)),calc(2*var(--u))) rotate(3deg)}}
.heart{animation:heartBob 6s ease-in-out infinite}
@keyframes heartBob{50%{transform:translateY(calc(-6*var(--u)))}}
.hframe{filter:drop-shadow(0 calc(2*var(--u)) calc(3*var(--u)) rgba(0,0,0,.08))}
.hphoto{animation:photoShine 7s ease-in-out infinite}
@keyframes photoShine{50%{filter:brightness(1.06) contrast(1.03)}}
.ribbon{transform-origin:46% 20%;animation:ribbon 5s ease-in-out infinite}
@keyframes ribbon{30%{transform:rotate(-2.5deg)}70%{transform:rotate(2deg) translateY(calc(1*var(--u)))}}
.spark{position:absolute;width:calc(12*var(--u));height:calc(12*var(--u));opacity:0;
  background:radial-gradient(circle,#fff 0 18%,transparent 20%),conic-gradient(from 45deg,transparent 0 22%,#fff 24% 26%,transparent 28% 47%,#fff 49% 51%,transparent 53% 72%,#fff 74% 76%,transparent 78% 97%,#fff 99%);
  filter:drop-shadow(0 0 2px #b2c7e0);animation:spark 3.6s ease-in-out infinite}
.spark.s1{left:8%;top:30%}.spark.s2{right:6%;top:46%;animation-delay:-.9s}.spark.s3{left:36%;bottom:4%;animation-delay:-1.8s}.spark.s4{right:24%;top:6%;animation-delay:-2.7s}
@keyframes spark{0%,60%,100%{opacity:0;transform:scale(.3) rotate(0)}30%{opacity:1;transform:scale(1) rotate(45deg)}}
.braille{animation:brailleTw 5s ease-in-out infinite}
@keyframes brailleTw{50%{opacity:.72;filter:drop-shadow(0 0 3px rgba(221,230,241,.9))}}
.pearls{overflow:hidden}
.pearls img{width:100%;height:100%}
.pearls .glint{display:none;position:absolute;inset:0;background:linear-gradient(105deg,transparent 40%,rgba(255,255,255,.95) 50%,transparent 60%) 0 0/250% 100% no-repeat;
  -webkit-mask:url(a/pearls.webp) center/100% 100%;mask:url(a/pearls.webp) center/100% 100%;mix-blend-mode:screen;animation:glint 5.5s ease-in-out infinite}
@keyframes glint{0%{background-position:150% 0}60%,100%{background-position:-60% 0}}
.school{animation:school 9s ease-in-out infinite}
@keyframes school{50%{transform:translate(calc(8*var(--u)),calc(-3*var(--u)))}}

/* ---------- home ---------- */
.infobox{animation:float 7s ease-in-out infinite}
@keyframes float{50%{transform:translateY(calc(-4*var(--u)))}}
.ibg{background:rgba(255,255,255,.5);border:.5px solid var(--mist);border-radius:calc(20*var(--u))}
.ititle{line-height:normal;transform:translate(-50%,-100%);top:calc((var(--y) + 11) * var(--u))}
.itext{line-height:calc(var(--fs) * 15 / 14 * var(--u));display:flex;align-items:center;justify-content:center;text-align:center;overflow:hidden;word-break:break-word}
.ib-bub{position:absolute;border-radius:50%;border:1px solid rgba(178,199,224,.7);background:radial-gradient(circle at 30% 30%,#fff,rgba(255,255,255,.1));animation:ibRise 6s ease-in infinite;opacity:0}
.ib-bub.a{width:calc(7*var(--u));height:calc(7*var(--u));right:calc(8*var(--u));bottom:calc(6*var(--u))}
.ib-bub.b{width:calc(5*var(--u));height:calc(5*var(--u));right:calc(18*var(--u));bottom:calc(4*var(--u));animation-delay:-2s}
.ib-bub.c{width:calc(4*var(--u));height:calc(4*var(--u));left:calc(10*var(--u));bottom:calc(8*var(--u));animation-delay:-4s}
@keyframes ibRise{10%{opacity:1}100%{opacity:0;transform:translateY(calc(-60*var(--u)))}}
.menubox{background:var(--ice);border:.5px solid var(--mist);border-radius:calc(20*var(--u))}
.mbtn{background:rgba(255,255,255,.7);border:.5px solid var(--mist);border-radius:calc(13*var(--u));display:grid;place-items:center;transition:transform .25s cubic-bezier(.3,1.6,.5,1),box-shadow .25s}
.mbtn span{line-height:calc(15*var(--u));display:block;transform:translateY(calc(1*var(--u)))}
.mbtn:hover{transform:translateY(calc(-2*var(--u)));box-shadow:0 calc(4*var(--u)) calc(10*var(--u)) rgba(107,136,171,.18)}
.mbtn:active{transform:scale(.95)}
.bwhale{animation:breathe 5s ease-in-out infinite;transform-origin:center bottom}
@keyframes breathe{50%{transform:scale(1.03) translateY(calc(-2*var(--u)));opacity:.85}}
.pic{border-radius:50%;animation:float 5s ease-in-out infinite;transition:transform .3s}
.pic img{width:100%;height:100%}
.pic.f2{animation-duration:6s;animation-delay:-1s}.pic.f3{animation-duration:4.4s;animation-delay:-2s}.pic.f4{animation-duration:5.6s;animation-delay:-.5s}.pic.f5{animation-duration:4.8s;animation-delay:-3s}.pic.f6{animation-duration:6.4s;animation-delay:-1.6s}
.pic:hover{transform:scale(1.06)}
.hp{font-family:'Heart Paerlies',cursive;font-size:calc(20*var(--u));line-height:normal;letter-spacing:calc(-1.2*var(--u));color:var(--ink);
  text-shadow:0 0 calc(4*var(--u)) rgba(107,136,171,.25);width:auto;height:auto;transform:translateX(-50%);white-space:nowrap;pointer-events:none}

/* ---------- gallery ---------- */
.gtab{background:#fff;border:.5px solid var(--mist);border-radius:calc(9*var(--u));display:grid;place-items:center;transition:background .25s,transform .25s}
.gtab span{line-height:calc(15*var(--u))}
.gtab.on{background:var(--foam)}
.gtab:active{transform:scale(.95)}
.gcell{background:#fff;border:.5px solid var(--mist);border-radius:calc(13*var(--u));animation:cellIn .5s cubic-bezier(.2,.8,.2,1) both;animation-delay:calc(var(--i)*45ms);transition:transform .3s}
.gcell:hover{transform:translateY(calc(-3*var(--u)))}
.ab.gcell>img{position:absolute;left:calc(7*var(--u));top:calc(7*var(--u));width:calc(85*var(--u));height:calc(85*var(--u));border-radius:calc(10*var(--u));object-fit:cover}
@keyframes cellIn{from{opacity:0;scale:.9}}
.gempty{left:0;right:0;width:auto;text-align:center}

/* ---------- queue: sonar ---------- */
.sm{line-height:calc(15*var(--u))}
.glow6{border-radius:50%;background:rgba(183,200,220,.5);filter:blur(calc(50*var(--u)))}
.glow11{border-radius:50%;background:#fff;filter:blur(calc(50*var(--u)))}
.ring{animation:ringBreath 4s ease-in-out infinite}
.ring.r2{animation-delay:-.6s}.ring.r3{animation-delay:-1.2s}.ring.r4{animation-delay:-1.8s}
@keyframes ringBreath{50%{transform:scale(1.025);opacity:.75}}
.pulse b{position:absolute;inset:0;border-radius:50%;border:1px solid rgba(178,199,224,.75);opacity:0;animation:pulse 4.5s ease-out infinite}
.pulse b:nth-child(2){animation-delay:1.5s}.pulse b:nth-child(3){animation-delay:3s}
@keyframes pulse{0%{opacity:.9;transform:scale(.6)}100%{opacity:0;transform:scale(2.15)}}
.sonar.pinging .pulse b{animation:pingWave 1.6s ease-out;border-color:rgba(107,136,171,.8);border-width:1.5px}
.sonar.pinging .pulse b:nth-child(2){animation-delay:.35s}.sonar.pinging .pulse b:nth-child(3){animation-delay:.7s}
@keyframes pingWave{0%{opacity:1;transform:scale(.5)}100%{opacity:0;transform:scale(2.6)}}
.sbeluga{animation:belBob 4s ease-in-out infinite;transform-origin:55% 60%;cursor:pointer}
@keyframes belBob{50%{transform:translateY(calc(-4*var(--u))) rotate(-2deg)}}
.sbeluga.sing{animation:sing .7s ease}
@keyframes sing{30%{transform:rotate(-8deg) scale(1.06)}60%{transform:rotate(4deg) scale(1.02)}}
.sfish{position:absolute;width:calc(11.6*var(--u));height:calc(9.3*var(--u));left:calc(var(--x)*var(--u));top:calc(var(--y)*var(--u))}
.sfish img{animation:tail var(--wd,.6s) ease-in-out infinite alternate}
@keyframes tail{to{rotate:6deg}}
.sfish img{width:100%;height:100%;transition:filter .2s}
.sfish.rev{transform:scaleX(-1)}
@keyframes fishLoop{25%{translate:calc(var(--dx)*var(--u)) calc(-2*var(--u))}50%{translate:0 calc(-3*var(--u))}75%{translate:calc(var(--dx)*-.6*var(--u)) calc(-1*var(--u))}}
.sfish.flash img{filter:brightness(.7) saturate(1.6) drop-shadow(0 0 3px #fff)}
.sfish.lit img{filter:brightness(.62) saturate(1.8) drop-shadow(0 0 4px #fff) drop-shadow(0 0 6px #b2c7e0)}
.sfish.lit{animation:litFish 1.2s ease-in-out infinite}
@keyframes litFish{50%{transform:scale(1.5)}}

.qinput{background:rgba(178,199,224,.2);border:0;border-radius:calc(9*var(--u));text-align:center;outline:none;padding:0 calc(8*var(--u));color:var(--ink);transition:box-shadow .25s,background .25s}
.qinput::placeholder{color:rgba(107,136,171,.5)}
.qinput:focus{background:rgba(178,199,224,.3);box-shadow:0 0 0 calc(2*var(--u)) rgba(221,230,241,.9)}
.qping{background:var(--mist);border-radius:calc(9*var(--u));color:#fff;display:grid;place-items:center;transition:transform .25s cubic-bezier(.3,1.6,.5,1),background .25s}
.qping span{line-height:calc(15*var(--u))}
.qping:hover{background:#a4bbd7}
.qping:active{transform:scale(.92)}
.qping[disabled]{opacity:.7}

.qchip{background:#fff;border:.5px solid var(--foam);border-radius:calc(10*var(--u));transition:background .25s,transform .25s}
.qchip span{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:calc(14*var(--u));line-height:calc(15*var(--u));white-space:nowrap}
.qchip.on{background:var(--foam)}
.qchip:active{transform:scale(.94)}

/* ---------- queue row (Figma "queue") — coordinates are relative to the row's top (y = 762.38) ---------- */
.qrow{position:absolute;left:0;width:calc(440*var(--u));height:calc(110*var(--u));animation:rowIn .6s cubic-bezier(.2,.8,.2,1) both calc(var(--i)*70ms),rowFloat 6s ease-in-out infinite var(--fl,0s)}
@keyframes rowFloat{50%{translate:0 calc(-2.5*var(--u))}}
@keyframes rowIn{from{opacity:0;transform:translateY(calc(16*var(--u)))}}
.qcard{background:#fff;border:.5px solid var(--foam);border-radius:calc(15*var(--u));transition:box-shadow .35s}
.qrow.mine .qcard{box-shadow:0 0 0 calc(1.5*var(--u)) var(--mist),0 0 calc(16*var(--u)) rgba(107,136,171,.35)}
.qstar{animation:starSpin 1s cubic-bezier(.2,.8,.2,1) both calc(var(--i)*70ms + 120ms),starRock 5s ease-in-out infinite 1.2s}
@keyframes starRock{50%{rotate:9deg;scale:1.04}}
@keyframes starSpin{from{transform:rotate(-80deg) scale(.4);opacity:0}}
.qrow:hover .qstar{animation:starWobble .8s ease}
@keyframes starWobble{40%{transform:rotate(10deg) scale(1.05)}}
.qno{font-family:var(--f-num);font-size:calc(30*var(--u));line-height:calc(15*var(--u));color:#fff;transform:translate(-50%,-50%) rotate(7.19deg);white-space:nowrap;text-shadow:0 1px 2px rgba(107,136,171,.25)}
.qfb{font-family:var(--f-anak);font-size:calc(11*var(--u));line-height:calc(15*var(--u));color:var(--ink);transform:translateY(-50%);white-space:nowrap;max-width:calc(240*var(--u));overflow:hidden;text-overflow:ellipsis}
.qcat{font-family:var(--f-cera);font-weight:400;font-size:calc(9*var(--u));line-height:calc(15*var(--u));color:var(--ink);transform:translateY(-50%);white-space:nowrap;max-width:calc(76*var(--u));overflow:hidden;text-overflow:ellipsis}
.qbadge{background:#fff;border-radius:calc(20*var(--u));box-shadow:0 0 calc(2*var(--u)) rgba(107,136,171,.25)}
.qbadge span{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-family:var(--f-anak);font-size:calc(5*var(--u));line-height:calc(15*var(--u));color:var(--mist);white-space:nowrap}
.qpay{border-radius:calc(20*var(--u));background:var(--pc,var(--paid))}
.qpay span{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-family:var(--f-anak);font-size:calc(9*var(--u));line-height:calc(15*var(--u));color:#fff;white-space:nowrap}
.qdate{font-family:'Zen Maru Gothic',var(--f-cera);font-size:calc(5*var(--u));line-height:calc(7*var(--u));color:var(--ink);transform:translateY(-50%);white-space:nowrap}
.qline{opacity:.9}
.shell{transition:transform .3s}
.shell.now{animation:shellNow 1.8s ease-in-out infinite}
@keyframes shellNow{50%{transform:scale(1.35) translateY(calc(-1*var(--u)));filter:drop-shadow(0 0 2px #b2c7e0)}}
.slbl{font-family:var(--f-ryder);font-weight:500;font-size:calc(4*var(--u));line-height:calc(3*var(--u));color:var(--ink);transform:translate(-50%,-50%);text-align:center;white-space:nowrap}
.slbl.now{font-weight:700}
.anchor{transform-origin:50% 8%;animation:anchor 4s ease-in-out infinite}
@keyframes anchor{50%{transform:rotate(6deg)}}
.qempty{left:0;width:calc(440*var(--u));text-align:center;font-size:calc(14*var(--u))}

/* ---------- bottom wave + nav ---------- */
.wave{position:absolute;left:0;width:calc(440*var(--u));top:calc((var(--H,956) - 172) * var(--u));height:calc(172*var(--u));overflow:hidden;pointer-events:none;z-index:-1}
.wave img{width:100%;height:100%;opacity:.6;animation:waveSway 9s ease-in-out infinite;transform-origin:50% 100%}
@keyframes waveSway{50%{transform:translateX(calc(-6*var(--u))) scale(1.02)}}
.wave .foam{position:absolute;inset:0;background:radial-gradient(circle at 20% 80%,rgba(255,255,255,.5) 0 2px,transparent 3px) 0 0/calc(40*var(--u)) calc(30*var(--u));opacity:.5;animation:foam 6s linear infinite}
@keyframes foam{to{background-position:calc(40*var(--u)) calc(-30*var(--u))}}
.nav{position:fixed;left:50%;bottom:calc(47 * var(--u) + env(safe-area-inset-bottom,0px));transform:translateX(-50%);width:calc(309*var(--u));height:calc(43*var(--u));
  background:rgba(255,255,255,.7);border-radius:calc(20*var(--u));box-shadow:0 0 calc(10*var(--u)) rgba(107,136,171,.25);z-index:30;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.nb{position:absolute;top:0;height:100%;width:calc(103*var(--u))}
.nb:nth-child(1){left:0}.nb:nth-child(2){left:calc(103*var(--u))}.nb:nth-child(3){left:calc(206*var(--u))}
.nb span{position:absolute;top:calc(25*var(--u));transform:translateX(-50%);font:500 calc(10*var(--u))/normal 'Inter',system-ui,sans-serif;color:var(--ink);text-shadow:0 0 calc(4*var(--u)) rgba(107,136,171,.25);white-space:nowrap}
.nb:nth-child(1) span{left:calc(68.5*var(--u))}.nb:nth-child(2) span{left:calc(51.5*var(--u))}.nb:nth-child(3) span{left:calc(41.5*var(--u))}
.ni{position:absolute;top:calc(2*var(--u))}
.nb1{left:calc(49*var(--u));width:calc(36*var(--u));height:calc(27*var(--u))}
.nb2{left:calc(38*var(--u));width:calc(26*var(--u));height:calc(27*var(--u))}
.nb3{left:calc(28.64*var(--u));top:calc(2.24*var(--u));width:calc(25.7*var(--u));height:calc(24.95*var(--u))}
.nb.hop .ni{animation:hop .5s cubic-bezier(.3,1.6,.5,1)}
@keyframes hop{40%{transform:translateY(calc(-5*var(--u))) rotate(-6deg)}}
.nb:focus-visible,.mbtn:focus-visible,.gtab:focus-visible,.qchip:focus-visible,.qping:focus-visible,.pic:focus-visible,.gcell:focus-visible{outline:2px solid var(--ink);outline-offset:2px}

/* ---------- sheet (contact + lightbox) ---------- */
.sheet{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-end;justify-content:center;background:rgba(107,136,171,0);transition:background .35s}
.sheet.in{background:rgba(107,136,171,.25)}
.pn{position:relative;width:calc(440*var(--u));max-height:85vh;overflow:auto;background:rgba(253,254,255,.96);border-radius:calc(24*var(--u)) calc(24*var(--u)) 0 0;
  padding:calc(12*var(--u)) calc(22*var(--u)) calc(28*var(--u) + env(safe-area-inset-bottom,0px));transform:translateY(100%);transition:transform .45s cubic-bezier(.2,.8,.2,1);
  box-shadow:0 calc(-6*var(--u)) calc(24*var(--u)) rgba(107,136,171,.25)}
.sheet.in .pn{transform:none}
.pn .grab{width:calc(44*var(--u));height:calc(4*var(--u));border-radius:4px;background:var(--foam);margin:0 auto calc(10*var(--u))}
.chead{position:relative;text-align:center;margin:calc(2*var(--u)) 0 calc(16*var(--u))}
.chead h3{margin:0;font:400 calc(46*var(--u))/1.05 'bellisa',cursive;color:var(--ink);animation:cTitle .8s cubic-bezier(.2,.8,.2,1) both .1s}
.chead p{margin:calc(4*var(--u)) 0 0;font:500 calc(12*var(--u))/1.5 var(--f-ryder);color:var(--mist);animation:cTitle .8s cubic-bezier(.2,.8,.2,1) both .2s}
.cfish{position:absolute;right:calc(36*var(--u));top:calc(-4*var(--u));width:calc(46*var(--u));height:auto;animation:fishBob 4s ease-in-out infinite}
.cpearls{display:flex;justify-content:center;gap:calc(5*var(--u));margin-top:calc(10*var(--u))}
.cpearls i{width:calc(6*var(--u));height:calc(6*var(--u));border-radius:50%;background:radial-gradient(circle at 35% 30%,#fff 0 30%,#e3eaf2 60%,#c9d6e5);box-shadow:0 1px 2px rgba(107,136,171,.25);animation:pearlPop .5s cubic-bezier(.3,1.6,.5,1) both}
.cpearls i:nth-child(1){animation-delay:.3s}.cpearls i:nth-child(2){animation-delay:.36s}.cpearls i:nth-child(3){width:calc(9*var(--u));height:calc(9*var(--u));animation-delay:.42s}.cpearls i:nth-child(4){animation-delay:.48s}.cpearls i:nth-child(5){animation-delay:.54s}
@keyframes cTitle{from{opacity:0;transform:translateY(calc(10*var(--u)))}}
@keyframes pearlPop{from{transform:scale(0)}}
.cempty{text-align:center;font:500 calc(14*var(--u)) var(--f-ryder);color:var(--ink)}
.clist{display:grid;gap:calc(9*var(--u))}
.crow{display:flex;align-items:center;gap:calc(10*var(--u));background:rgba(255,255,255,.7);border:.5px solid var(--mist);border-radius:calc(13*var(--u));padding:calc(10*var(--u)) calc(14*var(--u));
  font-family:var(--f-ryder);font-weight:500;color:var(--ink);text-decoration:none;animation:rowIn .5s both;animation-delay:calc(var(--i)*60ms)}
.crow .ci{flex:none;width:calc(30*var(--u));height:calc(30*var(--u));border-radius:50%;display:grid;place-items:center;background:var(--foam)}
.crow .ci svg{width:calc(16*var(--u));height:calc(16*var(--u));fill:var(--ink)}
.crow .ct{flex:1;min-width:0;display:grid}
.crow .ct b{font-weight:500;font-size:calc(17*var(--u));line-height:1.2}
.crow .ct small{font-size:calc(12*var(--u));color:var(--mist);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.crow .cp{flex:none;font-size:calc(12*var(--u));background:var(--foam);border-radius:calc(9*var(--u));padding:calc(3*var(--u)) calc(9*var(--u))}
.lb{position:fixed;inset:0;z-index:60;display:grid;place-items:center;background:rgba(253,254,255,.85);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:fadeIn .3s}
.lb img{max-width:90vw;max-height:80vh;border-radius:16px;box-shadow:0 10px 30px rgba(107,136,171,.3);animation:lbIn .4s cubic-bezier(.2,.8,.2,1)}
@keyframes fadeIn{from{opacity:0}}
@keyframes lbIn{from{transform:scale(.9);opacity:0}}

/* ---------- toast ---------- */
#toast{position:fixed;left:50%;top:calc(50px + env(safe-area-inset-top,0px));transform:translate(-50%,-20px);opacity:0;z-index:40;pointer-events:none;
  background:rgba(255,255,255,.92);border:.5px solid var(--mist);border-radius:calc(13*var(--u));padding:calc(8*var(--u)) calc(16*var(--u));
  font:500 calc(13*var(--u))/1.4 var(--f-ryder);color:var(--ink);box-shadow:0 4px 14px rgba(107,136,171,.2);transition:.35s;max-width:calc(380*var(--u));text-align:center}
#toast.on{opacity:1;transform:translate(-50%,0)}

/* ---------- tap bubbles ---------- */
.tapb{position:fixed;z-index:70;pointer-events:none;border-radius:50%;border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff,rgba(255,255,255,.2));animation:tapb .9s ease-out forwards}
@keyframes tapb{to{transform:translate(var(--tx),var(--ty)) scale(.2);opacity:0}}

/* ---------- loader ---------- */
#loader{position:fixed;inset:0;z-index:100;display:grid;place-items:center;background:linear-gradient(#fdfeff,#eef4fa);transition:opacity .7s,visibility .7s}
#loader.out{opacity:0;visibility:hidden}
.ld-mid{display:grid;justify-items:center;gap:14px}
.ld-rings{position:absolute;width:220px;height:120px}
.ld-rings b{position:absolute;inset:0;border:1px dashed var(--mist);border-radius:50%;animation:pulse 2.4s ease-out infinite}
.ld-rings b:nth-child(2){animation-delay:.8s}.ld-rings b:nth-child(3){animation-delay:1.6s}
.ld-whale{width:110px;height:auto;animation:belBob 2.4s ease-in-out infinite;position:relative}
.ld-name{font-size:44px;color:var(--mist);line-height:1;white-space:nowrap}
.ld-name .b{font-family:'Billa Mount',cursive}.ld-name .e{font-family:'bellisa',cursive}
.ld-bar{width:140px;height:3px;border-radius:3px;background:var(--foam);overflow:hidden}
.ld-bar i{display:block;height:100%;width:40%;border-radius:3px;background:var(--mist);animation:ldbar 1.2s ease-in-out infinite}
@keyframes ldbar{0%{transform:translateX(-100%)}100%{transform:translateX(260%)}}
.ld-sea i{position:absolute;bottom:-20px;border-radius:50%;border:1px solid var(--mist);background:radial-gradient(circle at 30% 30%,#fff,transparent);animation:ldBub 3s ease-in infinite}
.ld-sea i:nth-child(1){left:20%;width:10px;height:10px}.ld-sea i:nth-child(2){left:35%;width:6px;height:6px;animation-delay:.6s}.ld-sea i:nth-child(3){left:50%;width:14px;height:14px;animation-delay:1.2s}
.ld-sea i:nth-child(4){left:64%;width:8px;height:8px;animation-delay:1.8s}.ld-sea i:nth-child(5){left:78%;width:12px;height:12px;animation-delay:.3s}.ld-sea i:nth-child(6){left:88%;width:5px;height:5px;animation-delay:2.2s}
@keyframes ldBub{to{transform:translateY(-105vh);opacity:0}}

@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}

/* ======================= extra life (added on top of the Figma layout) ======================= */
/* top corner: language + sound */
.topctl{position:fixed;z-index:35;top:calc(10px + env(safe-area-inset-top,0px));right:calc((100vw - min(100vw,440px)) / 2 + 10px);display:flex;gap:6px;align-items:center}
.lang{display:flex;background:rgba(255,255,255,.75);border:.5px solid var(--mist);border-radius:13px;padding:2px;box-shadow:0 0 10px rgba(107,136,171,.18);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
.lang button{position:relative;overflow:hidden;font:500 13px/1 var(--f-ryder);color:var(--ink);padding:5px 9px;border-radius:10px;transition:background .3s,color .3s}
.lang button[aria-pressed="true"]{background:var(--foam);color:#4f6f96}
.snd{position:relative;overflow:hidden;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;background:rgba(255,255,255,.75);border:.5px solid var(--mist);box-shadow:0 0 10px rgba(107,136,171,.18);color:var(--ink)}
.snd svg{width:16px;height:16px;fill:currentColor;grid-area:1/1}
.snd .off,.snd.muted .on{display:none}.snd.muted .off{display:block}
.snd:not(.muted) .on path:nth-child(2){animation:sndWave 1.6s ease-in-out infinite}
@keyframes sndWave{50%{opacity:.35}}
body.th .nb span{font-family:var(--f-ryder);font-weight:500;font-size:calc(12.5*var(--u))}
body.th .sm{font-size:calc(12.5*var(--u))}
body.th .qinput{font-size:calc(12*var(--u))}

/* bubble curtain between pages */
#curtain{position:fixed;inset:0;z-index:80;pointer-events:none;visibility:hidden}
#curtain.go{visibility:visible}
#curtain.go::before{content:"";position:absolute;inset:0;background:radial-gradient(120% 80% at 50% 110%,rgba(221,230,241,.95),rgba(253,254,255,.85));animation:veil 1.1s ease forwards}
@keyframes veil{0%{opacity:0}30%,55%{opacity:1}100%{opacity:0}}
#curtain i{position:absolute;bottom:-70px;border-radius:50%;border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff 0 18%,rgba(255,255,255,.35) 40%,rgba(221,230,241,.25));animation:curtainUp ease-in forwards}
@keyframes curtainUp{to{transform:translateY(-115vh) translateX(20px);opacity:.2}}

/* ripples + squish on buttons */
.mbtn,.gtab,.qchip,.qping,.nb{overflow:hidden}
.rip{position:absolute;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.95),rgba(221,230,241,.5) 60%,transparent 70%);pointer-events:none;animation:rip .65s ease-out forwards}
@keyframes rip{from{transform:scale(0);opacity:1}to{transform:scale(1);opacity:0}}
.mbtn::before,.mbtn::after,.qping::before,.qping::after,.qshine::before,.qshine::after{content:"";position:absolute;bottom:calc(-6*var(--u));width:calc(5*var(--u));height:calc(5*var(--u));border-radius:50%;
  border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff,rgba(255,255,255,.1));pointer-events:none;opacity:0;animation:fizz 3.4s ease-in infinite}
.mbtn::before,.qping::before,.qshine::before{left:18%}
.mbtn::after,.qping::after,.qshine::after{left:74%;width:calc(3.5*var(--u));height:calc(3.5*var(--u));animation-delay:1.7s}
.mbtn:nth-of-type(2)::before{animation-delay:.6s}.mbtn:nth-of-type(2)::after{animation-delay:2.3s}.mbtn:nth-of-type(3)::before{animation-delay:1.1s}.mbtn:nth-of-type(3)::after{animation-delay:2.8s}
@keyframes fizz{0%{opacity:0;transform:translate(0,0)}15%{opacity:1}100%{opacity:0;transform:translate(calc(4*var(--u)),calc(-46*var(--u)))}}
@keyframes sheen{0%{background-position:160% 0}45%,100%{background-position:-60% 0}}
.mbtn:active,.gtab:active,.qchip:active,.qping:active{animation:squish .4s cubic-bezier(.3,1.6,.5,1)}
@keyframes squish{30%{transform:scale(.9,1.08)}60%{transform:scale(1.05,.95)}}

/* header: parallax + more sparkle */
.px1{translate:calc(var(--mx,0) * -5px) calc(var(--sy,0) * -.08px + var(--my,0) * -3px)}
.px2{translate:calc(var(--mx,0) * 4px) calc(var(--sy,0) * .05px + var(--my,0) * 2px)}
.px3{translate:calc(var(--mx,0) * 9px) calc(var(--sy,0) * -.18px + var(--my,0) * 5px)}
.px4{translate:calc(var(--mx,0) * -3px) calc(var(--sy,0) * .1px + var(--my,0) * -2px)}
.px5{translate:calc(var(--mx,0) * 6px) calc(var(--sy,0) * -.12px + var(--my,0) * 4px)}
.hshine{display:none}
.spark.s5{left:-2%;top:62%;animation-delay:-1.3s;width:calc(9*var(--u));height:calc(9*var(--u))}
.spark.s6{right:-3%;top:20%;animation-delay:-3.1s;width:calc(15*var(--u));height:calc(15*var(--u))}
.spark.ib1{right:calc(6*var(--u));top:calc(8*var(--u));animation-delay:-.6s}
.spark.ib2{left:calc(4*var(--u));bottom:calc(30*var(--u));animation-delay:-2.2s;width:calc(9*var(--u));height:calc(9*var(--u))}
.iscallop{animation:scallop 8s ease-in-out infinite}
@keyframes scallop{50%{filter:drop-shadow(0 0 calc(4*var(--u)) rgba(221,230,241,.95))}}

/* home extras */
.pic::after{content:"";position:absolute;inset:0;border-radius:50%;pointer-events:none;mix-blend-mode:soft-light;opacity:.8;
  background:conic-gradient(from 0deg,rgba(255,180,220,.45),rgba(170,220,255,.45),rgba(200,255,230,.45),rgba(255,240,180,.45),rgba(255,180,220,.45));animation:iri 7s linear infinite}
@keyframes iri{to{rotate:360deg}}
.pic.f1::after{animation-duration:9s}.pic.f3::after{animation-direction:reverse}
.lbl{animation:lbl 5s ease-in-out infinite}
.lbl.l2{animation-delay:-1s}.lbl.l3{animation-delay:-2s}.lbl.l4{animation-delay:-3s}.lbl.l5{animation-delay:-4s}
@keyframes lbl{50%{translate:0 calc(-3*var(--u));text-shadow:0 0 calc(8*var(--u)) rgba(178,199,224,.9)}}
.menubox,.mbtn{animation:floatT 8s ease-in-out infinite -2s}
@keyframes floatT{50%{translate:0 calc(-4*var(--u))}}

/* gallery extras */
.gcell{transform:perspective(500px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg));transition:transform .25s;animation:cellIn .5s cubic-bezier(.2,.8,.2,1) both calc(var(--i)*45ms),cellFloat 6s ease-in-out infinite calc(var(--i)*-.45s)}
@keyframes cellFloat{50%{translate:0 calc(-3*var(--u))}}
.gshine{position:absolute;right:calc(4*var(--u));top:calc(4*var(--u));width:calc(12*var(--u));height:calc(12*var(--u));opacity:0;pointer-events:none;
  background:radial-gradient(circle,#fff 0 18%,transparent 20%),conic-gradient(from 45deg,transparent 0 22%,#fff 24% 26%,transparent 28% 47%,#fff 49% 51%,transparent 53% 72%,#fff 74% 76%,transparent 78% 97%,#fff 99%);
  filter:drop-shadow(0 0 2px #b2c7e0);animation:spark 4.2s ease-in-out infinite calc(var(--i)*-.55s)}
.gtab.on{box-shadow:0 0 calc(8*var(--u)) rgba(178,199,224,.6)}

/* sonar extras */
.sweep{border-radius:50%;overflow:hidden;pointer-events:none;-webkit-mask:radial-gradient(closest-side,#000 70%,transparent);mask:radial-gradient(closest-side,#000 70%,transparent)}
.sweep i{position:absolute;inset:-40%;background:conic-gradient(from 0deg,rgba(178,199,224,.55),rgba(178,199,224,0) 22%,transparent);animation:sweep 4s linear infinite}
@keyframes sweep{to{rotate:360deg}}
.sonar.pinging .sweep i{animation-duration:.8s}
.sonar.miss{animation:miss .5s}
@keyframes miss{20%,60%{translate:calc(-4*var(--u)) 0}40%,80%{translate:calc(4*var(--u)) 0}}
.sbb{position:absolute;left:calc(var(--x)*var(--u));top:calc(var(--y)*var(--u));width:calc(var(--s)*var(--u));height:calc(var(--s)*var(--u));border-radius:50%;
  border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff,rgba(255,255,255,.15));animation:sbb 2.2s ease-out both;pointer-events:none}
@keyframes sbb{from{opacity:0;transform:scale(.3)}15%{opacity:1}to{opacity:0;transform:translate(calc(var(--dx)*var(--u)),calc(-60*var(--u))) scale(1.2)}}
.qtitle.t1{animation:titleFloat 6s ease-in-out infinite}.qtitle.t2{animation:titleFloat 6s ease-in-out infinite -3s}
@keyframes titleFloat{50%{translate:0 calc(-3*var(--u));filter:drop-shadow(0 0 calc(5*var(--u)) rgba(221,230,241,.95))}}
.qchip{animation:chipIn .5s cubic-bezier(.3,1.5,.5,1) both calc(var(--i)*50ms)}
@keyframes chipIn{from{opacity:0;scale:.6}}
.qchip.on{box-shadow:0 0 calc(6*var(--u)) rgba(178,199,224,.7)}

/* queue card extras */
.qcard{overflow:hidden}
.qshine{position:absolute;inset:0;pointer-events:none}
.qshine::before{left:auto;right:calc(70*var(--u))}.qshine::after{left:auto;right:calc(18*var(--u))}
.qline{animation:lineDraw 1.2s ease both calc(var(--i)*70ms + .3s)}
@keyframes lineDraw{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
.shell{animation:shellPop .5s cubic-bezier(.3,1.7,.5,1) both calc(var(--i)*70ms + .4s + var(--k)*.15s)}
.shell.now{animation:shellPop .5s cubic-bezier(.3,1.7,.5,1) both calc(var(--i)*70ms + .4s + var(--k)*.15s),shellNow 1.8s ease-in-out infinite 1.4s}
@keyframes shellPop{from{scale:0;opacity:0}}
.slbl{animation:fadeIn .5s both calc(var(--i)*70ms + .5s + var(--k)*.15s)}
.qpay{animation:payGlow 2.6s ease-in-out infinite}
@keyframes payGlow{50%{box-shadow:0 0 calc(6*var(--u)) var(--pc)}}
.qbadge{animation:badgeBreath 3s ease-in-out infinite}
@keyframes badgeBreath{50%{box-shadow:0 0 calc(5*var(--u)) rgba(178,199,224,.9)}}
.qrow.mine .qstar{filter:drop-shadow(0 0 calc(6*var(--u)) #fff) drop-shadow(0 0 calc(10*var(--u)) rgba(178,199,224,.9))}
.abub{position:absolute;left:calc(380*var(--u));top:calc(50*var(--u));width:calc(30*var(--u));height:calc(30*var(--u));pointer-events:none}
.abub i{position:absolute;bottom:0;border-radius:50%;border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff,transparent);animation:abub 2.2s ease-out both}
@keyframes abub{from{opacity:0}20%{opacity:1}to{opacity:0;transform:translate(calc(6*var(--u)),calc(-55*var(--u)))}}

/* found! pearls and bubbles burst */
.burst{position:fixed;z-index:60;border-radius:50%;pointer-events:none;border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff,rgba(255,255,255,.2));animation:burst 1.2s cubic-bezier(.2,.8,.2,1) both}
.burst.pearl{border:0;background:radial-gradient(circle at 35% 30%,#fff 0 30%,#e6edf5 60%,#c9d6e5);box-shadow:0 1px 2px rgba(107,136,171,.3)}
@keyframes burst{from{transform:translate(0,0) scale(.3);opacity:1}70%{opacity:1}to{transform:translate(var(--tx),var(--ty)) scale(1);opacity:0}}

/* nav: icons idle-bob, current page glows */
.ni{animation:niBob 3.6s ease-in-out infinite}
.nb:nth-child(2) .ni{animation-delay:-1.2s}.nb:nth-child(3) .ni{animation-delay:-2.4s}
@keyframes niBob{50%{translate:0 calc(-2*var(--u))}}
.nb.cur .ni{filter:drop-shadow(0 0 calc(5*var(--u)) rgba(178,199,224,.95))}
.nb.cur span{font-weight:600}

/* sea life behind */
.caustic.c3{left:20%;bottom:-30vmax;background:radial-gradient(circle,#e3edf8 0,transparent 60%);animation:drift1 30s ease-in-out infinite alternate-reverse}
.net{position:absolute;inset:-20%;opacity:.06;background:
  radial-gradient(circle at 20% 30%,transparent 0 18px,rgba(178,199,224,.5) 19px 20px,transparent 21px) 0 0/90px 70px,
  radial-gradient(circle at 70% 60%,transparent 0 14px,rgba(178,199,224,.45) 15px 16px,transparent 17px) 0 0/70px 90px;animation:net 18s linear infinite}
@keyframes net{to{transform:translate(90px,70px)}}
.swim.big img{animation:bigSwim 4s ease-in-out infinite}
@keyframes bigSwim{50%{translate:0 -10px;rotate:-3deg}}
.swim.turtle img{animation:turtle 3s ease-in-out infinite}
@keyframes turtle{50%{rotate:8deg;translate:0 -6px}}
.jelly{position:absolute;bottom:-120px;width:44px;height:90px;opacity:.5;animation:jellyUp 38s linear infinite}
.jelly.j1{left:6%}.jelly.j2{right:8%;animation-delay:-14s;width:32px;height:68px}.jelly.j3{left:46%;animation-delay:-27s;width:26px;height:56px;opacity:.35}
.jelly::before{content:"";position:absolute;left:0;right:0;top:0;height:46%;border-radius:50% 50% 30% 30%/80% 80% 25% 25%;
  background:radial-gradient(ellipse at 50% 30%,rgba(255,255,255,.95),rgba(221,230,241,.7) 55%,rgba(178,199,224,.5));box-shadow:0 0 14px rgba(178,199,224,.6);animation:bell 2.4s ease-in-out infinite}
.jelly i{position:absolute;left:18%;right:18%;top:38%;bottom:0;background:repeating-linear-gradient(90deg,rgba(178,199,224,.6) 0 1px,transparent 1px 5px);
  -webkit-mask:linear-gradient(#000,transparent);mask:linear-gradient(#000,transparent);animation:tent 2.4s ease-in-out infinite;transform-origin:top}
@keyframes bell{50%{transform:scale(1.12,.86)}}
@keyframes tent{50%{transform:scaleY(.85) skewX(6deg)}}
@keyframes jellyUp{0%{transform:translate(0,0)}25%{transform:translate(20px,-30vh)}50%{transform:translate(-10px,-60vh)}75%{transform:translate(18px,-90vh)}100%{transform:translate(0,-130vh)}}

/* loader letters ride a wave */
.ld-name span{display:inline-block;animation:ldWave 1.6s ease-in-out infinite}
.ld-name span:nth-child(2){animation-delay:.08s}.ld-name span:nth-child(3){animation-delay:.16s}.ld-name span:nth-child(4){animation-delay:.24s}.ld-name span:nth-child(5){animation-delay:.32s}.ld-name span:nth-child(6){animation-delay:.4s}
.ld-name span:nth-child(7){animation-delay:.48s}.ld-name span:nth-child(8){animation-delay:.56s}.ld-name span:nth-child(9){animation-delay:.64s}.ld-name span:nth-child(10){animation-delay:.72s}
@keyframes ldWave{50%{transform:translateY(-6px);color:var(--ink)}}
.ld-sea i:nth-child(7){left:10%;width:9px;height:9px;animation-delay:1.5s}.ld-sea i:nth-child(8){left:72%;width:16px;height:16px;animation-delay:.9s}

.lb.out{animation:fadeIn .25s reverse forwards}
.tapb{z-index:70}

/* pearls twinkle instead of a light sweep */
.pearls{overflow:visible}
.pearls .spark{width:calc(10*var(--u));height:calc(10*var(--u))}
.pearls .p1{left:6%;top:47%;animation-delay:-.4s}.pearls .p2{left:29%;top:88%;animation-delay:-1.4s}.pearls .p3{left:55%;top:47%;animation-delay:-2.2s}
.pearls .p4{left:79%;top:31%;animation-delay:-3s}.pearls .p5{left:93%;top:5%;animation-delay:-.9s}.pearls .p6{left:16%;top:70%;animation-delay:-2.7s}

/* ===== loader: the sea surface; when ready the page dives under it ===== */
#loader{background:linear-gradient(#fdfeff 0,#fdfeff 42%,#eaf1f9 42%,#d8e4f1 100%);overflow:hidden;display:block}
.ld-sky{position:absolute;left:0;right:0;top:0;height:42%;display:grid;place-items:end center;padding-bottom:28px}
.ld-surf{position:absolute;left:0;top:calc(42% - 18px);width:200%;height:36px;animation:tide 7s linear infinite}
.ld-surf .s1{fill:#eaf1f9}.ld-surf .s2{fill:none;stroke:#fff;stroke-width:2.5}
@keyframes tide{to{transform:translateX(-50%)}}
.ld-water{position:absolute;left:0;right:0;top:42%;bottom:0;display:grid;place-items:center}
.ld-water .ld-rays{position:absolute;inset:0 -20%;background:repeating-linear-gradient(100deg,transparent 0 40px,rgba(255,255,255,.4) 40px 64px,transparent 64px 120px);
  -webkit-mask:linear-gradient(#000,transparent 80%);mask:linear-gradient(#000,transparent 80%);animation:rays 6s ease-in-out infinite alternate}
.ld-mid{position:relative;margin-top:-14vh}
#loader.dive{animation:dive 1.25s cubic-bezier(.65,0,.35,1) forwards}
#loader.dive .ld-name{transition:transform 1.2s cubic-bezier(.65,0,.35,1);transform:translateY(-30vh)}
@keyframes dive{0%{transform:translateY(0)}100%{transform:translateY(-105%)}}
#curtain.nov::before{display:none}
#curtain.nov{z-index:110}
#loader{inset:0 0 -22% 0;-webkit-mask:linear-gradient(#000 80%,transparent);mask:linear-gradient(#000 80%,transparent)}
.ld-water{bottom:18%}

/* ===================== round 3: playful bits ===================== */
/* --- loader: name + braille whale + the little beluga, pearls fill up; then the tide rises over it --- */
#loader{inset:0;-webkit-mask:none;mask:none;display:grid;place-items:center;background:radial-gradient(120% 80% at 50% 25%,#fff 0,#fdfeff 45%,#eaf1f9 100%);transition:opacity .9s ease}
#loader.dive{animation:none}
#loader.gone{opacity:0;pointer-events:none}
#loader .ld-rays{position:absolute;inset:0 -20%;opacity:.6;background:repeating-linear-gradient(103deg,transparent 0 60px,rgba(221,230,241,.6) 60px 96px,transparent 96px 170px);
  -webkit-mask:linear-gradient(#000,transparent 85%);mask:linear-gradient(#000,transparent 85%);animation:rays 9s ease-in-out infinite alternate}
#loader .ld-mid{--W:min(86vw,360px);position:relative;width:var(--W);height:calc(var(--W) * .92);margin:0;display:block}
#loader .ld-name{position:absolute;inset:0;font-size:calc(var(--W) * .3);line-height:1;color:var(--mist);white-space:nowrap;transform:none}
#loader .ld-name span{animation:none;display:inline-block}
#loader .ld-name .w1{position:absolute;left:2%;top:4%;animation:ldWord 5s ease-in-out infinite}
#loader .ld-name .w2{position:absolute;right:4%;top:46%;animation:ldWord 5s ease-in-out infinite -2.5s}
@keyframes ldWord{50%{transform:translateY(-6px);text-shadow:0 0 14px rgba(221,230,241,1),0 0 2px #fff}}
.ld-braille{position:absolute;left:0;top:30%;width:100%;opacity:.55;animation:brailleTw 3s ease-in-out infinite}
.ld-mascot{position:absolute;left:33%;top:30%;width:36%;height:auto;animation:ldSwim 6s ease-in-out infinite;filter:drop-shadow(0 8px 10px rgba(107,136,171,.2))}
@keyframes ldSwim{0%{transform:translate(0,0) rotate(-4deg)}25%{transform:translate(18%,-10%) rotate(5deg)}50%{transform:translate(0,-4%) rotate(-2deg)}75%{transform:translate(-18%,-12%) rotate(-7deg)}100%{transform:translate(0,0) rotate(-4deg)}}
.ld-pearls{position:absolute;left:50%;bottom:0;transform:translateX(-50%);display:flex;gap:9px;align-items:center}
.ld-pearls i{width:11px;height:11px;border-radius:50%;background:radial-gradient(circle at 35% 30%,#fff 0 25%,#eef2f7 55%,#cfdbea);box-shadow:0 1px 2px rgba(107,136,171,.25);opacity:.35;animation:ldPearl 2.1s ease-in-out infinite}
.ld-pearls i:nth-child(2){animation-delay:.15s;translate:0 4px}.ld-pearls i:nth-child(3){animation-delay:.3s;translate:0 7px;width:13px;height:13px}.ld-pearls i:nth-child(4){animation-delay:.45s;translate:0 8px;width:16px;height:16px}
.ld-pearls i:nth-child(5){animation-delay:.6s;translate:0 7px;width:13px;height:13px}.ld-pearls i:nth-child(6){animation-delay:.75s;translate:0 4px}.ld-pearls i:nth-child(7){animation-delay:.9s}
@keyframes ldPearl{0%,100%{opacity:.35;transform:scale(.85)}35%,60%{opacity:1;transform:scale(1.12);box-shadow:0 0 10px #fff,0 0 4px rgba(178,199,224,.9)}}
.ld-tide{position:absolute;left:0;right:0;top:100%;height:150vh;transition:transform 1.05s cubic-bezier(.55,0,.3,1);pointer-events:none}
.ld-tide img{display:block;width:100%;height:28vh;object-fit:cover;object-position:50% 100%}
.ld-tide b{display:block;height:calc(150vh - 28vh);margin-top:-1px;background:linear-gradient(#a9c0db,#dbe6f2 60%,#fdfeff)}
#loader.dive .ld-tide{transform:translateY(-150vh)}
#loader.dive .ld-mid{animation:ldLift 1.05s cubic-bezier(.55,0,.3,1) forwards}
@keyframes ldLift{to{transform:translateY(-8vh) scale(.95)}}

/* --- the little beluga on the info box --- */
.mascot{z-index:5;animation:mIdle 4.2s ease-in-out infinite;transform-origin:50% 85%;cursor:pointer}
.mascot img{width:100%;height:100%;pointer-events:none;filter:drop-shadow(0 calc(3*var(--u)) calc(4*var(--u)) rgba(107,136,171,.18))}
@keyframes mIdle{0%,100%{transform:translateY(0) rotate(0)}30%{transform:translateY(calc(-4*var(--u))) rotate(-3deg)}60%{transform:translateY(calc(-1*var(--u))) rotate(2deg)}}
.mascot.m-hop{animation:mHop 1.1s cubic-bezier(.3,1.4,.5,1)}
@keyframes mHop{15%{transform:scale(1.12,.85)}40%{transform:translateY(calc(-34*var(--u))) scale(.92,1.1) rotate(-8deg)}65%{transform:translateY(0) scale(1.1,.9)}85%{transform:scale(.97,1.04)}}
.mascot.m-spin{animation:mSpin 1.1s cubic-bezier(.4,1.3,.5,1)}
@keyframes mSpin{30%{transform:translateY(calc(-22*var(--u))) rotate(-20deg)}70%{transform:translateY(calc(-12*var(--u))) rotate(340deg)}100%{transform:rotate(360deg)}}
.mascot.m-wiggle{animation:mWig 1.1s ease}
@keyframes mWig{15%,45%,75%{transform:rotate(-9deg)}30%,60%,90%{transform:rotate(9deg)}}
.mascot.m-flip{animation:mFlip 1.1s ease}
@keyframes mFlip{30%{transform:translateY(calc(-14*var(--u))) scaleX(-1)}70%{transform:translateY(calc(-6*var(--u))) scaleX(-1) rotate(6deg)}}
.mascot.m-peek{animation:mPeek 1.1s ease}
@keyframes mPeek{40%{transform:translateX(calc(10*var(--u))) rotate(10deg)}70%{transform:translateX(calc(-4*var(--u))) rotate(-4deg)}}
.say{width:auto;height:auto;z-index:6;transform:translate(-50%,-100%);background:rgba(255,255,255,.95);border:.5px solid var(--mist);border-radius:calc(12*var(--u));
  padding:calc(5*var(--u)) calc(10*var(--u));white-space:nowrap;box-shadow:0 calc(3*var(--u)) calc(10*var(--u)) rgba(107,136,171,.2);animation:sayIn .4s cubic-bezier(.3,1.5,.5,1) both;pointer-events:none;line-height:1.4}
.say::after{content:"";position:absolute;left:46%;bottom:calc(-5*var(--u));width:calc(8*var(--u));height:calc(8*var(--u));background:#fff;border-right:.5px solid var(--mist);border-bottom:.5px solid var(--mist);transform:rotate(45deg)}
.say.out{animation:sayOut .4s ease forwards}
@keyframes sayIn{from{opacity:0;transform:translate(-50%,-80%) scale(.6)}}
@keyframes sayOut{to{opacity:0;transform:translate(-50%,-120%) scale(.8)}}

/* --- livelier idle motion --- */
@keyframes heartBob{0%,100%{transform:translateY(0) rotate(0)}30%{transform:translateY(calc(-7*var(--u))) rotate(-1.6deg)}65%{transform:translateY(calc(-2*var(--u))) rotate(1.4deg)}}
@keyframes ribbon{25%{transform:rotate(-5deg) scale(1.02)}55%{transform:rotate(3.5deg)}80%{transform:rotate(-2deg) translateY(calc(1*var(--u)))}}
@keyframes fishBob{0%,100%{transform:translate(0,0) rotate(0)}25%{transform:translate(calc(-8*var(--u)),calc(-6*var(--u))) rotate(-8deg)}50%{transform:translate(calc(-14*var(--u)),calc(2*var(--u))) rotate(4deg)}75%{transform:translate(calc(-5*var(--u)),calc(5*var(--u))) rotate(6deg)}}
@keyframes school{0%,100%{transform:translate(0,0)}25%{transform:translate(calc(10*var(--u)),calc(-5*var(--u)))}50%{transform:translate(calc(18*var(--u)),calc(1*var(--u)))}75%{transform:translate(calc(6*var(--u)),calc(4*var(--u)))}}
@keyframes float{0%,100%{transform:translateY(0) rotate(0)}50%{transform:translateY(calc(-5*var(--u))) rotate(-.6deg)}}
.pic{animation-name:bubbleWob}
@keyframes bubbleWob{0%,100%{transform:translate(0,0) scale(1,1)}25%{transform:translate(calc(2*var(--u)),calc(-5*var(--u))) scale(1.04,.97)}50%{transform:translate(0,calc(-7*var(--u))) scale(.97,1.04)}75%{transform:translate(calc(-2*var(--u)),calc(-3*var(--u))) scale(1.02,.98)}}

/* --- tap tricks --- */
.heart,.pearls,.fishtop,.school,.ltr,.bwhale,.braille{cursor:pointer}
.heart.beat{animation:beat .9s ease}
@keyframes beat{15%{transform:scale(1.08)}30%{transform:scale(.97)}45%{transform:scale(1.05)}70%{transform:scale(.99) rotate(1deg)}}
.pearls.roll{animation:roll 1.2s ease}
@keyframes roll{20%{transform:translateX(calc(6*var(--u))) rotate(2deg)}45%{transform:translateX(calc(-5*var(--u))) rotate(-2deg)}70%{transform:translateX(calc(3*var(--u)))}}
.fishtop.dart{animation:dartR 1.6s cubic-bezier(.5,0,.3,1)}
@keyframes dartR{35%{transform:translate(calc(140*var(--u)),calc(-40*var(--u)));opacity:0}36%{transform:translate(calc(-120*var(--u)),calc(20*var(--u)));opacity:0}100%{transform:translate(0,0);opacity:1}}
.school.dart{animation:dartL 1.6s cubic-bezier(.5,0,.3,1)}
@keyframes dartL{35%{transform:translate(calc(-260*var(--u)),calc(10*var(--u)));opacity:0}36%{transform:translate(calc(260*var(--u)),calc(-10*var(--u)));opacity:0}100%{transform:translate(0,0);opacity:1}}
.ltr.jelly{animation:jellyL .7s ease}
@keyframes jellyL{25%{transform:scale(1.12,.88)}50%{transform:scale(.92,1.1) translateY(calc(-6*var(--u)))}75%{transform:scale(1.04,.96)}}
.jiggle{animation:jig .9s ease!important}
@keyframes jig{20%{transform:rotate(-6deg) scale(1.05)}40%{transform:rotate(5deg)}60%{transform:rotate(-3deg) scale(1.03)}80%{transform:rotate(2deg)}}
.mbtn.mwv{animation:mwave .7s cubic-bezier(.3,1.6,.5,1),floatT 8s ease-in-out infinite -2s}
@keyframes mwave{40%{transform:translateY(calc(-5*var(--u))) rotate(-2deg)}70%{transform:translateY(calc(1*var(--u))) rotate(1deg)}}
.pic.popb{animation:popb .42s ease forwards}
@keyframes popb{40%{transform:scale(1.25)}70%{transform:scale(.6);opacity:.4}100%{transform:scale(1);opacity:1}}

/* --- ping button: Figma text position + the ·)) icon --- */
.qping{display:block}
.qping .pt{position:absolute;left:calc(23.5*var(--u));top:50%;transform:translate(-50%,-50%);white-space:nowrap;line-height:calc(15*var(--u))}
.ab.qping>img.pi{position:absolute;z-index:2;display:block;left:calc(41.25*var(--u));top:calc(6.25*var(--u));width:calc(11*var(--u));height:calc(13.5*var(--u));animation:piWave 1.4s ease-in-out infinite}
@keyframes piWave{50%{opacity:.45}}

/* --- pay + status pills grow with their text instead of spilling out --- */
.qpay{left:auto!important;right:calc(37*var(--u));width:auto!important;min-width:calc(36*var(--u));padding:0 calc(5*var(--u))}
.qpay span{position:static;display:block;transform:none;text-align:center;line-height:calc(14*var(--u))}
.qbadge{width:auto!important;min-width:calc(53*var(--u));max-width:calc(150*var(--u));padding:0 calc(4*var(--u))}
.qbadge span{position:static;display:block;transform:none;text-align:center;line-height:calc(11*var(--u));overflow:hidden;text-overflow:ellipsis}
.qrow{cursor:pointer}

/* --- readable queue detail --- */
.sheet.detail .pn{padding-top:calc(12*var(--u))}
.dhead{display:flex;align-items:center;gap:calc(14*var(--u));margin-bottom:calc(16*var(--u))}
.dstar{position:relative;flex:none;width:calc(92*var(--u));height:calc(96*var(--u));animation:starSpin .9s cubic-bezier(.2,.8,.2,1) both}
.dstar img{width:100%;height:100%}
.dstar b{position:absolute;left:50%;top:50%;transform:translate(-50%,-46%) rotate(7deg);font:400 calc(36*var(--u))/1 var(--f-num);color:#fff}
.dinfo{display:grid;gap:calc(3*var(--u));min-width:0}
.dname{font:400 calc(19*var(--u))/1.3 var(--f-anak);color:var(--ink);overflow-wrap:anywhere}
.dinfo span{font:400 calc(13*var(--u))/1.4 var(--f-cera);color:var(--ink)}
.drows{display:grid;gap:calc(8*var(--u))}
.drows>div{display:grid;grid-template-columns:calc(80*var(--u)) 1fr;align-items:baseline;gap:0 calc(10*var(--u));background:rgba(255,255,255,.75);border:.5px solid var(--foam);border-radius:calc(13*var(--u));padding:calc(10*var(--u)) calc(14*var(--u));animation:rowIn .5s both}
.drows>div:nth-child(2){animation-delay:.06s}.drows>div:nth-child(3){animation-delay:.12s}
.drows small{font:500 calc(12*var(--u))/1.4 var(--f-ryder);color:var(--mist)}
.drows b{font:500 calc(15*var(--u))/1.4 var(--f-ryder);color:var(--ink)}
.drows em{grid-column:2;font:normal 500 calc(12*var(--u))/1.4 var(--f-ryder);color:var(--mist)}
.dpay{font-style:normal;display:inline-block;background:var(--pc);color:#fff;border-radius:calc(20*var(--u));padding:calc(1*var(--u)) calc(12*var(--u));font-size:calc(13*var(--u))}
.dtrack{position:relative;display:grid;grid-template-columns:repeat(5,1fr);margin:calc(20*var(--u)) 0 calc(6*var(--u));text-align:center}
.dtrack::before{content:"";position:absolute;left:10%;right:10%;top:calc(11*var(--u));border-top:1.5px dashed var(--foam)}
.dst{position:relative;display:grid;justify-items:center;gap:calc(6*var(--u));font:500 calc(11.5*var(--u))/1.3 var(--f-ryder);color:var(--mist)}
.dst img{width:calc(24*var(--u));height:calc(22*var(--u));animation:shellPop .5s cubic-bezier(.3,1.7,.5,1) both calc(.25s + var(--k)*.12s)}
.dst.done{color:var(--ink)}
.dst.now{color:#4f6f96;font-weight:700}
.dst.now img{animation:shellPop .5s cubic-bezier(.3,1.7,.5,1) both calc(.25s + var(--k)*.12s),shellNow 1.8s ease-in-out infinite 1s}
.swim.rev img{transform:scaleX(-1)}
#loader .ld-name{font-size:calc(var(--W) * .23)}
#loader .ld-name .w1{left:4%;top:0}
#loader .ld-name .w2{right:6%;top:52%}
.ld-braille{top:26%;opacity:.45}
.ld-mascot{left:28%;top:24%;width:46%}
/* loader layout v2: name on top, the beluga swims under it, pearls at the bottom */
#loader .ld-mid{height:auto;display:flex;flex-direction:column;align-items:center}
#loader .ld-name{position:relative;inset:auto;width:100%;height:calc(var(--W) * .5);font-size:calc(var(--W) * .2)}
#loader .ld-name .w1{left:6%;top:0}
#loader .ld-name .w2{right:8%;top:42%}
.ld-braille{top:6%;opacity:.4}
.ld-mascot{position:relative;left:auto;top:auto;width:46%;margin-top:calc(var(--W) * -.04)}
.ld-pearls{position:relative;left:auto;bottom:auto;transform:none;margin-top:8px}

/* ===================== round 4: lighter on the phone + "your queue" flow ===================== */
/* things that repainted every frame (blur, blend, animated shadows/filters) are now still or opacity/transform only */
.caustic{filter:none;mix-blend-mode:normal;animation:none;opacity:.5}
.net{display:none}
.rays{animation:none}
.jelly.j3{display:none}
.twinkle-l{animation:none}
@keyframes brailleTw{50%{opacity:.72}}
.iscallop{animation:none}
@keyframes titleFloat{50%{translate:0 calc(-3*var(--u))}}
.qpay,.qbadge{animation:none}
.hphoto{animation:none}
.pic::after{mix-blend-mode:normal;opacity:.22;animation:none}
@keyframes lbl{50%{translate:0 calc(-3*var(--u))}}
.lang,.snd{-webkit-backdrop-filter:none;backdrop-filter:none;background:rgba(255,255,255,.9)}
.sweep i{animation-duration:6s}
.qrow:not(.mine) .qshine{display:none}
.sfish{left:0;top:0}
.sfish.lit{animation:none}
.sfish.lit img{animation:tail .5s ease-in-out infinite alternate,litScale 1.2s ease-in-out infinite}
@keyframes litScale{50%{scale:1.6}}
.spark{filter:none}

/* tapping someone else's card */
.qrow.nope{animation:nope .45s ease}
@keyframes nope{20%,60%{translate:calc(-5*var(--u)) 0}40%,80%{translate:calc(5*var(--u)) 0}}

/* the customer's card: ring + the little beluga pointing at it */
.qrow.mine{z-index:3}
.qrow.mine .qcard{border-color:var(--mist);box-shadow:0 0 0 calc(1.5*var(--u)) #c9d8ea,0 calc(4*var(--u)) calc(14*var(--u)) rgba(107,136,171,.3)}
.myring{border-radius:calc(17*var(--u));border:calc(1.5*var(--u)) solid #9fb8d6;pointer-events:none;animation:myring 1.8s ease-out infinite}
@keyframes myring{0%{opacity:.9;transform:scale(1)}100%{opacity:0;transform:scale(1.06,1.25)}}
.mypoint{pointer-events:none;animation:mypoint 1.6s ease-in-out infinite;z-index:4}
.mypoint img{position:absolute;left:0;top:0;width:calc(48*var(--u));height:calc(41*var(--u));transform:scaleX(-1) rotate(-8deg)}
.mypoint span{position:absolute;left:calc(44*var(--u));top:calc(8*var(--u));white-space:nowrap;background:var(--ink);color:#fff;font:500 calc(11*var(--u))/1 var(--f-ryder);border-radius:calc(9*var(--u));padding:calc(4*var(--u)) calc(8*var(--u))}
@keyframes mypoint{50%{transform:translateY(calc(-4*var(--u)))}}
.qrow.here .qcard{animation:here 2.6s ease}
@keyframes here{10%,40%,70%{transform:scale(1.03)}25%,55%,85%{transform:scale(.99)}}

/* detail sheet holding more than one queue */
.dsep{height:1px;margin:calc(20*var(--u)) 0;background:repeating-linear-gradient(90deg,var(--foam) 0 6px,transparent 6px 11px)}
.mypoint img{width:calc(62*var(--u));height:calc(53*var(--u));left:calc(-14*var(--u));top:calc(-12*var(--u))}
.mypoint span{font-size:calc(12*var(--u));left:calc(46*var(--u));top:calc(6*var(--u))}

/* ===================== round 5 ===================== */
/* rainbow soap-bubble rim, back — a ring only, spun on the GPU (no blending) */
.pic::after{opacity:.75;mix-blend-mode:normal;animation:iri 8s linear infinite;
  background:conic-gradient(from 0deg,rgba(255,170,215,.85),rgba(160,215,255,.85),rgba(185,255,225,.85),rgba(255,240,170,.85),rgba(215,180,255,.85),rgba(255,170,215,.85));
  -webkit-mask:radial-gradient(closest-side,transparent 74%,#000 86%,#000 97%,transparent 100%);mask:radial-gradient(closest-side,transparent 74%,#000 86%,#000 97%,transparent 100%)}
.pic::before{content:"";position:absolute;left:18%;top:12%;width:26%;height:16%;border-radius:50%;background:rgba(255,255,255,.85);transform:rotate(-30deg);pointer-events:none;z-index:1}
.pic.f2::after{animation-duration:10s;animation-direction:reverse}.pic.f4::after{animation-duration:6s}.pic.f5::after{animation-direction:reverse}

/* off-screen things rest; slow phones get a lighter mode */
.zz,.zz *{animation-play-state:paused!important}
body.lite .net{display:none}

/* bubbles from the little beluga */
.mbb{height:calc(var(--w)*var(--u));border-radius:50%;border:1px solid rgba(178,199,224,.9);background:radial-gradient(circle at 30% 30%,#fff,rgba(255,255,255,.15));pointer-events:none;z-index:6;animation:mbb 2.4s ease-out both}
@keyframes mbb{from{opacity:0;transform:scale(.3)}15%{opacity:1}to{opacity:0;transform:translate(calc(var(--dx)*var(--u)),calc(-48*var(--u))) scale(1.15)}}

/* product photos in the customer's own detail */
.dphotos{margin-top:calc(18*var(--u))}
.dpt{display:flex;align-items:center;gap:calc(6*var(--u));font:500 calc(13*var(--u))/1 var(--f-ryder);color:var(--ink);margin-bottom:calc(10*var(--u))}
.dpt img{width:calc(14*var(--u));height:auto}
.dpt small{margin-left:auto;font-size:calc(11*var(--u));color:var(--mist)}
.dstrip{display:flex;gap:calc(10*var(--u));overflow-x:auto;scroll-snap-type:x mandatory;padding-bottom:calc(6*var(--u));scrollbar-width:none}
.dstrip::-webkit-scrollbar{display:none}
.dph{flex:none;width:calc(132*var(--u));aspect-ratio:1;max-width:100%;border-radius:calc(16*var(--u));overflow:hidden;scroll-snap-align:start;border:.5px solid var(--foam);background:#fff;padding:calc(5*var(--u));
  box-shadow:0 calc(4*var(--u)) calc(12*var(--u)) rgba(107,136,171,.15);animation:shellPop .6s cubic-bezier(.3,1.5,.5,1) both calc(.4s + var(--k)*.1s)}
.dph img{width:100%;height:100%;object-fit:cover;border-radius:calc(12*var(--u));transition:transform .3s}
.dph:active img{transform:scale(.96)}

/* ===================== round 6: all the life back, using only cheap motion (transform / opacity) ===================== */
.net{display:block;inset:-10%;opacity:.07}
.rays{animation:rays 14s ease-in-out infinite alternate}
.caustic{opacity:.6}
.jelly.j3{display:block}
.twinkle-l{text-shadow:0 0 calc(10*var(--u)) rgba(221,230,241,.85);animation:ltrPulse 6s ease-in-out infinite}
.twinkle-l.d1{animation-delay:-1.5s}.twinkle-l.d2{animation-delay:-3s}.twinkle-l.d3{animation-delay:-4.5s}
@keyframes ltrPulse{50%{opacity:.72}}
.iscallop{filter:drop-shadow(0 0 calc(3*var(--u)) rgba(221,230,241,.9));animation:ltrPulse 5s ease-in-out infinite}
.lbl{text-shadow:0 0 calc(6*var(--u)) rgba(178,199,224,.7)}
.hshine{display:block;background:radial-gradient(circle at 40% 35%,rgba(255,255,255,.6),transparent 62%);opacity:0;animation:opPulse 5s ease-in-out infinite}
@keyframes opPulse{0%,100%{opacity:0}50%{opacity:1}}
.qpay::before,.qbadge::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;animation:opPulse 2.8s ease-in-out infinite}
.qpay::before{box-shadow:0 0 calc(7*var(--u)) var(--pc)}
.qbadge::before{box-shadow:0 0 calc(5*var(--u)) rgba(178,199,224,.95);animation-duration:3.4s}
.qtitle{filter:drop-shadow(0 0 calc(4*var(--u)) rgba(221,230,241,.9))}
/* heart sprinkles */
.hsp{position:absolute;width:calc(10*var(--u));height:calc(10*var(--u));pointer-events:none;
  background:radial-gradient(circle,#fff 0 18%,transparent 20%),conic-gradient(from 45deg,transparent 0 22%,#fff 24% 26%,transparent 28% 47%,#fff 49% 51%,transparent 53% 72%,#fff 74% 76%,transparent 78% 97%,#fff 99%);
  animation:hsp 2.2s ease-out forwards}
@keyframes hsp{0%{opacity:0;transform:translate(0,0) scale(.2) rotate(0)}20%{opacity:1;transform:translate(0,0) scale(1) rotate(30deg)}100%{opacity:0;transform:translate(var(--dx),calc(70*var(--u))) scale(.4) rotate(160deg)}}

/* "your queue" pointer sits under the star, clear of the filter chips above */
.mypoint img{width:calc(44*var(--u));height:calc(37*var(--u));left:calc(-8*var(--u));top:calc(50*var(--u));transform:rotate(-14deg)}
.mypoint span{left:calc(62*var(--u));top:calc(95*var(--u));transform:translate(-50%,-50%);font-size:calc(11*var(--u));padding:calc(3*var(--u)) calc(8*var(--u))}
.ab.mypoint>img{position:absolute;width:calc(44*var(--u));height:calc(37*var(--u));left:calc(-8*var(--u));top:calc(50*var(--u));transform:rotate(-14deg)}

/* ===================== round 7 ===================== */
/* Safari clips script swashes that reach past the letter box once the letter is animated — give the ink room, same spot */
.ltr{padding:calc(56*var(--u));margin:calc(-56*var(--u)) 0 0 calc(-56*var(--u))}
/* Thai "ค้นหา" is wider than "ping": centre it in the space left of the sound icon */
body.th .qping .pt{left:calc(21.5*var(--u))}

/* soap-bubble rainbow, sprinkled lightly where bubbles and pearls already are */
.tapb,.mbb,.ld-sea i,.burst:not(.pearl){border-color:rgba(255,182,219,.85) rgba(170,214,255,.9) rgba(190,240,220,.85) rgba(255,232,170,.85)}
.mbb:nth-child(odd),.ld-sea i:nth-child(even){border-color:rgba(214,190,255,.85) rgba(255,190,220,.85) rgba(170,214,255,.9) rgba(195,240,220,.85)}
.burst.pearl{background:radial-gradient(circle at 35% 30%,#fff 0 28%,transparent 46%),conic-gradient(from 30deg,#f6e3ef,#e2ecf8,#e3f4ee,#f6f1e1,#ece4f6,#f6e3ef)}
.jelly::before{box-shadow:0 0 14px rgba(178,199,224,.6),inset 0 -3px 5px rgba(255,190,225,.35),inset 3px 0 5px rgba(175,220,255,.35),inset -3px 0 5px rgba(200,245,225,.3)}
.myring{border-color:#9fb8d6 #c9b6e6 #9fb8d6 #e8bcd6}
.sonar.pinging .pulse b{border-color:rgba(107,136,171,.8) rgba(200,170,225,.7) rgba(107,136,171,.8) rgba(160,205,240,.75)}
.pn .grab{background:linear-gradient(90deg,#dde6f1,#ecdcec 30%,#dde8f6 50%,#dcefe8 70%,#dde6f1)}
.hsp:nth-child(3n){background:radial-gradient(circle,#fff 0 18%,transparent 20%),conic-gradient(from 45deg,transparent 0 22%,#ffd6ea 24% 26%,transparent 28% 47%,#d4e8ff 49% 51%,transparent 53% 72%,#dff7ec 74% 76%,transparent 78% 97%,#fff 99%)}

/* ===================== round 8: rainbow you can actually see ===================== */
/* mother-of-pearl sheen on the pearl string and the silver heart frame (masked to their own shapes) */
.nacre{position:absolute;pointer-events:none;
  background:linear-gradient(115deg,#ffb3d9 0%,#a8d4ff 22%,#bff2dc 42%,#ffeeb0 60%,#d8c2ff 80%,#ffb3d9 100%);
  -webkit-mask-size:100% 100%;mask-size:100% 100%;animation:nacre 6s ease-in-out infinite}
.nacre.np{inset:0;--o1:.12;--o2:.26;-webkit-mask-image:url(a/pearls.webp);mask-image:url(a/pearls.webp)}
.nacre.nh{--o1:.06;--o2:.16;-webkit-mask-image:url(a/heart-frame.webp);mask-image:url(a/heart-frame.webp);animation-delay:-3s}
@keyframes nacre{0%,100%{opacity:var(--o1)}50%{opacity:var(--o2)}}
.heart .ribbon{z-index:2}

/* a few big soap bubbles drifting up behind the page, same rainbow rim as the preview bubbles */
.soaps b{position:absolute;bottom:-90px;border-radius:50%;width:var(--s);height:var(--s);
  background:radial-gradient(circle at 32% 28%,rgba(255,255,255,.9) 0 9%,transparent 14%),radial-gradient(circle,transparent 60%,rgba(255,255,255,.35));
  animation:soapUp var(--t) linear infinite;animation-delay:var(--d)}
.soaps b::after{content:"";position:absolute;inset:0;border-radius:50%;
  background:conic-gradient(rgba(255,170,215,.9),rgba(160,215,255,.9),rgba(185,255,225,.9),rgba(255,240,170,.9),rgba(215,180,255,.9),rgba(255,170,215,.9));
  -webkit-mask:radial-gradient(closest-side,transparent 80%,#000 90%,#000 97%,transparent 100%);mask:radial-gradient(closest-side,transparent 80%,#000 90%,#000 97%,transparent 100%);
  animation:iri 9s linear infinite}
.soaps b:nth-child(1){left:8%;--s:46px;--t:34s;--d:-4s}
.soaps b:nth-child(2){left:78%;--s:30px;--t:28s;--d:-15s}
.soaps b:nth-child(3){left:40%;--s:62px;--t:42s;--d:-26s}
.soaps b:nth-child(4){left:90%;--s:22px;--t:24s;--d:-9s}
.soaps b:nth-child(5){left:22%;--s:26px;--t:30s;--d:-20s}
.soaps b:nth-child(6){left:62%;--s:38px;--t:38s;--d:-33s}
.soaps b:nth-child(even)::after{animation-direction:reverse}
@keyframes soapUp{0%{transform:translate(0,0)}25%{transform:translate(14px,-30vh)}50%{transform:translate(-10px,-60vh)}75%{transform:translate(12px,-90vh)}100%{transform:translate(0,-125vh)}}
body.lite .soaps b:nth-child(n+4){display:none}

/* chosen filter chip gets a thin rainbow edge */
.qchip.on{border-color:transparent;background:linear-gradient(var(--foam),var(--foam)) padding-box,linear-gradient(100deg,#ffbfdf,#b5daff,#c4f2df,#ffecb5,#dcc8ff) border-box;border-width:1px;border-style:solid}
/* never let the page slide sideways on phones (letter swashes and floating bits stay inside the frame) */
html{overflow-x:hidden;overflow-x:clip}
body{overflow-x:clip}
.stage{overflow-x:clip}
.qinput.k{font-size:16px!important;width:calc(var(--w)*var(--u)/var(--k));height:calc(var(--h)*var(--u)/var(--k));border-radius:calc(9*var(--u)/var(--k));padding:0 calc(8*var(--u)/var(--k));transform:scale(var(--k));transform-origin:0 0}
.qinput.k:focus{box-shadow:0 0 0 calc(2*var(--u)/var(--k)) rgba(221,230,241,.9)}

/* rainbow in the whale sonar: two of the four rings shimmer like a soap film, the beam leaves a soft prism tail */
.nacre.nr1{-webkit-mask-image:url(a/ring1.webp);mask-image:url(a/ring1.webp);--o1:.45;--o2:.85;
  background:linear-gradient(100deg,#ffa8d4,#9ccdfc 25%,#b2ecd2 45%,#ffe4a0 65%,#cdb2ff 85%,#ffa8d4)}
.nacre.nr3{-webkit-mask-image:url(a/ring3.webp);mask-image:url(a/ring3.webp);--o1:.35;--o2:.75;
  background:linear-gradient(280deg,#ffa8d4,#9ccdfc 25%,#b2ecd2 45%,#ffe4a0 65%,#cdb2ff 85%,#ffa8d4)}
.ring.nacre{animation:nacre 5s ease-in-out infinite}
.ring.nacre.nr3{animation-delay:-2.5s}
.sweep i{background:conic-gradient(from 0deg,rgba(178,199,224,.55),rgba(205,185,240,.32) 5%,rgba(255,185,220,.24) 10%,rgba(255,232,180,.16) 14%,rgba(185,238,215,.1) 18%,transparent 23%)}
.pulse b:nth-child(2){border-color:rgba(255,185,220,.7) rgba(165,210,250,.75) rgba(190,238,215,.7) rgba(215,190,250,.7)}
/* softer: background soap-bubble rims are just an accent */
.soaps b{opacity:.6}
.soaps b::after{-webkit-mask:radial-gradient(closest-side,transparent 90%,#000 95%,#000 98%,transparent 100%);mask:radial-gradient(closest-side,transparent 90%,#000 95%,#000 98%,transparent 100%)}
/* hidden YouTube player that carries the background music */
#ytm{position:fixed;left:-300px;bottom:0;width:200px;height:200px;opacity:0;pointer-events:none;z-index:-1}

/* ===================== round 9: month dividers, tap-to-check, tracking + amounts ===================== */
/* month divider between queue groups (only when the board spans 2+ months) */
.qmonth{position:absolute;left:calc(24*var(--u));width:calc(392*var(--u));height:calc(24*var(--u));display:flex;align-items:center;gap:calc(10*var(--u));pointer-events:none}
.qmonth i{flex:1;height:1px;background:repeating-linear-gradient(90deg,var(--mist) 0 calc(4*var(--u)),transparent calc(4*var(--u)) calc(8*var(--u)));opacity:.7;position:relative}
.qmonth i:first-child::after,.qmonth i:last-child::before{content:"";position:absolute;top:50%;width:calc(6*var(--u));height:calc(6*var(--u));border-radius:50%;transform:translateY(-50%);
  background:radial-gradient(circle at 35% 30%,#fff 0 30%,transparent 50%),conic-gradient(from 30deg,#f6e3ef,#e2ecf8,#e3f4ee,#f6f1e1,#ece4f6,#f6e3ef)}
.qmonth i:first-child::after{right:0}.qmonth i:last-child::before{left:0}
.qmonth span{font:400 calc(14*var(--u))/1 var(--f-ryder);color:var(--ink);letter-spacing:.04em;white-space:nowrap}
body.th .qmonth span{font-size:calc(13*var(--u))}
.qrow{cursor:pointer}

/* "check this queue" sheet */
.vform{display:grid;gap:calc(10*var(--u));padding-bottom:calc(10*var(--u))}
.vform.nope{animation:nope .45s ease}
.vhead{display:flex;align-items:center;gap:calc(12*var(--u))}
.vhead .dstar{width:calc(64*var(--u));height:calc(67*var(--u))}
.vhead .dstar b{font-size:calc(26*var(--u))}
.vhead h3{margin:0;font:400 calc(22*var(--u))/1.2 var(--f-ryder);color:var(--ink)}
.vhead p{margin:calc(2*var(--u)) 0 0;font:400 calc(13*var(--u))/1.4 var(--f-ryder);color:var(--mist)}
.vhint{margin:0;font:400 calc(13*var(--u))/1.5 var(--f-ryder);color:var(--ink)}
.vin{width:100%;box-sizing:border-box;font:400 16px/1.4 var(--f-ryder);color:var(--ink);background:rgba(178,199,224,.18);border:0;border-radius:calc(12*var(--u));padding:calc(12*var(--u)) calc(14*var(--u));outline:none}
.vin:focus{box-shadow:0 0 0 calc(2*var(--u)) rgba(221,230,241,.95);background:rgba(178,199,224,.26)}
.vin.nope{animation:nope .45s ease}
.vin::placeholder{color:rgba(107,136,171,.5)}
.vmsg{margin:0;min-height:1em;font:400 calc(12*var(--u))/1.4 var(--f-ryder);color:#c07a8e}
.vbtn{display:flex;align-items:center;justify-content:center;gap:calc(8*var(--u));border:0;border-radius:calc(12*var(--u));padding:calc(11*var(--u));background:var(--mist);color:#fff;font:400 calc(18*var(--u))/1 var(--f-ryder);cursor:pointer;transition:transform .25s cubic-bezier(.3,1.6,.5,1)}
.vbtn img{width:calc(11*var(--u));height:calc(13.5*var(--u))}
.vbtn:active{transform:scale(.96)}.vbtn[disabled]{opacity:.65}

/* tracking number + amounts in the customer's detail */
.dtrk{grid-template-columns:calc(80*var(--u)) 1fr auto!important}
.dtrk b{letter-spacing:.03em;word-break:break-all}
.dcopy{border:.5px solid var(--foam);background:#fff;color:var(--ink);font:400 calc(11*var(--u))/1 var(--f-ryder);border-radius:99px;padding:calc(5*var(--u)) calc(10*var(--u));cursor:pointer}
.dmoney{margin-top:calc(8*var(--u));display:grid;gap:0;background:rgba(255,255,255,.75);border:.5px solid var(--foam);border-radius:calc(13*var(--u));padding:calc(4*var(--u)) calc(14*var(--u));animation:rowIn .5s .18s both}
.dmoney>div{display:flex;align-items:baseline;justify-content:space-between;gap:calc(10*var(--u));padding:calc(8*var(--u)) 0;border-bottom:1px dashed var(--foam)}
.dmoney>div:last-child{border-bottom:0}
.dmoney small{font:500 calc(12*var(--u))/1.4 var(--f-ryder);color:var(--mist)}
.dmoney b{font:500 calc(15*var(--u))/1.4 var(--f-ryder);color:var(--ink)}
.dleft b{color:#c07a8e;font-size:calc(17*var(--u))}
.dleft.zero b{color:var(--paid,#5f9e6e);font-size:calc(14*var(--u))}

/* ===================== round 10: gallery v2, photo info, editable Sonar title ===================== */
@font-face{font-family:'Elegant';src:url(fonts/elegant.woff2) format('woff2'),url(fonts/elegant.woff) format('woff');font-display:swap}
.qtitle-txt{width:auto;height:auto;transform:translate(-50%,-50%);font:400 calc(48*var(--u))/calc(15*var(--u)) 'Elegant','bellisa','Ryder',cursive;color:var(--ink);white-space:nowrap;pointer-events:none;
  filter:drop-shadow(0 0 calc(4*var(--u)) rgba(221,230,241,.9));animation:titleFloat 6s ease-in-out infinite}
.qtitle-txt.t2{animation-delay:-3s}
/* the loader waits for the shop's name before showing it */
body:not(.cfg) .ld-name{opacity:0}
.ld-name{transition:opacity .3s}

/* gallery: Figma "pic v2" frames */
.gcell{background:#fff;border:.5px solid var(--foam);border-radius:calc(14*var(--u));box-shadow:0 calc(2*var(--u)) calc(8*var(--u)) rgba(178,199,224,.18);padding:0;overflow:hidden}
.ab.gcell>img{left:calc(5.61*var(--u));top:calc(5.61*var(--u));width:calc(116*var(--u));height:calc(116*var(--u));border-radius:calc(10*var(--u));object-fit:cover}

/* full photo viewer with the shop's info */
.lb{overflow:auto;padding:max(16px,env(safe-area-inset-top,0px)) 16px max(16px,env(safe-area-inset-bottom,0px));box-sizing:border-box}
.lbw{display:flex;flex-direction:column;align-items:center;gap:14px;max-width:min(92vw,460px);margin:auto}
.lbw>img{max-width:100%;max-height:80vh;width:auto;height:auto;border-radius:16px;box-shadow:0 10px 30px rgba(107,136,171,.3);animation:lbIn .4s cubic-bezier(.2,.8,.2,1)}
.lb.has-info .lbw>img{max-height:62vh}
.lbinfo{width:100%;box-sizing:border-box;background:rgba(255,255,255,.92);border:.5px solid var(--foam);border-radius:18px;padding:14px 18px;color:var(--ink);font-family:var(--f-ryder);box-shadow:0 8px 24px rgba(107,136,171,.15);animation:rowIn .45s .1s both;text-align:left}
.lbh{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--mist);letter-spacing:.06em;margin-bottom:6px}
.lbh img{width:14px;height:13px}
.lbname{display:block;font:400 19px/1.35 var(--f-anak);color:var(--ink);margin-bottom:4px}
.lbrow{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:7px 0;border-bottom:1px dashed var(--foam)}
.lbrow small{font-size:13px;color:var(--mist)}.lbrow span{font-size:16px}
.lbnote{margin:10px 0 0;font-size:14px;line-height:1.55;color:var(--ink)}
.lbx{position:fixed;top:max(14px,env(safe-area-inset-top,0px));right:max(14px,env(safe-area-inset-right,0px));width:38px;height:38px;border-radius:50%;border:.5px solid var(--foam);background:rgba(255,255,255,.9);color:var(--ink);font:400 22px/1 var(--f-ryder);cursor:pointer;z-index:2}

/* ===================== round 9: brand letters fully visible ===================== */
/* script capitals (Billa Mount) swing ~110px past their own box to the right — Safari clips that once the letter animates, so give the box room on the right */
.ltr{padding:calc(56*var(--u)) calc(200*var(--u)) calc(56*var(--u)) calc(56*var(--u))}
/* second word sits a touch smaller so its capital's swash stays inside the 440 frame instead of being cut at the edge */
.ltr.d2,.ltr.d3{font-size:calc(74*var(--u))}

/* ===================== round 10: phone / iPad polish ===================== */
/* half-pixel outlines vanish in pieces on iPhone/iPad (worst on the floating menu): draw every outline as a full 1px line in a softer tone */
.ibg,.menubox,.mbtn,.gtab,.lang,.snd,.say{border:1px solid rgba(178,199,224,.75)}
.qchip,.qcard,.gcell,.dph,.dcopy,.dmoney,.lbinfo,.lbx{border-width:1px}
/* centre each label on its letters, not on the font's tall line box (Safari set the words low in their buttons) */
.mbtn span{line-height:1;transform:none}
@supports (text-box:trim-both cap alphabetic){.mbtn span,.gtab span,.qchip span,.qping .pt{text-box:trim-both cap alphabetic;line-height:1}}
/* shop card text: even line lengths instead of a lone word on its own line */
.itext .ln{display:block;text-wrap:balance}
/* the sea always meets the bottom of the screen, even when the screen is taller than the page */
.stage{min-height:100lvh}
.wave{top:auto;bottom:0}
/* wider than a phone: the wave fades out at its sides instead of ending in a hard edge */
@media (min-width:441px){.wave{-webkit-mask-image:linear-gradient(90deg,transparent,#000 14%,#000 86%,transparent);mask-image:linear-gradient(90deg,transparent,#000 14%,#000 86%,transparent)}}

/* ===================== round 11: iPhone Safari ===================== */
/* Safari flickers rounded boxes that clip moving children with overflow:hidden (the rising bubbles in the menu buttons),
   so the outline comes and goes. Clip with a rounded clip-path instead: same look, no flicker. */
.mbtn,.gtab,.qchip,.qping{overflow:visible}
.mbtn{clip-path:inset(0 round calc(13*var(--u)))}
.gtab{clip-path:inset(0 round calc(9*var(--u)))}
.qping{clip-path:inset(0 round calc(9*var(--u)))}
.qchip{clip-path:inset(0 round calc(10*var(--u)))}
/* the filter chips pop in once and then stay put (no animation kept alive on them afterwards) */
.qchip{animation-fill-mode:backwards}
/* one outline colour everywhere so no edge looks fainter than its neighbour */
.qchip,.qcard{border-color:rgba(178,199,224,.75)}
/* menu box and buttons hold still (the constant bob kept them on Safari's flicker-prone layers); the little wave every few seconds stays */
.menubox,.mbtn{animation:none}.mbtn.mwv{animation:mwave .7s cubic-bezier(.3,1.6,.5,1)}

/* Thai text everywhere in Ryder (it has Thai letters); Mali only as a last resort */
:root{--f-num:'CHT APPLE PIE','Ryder','Mali',ui-rounded,sans-serif;--f-cera:'Cera Round Pro','Quicksand','Ryder','Mali',ui-rounded,sans-serif}
body.th .qcat,body.th .qdate,body.th .qmonth span{font-family:var(--f-ryder);font-weight:500}

/* queue cards: the small labels were 3-5px on a phone — make them readable without crowding the card */
.slbl{font-size:calc(6.5*var(--u));line-height:1.15}
body.th .slbl{font-size:calc(7.5*var(--u))}
/* status badge: big enough to read on a phone; the lines under it step down to make room */
/* status badge: same box as the design (11u tall), only the words larger */
.qbadge{max-width:calc(74*var(--u))!important}
.qbadge span{font-size:calc(8*var(--u))}
/* left column sits with even space above and below inside the card */
.qcat{margin-top:calc(-1*var(--u))}
body.th .qcat{font-size:calc(10*var(--u))}
/* dates sit in the right column under the payment pill: right-aligned, wrapping as "1 ต.ค. –" / "5 ต.ค." so they never run into the step labels */
.qdate{font-size:calc(6.5*var(--u));line-height:calc(8*var(--u));left:auto!important;right:calc(37*var(--u));transform:none;margin-top:calc(-1*var(--u));white-space:nowrap;text-align:right}
body.th .qdate{font-size:calc(7*var(--u))}

/* ===================== round 12: own heart photo ===================== */
/* a photo the shop uploads is a plain rectangle: cut it to the heart (the default photo's own outline) and fill without stretching */
.hphoto{object-fit:cover;-webkit-mask:url(a/heart-mask.webp) center/100% 100% no-repeat;mask:url(a/heart-mask.webp) center/100% 100% no-repeat}
/* a bubble photo the shop uploads is a plain rectangle: keep it round and unstretched like the built-in ones */
.pic img{object-fit:cover;border-radius:50%}
/* own bubble photo = the Figma "pic" bubble: photo at 80%, a white sheen (linear 80%→0 at 80%), a hairline white rim with a soft
   blue drop shadow, and the two thin highlight arcs at the top right */
.pic.own img{opacity:.8}
.pic .bfx{position:absolute;inset:0;border-radius:50%;pointer-events:none;z-index:1;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 65 65'%3E%3Cpath d='M46.28 8.19A15.43 15.43 0 0 1 54.37 15.74M55.08 16.56A15.43 15.43 0 0 1 56.36 18.71' fill='none' stroke='%23fff' stroke-width='2.15'/%3E%3C/svg%3E") 0 0/100% 100% no-repeat,
    linear-gradient(116deg,rgba(255,255,255,.64),rgba(255,255,255,0));
  box-shadow:0 0 0 calc(.3*var(--u)) #fff,0 calc(1*var(--u)) calc(5*var(--u)) rgba(107,136,171,.25)}
/* the built-in bubble pictures are exported with their drop shadow, so the bubble itself fills only the middle 86% of the box
   (Figma: bubble 65 inside a 75.6 × 75.6 export, a little high). Put an own photo in that same circle so it never runs past the rim. */
.pic.own img,.pic .bfx{position:absolute;inset:auto;left:7%;top:5.7%;width:86%;height:86%}
/* gallery photo sits exactly in the middle of its card (it was offset by the card's border) */
.ab.gcell>img{right:0;bottom:0;left:0;top:0;margin:auto}
