/* Earthside collective — modular audio player (accent via page :root --accent) */

.player-module {
  margin-bottom: 2rem;
}

.player-module h2 {
  font-size: 1.15rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--white);
  margin-bottom: 1rem;
  padding-bottom: 0.5rem;
  border-bottom: 2px solid color-mix(in srgb, var(--accent, #34d399) 45%, transparent);
}

.es-player {
  --es-viz-low: 0;
  --es-viz-mid: 0;
  --es-viz-presence: 0;
  --es-viz-high: 0;
  position: relative;
  overflow: hidden;
  background: var(--panel);
  border: 1px solid color-mix(in srgb, var(--accent, #34d399) 28%, transparent);
  border-radius: 4px;
  padding: 1.15rem 1.2rem 1rem;
  transition: transform 0.08s ease-out, box-shadow 0.08s ease-out, border-color 0.08s;
}

.es-player.es-viz-active {
  transform: scale(calc(1 + var(--es-viz-low) * 0.014))
    perspective(900px)
    rotateX(calc(var(--es-viz-mid) * -1.2deg));
  box-shadow:
    0 calc(8px + var(--es-viz-low) * 28px) calc(24px + var(--es-viz-low) * 36px)
      color-mix(in srgb, var(--accent, #34d399) calc(18% + var(--es-viz-low) * 40%), transparent),
    inset 0 0 calc(var(--es-viz-high) * 18px)
      color-mix(in srgb, var(--accent, #34d399) 25%, transparent);
  border-color: color-mix(
    in srgb,
    var(--accent, #34d399) calc(28% + var(--es-viz-presence) * 45%),
    transparent
  );
}

/* FFT spectrum — 32 vertical bands (20Hz–16kHz) */
.es-viz-wrap {
  position: relative;
  height: 5.5rem;
  margin-bottom: 0.9rem;
  border-radius: 3px;
  overflow: hidden;
  background: rgba(0, 0, 0, 0.35);
  border: 1px solid color-mix(in srgb, var(--accent, #34d399) 18%, transparent);
}

.es-viz-canvas {
  display: block;
  width: 100%;
  height: 100%;
}

.es-viz-aura {
  position: absolute;
  inset: 0;
  pointer-events: none;
  transition: opacity 0.06s, transform 0.08s;
}

.es-viz-aura-low {
  background: linear-gradient(
    to top,
    color-mix(in srgb, var(--accent, #34d399) 55%, transparent) 0%,
    transparent 72%
  );
  transform-origin: bottom center;
}

.es-viz-aura-high {
  background: radial-gradient(
    ellipse 90% 40% at 50% 0%,
    color-mix(in srgb, #67e8f9 calc(var(--es-viz-high, 0) * 80%), transparent),
    transparent 70%
  );
}

.es-viz-sparks {
  position: absolute;
  inset: 0;
  pointer-events: none;
  opacity: calc(0.2 + var(--spark, 0) * 0.8);
  background-image:
    radial-gradient(circle at 12% 18%, #fff 0 1px, transparent 1px),
    radial-gradient(circle at 78% 22%, #fff 0 1px, transparent 1px),
    radial-gradient(circle at 44% 8%, #fff 0 1px, transparent 1px),
    radial-gradient(circle at 91% 35%, #fff 0 1px, transparent 1px),
    radial-gradient(circle at 6% 42%, #fff 0 1px, transparent 1px);
  animation: es-spark-drift 4s linear infinite;
}

@keyframes es-spark-drift {
  0% { transform: translateX(0); }
  50% { transform: translateX(3px); }
  100% { transform: translateX(0); }
}

.es-player.es-viz-active .es-transport {
  filter: brightness(calc(1 + var(--es-viz-presence) * 0.55))
    drop-shadow(0 0 calc(4px + var(--es-viz-presence) * 10px) var(--accent, #34d399));
}

.es-player.es-viz-active .es-btn-play {
  transform: scale(calc(1 + var(--es-viz-presence) * 0.08));
}

.es-player.es-viz-active .es-playlist {
  transform: skewX(calc(var(--es-viz-mid) * -0.8deg));
}

.es-player.es-viz-active .es-now-title {
  text-shadow: 0 0 calc(6px + var(--es-viz-high) * 14px)
    color-mix(in srgb, var(--accent, #34d399) 70%, #fff);
}

.es-player.es-viz-active .es-seek {
  height: calc(4px + var(--es-viz-mid) * 3px);
}

@media (prefers-reduced-motion: reduce) {
  .es-viz-wrap,
  .es-viz-sparks { display: none; }
  .es-player.es-viz-active {
    transform: none;
    box-shadow: none;
  }
}

.es-player.is-empty .es-transport,
.es-player.is-empty .es-seek-row,
.es-player.is-empty .es-now {
  display: none;
}

.es-now {
  margin-bottom: 0.85rem;
}

.es-now-title {
  font-size: var(--text-lg);
  color: var(--white);
  line-height: 1.25;
}

.es-now-artist {
  font-size: var(--text-sm);
  color: var(--muted);
  margin-top: 0.2rem;
}

.es-seek-row {
  display: grid;
  grid-template-columns: 3.2rem 1fr 3.2rem;
  gap: 0.65rem;
  align-items: center;
  margin-bottom: 0.85rem;
}

.es-time {
  font-size: 0.78rem;
  font-variant-numeric: tabular-nums;
  color: var(--muted);
  text-align: center;
}

.es-seek {
  -webkit-appearance: none;
  appearance: none;
  width: 100%;
  height: 4px;
  border-radius: 2px;
  background: color-mix(in srgb, var(--accent, #34d399) 18%, rgba(255, 255, 255, 0.08));
  cursor: pointer;
}

.es-seek::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: var(--accent, #34d399);
  box-shadow: 0 0 10px color-mix(in srgb, var(--accent, #34d399) 55%, transparent);
  border: none;
}

.es-seek::-moz-range-thumb {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: var(--accent, #34d399);
  border: none;
}

.es-transport {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0.5rem 0.75rem;
  margin-bottom: 1rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid color-mix(in srgb, var(--accent, #34d399) 22%, transparent);
}

.es-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: var(--touch);
  min-height: var(--touch);
  padding: 0.5rem 0.85rem;
  font-size: var(--text-sm);
  font-weight: 600;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--white);
  background: color-mix(in srgb, var(--accent, #34d399) 14%, transparent);
  border: 1px solid color-mix(in srgb, var(--accent, #34d399) 40%, transparent);
  border-radius: 4px;
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s;
}

.es-btn:hover:not(:disabled) {
  background: color-mix(in srgb, var(--accent, #34d399) 26%, transparent);
  border-color: var(--accent, #34d399);
}

.es-btn:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}

.es-btn-play {
  min-width: 3.5rem;
  font-size: 1.1rem;
}

.es-vol-wrap {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  margin-left: 0.25rem;
}

.es-vol-wrap label {
  font-size: 0.72rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
}

.es-vol {
  width: 5.5rem;
  height: 4px;
  -webkit-appearance: none;
  appearance: none;
  background: color-mix(in srgb, var(--accent, #34d399) 18%, rgba(255, 255, 255, 0.08));
  border-radius: 2px;
  cursor: pointer;
}

.es-vol::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: var(--accent, #34d399);
  border: none;
}

.es-vol::-moz-range-thumb {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: var(--accent, #34d399);
  border: none;
}

.es-playlist {
  list-style: none;
  margin: 0;
  padding: 0;
  max-height: 14rem;
  overflow-y: auto;
}

.es-playlist li {
  margin: 0;
}

.es-track {
  display: grid;
  grid-template-columns: 2rem 1fr auto;
  gap: 0.65rem;
  align-items: center;
  width: 100%;
  padding: 0.65rem 0.5rem;
  font-size: var(--text-sm);
  text-align: left;
  color: var(--muted);
  background: transparent;
  border: none;
  border-bottom: 1px solid rgba(255, 255, 255, 0.05);
  cursor: pointer;
  border-radius: 2px;
}

.es-track:last-child {
  border-bottom: none;
}

.es-track:hover {
  color: var(--white);
  background: color-mix(in srgb, var(--accent, #34d399) 8%, transparent);
}

.es-track.is-active {
  color: var(--white);
  background: color-mix(in srgb, var(--accent, #34d399) 14%, transparent);
}

.es-track.is-active .es-track-idx {
  color: var(--accent, #34d399);
}

.es-track-idx {
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
  color: var(--muted);
  text-align: center;
}

.es-track-title {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.es-track-dur {
  font-size: 0.75rem;
  font-variant-numeric: tabular-nums;
  color: var(--muted);
}

.es-empty {
  font-size: var(--text-sm);
  color: var(--muted);
  line-height: 1.55;
  padding: 0.35rem 0 0.15rem;
}

.es-empty strong {
  color: var(--accent, #34d399);
  font-weight: 600;
}

.es-player-error {
  font-size: var(--text-sm);
  color: var(--err, #f87171);
  margin-top: 0.5rem;
}