/* ============================================================
   晴空放送 · rooms — player dock, shard hud, music, arcade
   ============================================================ */

/* ─────────── bgm dock (bottom-left, foldable) ─────────── */
.dock{ position:fixed; left:16px; bottom:16px; z-index:60; }
.dock__panel{
  display:flex; align-items:center; gap:12px;
  width:min(78vw,290px);
  padding:10px 12px;
  border-radius:18px;
  background:rgba(255,255,255,.9);
  backdrop-filter:blur(16px) saturate(150%);
  border:1.5px solid var(--line-warm);
  box-shadow:var(--sh-3);
  transform-origin:0 100%;
  transition:opacity .3s, scale .34s cubic-bezier(.3,1.4,.5,1), translate .34s;
}
.dock__disc{
  width:42px; height:42px; flex:none; border-radius:50%;
  background:
    radial-gradient(circle,#fff 0 15%,rgba(255,255,255,0) 16%),
    repeating-radial-gradient(circle,rgba(255,255,255,.45) 0 2px,rgba(0,0,0,0) 2px 4px),
    conic-gradient(from 0deg,var(--sakura-mid),var(--mizu-mid),var(--lemon),var(--sakura-mid));
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.7);
  animation:spin 4.5s linear infinite; animation-play-state:paused;
}
.dock.is-playing .dock__disc{ animation-play-state:running }
.dock__mid{ flex:1; min-width:0 }
.dock__label{ font-family:var(--f-mono); font-size:.52rem; letter-spacing:.2em; color:var(--ink-3) }
.dock__track{
  font-family:var(--f-round); font-weight:700; font-size:.84rem; color:var(--ink);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.dock__bar{ height:4px; margin-top:5px; border-radius:3px; background:var(--mizu-soft); overflow:hidden; cursor:pointer }
.dock__bar i{ display:block; height:100%; width:0; border-radius:3px; background:linear-gradient(90deg,var(--sakura),var(--mizu)) }
.dock__ctl{ display:flex; align-items:center; gap:3px; flex:none }
.dock__ctl button{
  width:29px; height:29px; border-radius:50%;
  display:grid; place-items:center; font-size:.76rem; color:var(--ink-2);
  transition:background .2s, transform .2s, color .2s;
}
.dock__ctl button:hover{ background:var(--sakura-soft); color:var(--sakura); transform:scale(1.12) }
.dock__fold{
  position:absolute; top:-9px; right:-9px;
  width:24px; height:24px; border-radius:50%;
  display:grid; place-items:center; font-size:.6rem; color:var(--ink-2);
  background:var(--paper); border:1.5px solid var(--line-warm); box-shadow:var(--sh-1);
  transition:transform .2s, color .2s;
}
.dock__fold:hover{ transform:scale(1.14); color:var(--sakura) }

.dock__ball{
  position:absolute; left:0; bottom:0;
  width:50px; height:50px; border-radius:50%;
  display:grid; place-items:center; font-size:1.15rem; color:#fff;
  background:linear-gradient(140deg,var(--sakura),var(--mizu-mid));
  border:2px solid rgba(255,255,255,.85);
  box-shadow:var(--sh-2),var(--sh-glow);
  opacity:0; scale:.4; pointer-events:none;
  transition:opacity .3s, scale .34s cubic-bezier(.3,1.5,.5,1);
}
.dock__ball::after{
  content:''; position:absolute; inset:-7px; border-radius:50%;
  border:2px solid rgba(255,143,180,.45);
  animation:ring 2.6s ease-out infinite; opacity:0;
}
.dock.is-playing .dock__ball::after{ opacity:1 }
@keyframes ring{ 0%{ scale:.82; opacity:.7 } 100%{ scale:1.35; opacity:0 } }

.dock.is-folded .dock__panel{ opacity:0; scale:.5; translate:0 12px; pointer-events:none }
.dock.is-folded .dock__ball{ opacity:1; scale:1; pointer-events:auto }
.dock.is-folded .dock__ball:hover{ scale:1.08 }

@media (max-width:520px){ .dock{ left:10px; bottom:10px } .dock__panel{ width:min(88vw,262px) } }

/* ─────────── shard counter + panel ─────────── */
.chip{
  display:inline-flex; align-items:center; gap:.4em; flex:none;
  padding:.34em .8em .34em .6em;
  border-radius:999px;
  background:linear-gradient(140deg,#fff7e4,#fff);
  border:1.5px solid rgba(255,206,110,.5);
  box-shadow:var(--sh-1);
  font-family:var(--f-mono); font-size:.72rem; font-weight:700; color:#a5813a;
  transition:transform .22s cubic-bezier(.3,1.5,.5,1), box-shadow .22s;
}
.chip:hover{ transform:translateY(-1px) scale(1.04); box-shadow:var(--sh-2) }
.chip__star{
  width:13px; height:13px;
  background:conic-gradient(from 45deg,var(--lemon),#fff 30%,var(--sakura-mid) 60%,var(--lemon));
  clip-path:polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);
}
.chip.is-hit{ animation:chip-hit .6s cubic-bezier(.3,1.6,.4,1) }
@keyframes chip-hit{ 40%{ transform:scale(1.28) rotate(-6deg) } }

.sheet{
  position:fixed; z-index:62; right:12px; top:calc(var(--nav-h) + 8px);
  width:min(92vw,318px);
  padding:18px;
  border-radius:var(--r-lg);
  background:rgba(255,255,255,.96);
  backdrop-filter:blur(14px);
  border:1.5px solid var(--line-warm);
  box-shadow:var(--sh-3);
  animation:pop-card .34s cubic-bezier(.3,1.4,.5,1) both;
}
.sheet__x{ position:absolute; right:12px; top:10px; color:var(--ink-3); font-size:.9rem }
.sheet__x:hover{ color:var(--sakura) }
.sheet__grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(52px,1fr)); gap:8px; margin:14px 0 12px }
.slot{
  aspect-ratio:1; border-radius:12px; display:grid; place-items:center;
  background:var(--paper-cool); border:1px dashed var(--line);
  font-family:var(--f-mono); font-size:.8rem; color:var(--ink-4);
}
.slot.is-got{
  background:linear-gradient(150deg,#fff6dd,#ffeef4);
  border:1px solid rgba(255,206,110,.55); color:#a5813a;
  box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.7);
}
.slot.is-got::before{
  content:''; width:16px; height:16px;
  background:conic-gradient(from 45deg,var(--lemon),#fff 30%,var(--sakura-mid) 60%,var(--lemon));
  clip-path:polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);
}
.sheet__hint{ font-size:.78rem; color:var(--ink-2); line-height:1.75 }
.sheet__foot{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:14px; padding-top:12px; border-top:1px dashed var(--line) }
.link-s{ font-family:var(--f-mono); font-size:.66rem; letter-spacing:.08em; color:var(--ink-3) }
.link-s:hover{ color:var(--sakura) }

