/* ============================================================
   DAPS.Web — consumer streaming screen layout (WO5).
   Browse · Watch · Channel · Reader. Faithful CSS translation of the
   design-system/ui_kits/daps-streaming/*Screen.jsx layout wrappers.
   RULE: design tokens ONLY for colour / font / radius / motion. A few
   structural px (grid track sizes, hairlines, tiny chip offsets) are
   permitted where no token applies. Components themselves come from the
   WO3/WO4 Tag Helpers — this file only composes and positions them.
   ============================================================ */

/* ---- shared screen padding wrapper ---- */
.screen {
  padding: var(--space-5) var(--space-8) var(--space-12);
}

/* ---- card link wrapper (content cards navigate via an <a>) ---- */
.card-link {
  display: block;
  text-decoration: none;
  color: inherit;
  border-radius: var(--card-radius);
}
.card-link:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}

/* ---- responsive content grid (auto-fill, minmax 240) ---- */
.content-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: var(--space-5);
}

/* ============================================================
   Browse / Home
   ============================================================ */
.browse-filters {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-6);
}

/* Featured hero — 2-col poster + identity panel */
.featured {
  display: grid;
  grid-template-columns: 1.6fr 1fr;
  border-radius: var(--card-radius);
  overflow: hidden;
  border: 1px solid var(--border-subtle);
  margin-bottom: var(--space-8);
}
.featured__poster {
  position: relative;
  aspect-ratio: 16 / 9;
  background-color: var(--bg-tertiary);
  background-size: cover;
  background-position: center;
}
.featured__scrim {
  position: absolute;
  inset: 0;
  background: var(--player-scrim-bottom);
}
.featured__badge {
  position: absolute;
  top: var(--space-3);
  left: var(--space-3);
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-1) var(--space-3);
  border-radius: var(--radius-button);
  background: var(--player-scrim);
  color: var(--on-media);
  font-family: var(--font-body);
  font-size: var(--fs-label);
  font-weight: var(--fw-semibold);
}
.featured__badge i {
  width: 14px;
  height: 14px;
  color: var(--accent-secondary);
}
.featured__panel {
  padding: var(--space-6);
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--space-3);
  background: var(--card-bg);
}
.featured__eyebrow {
  font-family: var(--font-body);
  font-size: var(--fs-label);
  font-weight: var(--fw-semibold);
  color: var(--accent-primary);
}
.featured__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h1);
  line-height: var(--lh-heading);
  letter-spacing: var(--ls-display);
  color: var(--text-primary);
}
.featured__meta {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-muted);
}
.featured__actions {
  display: flex;
  gap: var(--space-3);
  margin-top: var(--space-1);
}

/* Shelves */
.shelf {
  margin-bottom: var(--space-8);
}
.shelf__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--space-4);
}
.shelf__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h2);
  color: var(--text-primary);
}
.shelf__seeall {
  border: none;
  background: transparent;
  color: var(--accent-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-semibold);
  cursor: pointer;
  min-height: 44px;
  padding: 0 var(--space-2);
}
/* Muted secondary line in a shelf head (e.g. the search result count). */
.shelf__meta {
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-muted);
}

/* ============================================================
   History — page header toolbar (pause/resume + clear-all) and the per-card
   "Remove from history" overlay (09e Phase 2). Tokens only.
   ============================================================ */
.history-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-4);
  margin-bottom: var(--space-6);
}
.history-head__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h1);
  color: var(--text-primary);
}
.history-head__actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-3);
}
.history-head__form { margin: 0; }

/* Each history card wraps its navigating <a> plus a sibling remove <form> (a form cannot nest in an
   anchor). The form overlays the thumbnail's top-right corner. */
.history-card { position: relative; }
.history-card__remove {
  position: absolute;
  top: var(--space-2);
  right: var(--space-2);
  margin: 0;
  /* Hidden until hover/focus on pointer devices; always shown where hover is unavailable (touch). */
  opacity: 0;
  transition: opacity var(--dur-base) var(--ease-standard);
}
.history-card:hover .history-card__remove,
.history-card:focus-within .history-card__remove {
  opacity: 1;
}
@media (hover: none) {
  .history-card__remove { opacity: 1; }
}

/* Search — "Load more" action row, centered under the results grid. */
.search-more {
  display: flex;
  justify-content: center;
  margin-top: var(--space-6);
}

