/* =========================================================
   時計仕掛けの / Clockwork  —  scroll driven 3D music site
   ========================================================= */

:root{
  --ink:      #e8e3d8;   /* 生成りの白 */
  --ink-dim:  #9c968a;
  --brass:    #d9a441;   /* 真鍮 */
  --brass-lt: #f0cd85;
  --red:      #e0344a;   /* 赤い扉 */
  --blue:     #63d2ff;   /* 青い扉 */
  --bg:       #05060b;

  --serif: "Shippori Mincho", "Yu Mincho", "YuMincho", "Hiragino Mincho ProN",
           "MS PMincho", serif;
  --sans:  "Yu Gothic", "YuGothic", "Hiragino Sans", "Noto Sans JP",
           "Segoe UI", sans-serif;

  --ease: cubic-bezier(.22,.61,.36,1);
}

*{ margin:0; padding:0; box-sizing:border-box; }

html{ scroll-behavior:auto; }
body{
  background:var(--bg);
  color:var(--ink);
  font-family:var(--serif);
  overflow-x:hidden;
  -webkit-font-smoothing:antialiased;
  cursor:default;
}
body.is-locked{ overflow:hidden; height:100%; }

/* --- スクロールバーを世界観に合わせる --- */
::-webkit-scrollbar{ width:6px; }
::-webkit-scrollbar-track{ background:#0a0b12; }
::-webkit-scrollbar-thumb{ background:#2c2a25; }
::-webkit-scrollbar-thumb:hover{ background:var(--brass); }

/* =========================================================
   canvas + 画面効果
   ========================================================= */
#gl{
  position:fixed; inset:0;
  width:100%; height:100%;
  display:block;
  z-index:0;
}

.fx{ position:fixed; inset:0; pointer-events:none; z-index:2; }

#fx-vignette{
  background:
    radial-gradient(120% 90% at 50% 45%, rgba(0,0,0,0) 38%, rgba(0,0,0,.55) 78%, rgba(0,0,0,.92) 100%);
  mix-blend-mode:multiply;
}

#fx-grain{
  opacity:.13;
  mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='200'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='3'/%3E%3C/filter%3E%3Crect width='200' height='200' filter='url(%23n)'/%3E%3C/svg%3E");
  animation:grain 1.1s steps(4) infinite;
}
@keyframes grain{
  0%{ transform:translate(0,0); }
  25%{ transform:translate(-3%,2%); }
  50%{ transform:translate(2%,-3%); }
  75%{ transform:translate(-2%,-2%); }
  100%{ transform:translate(3%,1%); }
}

/* =========================================================
   ローディング
   ========================================================= */
#loader{
  position:fixed; inset:0; z-index:100;
  display:flex; align-items:center; justify-content:center;
  background:radial-gradient(80% 60% at 50% 40%, #10121c 0%, #05060b 70%);
  transition:opacity 1.1s var(--ease), visibility 1.1s;
}
#loader.hide{ opacity:0; visibility:hidden; }

.loader-inner{ text-align:center; padding:0 24px; }

.loader-gear{ color:var(--brass); width:96px; height:96px; margin:0 auto 26px; opacity:.85; }
.loader-gear svg{ width:100%; height:100%; animation:spin 14s linear infinite; }
@keyframes spin{ to{ transform:rotate(360deg); } }

.loader-title{
  font-size:clamp(26px, 5vw, 40px);
  letter-spacing:.5em; text-indent:.5em;
  margin-bottom:14px;
}
.loader-sub{
  font-family:var(--sans);
  font-size:10px; letter-spacing:.34em; color:var(--ink-dim);
  margin-bottom:34px;
}
.loader-sub span{ color:var(--brass); }

.loader-bar{
  width:min(260px, 68vw); height:1px; margin:0 auto 30px;
  background:rgba(232,227,216,.16); overflow:hidden;
}
.loader-bar i{ display:block; height:100%; width:0%; background:var(--brass); transition:width .35s linear; }

#enter{
  font-family:var(--sans); font-size:11px; letter-spacing:.36em; text-indent:.36em;
  color:var(--ink); background:transparent;
  border:1px solid rgba(232,227,216,.28);
  padding:15px 34px; border-radius:2px;
  cursor:pointer; transition:.45s var(--ease);
  opacity:.25; pointer-events:none;
}
#enter:not([disabled]){ opacity:1; pointer-events:auto; }
#enter:not([disabled]):hover{
  background:var(--brass); border-color:var(--brass); color:#10110a;
  letter-spacing:.5em; text-indent:.5em;
}
.loader-note{
  margin-top:18px; font-family:var(--sans);
  font-size:10px; letter-spacing:.2em; color:rgba(156,150,138,.7);
}

/* =========================================================
   固定 UI
   ========================================================= */
.ui{ position:fixed; z-index:6; opacity:0; transition:opacity 1.2s var(--ease); }
body.ready .ui{ opacity:1; }