/* ─────────── the music room ─────────── */
.room{
  display:grid; grid-template-columns:minmax(0,1.25fr) minmax(0,.9fr);
  gap:clamp(18px,2.6vw,32px); align-items:start;
}
.deck{
  position:relative;
  padding:clamp(20px,3vw,34px);
  border-radius:var(--r-xl);
  background:linear-gradient(168deg,#fff9f3 0%,var(--paper) 46%,var(--paper-cool) 100%);
  border:1.5px solid var(--line-warm);
  box-shadow:var(--sh-3);
}
.deck__top{ display:flex; align-items:center; gap:clamp(16px,2.4vw,28px) }
.deck__disc{
  width:clamp(112px,17vw,168px); aspect-ratio:1; flex:none; border-radius:50%;
  background:
    radial-gradient(circle,#fff 0 13%,rgba(255,255,255,0) 14%),
    radial-gradient(circle,var(--sakura-soft) 0 26%,rgba(0,0,0,0) 27%),
    repeating-radial-gradient(circle,rgba(255,255,255,.42) 0 3px,rgba(0,0,0,0) 3px 7px),
    conic-gradient(from 0deg,var(--sakura-mid),var(--mizu-mid),var(--lemon),var(--grape),var(--sakura-mid));
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.8), var(--sh-2);
  animation:spin 7s linear infinite; animation-play-state:paused;
}
.is-playing .deck__disc{ animation-play-state:running }
.deck__info{ min-width:0; flex:1 }
.deck__title{
  font-family:var(--f-round); font-weight:900; font-size:clamp(1.15rem,2.4vw,1.7rem);
  line-height:1.35; margin:.16em 0 .5em; word-break:break-word;
}
.deck__prog{ height:8px; border-radius:5px; background:var(--mizu-soft); overflow:hidden; cursor:pointer }
.deck__prog i{ display:block; height:100%; width:0; border-radius:5px; background:linear-gradient(90deg,var(--sakura),var(--mizu)) }
.deck__time{ display:flex; justify-content:space-between; margin-top:6px; font-family:var(--f-mono); font-size:.64rem; color:var(--ink-3) }
.deck__ctl{ display:flex; align-items:center; gap:10px; margin-top:16px }
.deck__ctl button{
  width:40px; height:40px; border-radius:50%; display:grid; place-items:center;
  background:var(--paper); border:1.5px solid var(--line); box-shadow:var(--sh-1);
  color:var(--ink-2); font-size:.9rem;
  transition:transform .2s cubic-bezier(.3,1.5,.5,1), box-shadow .2s, color .2s;
}
.deck__ctl button:hover{ transform:scale(1.1); color:var(--sakura); box-shadow:var(--sh-2) }
.deck__ctl .is-main{
  width:56px; height:56px; font-size:1.1rem; color:#fff; border:0;
  background:linear-gradient(140deg,var(--sakura),#ff9ec4 55%,var(--mizu-mid));
  box-shadow:var(--sh-2),var(--sh-glow);
}
.deck__list{ margin-top:20px; padding-top:16px; border-top:1px dashed var(--line); display:flex; flex-direction:column; gap:4px }
.trk{
  display:flex; align-items:center; gap:10px;
  padding:.5em .7em; border-radius:12px;
  font-size:.88rem; color:var(--ink-2); cursor:pointer;
  transition:background .2s, color .2s;
}
.trk:hover{ background:var(--sakura-soft); color:var(--ink) }
.trk.is-cur{ background:var(--mizu-soft); color:var(--ink); font-weight:700 }
.trk span{ font-family:var(--f-mono); font-size:.66rem; color:var(--ink-3) }
.trk b{ flex:1; min-width:0; font-weight:inherit; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }

.side{ display:flex; flex-direction:column; gap:clamp(16px,2.2vw,24px) }
@media (max-width:940px){ .room{ grid-template-columns:1fr } }

/* ─────────── chart + guess ─────────── */
.rank{ display:flex; flex-direction:column; gap:2px; margin-top:14px }
.rank li{
  display:grid; grid-template-columns:26px minmax(0,1fr) auto; gap:10px; align-items:center;
  padding:.42em .5em; border-radius:10px; font-size:.86rem;
}
.rank li:nth-child(odd){ background:rgba(120,152,196,.05) }
.rank li b{ font-family:var(--f-mono); font-size:.72rem; color:var(--sakura); text-align:center }
.rank li i{ font-style:normal; overflow:hidden; text-overflow:ellipsis; white-space:nowrap }
.rank li i em{ font-style:normal; color:var(--ink-3); font-size:.8em; margin-left:.4em }
.rank li span{ font-family:var(--f-mono); font-size:.62rem; color:var(--ink-3) }

.tabs{ display:flex; gap:6px; margin-bottom:14px }
.tabs button{
  padding:.4em .9em; border-radius:999px;
  font-family:var(--f-round); font-weight:700; font-size:.82rem; color:var(--ink-3);
  border:1.5px solid transparent; transition:all .2s;
}
.tabs button.is-on{ color:var(--ink); background:var(--sakura-soft); border-color:var(--line-warm) }
.field{ display:flex; gap:8px; margin-top:12px }
.field input{
  flex:1; min-width:0; padding:.6em .9em;
  border-radius:12px; border:1.5px solid var(--line);
  background:var(--paper-cool); font-size:.9rem;
  transition:border-color .2s, background .2s;
}
.field input:focus{ outline:none; border-color:var(--sakura-mid); background:#fff }
.field .btn{ padding:.55em 1.1em; font-size:.85rem }
.verdict{ margin-top:12px; font-size:.88rem; line-height:1.75; min-height:1.6em }
.verdict.is-yes{ color:#2f8f6a; font-weight:700 }
.verdict.is-no{ color:#c25378 }
.clipbar{ display:flex; align-items:center; gap:10px; margin-top:14px }
.clipbar__btn{
  width:46px; height:46px; flex:none; border-radius:50%; display:grid; place-items:center;
  color:#fff; font-size:.95rem;
  background:linear-gradient(140deg,var(--mizu),var(--mizu-mid));
  box-shadow:var(--sh-2); transition:transform .2s cubic-bezier(.3,1.5,.5,1);
}
.clipbar__btn:hover{ transform:scale(1.08) }
.clipbar__meta{ font-family:var(--f-mono); font-size:.66rem; color:var(--ink-3); line-height:1.7 }

/* ─────────── arcade cabinets ─────────── */
.cab{
  position:relative; overflow:hidden;
  border-radius:var(--r-xl);
  background:linear-gradient(168deg,var(--paper-cool),var(--paper) 55%);
  border:1.5px solid var(--line);
  box-shadow:var(--sh-2);
}
.cab__head{ display:flex; align-items:center; gap:14px; padding:clamp(16px,2.4vw,24px) }
.cab__glyph{
  width:46px; height:46px; flex:none; display:grid; place-items:center; font-size:1.3rem;
  border-radius:14px; background:var(--lemon); box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.6)
}
.cab__body{ position:relative; background:#bfe9ff; border-top:1.5px solid var(--line) }
.cab__body iframe{ display:block; width:100%; height:min(72vh,620px); border:0 }
.cab__foot{
  display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
  padding:14px clamp(16px,2.4vw,24px);
  font-family:var(--f-mono); font-size:.66rem; color:var(--ink-3);
  border-top:1.5px solid var(--line);
}

/* ─────────── the sealed room ─────────── */
.seal{ display:grid; place-items:center; text-align:center; padding:clamp(30px,6vw,70px) var(--gut) }
.seal__lock{
  width:96px; height:96px; margin-bottom:20px; display:grid; place-items:center;
  border-radius:50%; font-size:2.2rem;
  background:linear-gradient(150deg,#fff,var(--mizu-soft));
  border:1.5px dashed var(--line-warm); box-shadow:var(--sh-2);
}
.seal__meter{ width:min(100%,320px); height:10px; margin:18px auto 8px; border-radius:6px; background:var(--mizu-soft); overflow:hidden }
.seal__meter i{ display:block; height:100%; width:0; border-radius:6px; background:linear-gradient(90deg,var(--lemon),var(--sakura)); transition:width .6s cubic-bezier(.3,1.2,.4,1) }

/* keep a strip clear on the right of the deck for whoever is listening */
@media (min-width:960px){ #stage .deck{ padding-right:clamp(34px,15vw,178px) } }

/* ─────────── the shelf ─────────── */
.goods{
  break-inside:avoid;
  margin-bottom:clamp(18px,2.2vw,28px);
  padding:20px;
  border-radius:var(--r-lg);
  background:var(--paper);
  border:1.5px solid var(--line);
  box-shadow:var(--sh-2);
  transition:transform .3s cubic-bezier(.3,1.3,.5,1), box-shadow .3s;
}
.goods:hover{ transform:translateY(-4px); box-shadow:var(--sh-3) }
.goods__shot{
  margin:-4px -4px 14px; border-radius:14px; overflow:hidden;
  background:var(--mizu-soft); aspect-ratio:4/3;
}
.goods__shot img{ width:100%; height:100%; object-fit:cover }
.goods__name{ font-family:var(--f-round); font-weight:700; font-size:1.06rem; line-height:1.4 }
.goods__desc{ margin-top:9px; font-size:.9rem; line-height:1.78; color:var(--ink-2) }
.goods__foot{
  display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;
  margin-top:16px; padding-top:13px; border-top:1px dashed var(--line);
}
.goods__price{ font-family:var(--f-round); font-weight:900; font-size:1.3rem; color:var(--sakura) }
.goods__price em{ font-style:normal; font-size:.62em; margin-left:.15em; color:var(--ink-3) }
.goods--empty{ background:linear-gradient(168deg,var(--paper-warm),var(--paper) 62%) }

/* playing, but the browser is holding the sound back until you touch something */
.dock.is-silenced .dock__label{ color:var(--sakura); letter-spacing:.12em }
.dock.is-silenced .dock__disc{ animation-duration:9s }

/* on a phone the deck has no side room, so the listener stands below the list */
@media (max-width:959px){ #stage .deck{ padding-bottom:clamp(155px,24vw,215px) } }