/* ============================================================
   Admin moderation triage queue (domain 13 / 13a, WO-B). Tokens only; keyboard-navigable list of
   reported comments with per-row plain-POST Remove / Dismiss forms.
   ============================================================ */
.mod-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-4);
  margin-bottom: var(--space-6);
}
.mod-head__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h1);
  color: var(--text-primary);
}
.mod-head__sub {
  margin: var(--space-1) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
}

/* Cross-link to the 13h appeals queue (its own class so an empty queue never reads as a mod-item row). */
.mod-appeals-tab {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  min-height: 44px;
  margin-bottom: var(--space-4);
  color: var(--accent-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-medium);
  text-decoration: none;
}
.mod-appeals-tab i { width: 16px; height: 16px; }
.mod-appeals-tab:hover { text-decoration: underline; }
.mod-appeals-tab:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
  border-radius: var(--radius-button);
}

.mod-queue {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.mod-item {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-4);
  padding: var(--space-4);
  background: var(--bg-secondary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-modal);
}
/* Video poster-colour thumbnail (13a). The background colour is DATA (VideoStream.ThumbnailColor via
   CatalogFormat.Poster) — no hardcoded hex here. Comment rows carry no thumbnail. */
.mod-item__thumb {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 96px;
  height: 54px;
  border-radius: var(--radius-button);
  background-size: cover;
  background-position: center;
  color: var(--on-accent-primary);
}
.mod-item__thumb i { width: 20px; height: 20px; }
.mod-item__body { flex: 1 1 320px; min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.mod-item__row { display: flex; align-items: baseline; gap: var(--space-3); flex-wrap: wrap; }
/* Kind label — a small glyph + text pill so video vs comment reports are distinguishable (never colour-only). */
.mod-item__kind {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: 2px var(--space-2);
  border-radius: var(--radius-tab);
  background: var(--bg-tertiary);
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-semibold);
}
.mod-item__kind i { width: 14px; height: 14px; }
.mod-item__author {
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-body);
  color: var(--text-primary);
}
.mod-item__age {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.mod-item__preview {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
  overflow-wrap: anywhere;
}
.mod-item__reasons { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2); }
.mod-item__count {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-semibold);
  color: var(--text-secondary);
}
.mod-item__watch {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  align-self: flex-start;
  min-height: 44px;
  color: var(--accent-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-medium);
  text-decoration: none;
}
.mod-item__watch i { width: 16px; height: 16px; }
.mod-item__watch:hover { text-decoration: underline; }
.mod-item__watch:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
  border-radius: var(--radius-button);
}
.mod-item__actions { display: flex; flex-direction: column; gap: var(--space-2); flex-shrink: 0; }
.mod-item__form { margin: 0; }

/* Channel strike standing on a VIDEO queue row (13b). A channel WITH active strikes shows a warning chip
   (glyph + text, never colour-only); a zero-strike channel shows only the muted "no strikes" link. */
.mod-item__standing {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-3);
  margin-top: var(--space-1);
}
.mod-item__strikes {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: 2px var(--space-2);
  border-radius: var(--radius-tab);
  background: var(--warning-surface);
  color: var(--warning);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-semibold);
}
.mod-item__strikes i { width: 14px; height: 14px; }
.mod-item__strikes-link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  min-height: 44px;
  color: var(--text-muted);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-medium);
  text-decoration: none;
}
.mod-item__strikes-link i { width: 14px; height: 14px; }
.mod-item__strikes-link:hover { color: var(--accent-primary); text-decoration: underline; }
.mod-item__strikes-link:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
  border-radius: var(--radius-button);
}

/* ============================================================
   Admin per-channel strikes view (domain 13b, WO-B). Tokens only; standing header + strike rows with a
   plain-POST Rescind form on each active strike.
   ============================================================ */
.strike-standing {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-3);
  margin: var(--space-5) 0 var(--space-6);
  padding: var(--space-4);
  background: var(--bg-secondary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-modal);
  font-family: var(--font-body);
  color: var(--text-primary);
}
.strike-standing i { width: 20px; height: 20px; color: var(--text-secondary); }
.strike-standing__count { font-weight: var(--fw-semibold); }
.strike-standing__note { color: var(--text-secondary); font-size: var(--fs-body-sm); }

