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

:root {
  --bg:        #042034;
  --dim:       #1a1a2e;
  --accent1:   #00ffe0;
  --accent2:   #ff6ef7;
  --accent3:   #ffe24b;
  --muted:     rgba(255,255,255,0.18);
  --line-gap:  1.7rem;
}

html, body {
  width: 100%; height: 100%;
  overflow: hidden;
  background: var(--bg);
  color: #fff;
  font-family: 'Zen Kaku Gothic New', sans-serif;
}

#bg-canvas {
  position: fixed;
  inset: 0;
  z-index: 0;
  opacity: 0.45;
}

#stage {
  position: fixed;
  inset: 0;
  z-index: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: flex-start;
  padding: 0 6vw 120px;
  gap: var(--line-gap);
  pointer-events: none;
}

.phrase-row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 0.05em;
  line-height: 1;
  overflow: hidden;
}
.phrase-row.inactive {
  font-size: clamp(0.9rem, 1.6vw, 1.3rem);
  font-weight: 400;
  color: var(--muted);
  letter-spacing: 0.04em;
}
.phrase-row.active {
  font-size: clamp(2.8rem, 7vw, 6rem);
  font-weight: 900;
  letter-spacing: 0.02em;
}

.char {
  display: inline-block;
  opacity: 0;
  will-change: transform, opacity;
}
.phrase-row.active .char.enter {
  animation: charSlideIn 0.22s cubic-bezier(0.22,1,0.36,1) forwards;
}
@keyframes charSlideIn {
  from { opacity: 0; transform: translateX(-28px) scale(0.7); }
  to   { opacity: 1; transform: translateX(0)    scale(1);   }
}
.phrase-row.inactive .char.enter {
  animation: charRiseIn 0.3s cubic-bezier(0.22,1,0.36,1) forwards;
}
@keyframes charRiseIn {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: translateY(0);    }
}
.char.exit {
  animation: charExit 0.18s ease-in forwards !important;
}
@keyframes charExit {
  to { opacity: 0; transform: translateY(10px); }
}

.phrase-row.active .char:nth-child(3n+1) { color: var(--accent1); text-shadow: 0 0 18px var(--accent1); }
.phrase-row.active .char:nth-child(3n+2) { color: var(--accent2); text-shadow: 0 0 18px var(--accent2); }
.phrase-row.active .char:nth-child(3n)   { color: var(--accent3); text-shadow: 0 0 18px var(--accent3); }

/* ── Controls ── */
#controls {
  position: fixed;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 10;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1.4rem;
  padding: 0.85rem 2rem;
  background: rgba(255, 255, 255, 0.06);
  backdrop-filter: blur(20px) saturate(180%);
  -webkit-backdrop-filter: blur(20px) saturate(180%);
  border: 1px solid rgba(255, 255, 255, 0.12);
  border-radius: 999px;
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4), 0 0 0 0.5px rgba(255,255,255,0.05) inset;
  width: max-content;
  max-width: calc(100vw - 48px);
}

#song-title {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 1.05rem;
  letter-spacing: 0.12em;
  color: rgba(255,255,255,0.65);
  max-width: 260px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
}

.ctrl-btn {
  background: none;
  border: 1.5px solid rgba(255,255,255,0.2);
  border-radius: 50%;
  width: 42px; height: 42px;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  color: #fff;
  transition: border-color 0.2s, background 0.2s, transform 0.15s;
  flex-shrink: 0;
}
.ctrl-btn:hover {
  border-color: var(--accent1);
  background: rgba(0,255,224,0.08);
  transform: scale(1.08);
}
.ctrl-btn svg { width: 16px; height: 16px; fill: currentColor; }

#btn-play { width: 52px; height: 52px; border-color: rgba(255,255,255,0.35); }
#btn-play svg { width: 20px; height: 20px; }
#btn-play:hover { border-color: var(--accent2); background: rgba(255,110,247,0.1); }

#progress-wrap {
  flex: 1;
  max-width: 300px;
  height: 3px;
  background: rgba(255,255,255,0.12);
  border-radius: 2px;
  cursor: pointer;
  position: relative;
}
#progress-fill {
  height: 100%;
  width: 0%;
  background: linear-gradient(90deg, var(--accent1), var(--accent2));
  border-radius: 2px;
  transition: width 0.25s linear;
  pointer-events: none;
}

/* ── Overlay ── */
#overlay {
  position: fixed;
  inset: 0;
  z-index: 20;
  background: var(--bg);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1.2rem;
  transition: opacity 0.5s;
}
#overlay.hidden { opacity: 0; pointer-events: none; }

#overlay p {
  font-family: 'Bebas Neue', sans-serif;
  font-size: 1.1rem;
  letter-spacing: 0.15em;
  color: rgba(255,255,255,0.5);
}