#ui-head{ top:0; left:0; padding:26px 30px; }
.brand{ display:flex; flex-direction:column; gap:7px; }
.brand-jp{ font-size:15px; letter-spacing:.42em; }
.brand-en{
  font-family:var(--sans); font-size:9px; letter-spacing:.44em;
  color:var(--ink-dim);
}

#ui-sound{
  top:24px; right:26px;
  display:flex; align-items:center; gap:14px;
}
.btn-round{
  display:flex; align-items:center; gap:10px;
  background:rgba(10,11,18,.4);
  border:1px solid rgba(232,227,216,.22);
  color:var(--ink); border-radius:100px;
  padding:9px 17px 9px 13px; cursor:pointer;
  font-family:var(--sans); font-size:9px; letter-spacing:.3em;
  transition:.4s var(--ease);
  backdrop-filter:blur(6px);
}
.btn-round:hover{ border-color:var(--brass); color:var(--brass-lt); }
.eq{ display:flex; align-items:flex-end; gap:2px; height:12px; }
.eq i{ width:2px; height:3px; background:currentColor; opacity:.75; }
.btn-round.playing .eq i{ animation:eq .9s ease-in-out infinite; }
.btn-round.playing .eq i:nth-child(2){ animation-delay:.15s; }
.btn-round.playing .eq i:nth-child(3){ animation-delay:.3s; }
.btn-round.playing .eq i:nth-child(4){ animation-delay:.45s; }
@keyframes eq{ 0%,100%{ height:3px; } 50%{ height:12px; } }

.btn-flat{
  background:none; border:none; cursor:pointer;
  font-family:var(--sans); font-size:9px; letter-spacing:.28em;
  color:rgba(156,150,138,.75);
  padding:6px 2px; border-bottom:1px solid transparent;
  transition:.35s var(--ease);
}
.btn-flat:hover{ color:var(--ink); }
.btn-flat[aria-pressed="true"]{ color:var(--brass); border-bottom-color:var(--brass); }

#ui-rail{
  right:30px; top:50%; transform:translateY(-50%);
  display:flex; flex-direction:column; align-items:center; gap:14px;
}
.rail-line{ position:relative; width:1px; height:34vh; background:rgba(232,227,216,.16); }
.rail-line i{
  position:absolute; left:50%; top:0;
  width:5px; height:5px; margin-left:-2px; margin-top:-2px;
  border-radius:50%; background:var(--brass);
  box-shadow:0 0 12px var(--brass);
  transition:top .12s linear;
}
.rail-num{
  font-family:var(--sans); font-size:9px; letter-spacing:.22em;
  color:var(--ink-dim); display:flex; gap:4px;
}
#rail-idx{ color:var(--ink); }
.rail-sep{ opacity:.4; }

#ui-hint{
  bottom:30px; left:50%; transform:translateX(-50%);
  display:flex; flex-direction:column; align-items:center; gap:9px;
  font-family:var(--sans); font-size:9px; letter-spacing:.4em; text-indent:.4em;
  color:var(--ink-dim);
  transition:opacity .8s var(--ease);
}
#ui-hint i{ display:block; width:1px; height:34px; background:linear-gradient(var(--brass), transparent); animation:drop 2.1s ease-in-out infinite; }
@keyframes drop{ 0%{ transform:scaleY(.2); transform-origin:top; opacity:0; } 40%{ opacity:1; } 100%{ transform:scaleY(1); transform-origin:top; opacity:0; } }
body.scrolled #ui-hint{ opacity:0 !important; }

/* =========================================================
   歌詞ステージ
   ========================================================= */
#stage{ position:fixed; inset:0; z-index:4; pointer-events:none; }

.scene{
  position:absolute; inset:0;
  display:flex; align-items:center; justify-content:center;
  padding:0 8vw;
  opacity:0;
  will-change:opacity, transform;
}

/* ---- hero ---- */
.c-hero{ text-align:center; }
.hero-kicker{
  font-family:var(--sans); font-size:10px; letter-spacing:.42em; text-indent:.42em;
  color:var(--ink-dim); margin-bottom:34px;
}
.hero-kicker em{ font-style:normal; color:var(--brass); margin:0 .12em; }
.hero-title{
  font-size:clamp(38px, 8.4vw, 104px);
  font-weight:400; line-height:1.15;
  display:flex; justify-content:center; flex-wrap:wrap;
}
.hero-title span{
  display:inline-block;
  padding:0 .07em;
  text-shadow:0 0 32px rgba(217,164,65,.35), 0 0 90px rgba(217,164,65,.14);
}
.hero-sub{
  margin-top:26px;
  font-family:var(--sans); font-size:10px; letter-spacing:.4em; text-indent:.4em;
  color:var(--brass-lt);
}
.hero-lead{
  margin-top:44px; font-size:13px; line-height:2.4; letter-spacing:.24em;
  color:rgba(232,227,216,.62);
}