.strike-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.strike-item {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-4);
  padding: var(--space-4);
  background: var(--bg-secondary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-modal);
}
.strike-item__body { flex: 1 1 320px; min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.strike-item__row { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.strike-item__reason {
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-body);
  color: var(--text-primary);
}
.strike-item__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-5);
  margin: 0;
}
.strike-item__meta div { display: flex; gap: var(--space-1); align-items: baseline; }
.strike-item__meta dt {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.strike-item__meta dd {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-medium);
  color: var(--text-secondary);
}
.strike-item__actions { display: flex; flex-direction: column; gap: var(--space-2); flex-shrink: 0; }
.strike-item__form { margin: 0; }

/* Creator Studio owner strike banner (13b). Only rendered when the owner has active strikes; a small gap
   below so it sits above the screen content. */
.studio-standing { margin-bottom: var(--space-5); }
/* Banner CTA -> the owner's own strikes + appeal page (13b/13h). */
.studio-standing__link {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  min-height: 44px;
  margin-top: var(--space-2);
  color: var(--accent-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-medium);
  text-decoration: none;
}
.studio-standing__link i { width: 16px; height: 16px; }
.studio-standing__link:hover { text-decoration: underline; }
.studio-standing__link:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
  border-radius: var(--radius-button);
}

/* ============================================================
   Creator Studio owner strikes + appeal page (domain 13b/13h, WO-B). Reuses the .strike-* row shell (shared
   with the admin view) plus an inline appeal-status pill and a native <details> Appeal affordance. Tokens only.
   ============================================================ */
.studio-screen__sub {
  margin: var(--space-1) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
}
/* Inline appeal status on an owner strike row (never colour-only — a labelled status pill). */
.strike-item__appeal { display: flex; align-items: center; gap: var(--space-2); }

/* Appeal affordance — a native <details> disclosure (no-JS baseline) with a statement form. */
.appeal-disclosure { width: 100%; }
.appeal-disclosure__trigger {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  min-height: 44px;
  padding: 0 var(--space-3);
  border-radius: var(--radius-button);
  background: var(--bg-tertiary);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-semibold);
  cursor: pointer;
  list-style: none;
}
.appeal-disclosure__trigger::-webkit-details-marker { display: none; }
.appeal-disclosure__trigger i { width: 16px; height: 16px; }
.appeal-disclosure__trigger:hover { background: var(--bg-elevated, var(--bg-secondary)); }
.appeal-disclosure__trigger:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.appeal-disclosure__panel {
  margin-top: var(--space-3);
  padding: var(--space-4);
  background: var(--bg-primary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-modal);
}
.appeal-form { display: flex; flex-direction: column; gap: var(--space-3); margin: 0; }
.appeal-form__label {
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-medium);
  color: var(--text-primary);
}
.appeal-form__text {
  width: 100%;
  box-sizing: border-box;
  padding: var(--space-3);
  background: var(--bg-secondary);
  border: 1px solid var(--border-default, var(--border-subtle));
  border-radius: var(--radius-button);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  resize: vertical;
}
.appeal-form__text:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.appeal-form__actions { display: flex; justify-content: flex-end; }

/* ============================================================
   Admin moderation appeals queue (domain 13h, WO-B). One card per pending appeal: statement + strike/video
   context on the left, Overturn / Uphold action forms on the right. Reuses the moderation head/list tokens.
   ============================================================ */