/* ── Loader ── */
.loader {
  --main-size: 4em;
  --text-color: #ffffff;
  --shine-color: #ffffff40;
  --shadow-color: #aaaaaa;
  display: flex;
  justify-content: center;
  align-items: center;
  overflow: hidden;
  user-select: none;
  position: relative;
  font-size: var(--main-size);
  font-weight: 900;
  text-transform: uppercase;
  color: var(--text-color);
  width: 7.3em;
  height: 1em;
  filter: drop-shadow(0 0 0.05em var(--shine-color));
}

.loader .text {
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  position: absolute;
}

.loader .text:nth-child(1) { clip-path: polygon(0% 0%, 11.11% 0%, 11.11% 100%, 0% 100%); font-size: calc(var(--main-size) / 20); margin-left: -2.1em; opacity: 0.6; }
.loader .text:nth-child(2) { clip-path: polygon(11.11% 0%, 22.22% 0%, 22.22% 100%, 11.11% 100%); font-size: calc(var(--main-size) / 16); margin-left: -0.98em; opacity: 0.7; }
.loader .text:nth-child(3) { clip-path: polygon(22.22% 0%, 33.33% 0%, 33.33% 100%, 22.22% 100%); font-size: calc(var(--main-size) / 13); margin-left: -0.33em; opacity: 0.8; }
.loader .text:nth-child(4) { clip-path: polygon(33.33% 0%, 44.44% 0%, 44.44% 100%, 33.33% 100%); font-size: calc(var(--main-size) / 11); margin-left: -0.05em; opacity: 0.9; }
.loader .text:nth-child(5) { clip-path: polygon(44.44% 0%, 55.55% 0%, 55.55% 100%, 44.44% 100%); font-size: calc(var(--main-size) / 10); margin-left: 0em; opacity: 1; }
.loader .text:nth-child(6) { clip-path: polygon(55.55% 0%, 66.66% 0%, 66.66% 100%, 55.55% 100%); font-size: calc(var(--main-size) / 11); margin-left: 0.05em; opacity: 0.9; }
.loader .text:nth-child(7) { clip-path: polygon(66.66% 0%, 77.77% 0%, 77.77% 100%, 66.66% 100%); font-size: calc(var(--main-size) / 13); margin-left: 0.33em; opacity: 0.8; }
.loader .text:nth-child(8) { clip-path: polygon(77.77% 0%, 88.88% 0%, 88.88% 100%, 77.77% 100%); font-size: calc(var(--main-size) / 16); margin-left: 0.98em; opacity: 0.7; }
.loader .text:nth-child(9) { clip-path: polygon(88.88% 0%, 100% 0%, 100% 100%, 88.88% 100%); font-size: calc(var(--main-size) / 20); margin-left: 2.1em; opacity: 0.6; }

.loader .text span {
  animation:
    scrolling 2s cubic-bezier(0.1, 0.6, 0.9, 0.4) infinite,
    shadow 2s cubic-bezier(0.1, 0.6, 0.9, 0.4) infinite;
}

.loader .text:nth-child(1) span { background: linear-gradient(to right, var(--text-color) 4%, var(--shadow-color) 7%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(2) span { background: linear-gradient(to right, var(--text-color) 9%, var(--shadow-color) 13%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(3) span { background: linear-gradient(to right, var(--text-color) 15%, var(--shadow-color) 18%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(4) span { background: linear-gradient(to right, var(--text-color) 20%, var(--shadow-color) 23%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(6) span { background: linear-gradient(to right, var(--shadow-color) 29%, var(--text-color) 32%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(7) span { background: linear-gradient(to right, var(--shadow-color) 34%, var(--text-color) 37%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(8) span { background: linear-gradient(to right, var(--shadow-color) 39%, var(--text-color) 42%); background-size: 200% auto; background-clip: text; color: transparent; }
.loader .text:nth-child(9) span { background: linear-gradient(to right, var(--shadow-color) 45%, var(--text-color) 48%); background-size: 200% auto; background-clip: text; color: transparent; }

.loader .line {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  height: 0.05em;
  width: calc(var(--main-size) / 2);
  margin-top: 0.9em;
  border-radius: 0.05em;
}
.loader .line::before {
  content: "";
  position: absolute;
  height: 100%; width: 100%;
  background-color: var(--text-color);
  opacity: 0.3;
}
.loader .line::after {
  content: "";
  position: absolute;
  height: 100%; width: 100%;
  background-color: var(--text-color);
  border-radius: 0.05em;
  transform: translateX(-90%);
  animation: wobble 2s cubic-bezier(0.5, 0.8, 0.5, 0.2) infinite;
}

@keyframes wobble {
  0%   { transform: translateX(-90%); }
  50%  { transform: translateX(90%); }
  100% { transform: translateX(-90%); }
}
@keyframes scrolling {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(100%); }
}
@keyframes shadow {
  0%   { background-position: -98% 0; }
  100% { background-position: 102% 0; }
}

/* ── Song dots ── */
#song-dots {
  display: flex;
  gap: 6px;
}
.dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: rgba(255,255,255,0.2);
  cursor: pointer;
  transition: background 0.2s, transform 0.2s;
}
.dot.active-dot {
  background: var(--accent1);
  transform: scale(1.3);
}