/* =========================================================
   ChannelCast — design tokens (shared across marketing + admin)
   ========================================================= */
:root {
  --cc-bg:           #0a0e1a;
  --cc-bg-elev:      #0f1525;
  --cc-bg-card:      #131b2c;
  --cc-bg-card-2:    #1a2238;
  --cc-bg-hover:     #1f293f;
  --cc-text:         #f1f5f9;
  --cc-text-muted:   #94a3b8;
  --cc-text-dim:     #64748b;
  --cc-border:       #1f2937;
  --cc-border-soft:  #182030;
  /* Brand accent is the saturated electric blue from the new brand sheet
     (WebIcon/WebLogo). cc-accent-2 is a lighter tint used for the gradient on
     primary CTAs — keeps the buttons feeling lit instead of flat. */
  --cc-accent:       #1B6BFF;
  --cc-accent-2:     #4D8FFF;
  --cc-accent-rgb:   27, 107, 255;
  --cc-live:         #10b981;
  --cc-warning:      #f59e0b;
  --cc-danger:       #ef4444;
  /* Display font is Montserrat per the brand sheet — strong geometric headings
     that match the wordmark in WebLogo.png. Body stays on Open Sans for legibility. */
  --cc-font-display: 'Montserrat', 'Figtree', sans-serif;
  --cc-font-body:    'Open Sans', sans-serif;
  --cc-font-mono:    'JetBrains Mono', 'SF Mono', Consolas, monospace;
  --cc-radius-sm:    6px;
  --cc-radius-md:    10px;
  --cc-radius-lg:    14px;
  --cc-radius-xl:    24px;
  --cc-ease:         cubic-bezier(0.16, 1, 0.3, 1);
  --cc-sidebar:      256px;
  --cc-topbar:       64px;
  /* Shared height for standard form controls + buttons so inline pairs
     (input + adjacent button, select + Add) line up flush. cc-btn--sm + cc-btn--lg
     opt out via their own padding/height overrides. */
  --cc-control-h:    44px;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
/* Dark fallback color lives on <html> so the SignalBackground component (which sits
   fixed at z-index:-1 behind body content) is actually visible. Body stays
   transparent. */
html { scroll-behavior: smooth; background: var(--cc-bg); }
body {
  font-family: var(--cc-font-body);
  font-size: 12pt;
  color: var(--cc-text);
  line-height: 1.6;
  background: transparent;
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
img { display: block; max-width: 100%; }
button { font-family: inherit; cursor: pointer; border: none; background: none; color: inherit; }
h1, h2, h3, h4, h5 { font-family: var(--cc-font-display); font-weight: 700; color: #fff; line-height: 1.2; letter-spacing: -0.01em; }

.cc-container { max-width: 1280px; margin: 0 auto; padding: 0 32px; }
.cc-brand { display: flex; align-items: center; gap: 10px; font-family: var(--cc-font-display); font-weight: 800; font-size: 1.05rem; letter-spacing: -0.02em; }
.cc-brand-mark { width: 32px; height: 32px; border-radius: 8px;
  background: linear-gradient(135deg, var(--cc-accent), var(--cc-accent-2));
  display: grid; place-items: center; color: #fff; font-size: 0.9rem; }
/* Image-based wordmark (icon + ChannelCast lockup baked into the PNG). Replaces the
   gradient-square + FA-icon + text combo across sidebar, marketing header/footer, and
   login pages. Height-driven so it scales with context (sidebar small, login larger). */
.cc-brand-logo { height: 28px; width: auto; display: block; flex-shrink: 0; }
.cc-brand-logo--lg { height: 40px; }

/* Flat caps-label eyebrow — no pill, no border. Just the accent color, a small dot when
   live-indicating, and clear breathing room below before the headline. */
.cc-eyebrow { display: inline-flex; align-items: center; gap: 10px;
  font-size: 0.78rem; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase;
  color: var(--cc-accent); margin-bottom: 28px; }
.cc-eyebrow .cc-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--cc-live);
  box-shadow: 0 0 0 4px rgba(16,185,129,0.22); animation: cc-pulse 1.6s ease-in-out infinite; }
@keyframes cc-pulse { 50% { box-shadow: 0 0 0 8px rgba(16,185,129,0); } }
.cc-grad { background: linear-gradient(120deg, #fff 0%, #bfd4ff 40%, #4d8fff 80%);
  -webkit-background-clip: text; background-clip: text; color: transparent; }

/* ---------- Buttons ---------- */
.cc-btn { display: inline-flex; align-items: center; gap: 8px; padding: 0 18px;
  height: var(--cc-control-h);
  border-radius: 8px; font-family: var(--cc-font-display); font-weight: 600; font-size: 0.92rem;
  border: 1px solid transparent; cursor: pointer; transition: all 0.15s var(--cc-ease); white-space: nowrap;
  text-decoration: none; }
.cc-btn--primary { background: linear-gradient(135deg, var(--cc-accent), var(--cc-accent-2)); color: #fff; }
.cc-btn--primary:hover { filter: brightness(1.08); transform: translateY(-1px); }
.cc-btn--ghost { background: var(--cc-bg-card); color: var(--cc-text); border-color: var(--cc-border); }
.cc-btn--ghost:hover { background: var(--cc-bg-card-2); border-color: rgba(var(--cc-accent-rgb), 0.4); }
.cc-btn--text { color: var(--cc-text-muted); }
.cc-btn--text:hover { color: var(--cc-text); }
.cc-btn--lg { padding: 0 26px; height: 52px; font-size: 1rem; }
.cc-btn--block { width: 100%; justify-content: center; }
.cc-icon-btn { width: 36px; height: 36px; border-radius: 8px;
  background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  display: grid; place-items: center; color: var(--cc-text-muted); transition: all 0.15s var(--cc-ease); }
.cc-icon-btn:hover { color: var(--cc-text); border-color: rgba(var(--cc-accent-rgb), 0.4); }

/* =========================================================
   MARKETING
   ========================================================= */
/* Translucent tint overlays only — no opaque base. The SignalBackground component
   (fixed, z-index:-1 behind <body>) provides the actual dark background + animated
   broadcast layers. The radial accents here just deepen the top corners. */
.cc-marketing { background:
  radial-gradient(1200px 600px at 12% -10%, rgba(var(--cc-accent-rgb),0.22), transparent 60%),
  radial-gradient(900px 500px at 88% 8%, rgba(77,143,255,0.14), transparent 60%);
  min-height: 100vh; position: relative; z-index: 1; }
.cc-marketing__header { position: sticky; top: 0; z-index: 50; backdrop-filter: blur(18px) saturate(140%);
  background: rgba(10,14,26,0.72); border-bottom: 1px solid var(--cc-border-soft); }
.cc-marketing__header-inner { display: flex; align-items: center; justify-content: space-between; height: 72px; }
.cc-marketing__nav { display: flex; align-items: center; gap: 36px; }
.cc-marketing__nav a { color: var(--cc-text-muted); font-size: 0.92rem; font-weight: 500; transition: color 0.2s var(--cc-ease); }
.cc-marketing__nav a:hover { color: var(--cc-text); }
.cc-marketing__cta { display: flex; align-items: center; gap: 14px; }

/* ---------- Marketing site mobile drawer ----------
   Hidden by default. Below 960px the hamburger button shows, the desktop nav and
   CTAs hide, and the drawer slides in from the right when the cc-marketing-drawer
   checkbox flips. Same checkbox-hack pattern as the admin sidebar — no JS for
   the open/close mechanics, just a 10-line inline script that auto-closes when a
   nav link is tapped (since SPA-style anchor jumps don't reload the page). */
/* Marketing-header hamburger matches the brand logo's vertical footprint exactly
   so both elements share the same baseline + visual weight. Without this the brand
   sat ~4px lower than the icon-btn default 36×36. */
.cc-marketing__hamburger { display: none; width: 40px; height: 40px; font-size: 1.05rem; }
.cc-marketing__header .cc-brand-logo { height: 32px; }
.cc-marketing__backdrop { display: none; }
.cc-marketing__drawer { display: none; }

@media (max-width: 960px) {
  .cc-marketing__nav { display: none; }
  .cc-marketing__cta { display: none; }
  /* Same centering carry-over as cc-drawer-hamburger -- inline-flex overrides the base
     .cc-icon-btn's display:grid so we have to restate place-items:center as flex props. */
  .cc-marketing__hamburger { display: inline-flex; align-items: center; justify-content: center; }
  .cc-marketing__backdrop { display: block; position: fixed; inset: 0;
    background: rgba(10,14,26,0.6);
    -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
    opacity: 0; pointer-events: none;
    transition: opacity 0.25s var(--cc-ease); z-index: 60; }
  .cc-marketing__drawer { display: flex; flex-direction: column;
    position: fixed; top: 0; right: 0; bottom: 0; height: 100vh;
    width: 300px; max-width: 86vw;
    background: var(--cc-bg-elev); border-left: 1px solid var(--cc-border-soft);
    transform: translateX(100%);
    transition: transform 0.28s var(--cc-ease);
    z-index: 61; box-shadow: 0 0 32px rgba(0,0,0,0.5); }
  .cc-drawer-toggle:checked ~ .cc-marketing__backdrop { opacity: 1; pointer-events: auto; }
  .cc-drawer-toggle:checked ~ .cc-marketing__drawer { transform: translateX(0); }
}
.cc-marketing__drawer-head { display: flex; align-items: center; justify-content: space-between;
  padding: 16px 18px; border-bottom: 1px solid var(--cc-border-soft); }
.cc-marketing__drawer-nav { display: flex; flex-direction: column; padding: 18px 12px; gap: 4px; flex: 1; }
.cc-marketing__drawer-nav a { display: flex; align-items: center; gap: 14px;
  padding: 12px 14px; border-radius: 8px; color: var(--cc-text); font-size: 0.95rem;
  font-weight: 500; transition: background 0.15s var(--cc-ease), color 0.15s var(--cc-ease); }
.cc-marketing__drawer-nav a i { color: var(--cc-text-muted); width: 18px; text-align: center; }
.cc-marketing__drawer-nav a:hover { background: var(--cc-bg-card); color: #fff; }
.cc-marketing__drawer-nav a:hover i { color: var(--cc-accent); }
.cc-marketing__drawer-foot { display: flex; flex-direction: column; gap: 10px;
  padding: 18px; border-top: 1px solid var(--cc-border-soft); }

.cc-hero { padding: 110px 0 90px; }
.cc-hero__inner { max-width: 960px; margin: 0 auto; text-align: center; padding: 0 32px; }
.cc-hero__title { font-family: var(--cc-font-display); font-weight: 900;
  font-size: clamp(3rem, 8vw, 6rem); line-height: 0.98; letter-spacing: -0.035em;
  margin: 22px 0 14px; text-transform: uppercase; color: #fff; }
.cc-hero h1.cc-hero__title { margin: 22px 0 14px; }
.cc-hero__lead { font-size: 1.18rem; line-height: 1.6; color: #cbd5e1; max-width: 60ch; margin: 28px auto 36px; }
.cc-hero__actions { display: flex; flex-wrap: wrap; gap: 14px; justify-content: center; }
.cc-hero__tagline { margin-top: 36px; font-family: var(--cc-font-display); font-weight: 700;
  font-size: 0.92rem; letter-spacing: 0.28em; text-transform: uppercase; color: var(--cc-text-muted); }
/* Faux platform screenshot — used in the hero + pricing intro. Renders a stylized
   dashboard view via HTML/CSS so it's always crisp, stays on-brand, and doesn't depend
   on hot-linked imagery. Slight perspective tilt under the hero, flat in pricing. */
.cc-hero__preview { margin-top: 56px; perspective: 1600px; display: flex; justify-content: center; }
.cc-hero__preview .cc-screenshot { transform: rotateX(8deg) rotateY(-2deg) translateZ(0);
  max-width: 920px; width: 100%; }
.cc-pricing-preview { margin: 36px auto 0; max-width: 960px; }

.cc-screenshot { background: var(--cc-bg); border: 1px solid var(--cc-border);
  border-radius: 14px; overflow: hidden;
  box-shadow: 0 40px 80px -20px rgba(0,0,0,0.65), 0 0 0 1px rgba(var(--cc-accent-rgb), 0.18); }
.cc-screenshot__chrome { display: flex; align-items: center; gap: 8px;
  padding: 12px 16px; background: var(--cc-bg-elev); border-bottom: 1px solid var(--cc-border-soft); }
.cc-screenshot__dot { width: 11px; height: 11px; border-radius: 50%; background: var(--cc-border); }
.cc-screenshot__dot:nth-child(1) { background: #ef4444; }
.cc-screenshot__dot:nth-child(2) { background: #f59e0b; }
.cc-screenshot__dot:nth-child(3) { background: #10b981; }
.cc-screenshot__addr { margin-left: 16px; font-family: var(--cc-font-mono); font-size: 0.78rem;
  color: var(--cc-text-muted); }
.cc-screenshot__body { display: grid; grid-template-columns: 180px 1fr; min-height: 320px; }
.cc-screenshot__body:has(.cc-screenshot__main--full) { grid-template-columns: 1fr; }
.cc-screenshot__sidebar { background: var(--cc-bg-elev); border-right: 1px solid var(--cc-border-soft);
  padding: 18px 12px; display: flex; flex-direction: column; gap: 16px; }
.cc-screenshot__brand { font-family: var(--cc-font-display); font-weight: 800; font-size: 0.9rem;
  color: #fff; padding: 4px 8px; }
.cc-screenshot__nav { display: flex; flex-direction: column; gap: 4px; }
.cc-screenshot__nav span { display: flex; align-items: center; gap: 10px; padding: 8px 10px;
  font-size: 0.78rem; color: var(--cc-text-muted); border-radius: 8px; }
.cc-screenshot__nav span i { width: 14px; color: var(--cc-text-dim); font-size: 0.78rem; }
.cc-screenshot__nav span.is-active { background: rgba(var(--cc-accent-rgb), 0.14);
  color: #fff; box-shadow: inset 0 0 0 1px rgba(var(--cc-accent-rgb), 0.32); }
.cc-screenshot__nav span.is-active i { color: var(--cc-accent); }
.cc-screenshot__main { padding: 20px; display: flex; flex-direction: column; gap: 18px; }
.cc-screenshot__row { display: flex; align-items: center; justify-content: space-between; }
.cc-screenshot__row h4 { font-size: 0.92rem; color: #fff; margin: 0; }
.cc-screenshot__pill { display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px; border-radius: 999px; font-size: 0.66rem; font-weight: 700;
  letter-spacing: 0.12em; text-transform: uppercase; color: var(--cc-live);
  background: rgba(16,185,129,0.12); border: 1px solid rgba(16,185,129,0.32); }
.cc-screenshot__pill span { width: 6px; height: 6px; border-radius: 50%; background: var(--cc-live);
  box-shadow: 0 0 0 3px rgba(16,185,129,0.22); animation: cc-pulse 1.6s ease-in-out infinite; }
.cc-screenshot__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.cc-screenshot__card { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: 10px; overflow: hidden; }
.cc-screenshot__thumb { aspect-ratio: 16/9; position: relative;
  background: linear-gradient(135deg, var(--cc-accent), #1747b8); }
.cc-screenshot__thumb--b { background: linear-gradient(135deg, #4D8FFF, #1B6BFF); }
.cc-screenshot__thumb--c { background: linear-gradient(135deg, #1f2937, #131b2c);
  box-shadow: inset 0 0 0 1px var(--cc-border); }
.cc-screenshot__onair { position: absolute; top: 6px; left: 6px; padding: 2px 7px;
  border-radius: 4px; background: var(--cc-danger); color: #fff;
  font-size: 0.58rem; font-weight: 800; letter-spacing: 0.12em; }
.cc-screenshot__meta { padding: 8px 10px; display: flex; flex-direction: column; gap: 2px; }
.cc-screenshot__meta strong { color: #fff; font-size: 0.78rem; font-family: var(--cc-font-display); }
.cc-screenshot__meta span { color: var(--cc-text-muted); font-size: 0.7rem; }
.cc-screenshot__stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; }
.cc-screenshot__stat { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: 10px; padding: 14px 16px; }
.cc-screenshot__stat strong { display: block; color: #fff; font-family: var(--cc-font-display);
  font-weight: 800; font-size: 1.4rem; line-height: 1.1; }
.cc-screenshot__stat span { color: var(--cc-text-muted); font-size: 0.72rem; }
.cc-screenshot__chart { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: 10px; padding: 18px; }
.cc-screenshot__bars { display: flex; align-items: flex-end; gap: 8px; height: 140px; }
.cc-screenshot__bars span { flex: 1; background: linear-gradient(180deg, var(--cc-accent), #1747b8);
  border-radius: 4px 4px 0 0; }

@media (max-width: 720px) {
  .cc-hero__preview .cc-screenshot { transform: none; }
  .cc-screenshot__body { grid-template-columns: 1fr; }
  .cc-screenshot__sidebar { display: none; }
  .cc-screenshot__grid { grid-template-columns: 1fr 1fr; }
  .cc-screenshot__stats { grid-template-columns: 1fr 1fr; }
}

/* Photo attribution caption rendered under each use-case image. Subtle so it doesn't
   compete with the bullet list, but the link is hover-discoverable. */
.cc-photo-credit { font-size: 0.72rem; color: var(--cc-text-dim); margin-top: 8px;
  letter-spacing: 0.02em; }
.cc-photo-credit a { color: var(--cc-text-muted); text-decoration: underline;
  text-decoration-color: rgba(var(--cc-accent-rgb), 0.3); text-underline-offset: 2px; }
.cc-photo-credit a:hover { color: var(--cc-accent); text-decoration-color: var(--cc-accent); }

.cc-section { padding: 120px 0; }
.cc-section--alt { background: linear-gradient(180deg, rgba(var(--cc-accent-rgb),0.05), transparent 60%), var(--cc-bg-elev);
  border-top: 1px solid var(--cc-border-soft); border-bottom: 1px solid var(--cc-border-soft); }
.cc-section-head { text-align: center; max-width: 720px; margin: 0 auto 64px; }
.cc-section-head h2 { font-size: clamp(1.8rem, 3.2vw, 2.7rem); margin: 18px 0; }
.cc-section-head p { font-size: 1.08rem; color: var(--cc-text-muted); margin-top: 18px; }

.cc-feature-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.cc-feature-card { background: linear-gradient(180deg, var(--cc-bg-card), var(--cc-bg-card-2));
  border: 1px solid var(--cc-border); border-radius: var(--cc-radius-lg); padding: 32px;
  transition: all 0.3s var(--cc-ease); }
.cc-feature-card:hover { border-color: rgba(var(--cc-accent-rgb), 0.4); transform: translateY(-3px); }
.cc-feature-icon { width: 48px; height: 48px; border-radius: 12px;
  background: linear-gradient(135deg, rgba(var(--cc-accent-rgb),0.16), rgba(77,143,255,0.08));
  border: 1px solid rgba(var(--cc-accent-rgb),0.28); display: grid; place-items: center;
  color: #bfd4ff; font-size: 1.15rem; margin-bottom: 22px; }
.cc-feature-card h3 { font-size: 1.25rem; margin-bottom: 12px; }
.cc-feature-card p { font-size: 0.95rem; color: var(--cc-text-muted); }

.cc-workflow-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 22px; }
.cc-workflow-step { padding: 28px 22px; background: var(--cc-bg-card); border: 1px solid var(--cc-border); border-radius: var(--cc-radius-lg); }
.cc-workflow-step__num { font-family: var(--cc-font-display); font-weight: 800; font-size: 0.75rem;
  letter-spacing: 0.1em; color: var(--cc-accent); margin-bottom: 12px; }
.cc-workflow-step h4 { font-size: 1.08rem; margin-bottom: 8px; }
.cc-workflow-step p { font-size: 0.88rem; color: var(--cc-text-muted); }

.cc-final-cta { text-align: center; padding: 100px 0;
  background: radial-gradient(800px 400px at 50% 0%, rgba(var(--cc-accent-rgb),0.18), transparent 60%);
  border-top: 1px solid var(--cc-border-soft); }
.cc-final-cta h2 { max-width: 18ch; margin: 0 auto 20px; font-size: clamp(1.8rem, 3.2vw, 2.7rem); }
.cc-final-cta p { font-size: 1.1rem; max-width: 52ch; margin: 0 auto 32px; color: var(--cc-text-muted); }

/* Use cases page — alternating two-column rows. Icon + headline on one side, bulleted
   list on the other. Every other section reverses via :nth-child(even) so the layout
   reads like a magazine spread instead of a flat list. */
.cc-usecases { display: flex; flex-direction: column; gap: 72px; margin-top: 56px; }
.cc-usecase { display: grid; grid-template-columns: 1fr 1fr; gap: 56px; align-items: center;
  padding: 48px; background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); position: relative; overflow: hidden; }
.cc-usecase::before { content: ''; position: absolute; inset: 0;
  background: radial-gradient(500px 280px at 100% 0%, rgba(var(--cc-accent-rgb), 0.10), transparent 70%);
  pointer-events: none; }
.cc-usecase:nth-child(even) { direction: rtl; }
.cc-usecase:nth-child(even) > * { direction: ltr; }
.cc-usecase__head { position: relative; z-index: 1; }
.cc-usecase__icon { width: 56px; height: 56px; border-radius: 14px;
  background: linear-gradient(135deg, rgba(var(--cc-accent-rgb), 0.25), rgba(77,143,255,0.12));
  border: 1px solid rgba(var(--cc-accent-rgb), 0.4);
  display: grid; place-items: center; color: var(--cc-accent); font-size: 1.4rem; margin-bottom: 18px; }
.cc-usecase__title { font-family: var(--cc-font-display); font-weight: 800;
  font-size: clamp(1.6rem, 2.4vw, 2.2rem); margin: 14px 0 14px; letter-spacing: -0.02em; color: #fff; }
.cc-usecase__lead { font-size: 1.05rem; line-height: 1.6; color: var(--cc-text-muted); max-width: 50ch; }
.cc-usecase__body { position: relative; z-index: 1; }
.cc-usecase__media { margin: 0 0 40px; border-radius: 14px; overflow: hidden;
  box-shadow: 0 18px 48px -12px rgba(0,0,0,0.55), 0 0 0 1px rgba(var(--cc-accent-rgb), 0.15); }
.cc-usecase__media img { width: 100%; height: auto; display: block; }
.cc-usecase-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 12px; }
.cc-usecase-list li { display: flex; align-items: flex-start; gap: 12px;
  font-size: 0.98rem; color: var(--cc-text); line-height: 1.5; }
.cc-usecase-list li i { color: var(--cc-accent); margin-top: 4px; flex-shrink: 0;
  background: rgba(var(--cc-accent-rgb), 0.14); width: 22px; height: 22px;
  border-radius: 50%; display: grid; place-items: center; font-size: 0.72rem; }

.cc-footer { background: var(--cc-bg); border-top: 1px solid var(--cc-border-soft); padding: 36px 0; }
.cc-footer__inner { display: flex; justify-content: space-between; align-items: center; gap: 24px; flex-wrap: wrap; }
.cc-footer__left { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }
.cc-footer__legal { display: flex; align-items: center; gap: 22px; flex-wrap: wrap; }
.cc-footer__legal a { color: var(--cc-text-muted); font-size: 0.84rem; transition: color 0.15s var(--cc-ease); }
.cc-footer__legal a:hover { color: var(--cc-accent); }

/* Long-form legal pages — privacy, terms, billing. Constrained measure, generous
   vertical rhythm, headings call out section breaks without competing with the
   marketing hero treatments above. */
.cc-legal__head { max-width: 720px; margin: 0 auto 48px; text-align: center; }
.cc-legal__meta { color: var(--cc-text-muted); font-size: 0.92rem; margin-top: 12px; }
.cc-legal__body { max-width: 720px; margin: 0 auto; color: var(--cc-text); font-size: 1.02rem; line-height: 1.75; }
.cc-legal__body h2 { font-family: var(--cc-font-display); font-weight: 700; font-size: 1.25rem;
  color: #fff; margin: 40px 0 14px; letter-spacing: -0.01em; }
.cc-legal__body p { margin: 0 0 16px; color: var(--cc-text-muted); }
.cc-legal__body ul { padding-left: 22px; margin: 0 0 18px; color: var(--cc-text-muted);
  display: flex; flex-direction: column; gap: 8px; }
.cc-legal__body li::marker { color: var(--cc-accent); }
.cc-legal__body strong { color: #fff; font-weight: 600; }
.cc-legal__body a { color: var(--cc-accent); text-decoration: underline;
  text-decoration-color: rgba(var(--cc-accent-rgb), 0.35); text-underline-offset: 3px; }
.cc-legal__body a:hover { text-decoration-color: var(--cc-accent); }
.cc-footer__copy { color: var(--cc-text-dim); font-size: 0.85rem; }

@media (max-width: 880px) {
  .cc-usecase { grid-template-columns: 1fr; gap: 28px; padding: 32px; }
  .cc-usecase:nth-child(even) { direction: ltr; }
  .cc-usecases { gap: 40px; }
}
@media (max-width: 960px) {
  .cc-feature-grid { grid-template-columns: 1fr 1fr; }
  .cc-workflow-grid { grid-template-columns: 1fr 1fr; }
  .cc-section { padding: 80px 0; }
}
@media (max-width: 600px) {
  .cc-feature-grid, .cc-workflow-grid { grid-template-columns: 1fr; }
}

/* =========================================================
   LOGIN
   ========================================================= */
.cc-login { min-height: 100vh; display: grid; place-items: center; padding: 40px 20px;
  background: radial-gradient(800px 400px at 50% -10%, rgba(var(--cc-accent-rgb),0.18), transparent 60%);
  position: relative; z-index: 1; }
.cc-login__card { width: 100%; max-width: 420px; background: var(--cc-bg-card);
  border: 1px solid var(--cc-border); border-radius: var(--cc-radius-lg); padding: 40px; }

/* ---------- Split layout — sign-in card paired with a benefits panel ---------- */
.cc-login--split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 460px);
  gap: 56px; max-width: 1100px; margin: 0 auto; align-items: center; place-items: stretch;
  padding: 56px 24px; }
.cc-login--split .cc-login__card { max-width: none; align-self: center; }
.cc-login__pitch { color: var(--cc-text); padding: 8px 0; align-self: center; }
.cc-login__pitch .cc-eyebrow { margin-bottom: 20px; }
.cc-login__pitch-title { font-family: var(--cc-font-display); font-weight: 800;
  font-size: clamp(2rem, 4vw, 2.8rem); line-height: 1.05; letter-spacing: -0.025em;
  color: #fff; margin: 0 0 18px; }
.cc-login__pitch-lead { color: var(--cc-text-muted); font-size: 1.02rem; line-height: 1.6;
  max-width: 52ch; margin: 0 0 24px; }
.cc-login__pitch-list { list-style: none; padding: 0; margin: 0 0 28px;
  display: flex; flex-direction: column; gap: 14px; }
.cc-login__pitch-list li { display: flex; gap: 12px; align-items: flex-start;
  font-size: 0.94rem; line-height: 1.55; color: var(--cc-text); }
.cc-login__pitch-list li i { color: var(--cc-accent); margin-top: 4px; flex-shrink: 0; font-size: 1.05rem; }
.cc-login__pitch-list li strong { color: #fff; font-weight: 700; }
.cc-login__pitch-list li > div { color: var(--cc-text-muted); }
.cc-login__pitch-foot { display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  padding-top: 22px; border-top: 1px solid var(--cc-border-soft); }
.cc-login__pitch-trust { display: flex; flex-direction: column; gap: 4px; flex: 1; min-width: 200px; }
.cc-login__pitch-trust strong { color: #fff; font-family: var(--cc-font-display);
  font-weight: 700; font-size: 0.92rem; }
.cc-login__pitch-trust span { color: var(--cc-text-muted); font-size: 0.82rem; }

@media (max-width: 880px) {
  .cc-login--split { grid-template-columns: 1fr; max-width: 480px; gap: 40px; padding: 40px 20px; }
  .cc-login--split .cc-login__pitch { order: 2; text-align: left; }
  .cc-login--split .cc-login__card { order: 1; }
}
.cc-login__brand { display: flex; align-items: center; gap: 10px; font-family: var(--cc-font-display);
  font-weight: 800; font-size: 1.05rem; margin-bottom: 24px; }
.cc-login h1 { font-size: 1.6rem; margin-bottom: 6px; }
.cc-login__sub { color: var(--cc-text-muted); font-size: 0.9rem; margin-bottom: 28px; }
.cc-login__error { background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.4);
  border-radius: var(--cc-radius-md); padding: 12px 14px; color: #fecaca; font-size: 0.88rem;
  margin-bottom: 20px; display: flex; align-items: center; gap: 10px; }
.cc-login__form { display: flex; flex-direction: column; gap: 18px; }
.cc-field { display: flex; flex-direction: column; gap: 6px; }
.cc-field > span { font-size: 0.82rem; font-weight: 600; color: var(--cc-text-muted); letter-spacing: 0.02em; }
.cc-field input,
.cc-field select,
.cc-field textarea { background: var(--cc-bg); border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md);
  padding: 0 14px; font: inherit; color: var(--cc-text); transition: border-color 0.15s var(--cc-ease); }
.cc-field input,
.cc-field select { height: var(--cc-control-h); }
.cc-field textarea { padding: 12px 14px; min-height: var(--cc-control-h); line-height: 1.5; }
.cc-field input:focus,
.cc-field select:focus,
.cc-field textarea:focus { outline: none; border-color: rgba(var(--cc-accent-rgb), 0.6); }

/* Suppress the browser's autofill background (Chrome paints a bright off-white over our dark
   inputs when the password manager auto-fills). The inset-shadow trick is the standard fix:
   it overpaints the autofill highlight with our normal dark background while preserving the
   text color we set on the field. Applies to all .cc-field inputs across the admin UI. */
.cc-field input:-webkit-autofill,
.cc-field input:-webkit-autofill:hover,
.cc-field input:-webkit-autofill:focus,
.cc-field textarea:-webkit-autofill,
.cc-field select:-webkit-autofill {
  -webkit-box-shadow: 0 0 0 1000px var(--cc-bg) inset !important;
  -webkit-text-fill-color: var(--cc-text) !important;
  caret-color: var(--cc-text) !important;
  transition: background-color 5000s ease-in-out 0s; /* defers the autofill paint */
}

/* =========================================================
   COLOR PICKER (paired hex input + native color picker)
   ========================================================= */
.cc-color-input { display: flex; gap: 8px; align-items: center; }
.cc-color-input input[type="text"] { flex: 1; min-width: 0; }
.cc-color-input input[type="color"] {
  width: 48px; height: 44px; padding: 0; border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-md); background: var(--cc-bg); cursor: pointer; flex-shrink: 0;
}
.cc-color-input input[type="color"]::-webkit-color-swatch-wrapper { padding: 4px; }
.cc-color-input input[type="color"]::-webkit-color-swatch { border: none; border-radius: 4px; }

/* =========================================================
   IMAGE DROPZONE + PROGRESS BAR
   ========================================================= */
.cc-dropzone {
  position: relative; display: flex; align-items: center; justify-content: center;
  border: 2px dashed var(--cc-border); border-radius: var(--cc-radius-md);
  background: var(--cc-bg); color: var(--cc-text-muted); overflow: hidden;
  transition: border-color 0.15s var(--cc-ease), background 0.15s var(--cc-ease);
  cursor: pointer;
}
.cc-dropzone:hover { border-color: rgba(var(--cc-accent-rgb), 0.5); background: var(--cc-bg-elev); }
.cc-dropzone--dragging { border-color: rgba(var(--cc-accent-rgb), 0.9); background: rgba(var(--cc-accent-rgb), 0.06); }
.cc-dropzone--busy { cursor: progress; border-style: solid; border-color: rgba(var(--cc-accent-rgb), 0.6); }
.cc-dropzone--square { aspect-ratio: 1 / 1; max-width: 280px; }
.cc-dropzone--banner { aspect-ratio: 16 / 5; }
.cc-dropzone--cover  { aspect-ratio: 16 / 9; max-width: 480px; }
.cc-dropzone--portrait { aspect-ratio: 2 / 3; max-width: 280px; }

.cc-dropzone__image { width: 100%; height: 100%; object-fit: contain; background: var(--cc-bg); }

.cc-dropzone__placeholder,
.cc-dropzone__busy {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 8px; text-align: center; padding: 16px; pointer-events: none;
}
.cc-dropzone__placeholder i,
.cc-dropzone__busy i { font-size: 28px; color: var(--cc-text-muted); }
.cc-dropzone__title { font-weight: 600; color: var(--cc-text); font-size: 0.95rem; }
.cc-dropzone__hint { font-size: 0.85rem; color: var(--cc-text-muted); }
.cc-dropzone__limits { font-size: 0.72rem; color: var(--cc-text-dim); }
.cc-dropzone__busy-text { font-size: 0.82rem; color: var(--cc-text); }

.cc-dropzone__input {
  position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;
}
.cc-dropzone--busy .cc-dropzone__input { cursor: progress; pointer-events: none; }

.cc-dropzone__actions {
  display: flex; gap: 10px; align-items: center; margin-top: 10px; flex-wrap: wrap;
}
.cc-dropzone__url-fallback { font-size: 0.78rem; color: var(--cc-text-muted); }
.cc-dropzone__url-fallback summary { cursor: pointer; user-select: none; }
.cc-dropzone__url-fallback input {
  display: block; margin-top: 6px; min-width: 280px;
  background: var(--cc-bg); border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md);
  padding: 8px 12px; color: var(--cc-text);
}

.cc-progress-bar {
  width: 220px; max-width: 80%; height: 8px; background: var(--cc-bg-card-2);
  border-radius: 999px; overflow: hidden;
}
.cc-progress-bar__fill {
  height: 100%; background: linear-gradient(90deg, rgba(var(--cc-accent-rgb),0.6), rgba(var(--cc-accent-rgb),1));
  transition: width 0.18s var(--cc-ease);
}
.cc-login__hints { margin-top: 28px; padding: 16px; background: rgba(255,255,255,0.02);
  border: 1px solid var(--cc-border-soft); border-radius: var(--cc-radius-md); font-size: 0.8rem; color: var(--cc-text-muted); }
.cc-login__hints strong { display: block; margin-bottom: 8px; color: var(--cc-text); font-family: var(--cc-font-display); }
.cc-login__hints code { font-family: var(--cc-font-mono); background: var(--cc-bg); padding: 1px 6px; border-radius: 4px; color: var(--cc-text); }

/* =========================================================
   ADMIN APP SHELL (sidebar + topbar)
   ========================================================= */
.cc-app { display: grid; grid-template-columns: var(--cc-sidebar) 1fr; min-height: 100vh; }

/* Default dark-theme styling for bare inputs/selects/textareas under the admin shell so a
   plain <input type="search"> or inline <select> in a table row doesn't fall back to the
   browser's white default. .cc-field rules above take precedence when present. */
.cc-app input[type="text"],
.cc-app input[type="search"],
.cc-app input[type="email"],
.cc-app input[type="password"],
.cc-app input[type="number"],
.cc-app input[type="date"],
.cc-app input[type="datetime-local"],
.cc-app input[type="url"],
.cc-app input[type="tel"],
.cc-app select,
.cc-app textarea {
  background: var(--cc-bg);
  color: var(--cc-text);
  border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-md);
  font: inherit;
  padding: 0 14px;
  height: var(--cc-control-h);
  transition: border-color 0.15s var(--cc-ease);
}
.cc-app textarea { padding: 12px 14px; height: auto; min-height: var(--cc-control-h); line-height: 1.5; }
.cc-app input:focus,
.cc-app select:focus,
.cc-app textarea:focus { outline: none; border-color: rgba(var(--cc-accent-rgb), 0.6); }
.cc-app input::placeholder,
.cc-app textarea::placeholder { color: var(--cc-text-dim); }
/* Native select arrow on dark bg can disappear in Safari/Firefox — keep their chrome but
   tweak option styling so dropdowns render readable on Chromium. */
.cc-app select option { background: var(--cc-bg-card); color: var(--cc-text); }

.cc-sidebar { background: var(--cc-bg-elev); border-right: 1px solid var(--cc-border-soft);
  display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; overflow-y: auto; }
.cc-sidebar__brand { display: flex; align-items: center; gap: 10px;
  padding: 22px 24px 18px; border-bottom: 1px solid var(--cc-border-soft);
  font-family: var(--cc-font-display); font-weight: 800; font-size: 1.05rem; letter-spacing: -0.02em; }
.cc-tenant-logo { width: 32px; height: 32px; border-radius: 8px;
  background: linear-gradient(135deg, #1747b8, var(--cc-accent));
  display: grid; place-items: center; color: #fff; font-weight: 700; font-size: 0.85rem; flex-shrink: 0; }
.cc-tenant-info { flex: 1; min-width: 0; }
.cc-tenant-name { font-family: var(--cc-font-display); font-weight: 700; font-size: 0.88rem; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cc-tenant-plan { font-size: 0.72rem; color: var(--cc-text-muted); }

/* ---------- Sidebar user dropup ----------
   Sits at the very bottom (margin-top:auto via the parent flex column). The summary is the
   resting button — clicking it toggles the menu which floats above. Native <details> handles
   state + keyboard. Caret rotates 180° when open. */
.cc-user-dropup { margin-top: auto; padding: 12px; border-top: 1px solid var(--cc-border-soft);
  position: sticky; bottom: 0; background: var(--cc-bg-elev); z-index: 5; }
.cc-user-dropup > summary { list-style: none; cursor: pointer; }
.cc-user-dropup > summary::-webkit-details-marker { display: none; }
.cc-user-dropup__trigger { display: flex; align-items: center; gap: 10px;
  padding: 10px 12px; background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-md); transition: background 0.15s var(--cc-ease), border-color 0.15s var(--cc-ease); }
.cc-user-dropup__trigger:hover { background: var(--cc-bg-card-2); border-color: rgba(var(--cc-accent-rgb), 0.4); }
.cc-user-dropup[open] .cc-user-dropup__trigger { border-color: rgba(var(--cc-accent-rgb), 0.5); }
.cc-user-dropup__caret { color: var(--cc-text-muted); font-size: 0.7rem; margin-left: auto;
  transition: transform 0.2s var(--cc-ease); }
.cc-user-dropup[open] .cc-user-dropup__caret { transform: rotate(180deg); }
.cc-user-dropup__menu { position: absolute; bottom: calc(100% - 4px); left: 12px; right: 12px;
  background: var(--cc-bg-card); border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md);
  padding: 6px; box-shadow: 0 -8px 28px rgba(0,0,0,0.5); z-index: 40; }
.cc-user-dropup__item { display: flex; align-items: center; gap: 12px; padding: 9px 12px;
  border-radius: 6px; color: var(--cc-text-muted); font-size: 0.9rem; font-weight: 500;
  font-family: inherit; text-decoration: none; cursor: pointer;
  background: none; border: 0; width: 100%; text-align: left;
  transition: background 0.12s var(--cc-ease), color 0.12s var(--cc-ease); }
.cc-user-dropup__item i { width: 18px; text-align: center; font-size: 0.95rem; }
.cc-user-dropup__item:hover { background: var(--cc-bg-hover); color: var(--cc-text); }
.cc-user-dropup__item.active { background: var(--cc-bg-hover); color: #fff; }
.cc-user-dropup__item--danger { color: var(--cc-danger); }
.cc-user-dropup__item--danger:hover { background: rgba(239,68,68,0.12); color: #fecaca; }
.cc-user-dropup__divider { height: 1px; background: var(--cc-border-soft); margin: 6px 8px; }

/* ---------- Blazor Server reconnect overlay ----------
   Shown when the SignalR connection drops. Blazor flips the inline display style on
   #components-reconnect-modal between "none" (hidden) and "" (visible). We layer a blurred
   backdrop over the whole app and pulse the ChannelCast icon with radiating rings to signal
   "we're working on it." Failure state swaps in the recovery message via the
   components-reconnect-failed / rejected classes Blazor adds. */
.cc-reconnect { position: fixed; inset: 0; z-index: 9999;
  background: rgba(10, 14, 26, 0.65);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  backdrop-filter: blur(14px) saturate(140%);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  color: var(--cc-text); text-align: center; padding: 24px;
  animation: cc-reconnect-fade 0.25s var(--cc-ease) both; }
@keyframes cc-reconnect-fade { from { opacity: 0; } to { opacity: 1; } }

.cc-reconnect__stage { position: relative; width: 140px; height: 140px;
  display: grid; place-items: center; margin-bottom: 28px; }
.cc-reconnect__icon { position: relative; z-index: 2; width: 88px; height: 88px;
  border-radius: 22px; display: block;
  animation: cc-reconnect-bob 2.8s var(--cc-ease) infinite; }
@keyframes cc-reconnect-bob {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-4px); }
}

.cc-reconnect__ring { position: absolute; inset: 0; border-radius: 50%;
  border: 2px solid rgba(var(--cc-accent-rgb), 0.55);
  opacity: 0; pointer-events: none;
  animation: cc-reconnect-pulse 2.4s var(--cc-ease) infinite; }
.cc-reconnect__ring--2 { animation-delay: 0.8s; border-color: rgba(236, 72, 153, 0.45); }
.cc-reconnect__ring--3 { animation-delay: 1.6s; border-color: rgba(var(--cc-accent-rgb), 0.35); }
@keyframes cc-reconnect-pulse {
  0%   { transform: scale(0.55); opacity: 0.85; }
  80%  { opacity: 0; }
  100% { transform: scale(1.6); opacity: 0; }
}

.cc-reconnect__label { font-family: var(--cc-font-display); font-weight: 700; font-size: 1.25rem;
  color: #fff; letter-spacing: -0.01em; margin-bottom: 8px; }
.cc-reconnect__hint { font-size: 0.92rem; color: var(--cc-text-muted); max-width: 360px; line-height: 1.5; }
.cc-reconnect__hint a { color: var(--cc-accent); text-decoration: underline;
  text-decoration-color: rgba(var(--cc-accent-rgb), 0.4); text-underline-offset: 3px; }
.cc-reconnect__hint a:hover { text-decoration-color: var(--cc-accent); }

/* The failure message is hidden during the reconnect attempt and revealed once Blazor adds
   either components-reconnect-failed or components-reconnect-rejected. The connecting
   stage + label hide in those states so only the failure copy stays. */
.cc-reconnect__failure { display: none; max-width: 360px; }
#components-reconnect-modal.components-reconnect-failed .cc-reconnect__stage,
#components-reconnect-modal.components-reconnect-failed > .cc-reconnect__label,
#components-reconnect-modal.components-reconnect-failed > .cc-reconnect__hint,
#components-reconnect-modal.components-reconnect-rejected .cc-reconnect__stage,
#components-reconnect-modal.components-reconnect-rejected > .cc-reconnect__label,
#components-reconnect-modal.components-reconnect-rejected > .cc-reconnect__hint { display: none; }
#components-reconnect-modal.components-reconnect-failed .cc-reconnect__failure,
#components-reconnect-modal.components-reconnect-rejected .cc-reconnect__failure { display: block; }

.cc-nav-section { padding: 16px 12px; }
.cc-nav-section + .cc-nav-section { border-top: 1px solid var(--cc-border-soft); }
.cc-nav-label { font-size: 0.66rem; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--cc-text-dim); padding: 0 12px; margin-bottom: 8px; }
.cc-nav-item { display: flex; align-items: center; gap: 12px; padding: 9px 12px; border-radius: 8px;
  color: var(--cc-text-muted); font-size: 0.9rem; font-weight: 500;
  transition: all 0.15s var(--cc-ease); text-decoration: none; }
.cc-nav-item i { width: 18px; text-align: center; font-size: 0.95rem; }
.cc-nav-item:hover { background: var(--cc-bg-card); color: var(--cc-text); }
.cc-nav-item.active { background: linear-gradient(135deg, rgba(var(--cc-accent-rgb),0.16), rgba(77,143,255,0.06));
  color: #fff; box-shadow: inset 0 0 0 1px rgba(var(--cc-accent-rgb),0.3); }
.cc-nav-item.active i { color: var(--cc-accent); }

.cc-sidebar__foot { margin-top: auto; padding: 12px; border-top: 1px solid var(--cc-border-soft); }

/* Sleek scrollbar — thin, dim, brightens on hover. Sidebar only so the rest of the
   app keeps the native chrome (less visual noise on long pages). Firefox uses the
   standard scrollbar-* properties; Chromium uses the -webkit-scrollbar pseudo. */
.cc-sidebar { scrollbar-width: thin; scrollbar-color: rgba(148,163,184,0.18) transparent; }
.cc-sidebar::-webkit-scrollbar { width: 6px; }
.cc-sidebar::-webkit-scrollbar-track { background: transparent; }
.cc-sidebar::-webkit-scrollbar-thumb { background: rgba(148,163,184,0.18); border-radius: 999px; }
.cc-sidebar:hover { scrollbar-color: rgba(148,163,184,0.4) transparent; }
.cc-sidebar:hover::-webkit-scrollbar-thumb { background: rgba(148,163,184,0.4); }
.cc-sidebar::-webkit-scrollbar-thumb:hover { background: rgba(var(--cc-accent-rgb), 0.55); }

.cc-main { min-width: 0; display: flex; flex-direction: column; }
.cc-topbar { position: sticky; top: 0; z-index: 30; height: var(--cc-topbar);
  background: rgba(10,14,26,0.85); backdrop-filter: blur(16px) saturate(140%);
  border-bottom: 1px solid var(--cc-border-soft);
  display: flex; align-items: center; gap: 16px; padding: 0 28px; }
.cc-breadcrumb { display: flex; align-items: center; gap: 8px; font-size: 0.92rem; color: var(--cc-text-muted); }
/* Topbar search. Flex layout instead of an absolutely-positioned magnifying glass over a
   padded input - the absolute version had the icon's glyph clipping the first letter of
   the placeholder ("Search" rendered as "earch") because FontAwesome's actual glyph width
   exceeded the 36px reserved by padding-left. Flex auto-spaces icon + input with no manual
   reservation needed. */
.cc-search {
  margin-left: auto;
  width: 320px; max-width: 35vw;
  display: flex; align-items: center; gap: 10px;
  background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: 8px; padding: 0 14px;
}
.cc-search i { color: var(--cc-text-dim); font-size: 0.9rem; flex-shrink: 0; }
.cc-search input {
  flex: 1; min-width: 0;
  background: transparent; border: 0; outline: none;
  padding: 9px 0;
  font: inherit; font-size: 0.88rem; color: var(--cc-text);
}
.cc-search input::placeholder { color: var(--cc-text-dim); }
.cc-search:focus-within { border-color: rgba(var(--cc-accent-rgb), 0.6); background: var(--cc-bg-card-2); }
/* Suppress Chromium's native search-input affordances (clear X, decoration) -- they collide
   with our icon and don't match the dark theme. */
.cc-search input::-webkit-search-decoration,
.cc-search input::-webkit-search-cancel-button,
.cc-search input::-webkit-search-results-button,
.cc-search input::-webkit-search-results-decoration { display: none; }
.cc-topbar__actions { display: flex; align-items: center; gap: 14px; }
.cc-avatar { width: 36px; height: 36px; border-radius: 50%;
  background: linear-gradient(135deg, var(--cc-accent), var(--cc-accent-2));
  display: grid; place-items: center; color: #fff; font-weight: 700; font-size: 0.82rem;
  font-family: var(--cc-font-display); }

.cc-page { padding: 28px; flex: 1; }
.cc-page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; margin-bottom: 28px; flex-wrap: wrap; }
.cc-page-head h1 { font-size: 1.65rem; letter-spacing: -0.02em; margin-bottom: 4px; }
.cc-page-sub { color: var(--cc-text-muted); font-size: 0.92rem; }
.cc-page-actions { display: flex; gap: 10px; flex-wrap: wrap; }

/* Mobile: stack heading + actions vertically so the title never gets pushed off-screen, and
   tighten page padding so content has more horizontal room. */
@media (max-width: 640px) {
  .cc-page { padding: 18px 16px; }
  .cc-page-head { flex-direction: column; align-items: stretch; gap: 14px; margin-bottom: 18px; }
  .cc-page-head h1 { font-size: 1.4rem; }
  .cc-page-actions { justify-content: flex-start; }
  /* compact buttons so 3-4 of them in the actions strip still fit on a phone row */
  .cc-page-actions .cc-btn { padding: 0 14px; height: 36px; font-size: 0.84rem; }
}

.cc-empty { padding: 80px 40px; text-align: center; color: var(--cc-text-muted); display: flex;
  flex-direction: column; align-items: center; gap: 16px; }
.cc-empty i { font-size: 2.4rem; opacity: 0.4; }
.cc-spinner { width: 32px; height: 32px; border: 2px solid rgba(255,255,255,0.18);
  border-top-color: rgba(255,255,255,0.85); border-radius: 50%; animation: cc-spin 0.8s linear infinite; }
@keyframes cc-spin { to { transform: rotate(360deg); } }

/* ---------- Channel cards ---------- */
.cc-channel-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 20px; }
.cc-channel-card { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); padding: 22px; display: flex; flex-direction: column; gap: 14px;
  transition: all 0.15s var(--cc-ease); cursor: pointer; text-decoration: none; color: inherit; }
.cc-channel-card:hover { border-color: rgba(var(--cc-accent-rgb), 0.5); transform: translateY(-2px); }
.cc-channel-card__top { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.cc-channel-card__name { font-family: var(--cc-font-display); font-weight: 700; font-size: 1.1rem; color: #fff; }
.cc-channel-card__offline { color: var(--cc-text-dim); font-size: 0.75rem; font-weight: 600;
  letter-spacing: 0.06em; text-transform: uppercase; }
.cc-channel-card__desc { color: var(--cc-text-muted); font-size: 0.88rem; line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.cc-channel-card__meta { display: flex; gap: 14px; font-size: 0.78rem; color: var(--cc-text-dim);
  align-items: center; }
.cc-channel-card__meta i { margin-right: 4px; }
.cc-channel-card__brand { display: flex; gap: 6px; margin-top: auto; padding-top: 14px;
  border-top: 1px solid var(--cc-border-soft); }
.cc-channel-card__quicklinks { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 12px;
  padding-top: 12px; border-top: 1px solid var(--cc-border-soft); }
.cc-channel-card__quicklinks .cc-btn { flex: 1 1 auto; justify-content: center; min-width: 0; }
.cc-channel-card__quicklinks .cc-btn i { margin-right: 4px; }
/* On phones, shrink the quicklink chips so 4-5 of them don't stack into 3-4 rows that
   double the card height. flex-basis is reset so they distribute evenly. */
@media (max-width: 480px) {
  .cc-channel-card__quicklinks { gap: 4px; }
  .cc-channel-card__quicklinks .cc-btn {
    padding: 0 10px;
    height: 32px;
    font-size: 0.74rem;
    flex: 1 1 calc(33.333% - 6px);
  }
  .cc-channel-card__quicklinks .cc-btn i { margin-right: 3px; font-size: 0.78rem; }
}

/* Breadcrumb trail for channel-scoped resource pages. */
.cc-breadcrumbs {
  display: flex; gap: 6px; align-items: center; flex-wrap: wrap;
  font-size: 0.82rem; color: var(--cc-text-muted); margin-bottom: 12px;
}
.cc-breadcrumbs a { color: var(--cc-text-muted); text-decoration: none; }
.cc-breadcrumbs a:hover { color: var(--cc-text); }
.cc-breadcrumbs span:not([class]) { color: var(--cc-text-dim); }
.cc-swatch { width: 24px; height: 24px; border-radius: 6px; border: 1px solid var(--cc-border); }
.cc-default-badge { font-size: 0.6rem; font-weight: 700; letter-spacing: 0.08em; padding: 2px 8px;
  border-radius: 999px; background: rgba(255,255,255,0.06); color: var(--cc-text-muted); border: 1px solid var(--cc-border); }

.cc-live-pill { display: inline-flex; align-items: center; gap: 7px; font-size: 0.7rem; font-weight: 700;
  letter-spacing: 0.1em; padding: 4px 10px; border-radius: 999px; background: rgba(16,185,129,0.18);
  color: var(--cc-live); border: 1px solid rgba(16,185,129,0.4); font-family: var(--cc-font-display); }
.cc-live-pill .cc-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--cc-live);
  box-shadow: 0 0 0 3px rgba(16,185,129,0.22); animation: cc-pulse 1.6s ease-in-out infinite; }

/* ---------- Mobile drawer (checkbox-hack pattern) ----------
   #cc-drawer is a hidden checkbox living just before .cc-app in the layout. The hamburger
   in the topbar is a <label for=cc-drawer> and the backdrop is another <label for=cc-drawer>,
   so the sidebar slides in/out by toggling that single checkbox. The sticky bottom user
   dropup keeps working because position:sticky still respects its scroll container. */
.cc-drawer-toggle { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; }
.cc-drawer-backdrop { display: none; }
.cc-drawer-hamburger { display: none; }

@media (max-width: 820px) {
  .cc-app { grid-template-columns: 1fr; }
  .cc-sidebar {
    position: fixed; top: 0; bottom: 0; left: 0;
    width: 280px; max-width: 86vw; height: 100vh;
    transform: translateX(-100%);
    transition: transform 0.25s var(--cc-ease);
    z-index: 100; box-shadow: 0 0 32px rgba(0,0,0,0.5);
  }
  .cc-drawer-backdrop {
    display: block; position: fixed; inset: 0;
    background: rgba(10,14,26,0.6);
    -webkit-backdrop-filter: blur(4px); backdrop-filter: blur(4px);
    opacity: 0; pointer-events: none;
    transition: opacity 0.25s var(--cc-ease);
    z-index: 99;
  }
  .cc-drawer-toggle:checked ~ .cc-app .cc-sidebar { transform: translateX(0); }
  .cc-drawer-toggle:checked ~ .cc-app .cc-drawer-backdrop { opacity: 1; pointer-events: auto; }
  /* inline-flex overrides the base .cc-icon-btn's display:grid; carry the centering rules
     here too so the bars icon stays centered instead of sticking to the left. */
  .cc-drawer-hamburger { display: inline-flex; flex-shrink: 0; align-items: center; justify-content: center; }
  .cc-search { width: auto; flex: 1; }
}

/* =========================================================
   Channel detail page
   ========================================================= */
.cc-detail-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 18px; margin-bottom: 28px; }
.cc-stat-card { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); padding: 18px; }
.cc-stat-card__head { display: flex; justify-content: space-between; margin-bottom: 8px; }
.cc-stat-card__title { font-family: var(--cc-font-display); font-weight: 600; font-size: 0.74rem;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--cc-text-muted); }
.cc-stat-card__sub { font-size: 0.78rem; color: var(--cc-text-dim); margin-top: 4px; }
.cc-big-number { font-family: var(--cc-font-display); font-weight: 800; font-size: 2.2rem;
  color: #fff; letter-spacing: -0.025em; line-height: 1; }
.cc-detail-section { margin-bottom: 28px; }
.cc-section-title { font-family: var(--cc-font-display); font-weight: 700; font-size: 0.78rem;
  letter-spacing: 0.1em; text-transform: uppercase; color: var(--cc-text-muted); margin-bottom: 12px; }

.cc-config-strip { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); padding: 18px; display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.cc-config-block__label { font-size: 0.7rem; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--cc-text-dim); margin-bottom: 8px; }
.cc-config-block__value { background: rgba(0,0,0,0.3); border: 1px solid var(--cc-border);
  border-radius: 8px; padding: 10px 12px; font-size: 0.85rem; color: var(--cc-text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cc-config-block__value--mono { font-family: var(--cc-font-mono); font-size: 0.78rem; }

.cc-columns { display: grid; grid-template-columns: 1.4fr 1fr; gap: 20px; margin-bottom: 28px; }
.cc-panel { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); overflow: hidden; }
.cc-panel-head { display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px; border-bottom: 1px solid var(--cc-border-soft); }
.cc-panel-title { font-family: var(--cc-font-display); font-weight: 700; font-size: 0.95rem; color: #fff;
  display: flex; align-items: center; gap: 10px; }
.cc-count { font-size: 0.68rem; font-weight: 600; color: var(--cc-text-muted);
  background: rgba(255,255,255,0.04); padding: 2px 8px; border-radius: 999px; border: 1px solid var(--cc-border); }
.cc-panel-empty { padding: 26px 18px; color: var(--cc-text-muted); font-size: 0.88rem; }

.cc-rec-row { display: grid; grid-template-columns: 60px 1fr auto; gap: 14px; align-items: center;
  padding: 12px 18px; border-bottom: 1px solid var(--cc-border-soft); }
.cc-rec-row:last-child { border-bottom: none; }
.cc-rec-thumb { width: 60px; aspect-ratio: 16/10; border-radius: 6px;
  background: linear-gradient(135deg, #312e81, #6366f1); }
.cc-rec-title { font-family: var(--cc-font-display); font-weight: 600; font-size: 0.9rem; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cc-rec-sub { font-size: 0.74rem; color: var(--cc-text-muted); margin-top: 2px; }
.cc-rec-sub i { margin-right: 4px; }
.cc-rec-status { font-size: 0.68rem; font-weight: 600; padding: 3px 9px; border-radius: 999px;
  font-family: var(--cc-font-display); letter-spacing: 0.04em; }
.cc-status-pub { background: rgba(16,185,129,0.15); color: var(--cc-live); border: 1px solid rgba(16,185,129,0.3); }
.cc-status-proc { background: rgba(245,158,11,0.15); color: var(--cc-warning); border: 1px solid rgba(245,158,11,0.3); }
.cc-status-draft { background: rgba(148,163,184,0.12); color: var(--cc-text-muted); border: 1px solid var(--cc-border); }

.cc-activity-item { display: flex; gap: 12px; padding: 12px 18px; border-bottom: 1px solid var(--cc-border-soft); }
.cc-activity-item:last-child { border-bottom: none; }
.cc-activity-icon { width: 32px; height: 32px; border-radius: 8px; display: grid; place-items: center;
  font-size: 0.8rem; flex-shrink: 0; }
.cc-activity-icon--live { background: rgba(16,185,129,0.15); color: var(--cc-live); border: 1px solid rgba(16,185,129,0.3); }
.cc-activity-icon--media { background: rgba(var(--cc-accent-rgb),0.15); color: #bfd4ff; border: 1px solid rgba(var(--cc-accent-rgb),0.3); }
.cc-activity-icon--info { background: rgba(148,163,184,0.12); color: var(--cc-text-muted); border: 1px solid var(--cc-border); }
.cc-activity-body { flex: 1; min-width: 0; font-size: 0.84rem; }
.cc-activity-body b { color: #fff; font-weight: 600; }
.cc-activity-body p { color: var(--cc-text-muted); margin-top: 2px; font-size: 0.76rem; }
.cc-activity-time { font-size: 0.7rem; color: var(--cc-text-dim); flex-shrink: 0; font-family: var(--cc-font-mono); }

@media (max-width: 1180px) {
  .cc-detail-grid { grid-template-columns: 1fr 1fr; }
  .cc-config-strip { grid-template-columns: 1fr; }
  /* drop the detail-page two-column layout earlier than 1180px -- the right rail is
     useless once the main column itself starts feeling cramped. */
}
@media (max-width: 820px) {
  .cc-columns { grid-template-columns: 1fr; }
}

/* Channel schedule -- main calendar + right rail (slot details). Stack on narrow viewports. */
.cc-schedule-layout { display: grid; grid-template-columns: minmax(0, 1fr) 360px; gap: 24px; align-items: start; }
@media (max-width: 980px) {
  .cc-schedule-layout { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  /* Phone: stack everything single-column so 4-col stat grids don't squeeze. */
  .cc-detail-grid { grid-template-columns: 1fr; gap: 12px; }
  .cc-feed-row { grid-template-columns: 1fr; gap: 6px; padding: 12px; }
  .cc-feed-label { font-size: 0.7rem; }
}

/* =========================================================
   Tables (Media, Playlists, Schedule, Devices, Codes, Settings, Tenants)
   ========================================================= */
.cc-table-wrap { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); overflow-x: auto; }
.cc-table { width: 100%; border-collapse: collapse; min-width: 640px; }
/* Tables ride inside .cc-table-wrap and scroll sideways on narrow viewports instead of
   breaking the page layout. min-width keeps columns legible; the wrap exposes a scrollbar
   only when needed. .cc-table--compact (dashboard action lists) drops the min so it stays tight. */
.cc-table--compact { min-width: 480px; }
@media (max-width: 720px) {
  .cc-table th, .cc-table td { padding: 10px 12px; font-size: 0.84rem; }
  .cc-table--compact th, .cc-table--compact td { padding: 6px 8px; }
}
.cc-table th { text-align: left; padding: 12px 16px; font-family: var(--cc-font-display);
  font-weight: 600; font-size: 0.72rem; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--cc-text-muted); background: rgba(255,255,255,0.02);
  border-bottom: 1px solid var(--cc-border-soft); }
.cc-table td { padding: 14px 16px; border-bottom: 1px solid var(--cc-border-soft); font-size: 0.88rem; vertical-align: top; }
.cc-table tr:last-child td { border-bottom: none; }
.cc-table tr:hover td { background: var(--cc-bg-hover); }
.cc-row-title { font-weight: 600; color: #fff; }
.cc-row-sub { font-size: 0.76rem; color: var(--cc-text-muted); margin-top: 2px; }
.cc-mono { font-family: var(--cc-font-mono); font-size: 0.82rem; color: var(--cc-text-muted); }
.cc-table-foot { padding: 12px 18px; font-size: 0.78rem; color: var(--cc-text-dim); }
.cc-btn--sm { padding: 0 12px; height: 32px; font-size: 0.78rem; }

/* Status pills (for tables) */
.cc-status-pill { display: inline-block; font-size: 0.7rem; font-weight: 600; padding: 3px 10px;
  border-radius: 999px; background: rgba(148,163,184,0.12); color: var(--cc-text-muted);
  border: 1px solid var(--cc-border); font-family: var(--cc-font-display); }
.cc-status-pill--active { background: rgba(16,185,129,0.15); color: var(--cc-live); border-color: rgba(16,185,129,0.3); }
.cc-status-pill--draft { background: rgba(245,158,11,0.15); color: var(--cc-warning); border-color: rgba(245,158,11,0.3); }
.cc-status-pill--archived { background: rgba(148,163,184,0.12); color: var(--cc-text-dim); }
.cc-status-pill--secret { background: rgba(77,143,255,0.15); color: #a3c5ff; border-color: rgba(77,143,255,0.3); }
.cc-status-pill i { margin-right: 4px; }

.cc-code-pill { display: inline-block; font-family: var(--cc-font-display); font-weight: 800;
  letter-spacing: 0.12em; padding: 4px 10px; border-radius: 6px;
  background: rgba(var(--cc-accent-rgb),0.08); border: 1px dashed rgba(var(--cc-accent-rgb),0.4); color: #fff; font-size: 0.92rem; }

/* Toggle + forms */
.cc-toggle { display: inline-flex; align-items: center; gap: 8px; color: var(--cc-text-muted);
  font-size: 0.88rem; cursor: pointer; }
.cc-toggle input { accent-color: var(--cc-accent); }

.cc-form-card { background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); padding: 22px; margin-bottom: 22px; }

/* Pinterest-style masonry container: independent cards pack into 2 columns of varying height.
   Pure CSS via column-count -- no JS, no charting library. Cards flow top-to-bottom in column 1
   before wrapping to column 2, which is a slight bias compared to true masonry but acceptable
   for our card counts (2-6 cards). Drops to a single column on phones so cards stay readable.
   Cards must zero out their own max-width + margin-top because the column container owns
   horizontal sizing and the gap between cards. */
.cc-card-masonry { column-count: 2; column-gap: 22px; }
.cc-card-masonry > * {
  break-inside: avoid;
  display: block;
  width: 100%;
  max-width: none;
  margin-top: 0;
  margin-bottom: 22px;
}
.cc-card-masonry > *:last-child { margin-bottom: 0; }
@media (max-width: 820px) {
  .cc-card-masonry { column-count: 1; }
}
.cc-form-card h3 { font-size: 1rem; margin-bottom: 16px; }
.cc-form-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; }
/* Explicit two-column variant for edit pages that have a mix of short fields (selects, dates,
   numbers) and full-width fields (title, description, URL). The full-width ones still use
   grid-column: 1 / -1 to span both columns; short ones pair up cleanly. Collapses to one
   column on phones. */
.cc-form-row--two-col { grid-template-columns: 1fr 1fr; }
@media (max-width: 720px) {
  .cc-form-row--two-col { grid-template-columns: 1fr; }
}
/* VOD category edit: media list dominates the left column (where the operator spends time),
   settings sit in a slim right column. Image dropzones drop below into a full-width band so
   they get the room they need. Collapses to a single column on narrow viewports so the form
   stops stretching past comfortable line lengths. */
.cc-category-edit-grid {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
  gap: 22px;
  align-items: start;
  margin-bottom: 24px;
}
.cc-category-edit-grid > * { min-width: 0; }
@media (max-width: 960px) {
  .cc-category-edit-grid { grid-template-columns: 1fr; }
}

/* Media edit page: form-card on the left, sticky preview/aside on the right. Collapses to a
   single column on narrower viewports so the preview stops eating field width. */
.cc-media-edit-grid {
  display: grid;
  grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
  gap: 22px;
  align-items: start;
  margin-bottom: 28px;
}
.cc-media-edit-grid > * { min-width: 0; }
.cc-media-edit-aside { position: sticky; top: 18px; }
.cc-media-edit-aside .cc-detail-section { margin: 0; }
@media (max-width: 1100px) {
  .cc-media-edit-grid { grid-template-columns: 1fr; }
  .cc-media-edit-aside { position: static; }
}

/* Media-list thumbnail cell — modeled on the legacy media-thumb (~75-90px 16:9 with a
   duration badge in the bottom-right corner). */
.cc-media-thumb {
  position: relative;
  display: block;
  width: 90px;
  aspect-ratio: 16/9;
  border-radius: 6px;
  overflow: hidden;
  background: var(--cc-bg);
  border: 1px solid var(--cc-border);
}
.cc-media-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cc-media-thumb__placeholder {
  display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%; color: var(--cc-text-muted); font-size: 1.1rem;
}
.cc-media-thumb__time {
  position: absolute; bottom: 2px; right: 2px;
  background: rgba(0,0,0,0.75); color: #fff;
  font-size: 0.65rem; line-height: 1; padding: 2px 5px; border-radius: 3px;
  font-variant-numeric: tabular-nums;
}

/* Playlist "Add media" visual picker — thumbnail grid with an inline + button per card.
   Mirrors the legacy loadPlaylistMedia panel: thumbnail + duration badge + green add button. */
.cc-media-picker-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
  gap: 12px;
  padding: 14px 18px;
}
.cc-media-picker-card {
  position: relative;
  display: block;
  border: 1px solid var(--cc-border);
  border-radius: 8px;
  overflow: hidden;
  background: var(--cc-bg);
  text-decoration: none;
  color: inherit;
}
.cc-media-picker-card__thumb {
  position: relative;
  width: 100%;
  aspect-ratio: 16/9;
  background: var(--cc-bg-card);
}
.cc-media-picker-card__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cc-media-picker-card__placeholder {
  display: flex; align-items: center; justify-content: center;
  width: 100%; height: 100%; color: var(--cc-text-muted); font-size: 1.4rem;
}
.cc-media-picker-card__time {
  position: absolute; top: 4px; left: 4px;
  background: rgba(0,0,0,0.75); color: #fff;
  font-size: 0.7rem; line-height: 1; padding: 3px 6px; border-radius: 3px;
  font-variant-numeric: tabular-nums;
}
.cc-media-picker-card__count {
  position: absolute; top: 4px; right: 4px;
  background: rgba(124, 92, 255, 0.92); color: #fff;
  font-size: 0.7rem; font-weight: 600; line-height: 1; padding: 3px 6px; border-radius: 999px;
  font-variant-numeric: tabular-nums;
}
.cc-media-picker-card__add {
  position: absolute; bottom: 6px; right: 6px;
  background: rgba(34,197,94,0.85); color: #fff; border: 0;
  width: 28px; height: 28px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer; font-size: 0.85rem;
  transition: background 0.15s ease;
}
.cc-media-picker-card__add:hover { background: rgba(34,197,94,1); }
.cc-media-picker-card__add:disabled { background: rgba(120,120,120,0.6); cursor: default; }
.cc-media-picker-card__name {
  padding: 6px 10px;
  font-size: 0.78rem;
  font-weight: 500;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.cc-media-picker-card__status {
  padding: 0 10px 8px;
  font-size: 0.68rem;
  color: var(--cc-text-muted);
  display: flex; justify-content: space-between; gap: 6px;
}

/* Centered modal overlay used by the playlist add-media picker (and reusable for similar
   library-style pickers). Click on the dimmed backdrop closes; click inside is stopped. */
.cc-modal-overlay {
  position: fixed; inset: 0; z-index: 1000;
  background: rgba(8, 9, 16, 0.72);
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
  overflow-y: auto;
}
.cc-modal {
  background: var(--cc-bg-card);
  border: 1px solid var(--cc-border);
  border-radius: 12px;
  box-shadow: 0 18px 48px rgba(0,0,0,0.55);
  display: flex; flex-direction: column;
  width: 100%; max-width: 720px;
  max-height: calc(100vh - 48px);
}
.cc-modal--wide { max-width: 1100px; }
.cc-modal__head {
  display: flex; align-items: flex-start; gap: 14px;
  padding: 18px 22px;
  border-bottom: 1px solid var(--cc-border);
}
.cc-modal__head > :first-child { flex: 1; }
.cc-modal__head .cc-icon-btn { font-size: 1rem; }
.cc-modal__body {
  padding: 18px 22px;
  overflow-y: auto;
  flex: 1;
}
.cc-modal__foot {
  display: flex; gap: 10px; justify-content: flex-end;
  padding: 14px 22px;
  border-top: 1px solid var(--cc-border);
}
/* In the modal we override the auto-fill grid to a fixed 4-col layout matching the legacy
   loadMediaLibrary picker. Collapses gracefully on narrow viewports. */
.cc-modal .cc-media-picker-grid { grid-template-columns: repeat(4, 1fr); padding: 0; }
@media (max-width: 880px) {
  .cc-modal .cc-media-picker-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
  .cc-modal .cc-media-picker-grid { grid-template-columns: 1fr; }
}

/* Mobile modal tightening. On 360px-ish phones the default 24px overlay padding leaves only
   ~312px of content width, and 22px head/body/foot padding eats more. Drop the chrome and
   stack the footer buttons full-width so primary/done actions are thumb-reachable without
   horizontal scroll. */
@media (max-width: 520px) {
  .cc-modal-overlay { padding: 8px; }
  .cc-modal { max-height: calc(100vh - 16px); }
  .cc-modal__head { padding: 14px 16px; gap: 10px; }
  .cc-modal__body { padding: 14px 16px; }
  .cc-modal__foot { padding: 12px 16px; flex-direction: column-reverse; gap: 8px; }
  .cc-modal__foot > * { width: 100%; }
}

/* Inline grid-template-columns overrides on .cc-form-row (simulcast target row, captions
   row, modal picker filters, etc.) lock to multi-column layouts that overflow on phones.
   Force every .cc-form-row to a single column under 720px, overriding inline styles via
   !important. The base rule's auto-fit minmax(220px, 1fr) would have handled this on its
   own, but inline grid-template-columns wins specificity-wise without the !important. */
@media (max-width: 720px) {
  .cc-form-row { grid-template-columns: 1fr !important; }
  .cc-form-row > .cc-field[style*="grid-column"] { grid-column: 1 / -1 !important; }
}

/* Channel detail page: 50/50 split — live preview iframe on the LEFT, stats grid on the
   RIGHT (stats wrap to two columns inside their half). When the channel hasn't been
   provisioned yet (no preview), the stats grid stretches to its normal 4-column layout via
   :has(). */
.cc-channel-overview {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 22px;
  align-items: start;
  margin-bottom: 28px;
}
.cc-channel-overview > * { min-width: 0; }
.cc-channel-overview > .cc-detail-grid { margin-bottom: 0; grid-template-columns: 1fr 1fr; }
.cc-channel-overview > .cc-channel-preview { position: sticky; top: 18px; }
.cc-channel-overview:not(:has(> .cc-channel-preview)) { display: block; }
.cc-channel-overview:not(:has(> .cc-channel-preview)) > .cc-detail-grid {
  grid-template-columns: repeat(4, 1fr);
}
@media (max-width: 1100px) {
  .cc-channel-overview { grid-template-columns: 1fr; }
  .cc-channel-overview > .cc-detail-grid { grid-template-columns: repeat(2, 1fr); }
  .cc-channel-overview > .cc-channel-preview { position: static; }
}
@media (max-width: 720px) {
  .cc-channel-overview > .cc-detail-grid { grid-template-columns: 1fr; }
}
/* Inline grid-template-columns on a .cc-form-row beats the base rule on wide screens, so we
   counter-override at the mobile breakpoint where the inline 4-column layout would force a
   horizontal scrollbar. */
@media (max-width: 760px) {
  .cc-form-row--simulcast { grid-template-columns: 1fr !important; }
}
.cc-form-row > .cc-field { display: flex; flex-direction: column; gap: 6px; }
.cc-form-row > .cc-field > span { font-size: 0.78rem; font-weight: 600; color: var(--cc-text-muted); letter-spacing: 0.02em; }
.cc-form-row > .cc-field > input,
.cc-form-row > .cc-field > select { background: var(--cc-bg); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-md); padding: 0 12px; height: var(--cc-control-h); font: inherit; font-size: 0.9rem; color: var(--cc-text); }
.cc-form-row > .cc-field > input:focus,
.cc-form-row > .cc-field > select:focus { outline: none; border-color: rgba(var(--cc-accent-rgb), 0.6); }
.cc-field--row { flex-direction: row !important; align-items: center !important; gap: 10px !important;
  background: rgba(255,255,255,0.02); border: 1px solid var(--cc-border-soft); border-radius: var(--cc-radius-md);
  padding: 10px 12px; cursor: pointer; }
.cc-field--row input { accent-color: var(--cc-accent); }
.cc-field--row span { font-size: 0.86rem !important; color: var(--cc-text) !important; font-weight: 500 !important; }
.cc-form-error { margin-top: 12px; padding: 10px 14px; background: rgba(239,68,68,0.1);
  border: 1px solid rgba(239,68,68,0.4); border-radius: var(--cc-radius-md); color: #fecaca; font-size: 0.86rem; }
.cc-form-saved { margin-top: 12px; padding: 8px 14px; background: rgba(16,185,129,0.1);
  border: 1px solid rgba(16,185,129,0.4); border-radius: var(--cc-radius-md); color: #6ee7b7; font-size: 0.82rem; }

.cc-select-block { background: var(--cc-bg); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-md); padding: 10px 12px; font: inherit; font-size: 0.9rem;
  color: var(--cc-text); width: 100%; }
.cc-select-block:focus { outline: none; border-color: rgba(var(--cc-accent-rgb), 0.6); }

/* Playlist detail rows */
.cc-pl-row { display: grid; grid-template-columns: 38px 1fr auto; gap: 14px; align-items: center;
  padding: 12px 18px; border-bottom: 1px solid var(--cc-border-soft); }
.cc-pl-row:last-child { border-bottom: none; }
.cc-pl-num { font-family: var(--cc-font-mono); font-size: 0.82rem; color: var(--cc-text-dim); text-align: right; }
.cc-pl-info { min-width: 0; }
.cc-pl-title { font-family: var(--cc-font-display); font-weight: 600; font-size: 0.9rem; color: #fff;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cc-pl-sub { font-size: 0.74rem; color: var(--cc-text-muted); margin-top: 2px; }
.cc-pl-actions { display: flex; gap: 6px; }
.cc-pl-actions .cc-icon-btn { width: 30px; height: 30px; }
.cc-pl-actions .cc-icon-btn[disabled] { opacity: 0.35; cursor: not-allowed; }

/* Marketing: pricing grid */
.cc-section--top { padding-top: 80px; }
.cc-pricing-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; }
.cc-price-card { display: flex; flex-direction: column; gap: 18px; position: relative;
  padding: 28px; background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); }
.cc-price-card--featured { border-color: rgba(var(--cc-accent-rgb), 0.55);
  box-shadow: 0 0 0 1px rgba(var(--cc-accent-rgb), 0.35), 0 24px 60px -28px rgba(var(--cc-accent-rgb), 0.5); }
.cc-price-badge { position: absolute; top: 14px; right: 14px; padding: 4px 10px; font-size: 0.7rem;
  letter-spacing: 0.08em; font-weight: 700; background: rgba(var(--cc-accent-rgb), 0.18);
  color: var(--cc-accent); border-radius: 999px; }
.cc-price-name { font-family: var(--cc-font-display); font-weight: 700; font-size: 1.05rem; color: #fff; }
.cc-price-tagline { font-size: 0.86rem; color: var(--cc-text-dim); margin-top: 4px; }
.cc-price-value { display: flex; align-items: baseline; gap: 6px; }
.cc-price-num { font-family: var(--cc-font-display); font-weight: 800; font-size: 2.4rem; color: #fff;
  background: linear-gradient(135deg, #fff 30%, var(--cc-accent) 100%);
  -webkit-background-clip: text; background-clip: text; color: transparent; }
.cc-price-per { color: var(--cc-text-dim); font-size: 0.9rem; }
.cc-price-features { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column;
  gap: 10px; font-size: 0.9rem; color: var(--cc-text); }
.cc-price-features li { display: flex; align-items: center; gap: 10px; }
.cc-price-features i { width: 16px; text-align: center; color: var(--cc-accent); font-size: 0.82rem; }
.cc-price-features .cc-price-features__muted { color: var(--cc-text-dim); }
.cc-price-features .cc-price-features__muted i { color: var(--cc-text-dim); }
.cc-pricing-note { margin-top: 36px; text-align: center; color: var(--cc-text-dim); font-size: 0.9rem; }
.cc-pricing-note a { color: var(--cc-accent); text-decoration: none; }
.cc-pricing-note a:hover { text-decoration: underline; }

/* Marketing: FAQ grid */
.cc-faq-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 22px; }
.cc-faq-item { padding: 24px; background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); }
.cc-faq-item h3 { font-family: var(--cc-font-display); font-weight: 700; font-size: 1rem;
  color: #fff; margin: 0 0 10px; }
.cc-faq-item p { font-size: 0.9rem; line-height: 1.55; color: var(--cc-text); margin: 0; }

@media (max-width: 900px) {
  .cc-pricing-grid { grid-template-columns: 1fr 1fr; }
  .cc-faq-grid { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  .cc-pricing-grid { grid-template-columns: 1fr; }
}

/* Integrations landing cards */
.cc-integration-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr));
  gap: 18px; max-width: 1100px; }
.cc-integration-card { display: grid; grid-template-columns: 56px 1fr 16px; gap: 18px;
  align-items: center; padding: 22px; background: var(--cc-bg-card); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-lg); color: inherit; text-decoration: none;
  transition: border-color 0.15s, transform 0.15s; }
.cc-integration-card:hover { border-color: rgba(var(--cc-accent-rgb), 0.45); transform: translateY(-1px); }
.cc-integration-card__icon { width: 56px; height: 56px; display: flex; align-items: center;
  justify-content: center; background: rgba(var(--cc-accent-rgb), 0.1);
  color: var(--cc-accent); border-radius: var(--cc-radius-md); font-size: 1.4rem; }
.cc-integration-card__body h3 { margin: 0 0 4px; font-family: var(--cc-font-display);
  font-weight: 700; font-size: 1.05rem; color: #fff; }
.cc-integration-card__body p { margin: 0 0 10px; font-size: 0.86rem; color: var(--cc-text-muted); }
.cc-integration-card__status { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.cc-integration-card__chev { color: var(--cc-text-dim); font-size: 0.85rem; }
.cc-integration-card:hover .cc-integration-card__chev { color: var(--cc-accent); }

/* 2FA recovery codes display */
.cc-recovery-codes { font-family: var(--cc-font-mono); font-size: 0.92rem; padding: 14px 18px;
  background: var(--cc-bg); border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md);
  color: #fff; letter-spacing: 0.08em; line-height: 1.7; -webkit-user-select: all; user-select: all; }

/* 2FA method picker tabs on /app/account/2fa */
.cc-2fa-tabs { display: flex; gap: 8px; border-bottom: 1px solid var(--cc-border); margin-bottom: 8px; }
.cc-2fa-tab { background: transparent; border: 0; border-bottom: 2px solid transparent; color: var(--cc-text-muted);
  padding: 10px 16px; cursor: pointer; font: inherit; font-size: 0.92rem; display: inline-flex; align-items: center; gap: 8px; }
.cc-2fa-tab:hover { color: var(--cc-text); }
.cc-2fa-tab.is-active { color: #fff; border-bottom-color: var(--cc-accent); }
.cc-2fa-qr { display: flex; align-items: center; justify-content: center; padding: 6px;
  background: #fff; border-radius: 8px; }
.cc-2fa-qr img { display: block; }

/* Usage meter (streaming-hours metering) */
.cc-usage-meter { padding: 14px 18px; margin-bottom: 20px; background: var(--cc-bg-card);
  border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md); }
.cc-usage-meter__head { display: flex; align-items: baseline; justify-content: space-between;
  font-size: 0.88rem; color: var(--cc-text); margin-bottom: 8px; }
.cc-usage-meter__bar { height: 8px; background: var(--cc-bg); border-radius: 999px; overflow: hidden; }
.cc-usage-meter__bar > div { height: 100%; background: linear-gradient(90deg, var(--cc-accent), var(--cc-accent-2));
  transition: width 0.3s ease; }
.cc-usage-meter--over .cc-usage-meter__bar > div { background: linear-gradient(90deg, #f59e0b, #ef4444); }

/* Analytics: per-channel distribution bar */
.cc-analytics-bar { position: relative; height: 22px; background: var(--cc-bg); border-radius: 4px;
  overflow: hidden; min-width: 120px; }
.cc-analytics-bar > div { height: 100%; background: linear-gradient(90deg, var(--cc-accent), var(--cc-accent-2));
  transition: width 0.3s ease; }
.cc-analytics-bar > span { position: absolute; right: 8px; top: 50%; transform: translateY(-50%);
  font-size: 0.74rem; color: #fff; mix-blend-mode: difference; font-family: var(--cc-font-mono); }

/* Image upload widget (channel edit artwork) */
.cc-image-uploader { display: grid; grid-template-columns: 160px 1fr; gap: 16px; align-items: start;
  padding: 12px; background: var(--cc-bg); border: 1px solid var(--cc-border); border-radius: var(--cc-radius-md); }
.cc-image-preview { display: flex; align-items: center; justify-content: center; overflow: hidden;
  background: rgba(255,255,255,0.02); border: 1px dashed var(--cc-border); border-radius: var(--cc-radius-sm);
  color: var(--cc-text-dim); font-size: 1.8rem; }
.cc-image-preview img { width: 100%; height: 100%; object-fit: contain; display: block; }
.cc-image-preview--square { aspect-ratio: 1/1; }
.cc-image-preview--banner { aspect-ratio: 16/5; }
.cc-image-preview--cover { aspect-ratio: 16/9; }
.cc-image-controls { display: flex; flex-direction: column; gap: 8px; align-items: flex-start; }
.cc-image-controls input[type="file"] { font-size: 0.82rem; color: var(--cc-text-dim); }
.cc-image-url-fallback { font-size: 0.78rem; color: var(--cc-text-dim); margin-top: 4px; width: 100%; }
.cc-image-url-fallback summary { cursor: pointer; -webkit-user-select: none; user-select: none; padding: 4px 0; }
.cc-image-url-fallback input { width: 100%; margin-top: 6px; }

/* Public feed URL rows on channel detail */
.cc-feed-rows { display: flex; flex-direction: column; gap: 10px; }
.cc-feed-row { display: grid; grid-template-columns: 200px 1fr auto; gap: 14px; align-items: center;
  padding: 10px 14px; background: var(--cc-bg); border: 1px solid var(--cc-border);
  border-radius: var(--cc-radius-md); }
.cc-feed-label { font-size: 0.78rem; color: var(--cc-text-dim); font-weight: 600; }
.cc-feed-url { font-size: 0.78rem; color: var(--cc-text); white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; min-width: 0; }
/* When a feed row has only two children (label + trailing action button, no middle url cell),
   the button would otherwise land in the 1fr column and stretch full-width. Push it to the
   trailing auto column and shrink it to its content. */
.cc-feed-row > :nth-child(2):last-child { grid-column: 3; justify-self: end; }

/* ====================================================================
   Broadcast / digital signal background — three composited layers that
   sit fixed behind the marketing + auth pages. All decorative (z-index:-1,
   pointer-events:none). Layers are transform/opacity-only so the browser
   can run them on the compositor without paints.
   ==================================================================== */
.cc-signal-bg { position: fixed; inset: 0; pointer-events: none; z-index: 0;
  overflow: hidden; background: var(--cc-bg); }

/* Layer 1: two soft accent-color orbs that slowly drift like the signal source
   moving through space. Multi-stop radial gradients keep edges soft. */
.cc-signal-bg__orbs { position: absolute; inset: -10%;
  background:
    radial-gradient(640px 420px at 18% 22%, rgba(var(--cc-accent-rgb), 0.18), transparent 62%),
    radial-gradient(520px 360px at 82% 78%, rgba(77,143,255,0.12), transparent 60%),
    radial-gradient(380px 260px at 50% 110%, rgba(var(--cc-accent-rgb), 0.10), transparent 60%);
  animation: cc-signal-drift 28s ease-in-out infinite alternate;
  will-change: transform; }
@keyframes cc-signal-drift {
  0%   { transform: translate3d(0, 0, 0); }
  50%  { transform: translate3d(-24px, 18px, 0); }
  100% { transform: translate3d(20px, -16px, 0); }
}

/* Layer 2: three concentric rings that expand outward like a broadcast tower
   sending out a signal. Each ring delays its start so the pulse is continuous. */
.cc-signal-bg__pulses { position: absolute; left: 50%; top: 38vh;
  width: 0; height: 0; }
.cc-signal-bg__pulses span { position: absolute; left: 50%; top: 50%;
  width: 320px; height: 320px; margin-left: -160px; margin-top: -160px;
  border-radius: 50%; border: 1.5px solid rgba(var(--cc-accent-rgb), 0.6);
  opacity: 0;
  animation: cc-signal-broadcast 9s ease-out infinite;
  will-change: transform, opacity; }
.cc-signal-bg__pulses span:nth-child(2) { animation-delay: 3s; border-color: rgba(77,143,255,0.55); }
.cc-signal-bg__pulses span:nth-child(3) { animation-delay: 6s; border-color: rgba(var(--cc-accent-rgb), 0.4); }
@keyframes cc-signal-broadcast {
  0%   { transform: scale(0.18); opacity: 0; }
  12%  { opacity: 0.55; }
  100% { transform: scale(4.2); opacity: 0; }
}

/* Layer 3: faint CRT-style scanlines that slowly drift downward. The pattern is
   repeating; we animate background-position so the lines appear to move without
   touching layout. */
.cc-signal-bg__scanlines { position: absolute; inset: -20px;
  background-image: repeating-linear-gradient(
    to bottom,
    transparent 0px,
    transparent 3px,
    rgba(255,255,255,0.018) 3px,
    rgba(255,255,255,0.018) 4px
  );
  background-size: 100% 4px;
  animation: cc-signal-scan 8s linear infinite;
  opacity: 0.8;
  mix-blend-mode: overlay; }
@keyframes cc-signal-scan {
  from { background-position: 0 0; }
  to   { background-position: 0 4px; }
}

/* Respect reduced-motion preference — kill animations but keep the static look. */
@media (prefers-reduced-motion: reduce) {
  .cc-signal-bg__orbs,
  .cc-signal-bg__pulses span,
  .cc-signal-bg__scanlines { animation: none; }
  .cc-signal-bg__pulses span { opacity: 0.25; transform: scale(1.5); }
}