.appeal-list {
  list-style: none;
  margin: var(--space-4) 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.appeal-item {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-4);
  padding: var(--space-4);
  background: var(--bg-secondary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-modal);
}
.appeal-item__body { flex: 1 1 340px; min-width: 0; display: flex; flex-direction: column; gap: var(--space-3); }
.appeal-item__row { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.appeal-item__channel {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  min-height: 44px;
  color: var(--accent-primary);
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-body);
  text-decoration: none;
}
.appeal-item__channel i { width: 16px; height: 16px; }
.appeal-item__channel:hover { text-decoration: underline; }
.appeal-item__channel:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
  border-radius: var(--radius-button);
}
.appeal-item__age {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.appeal-item__statement {
  margin: 0;
  padding: var(--space-3) var(--space-4);
  border-left: 3px solid var(--accent-primary);
  background: var(--bg-primary);
  border-radius: var(--radius-button);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
  overflow-wrap: anywhere;
}
.appeal-item__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-5);
  margin: 0;
}
.appeal-item__meta div { display: flex; gap: var(--space-1); align-items: baseline; }
.appeal-item__meta dt {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.appeal-item__meta dd {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-medium);
  color: var(--text-secondary);
}
.appeal-item__video {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  color: var(--accent-primary);
  text-decoration: none;
}
.appeal-item__video i { width: 14px; height: 14px; }
.appeal-item__video:hover { text-decoration: underline; }
.appeal-item__video:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
  border-radius: var(--radius-button);
}
.appeal-item__actions {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
  flex-shrink: 0;
  flex-basis: 240px;
}
.appeal-item__form { display: flex; flex-direction: column; gap: var(--space-2); margin: 0; }
.appeal-item__note-label {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.appeal-item__note {
  width: 100%;
  box-sizing: border-box;
  min-height: 44px;
  padding: 0 var(--space-3);
  background: var(--bg-primary);
  border: 1px solid var(--border-default, var(--border-subtle));
  border-radius: var(--radius-button);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
}
.appeal-item__note:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}

/* ============================================================
   Watch
   ============================================================ */
.watch {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 360px;
  gap: var(--space-8);
  align-items: start;
  padding: var(--space-5) var(--space-8) var(--space-12);
}
.watch__main {
  min-width: 0;
}
.watch__title {
  margin: var(--space-4) 0 var(--space-3);
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h1);
  line-height: var(--lh-heading);
  color: var(--text-primary);
}
.watch__creator {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-4);
  flex-wrap: wrap;
}
.watch__creator-link {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  text-decoration: none;
  color: inherit;
}
.watch__creator-name {
  display: block;
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-h3);
  color: var(--text-primary);
}
.watch__creator-subs {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.watch__engagement {
  margin-left: auto;
}

/* ---- Video Report (13a, WO-B) — a <details> disclosure enhanced into an accessible popover-dialog by
   report.js. Rendered OUTSIDE the Like form (no nested forms) for an authed non-owner only. Tokens only;
   mirrors the comment report dialog (.ds-comment__report). ---- */
.watch__report { position: relative; display: inline-flex; }
/* The summary is the Report trigger; reuse the engagement-chip look and drop the native disclosure marker. */
.watch__report-trigger { list-style: none; }
.watch__report-trigger::-webkit-details-marker { display: none; }
.watch__report-trigger::marker { content: ""; }
.watch__report-trigger:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.watch__report-dialog {
  position: absolute;
  top: calc(100% + var(--space-1));
  inset-inline-end: 0;
  z-index: 60;
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  min-width: 260px;
  max-width: 340px;
  padding: var(--space-3);
  background: var(--bg-elevated);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-modal);
  box-shadow: var(--shadow-elevated);
}
/* Closed <details> hides everything but the summary; keep that when the dialog is a child. */
.watch__report:not([open]) .watch__report-dialog { display: none; }
.watch__report-title {
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-semibold);
  color: var(--text-primary);
}
.watch__report-form { display: flex; flex-direction: column; gap: var(--space-3); margin: 0; }
.watch__report-reasons {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 0;
  padding: 0;
  border: none;
}
.watch__report-legend {
  padding: 0 0 var(--space-1);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-semibold);
  color: var(--text-secondary);
}
.watch__report-reason {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  min-height: 44px;
  padding: var(--space-1) var(--space-2);
  border-radius: var(--radius-button);
  cursor: pointer;
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
}
.watch__report-reason:hover { background: var(--bg-tertiary); }
.watch__report-radio { width: 18px; height: 18px; flex-shrink: 0; accent-color: var(--accent-primary); }
.watch__report-radio:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.watch__report-note-label {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-secondary);
}
.watch__report-note {
  width: 100%;
  min-height: 64px;
  padding: var(--space-2) var(--space-3);
  background: var(--input-bg);
  border: 1px solid var(--input-border);
  border-radius: var(--radius-input);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  resize: vertical;
}
.watch__report-note:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.watch__report-actions { display: flex; gap: var(--space-2); justify-content: flex-end; }
.watch__report-submit,
.watch__report-cancel {
  min-height: 44px;
  padding: var(--space-2) var(--space-4);
  border-radius: var(--radius-button);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-semibold);
  cursor: pointer;
}
.watch__report-submit {
  border: none;
  background: var(--accent-primary);
  color: var(--on-accent-primary);
}
.watch__report-submit:hover { background: var(--accent-primary-hover); }
.watch__report-cancel {
  border: 1px solid var(--border-subtle);
  background: transparent;
  color: var(--text-primary);
}
.watch__report-cancel:hover { background: var(--bg-tertiary); }
.watch__report-submit:focus-visible,
.watch__report-cancel:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.watch__desc {
  display: block;
  margin-bottom: var(--space-8);
}
.watch__desc-meta {
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  font-weight: var(--fw-semibold);
  color: var(--text-primary);
  margin-bottom: var(--space-1);
}
.watch__desc-body {
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--text-primary);
}
.watch__comments-h {
  margin: 0 0 var(--space-4);
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h2);
  color: var(--text-primary);
}
.watch__add-comment {
  display: flex;
  gap: var(--space-3);
  margin-bottom: var(--space-6);
}
.watch__add-comment .ds-field {
  flex: 1;
}
.watch__thread {
  display: flex;
  flex-direction: column;
  gap: var(--space-6);
}