/* ---- 歌詞 ---- */
.c-lyric{ text-align:center; max-width:900px; }
.l-tag{
  font-family:var(--sans); font-size:9px; letter-spacing:.44em; text-indent:.44em;
  color:var(--brass); margin-bottom:30px;
}
.l-main{
  font-size:clamp(19px, 3.1vw, 34px);
  line-height:2.15; letter-spacing:.17em;
  text-shadow:0 2px 30px rgba(0,0,0,.85), 0 0 60px rgba(0,0,0,.6);
}
.l-main.l-red{ text-shadow:0 2px 30px rgba(0,0,0,.85), 0 0 46px rgba(224,52,74,.4); }
.l-main.l-blue{ text-shadow:0 2px 30px rgba(0,0,0,.85), 0 0 46px rgba(99,210,255,.4); }
.l-small{
  font-size:clamp(13px, 1.8vw, 17px);
  line-height:2.5; letter-spacing:.5em; text-indent:.5em;
  color:var(--brass-lt); margin-bottom:34px;
}
.l-sub{
  margin-top:32px;
  font-size:clamp(12px, 1.6vw, 15px);
  line-height:2.4; letter-spacing:.22em;
  color:rgba(232,227,216,.6);
}

/* ---- outro ---- */
.scene[data-i="7"]{ align-items:flex-start; overflow-y:auto; }
.c-outro{
  pointer-events:auto;
  text-align:center;
  width:100%; max-width:880px;
  padding:14vh 0 12vh;
}
.o-last{ margin-bottom:8vh; }

.card{
  display:flex; gap:34px; align-items:center;
  text-align:left;
  background:rgba(9,10,16,.62);
  border:1px solid rgba(232,227,216,.14);
  border-radius:3px;
  padding:26px;
  backdrop-filter:blur(10px);
  box-shadow:0 30px 80px rgba(0,0,0,.6);
}
.card-art{ flex:0 0 190px; }
.card-art img{
  width:190px; height:190px; object-fit:cover; display:block;
  border:1px solid rgba(232,227,216,.16);
  box-shadow:0 0 46px rgba(217,164,65,.16);
}
.card-body h2{ font-size:24px; font-weight:400; letter-spacing:.24em; margin-bottom:9px; }
.card-artist{ font-size:11.5px; letter-spacing:.14em; color:var(--brass-lt); margin-bottom:20px; }
.card-credit{ display:flex; flex-direction:column; gap:7px; margin-bottom:22px; }
.card-credit > div{ display:flex; gap:12px; align-items:baseline; }
.card-credit dt{
  font-family:var(--sans); font-size:9px; letter-spacing:.2em;
  color:var(--ink-dim); flex:0 0 128px;
}
.card-credit dd{ font-size:12.5px; letter-spacing:.08em; }
.card-links{ display:flex; flex-wrap:wrap; gap:8px; }
.lk{
  font-family:var(--sans); font-size:9.5px; letter-spacing:.18em;
  color:var(--ink); text-decoration:none;
  border:1px solid rgba(232,227,216,.22);
  padding:9px 14px; border-radius:2px;
  transition:.35s var(--ease);
}
.lk:hover{ border-color:var(--brass); color:var(--brass-lt); background:rgba(217,164,65,.08); }
.lk-main{ border-color:var(--brass); color:var(--brass-lt); }
.lk-main:hover{ background:var(--brass); color:#10110a; }

#btn-top{
  margin-top:44px;
  font-family:var(--sans); font-size:10px; letter-spacing:.32em; text-indent:.32em;
  background:none; border:1px solid rgba(232,227,216,.2); color:var(--ink);
  padding:13px 26px; border-radius:2px; cursor:pointer;
  transition:.35s var(--ease);
}
#btn-top:hover{ border-color:var(--brass); color:var(--brass); }
.o-foot{
  margin-top:34px;
  font-family:var(--sans); font-size:9px; letter-spacing:.26em;
  color:rgba(156,150,138,.6);
}

/* =========================================================
   スクロール量
   ========================================================= */
#scroll-space{ height:820vh; }

/* =========================================================
   レスポンシブ
   ========================================================= */
@media (max-width:820px){
  #ui-rail{ display:none; }
  #ui-head{ padding:18px 20px; }
  #ui-sound{ top:16px; right:16px; gap:9px; }
  .btn-round{ padding:8px 13px 8px 11px; }
  .btn-flat{ font-size:8px; letter-spacing:.2em; }
  .hero-lead{ margin-top:32px; font-size:12px; }
  .card{ flex-direction:column; gap:22px; padding:20px; }
  .card-art, .card-art img{ flex:none; width:min(240px, 62vw); height:auto; }
  .card-body h2{ font-size:20px; }
  .card-credit dt{ flex-basis:100px; }
  .c-outro{ padding:10vh 0 14vh; }
  #scroll-space{ height:760vh; }
}

@media (prefers-reduced-motion: reduce){
  #fx-grain{ animation:none; }
  .loader-gear svg{ animation:none; }
}