/* Up-next rail */
.upnext {
  min-width: 0;
}
.upnext__title {
  margin: 0 0 var(--space-4);
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h3);
  color: var(--text-primary);
}
.upnext__list {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}
.upnext__item {
  display: flex;
  gap: var(--space-3);
  text-decoration: none;
  color: inherit;
}
.upnext__thumb {
  position: relative;
  width: 150px;
  aspect-ratio: 16 / 9;
  flex-shrink: 0;
  border-radius: var(--radius-input);
  overflow: hidden;
  background-color: var(--bg-tertiary);
  background-size: cover;
  background-position: center;
}
.upnext__dur {
  position: absolute;
  bottom: var(--space-1);
  right: var(--space-1);
  padding: 1px 5px;
  border-radius: 5px;
  background: var(--media-chip-scrim);
  color: var(--on-media);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-semibold);
}
.upnext__meta {
  min-width: 0;
  padding-top: 2px;
}
.upnext__meta-title {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-body-sm);
  line-height: var(--lh-snug);
  color: var(--text-primary);
}
.upnext__meta-sub {
  display: block;
  margin-top: var(--space-1);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}

/* ============================================================
   Channel
   ============================================================ */
.channel__tabs {
  margin: var(--space-4) 0 var(--space-6);
}

/* Prev/Next pager shared by the Videos/Articles/Newsletter tabs and the Feed page (06a/06d). Tokens only;
   the daps-button targets are already 44px (WO3). */
.tab-pager {
  display: flex;
  justify-content: center;
  gap: var(--space-3);
  margin-top: var(--space-6);
}

/* About tab (06a) — description + a compact stat list, each row icon + text (never colour-only). */
.channel-about {
  max-width: var(--reader-max-w);
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}
.channel-about__description {
  font-family: var(--font-body);
  font-size: var(--fs-body);
  line-height: var(--lh-body);
  color: var(--text-primary);
}
.channel-about__description--empty {
  color: var(--text-muted);
  font-style: italic;
}
.channel-about__stats {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.channel-about__stat {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
}
.channel-about__stat i { width: 16px; height: 16px; color: var(--text-muted); }

/* Newsletter tab (06a/Q3 pillar) — a read-only archive list; no card grid since issues have no thumbnail. */
.newsletter-archive {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-5);
}
.newsletter-archive__item {
  padding-bottom: var(--space-5);
  border-bottom: 1px solid var(--border-subtle);
}
.newsletter-archive__item:last-child { border-bottom: none; }
.newsletter-archive__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-4);
  flex-wrap: wrap;
}
.newsletter-archive__subject {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-h3);
  color: var(--text-primary);
}
.newsletter-archive__date {
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
  white-space: nowrap;
}
.newsletter-archive__excerpt {
  margin: var(--space-2) 0 0;
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
  line-height: var(--lh-body);
  color: var(--text-secondary);
}

/* ============================================================
   Feed (06d)
   ============================================================ */
.feed-head {
  margin-bottom: var(--space-6);
}
.feed-head__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h1);
  color: var(--text-primary);
}

/* ============================================================
   Reader
   ============================================================ */
.reader {
  position: relative;
}
.reader__progress {
  position: sticky;
  top: 0;
  left: 0;
  height: 3px;
  background: transparent;
  z-index: 20;
}
.reader__progress-fill {
  height: 100%;
  width: 0%;
  background: var(--accent-primary);
  transition: width var(--dur-fast) linear;
}
.reader__article {
  max-width: var(--reader-max-w);
  margin: 0 auto;
  padding: var(--space-6) var(--space-6) var(--space-12);
}
.reader__tags {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-5);
}
.reader__headline {
  margin: 0 0 var(--space-4);
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-display);
  line-height: var(--lh-heading);
  letter-spacing: var(--ls-display);
  color: var(--text-primary);
}
.reader__lead {
  margin: 0 0 var(--space-5);
  font-family: var(--font-body);
  font-size: var(--fs-article-lead);
  line-height: var(--lh-body);
  color: var(--text-muted);
}
.reader__author {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding-bottom: var(--space-5);
  margin-bottom: var(--space-6);
  border-bottom: 1px solid var(--border-subtle);
}
.reader__author-name {
  display: block;
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-body);
  color: var(--text-primary);
}
.reader__author-meta {
  display: block;
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  color: var(--text-muted);
}
.reader__hero {
  aspect-ratio: 16 / 9;
  border-radius: var(--card-radius);
  overflow: hidden;
  margin-bottom: var(--space-8);
  background-color: var(--bg-tertiary);
  background-size: cover;
  background-position: center;
}
.reader__body {
  font-family: var(--font-body);
  font-size: var(--fs-article);
  line-height: var(--lh-article);
  color: var(--text-primary);
}
.reader__body p {
  margin: 0 0 var(--space-5);
}
.reader__quote {
  margin: var(--space-8) 0;
  /* SectionCard teal rail token — sanctioned for the pull-quote rail. */
  padding: var(--space-1) 0 var(--space-1) var(--space-5);
  border-left: 4px solid var(--rail-color);
  font-family: var(--font-display);
  font-weight: var(--fw-semibold);
  font-size: var(--fs-h1);
  line-height: var(--lh-snug);
  color: var(--text-primary);
}
.reader__engagement {
  margin: var(--space-8) 0;
}
.reader__related-h {
  margin: var(--space-10) 0 var(--space-4);
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  font-size: var(--fs-h2);
  color: var(--text-primary);
}
.reader__related {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-4);
}

/* ============================================================
   Persistent mini-player dock (in the shell, below main).
   Docked in flow — a full-width bar; hidden on mobile where the
   bottom-nav owns the viewport foot.
   ============================================================ */
.miniplayer-dock {
  flex-shrink: 0;
  border-radius: 0;
  border-left: none;
  border-right: none;
  border-bottom: none;
}

/* ============================================================
   Playlist page + library (05e, WO-B) — tokens only; composes the
   existing content-grid + content-card + badge tokens.
   ============================================================ */
.playlist-detail__head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-6);
  flex-wrap: wrap;
  margin-bottom: var(--space-6);
}
.playlist-detail__title {
  font-family: var(--font-display);
  font-size: var(--fs-h1);
  font-weight: var(--fw-bold);
  color: var(--text-primary);
  margin: 0 0 var(--space-2);
}
.playlist-detail__meta { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.playlist-detail__meta .ds-badge { display: inline-flex; align-items: center; gap: var(--space-1); }
.playlist-detail__meta .ds-badge i { width: 14px; height: 14px; }
.playlist-detail__count { font-family: var(--font-body); font-size: var(--fs-body-sm); color: var(--text-secondary); }
.playlist-detail__desc { font-family: var(--font-body); font-size: var(--fs-body); color: var(--text-secondary); margin: var(--space-3) 0 0; max-width: 60ch; }
.playlist-detail__actions { display: flex; align-items: center; gap: var(--space-3); }

/* Owner manage strip */
.playlist-manage {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--space-5);
  padding: var(--space-4);
  margin-bottom: var(--space-6);
  background: var(--bg-secondary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--card-radius);
}
.playlist-manage__form { display: flex; flex-direction: column; gap: var(--space-1); margin: 0; }
.playlist-manage__form--danger { justify-content: flex-end; }
.playlist-manage__label { font-family: var(--font-body); font-size: var(--fs-caption); color: var(--text-secondary); }
.playlist-manage__row { display: flex; align-items: center; gap: var(--space-2); }
.playlist-manage__input,
.playlist-manage__select {
  min-height: 44px;
  padding: var(--space-2) var(--space-3);
  background: var(--bg-tertiary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-input);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
}
.playlist-manage__input { min-width: 220px; }
.playlist-manage__input:focus-visible,
.playlist-manage__select:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}
.playlist-manage__note { font-family: var(--font-body); font-size: var(--fs-body-sm); color: var(--text-secondary); margin: 0; }

/* Item grid (numbered <ol> reusing the content-grid) */
.playlist-detail__items { list-style: none; margin: 0; padding: 0; }
.playlist-item { display: flex; flex-direction: column; gap: var(--space-2); }
.playlist-item__remove { margin: 0; }
/* Owner Move-up/down controls (05e polish) — a compact chevron pair above each card. */
.playlist-item__reorder { display: flex; gap: var(--space-1); }
.playlist-item__move { margin: 0; display: inline-flex; }

/* Library "your playlists" grid */
.playlist-library__head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--space-6);
  flex-wrap: wrap;
  margin-bottom: var(--space-6);
}
.playlist-library__title {
  font-family: var(--font-display);
  font-size: var(--fs-h1);
  font-weight: var(--fw-bold);
  color: var(--text-primary);
  margin: 0;
}
/* Channel playlists page — the identity block (title + channel-name subtitle) on the left of the head. */
.playlist-library__id { display: flex; flex-direction: column; gap: var(--space-1); }
.playlist-library__sub { font-family: var(--font-body); font-size: var(--fs-body-sm); color: var(--text-secondary); margin: 0; }
.playlist-library__sub .card-link { display: inline; color: var(--text-secondary); }
.playlist-library__new { display: flex; flex-direction: column; gap: var(--space-1); margin: 0; }
.playlist-library__new-label { font-family: var(--font-body); font-size: var(--fs-caption); color: var(--text-secondary); }
.playlist-library__new-row { display: flex; align-items: center; gap: var(--space-2); }
.playlist-library__new-input {
  min-height: 44px;
  min-width: 220px;
  padding: var(--space-2) var(--space-3);
  background: var(--bg-tertiary);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-input);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--fs-body-sm);
}
.playlist-library__new-input:focus-visible {
  outline: var(--focus-outline);
  outline-offset: var(--focus-offset);
}

.playlist-card { display: flex; flex-direction: column; gap: var(--space-3); }
.playlist-card__cover {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  border-radius: var(--card-radius);
  overflow: hidden;
  background: var(--bg-tertiary);
}
.playlist-card__cover img { width: 100%; height: 100%; object-fit: cover; }
.playlist-card__cover-empty {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
}
.playlist-card__cover-empty i { width: 34px; height: 34px; }
.playlist-card__count {
  position: absolute;
  right: var(--space-2);
  bottom: var(--space-2);
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: 2px var(--space-2);
  border-radius: var(--radius-tab);
  background: var(--media-chip-scrim);
  color: var(--brand-white);
  font-family: var(--font-body);
  font-size: var(--fs-caption);
  font-weight: var(--fw-semibold);
}
.playlist-card__count i { width: 13px; height: 13px; }
.playlist-card__body { display: flex; flex-direction: column; gap: var(--space-2); }
.playlist-card__title {
  font-family: var(--font-display);
  font-size: var(--fs-body);
  font-weight: var(--fw-semibold);
  color: var(--text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.playlist-card__badges { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.playlist-card__badges .ds-badge { display: inline-flex; align-items: center; gap: var(--space-1); }
.playlist-card__badges .ds-badge i { width: 13px; height: 13px; }

/* ============================================================
   Responsive
   ============================================================ */
@media (max-width: 1023.98px) {
  .miniplayer-dock {
    display: none;
  }
}
@media (max-width: 900px) {
  .watch {
    grid-template-columns: 1fr;
  }
  .featured {
    grid-template-columns: 1fr;
  }
  .reader__related {
    grid-template-columns: repeat(2, 1fr);
  }
  .screen,
  .watch {
    padding-left: var(--space-5);
    padding-right: var(--space-5);
  }
}
@media (max-width: 600px) {
  .reader__related {
    grid-template-columns: 1fr;
  }
}
