/* amodramas — folha unica, escrita a mao. Sem Tailwind, sem build, sem PostCSS.
   Tokens iguais aos do tema antigo pra que a cara do site nao mude:
   fundo #080808, card #121212, borda #242424, rosa #FF75A8. */

/* o atributo hidden SEMPRE oculta — componentes com display próprio (.field flex,
   etc.) sobrescreviam o hidden e vazavam campos (ex.: a senha do login). */
[hidden]{display:none!important}

:root{
  --bg:#080808;
  --card:#121212;
  --card2:#181818;
  --surface:#1c1c1c;
  --line:#242424;
  --line2:#2e2e2e;
  --txt:#ffffff;
  --muted:#a0a0a0;
  --muted2:#6b6b6b;
  --primary:#FF75A8;
  --primary-2:#e0568c;
  --primary-ink:#ffffff;
  --premium:#f0b429;
  --green:#10b981;
  --red:#ef4444;
  --radius:12px;
  --radius-lg:16px;
  --radius-xl:22px;
  --shell:1440px;
  --nav-h:64px;
  --tab-h:56px;
}

*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  background:var(--bg);
  color:var(--txt);
  font-family:'Montserrat',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  font-size:14px;
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
  min-height:100vh;
  overflow-x:clip;   /* o fundo full-bleed do hero (100vw) nao gera barra horizontal */
  padding-bottom:calc(var(--tab-h) + env(safe-area-inset-bottom));
}
@media(min-width:768px){body{padding-bottom:0}}

img,svg,video{display:block;max-width:100%}
a{color:inherit;text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
h1,h2,h3,h4{font-weight:700;letter-spacing:-.02em;line-height:1.2}
:focus-visible{outline:2px solid var(--primary);outline-offset:2px;border-radius:4px}
::selection{background:var(--primary);color:#fff}

/* mata o zoom do duplo-toque e o flash cinza ao tocar nos controles */
a,button,label,summary,select,
input[type=button],input[type=submit],input[type=reset],
input[type=checkbox],input[type=radio],
[role=button],[data-sheet-open],[data-subscribe]{
  touch-action:manipulation;
  -webkit-tap-highlight-color:transparent;
}

/* iOS: input com menos de 16px faz a tela dar zoom no foco */
@supports(-webkit-touch-callout:none){
  input,select,textarea{font-size:16px !important}
}

.shell{max-width:var(--shell);margin:0 auto;padding:0 16px}
@media(min-width:640px){.shell{padding:0 24px}}
@media(min-width:1024px){.shell{padding:0 48px}}

.muted{color:var(--muted)}
.small{font-size:12px}
.center{text-align:center}
.stack{display:flex;flex-direction:column;gap:12px}
.row{display:flex;align-items:center;gap:10px}
.spread{display:flex;align-items:center;justify-content:space-between;gap:12px}
.wrap{flex-wrap:wrap}
.grow{flex:1;min-width:0}
.hide-mobile{display:none}
@media(min-width:768px){.hide-mobile{display:flex}.hide-desktop{display:none!important}}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ─────────────── topo ─────────────── */
/* Header sólido, sempre fixo no topo (grudado), como o iDrama. */
.nav{
  position:fixed;top:0;left:0;right:0;z-index:60;
  /* vidro fumê (nao transparente total): dá pra ler o header sobre qualquer conteúdo */
  background:rgba(12,12,14,.72);
  -webkit-backdrop-filter:blur(18px) saturate(1.4);
  backdrop-filter:blur(18px) saturate(1.4);
  border-bottom:1px solid rgba(255,255,255,.06);
  transition:transform .34s var(--ease),background .3s,border-color .3s;
}
/* Esconde ao rolar pra BAIXO; reaparece a cada deslizada pra CIMA (app-fx.js) — PC e celular. */
.nav.nav-hidden{transform:translateY(-100%)}
/* Home: no TOPO fica transparente sobre o banner; ao rolar ganha o vidro fumê. */
body.is-home .nav.at-top{background:transparent;border-bottom-color:transparent;
  -webkit-backdrop-filter:none;backdrop-filter:none}

/* O conteúdo começa abaixo do topo fixo. */
main{padding-top:var(--nav-h)}
/* A pagina "bare" (paywall, /assinar) esconde a navbar, mas o main continuava
   reservando os 64px dela — uma faixa preta no topo, acima do papel de parede
   dourado. Foi o "retangulo preto" que o dono viu na tela.
   A excecao da linha ~121 (flash-wrap + main) devolve o espaco quando ha um
   aviso no topo, entao continua valendo. */
body.bare main{padding-top:0}
/* A mensagem de flash e irma ANTERIOR do <main>, e quem compensa a navbar fixa e o
   `main{padding-top}` acima — entao o aviso nascia debaixo da barra (MEDIDO: alerta
   em y=16..61,5 dentro da navbar y=0..65, 100% coberto; elementFromPoint devolvia
   IMG.brand-logo). A compensacao passa pro flash e o <main> logo depois nao repete o
   padding. `+` e CSS2, sem :has(). MEDIDO na home depois do patch: alerta em y=80,
   elementFromPoint devolve DIV.alert e o conteudo continua comecando em 140.
   Telas BARE (assinar/checkout/login) nao tem navbar mas o main delas SEMPRE teve
   64px de padding — a ultima linha devolve esses 64px pra pagina bare nao pular
   quando ha mensagem (MEDIDO em /assinar: identico com e sem flash, primeiro filho
   em y=140 nos dois casos). */
.flash-wrap{padding-top:var(--nav-h)}
.flash-wrap + main{padding-top:0}
body.is-player .flash-wrap,body.is-feed .flash-wrap,body.bare .flash-wrap{padding-top:0}
body.bare .flash-wrap + main{padding-top:var(--nav-h)}

.nav-in{display:flex;align-items:center;gap:10px;height:var(--nav-h);
  max-width:var(--shell);margin:0 auto;padding:0 12px}
@media(min-width:640px){.nav-in{padding:0 20px;gap:14px}}
@media(min-width:1024px){.nav-in{padding:0 32px}}

/* Busca ocupando da borda esquerda até onde os botões começam. */
.nav-search{position:relative;display:flex;align-items:center;flex:1;min-width:0}
.nav-search .ico{position:absolute;left:13px;color:var(--muted2);pointer-events:none;display:grid}
.nav-search input{
  width:100%;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.09);
  border-radius:999px;padding:10px 16px 10px 38px;font-size:13.5px;color:var(--txt);
  transition:background .2s,border-color .2s
}
.nav-search input::placeholder{color:var(--muted2)}
.nav-search input:focus{outline:none;background:rgba(255,255,255,.1);
  border-color:rgba(255,117,168,.45)}
.nav-search input::-webkit-search-cancel-button{filter:invert(.6)}

.nav-actions{display:flex;align-items:center;gap:6px;flex:none}

/* botões da busca-lupa: só aparecem no celular (ver @media max-width:767) */
.nav-search-toggle,.nav-search-close{display:none;background:transparent;border:0;color:var(--txt);cursor:pointer;padding:0}

/* Coroa: chama pra assinar. */
.crownbtn{
  width:38px;height:38px;border-radius:999px;display:grid;place-items:center;
  color:var(--premium);background:rgba(240,180,41,.13);
  border:1px solid rgba(240,180,41,.28);transition:.2s
}
.crownbtn:hover{background:rgba(240,180,41,.22);color:#ffd166}

/* ─────────────── dropdown (details, sem script) ─────────────── */
.drop{position:relative}
.drop > summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:4px;
  height:38px;padding:0 8px;border-radius:999px;color:var(--muted);transition:.2s
}
.drop > summary::-webkit-details-marker{display:none}
.drop > summary:hover{background:rgba(255,255,255,.07);color:var(--txt)}
.drop[open] > summary{background:rgba(255,255,255,.09);color:var(--txt)}
.drop .flag{border-radius:3px;display:block}

.drop-menu{
  position:absolute;top:calc(100% + 8px);right:0;z-index:70;min-width:198px;
  background:rgba(18,18,18,.97);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);
  border:1px solid var(--line2);border-radius:14px;padding:6px;
  box-shadow:0 18px 44px -16px rgba(0,0,0,.9)
}
.drop-menu a{
  display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:9px;
  font-size:13px;font-weight:500;color:var(--muted);transition:.15s;white-space:nowrap
}
.drop-menu a:hover{background:rgba(255,255,255,.06);color:var(--txt)}
.drop-menu a.on{color:var(--txt)}
.drop-menu a.on svg:last-child{margin-left:auto;color:var(--primary)}
.drop-menu a.hi{color:var(--primary)}
.drop-head{padding:9px 11px 11px;border-bottom:1px solid var(--line);margin-bottom:5px}
.drop-head b{display:block;font-size:13px}
.drop-head span{display:block;font-size:11px;color:var(--muted2);margin-top:2px}
.brand{display:flex;align-items:center;flex:none}
.brand img{height:34px;width:auto;object-fit:contain;filter:brightness(1.1) drop-shadow(0 0 8px rgba(255,117,168,.35))}
.brand .brand-txt{font-family:'Poppins',sans-serif;font-weight:800;font-size:19px;letter-spacing:-.03em}
.brand .brand-txt b{color:var(--primary)}
@media(min-width:640px){.brand img{height:44px}}

/* Links centralizados entre a logo e os ícones, como no site real. */
.nav-links{display:none;align-items:center;justify-content:center;gap:28px;flex:1}
@media(min-width:768px){.nav-links{display:flex}}
.nav-links a{font-size:14px;font-weight:500;color:var(--muted);transition:color .15s;white-space:nowrap}
.nav-links a:hover{color:var(--txt)}
.nav-links a.on{color:var(--txt);font-weight:600}
.nav-links a.admin{color:var(--primary);display:inline-flex;align-items:center;gap:5px}

.nav-right{margin-left:auto;display:flex;align-items:center;gap:6px}
.iconbtn{
  width:38px;height:38px;border-radius:999px;border:0;background:transparent;
  color:var(--muted);display:grid;place-items:center;cursor:pointer;transition:.15s
}
.iconbtn:hover{color:var(--txt);background:rgba(255,255,255,.06)}
.avatar{
  width:58px;height:58px;border-radius:999px;display:grid;place-items:center;
  background:rgba(255,117,168,.18);border:1px solid rgba(255,117,168,.35);
  color:var(--primary);font-weight:700;font-size:13px;overflow:hidden
}
.avatar img{width:100%;height:100%;object-fit:cover;border-radius:50%}

/* Seletor de idioma por bandeira. O ativo fica opaco; o outro apagado. */
.langsel{display:flex;gap:2px;background:var(--card);border:1px solid var(--line);
  border-radius:999px;padding:3px}
.langsel a{
  display:grid;place-items:center;width:30px;height:26px;border-radius:999px;
  font-size:15px;line-height:1;opacity:.4;transition:.15s
}
.langsel a:hover{opacity:.8}
.langsel a.on{opacity:1;background:var(--surface)}
.langsel .flag{filter:saturate(1.1)}

/* ─────────────── modais (login e paywall) ─────────────── */
/* Abrem por :target — o link é #login / #premium e não precisa de script.
   .is-open força a abertura quando o servidor precisa reexibir (erro de senha). */
.modal{
  position:fixed;inset:0;z-index:100;display:none;
  align-items:center;justify-content:center;padding:18px
}
.modal:target,.modal.is-open{display:flex}
.modal-veil{
  position:absolute;inset:0;background:rgba(0,0,0,.78);
  -webkit-backdrop-filter:blur(18px) saturate(1.15);backdrop-filter:blur(18px) saturate(1.15)
}
.modal-box{
  position:relative;z-index:1;width:100%;max-width:390px;
  background:var(--card);border:1px solid var(--line2);border-radius:20px;
  padding:28px 24px 22px;box-shadow:0 30px 70px -20px rgba(0,0,0,.9);
  max-height:calc(100dvh - 36px);overflow-y:auto
}
.modal-box.wide{max-width:440px}
.modal-box h2{font-family:'Poppins',sans-serif;font-size:20px;font-weight:800;letter-spacing:-.03em}
.modal-sub{font-size:12.5px;color:var(--muted);margin:5px 0 18px;line-height:1.5}
.modal-x{
  position:absolute;top:12px;right:12px;width:32px;height:32px;border-radius:999px;
  display:grid;place-items:center;color:var(--muted2);transition:.15s
}
.modal-x:hover{background:rgba(255,255,255,.07);color:var(--txt)}
.modal-crown{
  display:grid;place-items:center;width:48px;height:48px;border-radius:14px;
  background:rgba(240,180,41,.14);color:var(--premium);margin-bottom:12px
}
.modal-foot{font-size:11px;color:var(--muted);margin-top:14px;text-align:center;line-height:1.5}

/* ── modal de entrada ─────────────────────────────────────────────────────
   Escopado em .modal-auth: a .input e usada no admin e no perfil inteiros,
   entao nada aqui pode vazar pra fora do modal. */
/* 42px e centrada: a marca e a primeira coisa que responde "estou no site
   certo pra digitar meu e-mail?". Em 30px, encostada na esquerda, ela lia como
   detalhe de cabecalho. `margin auto` centra sem mexer no fluxo do resto. */
/* 52px e 26px de respiro embaixo: a marca e a primeira coisa que responde
   "e o site certo pra eu digitar meu e-mail?", e apertada contra o titulo ela
   lia como cabecalho de sistema. Com o espaco ela vira assinatura. */
.modal-logo{display:block;height:52px;width:auto;object-fit:contain;margin:2px auto 26px;
  filter:drop-shadow(0 3px 14px rgba(255,117,168,.42))}
.modal-logo-txt{display:block;font-family:'Poppins',sans-serif;font-size:26px;font-weight:800;
  letter-spacing:-.03em;margin:2px 0 26px;color:var(--txt);text-align:center}
.modal-logo-txt b{color:var(--primary);font-weight:800}
/* 16px NAO e capricho: abaixo disso o Safari do iPhone da zoom ao focar o campo
   e joga o modal (position:fixed) pra fora da tela, no passo mais importante. */
.modal-auth .input{font-size:16px}
.modal-auth .input:focus{outline:2px solid var(--primary);outline-offset:1px}
.modal-auth .input.err{border-color:#ff6b6b}
/* o :focus-visible global aplica border-radius:4px e quadrava o botao pilula */
.modal-auth .btn-block:focus-visible{border-radius:999px}
.modal-auth .btn[aria-busy="true"]{opacity:.65;pointer-events:none}
/* campo que o app-login.js revela: entra deslizando, em vez de simplesmente
   aparecer. So transform/opacity — nada que gere reflow. */
.modal-auth .field[data-fld]:not([hidden]){animation:fieldIn .22s var(--ease) both}
@keyframes fieldIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.modal-auth .field[data-fld]:not([hidden]){animation:none}}

/* Divisória com o "ou" no meio, separando e-mail do Google. */
.modal-or{display:flex;align-items:center;gap:12px;margin:18px 0;color:var(--muted2);font-size:11px}
.modal-or::before,.modal-or::after{content:"";flex:1;height:1px;background:var(--line2)}

/* Contorno, nao bloco branco. Um botao branco solido do lado de um botao rosa
   solido cria duas chamadas do mesmo peso e a pessoa para pra escolher — o
   caminho principal aqui e o e-mail. Assim ele fica disponivel sem competir. */
.btn-google{
  display:flex;align-items:center;justify-content:center;gap:9px;width:100%;
  padding:11px 18px;border-radius:999px;
  background:transparent;border:1px solid var(--line2);color:var(--muted);
  font-size:13px;font-weight:600;transition:.15s;
  /* sem isto o iOS aplica o delay de 300ms (duplo-toque) → "não responde ao toque" */
  touch-action:manipulation
}
.btn-google:hover{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.24);color:var(--txt)}
.btn-google svg{opacity:.95}
/* SÓ-GOOGLE: com o e-mail desligado o Google vira a ação principal — sólido,
   maior e logo abaixo do subtítulo, ocupando o lugar que era do formulário. */
.btn-google-hero{
  margin-top:6px;padding:14px 18px;font-size:14.5px;
  background:#fff;border-color:#fff;color:#1f1f24
}
.btn-google-hero:hover{background:#f1f1f4;border-color:#f1f1f4;color:#1f1f24}
.btn-google-hero svg{opacity:1}

/* CTA do grupo de WhatsApp — abaixo do login (modal de entrada + parede do vídeo).
   Verde da marca do WhatsApp; touch-action p/ não pegar o delay de 300ms no iOS. */
.wa-cta{
  display:flex;align-items:center;justify-content:center;gap:9px;width:100%;
  margin-top:12px;padding:11px 18px;border-radius:999px;
  background:#25d366;color:#fff;font-size:13px;font-weight:700;
  touch-action:manipulation;transition:background .15s
}
.wa-cta:hover{background:#1ebe5b;color:#fff}
.wa-cta svg{flex:none}

.modal-perks{list-style:none;display:flex;flex-direction:column;gap:7px;margin-top:16px}
.modal-perks li{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:var(--muted)}
.modal-perks li svg{flex:none;margin-top:2px;color:var(--primary)}

.planlist{display:flex;flex-direction:column;gap:8px}
.planrow{
  display:flex;align-items:center;gap:10px;padding:13px 15px;border-radius:13px;
  background:var(--card2);border:1px solid var(--line);transition:.15s
}
.planrow:hover{border-color:var(--line2);background:var(--surface)}
.planrow.best{border-color:rgba(255,117,168,.5);background:rgba(255,117,168,.06)}
.planrow b{display:block;font-size:14px}
.planrow span{display:block;font-size:11.5px;color:var(--muted2);margin-top:1px}
.planrow strong{font-family:'Poppins',sans-serif;font-size:16px;font-weight:800;white-space:nowrap}

/* ─────────────── busca ─────────────── */
.searchbar{position:relative;display:flex;align-items:center;width:100%}
.searchbar input{
  width:100%;background:var(--card);border:1px solid var(--line);border-radius:999px;
  padding:12px 46px 12px 42px;font-size:14px;color:var(--txt);transition:border-color .15s
}
.searchbar input::placeholder{color:var(--muted2)}
.searchbar input:focus{outline:none;border-color:rgba(255,117,168,.5)}
.searchbar .ico{position:absolute;left:15px;color:var(--muted2);pointer-events:none;display:grid}
.searchbar button{
  position:absolute;right:6px;background:var(--primary);border:0;border-radius:999px;
  color:#fff;padding:7px 15px;font-size:12.5px;font-weight:700;cursor:pointer
}

/* ─────────────── filtros ─────────────── */
/* Faixa de audio: grupo segmentado — pilula dentro de um trilho arredondado,
   a ativa em rosa. Sem contador, como no site. */
.seg{
  display:inline-flex;width:100%;padding:4px;border-radius:999px;
  background:rgba(28,28,28,.4);border:1px solid rgba(36,36,36,.4);
  backdrop-filter:blur(6px);overflow-x:auto;scrollbar-width:none
}
.seg::-webkit-scrollbar{display:none}
@media(min-width:640px){.seg{width:auto}}
.seg a{
  flex:1;white-space:nowrap;text-align:center;padding:8px 16px;border-radius:999px;
  font-size:12px;font-weight:600;color:var(--muted);transition:.2s
}
@media(min-width:640px){.seg a{flex:none;padding:8px 20px;font-size:13px}}
.seg a:hover{color:var(--txt)}
.seg a.on{background:var(--primary);color:#fff;box-shadow:0 2px 12px rgba(255,117,168,.35)}

/* Categorias: pilulas planas; a ativa ganha um leve preenchimento e borda. */
.chips{
  display:flex;gap:6px;justify-content:center;overflow-x:auto;scrollbar-width:none;
  padding-bottom:4px;margin:0 -16px;padding-left:16px;padding-right:16px
}
.chips::-webkit-scrollbar{display:none}
@media(min-width:640px){.chips{margin:0;padding-left:0;padding-right:0}}
.chip{
  flex:none;padding:6px 14px;border-radius:999px;font-size:11.5px;font-weight:500;
  letter-spacing:.01em;color:rgba(160,160,160,.8);border:1px solid transparent;
  white-space:nowrap;cursor:pointer;transition:.2s
}
.chip:hover{color:var(--txt);background:rgba(28,28,28,.4)}
.chip.on{background:rgba(255,255,255,.1);color:var(--txt);border-color:rgba(255,255,255,.2)}

/* ─────────────── secoes ─────────────── */
.section{margin-bottom:32px}
@media(min-width:1024px){.section{margin-bottom:48px}}
.section-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
.section-head h2{
  display:flex;align-items:center;gap:8px;
  font-size:14px;font-weight:700;letter-spacing:-.01em
}
@media(min-width:640px){.section-head h2{font-size:18px}}
@media(min-width:1024px){.section-head h2{font-size:20px}}
.section-head h2 .mark{color:var(--primary);display:inline-flex}
.section-head p{font-size:11.5px;color:var(--muted2);margin-top:3px}
.section-head a{
  display:inline-flex;align-items:center;gap:2px;
  font-size:12px;font-weight:500;color:var(--muted);white-space:nowrap;transition:.15s
}
.section-head a:hover{color:var(--txt)}

/* carrossel horizontal — scroll nativo com snap, sem JS */
.carousel{
  display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;
  scrollbar-width:none;padding-bottom:4px;
  scroll-padding-left:16px
}
.carousel::-webkit-scrollbar{display:none}
/* flex-basis (não width) manda no tamanho do item flex — assim o .mcard{width:100%}
   não estufa o card pra largura toda dentro do carrossel. */
.carousel > *{scroll-snap-align:start;flex:0 0 118px;max-width:118px}
@media(min-width:640px){.carousel > *{flex-basis:140px;max-width:140px}.carousel{gap:14px}}
@media(min-width:1024px){.carousel > *{flex-basis:184px;max-width:184px}}

/* 2 por linha no celular; 5 no PC (a pedido) */
.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
@media(min-width:640px){.grid{grid-template-columns:repeat(3,1fr);gap:16px}}
@media(min-width:1024px){.grid{grid-template-columns:repeat(6,minmax(0,1fr))}}

/* ─────────────── card de filme ─────────────── */
.mcard{display:block;position:relative;width:100%;min-width:0}
.mcard .thumb{
  position:relative;aspect-ratio:3/4;overflow:hidden;border-radius:var(--radius);
  background:var(--card);transition:transform .18s ease-out
}
.mcard .thumb img{width:100%;height:100%;object-fit:cover}
@media(hover:hover){.mcard:hover .thumb{transform:scale(1.04)}.mcard:hover .thumb img{filter:brightness(.9)}}
.mcard:active .thumb{transform:scale(.97)}
.mcard h3{
  font-size:11.5px;font-weight:600;line-height:1.25;margin-top:6px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis    /* 1 linha só, corta com … */
}
.mcard .badge{
  position:absolute;top:6px;right:6px;z-index:2;
  background:rgba(255,117,168,.92);color:#fff;font-size:8px;font-weight:800;
  letter-spacing:.06em;text-transform:uppercase;padding:2px 6px;border-radius:4px
}
.mcard .mcard-date{
  position:absolute;left:6px;bottom:6px;z-index:2;
  background:rgba(0,0,0,.72);color:#fff;font-size:9px;font-weight:700;
  letter-spacing:.02em;padding:3px 7px;border-radius:5px;white-space:nowrap;
  backdrop-filter:blur(2px)
}
.mcard .soon{
  position:absolute;inset:0;display:flex;align-items:flex-end;justify-content:center;padding-bottom:12px
}
/* "Em breve" precisa ser LIDO de relance no meio de uma grade de capas iguais:
   a pilula preta translucida sumia em capa escura. Com a cor da marca ela conta
   a historia sozinha — a cliente entende que aquilo ainda nao abre. */
.mcard .soon span{
  background:var(--primary);color:var(--accink,#2b0716);border-radius:999px;
  padding:4px 12px;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.04em;
  box-shadow:0 4px 14px -4px rgba(0,0,0,.7)
}
.mcard.dim .thumb img{filter:brightness(.6)}

/* Texto de apoio do carrossel (o "Em Breve" usa). Fica sob o subtitulo, com o
   icone alinhado a PRIMEIRA linha — em telas estreitas a frase quebra em duas e
   um icone centralizado ficaria boiando no meio. */
.sec-info{display:flex;align-items:flex-start;gap:6px;margin-top:6px;max-width:52ch;
  font-size:11.5px;line-height:1.45;color:var(--muted2)}
/* o partial de icone devolve <span class="msym"> (fonte Material), nao <svg> —
   mirar so em svg deixaria o icone sem cor e desalinhado */
.sec-info .msym,.sec-info svg{flex:0 0 auto;margin-top:1px;color:var(--primary)}

/* Drama "em breve": nao ha video, entao some tudo que so faz sentido tocando.
   A barra zerada ("0:00 / 0:00") e o que mais faz parecer defeito — e a cliente
   ja esta lendo que o drama esta sendo preparado. Curtir, comentar
   e reportar FICAM: sao justamente o que ela pode fazer enquanto espera. */
.vplayer.vp-soon .vp-progwrap,
.vplayer.vp-soon .vp-skip,
.vplayer.vp-soon .vp-playbtn,
.vplayer.vp-soon .vp-fs{display:none}
/* e a coluna nao se recolhe: sem video nao ha gesto que a traga de volta */
.vplayer.vp-soon .vp-side,
.vplayer.vp-soon .vp-info{opacity:1!important;visibility:visible!important;pointer-events:auto!important}
/* Top 10: numerao em italico atras da capa, que fica deslocada pra direita.
   O numero e absoluto e nao entra no fluxo — a altura da linha e a da capa. */
.mcard.ranked{padding-left:32px}
.mcard.ranked .bignum{
  position:absolute;left:0;bottom:0;z-index:0;
  font-family:'Poppins',sans-serif;font-weight:900;font-style:italic;
  font-size:80px;line-height:.8;letter-spacing:-.06em;
  color:var(--bg);-webkit-text-stroke:2px rgba(255,255,255,.22);
  user-select:none;pointer-events:none;white-space:nowrap
}
.mcard.ranked .bignum.two{font-size:64px}
.mcard.ranked .thumb{position:relative;z-index:1}
.mcard.ranked h3{margin-left:0}
/* Selo pequeno com a posicao, no canto da capa. */
.mcard .rank{
  position:absolute;top:6px;left:6px;z-index:3;
  width:20px;height:20px;border-radius:6px;background:rgba(255,117,168,.9);
  display:grid;place-items:center;
  font-size:10px;font-weight:800;line-height:1;color:#fff
}
/* barra de progresso do "continuar assistindo" */
.mcard .prog{position:absolute;left:0;right:0;bottom:0;height:3px;background:rgba(255,255,255,.18)}
.mcard .prog i{display:block;height:100%;background:var(--primary)}

/* ─────────────── banner do topo (estilo iDrama) ───────────────
   Carrossel de cards em RETRATO 3:4 (layout_banner2/3), radius 12dp, com os
   vizinhos espiando; fundo = a capa do card ativo borrada (iv_background,
   alpha .4); dots em LINHA (16/10dp) e legenda sp_14. Medidas do sistema real. */
.hero-wrap{position:relative;margin:4px 0 2px}
/* fundo desfocado ocupa a TELA toda na horizontal (full-bleed), nao so o container central */
.hero-bg{position:absolute;left:50%;width:100vw;margin-left:-50vw;top:calc(-1 * var(--nav-h) - 58px);z-index:0;pointer-events:none;
  height:calc(62% + var(--nav-h) + 58px);
  background-size:cover;background-position:center top;opacity:.4;
  filter:blur(22px) saturate(1.2);transform:translateZ(0);backface-visibility:hidden}
.hero-bg::after{content:"";position:absolute;inset:0;
  background:linear-gradient(to bottom,transparent 40%,var(--bg))}
/* proximity (não mandatory): o arrasto SEGUE o dedo livremente e só encaixa de
   leve quando solta perto de um card — tira a sensação de "segurar/lag". */
.hero-track{position:relative;z-index:1;display:flex;gap:12px;overflow-x:auto;
  scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;overscroll-behavior-x:contain;
  scrollbar-width:none;padding:4px 34px;scroll-padding:0 34px}
.hero-track::-webkit-scrollbar{display:none}
.hero-card{position:relative;flex:0 0 84%;max-width:430px;scroll-snap-align:center;
  aspect-ratio:3/4;border-radius:12px;overflow:hidden;background:var(--card);
  box-shadow:0 16px 38px -18px rgba(0,0,0,.8)}
.hero-card img{width:100%;height:100%;object-fit:cover}
.hero-card::after{content:"";position:absolute;inset:auto 0 0 0;height:32%;pointer-events:none;
  background:linear-gradient(to top,rgba(0,0,0,.55),transparent)}
@media(min-width:640px){.hero-card{flex-basis:58%;max-width:460px}}
@media(min-width:1024px){.hero-card{flex-basis:32%;max-width:392px}}
.hero-orb{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:2;
  width:58px;height:58px;border-radius:999px;display:grid;place-items:center;color:#fff;
  background:rgba(0,0,0,.3);border:2px solid rgba(255,255,255,.9);
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);transition:transform .2s var(--ease)}
.hero-orb:active{transform:translate(-50%,-50%) scale(.92)}
.hero-orb .msym{margin-left:3px}
.hero-caption{position:relative;z-index:1;text-align:center;font-size:14px;font-weight:600;color:#fff;
  padding:12px 20px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hero-dots{position:relative;z-index:1;display:flex;justify-content:center;gap:6px;padding:11px 0 2px}
.hero-dots i{width:10px;height:3px;border-radius:2px;background:rgba(255,255,255,.3);transition:.25s}
.hero-dots i.on{width:16px;background:var(--primary)}

/* ─────────────── tabs SPA: painéis instantâneos ─────────────── */
.tab-panel[hidden]{display:none}
.sub-tabs{display:flex;gap:20px;align-items:center;padding:2px 0 6px}
.sub-tab{background:transparent;border:0;color:var(--muted2);font-size:14px;font-weight:700;
  cursor:pointer;padding:4px 0;transition:color .2s}
.sub-tab.on{color:var(--premium)}
/* ornamento dourado dos dois lados da sub-tab ativa (estilo iDrama) */
.sub-tab.on::before,.sub-tab.on::after{content:"";display:inline-block;width:12px;height:20px;
  vertical-align:-5px;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='20' viewBox='0 0 12 20'%3E%3Cg fill='%23e9c06a'%3E%3Cpath d='M11 19C6 18 3 14 3 3' stroke='%23e9c06a' stroke-width='1.2' fill='none'/%3E%3Cellipse cx='6.5' cy='4.5' rx='3' ry='1.3' transform='rotate(-52 6.5 4.5)'/%3E%3Cellipse cx='4.6' cy='8.5' rx='3' ry='1.3' transform='rotate(-28 4.6 8.5)'/%3E%3Cellipse cx='4.6' cy='12.5' rx='3' ry='1.3' transform='rotate(-6 4.6 12.5)'/%3E%3Cellipse cx='6.6' cy='16' rx='2.5' ry='1.2' transform='rotate(20 6.6 16)'/%3E%3C/g%3E%3C/svg%3E") center/contain no-repeat}
.sub-tab.on::before{margin-right:7px}
.sub-tab.on::after{margin-left:7px;transform:scaleX(-1)}
/* grade de categorias (tab Categoria) — cards com banner de fundo animado.
   Flex (não grid) pro ÚLTIMO item esticar e preencher o resto da linha. */
.cat-grid{display:flex;flex-wrap:wrap;gap:12px;margin-top:18px}
.cat-tile{
  flex:0 0 calc((100% - 12px)/2);            /* mobile: 2 por linha */
  position:relative;overflow:hidden;isolation:isolate;
  display:flex;align-items:center;justify-content:center;text-align:center;
  min-height:68px;padding:12px;border-radius:14px;background-color:#1a1420;
  font-size:13px;font-weight:800;color:#fff;text-shadow:0 2px 8px rgba(0,0,0,.7);
  border:1px solid rgba(255,255,255,.1);
  transition:transform .18s var(--ease),box-shadow .18s}
@media(min-width:640px){.cat-tile{flex-basis:calc((100% - 24px)/3);min-height:96px}}   /* tablet: 3 */
@media(min-width:1024px){.cat-tile{flex-basis:calc((100% - 60px)/6);min-height:104px}} /* PC: 6 */
.cat-tile:last-child{flex-grow:1}            /* último preenche o restante da linha */
/* com capa de fundo (foto de um título da categoria): a capa PREENCHE o box, com
   um véu leve só pra o texto ler. Esconde o gradiente animado. */
.cat-tile.has-cover::before{display:none}
.cat-tile.has-cover{background-size:cover;background-position:center center}
/* LGBTQ+: personalização — texto arco-íris e anel colorido, pra identificar o público */
.cat-lgbt span{font-weight:900;font-style:italic;letter-spacing:.02em;
  background:linear-gradient(90deg,#ff5a5a,#ffb020,#ffe600,#5adf8a,#4aa8ff,#c07bff);
  -webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;
  filter:drop-shadow(0 1px 2px rgba(0,0,0,.7))}
.cat-lgbt{box-shadow:inset 0 0 0 2px rgba(255,255,255,.35),0 0 20px -4px rgba(180,100,255,.55)}
.cat-lgbt::after{content:"";position:absolute;left:0;right:0;bottom:0;height:4px;z-index:2;opacity:1;transform:none;
  background:linear-gradient(90deg,#e40303,#ff8c00,#ffed00,#008026,#004dff,#750787)}

/* banner de fundo: gradiente vibrante que se move devagar */
.cat-tile::before{content:"";position:absolute;inset:0;z-index:-2;
  background-size:180% 180%;animation:catShift 9s ease-in-out infinite}
/* brilho diagonal que atravessa no hover */
.cat-tile::after{content:"";position:absolute;inset:0;z-index:-1;
  background:linear-gradient(120deg,transparent 30%,rgba(255,255,255,.18) 50%,transparent 70%);
  transform:translateX(-130%);transition:transform .6s}
.cat-tile:hover::after{transform:translateX(130%)}
.cat-tile:hover{transform:translateY(-3px);box-shadow:0 14px 32px -12px rgba(0,0,0,.7)}
.cat-tile:active{transform:scale(.98)}
@keyframes catShift{0%,100%{background-position:0% 50%}50%{background-position:100% 50%}}
@media(prefers-reduced-motion:reduce){.cat-tile::before{animation:none}}
/* paleta — uma cor por categoria (cicla a cada 8) */
.cat-tile:nth-child(8n+1)::before{background-image:linear-gradient(135deg,#ff5f8f,#c9366b)}
.cat-tile:nth-child(8n+2)::before{background-image:linear-gradient(135deg,#7b6cff,#4b32c3)}
.cat-tile:nth-child(8n+3)::before{background-image:linear-gradient(135deg,#ff9a5a,#e5532b)}
.cat-tile:nth-child(8n+4)::before{background-image:linear-gradient(135deg,#39c6b0,#0f8a76)}
.cat-tile:nth-child(8n+5)::before{background-image:linear-gradient(135deg,#5aa9ff,#2b63e5)}
.cat-tile:nth-child(8n+6)::before{background-image:linear-gradient(135deg,#ff6ad5,#a5329b)}
.cat-tile:nth-child(8n+7)::before{background-image:linear-gradient(135deg,#ffc24b,#e59a1f)}
.cat-tile:nth-child(8n+8)::before{background-image:linear-gradient(135deg,#8ed14b,#3f9b2f)}

/* ─────────────── PC / tablet: sai da coluna mobile e usa a largura ───────────────
   No celular o app é tela cheia com a barra inferior (tabbar). Em telas maiores
   ele deixa de ser a coluna estreita de 500px: o conteúdo passa a ocupar a largura
   (contido em --shell pra não espalhar em telas muito largas), o header volta
   completo (idioma + conta), os grids abrem em várias colunas e a barra inferior
   some — no desktop a navegação fica no header. A página do player (is-player)
   é a exceção: vídeo vertical continua numa coluna central (regra própria). */
@media(min-width:768px){
  body.app-shell main{max-width:var(--shell);margin-left:auto;margin-right:auto}
}

/* ─────────────── ranking (aba Trending), estilo iDrama ─────────────── */
.rank-list{display:flex;flex-direction:column;gap:10px}
.rank-item{display:flex;align-items:center;gap:12px;padding:12px;border-radius:12px;
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.05);transition:.15s}
.rank-item:hover{background:rgba(255,255,255,.08)}
.rank-item:active{transform:scale(.99)}
.rank-thumb{position:relative;flex:none;width:51px;height:68px;border-radius:4px;overflow:hidden;background:var(--card)}
.rank-thumb img{width:100%;height:100%;object-fit:cover}
.rank-num{position:absolute;top:0;left:0;min-width:20px;height:20px;padding:0 4px;line-height:1;
  display:grid;place-items:center;font-size:12px;font-weight:800;color:#fff;
  background:rgba(0,0,0,.6);border-radius:4px 0 6px 0}
.rank-num.r1{background:linear-gradient(135deg,#ff5b5b,#e5352b)}
.rank-num.r2{background:linear-gradient(135deg,#ffa63e,#f97316)}
.rank-num.r3{background:linear-gradient(135deg,#ffd166,#f0b429);color:#3a2600}
.rank-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}
.rank-info b{font-size:14px;font-weight:600;line-height:1.25;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.rank-info em{font-style:normal;font-size:12px;color:var(--muted2);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rank-heat{flex:none;display:inline-flex;align-items:center;gap:3px;font-size:13px;font-weight:700;color:#ff6a3d}
.rank-heat img{width:15px;height:15px;object-fit:contain}

/* ─────────────── arrastar-para-rolar nos sliders (PC) ─────────────── */
@media(hover:hover){
  .carousel,.hero-track,.chips,.ctabs,.seg{cursor:grab}
  .carousel.dragging,.hero-track.dragging,.chips.dragging,.ctabs.dragging,.seg.dragging{cursor:grabbing}
}
.dragging{user-select:none}
/* durante o arrasto, solta o scroll-snap (senão ele "gruda" e trava o deslize) */
.carousel.dragging,.hero-track.dragging,.chips.dragging,.ctabs.dragging,.seg.dragging{scroll-snap-type:none}
/* mata o "arrastar imagem/link" nativo do navegador nos sliders */
.carousel img,.hero-track img,.carousel a,.hero-track a,.chips a,.seg a{-webkit-user-drag:none;user-drag:none}

/* ═══════════════════════════════════════════════════════════════════
   PLAYER estilo iDrama (vídeo vertical em tela cheia + UI sobreposta)
   ═══════════════════════════════════════════════════════════════════ */
body.is-player{padding-bottom:0;background:#000}
body.is-player .nav,body.is-player .footer,body.is-player .tabbar{display:none}
body.is-player main{padding-top:0;max-width:500px;margin:0 auto}
.vplayer{position:relative;height:100dvh;background:#000;overflow:hidden}
.vp-poster,#video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:#000}
.vp-poster{filter:brightness(.92);z-index:0}
#video{z-index:1}
/* Depois que o vídeo começou a rodar (app-vplayer marca vp-started no 1º progresso
   do tempo), o pôster some de vez: durante o playback ele só servia pra VAZAR por
   trás quando o vp-loading escurece o vídeo pra 35% — o "capa + carregando ao mesmo
   tempo do vídeo". Antes de começar, ele continua aparecendo normal. */
.vplayer.vp-started .vp-poster{opacity:0;visibility:hidden}
/* fallback HEVC (h265web.js): o canvas WebGL ocupa o mesmo lugar do <video> */
.vp-gl{position:absolute;inset:0;z-index:1;background:#000}
.vp-gl canvas{width:100%!important;height:100%!important;display:block;object-fit:contain;margin:0 auto}
/* tela cheia: o alvo (quadro no PC, player no mobile) preenche a viewport */
.vp-frame:fullscreen,.vplayer:fullscreen{width:100vw;height:100vh;max-width:none;border-radius:0;aspect-ratio:auto;background:#000}
.vp-frame:-webkit-full-screen,.vplayer:-webkit-full-screen{width:100vw;height:100vh;border-radius:0}
/* tela cheia do PALCO (alvo novo do botão): preenche a tela, controles próprios em cima */
.vp-stage:fullscreen{width:100vw;height:100vh;max-width:none;max-height:none;aspect-ratio:auto;border-radius:0;background:#000}
.vp-stage:-webkit-full-screen{width:100vw;height:100vh;max-width:none;aspect-ratio:auto;border-radius:0;background:#000}
.vp-stage:fullscreen #video,.vp-stage:-webkit-full-screen #video{object-fit:contain}
/* quem tem a forma de "aparelho" e o .vp-stage (no PC o cartao 9:16, abaixo de 1024
   os 74svh do palco): em tela cheia ele solta e ocupa tudo. Duas regras, nunca uma
   lista so — navegador que nao conhece :-webkit-full-screen descartaria as duas. */
.vplayer:fullscreen .vp-stage{width:100%;height:100%;max-height:none;aspect-ratio:auto;border-radius:0;box-shadow:none}
.vplayer:-webkit-full-screen .vp-stage{width:100%;height:100%;max-height:none;aspect-ratio:auto;border-radius:0;box-shadow:none}
/* COVER, nao contain: a referencia que o dono apontou (amodramas.app) usa cover e
   e por isso que la nao ha tarja preta. Contain cabia a imagem inteira e sobrava
   barra; cover preenche e corta ~10% da largura, com o assunto no centro. */
#video{object-fit:cover;background:#000;z-index:1}
/* vídeo HORIZONTAL (detectado no app-vplayer.js pelas dimensões reais): cover
   cortaria as laterais — contain mostra o quadro inteiro, com tarja preta do
   próprio fundo do <video>. O player mantém a forma; só o vídeo se adapta. */
.vplayer.vp-landscape #video{object-fit:contain}
.vplayer.vp-landscape .vp-poster{object-fit:contain}

.vp-top{position:absolute;top:0;left:0;right:0;z-index:20;display:flex;align-items:center;gap:12px;
  padding:14px 14px 30px;color:#fff;background:linear-gradient(to bottom,rgba(0,0,0,.55),transparent);
  /* MEDIDO (320x568): a faixa tem 320x68 e recebia toque, mas so um filho e botao —
     elementFromPoint no meio dela devolvia div.vp-top e o toque MORRIA. Sao 68px de
     altura em toda a largura, 12% da tela, onde play/pause nao respondia.
     `>a,>button` e NAO `>*`: o <span class="vp-ep"> tem flex:1 e mede 222x24 no
     catalogo ES — com `>*` ele voltaria a ser um bloqueador morto no meio da barra.
     Consequencia conhecida e desejada: a faixa passa a valer play/pause (e arraste
     de busca), igual ao resto do video. */
  pointer-events:none}
.vp-top>a,.vp-top>button{pointer-events:auto}
/* [C3] O `auto` do filho vence o `none` que o .vp-idle herda, e `visibility` tem
   transicao de .28s (linha ~576): sobravam ~300ms com o topo INVISIVEL e CLICAVEL.
   MEDIDO a +150ms do vp-idle: o toque cego no canto do voltar SAIA DO EPISODIO
   (/serie/... -> /). Aqui o ocioso volta a mandar; com a parede de pe a saida
   continua viva (a excecao abaixo acompanha a linha ~1862, que ja existe).
   MEDIDO depois: a +150ms elementFromPoint(26,26) devolve BUTTON.vp-tap e fica no
   episodio; com is-walled devolve o proprio A.vp-back. */
.vplayer.vp-idle .vp-top>a,.vplayer.vp-idle .vp-top>button{pointer-events:none}
.vplayer.is-walled.vp-idle .vp-top>a,.vplayer.is-walled.vp-idle .vp-top>button{pointer-events:auto}
/* Alvo de 44x44 SEM mexer no icone: com place-items:center o glifo fica no centro da
   caixa, entao crescer 20px e recuar 10px devolve o centro ao mesmo pixel. MEDIDO:
   caixa 14,14 24x24 -> 4,4 44x44 e o icone continua em 14,14 24x24; .vp-ep continua
   em x=50 e a .vp-top continua com 68px. Depois do patch os 4 cantos devolvem
   A.vp-back em 320, 390 e 1280. E a UNICA saida com a parede de pe. */
.vp-back{color:#fff;display:grid;place-items:center;width:44px;height:44px;margin:-10px}
.vp-ep{font-size:16px;font-weight:700;flex:none;margin-left:auto}
/* .vp-more: o "…" saiu do movie.php junto com o #sheet-syn. A regra fica como estava,
   sem uso, pra nao mexer em quem eventualmente reviver o botao. */
.vp-more{background:transparent;border:0;color:#fff;font-size:22px;cursor:pointer;line-height:1}

/* auto-ocultar a interface: some 3s depois da última interação, volta ao toque/movimento.
   O grupo CENTRAL (-5s · play/pause · +5s) entrou nesta MESMA lista: um mecanismo
   só pros três. Antes o play central seguia .playing e sumia no instante do play,
   enquanto os skips só sumiam no ocioso — MEDIDO: 1300ms com os dois skips em
   volta de um buraco no meio da tela, e a UI voltando ao toque sem o botão do meio.
   Única exceção, e é a convenção de todo player: PAUSADO o botão central fica fixo
   mesmo com a interface recolhida — é ele que avisa que o vídeo parou. */
.vp-top,.vp-side,.vp-info,.vp-bottom,.vp-progwrap,
.vp-playbtn,.vp-skip{transition:opacity .28s ease,visibility .28s ease}
.vplayer.vp-idle .vp-top,.vplayer.vp-idle .vp-side,.vplayer.vp-idle .vp-info,
.vplayer.vp-idle .vp-bottom,.vplayer.vp-idle .vp-progwrap,
.vplayer.vp-idle .vp-playbtn,.vplayer.vp-idle .vp-skip{opacity:0;visibility:hidden;pointer-events:none}
.vplayer.vp-idle:not(.playing) .vp-playbtn{opacity:1;visibility:visible}

/* Troca de episodio sem "piscar" a interface. A classe nasce assim que o swipe
   vertical e reconhecido e permanece ate o proximo toque simples do usuario. O
   !important vence as excecoes mobile/desktop e o estado pausado do play central. */
.vplayer.vp-ep-switching .vp-top,
.vplayer.vp-ep-switching .vp-side,
.vplayer.vp-ep-switching .vp-info,
.vplayer.vp-ep-switching .vp-bottom,
.vplayer.vp-ep-switching .vp-progwrap,
.vplayer.vp-ep-switching .vp-playbtn,
.vplayer.vp-ep-switching .vp-skip,
.vplayer.vp-ep-switching .vp-mute,
.vplayer.vp-ep-switching .vp-vol,
.vplayer.vp-ep-switching .vp-spin,
.vplayer.vp-ep-switching .prism-controlbar,
.vplayer.vp-ep-switching .prism-big-play-btn,
.vplayer.vp-ep-switching .prism-animation,
.vplayer.vp-ep-switching .prism-loading{
  opacity:0!important;visibility:hidden!important;pointer-events:none!important;transition:none!important
}
.vplayer.vp-ep-switching .vp-side::before{opacity:0!important}
/* O X do paywall e uma saida, nao um controle do video. Se a parede abrir no
   instante de uma troca, ele precisa vencer o estado de transicao limpa. */
@media(max-width:1023px){
  .vplayer.is-walled.vp-ep-switching .vp-top{
    opacity:1!important;visibility:visible!important;pointer-events:auto!important
  }
  @supports selector(.vplayer:has(.vp-wall:not([hidden]))){
    .vplayer.vp-ep-switching:has(.vp-wall:not([hidden])) .vp-top{
      opacity:1!important;visibility:visible!important;pointer-events:auto!important
    }
  }
}

.vp-tap{position:absolute;inset:0;z-index:5;border:0;background:transparent;cursor:pointer;touch-action:none}
.vp-playbtn{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:6;
  width:72px;height:72px;border-radius:999px;display:grid;place-items:center;color:#fff;
  background:rgba(0,0,0,.34);pointer-events:none}
/* o glifo do meio conta o estado: ▶ parado, ❚❚ tocando. Os dois vêm no HTML,
   empilhados na MESMA célula do grid; o CSS escolhe. O pointer-events:none acima
   continua ali de propósito — quem recebe o toque é o .vp-tap, o play/pause não muda. */
.vp-playbtn .msym{grid-area:1/1}
.vplayer:not(.playing) .vp-playbtn .vp-gl-pause,
.vplayer.playing .vp-playbtn .vp-gl-play{display:none}

.vp-side{position:absolute;right:12px;bottom:118px;z-index:12;display:flex;flex-direction:column;gap:12px;align-items:center;
  /* moldura nao recebe toque, botao recebe. Abaixo de 1024 a coluna vive no PAINEL
     (nao mais sobre o video), mas em TELA CHEIA ela volta a ser sobreposicao — e la
     o vao entre os icones engolia o toque. O <form class="vp-actf"> tambem fica
     none: quem recebe e o .vp-act de dentro. */
  pointer-events:none}
.vp-side .vp-act{pointer-events:auto}
.vp-actf{margin:0}
.vp-act{display:flex;flex-direction:column;align-items:center;gap:3px;border:0;background:transparent;color:#fff;cursor:pointer;padding:0;
  min-width:44px}
/* Padrao medido no player de referencia do proprio dono (amodramas.app): circulo
   translucido de 40px com desfoque, icone de 20px dentro, 12px da borda, sem
   rotulo de texto. O rotulo ja existia como aria-label no markup, entao esconder
   o <span> nao custa acessibilidade. */
.vp-act-ic{position:relative;width:40px;height:40px;display:grid;place-items:center;
  border-radius:999px;background:rgba(8,8,8,.34)}
/* DESFOQUE SÓ NO PC — e o motivo é custo, não estética.
   backdrop-filter sobre VÍDEO TOCANDO é o efeito mais caro que existe numa página:
   o compositor precisa reamostrar a textura do vídeo atrás do elemento A CADA
   QUADRO. São 8 .vp-act-ic na coluna + .vp-cat + o painel de volume = 10 passagens
   de desfoque por quadro, a 24-30fps, na GPU de um celular que já está decodificando
   vídeo. É exatamente o tipo de coisa que faz o vídeo engasgar no começo, quando
   decodificador e compositor disputam a mesma GPU.
   No PC o desfoque continua: ali a GPU sobra e o efeito é o desenho da referência.
   No celular fica o círculo translúcido um pouco mais escuro — sobre vídeo em
   movimento a diferença é imperceptível, e o contraste do ícone até melhora. */
@media (hover:hover) and (pointer:fine){
  .vp-act-ic{-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}
}
@media not all and (pointer:fine){
  .vp-act-ic{background:rgba(8,8,8,.52)}
}
.vp-act-ic img{width:22px;height:22px;object-fit:contain}
.vp-act-ic svg{width:20px;height:20px}
.vp-act-ic svg{filter:drop-shadow(0 1px 3px rgba(0,0,0,.55))}
.vp-speedval{font-size:15px;font-weight:800;color:var(--premium);text-shadow:0 1px 3px rgba(0,0,0,.55)}
.vp-act-n{font-size:11px;font-weight:600;text-shadow:0 1px 3px rgba(0,0,0,.6)}
/* Sobre o video o rotulo sai: era ele que "poluia" a coluna. Continua no DOM pra
   contagem (salvar/curtir) e volta inteiro no trilho do PC, onde ha espaco. */
@media(max-width:1023px){
  .vp-side .vp-act-n{display:none}
  /* .vp-like entra na lista porque a versao DESLOGADA do coracao e um <a>, sem
     .fav-btn nem [data-fav-btn]: sem isso a visitante era a unica a nao ver a
     contagem, justamente quem a prova social precisa convencer. */
  .vp-side .vp-act[data-fav-btn] .vp-act-n,
  .vp-side .fav-btn .vp-act-n,
  .vp-side .vp-like .vp-act-n{display:block;font-size:10px}
}
/* O .fav-btn.is-fav pinta fundo e borda — desenho do botao-pilula da pagina de
   detalhe. Na coluna do player o fundo e o circulo do .vp-act-ic, entao aquilo
   virava um retangulo rosa fraco atras do icone redondo. */
.vp-side .fav-btn.is-fav{background:transparent;border-color:transparent}
.vp-act:active .vp-act-ic{transform:scale(.86)}
.vp-burst{position:absolute;left:50%;top:50%;width:82px;height:82px;transform:translate(-50%,-50%);pointer-events:none;opacity:0}

.vp-info{position:absolute;left:14px;right:76px;bottom:62px;z-index:11;display:flex;flex-direction:column;gap:8px;align-items:flex-start;
  /* MEDIDO: os 4 cantos do .vp-cat (89x28, raio 999px) caiam em div.vp-info — nada
     acontecia. Aqui `>*` e o certo (ao contrario da .vp-top): o filho nao-botao e o
     <p class="vp-syn-full">, que precisa de pointer-events pra rolar/selecionar. */
  pointer-events:none}
.vp-info>*{pointer-events:auto}
.vp-title{background:transparent;border:0;color:#fff;font-size:17px;font-weight:800;text-align:left;
  display:flex;align-items:center;gap:4px;cursor:pointer;text-shadow:0 2px 6px rgba(0,0,0,.7)}
.vp-cat{background:rgba(255,255,255,.16);border:0;color:#fff;font-size:12px;font-weight:600;
  padding:5px 11px;border-radius:999px;display:inline-flex;align-items:center;gap:3px;cursor:pointer}
/* mesmo trato do .vp-act-ic: desfoque só onde a GPU sobra (ver comentário lá) */
@media (hover:hover) and (pointer:fine){
  .vp-cat{-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}
}
@media not all and (pointer:fine){
  .vp-cat{background:rgba(255,255,255,.22)}
}
.vp-syn{background:transparent;border:0;color:rgba(255,255,255,.82);font-size:13px;text-align:left;
  line-height:1.4;cursor:pointer;text-shadow:0 1px 4px rgba(0,0,0,.7)}
.vp-syn b{color:#fff}

.vp-progwrap{position:absolute;left:12px;right:12px;bottom:44px;z-index:13;display:flex;align-items:center;gap:9px}
.vp-time{font-size:11px;font-weight:600;color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.7);min-width:36px;flex:none;
  font-variant-numeric:tabular-nums}
.vp-dur{text-align:right}
.vp-prog{position:relative;flex:1;height:24px;display:flex;align-items:center;cursor:pointer;touch-action:none}
/* trilha interativa: clique ou arraste para voltar/avançar */
.vp-prog::before{content:"";position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);
  height:6px;border-radius:999px;background:rgba(255,255,255,.25)}
.vp-prog i{position:relative;display:block;height:6px;width:0;border-radius:999px;background:var(--primary);z-index:1}
.vp-prog i::after{content:"";position:absolute;right:0;top:50%;transform:translate(50%,-50%);
  width:12px;height:12px;border-radius:50%;background:#fff;box-shadow:0 1px 5px rgba(0,0,0,.6);
  opacity:0;transition:opacity .15s}
.vplayer:not(.vp-idle) .vp-prog i::after,.vp-prog:active i::after{opacity:1}

/* ── VOLUME: botão na barra + dropdown vertical (de baixo pra cima) ──────────
   Toque/arraste na trilha ajusta (pointer events = mouse + toque). Abre no clique
   (celular) e no hover (PC). O painel sobe DENTRO do palco, então nunca é cortado. */
.vp-vol{position:relative;flex:none;display:flex;align-items:center;justify-content:center;order:-1}
.vp-vol-btn{width:34px;height:34px;display:flex;align-items:center;justify-content:center;
  background:transparent;border:0;color:#fff;cursor:pointer;padding:0;
  text-shadow:0 1px 3px rgba(0,0,0,.7);transition:transform .12s}
.vp-vol-btn:active{transform:scale(.9)}
.vp-vol-btn .msym{font-size:22px}
.vp-vol-panel{position:absolute;bottom:calc(100% + 10px);left:-3px;right:auto;z-index:30;
  display:flex;flex-direction:column;align-items:center;gap:10px;padding:13px 11px 12px;
  background:rgba(18,18,24,.94);border:1px solid rgba(255,255,255,.14);border-radius:16px;
  /* backdrop-filter:blur(10px) REMOVIDO — era o mais caro dos três e o único
     100% invisível: o fundo acima já está em 94% de opacidade, então não sobra
     praticamente nada do vídeo pra desfocar. Pior: ele ficava ativo justamente
     enquanto o dedo arrasta o volume, competindo com o decodificador pela GPU no
     exato momento em que a resposta ao toque precisa ser fluida. Nada muda na
     aparência; some só o custo. */
  box-shadow:0 10px 30px rgba(0,0,0,.5);
  opacity:0;visibility:hidden;transform:translateY(8px) scale(.96);transform-origin:bottom left;
  transition:opacity .16s ease,transform .16s ease,visibility .16s}
.vp-vol.open .vp-vol-panel{opacity:1;visibility:visible;transform:none}
@media (hover:hover) and (pointer:fine){ .vp-vol:hover .vp-vol-panel{opacity:1;visibility:visible;transform:none} }
.vp-vol-pct{font-size:11px;font-weight:700;color:#fff;min-width:34px;text-align:center;
  font-variant-numeric:tabular-nums;letter-spacing:.02em}
/* ROLAGEM DA PÁGINA AO ARRASTAR O VOLUME — a correção é esta linha.
   O touch-action:none da trilha (abaixo) sempre existiu, mas a trilha tem 6px de
   LARGURA e o dedo tem ~45px: o toque caía nos 11px de padding do .vp-vol-panel,
   que NÃO declarava touch-action. Sem a declaração o navegador decide sozinho, vê
   um arraste vertical e ROLA A PÁGINA — e ao rolar dispara pointercancel, então o
   arraste do volume morria no meio. O preventDefault() do pointermove não salva:
   quando ele roda o navegador já se comprometeu com a rolagem.
   Vale no wrap inteiro pra cobrir botão + painel + trilha num lugar só. */
.vp-vol,.vp-vol-panel{touch-action:none}
.vp-vol-track{position:relative;width:6px;height:110px;border-radius:999px;
  background:rgba(255,255,255,.24);cursor:pointer;touch-action:none;outline:none}
/* Área de toque de 38x130 sem mexer no desenho de 6x110: o ::before é invisível
   (sem fundo) e o acerto de um pseudo-elemento conta como acerto do PAI, então o
   pointerdown continua caindo no .vp-vol-track e o fromY() segue medindo pelo
   getBoundingClientRect da trilha VISUAL — o cálculo do % não muda. O apply() já
   trava em 0..1, então encostar acima/abaixo da trilha satura em 100%/0% em vez
   de escapar da faixa. Antes disso o alvo real era menor que o próprio knob (15px). */
.vp-vol-track::before{content:"";position:absolute;left:-16px;right:-16px;top:-10px;bottom:-10px}
.vp-vol-track:focus-visible{box-shadow:0 0 0 2px rgba(255,255,255,.5)}
.vp-vol-fill{position:absolute;left:0;right:0;bottom:0;height:100%;border-radius:999px;
  background:var(--primary,#ff2e88)}
.vp-vol-knob{position:absolute;left:50%;bottom:100%;width:15px;height:15px;border-radius:50%;
  background:#fff;box-shadow:0 1px 6px rgba(0,0,0,.6);transform:translate(-50%,50%);transition:bottom .02s linear}
/* mudo: trilha e ícone ficam apagados */
.vp-vol.is-muted .vp-vol-fill{background:rgba(255,255,255,.4)}
/* dica de tempo enquanto arrasta o dedo no vídeo */
.vp-seekhint{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:16;
  background:rgba(0,0,0,.74);color:#fff;font-size:16px;font-weight:700;padding:10px 16px;border-radius:12px;
  font-variant-numeric:tabular-nums;pointer-events:none;white-space:nowrap}
.vp-seekhint[hidden]{display:none}
/* som: quando o autoplay entra mudo, botao central pulsante rosa — visivel mas discreto */
.vp-mute{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:14;
  display:inline-flex;align-items:center;gap:7px;border:0;cursor:pointer;white-space:nowrap;
  background:var(--primary);color:#fff;font-size:13px;font-weight:700;padding:11px 18px;border-radius:999px;
  box-shadow:0 4px 18px rgba(255,117,168,.55);animation:vp-mute-pulse 1.7s ease-in-out infinite}
.vp-mute .msym{font-size:20px}
.vp-mute[hidden]{display:none}
@keyframes vp-mute-pulse{
  0%,100%{box-shadow:0 4px 18px rgba(255,117,168,.45);transform:translate(-50%,-50%) scale(1)}
  50%    {box-shadow:0 7px 28px rgba(255,117,168,.85);transform:translate(-50%,-50%) scale(1.05)}}

/* voltar/avançar 5s — nas laterais do centro. A transição e o sumiço no ocioso
   moravam aqui; foram pra regra do grupo central, que é quem manda nos três
   botões do meio agora. 54x54 medidos em 320, 360, 390 e 414. */
/* [C2] REGRA FUNDIDA: 54->48 (hierarquia do grupo central, FRENTE 1) + z-index 13 e
   ::before (toques mortos, FRENTE 3). As duas frentes reescreviam ESTA regra com
   conteudos incompativeis; qualquer ordem apagava metade em silencio.
   z-index 13: acima do .vp-side (12) e do .vp-info (11), abaixo do .vp-mute (14), da
   parede (15) e do topo (20). MEDIDO a 320: sem ele o canto TR do +5s devolvia o
   <img> do botao SALVAR — errar a mira abria o #login e tirava a pessoa do video.
   48px continua acima dos 44 minimos de toque. */
.vp-skip{position:absolute;top:50%;width:48px;height:48px;border:0;cursor:pointer;border-radius:999px;
  display:grid;place-items:center;line-height:1;color:#fff;
  background:rgba(0,0,0,.34);z-index:13}
/* Os 4 cantos do quadrado caiam fora do raio 999px e devolviam o .vp-tap: errar a
   quina PAUSAVA em vez de pular (625,8px² = 21,5% da caixa). Este retangulo
   transparente ocupa a MESMA caixa que ja existe — nao cresce um pixel e nao come a
   folga pro botao central. MEDIDO depois do patch: os 4 cantos de -5s e +5s devolvem
   BUTTON.vp-skip em 320 e 390. */
.vp-skip::before{content:"";position:absolute;inset:0}
.vp-skip-back{left:calc(50% - 100px);transform:translateY(-50%)}
.vp-skip-fwd{right:calc(50% - 100px);transform:translateY(-50%)}
/* tela pequena: a 320px o circulo central ocupava 22,5% da largura. So ele encolhe —
   o .vp-skip FICA em 48px de proposito: a pilula "Toque para ativar o som" tem
   233x45 no centro exato e com 44px o botao inteiro cairia dentro dela (o skip e
   z13, a pilula z14). O glifo acompanha o circulo — e o `!important` NAO e enfeite: o
   tamanho do glifo vem de `style="font-size:46px"` INLINE (partials/icon.php:65) e
   estilo inline vence qualquer regra sem !important. MEDIDO a 320 com o patch:
   circulo 64 e glifo 40; skip 48 e glifo 22 (razao 1,33x, a mesma de hoje). */
@media(max-width:359px){
  .vp-playbtn{width:64px;height:64px}
  .vp-playbtn .msym{font-size:40px!important}
}

/* barra de controles (TV/velocidade/qualidade): no TOPO, centralizada */
.vp-bottom{position:absolute;left:0;right:0;top:0;z-index:12;display:flex;align-items:center;justify-content:center;gap:24px;
  padding:calc(12px + env(safe-area-inset-top)) 60px 12px;color:rgba(255,255,255,.9);font-size:12.5px;font-weight:600;
  background:linear-gradient(to bottom,rgba(0,0,0,.55),transparent)}
.vp-b-item{display:inline-flex;align-items:center;gap:4px;background:transparent;border:0;color:inherit;cursor:pointer}
.vp-speed{color:var(--premium)}

.vp-locked,.vp-wall{position:absolute;inset:0;z-index:15;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:12px;padding:24px;text-align:center;background:linear-gradient(to top,rgba(0,0,0,.95),rgba(0,0,0,.75))}
.vp-wall[hidden]{display:none}
.vp-locked h3,.vp-wall h3{font-family:'Poppins',sans-serif;font-size:18px}
.vp-locked p,.vp-wall p{font-size:13px;color:var(--muted);max-width:280px}

/* ── PAREDE COM OS PLANOS DENTRO (PC e celular) ──────────────────────────────
   O episodio pago passa a mostrar a tabela de precos NO LUGAR do video, dentro do
   mesmo palco — o paywall vira o "video" daquele slide. O swipe entre episodios
   continua valendo por cima dela (o .vp-wall nao entra na lista IGN do
   app-episodes.js), que e o comportamento pedido: deslizar passa de um episodio
   pago pro proximo, e para no primeiro gratis.

   O formulario e o caminho principal em qualquer largura: a cliente ve os precos
   direto no video, sem cair numa tela intermediaria. O link continua no HTML como
   fallback sem CSS, mas fica oculto no PC e no celular. */
.wall-plans{display:block;width:100%;max-width:340px}
.wall-golink{display:none}

@media(max-width:1023px){
  .vp-wall:not([hidden]){display:flex}
  /* justify-content deixa de ser center: com a tabela inteira dentro, centralizar
     corta o primeiro cartao em tela baixa. Alinhado ao topo, rola. */
  .vp-wall{justify-content:flex-start;gap:10px;padding:16px 14px calc(16px + env(safe-area-inset-bottom));
    overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}
  .vp-wall h3{font-size:16px;margin-top:2px}
  .wall-plans{display:block;width:100%;max-width:340px}
  .wall-golink{display:none}
  /* cartoes mais baixos que na /assinar: aqui eles dividem a altura do palco com
     titulo, botao e beneficios, em vez de terem a pagina inteira pra si. */
  .wall-plans .vipx-plans{gap:8px}
  .wall-plans .vipx-plan{padding:10px 12px}
  .wall-plans .vipx-plan-price{font-size:20px}
  .wall-plans .wall-buy{margin-top:10px}
  /* os cinco beneficios comuns fecham a parede, menores — quem ja decidiu clicou
     no botao acima; eles servem a quem rolou ate o fim sem clicar. */
  .wall-plans .vipx-inc{margin-top:12px}
  .wall-plans .vipx-inc-l{font-size:12px}
}

/* sheet de sinopse/episódios */
.sheet-box.sheet-tall{max-height:88dvh}
.syn-head{display:flex;gap:12px;align-items:center;margin-bottom:14px}
.syn-cover{width:56px;height:75px;border-radius:8px;object-fit:cover;flex:none}
.syn-meta b{display:block;font-size:15px;font-weight:700;line-height:1.2}
.syn-meta span{display:block;font-size:12px;color:var(--muted2);margin-top:4px}
.syn-tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.syn-tag{font-size:12px;font-weight:600;color:var(--muted);background:var(--card2);border:1px solid var(--line);padding:5px 11px;border-radius:999px}
.syn-text{font-size:13.5px;color:var(--muted);line-height:1.6}
.syn-more{font-size:15px;font-weight:800;margin:18px 0 12px}
/* Grade de episódios estilo ReelShort: tiles escuros, cadeado nos premium,
   ativo destacado com barrinhas tocando, e faixas (0-49, 50-99…) em série longa. */
.ep-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:18px 0 12px}
.ep-head .syn-more{margin:0}
.ep-all{font-size:12.5px;color:var(--muted);text-decoration:none;font-weight:600;white-space:nowrap}
.ep-all:hover{color:#fff}
.ep-ranges{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 12px}
.ep-range{background:var(--card2);border:1px solid var(--line);color:var(--muted);font-size:12.5px;font-weight:700;padding:6px 14px;border-radius:8px;cursor:pointer}
.ep-range.on{background:var(--primary);border-color:var(--primary);color:#fff}
/* 5 por linha (flex): a ÚLTIMA linha, se incompleta, ESTICA as células pra
   preencher a largura (flex-grow), como o Jack pediu. */
.ep-grid{display:flex;flex-wrap:wrap;gap:8px}
.ep-cell{position:relative;flex:1 1 calc((100% - 32px) / 5);min-width:52px;min-height:52px;
  display:flex;align-items:center;justify-content:center;border-radius:8px;background:var(--card2);
  border:1px solid var(--line);font-size:15px;font-weight:700;color:var(--txt);cursor:pointer;transition:background .12s,border-color .12s}
.ep-cell:hover{border-color:var(--primary)}
.ep-cell.on{background:var(--primary);border-color:var(--primary);color:#fff}
.ep-cell.ep-lock{color:var(--muted)}
/* Episódio JÁ ASSISTIDO: número esmaecido + ponto rosa no canto, pra ela achar de
   relance onde parou. Declarado ANTES da .on lá em cima? Não — a .on vem antes, mas
   é mais específica no fundo; aqui só mexo no ponto/opacidade, então o episódio
   TOCANDO agora (.on) mantém o fundo cheio. No .on o ponto fica branco pra aparecer. */
.ep-cell.ep-watched{border-color:color-mix(in srgb, var(--primary) 40%, var(--line))}
.ep-cell.ep-watched .ep-n{opacity:.5}
.ep-cell.ep-watched::after{content:"";position:absolute;top:5px;left:5px;width:7px;height:7px;border-radius:50%;
  background:var(--primary);box-shadow:0 0 0 2px var(--card2)}
.ep-cell.on.ep-watched .ep-n{opacity:1}
.ep-cell.on.ep-watched::after{background:#fff;box-shadow:0 0 0 2px var(--primary)}
.ep-lockico{position:absolute;top:5px;right:5px;opacity:.7;display:flex}
/* barras de "tocando": em TODA célula, mas só aparecem na ativa (.on) — assim o
   indicador segue o episódio em vez de ficar preso no trailer. */
.ep-bars{position:absolute;bottom:6px;left:50%;transform:translateX(-50%);display:none;gap:2px;align-items:flex-end;height:9px}
.ep-cell.on .ep-bars{display:flex}
.ep-bars i{width:2.5px;height:100%;background:#fff;border-radius:1px;transform-origin:bottom;animation:epbar .8s ease-in-out infinite}
.ep-bars i:nth-child(2){animation-delay:.25s}
.ep-bars i:nth-child(3){animation-delay:.5s}
@keyframes epbar{0%,100%{transform:scaleY(.35)}50%{transform:scaleY(1)}}

/* ─────────────── botoes ─────────────── */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  border:0;border-radius:999px;padding:12px 22px;font-size:13.5px;font-weight:700;
  cursor:pointer;transition:.15s;text-align:center;background:var(--surface);color:var(--txt)
}
.btn:hover{background:var(--line2)}
.btn:active{transform:scale(.98)}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn-primary{background:linear-gradient(135deg,var(--primary),var(--primary-2));color:#fff;
  box-shadow:0 6px 20px -8px rgba(255,117,168,.6)}
.btn-primary:hover{filter:brightness(1.06);background:linear-gradient(135deg,var(--primary),var(--primary-2))}
.btn-ghost{background:transparent;border:1px solid var(--line2);color:var(--muted)}
.btn-ghost:hover{background:var(--card);color:var(--txt)}
.btn-green{background:linear-gradient(135deg,#059669,#10b981);color:#fff}
.btn-block{display:flex;width:100%}
.btn-sm{padding:8px 16px;font-size:12px}
.btn-lg{padding:15px 28px;font-size:15px}

/* ─────────────── cartoes e formularios ─────────────── */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-lg);padding:18px}
.card-pad0{padding:0;overflow:hidden}
.panel{background:rgba(255,255,255,.04);border:1px solid rgba(255,255,255,.08);
  border-radius:var(--radius-lg);padding:18px}

.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.field label{font-size:12px;font-weight:600;color:var(--muted)}
.field .hint{font-size:11px;color:var(--muted2)}
.input{
  width:100%;background:var(--card2);border:1px solid var(--line);border-radius:var(--radius);
  padding:12px 14px;font-size:14px;color:var(--txt);transition:border-color .15s
}
.input::placeholder{color:var(--muted2)}
.input:focus{outline:none;border-color:rgba(255,117,168,.55)}
.input.err{border-color:rgba(239,68,68,.6)}
textarea.input{min-height:96px;resize:vertical}

.alert{border-radius:var(--radius);padding:12px 14px;font-size:13px;margin-bottom:14px;border:1px solid}
.alert-ok{background:rgba(16,185,129,.1);border-color:rgba(16,185,129,.35);color:#8ef0c4}
.alert-err{background:rgba(239,68,68,.1);border-color:rgba(239,68,68,.35);color:#ffb3b3}
.alert-info{background:rgba(255,117,168,.08);border-color:rgba(255,117,168,.3);color:#ffc4da}

.tag{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;
  padding:3px 10px;border-radius:999px;background:var(--surface);color:var(--muted)}
.tag-ok{background:rgba(16,185,129,.14);color:#5fe0ab}
.tag-warn{background:rgba(240,180,41,.14);color:var(--premium)}
.tag-pink{background:rgba(255,117,168,.14);color:var(--primary)}

/* ─────────────── player ─────────────── */
.player-wrap{display:flex;justify-content:center;background:var(--bg)}
.player{
  position:relative;width:100%;max-width:420px;aspect-ratio:9/16;max-height:85vh;
  background:#000;border-radius:var(--radius-xl);overflow:hidden
}
.player video{width:100%;height:100%;object-fit:contain;background:#000}
.player .poster{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.player .veil{position:absolute;inset:0;background:rgba(0,0,0,.42)}
.player .play-cta{
  position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:14px;border:0;background:transparent;cursor:pointer;color:#fff;z-index:3
}
.play-orb{
  width:78px;height:78px;border-radius:999px;display:grid;place-items:center;
  background:rgba(255,117,168,.92);box-shadow:0 12px 40px -10px rgba(255,117,168,.7)
}
.play-orb svg{margin-left:4px}
.play-cta span{font-size:15px;font-weight:700;text-shadow:0 2px 10px rgba(0,0,0,.6)}

.player .locked{
  position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;
  background:linear-gradient(to top,rgba(0,0,0,.95),rgba(0,0,0,.75))
}
/* [hidden] e regra do navegador e perde pra .locked{display:flex} — sem este
   !important o paywall aparecia em cima do video desde o segundo 0. */
.player .locked[hidden]{display:none!important}
.player .locked h3{font-family:'Poppins',sans-serif;font-size:17px}
.player .locked p{font-size:12.5px;color:var(--muted);max-width:280px}

.player-side{position:absolute;right:10px;bottom:74px;z-index:4;display:flex;flex-direction:column;gap:10px}
.player-side button,.player-side a{
  width:40px;height:40px;border-radius:999px;border:0;cursor:pointer;
  background:rgba(0,0,0,.35);backdrop-filter:blur(6px);color:#fff;display:grid;place-items:center
}
.player-side .on{color:var(--primary)}

/* ─────────────── info do filme ─────────────── */
.movie-info{max-width:420px;margin:0 auto;padding:16px}
.movie-info h1{font-size:17px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.movie-info .syn{font-size:13px;color:var(--muted);line-height:1.65;margin-top:10px}
.movie-info .syn.clamp{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.movie-info details > summary{list-style:none;cursor:pointer;color:var(--primary);font-size:12px;font-weight:600;margin-top:6px}
.movie-info details > summary::-webkit-details-marker{display:none}

/* faixa de indicacao */
.refcard{border-radius:var(--radius-xl);overflow:hidden;background:var(--card);border:1px solid var(--line)}
.refcard .top{background:linear-gradient(135deg,var(--primary),#e0568c);padding:18px;display:flex;gap:12px;align-items:center}
.refcard .top .ico{width:44px;height:44px;border-radius:14px;background:rgba(255,255,255,.18);display:grid;place-items:center;flex:none}
.refcard .top h3{font-family:'Poppins',sans-serif;font-size:16.5px;font-weight:800}
.refcard .top p{font-size:11.5px;color:rgba(255,255,255,.85);margin-top:1px}
.refcard .body{padding:18px;display:flex;flex-direction:column;gap:14px}
.refcard .body p{font-size:13px;color:rgba(255,255,255,.8);line-height:1.6}

/* ─────────────── planos ─────────────── */
.plans{display:grid;gap:14px;grid-template-columns:1fr}
@media(min-width:700px){.plans{grid-template-columns:repeat(2,1fr)}}
@media(min-width:1050px){.plans{grid-template-columns:repeat(4,1fr)}}
.plan{
  position:relative;background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius-xl);padding:22px;display:flex;flex-direction:column;gap:12px
}
.plan.best{border-color:rgba(255,117,168,.55);box-shadow:0 0 0 1px rgba(255,117,168,.18)}
.plan .flag{
  position:absolute;top:-10px;left:50%;transform:translateX(-50%);
  background:var(--primary);color:#fff;font-size:10px;font-weight:800;
  text-transform:uppercase;letter-spacing:.06em;padding:4px 12px;border-radius:999px;white-space:nowrap
}
.plan h3{font-size:15px;color:var(--muted)}
.plan .price{font-family:'Poppins',sans-serif;font-size:34px;font-weight:800;letter-spacing:-.04em;line-height:1}
.plan .price small{font-size:15px;color:var(--muted2);font-weight:600}
.plan .was{font-size:12px;color:var(--muted2);text-decoration:line-through}
.plan .per{font-size:12px;color:var(--muted)}
.plan ul{list-style:none;display:flex;flex-direction:column;gap:7px;font-size:12.5px;color:var(--muted)}
.plan ul li{display:flex;gap:8px;align-items:flex-start}
.plan ul li svg{flex:none;margin-top:2px;color:var(--primary)}

/* ─────────────── checkout ─────────────── */
.checkout{display:grid;gap:18px;grid-template-columns:1fr;align-items:start}
@media(min-width:900px){.checkout{grid-template-columns:1.4fr .9fr}}
.pix-box{display:flex;flex-direction:column;align-items:center;gap:14px;text-align:center}
.pix-box img{width:236px;height:236px;border-radius:var(--radius);background:#fff;padding:10px}
.pix-code{
  width:100%;background:var(--card2);border:1px solid var(--line);border-radius:var(--radius);
  padding:12px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;line-height:1.45;
  color:var(--txt);overflow-wrap:anywhere;white-space:pre-wrap;min-height:108px;max-height:180px;
  overflow:auto;resize:vertical
}
.pix-copy-btn{width:100%;min-height:46px}
.pix-copy-btn[data-copy-state="copied"]{background:#25a56f;border-color:#25a56f}
.pix-copy-btn[data-copy-state="manual"]{background:var(--card2);border-color:var(--primary);color:var(--txt)}
.pix-auto-status{display:flex;align-items:center;justify-content:center;gap:8px;
  width:100%;margin:2px 0 0;color:var(--muted);font-size:13px;line-height:1.4}
[data-pix-create][aria-busy="true"],[data-ss-pay][aria-busy="true"]{cursor:wait;pointer-events:none;opacity:.82}
.summary-row{display:flex;justify-content:space-between;font-size:13px;padding:7px 0}
.summary-row.total{border-top:1px solid var(--line);margin-top:6px;padding-top:12px;font-size:16px;font-weight:800}

/* ── checkout: forma de pagamento (PIX / cartão) ── */
.pay-methods{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:14px}
.pay-opt{position:relative;display:flex;align-items:center;gap:10px;padding:12px;cursor:pointer;
  border:1.5px solid var(--line2);border-radius:14px;background:var(--card2);
  transition:border-color .18s,background .18s}
.pay-opt input{position:absolute;opacity:0;pointer-events:none}
.pay-opt .pay-ic{flex:none;width:38px;height:38px;border-radius:10px;display:grid;place-items:center;
  background:rgba(255,255,255,.06);color:var(--txt)}
.pay-opt-txt{display:flex;flex-direction:column;min-width:0;line-height:1.2}
.pay-opt-txt b{font-size:14px}
.pay-opt-txt small{font-size:11px;color:var(--muted2);margin-top:2px}
.pay-check{margin-left:auto;flex:none;width:20px;height:20px;border-radius:999px;display:grid;place-items:center;
  border:1.5px solid var(--line2);color:#fff;opacity:0;transform:scale(.7);transition:.18s}
.pay-opt.on{border-color:var(--primary);background:rgba(255,117,168,.08)}
.pay-opt.on .pay-check{opacity:1;transform:scale(1);background:var(--primary);border-color:var(--primary)}
.pay-opt.on .pay-ic{background:rgba(255,117,168,.16)}
@media(max-width:380px){.pay-methods{grid-template-columns:1fr}}

.pay-panel{margin-bottom:4px}
.pix-note{display:flex;align-items:flex-start;gap:10px;padding:12px 14px;border-radius:12px;
  background:rgba(50,188,173,.1);border:1px solid rgba(50,188,173,.28)}
.pix-note-ic{flex:none;width:22px;height:22px;border-radius:999px;display:grid;place-items:center;background:#32BCAD;color:#fff}
.pix-note b{font-size:13px;display:block}
.pix-note p{font-size:12px;color:var(--muted);margin-top:2px}

.pay-brands{display:flex;align-items:center;flex-wrap:wrap;gap:7px;margin-bottom:14px}
.pay-brands-lbl{font-size:11px;color:var(--muted2);width:100%;margin-bottom:1px}
.pay-brand{display:inline-flex;border-radius:5px;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.pay-brand svg{display:block}

/* ─────────────── paginacao ─────────────── */
.pager{display:flex;align-items:center;justify-content:center;gap:6px;margin:28px 0;flex-wrap:wrap}
.pager a,.pager span{
  min-width:38px;height:38px;padding:0 12px;border-radius:10px;display:grid;place-items:center;
  background:var(--card);border:1px solid var(--line);font-size:13px;font-weight:600;color:var(--muted)
}
.pager a:hover{color:var(--txt);border-color:var(--line2)}
.pager .on{background:var(--primary);border-color:var(--primary);color:#fff}
.pager .gap{background:transparent;border:0}

/* ─────────────── estados vazios ─────────────── */
.empty{text-align:center;padding:56px 20px;max-width:380px;margin:0 auto}
.empty h3{font-family:'Poppins',sans-serif;font-size:17px;font-weight:800}
.empty p{font-size:13px;color:var(--muted);margin-top:6px}
.empty .btn{margin-top:16px}

/* ─────────────── rodape ─────────────── */
.footer{border-top:1px solid var(--line);margin-top:40px;padding:32px 0 40px;background:#0b0b0b}
.footer-grid{display:grid;gap:26px;grid-template-columns:1fr}
@media(min-width:768px){.footer-grid{grid-template-columns:2fr 1fr 1fr}}
.footer h4{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted2);margin-bottom:10px}
.footer a{display:block;font-size:13px;color:var(--muted);padding:4px 0;transition:color .15s}
.footer a:hover{color:var(--txt)}
.footer .copy{border-top:1px solid var(--line);margin-top:26px;padding-top:18px;font-size:11.5px;color:var(--muted2)}
.socials{display:flex;gap:8px;flex-wrap:wrap}
.socials a{
  width:38px;height:38px;border-radius:999px;background:var(--card);border:1px solid var(--line);
  display:grid;place-items:center;color:var(--muted);padding:0
}
.socials a:hover{color:var(--primary);border-color:rgba(255,117,168,.4)}

/* ─────────────── barra inferior (mobile) ─────────────── */
.tabbar{
  position:fixed;left:0;right:0;bottom:0;z-index:70;
  background:#0e0e0e;border-top:1px solid rgba(255,255,255,.07);
  padding-bottom:env(safe-area-inset-bottom)
}
@media(min-width:768px){.tabbar{display:none}}
.tabbar-in{display:flex;align-items:center;justify-content:space-around;height:var(--tab-h)}
.tabbar a{
  flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;
  font-size:10px;font-weight:600;color:var(--muted);padding:6px 0
}
.tabbar a.on{color:var(--primary)}
.tabbar a.hi .orb{
  width:40px;height:40px;margin-top:-22px;border-radius:999px;display:grid;place-items:center;
  background:linear-gradient(135deg,var(--primary),var(--primary-2));color:#fff;
  box-shadow:0 8px 22px -8px rgba(255,117,168,.75)
}
.tabbar a.hi{color:var(--primary)}

/* ─────────────── faixa VIP ─────────────── */
/* Rosa solida com coroa, texto e botao translucido — igual ao VipBanner. */
.vip{
  /* z-index:1 tira a faixa de baixo do .hero-bg (position:absolute;z-index:0), que
     sobe com top negativo e lavava o rosa no painel Popular. Fica na regra base
     porque no desktop a .vip tambem e static e sofria o mesmo. */
  position:relative;z-index:1;
  display:flex;align-items:center;gap:12px;border-radius:var(--radius);padding:12px 16px;
  background:linear-gradient(135deg,#FF4D94,#FF75A8 42%,#E0568C);
  box-shadow:0 6px 22px -10px rgba(255,77,168,.6)
}
.vip .ico{color:#fff;flex:none;display:grid}
.vip .ico img{width:28px;height:28px;object-fit:contain;
  filter:drop-shadow(0 1px 3px rgba(0,0,0,.4))}
.vip .txt{flex:1;min-width:0}
.vip .txt b{display:block;color:#fff;font-size:12px;font-weight:600;line-height:1.35}
.vip .txt span{display:block;color:rgba(255,255,255,.8);font-size:11px;font-weight:500;margin-top:2px}
.vip a{
  /* sem backdrop-filter: o botao fica sobre um gradiente OPACO, nao ha nada atras
     pra desfocar (zero pixel muda) e ele forcava uma camada + blur por frame */
  flex:none;padding:6px 12px;border-radius:8px;background:rgba(255,255,255,.2);
  color:#fff;font-size:10px;font-weight:700;
  text-transform:uppercase;letter-spacing:.04em;transition:.2s;white-space:nowrap
}
.vip a:hover{background:rgba(255,255,255,.3)}

/* Slot da faixa VIP: existe um por painel de aba. No Popular ela entra logo abaixo
   do carrossel de destaques; nas outras abas, no topo do painel (mesma altura de
   sempre). Atencao: nas abas sem hero o margin-top ESCAPA do .tab-panel por colapso
   de margem — e por isso que a posicao bate com a de antes. Se um dia o .tab-panel
   ganhar padding-top ou overflow, aparece um degrau de 16px aqui. */
.vip-slot{position:relative;z-index:1;margin:16px 0}
.hero-wrap + .vip-slot{margin-top:14px}   /* colado nas bolinhas do hero, sem buraco */

/* ─────────────── faixas promocionais ─────────────── */
.promo{
  display:flex;align-items:center;gap:12px;border-radius:var(--radius-lg);padding:14px 16px;
  background:linear-gradient(135deg,rgba(255,117,168,.16),rgba(255,117,168,.05));
  border:1px solid rgba(255,117,168,.28);margin:18px 0
}
.promo .ico{width:40px;height:40px;border-radius:12px;background:rgba(255,117,168,.2);
  display:grid;place-items:center;color:var(--primary);flex:none}
.promo h3{font-size:14px}
.promo p{font-size:12px;color:var(--muted);margin-top:1px}
.promo .btn{margin-left:auto;flex:none}
@media(max-width:560px){.promo{flex-wrap:wrap}.promo .btn{margin-left:0;width:100%}}

.banner-img{display:block;border-radius:var(--radius-lg);overflow:hidden;margin:18px 0}
.banner-img img{width:100%;height:auto}

/* ─────────────── abas ─────────────── */
.tabs{display:flex;gap:6px;border-bottom:1px solid var(--line);margin-bottom:18px;overflow-x:auto;scrollbar-width:none}
.tabs::-webkit-scrollbar{display:none}
.tabs a{
  padding:11px 15px;font-size:13px;font-weight:600;color:var(--muted);
  border-bottom:2px solid transparent;white-space:nowrap
}
.tabs a.on{color:var(--txt);border-bottom-color:var(--primary)}

/* ─────────────── utilidades ─────────────── */
.page-head{padding:22px 0 14px}
.page-head h1{font-family:'Poppins',sans-serif;font-size:24px;font-weight:800;letter-spacing:-.03em}
.page-head p{font-size:13px;color:var(--muted);margin-top:4px}
.divider{height:1px;background:var(--line);margin:20px 0}
.mt-0{margin-top:0}.mt-1{margin-top:8px}.mt-2{margin-top:16px}.mt-3{margin-top:24px}
.mb-2{margin-bottom:16px}.mb-3{margin-bottom:24px}

@media(prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important;scroll-behavior:auto!important}
}

/* ─────────────── escolha de gostos ─────────────── */
.tastegrid{display:grid;gap:10px;grid-template-columns:repeat(auto-fill,minmax(158px,1fr))}
.tastechip{position:relative;display:block;cursor:pointer}
.tastechip input{position:absolute;opacity:0;width:0;height:0}
.tastechip .body{
  display:flex;flex-direction:column;gap:3px;padding:16px 15px;border-radius:var(--radius-lg);
  background:var(--card);border:1px solid var(--line);transition:.15s;min-height:82px;justify-content:center
}
.tastechip .body b{font-size:14px}
.tastechip .body em{font-style:normal;font-size:11.5px;color:var(--muted2)}
.tastechip:hover .body{border-color:var(--line2)}
.tastechip .tick{
  position:absolute;top:10px;right:10px;width:22px;height:22px;border-radius:999px;
  display:grid;place-items:center;background:var(--primary);color:#fff;
  opacity:0;transform:scale(.6);transition:.15s
}
.tastechip input:checked ~ .body{
  border-color:var(--primary);background:rgba(255,117,168,.09)
}
.tastechip input:checked ~ .tick{opacity:1;transform:scale(1)}
.tastechip input:focus-visible ~ .body{outline:2px solid var(--primary);outline-offset:2px}

/* ═══════════════════ paywall de tela cheia (/assinar) ═══════════════════
   Layout do mockup, cores da marca: onde ele usava lime, aqui entra o rosa
   do tema — lime e a identidade do outro app, nao a nossa. */

body.bare{padding-bottom:0}
body.bare #conteudo{min-height:100vh;display:flex;align-items:center;justify-content:center}
@media(min-width:600px){body.bare #conteudo{padding:24px}}

.pw{
  position:relative;width:100%;max-width:460px;
  min-height:100vh;background:#000;overflow:hidden;
  display:flex;flex-direction:column
}
@media(min-width:600px){
  .pw{
    min-height:min(940px,calc(100vh - 48px));
    border-radius:34px;box-shadow:0 30px 90px -20px rgba(0,0,0,.75)
  }
}

/* fundo: a propria capa central desfocada, pra pagina nao ficar caixa preta no desktop */
.pw-bg{
  position:fixed;inset:0;z-index:-1;
  background-position:center;background-size:cover;background-repeat:no-repeat;
  filter:blur(70px) brightness(.3) saturate(1.15);transform:scale(1.25)
}

/* ── topo ── */
.pw-top{
  position:absolute;top:20px;left:0;right:0;z-index:30;
  display:flex;align-items:center;justify-content:space-between;padding:0 20px
}
.pw-x{
  width:32px;height:32px;border-radius:50%;display:grid;place-items:center;
  background:rgba(0,0,0,.32);color:#fff;backdrop-filter:blur(4px);flex:none
}
.pw-restore{
  color:#fff;font-size:14px;font-weight:500;text-shadow:0 1px 6px rgba(0,0,0,.7)
}

/* ── mosaico de capas ── */
.pw-hero{position:absolute;top:0;left:0;right:0;height:53%;z-index:1}
.pw-grid{display:grid;grid-template-columns:1fr 1.28fr 1fr;gap:6px;height:100%;padding:6px}
.pw-col{display:flex;flex-direction:column;gap:6px;min-height:0}
.pw-col.pw-mid{margin-top:-16px}
.pw-grid img{
  width:100%;height:100%;object-fit:cover;border-radius:11px;
  flex:1;min-height:0;background:var(--card)
}
.pw-grid .pw-big{flex:1.7}
.pw-grid .pw-small{flex:.55}
/* degrade que apaga as capas pro preto, senao o titulo nao le */
.pw-fade{
  position:absolute;left:0;right:0;top:24%;height:34%;z-index:2;pointer-events:none;
  background:linear-gradient(180deg,transparent 0,rgba(0,0,0,.6) 55%,#000 100%)
}

/* ── conteudo ── */
.pw-content{
  position:relative;z-index:10;margin-top:auto;
  display:flex;flex-direction:column;padding:0 22px 24px
}
.pw-title{
  font-family:'Poppins',Montserrat,sans-serif;
  font-size:clamp(27px,8vw,33px);line-height:1.05;font-weight:800;letter-spacing:-.7px
}
.pw-title .hl{color:var(--primary)}
.pw-sub{
  color:var(--muted);font-size:13.5px;line-height:1.5;margin:12px 0 18px;max-width:310px
}

/* ── planos: radio escondido + label, selecao 100% em CSS ── */
.pw-plans{
  display:flex;gap:8px;align-items:stretch;
  overflow-x:auto;scroll-snap-type:x mandatory;
  scrollbar-width:none;padding-top:9px
}
.pw-plans::-webkit-scrollbar{display:none}
.pw-radio{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.pw-plan{
  position:relative;flex:1 0 auto;min-width:94px;scroll-snap-align:center;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.09);
  border-radius:18px;padding:30px 7px 14px;cursor:pointer;
  display:flex;flex-direction:column;align-items:center;gap:3px;
  transition:border-color .15s,background .15s
}
.pw-tag{
  position:absolute;top:0;left:50%;transform:translate(-50%,-50%);
  font-size:9.5px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;
  padding:5px 9px;border-radius:11px;white-space:nowrap;
  background:#242427;color:#c7c7cc
}
.pw-name{font-size:14.5px;font-weight:700}
.pw-price{font-size:15px;font-weight:800}
.pw-per{
  color:var(--muted);font-size:11.5px;margin-top:7px;width:100%;text-align:center;
  background:rgba(0,0,0,.35);border-radius:9px;padding:6px 2px
}
.pw-off{
  position:absolute;top:-11px;right:-7px;z-index:3;
  background:linear-gradient(135deg,#ff8a1e,#ff4d1c);color:#fff;
  font-size:9.5px;font-weight:800;padding:5px 8px;border-radius:11px;
  transform:rotate(6deg);box-shadow:0 4px 10px rgba(255,80,20,.4)
}
/* estado escolhido */
.pw-radio:checked + .pw-plan{
  border-color:var(--primary);background:rgba(255,117,168,.11)
}
.pw-radio:checked + .pw-plan .pw-tag{background:var(--primary);color:#fff}
.pw-radio:checked + .pw-plan .pw-per{color:#ffd4e4}
.pw-radio:focus-visible + .pw-plan{outline:2px solid var(--primary);outline-offset:2px}

/* ── relogio da promocao ── */
.pw-timerwrap{margin:18px 0 14px;text-align:center}
.pw-timerlab{
  display:block;color:var(--muted2);font-size:11px;font-weight:600;
  text-transform:uppercase;letter-spacing:.6px;margin-bottom:8px
}
.pw-timer{display:flex;align-items:center;justify-content:center;gap:7px}
.pw-tbox{
  background:rgba(255,255,255,.08);border-radius:12px;min-width:46px;padding:11px 0;
  text-align:center;font-size:19px;font-weight:700;font-variant-numeric:tabular-nums
}
.pw-colon{font-size:17px;font-weight:700;opacity:.45}

/* ── botao e rodape ── */
.pw-cta{
  width:100%;border:0;cursor:pointer;background:#fff;color:#0a0a0a;
  font-size:15px;font-weight:800;letter-spacing:.3px;text-transform:uppercase;
  padding:18px;border-radius:17px;margin-top:4px;
  box-shadow:0 8px 24px -6px rgba(255,255,255,.22);transition:transform .1s
}
.pw-cta:active{transform:scale(.985)}
.pw-legal{text-align:center;color:var(--muted2);font-size:11.5px;margin-top:13px}
.pw-legal a{color:var(--muted);text-decoration:underline}
.pw-skip{
  display:block;text-align:center;color:var(--muted2);font-size:12.5px;
  margin-top:14px;padding:6px
}
.pw-skip:hover{color:var(--muted)}

/* telas baixas: o mosaico encolhe pro preco nao sair da area visivel */
@media(max-height:680px){
  .pw-hero{height:42%}
  .pw-fade{top:16%}
  .pw-title{font-size:25px}
  .pw-sub{margin:9px 0 14px}
}

/* ═══════════════════════════════════════════════════════════════════
   CARA DE APP (mobile)
   Camada de polish + micro-interacoes pra o tema parecer app nativo:
   ripple no toque, reveal ao rolar, tabbar Material 3, cards com
   profundidade, transicao de pagina. Tudo enhancement — a classe .js
   (marcada no <head>) liga os estados iniciais; sem JS nada some.
   ═══════════════════════════════════════════════════════════════════ */
:root{--ease:cubic-bezier(.2,.7,.2,1)}

/* ---------- icones Material Symbols (mesmo conjunto do site oficial) ---------- */
.msym{
  font-family:'Material Symbols Outlined';font-weight:400;font-style:normal;line-height:1;
  letter-spacing:normal;text-transform:none;display:inline-grid;place-items:center;
  white-space:nowrap;direction:ltr;vertical-align:middle;user-select:none;flex:none;overflow:hidden;
  -webkit-font-smoothing:antialiased;font-variation-settings:'FILL' 0,'wght' 400,'GRAD' 0,'opsz' 24
}
.msym.fill{font-variation-settings:'FILL' 1,'wght' 500,'GRAD' 0,'opsz' 24}

/* ---------- ripple Material ---------- */
.ripple-host{position:relative;overflow:hidden}
.ripple-ink{
  position:absolute;border-radius:50%;pointer-events:none;z-index:5;
  background:radial-gradient(circle,rgba(255,255,255,.5),rgba(255,255,255,0) 68%);
  transform:scale(0);opacity:.55;animation:rippleGo .58s ease-out forwards;
  mix-blend-mode:overlay
}
@keyframes rippleGo{to{transform:scale(2.4);opacity:0}}
/* alvos ganham recorte + relevo pro toque */
.btn,.chip,.seg a,.crownbtn,.iconbtn,.hero-play,.vip a,.tabbar a{position:relative;overflow:hidden}

/* ---------- entrada de pagina + secoes (CSS puro; nao depende de JS/CSP) ---------- */
@media(max-width:900px){
  #conteudo{animation:pageIn .45s ease-out both}
  .anim-reveal{animation:secIn .6s var(--ease) both}
  .anim-reveal .mcard{animation:cardIn .5s var(--ease) both}
  .anim-reveal .mcard:nth-child(2){animation-delay:.05s}
  .anim-reveal .mcard:nth-child(3){animation-delay:.1s}
  .anim-reveal .mcard:nth-child(4){animation-delay:.15s}
  .anim-reveal .mcard:nth-child(n+5){animation-delay:.2s}
}
@keyframes pageIn{from{opacity:0;transform:scale(1.04)}to{opacity:1;transform:scale(1)}}
@keyframes secIn{from{opacity:0;transform:translateY(26px)}to{opacity:1;transform:none}}
@keyframes cardIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){
  #conteudo,.anim-reveal,.anim-reveal .mcard{animation:none!important}
}

/* ---------- feedback tatil universal ---------- */
@media(hover:none){
  .btn:active,.chip:active,.seg a:active,.hero-play:active,.vip a:active,
  .crownbtn:active,.iconbtn:active,.planrow:active{transform:scale(.95)}
  .mcard:active .thumb{transform:scale(.95)}
}

/* ═══════════ bottom nav estilo app (Material 3 + FAB central) ═══════════ */
@media(max-width:767px){
  .tabbar{
    background:rgba(10,10,12,.94);
    -webkit-backdrop-filter:blur(12px) saturate(1.4);backdrop-filter:blur(12px) saturate(1.4);
    border-top:1px solid rgba(255,255,255,.06);
    box-shadow:0 -12px 36px -16px rgba(0,0,0,.85)
  }
  .tabbar-in{height:64px;padding:7px 2px 5px;align-items:flex-start}
  .tabbar a{gap:2px;padding:0;color:var(--muted2);transition:color .25s var(--ease)}
  .tabbar a .ico-wrap{
    display:grid;place-items:center;width:58px;height:30px;border-radius:999px;
    position:relative;z-index:1;transition:transform .3s var(--ease);color:inherit
  }
  /* pilula rosa que cresce atras do icone ativo */
  .tabbar a .ico-wrap::before{
    content:"";position:absolute;inset:0;border-radius:999px;z-index:-1;
    background:rgba(255,117,168,.18);transform:scale(.4);opacity:0;
    transition:transform .32s var(--ease),opacity .28s var(--ease)
  }
  .tabbar a span{font-size:10px;font-weight:600;letter-spacing:.01em;transition:color .25s;
    white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
  .tabbar a.on{color:var(--primary)}
  .tabbar a.on .ico-wrap::before{transform:scale(1);opacity:1}
  .tabbar a.on span{font-weight:700}
  .tabbar a:active .ico-wrap{transform:scale(.84)}
}

/* ═══════════ cards com profundidade ═══════════ */
.mcard .thumb{
  border-radius:14px;
  box-shadow:0 6px 18px -10px rgba(0,0,0,.7);
  transition:transform .22s var(--ease),box-shadow .22s var(--ease)
}
@media(hover:hover){
  .mcard:hover .thumb{box-shadow:0 14px 30px -12px rgba(0,0,0,.85)}
}
/* selo de audio: pilula com vidro em vez de retangulo */
.mcard .badge{
  top:8px;right:8px;border-radius:999px;padding:3px 8px;font-size:8.5px;
  background:rgba(0,0,0,.55);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  border:1px solid rgba(255,255,255,.14);color:#fff
}
/* tipo de áudio, on-theme (rosa da marca): dublado = rosa preenchido, legendado =
   escuro com contorno rosa. Distinção na batida do olho sem fugir do tema. */
.mcard .badge-dublado{background:linear-gradient(135deg,var(--primary),var(--primary-2));border-color:transparent;color:#fff;font-weight:800}
.mcard .badge-legendado{background:rgba(18,18,24,.72);border-color:rgba(255,117,168,.55);color:#fff}
.mcard .badge-brasileira{background:var(--primary-2);border-color:transparent;color:#fff;font-weight:800}
/* rank do Top 10: gradiente da marca */
.mcard .rank{
  border-radius:8px;background:linear-gradient(135deg,var(--primary),var(--primary-2));
  box-shadow:0 3px 10px -3px rgba(255,117,168,.6)
}
/* barra de progresso mais viva */
.mcard .prog{height:4px;background:rgba(255,255,255,.22)}
.mcard .prog i{background:linear-gradient(90deg,var(--primary),var(--primary-2));
  box-shadow:0 0 8px rgba(255,117,168,.7)}

/* ═══════════ header, chips e hero — mais app ═══════════ */
@media(max-width:767px){
  /* header estilo app: logo + busca-lupa que expande + idioma (o presente foi pro tabbar) */
  .nav-actions{gap:6px}
  .nav-search input{padding-top:11px;padding-bottom:11px;font-size:14px}

  /* busca colapsada: SÓ a lupa, sem "box". Ao tocar (.nav.searching) expande e
     ocupa o header ao lado da logo, escondendo os outros ícones (ver app-fx.js). */
  /* colapsada: encostada nos outros ícones à direita (sem vão), lupa como 1º do grupo */
  .nav-search{flex:none;width:44px;max-width:44px;margin-left:auto;
    transition:max-width .34s var(--ease),width .34s var(--ease)}
  .nav-search .ico{display:none}
  .nav-search input{flex:1;min-width:0;opacity:0;transition:opacity .2s ease}
  .nav-search-toggle{display:flex;align-items:center;justify-content:center;width:44px;height:40px;flex:none;color:var(--txt)}
  /* expandida: ocupa do lado da logo até o fim */
  .nav.searching .nav-search{flex:1;width:auto;max-width:100%;margin-left:10px}
  .nav.searching .nav-search-toggle{display:none}
  .nav.searching .nav-search .ico{display:grid}
  .nav.searching .nav-search input{opacity:1}
  .nav.searching .nav-search-close{display:flex;align-items:center;justify-content:center;width:36px;height:40px;font-size:28px;line-height:1;color:var(--muted);flex:none}
  .nav.searching .nav-actions{display:none}
  /* chip ativo com preenchimento da marca */
  .chip.on{background:rgba(255,117,168,.16);border-color:rgba(255,117,168,.4);color:var(--txt)}
  /* segmento ativo com brilho */
  .seg a.on{box-shadow:0 3px 14px -2px rgba(255,117,168,.5)}
  /* hero: botao pulsa de leve chamando o toque */
  .hero-play{box-shadow:0 8px 24px -8px rgba(255,117,168,.65);animation:heroPulse 2.6s ease-in-out infinite}
  /* titulo de secao com barrinha rosa a esquerda, cara de app */
  .section-head h2{position:relative;padding-left:12px}
  .section-head h2::before{
    content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);
    width:4px;height:16px;border-radius:999px;
    background:linear-gradient(180deg,var(--primary),var(--primary-2))
  }
  .section-head h2 .mark ~ *{padding-left:0}
}
@keyframes heroPulse{0%,100%{box-shadow:0 8px 24px -8px rgba(255,117,168,.55)}
  50%{box-shadow:0 8px 30px -6px rgba(255,117,168,.85)}}
@media(prefers-reduced-motion:reduce){.hero-play{animation:none}}

/* ═══════════ skeleton shimmer (pronto pra uso) ═══════════ */
.skel{position:relative;overflow:hidden;background:var(--card2);border-radius:var(--radius)}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.06),transparent);
  animation:shimmer 1.3s infinite}
@keyframes shimmer{to{transform:translateX(100%)}}

/* faixa VIP: leve brilho deslizante pra chamar atencao (mobile) */
@media(max-width:767px){
  .vip{overflow:hidden;padding:10px 12px;gap:10px}
  /* O titulo NUNCA vira "...": quebra em quantas linhas precisar. Em uma linha ele
     pede 276px (pt) / 310px (es) e a coluna de texto tem 128-222px num telefone —
     nao cabe em largura nenhuma, entao reticencia aqui era corte garantido. */
  .vip .txt b{white-space:normal;overflow:visible;text-overflow:clip;
    overflow-wrap:anywhere;font-size:11.5px;line-height:1.3}
  .vip .txt span{white-space:normal;overflow:visible;text-overflow:clip;
    overflow-wrap:anywhere}
  .vip a{padding:7px 10px;font-size:9.5px}
  /* pointer-events:none: sem isso o brilho passa NA FRENTE do CTA enquanto varre a
     barra, e o toque em "Ver planos" cai na .vip em vez de no link. */
  .vip::after{content:"";position:absolute;top:0;bottom:0;width:40%;pointer-events:none;
    background:linear-gradient(100deg,transparent,rgba(255,255,255,.18),transparent);
    transform:translateX(-160%);animation:vipShine 4.5s ease-in-out infinite}
}
/* Telas bem estreitas: o CTA ocupa a linha inteira e devolve ~98px de largura pro
   texto, assim o titulo cabe em 2 linhas e o preco nao quebra. */
@media(max-width:359px){
  .vip{flex-wrap:wrap;row-gap:9px}
  .vip a{flex:1 0 100%;text-align:center;padding:9px 12px}
}
@keyframes vipShine{0%,60%{transform:translateX(-160%)}85%,100%{transform:translateX(320%)}}
@media(prefers-reduced-motion:reduce){.vip::after{display:none}}

/* ═══════════════════════════════════════════════════════════════════
   FASE 1 — MOTION (transicoes portadas do iDrama, cores nossas)
   enter_ios_anim (scale+fade), slide_in_bottom (sheet), push (horizontal).
   ═══════════════════════════════════════════════════════════════════ */
@keyframes sheetUp{from{transform:translateY(100%)}to{transform:translateY(0)}}
@keyframes veilIn{from{opacity:0}to{opacity:1}}
@keyframes iosPop{from{opacity:0;transform:scale(1.08)}to{opacity:1;transform:scale(1)}}

/* login SEMPRE centralizado no meio da tela (zoom), nunca sobe de baixo */
@media(max-width:640px){
  .modal-box{max-width:400px;width:100%;max-height:90dvh}
  .modal:target .modal-veil,.modal.is-open .modal-veil{animation:veilIn .25s ease both}
  .modal:target .modal-box,.modal.is-open .modal-box{animation:iosPop .28s var(--ease) both}
}
@media(min-width:641px){
  .modal:target .modal-box,.modal.is-open .modal-box{animation:iosPop .28s var(--ease) both}
}
@media(prefers-reduced-motion:reduce){
  .modal-box,.modal-veil{animation:none!important}
}

/* ═══════════ FASE 2 — curtir animado (Lottie) ═══════════ */
.lot{line-height:0}
.fav-btn .fav-heart{position:relative;display:inline-grid;place-items:center;width:18px;height:18px}
.fav-btn .msym{transition:color .2s,transform .2s var(--ease)}
.fav-btn.is-fav{border-color:rgba(255,117,168,.42);background:rgba(255,117,168,.09)}
.fav-btn.is-fav .msym{color:var(--primary)}
.fav-btn:active .fav-heart{transform:scale(.85)}
/* o coração que explode fica maior que o botão e centralizado nele */
.fav-burst{
  position:absolute;left:50%;top:50%;width:78px;height:78px;
  transform:translate(-50%,-50%);pointer-events:none;opacity:0;z-index:5
}
/* mãozinha "assine" no botão do paywall */
.pw-cta{position:relative}
.pw-cta-hand{position:absolute;right:8px;bottom:0;pointer-events:none;
  filter:drop-shadow(0 2px 5px rgba(0,0,0,.35))}

/* ═══════════════════════════════════════════════════════════════════
   FASE 3 — feed vertical (curtas): 1 filme por tela, snap, autoplay
   ═══════════════════════════════════════════════════════════════════ */
body.is-feed{padding-bottom:0;background:#000}
body.is-feed .nav,body.is-feed .footer{display:none}
body.is-feed main{padding-top:0}
body.is-feed .tabbar{background:rgba(0,0,0,.5);border-top-color:rgba(255,255,255,.08)}

.feed{height:100dvh;overflow-y:scroll;scroll-snap-type:y mandatory;
  scrollbar-width:none;background:#000;overscroll-behavior-y:contain}
.feed::-webkit-scrollbar{display:none}
.feed-slide{position:relative;height:100dvh;scroll-snap-align:start;scroll-snap-stop:always;
  overflow:hidden;background:#000}
.feed-poster,.feed-vid{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.feed-poster{z-index:1}
.feed-vid{z-index:2;opacity:0;transition:opacity .35s}
.feed-slide.is-active .feed-vid{opacity:1}
.feed-shade{position:absolute;inset:0;z-index:3;pointer-events:none;
  background:linear-gradient(to top,rgba(0,0,0,.82),transparent 26%,transparent 60%,rgba(0,0,0,.5))}

.feed-tap{position:absolute;inset:0;z-index:4;border:0;background:transparent;cursor:pointer}

.feed-muted{position:absolute;top:16px;left:50%;transform:translateX(-50%);z-index:6;
  display:inline-flex;align-items:center;gap:6px;color:#fff;font-size:12px;font-weight:600;
  background:rgba(0,0,0,.5);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  padding:7px 13px;border-radius:999px;transition:opacity .3s}
.feed[data-sound="on"] .feed-muted{opacity:0;pointer-events:none}

.feed-slide.is-paused::after{content:"";position:absolute;left:50%;top:50%;z-index:5;
  width:74px;height:74px;transform:translate(-50%,-50%);pointer-events:none;border-radius:999px;
  background:rgba(0,0,0,.4) center/34px no-repeat;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='34' height='34' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M8 5.5v13l11-6.5Z'/%3E%3C/svg%3E")}

.feed-back{position:fixed;top:14px;left:12px;z-index:20;width:40px;height:40px;border-radius:999px;
  display:grid;place-items:center;color:#fff;
  background:rgba(0,0,0,.4);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}

.feed-side{position:absolute;right:10px;bottom:calc(var(--tab-h) + 34px);z-index:10;
  display:flex;flex-direction:column;gap:19px;align-items:center}
.feed-act{display:flex;flex-direction:column;align-items:center;gap:5px;border:0;background:transparent;
  color:#fff;cursor:pointer;padding:0}
.feed-act-ic{width:50px;height:50px;border-radius:999px;display:grid;place-items:center;position:relative;
  background:rgba(255,255,255,.14);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);
  transition:transform .18s var(--ease),background .2s}
.feed-act:active .feed-act-ic{transform:scale(.86)}
.feed-act-n{font-size:11px;font-weight:600;text-shadow:0 1px 4px rgba(0,0,0,.6)}
.feed-act.is-fav .feed-act-ic{background:rgba(255,117,168,.22)}
.feed-act.is-fav .msym{color:var(--primary)}
.feed-fav{margin:0}
.feed-fav .fav-burst{width:98px;height:98px}

.feed-info{position:absolute;left:16px;right:80px;bottom:calc(var(--tab-h) + 26px);z-index:9;color:#fff}
.feed-info h2{font-size:19px;font-weight:800;letter-spacing:-.02em;display:flex;align-items:center;
  gap:8px;flex-wrap:wrap;text-shadow:0 2px 8px rgba(0,0,0,.65)}
.feed-badge{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;
  background:rgba(255,117,168,.92);padding:3px 8px;border-radius:999px}
.feed-info p{font-size:13px;color:rgba(255,255,255,.86);margin:8px 0 12px;line-height:1.42;
  text-shadow:0 1px 6px rgba(0,0,0,.7)}
.feed-cta{display:inline-flex;align-items:center;gap:7px;color:#fff;font-size:13.5px;font-weight:700;
  padding:10px 20px;border-radius:999px;
  background:linear-gradient(135deg,var(--primary),var(--primary-2));
  box-shadow:0 8px 22px -8px rgba(255,117,168,.7)}

.feed-prog{position:absolute;left:0;right:0;bottom:var(--tab-h);height:3px;z-index:11;background:rgba(255,255,255,.16)}
.feed-prog i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--primary),var(--primary-2))}

.feed-wall{position:absolute;inset:0;z-index:15;display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;
  background:linear-gradient(to top,rgba(0,0,0,.96),rgba(0,0,0,.78))}
.feed-wall[hidden]{display:none}
.feed-wall h3{font-family:'Poppins',sans-serif;font-size:18px}

.feed-guide{position:fixed;left:0;right:0;bottom:calc(var(--tab-h) + 70px);z-index:25;
  display:flex;flex-direction:column;align-items:center;gap:2px;pointer-events:none;color:#fff}
.feed-guide[hidden]{display:none}
.feed-guide span{font-size:13px;font-weight:600;text-shadow:0 1px 6px rgba(0,0,0,.85)}

/* ═══════════════════════════════════════════════════════════════════
   FASE 4 — mini-player "continuar", badges de status, bottom-sheet
   ═══════════════════════════════════════════════════════════════════ */

/* mini-player flutuante (só mobile) */
.miniplayer{position:fixed;left:8px;right:8px;bottom:calc(var(--tab-h) + env(safe-area-inset-bottom) + 22px);z-index:55;
  display:flex;align-items:center;overflow:hidden;border-radius:14px;
  background:rgba(20,20,22,.94);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);
  border:1px solid rgba(255,255,255,.08);box-shadow:0 14px 34px -14px rgba(0,0,0,.75);
  animation:sheetUp .42s var(--ease) both}
@media(min-width:768px){.miniplayer{display:none}}
.mini-main{display:flex;align-items:center;gap:11px;flex:1;min-width:0;padding:8px 6px 8px 8px}
.mini-cover{width:40px;height:52px;border-radius:8px;object-fit:cover;flex:none}
.mini-txt{flex:1;min-width:0}
.mini-txt b{display:block;font-size:13px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mini-txt span{display:block;font-size:11px;color:var(--muted);margin-top:1px}
.mini-play{width:34px;height:34px;flex:none;border-radius:999px;display:grid;place-items:center;color:#fff;
  background:linear-gradient(135deg,var(--primary),var(--primary-2))}
.mini-x{width:34px;align-self:stretch;border:0;background:transparent;color:var(--muted2);cursor:pointer;flex:none}
.mini-x:active{transform:scale(.9)}
.mini-prog{position:absolute;left:0;right:0;bottom:0;height:3px;background:rgba(255,255,255,.12)}
.mini-prog i{display:block;height:100%;background:linear-gradient(90deg,var(--primary),var(--primary-2))}

/* badges de status no card (Novo / Em alta) */
.mcard .flag{position:absolute;top:8px;left:8px;z-index:3;
  font-size:8.5px;font-weight:800;text-transform:uppercase;letter-spacing:.05em;color:#fff;
  padding:3px 8px;border-radius:999px;box-shadow:0 3px 10px -3px rgba(0,0,0,.5)}
.mcard .flag.new{background:linear-gradient(135deg,var(--primary),var(--primary-2))}
.mcard .flag.hot{background:linear-gradient(135deg,#ff8a1e,#ff4d1c)}
.mcard.ranked .flag{left:38px}

/* bottom-sheet reutilizável (abre via [data-sheet] -> #id) */
.sheet{position:fixed;inset:0;z-index:90;display:none}
.sheet:target,.sheet.is-open{display:block}
.sheet-veil{position:absolute;inset:0;background:rgba(0,0,0,.6);
  -webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}
.sheet:target .sheet-veil,.sheet.is-open .sheet-veil{animation:veilIn .25s ease both}
.sheet-box{position:absolute;left:0;right:0;bottom:0;
  background:var(--card);border-radius:22px 22px 0 0;padding:26px 18px calc(20px + env(safe-area-inset-bottom));
  max-height:88dvh;overflow-y:auto;box-shadow:0 -20px 50px -20px rgba(0,0,0,.7)}
.sheet:target .sheet-box,.sheet.is-open .sheet-box{animation:sheetUp .34s var(--ease) both}
.sheet-box::before{content:"";position:absolute;top:10px;left:50%;transform:translateX(-50%);
  width:40px;height:4px;border-radius:999px;background:rgba(255,255,255,.22)}
.sheet-box h3{font-family:'Poppins',sans-serif;font-size:17px;margin-bottom:14px}
@media(min-width:768px){
  .sheet{display:none!important}  /* sheet é padrão mobile; no desktop use modal */
}
/* ...menos no player: ali o bottom sheet e a UNICA saida do "Compartilhar" (nao ha
   modal de desktop pra ele) e o botao ficava MORTO de 768px pra cima. Volta so
   quando aberto e so no player; 0,3,1 com !important vence os 0,1,0 da regra acima.
   O #sheet-syn deixou de existir — o player usa a folha responsiva unificada.
   MEDIDO: abre em 820 e em 1280, caixa de 560px centrada e inteira na tela. */
body.is-player .sheet.is-open{display:block!important}
body.is-player .sheet-box{max-width:560px;margin-left:auto;margin-right:auto}
.sheet-x{position:absolute;top:12px;right:12px;width:34px;height:34px;border:0;border-radius:999px;
  background:rgba(255,255,255,.06);color:var(--muted);display:grid;place-items:center;cursor:pointer}
.sheet-x:active{transform:scale(.9)}
/* ═══════════════════════════════════════════════════════════════════
   HEADER estilo iDrama: selo VIP dourado, presente, tabs de conteúdo
   ═══════════════════════════════════════════════════════════════════ */
/* selo VIP: a imagem VIP REAL do iDrama (ic_vip_benefit) inteira */
.vip-benefit{display:inline-flex;align-items:center;flex:none;height:32px}
.vip-benefit img{height:32px;width:auto;object-fit:contain;display:block;filter:drop-shadow(0 2px 5px rgba(0,0,0,.4))}
/* presente REAL do iDrama — sem cápsula, o ícone já é colorido */
.gift-btn{width:38px;height:38px;display:grid;place-items:center;flex:none;background:transparent;border:0;
  transition:transform .18s var(--ease)}
.gift-btn:active{transform:scale(.88)}
.gift-ic{width:26px;height:26px;object-fit:contain;filter:drop-shadow(0 1px 3px rgba(0,0,0,.35))}

/* ═══════════ assinatura inline (planos → login → pagamento → PIX → pronto) ═══════════ */
.sub-sheet{position:fixed;inset:0;z-index:120;display:flex;align-items:flex-end;justify-content:center}
.sub-sheet[hidden]{display:none}
.ss-veil{position:absolute;inset:0;background:rgba(0,0,0,.72);animation:veilIn .2s ease both}
.ss-box{position:relative;z-index:1;width:100%;max-width:460px;max-height:92dvh;overflow-y:auto;scrollbar-width:none;
  background:var(--card);border-radius:22px 22px 0 0;
  /* padding-bottom ZERO na caixa: com a barra do botao em position:sticky
     bottom:0, o sticky para no fim do CONTEUDO e o padding-bottom fica DEPOIS
     dele — sobrava uma faixa embaixo da barra onde o formulario aparecia por
     baixo. O respiro passou pra cada passo (.ss-step), e o passo de pagar nao
     precisa dele porque a propria barra ja tem o dela. */
  /* --bleed = o padding lateral da caixa. O cabecalho em sangria devolve
     exatamente este valor em margem negativa; declarar o numero nos dois lugares
     ja deixou 4px de fresta do fundo escuro aparecendo no PC, porque o passo de
     planos usa 32px e os outros 28px. Com a variavel, mudar o padding acerta a
     sangria junto. */
  --bleed:20px;
  padding:24px var(--bleed) 0;
  box-shadow:0 -20px 60px -20px rgba(0,0,0,.9);animation:sheetUp .3s var(--ease) both}
@media(min-width:560px){
  .sub-sheet{align-items:center}
  .ss-box{border-radius:18px;max-height:88dvh;animation:iosPop .24s ease both}
}
/* CELULAR: o modal premium ocupa a tela TODA; como o box cobre o véu, só o X
   fecha. Os passos ficam centralizados na vertical (não "descem" a tela ao trocar). */
@media(max-width:559px){
  .sub-sheet{align-items:stretch}
  /* height:100dvh dentro de um pai position:fixed sao DUAS alturas diferentes:
     no iOS com as barras recolhidas o dvh cresce ate ~75px a mais que o pai, a
     caixa transborda o .sub-sheet (que nao tem overflow) e esses 75px ficam fora
     da tela E fora da rolagem — e o que mora ali embaixo e justamente o botao e
     o "Site seguro". Com align-items:stretch o pai ja da a altura certa.
     E o padding-bottom sai da caixa e vai pro .ss-steps: padding de container de
     rolagem e descartado da regiao rolavel no WebKit. */
  .ss-box{max-width:100%;width:100%;height:auto;max-height:none;border-radius:0;animation:none;
    display:flex;flex-direction:column;padding-bottom:0}   /* --bleed herdado: 20px */
  /* O cabecalho era ESMAGADO. Em flex-column os filhos sao .ss-vhead e
     .ss-steps; .ss-steps tem flex:0 0 auto e o .ss-vhead herda flex:0 1 auto,
     entao TODA a reducao caia nele — sobrava uma tarja com o nome dela cortado
     fora. Era o "cortando" literal. */
  .ss-vhead{flex:none}
  /* UMA ROLAGEM SO, a da caixa inteira.
     Antes o .ss-steps era um segundo scroller com `justify-content:safe center`.
     Dois efeitos ruins: o cartao de plano era CORTADO NO MEIO pela borda
     invisivel do container (o dono viu "cortando o cabecalho do plano"), e num
     passo curto o conteudo era centralizado, deixando um vao enorme embaixo da
     coroa. Com uma rolagem so, a coroa sai de cena naturalmente e nada e
     fatiado. */
  .ss-steps{flex:0 0 auto;display:block;overflow:visible;min-height:0}
  /* O X era absolute DENTRO do proprio scroller, entao rolava junto: assim que
     ela rolava pra digitar o cartao nao existia mais X na tela. O veu nao fecha
     de proposito e Escape nao existe no celular — a saida sumia. Aqui a caixa e
     a tela inteira, entao fixed cai no mesmo lugar que o absolute caia. */
  .ss-x{position:fixed;background:rgba(0,0,0,.55);color:#fff}
}
/* mais horizontal no PC */
/* Coluna do FORMULARIO nao passa de ~520px. Estava 780px com 32px de padding =
   716px de linha util, e o formulario e de UMA coluna: cada campo virava uma
   faixa de 716x47px, o rotulo do resumo ficava num extremo com o preco 716px
   longe, e o botao dourado ia a 716px (.ss-box .vipx-cta{max-width:none} ganha
   de qualquer max-width por especificidade). Era a maior causa do "porco".
   O passo de PLANOS continua largo: la sao cartoes lado a lado. */
@media(min-width:900px){
  .ss-box{max-width:520px;--bleed:28px}
  .ss-box:has(.ss-step[data-step="plans"]:not([hidden])){max-width:780px;--bleed:32px}
}
/* sem a barra branca de rolagem (quebrava a harmonia) */
.ss-box::-webkit-scrollbar{display:none}
/* No PLAYER, o paywall de planos ocupa o LUGAR do vídeo (coluna de 500px, altura
   cheia) em vez de subir como bottom sheet flutuante. */
body.is-player .sub-sheet{align-items:stretch}
body.is-player .ss-veil{display:none}
body.is-player .ss-box{max-width:500px;width:100%;height:100dvh;max-height:100dvh;
  border-radius:0;margin:0 auto;animation:none;box-shadow:0 0 0 100vmax rgba(0,0,0,.82)}
/* Passos CURTOS (pronto / em análise) não devem esticar até 100dvh — o resto virava
   uma faixa preta enorme embaixo do botão. Dimensiona pelo conteúdo e centraliza. */
body.is-player .ss-box:has(.ss-step[data-step="done"]:not([hidden])),
body.is-player .ss-box:has(.ss-step[data-step="pending"]:not([hidden])){
  height:auto;max-height:92dvh;align-self:center;border-radius:22px}
/* títulos e resumo dos passos internos */
.ss-steptitle{font-family:'Poppins',sans-serif;font-size:18px;text-align:center;margin:0 0 4px;color:#fff}
/* O titulo do passo de pagar estava espremido: 4px de margem embaixo, colado no
   cartao dourado, e encostado na tarja do logo em cima. Titulo sem ar nenhum le
   como legenda do que vem depois, nao como titulo da tela. Aqui ele ganha o
   dobro de respiro embaixo do que em cima — a distancia menor amarra ele ao
   logo (mesma unidade de cabecalho) e a maior separa do cartao, que e outro
   assunto. */
/* Agora ele mora ENTRE o cartao do pedido e o formulario: mais ar em cima, pra
   separar do cartao (outro assunto), e pouco embaixo, porque o que vem logo
   depois e' o "Seus dados" que ele apresenta. */
.ss-box .ss-step[data-step="pay"] > .ss-steptitle{
  font-size:19px;letter-spacing:-.01em;margin:24px 0 6px}
@media(max-height:720px){
  .ss-box .ss-step[data-step="pay"] > .ss-steptitle{font-size:17px;margin:18px 0 4px}
}
.ss-stepsub{font-size:13px;color:var(--muted);text-align:center;margin:0 0 16px}
/* Grid, nao flex: com space-between e um rotulo de plano longo o preco era
   empurrado pra segunda linha e a frase pra terceira — resumo de tres linhas com
   o preco no meio. E o -4px do .ss-sumsub brigava com o gap, que valia pras duas
   direcoes. Em grid nada disso depende do tamanho do texto.

   O FUNDO e o mesmo cartao dourado do perfil (.prof-sub, vip-card-bg.webp): a
   cliente ja conhece essa peca de dentro do app, entao ela chega aqui com cara
   de coisa da casa em vez de retangulo generico. Antes era um rgba(230,180,90,.08)
   chapado com borda de 1px — plano, sem material nenhum, e no meio de uma folha
   escura o unico bloco claro e' justamente o que a gente quer que ela olhe: o
   preco. Texto em marrom escuro, como no perfil: dourado sobre creme nao tem
   contraste. */
/* RESUMO DO TOPO: pequeno e escuro. Ele ja foi o cartao creme grande, com os
   cinco beneficios dentro, ocupando meia tela antes de a cliente digitar
   qualquer coisa. Agora carrega so o que ela precisa CONFERIR — plano, preco e
   a saida pra trocar — numa faixa dourada translucida, do peso de um cabecalho.
   O cartao creme com as capas nao morreu: virou o .ss-benescard, no fim da
   tela, com o que ela esta levando. */
/* RESUMO DO TOPO: o MESMO cartao creme com as capas, so que compacto.
   Encolher ele nao era motivo pra trocar o material — quando eu troquei o fundo
   por uma faixa dourada translucida, o cartao perdeu a identidade que ele tinha
   e virou mais uma caixa escura no meio de outras.
   O que saiu daqui foram os cinco beneficios, que desceram pro .ss-benescard no
   fim da tela. Isto aqui carrega so plano, preco e a saida pra trocar.
   Veu HORIZONTAL: creme cheio a esquerda, onde mora o texto, e quase
   transparente a direita, onde as capas aparecem. */
.ss-summary{display:grid;grid-template-columns:1fr auto;align-items:start;gap:6px 14px;
  position:relative;overflow:hidden;
  margin:0 0 4px;padding:15px 17px;border-radius:16px;border:0;
  background:linear-gradient(100deg,#f6e7c4 0%,rgba(244,227,189,.97) 26%,rgba(240,216,168,.72) 52%,rgba(232,200,140,.42) 78%,rgba(226,192,128,.34) 100%),
             url(../img/ui/vip-covers-bg.webp) right center/cover no-repeat,
             #f0dcb0;
  box-shadow:0 8px 26px -18px rgba(0,0,0,.9)}
/* cada coluna e uma pilha propria: o texto encosta no numero que ele explica */
.ss-sumL{grid-column:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.ss-sumR{grid-column:2;justify-self:end;display:flex;flex-direction:column;align-items:flex-end;gap:1px}
/* marrom: o cartao e creme. Ja esteve branco por um momento em que o fundo era
   escuro — se o fundo mudar de novo, esta cor muda junto. */
.ss-summary span[data-ss-sumlabel]{font-size:14px;font-weight:700;color:#5a3a12}
.ss-summary b{font-size:20px;font-weight:800;color:#4e320f;white-space:nowrap;line-height:1.15}
/* O mensal equivalente, encostado embaixo do valor cobrado — os dois se leem
   juntos: "R$ 44,70" e, logo abaixo, "R$ 14,90/mes". Vazio no mensal e no
   vitalicio, e ai o :empty tira ele da pilha. */
/* peso 600, nao 800: em negrito cheio ele competia com o valor cobrado logo
   acima (que e 800/21px) e os dois numeros brigavam pela mesma atencao. Mais
   leve, ele vira apoio — que e o papel dele. */
.ss-sumpm{font-style:normal;font-size:12.5px;font-weight:600;color:#6a4a1e;white-space:nowrap}
.ss-sumpm:empty{display:none}
/* a frase de cobranca fica colada no nome do plano, nao uma linha inteira abaixo */
.ss-sumsub{font-size:12.5px;font-weight:600;color:#6a4a1e;line-height:1.35}
.ss-sumsub:empty{display:none}
/* Os cinco beneficios, dentro do cartao dourado. Coluna unica: "Tudo liberado
   sem limites" mede ~140px a 12px e em duas colunas de 152px ele quebraria — e
   lista de beneficio com linha quebrada no meio le mal. A linha de cima separa
   o "o que custa" do "o que voce leva". */
/* ── O QUE ELA ESTA LEVANDO, no fim da tela ─────────────────────────────────
   E o cartao creme com as capas, que antes embrulhava o resumo inteiro. Veu
   HORIZONTAL: creme cheio a esquerda, onde mora o texto, e quase transparente a
   direita, onde as capas aparecem. Sem veu, o `cover` numa caixa alta amplia a
   imagem e as capas ficam legiveis POR BAIXO do texto; com veu uniforme, elas
   somem. O horizontal resolve os dois. */
.ss-benescard{margin:26px 0 0;padding:18px 20px;border-radius:20px;overflow:hidden;
  background:linear-gradient(100deg,#f6e7c4 0%,rgba(244,227,189,.97) 26%,rgba(240,216,168,.72) 52%,rgba(232,200,140,.42) 78%,rgba(226,192,128,.34) 100%),
             url(../img/ui/vip-covers-bg.webp) right center/cover no-repeat,
             #f0dcb0;
  box-shadow:0 10px 34px -20px rgba(0,0,0,.9)}
.ss-sumben{list-style:none;display:flex;flex-direction:column;gap:10px;margin:0;padding:0;border:0}
.ss-sumben li{display:flex;align-items:center;gap:10px;
  font-size:12.5px;font-weight:600;color:#6a4a1e;line-height:1.3}
/* Idem no cartao do checkout: so o glifo, no marrom do proprio cartao. */
.ss-sumben-ic{flex:none;display:grid;place-items:center;width:22px;height:22px;color:#7a5520}
.ss-sumben-ic .msym{font-size:19px}

/* A saida pra trocar de plano fica COLADA no preco, que e onde a duvida
   acontece. A seta .ss-back ficava absolute em cima do cabecalho: ocupava
   x 12..44 enquanto o nome dela comeca em x=36 — a primeira letra ficava ATRAS
   dela —, e era cinza sobre a foto, quase invisivel. */
.ss-sumback{grid-column:1/-1;justify-self:start;display:inline-flex;align-items:center;gap:5px;
  border:0;background:none;padding:6px 0 0;margin:0;cursor:pointer;
  font-size:12.5px;font-weight:700;color:#6a4a1e;text-decoration:underline;text-underline-offset:3px}
.ss-sumback .msym{font-size:15px}
.ss-sumback:active{opacity:.65}
.ss-x{position:absolute;top:12px;right:12px;z-index:2;width:32px;height:32px;border:0;border-radius:50%;
  background:rgba(255,255,255,.08);color:var(--muted);display:grid;place-items:center;cursor:pointer}
.ss-back{position:absolute;top:12px;left:12px;z-index:2;width:32px;height:32px;border:0;border-radius:50%;
  background:transparent;color:var(--muted);display:grid;place-items:center;cursor:pointer}
.ss-x:active,.ss-back:active{transform:scale(.9)}

.ss-crown{display:grid;place-items:center;width:52px;height:52px;margin:6px auto 10px;border-radius:50%;
  background:linear-gradient(135deg,var(--premium),#e0952b);color:#3a2400}
.ss-title{font-family:'Poppins',sans-serif;font-size:19px;text-align:center;margin:0 0 4px}
.ss-sub{font-size:13px;color:var(--muted);text-align:center;margin:0 0 16px}

.ss-plans{display:flex;flex-direction:column;gap:10px;margin-bottom:14px}
.ss-plan{position:relative;display:flex;align-items:center;gap:10px;padding:14px;border-radius:14px;
  border:2px solid var(--line);background:rgba(255,255,255,.03);cursor:pointer;transition:border-color .15s,background .15s}
.ss-plan input{position:absolute;opacity:0;pointer-events:none}
.ss-plan.best,.ss-plan:has(input:checked){border-color:var(--primary);background:rgba(255,117,168,.08)}
.ss-plan-main{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}
.ss-plan-main b{font-size:15px}
.ss-plan-main span{font-size:12px;color:var(--muted)}
.ss-plan-price{font-size:17px;font-weight:800;white-space:nowrap}
.ss-tag{position:absolute;top:-9px;left:14px;background:var(--primary);color:#fff;font-size:10px;font-weight:700;
  padding:2px 8px;border-radius:999px;text-transform:uppercase;letter-spacing:.03em}
.ss-off{background:rgba(52,199,89,.16);color:#34c759;font-size:11px;font-weight:700;padding:2px 7px;border-radius:6px}

.ss-perks{list-style:none;display:flex;flex-direction:column;gap:7px;margin:0 0 16px;padding:0}
.ss-perks li{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--muted)}
.ss-perks li .ico,.ss-perks li svg{color:var(--primary);flex:none}

/* flex-wrap e nowrap por padrao, entao o cadeado e o texto ficavam no MESMO
   item e so o texto quebrava por dentro: com duas linhas, o align-items:center
   deixava o cadeado flutuando ENTRE elas, alinhado com nada. Somado ao contraste
   de 3,5:1, era a ultima coisa que ela lia antes de pagar e a pior escrita da
   tela. */
.ss-foot{display:flex;align-items:flex-start;justify-content:center;gap:7px;
  font-size:12px;line-height:1.45;text-align:left;color:#8a8a8a;
  max-width:38ch;margin:12px auto 0}
.ss-foot .msym{margin-top:1px}

.ss-err{background:rgba(255,69,58,.12);color:#ff6b6b;font-size:13px;padding:10px 12px;border-radius:10px;margin-bottom:12px}
.ss-err[hidden]{display:none}

/* LISTA VERTICAL, uma linha por metodo — nao duas pilulas 50/50. Duas pilulas
   iguais comunicam "tanto faz", e o cartao e o metodo principal. Alem disso, em
   320px cada pilula ficava com 116px de conteudo contra os ~126px de "Cartao de
   credito": quebrava em duas linhas e as alturas ficavam diferentes.
   E o mesmo .pay-opt da /pagamento, que ele ja aprovou. Os subtitulos sairam:
   "Da para parcelar" ele mandou tirar, e deixar so o do PIX daria ao PIX duas
   linhas de argumento contra uma do cartao. Quanto parcela quem diz e o select,
   com numero de verdade. */
/* margin-top maior por causa do selo "Mais escolhido": ele sobe 9px acima do
   botao, e com 8px de folga encostava no titulo da secao. */
.ss-methods{display:flex;flex-direction:column;gap:8px;margin:18px 0 14px}
/* ── ABAS de pagamento (PIX | Cartão) — nada marcado até o cliente clicar ──── */
.ss-tabs{flex-direction:row;gap:8px;margin:18px 0 12px}
.ss-tab{flex:1 1 0;min-width:0;justify-content:center;text-align:center;min-height:52px;border-radius:14px}
.ss-tab b{flex:0 1 auto;justify-content:center;gap:8px}
.ss-tab::after{display:none}   /* aba não tem o círculo de rádio do .ss-method */
.ss-tab.on{border-color:#e6b45a;background:rgba(230,180,90,.14);box-shadow:inset 0 0 0 1px rgba(230,180,90,.5)}
/* ── "ME CLICA" ──────────────────────────────────────────────────────────────
   Enquanto NENHUMA aba está escolhida, as duas pulsam com um brilho dourado e um
   leve zoom, pra deixar óbvio que precisam ser tocadas. No instante em que uma é
   selecionada (.on), o :has para a animação nas duas — a pessoa já entendeu. A 2ª
   aba entra defasada pra alternar (dá ritmo em vez de piscar junto). */
@keyframes ssTabPulse{
  0%,100%{transform:scale(1);box-shadow:0 0 0 0 rgba(230,180,90,0)}
  50%{transform:scale(1.035);box-shadow:0 0 16px 2px rgba(230,180,90,.34),inset 0 0 0 1px rgba(230,180,90,.45)}
}
.ss-tabs .ss-tab{animation:ssTabPulse 1.7s ease-in-out infinite}
.ss-tabs .ss-tab:nth-child(2){animation-delay:.85s}
.ss-tabs:has(.ss-tab.on) .ss-tab,
.ss-tabs.ss-chosen .ss-tab{animation:none}   /* escolheu uma: para tudo (.ss-chosen = fallback JS p/ sem :has) */
@media (prefers-reduced-motion:reduce){ .ss-tabs .ss-tab{animation:none} }
.ss-pixbox{margin:2px 0 10px}
/* CLIP: nada (preço/plano/barra) vaza horizontalmente pra fora do modal */
.ss-box{overflow-x:hidden}
/* ── passo de LOGIN dentro do checkout (Google | e-mail) ──────────────────── */
.ss-authstep .btn-google{width:100%}
.ss-authstep .modal-or{margin:16px 0}
.ss-authstep .vipx-cta{margin-top:8px}
.ss-authstep .ss-sumback{margin:14px auto 0;display:flex;color:#fff}   /* flecha + "trocar plano" BRANCO */
.ss-authstep .ss-sumback svg{color:#fff;stroke:currentColor}
/* MATA o fundo branco/amarelo do autofill do Chrome nos campos do modal */
.ss-box .input:-webkit-autofill,
.ss-box .input:-webkit-autofill:hover,
.ss-box .input:-webkit-autofill:focus{
  -webkit-box-shadow:0 0 0 1000px var(--card2) inset;
  -webkit-text-fill-color:var(--txt);
  caret-color:var(--txt);
  transition:background-color 9999s ease-out 0s;
}
.ss-method{position:relative;width:100%;display:flex;align-items:center;gap:12px;text-align:left;min-height:56px;
  padding:12px 14px;border-radius:14px;border:1px solid var(--line);background:var(--card2);
  color:var(--txt);font-size:14px;font-weight:600;cursor:pointer;
  transition:border-color .15s,background .15s}
.ss-method b{flex:1;min-width:0;display:flex;align-items:center;gap:10px;font-size:14.5px;font-weight:700}
.ss-method::after{content:"";flex:none;width:20px;height:20px;border-radius:999px;
  border:2px solid var(--line2);transition:border-color .15s,box-shadow .15s}
/* ── O DOURADO E A UNICA COR DE "ATIVO" NO FLUXO ─────────────────────────────
   O metodo escolhido vinha com borda ROSA e fundo rosado — uma segunda cor de
   estado no meio de uma tela que ja usa dourado pra tudo que esta ativo (o
   cartao de plano escolhido, o botao, o selo). Duas cores de "ligado" na mesma
   tela nao dobram o destaque, dividem ele: o olho passa a procurar dois
   significados onde so existe um.
   Os dois botoes tem exatamente o mesmo tratamento — o que muda e so o estado:
   fundo um tom acima, borda dourada fina e o radio preenchido de dourado. */
.ss-method.on{border-color:rgba(230,180,90,.55);background:rgba(255,255,255,.04)}
.ss-method.on::after{border-color:#e6b45a;box-shadow:inset 0 0 0 4px #e6b45a}
.ss-method:focus-visible{outline:2px solid #e6b45a;outline-offset:2px}
/* ── ACORDEAO ────────────────────────────────────────────────────────────────
   O painel do cartao mora DENTRO do seletor, entre a linha do cartao e a do
   PIX, e se funde com a linha que o comanda: mesma borda rosa, sem costura no
   meio. Sem isto ele parecia um bloco solto, sem dono, e o PIX ficava espremido
   entre a escolha e os campos dela.
   O :has() e o mesmo recurso ja usado no arquivo. Onde ele nao existir, o
   painel so fica como um bloco proprio logo abaixo — que continua legivel. */
/* border-top:0 e box-shadow:none, nao "transparente": a borda transparente de
   1px deixava o fundo da pagina passar entre a nota e o painel, e o inset claro
   herdado do .ss-cardbox desenhava um risco por cima disso. Os dois juntos eram
   a emenda que aparecia no meio da caixa. */
/* -9px cancela o gap:8px do .ss-methods e sobrepoe 1px, pra a borda do painel
   e a do botao virarem uma linha so. */
.ss-methods > .ss-cardbox{margin:-9px 0 0;border-radius:0 0 14px 14px;
  border:1px solid rgba(230,180,90,.55);border-top:0;box-shadow:none;
  background:linear-gradient(to bottom,rgba(255,255,255,.04),transparent 120px),var(--card2)}
/* so o cartao continua na caixa (o painel dos campos vem logo abaixo); o PIX
   fecha no proprio botao */
.ss-method.on:has(+ .ss-cardbox:not([hidden])){
  border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom-color:transparent}
/* a linha do cartao e o painel viram uma peca so: o PIX respira longe dela */
.ss-methods > .ss-cardbox:not([hidden]){margin-bottom:9px}

/* O .ss-cardbox nao tinha ESTILO NENHUM: os quatro campos do cartao apareciam
   iguaizinhos aos quatro de "Seus dados" logo acima, sem nenhuma fronteira. Oito
   caixas identicas empilhadas viram uma parede, e e dai que vem o "generico".
   Vira painel; o input inverte o fundo pra nao sumir dentro dele. */
.ss-cardbox{margin:2px 0 4px;padding:16px 14px 4px;border-radius:16px;
  background:var(--card2);border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.03)}
.ss-cardbox .input{background:var(--card)}
@media(min-width:900px){.ss-cardbox{padding:20px 18px 6px}}

/* Validade e codigo dividem a linha em 50/50. Um campo de 120px sozinho numa
   linha de 420px era o que fazia a tela parecer inacabada, e em 50/50 o codigo
   deixa de parecer opcional.
   minmax(0,1fr) e obrigatorio: 1fr e minmax(auto,1fr), e cai na MESMA armadilha
   de min-content que estourava a linha da validade antiga — input e flex/grid
   item nasce com largura intrinseca de ~180px e a linha pedia 370px em 320px de
   tela, com a barra de rolagem escondida, entao ela via o campo cortado sem
   nenhuma pista de que dava pra rolar. */
.ss-row2{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;align-items:start}
.ss-row2 .field{margin-bottom:0;min-width:0}
.ss-row2 .input{min-width:0;width:100%;max-width:none}

/* Bandeiras na linha do ROTULO do numero. Ficavam no rodape do formulario,
   depois das parcelas: respondiam "meu cartao serve?" trinta segundos depois de
   ela perguntar, e gastavam ~60px. Fora do input de proposito — por dentro
   exigiria padding-right e os 19 digitos de um Elo passariam por baixo do logo,
   que e mais coisa cortando. */
.ss-lblrow{display:flex;align-items:center;justify-content:space-between;gap:8px}
.ss-brandrow{flex:none;flex-wrap:nowrap;gap:3px;margin:0}
.ss-brandrow .pay-brand{box-shadow:none;border-radius:3px;opacity:.85;transition:opacity .18s}
.ss-brandrow .pay-brand svg{width:23px;height:15px}
@media(max-width:359px){.ss-brandrow .pay-brand svg{width:20px;height:13px}}
/* Antes de reconhecer, as cinco acesas dizem "aceitamos estas". A partir do 6o
   digito a dela acende e as outras apagam — a unica confirmacao em tempo real de
   que o site entendeu o cartao, e ela acontece enquanto a cliente digita. */
.ss-brandrow[data-brand] .pay-brand{opacity:.18}
.ss-brandrow[data-brand="visa"]   [data-b="visa"],
.ss-brandrow[data-brand="master"] [data-b="master"],
.ss-brandrow[data-brand="elo"]    [data-b="elo"],
.ss-brandrow[data-brand="amex"]   [data-b="amex"],
.ss-brandrow[data-brand="hiper"]  [data-b="hiper"],
.ss-brandrow[data-brand="diners"] [data-b="diners"]{opacity:1}
@media(prefers-reduced-motion:reduce){.ss-brandrow .pay-brand{transition:none}}
.ss-box .pay-brands-lbl{display:none}

/* Bandeira do pais + DDI dentro da MESMA borda do campo. Nao da pra fazer no
   proprio .field, que e flex-direction:column e empilharia a bandeira ACIMA do
   input. A borda migra pro grupo, entao o .input.err (que so pinta borda)
   pararia de aparecer: dai o :has() no grupo E o fundo avermelhado no proprio
   input, que funciona ate onde o :has() nao chegar. */
.ss-ig{display:flex;align-items:stretch;min-height:48px;
  background:var(--card2);border:1px solid var(--line);border-radius:var(--radius);
  transition:border-color .15s}
.ss-ig:focus-within{outline:2px solid #e6b45a;outline-offset:1px;border-color:transparent}
.ss-ig:has(.input.err){border-color:#ff6b6b}
.ss-ig-cc{flex:none;display:flex;align-items:center;gap:7px;padding:0 11px 0 13px;
  font-size:14px;font-weight:600;color:var(--muted);
  border-right:1px solid var(--line);user-select:none;white-space:nowrap}
.ss-ig-cc .flag{border-radius:3px;flex:none}
.ss-ig .input{border:0;background:transparent;border-radius:0 var(--radius) var(--radius) 0;padding-left:12px}
.ss-ig .input:focus{outline:none}
.ss-ig .input.err{background:rgba(255,69,58,.06)}
.ss-cardbox .ss-ig{background:var(--card)}

/* Barra do botao presa no rodape. Com o cartao aberto o passo tem ~1000px de
   conteudo e num iPhone SE com o teclado aberto sobram ~300px visiveis: o botao
   dourado nunca aparecia junto com o campo que ela esta preenchendo. Sticky
   funciona sem truque porque quem rola aqui e a propria .ss-box. As margens
   negativas batem com o padding lateral da caixa. O degrade curto e o que da a
   sensacao premium: o conteudo passa POR TRAS da barra em vez de bater numa
   borda dura. rgba(18,18,18,0) e o --card transparente — degrade pra
   "transparent" acinzenta no Safari. */
/* o respiro do fim da caixa mora em cada passo; o de pagar tem a barra */
.ss-step{padding-bottom:calc(22px + env(safe-area-inset-bottom))}
.ss-step[data-step="pay"]{padding-bottom:0}
/* SEM FLUTUAR. Isto ja foi position:sticky bottom:0 pra o botao estar sempre a
   mao. O efeito colateral matava a tela: a barra cobria a FORMA DE PAGAMENTO
   inteira, entao logo depois do CPF a cliente via o botao dourado e nenhum campo
   de cartao — e clicava nele achando que era "proximo passo". Botao de pagar
   visivel antes de existir o que pagar so produz clique errado.
   Agora ele fica no fim do formulario, onde o trabalho termina. */
.ss-paybar{margin:22px 0 0;padding:0}
/* ── O APOIO DO METODO: SO TEXTO ─────────────────────────────────────────────
   Historico, pra ninguem refazer o caminho: ja foi paragrafo no rodape, ja foi
   par de badges com icone dourado, ja foi faixa DENTRO da caixa do metodo com
   filete, e ja foi caixa com borda e icone em capsula. Cada versao acrescentava
   um enfeite, e o enfeite pedia atencao que a frase nao precisa — ela e um
   aviso de duas linhas sobre cobranca, nao um componente.
   Sobrou o que importa: uma linha quieta, alinhada com os campos. */
.ss-renew{margin:2px 0 16px;font-size:12.5px;line-height:1.45;
  color:var(--muted);text-align:left}
.ss-renew:empty,.ss-renew[hidden]{display:none}
/* o campo focado nao pode encostar na borda quando o teclado abre */
.ss-box .input,.ss-box select.input{scroll-margin-bottom:24px;scroll-margin-top:16px}

.ss-pixstep{text-align:center}
.ss-pixamount{font-size:14px;color:var(--muted);margin:0 0 14px}
.ss-pixamount b{font-size:20px;color:#e6b45a;margin-left:4px}
/* os três passos até o app do banco, numerados */
.ss-pixhow{counter-reset:pix;list-style:none;text-align:left;margin:0 0 16px;padding:0;
  display:flex;flex-direction:column;gap:10px}
.ss-pixhow li{counter-increment:pix;position:relative;padding-left:32px;font-size:13.5px;line-height:1.45;color:var(--txt)}
.ss-pixhow li::before{content:counter(pix);position:absolute;left:0;top:-1px;width:22px;height:22px;border-radius:50%;
  display:grid;place-items:center;font-size:12px;font-weight:800;
  background:rgba(230,180,90,.16);color:#e6b45a}
.ss-pixback{font-size:12.5px;color:var(--muted);margin:12px 0 0}
.ss-pixqr{margin-top:16px;border-top:1px solid var(--line);padding-top:14px}
.ss-pixqr-hint{font-size:12px;color:var(--muted2);margin:0 0 8px;text-align:center}
.ss-qr{display:block;margin:0 auto;border-radius:12px;background:#fff;padding:8px}
.ss-qr[hidden]{display:none}
/* box do codigo PIX + o botao dourado de copiar logo abaixo dela */
.ss-pixcode-field{margin-top:14px;text-align:left}
.ss-pixcode-field label{display:block;font-size:12px;color:var(--muted);margin:0 0 6px}
.ss-pixstep .vipx-cta{margin-top:12px}
.ss-status{display:flex;align-items:center;justify-content:center;gap:8px;font-size:13px;color:var(--muted);margin-top:12px}
.ss-spin{width:15px;height:15px;border:2px solid rgba(255,255,255,.25);border-top-color:var(--primary);
  border-radius:50%;animation:ssSpin .8s linear infinite;flex:none}
@keyframes ssSpin{to{transform:rotate(360deg)}}

.ss-done{text-align:center;padding:14px 0}
.ss-check{display:grid;place-items:center;width:66px;height:66px;margin:6px auto 14px;border-radius:50%;
  background:rgba(52,199,89,.15);color:#34c759}
/* cartão em análise: âmbar, não verde — não está aprovado ainda */
.ss-clock{background:rgba(230,180,90,.15);color:#e6b45a}

body.ss-open{overflow:hidden}
/* scroll-lock robusto p/ iOS (só entra na página do player, via app-fx.js): o
   overflow:hidden acima o iPhone ignora no toque; position:fixed segura de verdade.
   O top:-scrollY é setado inline pelo JS e o scroll é restaurado ao soltar. */
body.ss-lock{position:fixed;left:0;right:0;width:100%}

/* tabs de conteúdo (Popular · Novos · Categoria · Trending) */
.ctabs{display:flex;gap:22px;align-items:center;justify-content:center;overflow-x:auto;scrollbar-width:none;padding:2px 0}
.ctabs::-webkit-scrollbar{display:none}
.ctab{position:relative;flex:none;font-size:17px;font-weight:700;color:var(--muted2);
  padding:8px 0;letter-spacing:-.01em;transition:color .2s}
.ctab:hover{color:var(--muted)}
.ctab.on{color:var(--txt)}
/* underline curto, centralizado embaixo da palavra ativa (como o iDrama) */
.ctab.on::after{content:"";position:absolute;left:50%;transform:translateX(-50%);bottom:0;
  width:24px;height:3px;border-radius:999px;background:linear-gradient(90deg,var(--primary),var(--primary-2))}
@media(min-width:640px){.ctab{font-size:19px}}
/* no desktop/tablet as tabs centralizam (no celular rolam à esquerda) */
@media(min-width:768px){.ctabs{justify-content:center;gap:40px}}

/* ═══════════ player em 3 colunas no PC (nav | vídeo | info + ações) ═══════════
   No celular os wrappers "somem" (display:contents) e o layout fica idêntico ao
   de antes: vídeo em tela cheia com a UI sobreposta. Só no PC (≥1024) vira o
   layout de 3 colunas: a navegação do site à esquerda, o vídeo no centro e a
   série (título, sinopse) + ações (curtir, salvar, compartilhar) à direita. */
.vp-nav{display:none}
.vp-nav-related{display:none}          /* só aparece no desktop (coluna esquerda) */
body.is-player{overflow-x:hidden}      /* mata a barra branca (scroll horizontal) */

/* Barras de rolagem no TEMA ESCURO (o padrão do Windows/Chrome é branco e destoa
   do site inteiro). Vale pra tudo — colunas do player, sheets, listas. */
*{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.18) transparent}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:9px}
::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.32)}
.vp-stage,.vp-frame,.vp-rail{display:contents}
.vp-syn-full{display:none}   /* sinopse completa: so no PC (ver media 1024px abaixo) */

@media(min-width:1024px){
  body.is-player main{max-width:none;margin:0}          /* o player usa a tela toda */
  /* 3 colunas CENTRALIZADAS: ESQUERDA (nav + "Você também vai gostar") | vídeo |
     trilha (título, ações, episódios). Larguras somam ~1260px pra caber em laptop
     (1280) sem scroll horizontal; a coluna do vídeo encolhe antes disso. */
  .vplayer{display:grid;grid-template-columns:280px minmax(0,600px) 380px;justify-content:center;
           height:100dvh;overflow:hidden;background:#0a0a0c}
  /* No desktop o "Você também vai gostar" vai pra ESQUERDA (abaixo do menu); a cópia
     da trilha some. No mobile é o contrário (a nav esconde, some a da esquerda). */
  .vp-rail-related{display:none}
  .vp-nav-related{display:block;margin-top:22px}
  .vp-nr-h{font-size:14px;font-weight:800;margin:0 0 12px;color:#fff}
  .vp-nr-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
  .vp-nr-grid .mcard h3{font-size:11px;-webkit-line-clamp:2}
  .vp-syn-m{display:none}                                  /* no PC nao usa "ver mais" */
  .vp-syn-full{display:block;font-size:13.5px;line-height:1.6;color:rgba(255,255,255,.82);margin-top:10px;max-height:44vh;overflow:auto}

  /* ── coluna 1: nav lateral (o "header" do site em coluna) ── */
  .vp-nav{display:flex;flex-direction:column;padding:22px 14px;overflow-y:auto;overflow-x:hidden;border-right:1px solid rgba(255,255,255,.07)}
  .vp-nav-logo{margin:0 6px 22px;font-family:'Poppins',sans-serif;font-weight:800;font-size:18px;color:#fff}
  .vp-nav-logo b{color:var(--primary)}
  .vp-nav-logo img{height:34px;width:auto;display:block;filter:brightness(1.3)}
  .vp-nav-links{display:flex;flex-direction:column;gap:4px}
  .vp-nav-links a{display:flex;align-items:center;gap:13px;padding:12px;border-radius:10px;color:var(--muted);font-size:14px;font-weight:600;transition:background .15s,color .15s}
  .vp-nav-links a:hover{background:rgba(255,255,255,.06);color:#fff}
  .vp-nav-links a .ico,.vp-nav-links a svg{flex:none}

  /* ── coluna 2: palco, centraliza o "aparelho" do vídeo (9:16) ── */
  /* MEDIDO em 1024/1100/1200/1280: o .vp-frame e display:contents (linha ~1625) em
     TODA largura e este bloco nunca devolvia `display` — a regra do "aparelho 9:16"
     que morava aqui NUNCA pintou nada, e o video ficava numa coluna preta de 100dvh
     (650x900 a 1280) com a setinha de voltar boiando na tarja ACIMA da imagem.
     Quem carrega video, controles e parede e o .vp-stage: a forma vai nele. MEDIDO
     depois: palco 315,24 479x852 e a setinha em 323,32 44x44 DENTRO do cartao.
     O par vh/dvh e proposital: navegador sem dvh descarta a 2a linha e fica com a 1a.
     NAO devolver `display` ao .vp-frame: o app-vplayer.js:232 escolhe o alvo da tela
     cheia por frameEl.getBoundingClientRect().width — com largura 0 ele cai no
     .vplayer, que e o comportamento de hoje. Dar caixa a ele trocaria esse alvo. */
  .vp-stage{display:block;position:relative;padding:0;min-width:0;
    justify-self:center;align-self:center;
    width:min(100%,calc(min(90vh,880px) * 9 / 16));
    width:min(100%,calc(min(100dvh - 48px,880px) * 9 / 16));
    height:auto;aspect-ratio:9/16;
    max-height:min(90vh,880px);
    max-height:min(100dvh - 48px,880px);
    border-radius:18px;overflow:hidden;background:#000;
    box-shadow:0 24px 70px -24px rgba(0,0,0,.85)}
  .vp-top{position:absolute;top:18px;left:18px;right:auto;width:auto;padding:0;z-index:30}

  /* ── coluna 3: trilho — info da série + ações, empilhados e roláveis ── */
  .vp-rail{display:flex;flex-direction:column;gap:22px;padding:30px 24px;overflow-y:auto;overflow-x:hidden;border-left:1px solid rgba(255,255,255,.07)}
  .vp-info{position:static;inset:auto;padding:0;gap:12px;align-items:flex-start}
  .vp-info .vp-title{font-size:22px;line-height:1.3;white-space:normal}
  .vp-info .vp-syn{font-size:14px;line-height:1.5}
  /* ── ações: coluna DENTRO do cartão, encostada na direita, igual ao celular ──
     Era `position:static` aqui. Só que dentro do .vp-stage tudo o que importa
     (#video, controles, parede) é ABSOLUTO, então a coluna caía no fluxo e ia
     parar no topo do cartão, atrás do vídeo — MEDIDO em 1440x900: x=395 y=24,
     invisível. Na prática o PC não tinha curtir, comentar, compartilhar nem TV;
     sobrava só o botão de favoritos no trilho da direita.
     Absoluta resolve, e de quebra o PC passa a ter a mesma coluna do celular —
     uma tela só pra aprender. O cartão tem overflow:hidden, então nada escapa. */
  .vp-side{position:absolute;right:14px;left:auto;top:auto;bottom:104px;z-index:12;
    flex-direction:column;flex-wrap:nowrap;gap:14px;align-items:center;justify-content:flex-end}
  .vp-side>*{flex:0 0 auto;min-width:44px}
  .vp-side .vp-actf{display:flex}
  .vp-side .vp-act-ic{width:44px;height:44px}
  .vp-side .vp-act-ic img{width:24px;height:24px}
  /* No PC o rótulo FICA: aqui sobra espaço, e ler "Comentários" é melhor que
     adivinhar o ícone. No celular ele sai (bloco de 1023) porque a coluna tapa
     a cena. */
  .vp-side .vp-act-n{font-size:10.5px}
  /* no PC os elementos do trilho não somem com o auto-ocultar (só os do vídeo) */
  .vplayer.vp-idle .vp-side,.vplayer.vp-idle .vp-info{opacity:1;visibility:visible;pointer-events:auto}
}

/* ═══════════ PAINEL FIXO de informacoes (abaixo do video, < 1024px) ═══════════
   O .vp-rail JA e essa coluna no PC (bloco acima). Abaixo de 1024 ele deixava de
   existir (display:contents, linha ~1625) e o .vp-info/.vp-side viravam sobreposicao
   em cima do video — dai o "ver mais" dividindo pixel com a timeline (MEDIDO: .vp-info
   em bottom:62px e .vp-progwrap de 44 a 68 = 6px de sobreposicao). Aqui o trilho vira
   o MESMO painel, empilhado embaixo do palco. Nada e duplicado: um .vp-info, um
   .vp-side, um [data-episodes] — o #sheet-syn saiu do movie.php.

   ORDEM: este bloco entra DEPOIS do @media(min-width:1024px) (sobrescreve 549, 550,
   605, 1625 e 1626, todas anteriores) e ANTES do bloco is-walled (~1855), que tem
   especificidade maior.

   ALTURA, nao so largura: quem encolhe o video e (min-height:560px). Celular DEITADO
   (844x390, 932x430) cai FORA dessa faixa e fica com o palco em 100svh — a geometria
   de hoje, pixel a pixel — com o painel abaixo da dobra, alcancavel rolando. MEDIDO
   em 844x390: palco 500x390 e a parede com os mesmos 6px de rolagem de hoje, com o
   botao do plano em 272,248 300x44 inteiro na tela.
   SEM aspect-ratio aqui: a altura e svh com o vh declarado na linha de cima —
   navegador que nao conhece svh degrada uns pontos percentuais, o player nunca some. */

/* O #conteudo tem `animation:pageIn .45s both` ate 900px (~linha 1175) e o estado final
   deixa `transform:matrix(1,0,0,1,0,0)` grudado no <main> — o que faz o <main> virar
   bloco-conteiner dos position:fixed que moram dentro dele. Enquanto o player media
   100dvh isso era inofensivo; com o painel o <main> passa a ~1045px e o bottom sheet do
   COMPARTILHAR nasce no fim da PAGINA, nao da tela (MEDIDO a 390: caixa em y=859..1045
   com a tela em 844 — 15px visiveis). Desligar a animacao SO no player devolve o sheet a
   viewport (MEDIDO: 658..844, inteiro na tela) e e exatamente o que quem usa
   prefers-reduced-motion ja tem hoje (~linha 1178). O #assinar e o #login ficam FORA do
   <main> (page.php 96 e 100), entao o checkout nunca dependeu disto. */
body.is-player #conteudo{animation:none}
.vp-panel{display:flex;flex-direction:column;gap:14px}
.vp-panel .syn-more{margin-top:0}
.vp-meta{margin:0;font-size:12px;color:var(--muted2)}
.vp-chips{display:flex;gap:8px;flex-wrap:wrap}
/* titulo e categoria deixaram de ser <button> que abria o sheet */
.vp-title{margin:0;cursor:default}
.vp-cat{cursor:default}
/* As grades do painel medem o CONTEINER, nao a janela. Sem isto o .grid herdaria os
   breakpoints de viewport (2/3/5 colunas, linhas ~362-364) dentro de um trilho de
   400px: 5 posteres de ~57px no PC. E a .ep-grid herdaria 8 colunas de 37px, abaixo
   do minimo de toque. MEDIDO com auto-fill: poster 110x182 (1280 e 1024), 111x182
   (820), 114x187 (390) e 141x223 (320); celula de episodio 45 a 52px em todas. */
.vp-panel .grid{grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:10px}
.vp-panel .ep-grid{grid-template-columns:repeat(6,1fr)}
/* [C3] .vp-info e .vp-side moram FORA do video agora e ficam sempre a vista; zerar a
   transicao elimina de vez a janela em que o elemento esta invisivel E clicavel. */
.vp-info,.vp-side{transition:none}

@media(max-width:1023px){
  /* o video deixa de ser 100dvh: vira caixa medida e a PAGINA passa a rolar */
  .vplayer{display:block;height:auto;min-height:100vh;min-height:100svh;overflow:visible}
  /* o palco vira o bloco posicionado: #video, .vp-tap, .vp-playbtn, .vp-skip,
     .vp-mute, .vp-seekhint, .vp-progwrap e a PAREDE passam a se posicionar contra
     ele — a parede cobre o video e SO o video. O .vp-frame continua display:contents
     de proposito (mantem frameW=0 e o alvo da tela cheia no .vplayer). */
  /* overflow-x:clip e a REDE: enfeite sobreposto (o degrade da coluna, a explosao
     de 78px do coracao) nasce mais largo que o icone de proposito, e qualquer um
     deles passando da borda estica a viewport e faz a pagina rolar de lado.
     `clip` e nao `hidden`: hidden obrigaria overflow-y a virar scroll e criaria
     um segundo scroller dentro do palco, quebrando a rolagem da pagina.
     Os sheets (comentario, relato, TV) moram FORA do .vplayer, entao nada que
     precisa escapar da caixa esta aqui dentro. */
  .vp-stage{display:block;position:relative;width:100%;height:100vh;height:100svh;overflow-x:clip}
  .vp-rail{display:flex;flex-direction:column;gap:16px;
    padding:16px 14px calc(24px + env(safe-area-inset-bottom))}
  .vp-info{position:static;inset:auto;z-index:auto;gap:8px}
  .vp-title{font-size:19px;line-height:1.3;white-space:normal}
  .vp-syn-m{display:none}
  .vp-syn-full{display:block;font-size:13.5px;line-height:1.6;color:rgba(255,255,255,.82)}
  /* As acoes VOLTAM pra cima do video, como eram antes — o dono pediu. So o
     titulo/sinopse/relacionados moram no painel de baixo. Coluna encostada na
     direita, dentro do palco, com respiro pra barra de progresso. */
  /* gap 13 (era 18): o dono pediu os icones mais proximos. MEDIDO — a coluna cai
     de 353 pra 328px, e como o degrade sobra 70px em cima e embaixo, o primeiro e
     o ultimo botao passam a cair em 15% / 85% da mascara: continuam DENTRO da
     faixa cheia (12%-88%), entao ninguem perde o fundo. */
  .vp-side{position:absolute;right:8px;left:auto;top:auto;bottom:96px;z-index:12;
    flex-direction:column;flex-wrap:nowrap;gap:13px;align-items:center;justify-content:flex-end}
  .vp-side>*{flex:0 0 auto;min-width:44px}
  .vp-side .vp-actf{display:flex}
  /* Tela cheia era o botao que o dono nao achava: some junto com a UI e nao se
     distingue dos outros. Ganha fundo proprio pra ler como CONTROLE do player e
     nao como acao social (salvar/curtir/compartilhar). */
  /* o circulo agora e padrao de TODA acao — a regra propria da tela cheia saiu */
  .vplayer.vp-idle .vp-info,.vplayer.vp-idle .vp-side{opacity:1;visibility:visible;pointer-events:auto}
}
/* retrato de verdade: o palco encolhe e o painel APARECE sem rolar nada.
   MEDIDO — 320x568: palco 320x420, faixa VIP em y=436 (dentro da tela).
            390x844: palco 390x625, faixa VIP em y=641.  820x900: palco 500x666.
            1024x620 e 1280x900 nao entram aqui (sao o cartao do PC). */
@media(max-width:1023px) and (min-height:560px){
  /* O palco assume a PROPORCAO DO VIDEO (9:16): a imagem preenche a largura e as
     tarjas pretas laterais somem. Antes era 74svh fixo — um retrato 9:16 dentro de
     uma caixa que nao e 9:16 sempre sobra barra dos dois lados.
     O teto de 78svh existe pra o painel continuar aparecendo sem rolar em telas
     baixas, e o min() resolve os dois casos sem media query nova. */
  /* Reels-style: o video ocupa a TELA TODA no mobile (o dono pediu). O painel
     (titulo/sinopse/relacionados) fica logo abaixo, a um scroll — e a navegacao
     entre episodios passa a ser por gesto (swipe cima/baixo, app-episodes.js). */
  .vp-stage{height:100vh;height:100svh;aspect-ratio:auto;max-height:none}
}
/* Rede: navegador que ignora aspect-ratio zeraria a altura e o player SUMIRIA.
   Mesma protecao que o cartao do PC ja leva. */
@supports not (aspect-ratio: 9 / 16){
  @media(max-width:1023px) and (min-height:560px){
    .vp-stage{height:100vh;height:100svh;max-height:none}
  }
}
/* tela cheia abaixo de 1024: o alvo continua sendo o .vplayer inteiro, entao o layout
   volta ao sobreposto — senao a tela cheia mostraria video em 74% e painel embaixo.
   O bloco -webkit esta REPETIDO em vez de vir por virgula: pseudo-classe desconhecida
   na mesma lista derruba a regra inteira, e a saida da tela cheia sumiria. */
@media(max-width:1023px){
  .vplayer:fullscreen .vp-rail{display:contents}
  .vplayer:fullscreen .vp-info,.vplayer:fullscreen .vp-panel,.vplayer:fullscreen .vip{display:none}
  .vplayer:fullscreen .vp-side{position:absolute;right:10px;bottom:118px;z-index:12;
    flex-direction:column;gap:18px;align-items:center;justify-content:flex-start}
  .vplayer:fullscreen .vp-side>*{flex:none}
  .vplayer:-webkit-full-screen .vp-rail{display:contents}
  .vplayer:-webkit-full-screen .vp-info,.vplayer:-webkit-full-screen .vp-panel,.vplayer:-webkit-full-screen .vip{display:none}
  .vplayer:-webkit-full-screen .vp-side{position:absolute;right:10px;bottom:118px;z-index:12;
    flex-direction:column;gap:18px;align-items:center;justify-content:flex-start}
  .vplayer:-webkit-full-screen .vp-side>*{flex:none}
}
/* [C4] rede de seguranca do cartao 9:16 do PC: sem isto, navegador que ignora
   aspect-ratio deixa a altura em 0 e o player SOME. VERIFICADO no ar com a
   propriedade neutralizada: SEM a rede o palco vira 479x0; COM a rede, 479x852.
   Nao muda nada em quem suporta. O par vh/dvh vale aqui tambem: quem nao tem
   aspect-ratio normalmente tambem nao tem dvh. */
@supports not (aspect-ratio: 9 / 16){
  @media(min-width:1024px){
    .vp-stage{height:min(90vh,880px);height:min(100dvh - 48px,880px);max-height:none}
  }
}

/* ═══════════ loading + transição suave entre episódios (app-vplayer.js) ═══════════ */
/* o vídeo faz fade ao carregar/trocar de episódio: some a sensação de "travou". */
.vplayer #video{transition:opacity .32s ease}
.vplayer.vp-loading #video{opacity:.35}
.vplayer.vp-loading .vp-playbtn{opacity:0;visibility:hidden}
/* enquanto carrega o episódio, TRAVA os controles (e o swipe é barrado no JS) —
   evita toque/pular/trocar de episódio no meio da troca. O voltar/topo continua. */
.vplayer.vp-loading .vp-side,
.vplayer.vp-loading .vp-skip,
.vplayer.vp-loading .vp-tap,
.vplayer.vp-loading .vp-progwrap,
.vplayer.vp-loading .ep-grid{pointer-events:none}
/* curtir (público) e salvar (favoritar): ícone preenchido + cor da marca quando ativo */
.vp-like.is-liked .msym,
.vp-save.is-fav .msym{color:var(--primary);font-variation-settings:'FILL' 1,'wght' 500,'GRAD' 0,'opsz' 24}
.vp-like:active .msym{transform:scale(.85)}
/* spinner central enquanto carrega/bufferiza (JS liga a classe vp-loading) */
.vp-spin{position:absolute;top:50%;left:50%;width:46px;height:46px;margin:-23px 0 0 -23px;
  z-index:7;pointer-events:none;opacity:0;transition:opacity .2s ease;
  border:3px solid rgba(255,255,255,.22);border-top-color:#fff;border-radius:50%}
.vplayer.vp-loading .vp-spin{opacity:1;animation:vp-spin .8s linear infinite}
@keyframes vp-spin{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){
  .vplayer #video{transition:none}
  .vplayer.vp-loading .vp-spin{animation-duration:1.4s}
}

/* ═══════════ legenda com aparência editável (app-subs.js) ═══════════ */
/* overlay que DESENHA a legenda (a faixa nativa fica hidden). Estilo por CSS var,
   editável no painel; posição a partir do rodapé pra não bater na barra de progresso. */
.vp-cc{position:absolute;left:0;right:0;z-index:8;bottom:var(--cc-bottom,12%);
  display:flex;flex-direction:column;align-items:center;gap:3px;
  padding:0 6%;pointer-events:none;text-align:center}
.vp-cc-line{display:inline-block;max-width:100%;
  color:var(--cc-color,#fff);background:var(--cc-bg,rgba(0,0,0,.55));
  font-size:calc(var(--cc-size,1) * clamp(15px,3.4vw,22px));
  line-height:var(--cc-lh,1.35);font-weight:600;
  padding:.08em .5em;border-radius:6px;text-shadow:0 1px 3px rgba(0,0,0,.6);
  white-space:pre-wrap}
/* em tela cheia a legenda sobe um pouco mais pra não colar na borda */
.vplayer:fullscreen .vp-cc{--cc-bottom:9%}

/* painel de ajustes (bottom sheet) */
.vp-ccpanel{position:fixed;inset:0;z-index:1000;display:flex;align-items:flex-end;justify-content:center;
  background:rgba(0,0,0,.5)}
.vp-ccpanel[hidden]{display:none}
.vp-ccpanel-card{width:100%;max-width:460px;background:#15151b;color:#eee;
  border-radius:18px 18px 0 0;padding:14px 18px calc(20px + env(safe-area-inset-bottom));
  box-shadow:0 -12px 40px rgba(0,0,0,.5);max-height:82vh;overflow-y:auto}
@media(min-width:640px){.vp-ccpanel{align-items:center}.vp-ccpanel-card{border-radius:18px}}
.vp-ccpanel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.vp-ccpanel-head b{font-size:16px}
.vp-ccpanel-x{background:none;border:0;color:#aaa;font-size:26px;line-height:1;cursor:pointer;padding:0 4px}
.vp-ccrow{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:11px 0;border-bottom:1px solid #24242c}
.vp-ccrow>span{font-size:14px;color:#cfcfd6}
.vp-ccrow input[type=range]{flex:0 0 55%;accent-color:var(--primary,#ff2e88)}
.vp-ccrow input[type=color]{width:44px;height:30px;border:0;background:none;padding:0;cursor:pointer}
.vp-ccrow-sw input[type=checkbox]{width:20px;height:20px;accent-color:var(--primary,#ff2e88)}
.vp-cc-preview{display:flex;justify-content:center;padding:16px 0 6px}
.vp-cc-preview .vp-cc-line{font-size:20px}
.vp-ccreset{margin-top:10px;width:100%;background:#26262e;color:#eaeaf0;border:0;border-radius:12px;
  padding:12px;font-weight:600;font-size:14px;cursor:pointer}
.vp-ccreset:hover{background:#30303a}

/* ═══════════ tela VIP / planos (/assinar) — estilo app, dourado ═══════════ */
.vipx{position:relative;isolation:isolate;min-height:100dvh;width:100%;max-width:520px;margin:0 auto;align-self:stretch;padding:0 18px 34px;
  display:flex;flex-direction:column;color:#fff;overflow:hidden;background:#0b0b0d}
/* papel de parede REAL do iDrama (ic_sub_top_bg — raios dourados) cobrindo o topo INTEIRO */
.vipx::before{content:"";position:absolute;top:0;left:0;right:0;height:420px;z-index:0;pointer-events:none;
  background:url("../img/ui/vip-top-bg.webp") top center/cover no-repeat}
/* O veu escurece MAIS na faixa onde o texto cai (78%), sem apagar o brilho da
   coroa em cima — era ali que o nome e o "voce ainda nao e membro" sumiam. */
.vipx::after{content:"";position:absolute;top:0;left:0;right:0;height:420px;z-index:0;pointer-events:none;
  background:linear-gradient(to bottom,rgba(11,11,13,.15),rgba(11,11,13,.5) 48%,rgba(11,11,13,.86) 78%,#0b0b0d)}
/* conteúdo acima do papel de parede */
.vipx-back,.vipx-head,.vipx-form{position:relative;z-index:1}
.vipx-back{width:40px;height:40px;display:grid;place-items:center;margin:14px -8px 0;color:#fff}
.vipx-head{position:relative;padding:104px 4px 20px;min-height:130px}
/* coroa REAL (landscape com anel de luz + glow): cobre o topo, o glow fica atrás do nome */
.vipx-crown{position:absolute;top:-22px;right:-22px;width:min(98%,450px);height:auto;pointer-events:none;z-index:0}
/* O nome e o status ficam POR CIMA da coroa dourada, que e clara e brilhante:
   branco a 72% sumia contra ela. Sombra escura resolve onde o veu nao alcanca. */
.vipx-name{position:relative;z-index:1;font-family:'Poppins',sans-serif;font-size:25px;font-weight:800;margin:0;max-width:72%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  text-shadow:0 2px 12px rgba(0,0,0,.85),0 1px 3px rgba(0,0,0,.9)}
.vipx-status{position:relative;z-index:1;color:rgba(255,255,255,.86);font-size:14px;margin:6px 0 0;
  text-shadow:0 2px 10px rgba(0,0,0,.9),0 1px 3px rgba(0,0,0,.9)}

/* ── O QUE VEM EM QUALQUER PLANO ─────────────────────────────────────────────
   Uma vez so, acima dos precos. Sem caixa e sem borda: e conteudo de leitura,
   nao um cartao que compete com os cartoes de plano logo abaixo. */
.vipx-inc{position:relative;z-index:1;margin:0 0 20px}
/* Deixou de ser rótulo e virou FRASE ("Assista tudo com apenas uma assinatura"),
   então sai o caixa-alta com letra espaçada — que serve pra etiqueta de duas
   palavras e atrapalha a leitura de uma sentença — e entra tamanho de título. */
/* O titulo da lista herdou os TRACOS que eram do bloco das medalhas: agora ele
   encabeca as duas listas (a de cinco e as tres bolhas la embaixo), entao ganhou
   o tratamento de cabecalho de secao — centralizado, com os fios dourados dos
   lados. As bolhas perderam o titulo delas: dois cabecalhos seguidos partiriam
   em duas promessas o que e uma so. */
.vipx-inc-t{display:flex;align-items:center;justify-content:center;gap:10px;
  font-size:15px;font-weight:800;letter-spacing:-.01em;text-transform:none;
  color:#e6b45a;margin:0 0 14px;line-height:1.25;text-align:center}
.vipx-inc-t::before,.vipx-inc-t::after{content:"";flex:none;height:1px;width:28px;
  background:linear-gradient(90deg,transparent,rgba(230,180,90,.6))}
.vipx-inc-t::after{transform:scaleX(-1)}
/* frase longa em duas linhas nao pode espremer os fios */
@media(max-width:400px){.vipx-inc-t::before,.vipx-inc-t::after{width:18px}}
/* o apoio que morava no cabeçalho, agora colado no título que ele completa */
.vipx-inc-s{font-size:12.5px;line-height:1.4;color:var(--muted);margin:0 0 13px}
@media(max-height:660px){.vipx-inc-t{font-size:13.5px}}
.vipx-inc-l{list-style:none;display:flex;flex-direction:column;gap:10px;margin:0;padding:0}
/* Alinhado pelo TOPO, nao pelo centro: com titulo + apoio o item tem duas
   linhas, e centralizar deixava a medalha boiando entre elas, encostada em
   nenhuma das duas. Encostada na primeira linha, ela e o comeco da frase. */
.vipx-inc-l li{display:flex;align-items:flex-start;gap:12px}
/* SEM CONTAINER. Ja foi quadrado chapado e ja foi bola escura; os dois pesavam
   mais que a frase que vinham anunciar — cinco caixas ou cinco bolas em fila
   viram uma coluna de enfeite ao lado do texto.
   O que resolvia o problema original nunca foi a moldura: era o glifo ser
   DIFERENTE em cada linha (antes eram cinco checks iguais e o olho pulava a
   lista). Com o glifo distinto, dourado e maior, o container so atrapalhava. */
.vipx-inc-ic{flex:none;display:grid;place-items:center;width:24px;height:26px;color:#e6b45a}
.vipx-inc-ic .msym{color:#e6b45a;font-size:22px!important}
/* Esta regra nasceu pro check de 14px que existia direto dentro do <li>. O glifo
   agora mora no .vipx-inc-ic e tem tamanho proprio; mantida so pro caso de
   sobrar algum icone solto, e sem !important pra nao vencer o de la. */
.vipx-inc-l > li > .msym{flex:0 0 auto;color:#e6b45a;font-size:14px}
.vipx-inc-l b{display:block;font-size:13.5px;font-weight:600;color:rgba(255,255,255,.94);line-height:1.3}
.vipx-inc-l i{display:block;font-style:normal;font-size:11.5px;color:rgba(255,255,255,.52);
  line-height:1.35;margin-top:1px}

/* ── CARTOES DE PLANO: EMPILHADOS ────────────────────────────────────────────
   Eram dois por linha, rolando na horizontal: cabia so o preco e a cliente
   tinha que arrastar pra descobrir que existiam quatro. Empilhado ela ve todos
   e cabe o beneficio dentro de cada um. Paleta dourada mantida. */
/* DOIS por linha em qualquer largura (PC e mobile) — a pedido do dono. minmax(0,1fr)
   segura a coluna pra o conteúdo largo não estourar o card em telas estreitas. */
.vipx-plans{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:11px;padding:2px 0 4px;margin-bottom:22px}
.vipx-radio{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.vipx-plan{position:relative;display:block;padding:15px 16px 14px;border-radius:16px;cursor:pointer;
  background:rgba(255,255,255,.045);border:2px solid rgba(255,255,255,.1);transition:.18s}
/* planos VIP (acima de 30 dias): fundo com a arte VIP + badge no canto */
.vipx-plan-hasvip{overflow:hidden;background-size:cover;background-position:center;border-color:rgba(230,180,90,.5)}
.vipx-radio:checked + .vipx-plan.vipx-plan-hasvip{border-color:#e6b45a;box-shadow:0 0 0 1px #e6b45a,0 10px 26px -12px rgba(230,180,90,.5)}
.vipx-plan-badge{position:absolute;top:8px;right:10px;height:30px;width:auto;z-index:2;
  filter:drop-shadow(0 2px 5px rgba(0,0,0,.6))}
.vipx-forever .vipx-plan-badge{position:static;height:28px;margin-left:auto}
.vipx-off{position:absolute;top:-1px;right:-1px;background:linear-gradient(135deg,#ff5f8f,#c9366b);
  color:#fff;font-size:10px;font-weight:800;padding:3px 9px;border-radius:0 14px 0 12px}
/* ── VITALICIO: bloco de outra natureza ──────────────────────────────────────
   Ele nao pode parecer o quarto cartao — era exatamente isso que o punha na
   mesma decisao dos outros tres e fazia um R$ 299,90 aparecer no meio de uma
   escada que vai de R$ 19,90 a R$ 118,80. Por isso: sem preenchimento solido,
   borda tracejada, altura menor e uma seta no fim. Le-se como "ou entao…", nao
   como "mais uma opcao da lista".
   Fica abaixo do botao dourado, entao herda o respiro dele. */
.vipx-forever{display:flex;align-items:center;gap:12px;width:100%;text-align:left;
  margin:14px 0 0;padding:13px 14px;border-radius:14px;cursor:pointer;
  background:rgba(230,180,90,.05);border:1.5px dashed rgba(230,180,90,.42);
  color:#e6b45a;text-decoration:none;transition:border-color .18s,background .18s}
.vipx-forever:hover{background:rgba(230,180,90,.09);border-color:rgba(230,180,90,.7)}
.vipx-forever:active{transform:scale(.99)}
.vipx-forever-ic{flex:none;display:grid;place-items:center;width:34px;height:34px;border-radius:50%;
  background:rgba(230,180,90,.14);color:#e6b45a}
.vipx-forever-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.vipx-forever-txt b{font-size:13.5px;font-weight:700;color:#e6b45a;line-height:1.35}
.vipx-forever-txt i{font-style:normal;font-size:11.5px;font-weight:600;color:var(--muted)}
.vipx-forever-go{flex:none;color:rgba(230,180,90,.75);display:grid;place-items:center}
/* escolhido: deixa de ser tracejado. Na folha vem do radio; na /assinar vem da
   classe .on, posta pelo controller quando ela chega com ?plan=lifetime. */
.vipx-radio:checked + .vipx-forever,
.vipx-forever.on{border-style:solid;border-color:#e6b45a;
  background:linear-gradient(160deg,rgba(230,180,90,.18),rgba(230,180,90,.05))}
/* no overlay o botao dourado ocupa a largura toda; este acompanha */
.ss-box .vipx-forever{max-width:none}

/* "Mais escolhido" no trimestral: fica na BORDA DE CIMA, nao no canto, pra nao
   brigar com o selo de desconto do mesmo cartao. */
/* A direita, nao a esquerda: na esquerda ela caia em cima do nome do plano
   ("TRIMESTRAL · 3 MESES"), que comeca no mesmo x=16. A direita o canto esta
   livre — o que mora la e o circulo de escolha, mais abaixo.
   JA FOI ROSA e voltou pro dourado. O rosa aqui gritava: pilula rosa saturada
   com texto branco e halo, colada num cartao dourado — as duas cores brigando
   no mesmo centimetro, e o selo roubando a atencao do preco que ele deveria
   estar apoiando. A marca entra na tela pelo LOGO, que ja tem o rosa dentro
   dele; nao por um componente pintado de rosa. */
.vipx-pop{position:absolute;top:-9px;right:16px;left:auto;background:linear-gradient(135deg,#f0c674,#d19a3c);
  color:#2a1c05;font-size:10px;font-weight:800;letter-spacing:.02em;padding:3px 10px;border-radius:999px;
  box-shadow:0 4px 12px -4px rgba(230,180,90,.7)}
/* "Melhor custo" (badge='best', ex.: vitalício) — mesmo lugar do popular, rosa da marca. */
.vipx-best{position:absolute;top:-9px;right:16px;left:auto;background:linear-gradient(135deg,#ff5f8f,#c9366b);
  color:#fff;font-size:10px;font-weight:800;letter-spacing:.02em;padding:3px 10px;border-radius:999px;
  box-shadow:0 4px 12px -4px rgba(201,54,107,.7)}
.vipx-radio:checked + .vipx-plan.best{border-color:#c9366b;box-shadow:0 0 0 1px #c9366b,0 10px 26px -12px rgba(201,54,107,.5)}

.vipx-plan-top{display:flex;align-items:center;gap:12px}
.vipx-plan-col{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px}
/* Label dos dias MAIOR e legível (2 cartões por linha deixam a coluna estreita —
   o "180 DIAS" tem que ler de longe). */
.vipx-plan-name{font-size:13.5px;font-weight:800;letter-spacing:.02em;text-transform:uppercase;
  color:#e6b45a}
/* Preço MENOR e numa linha só: com 2 por linha o cartão fica estreito e o
   "R$ 199,90" quebrava em duas linhas. nowrap + corpo menor mantém tudo numa
   linha em qualquer largura. */
.vipx-plan-price{font-size:21px;font-weight:800;line-height:1.15;letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;white-space:nowrap}
.vipx-plan-price i{font-style:normal;font-size:13px;font-weight:600;color:rgba(255,255,255,.5);
  margin-left:2px}
.vipx-plan-sub{font-size:11.5px;color:rgba(255,255,255,.55);line-height:1.35;margin-top:2px}

/* Marca de selecao: circulo vazio que vira dourado com o check. */
.vipx-tick{flex:0 0 auto;width:24px;height:24px;border-radius:50%;display:grid;place-items:center;
  border:2px solid rgba(255,255,255,.22);color:transparent;transition:.18s}
.vipx-radio:checked + .vipx-plan .vipx-tick{border-color:#e6b45a;background:#e6b45a;color:#2a1c05}

.vipx-radio:checked + .vipx-plan{border-color:#e6b45a;
  background:linear-gradient(160deg,rgba(230,180,90,.16),rgba(230,180,90,.04));
  box-shadow:0 8px 26px -12px rgba(230,180,90,.5)}
.vipx-radio:focus-visible + .vipx-plan{outline:2px solid #e6b45a;outline-offset:2px}

/* ── beneficios DENTRO do cartao ──
   Fica sempre visivel (o dono pediu em todos os planos). Separado por um filete
   pra ler como "o que vem junto", nao como continuacao do preco. */
/* So os EXTRAS ficam aqui — o que diferencia este plano dos outros. Os comuns
   subiram pro .vipx-inc, uma vez so. */
.vipx-bl{display:flex;flex-direction:column;gap:7px;margin-top:11px;padding-top:11px;
  border-top:1px solid rgba(255,255,255,.09)}
.vipx-bl-h{font-size:10px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;
  color:rgba(240,198,116,.75)}
.vipx-bl-i{display:flex;align-items:flex-start;gap:8px}
.vipx-bl-i .msym{flex:0 0 auto;margin-top:1px;color:rgba(230,180,90,.85);font-size:13px!important}
.vipx-bl-i b{display:block;font-size:12.5px;font-weight:600;color:rgba(255,255,255,.92);line-height:1.3}
.vipx-bl-i i{display:block;font-style:normal;font-size:11px;color:rgba(255,255,255,.5);line-height:1.35;
  margin-top:1px}
/* os dois exclusivos do anual/vitalicio acendem em dourado */
.vipx-bl-i.hot .msym{color:#f0c674}
.vipx-bl-i.hot b{color:#f0c674}

/* ── CTA PRESO NO RODAPE, so no passo dos PLANOS ─────────────────────────────
   Aqui nao existe campo pra preencher — o plano ja vem marcado — entao o botao
   sempre pode ser tocado. E o oposto do passo de PAGAMENTO, onde a barra fixa
   foi tirada porque cobria os campos do cartao e convidava ao clique antes da
   hora (a nota inteira esta em .ss-paybar).
   sticky so age quando ha rolagem: em tela que ja mostra tudo, o bloco fica no
   fluxo e nada muda. As margens negativas usam o mesmo --bleed do cabecalho. */
.ss-planbar{position:sticky;bottom:0;z-index:3;
  margin:18px calc(-1 * var(--bleed,20px)) 0;
  padding:14px var(--bleed,20px) calc(10px + env(safe-area-inset-bottom));
  background:linear-gradient(to top,var(--card) 82%,rgba(18,18,18,0))}
/* o selo estava colado no botao e as contas coladas nele: tres linhas
   diferentes empilhadas sem respiro nenhum liam como um bloco so */
.ss-planbar .ss-trust{margin-top:16px;padding-top:15px}

/* ── LINHA DE SEGURANCA + PROVA SOCIAL, embaixo do botao ─────────────────────
   Ja foi um paragrafo de tres linhas e ja foi um par de badges com icone
   dourado. O badge dourado era o pior dos dois: o icone gritava e o texto cinza
   sussurrava, e dois pesos na mesma linha e exatamente o que da cara de
   template pronto.
   Agora e UMA linha sobre um filete, com o cadeado do MESMO tom e do MESMO
   tamanho do texto. Selo que se anuncia compete com o botao dourado logo acima;
   selo que sussurra sustenta ele. O filete e quem faz o trabalho de separar. */
.ss-trust{display:flex;align-items:center;justify-content:center;gap:7px;
  margin:18px auto 0;padding:13px 0 0;max-width:280px;
  border-top:1px solid rgba(255,255,255,.07);
  font-size:12px;font-weight:500;letter-spacing:.015em;color:rgba(255,255,255,.46)}
.ss-trust .msym{font-size:13px;color:inherit;flex:none;opacity:.9}
.ss-trust span{white-space:nowrap}
/* A prova social e discreta de proposito: quem esta com o dedo no botao nao
   precisa de um numero grande competindo com ele. O <b> e o unico com peso, e
   e nele que o contador roda. */
/* A prova social agora fica ACIMA do botao, dentro da barra: e o ultimo
   argumento antes do toque. Margem embaixo, nao em cima. */
.ss-subs{text-align:center;font-size:11.5px;color:rgba(255,255,255,.34);margin:0 0 10px}
.ss-subs b{color:rgba(255,255,255,.66);font-weight:700;font-variant-numeric:tabular-nums}
/* no cartao claro do checkout a linha acompanha o marrom */
.ss-box .ss-cardbox ~ .ss-paybar .ss-trust{color:rgba(255,255,255,.46)}

/* Depois do botao agora: precisa de folga pro halo do dourado nao encostar
   na linha do titulo. */
/* deixou de ser rotulo ("Beneficios de membro") e virou frase — mesmo motivo do
   .vipx-inc-t: caixa-alta espacada serve pra etiqueta, nao pra sentenca */
.vipx-benes{margin-bottom:22px;margin-top:24px}
.vipx-benes-t{font-size:14px;font-weight:700;text-align:center;color:#e6b45a;margin:0 0 16px;
  display:flex;align-items:center;justify-content:center;gap:10px}
.vipx-benes-t::before,.vipx-benes-t::after{content:"";height:1px;width:28px;
  background:linear-gradient(90deg,transparent,rgba(230,180,90,.6))}
.vipx-benes-t::after{transform:scaleX(-1)}
.vipx-benes-row{display:flex;justify-content:space-around;gap:8px}
.vipx-bene{display:flex;flex-direction:column;align-items:center;gap:8px;flex:1;text-align:center}
.vipx-bene-ic{width:54px;height:54px;border-radius:50%;display:grid;place-items:center;overflow:hidden;
  background:radial-gradient(circle at 50% 32%,#463a22,#1c1c20);border:1px solid rgba(230,180,90,.22)}
.vipx-bene-ic img{width:32px;height:32px;object-fit:contain}
.vipx-bene-t{font-size:11px;color:rgba(255,255,255,.75);line-height:1.25}

.vipx-pays{display:flex;flex-direction:column;gap:10px;margin-bottom:22px}
.vipx-pay{display:flex;align-items:center;gap:12px;padding:14px 16px;border-radius:12px;cursor:pointer;
  background:rgba(255,255,255,.05);border:1.5px solid rgba(255,255,255,.1);transition:.15s}
.vipx-pay-ic{order:1;color:#e6b45a;display:grid;place-items:center;flex:none}
.vipx-pay-t{order:2;margin-right:auto;font-size:14px;font-weight:600}
.vipx-pay-off{order:3;background:rgba(52,199,89,.16);color:#34c759;font-size:11px;font-weight:700;padding:2px 8px;border-radius:6px}
.vipx-pay input{order:4;accent-color:#e6b45a;width:18px;height:18px;flex:none}
.vipx-pay:has(input:checked){border-color:#e6b45a;background:rgba(230,180,90,.08)}
/* mais formas de pagamento — <details> nativo (sem JS) */
.vipx-more{margin-top:2px}
.vipx-more summary{list-style:none;display:flex;align-items:center;justify-content:center;gap:6px;
  padding:12px;cursor:pointer;color:rgba(255,255,255,.6);font-size:13px;font-weight:600}
.vipx-more summary::-webkit-details-marker{display:none}
.vipx-more summary .msym{transition:transform .2s}
.vipx-more[open] summary .msym{transform:rotate(180deg)}
.vipx-more-body{padding:2px 4px 8px}
.vipx-more-body p{font-size:12px;color:rgba(255,255,255,.5);margin:0 0 10px;text-align:center}
.vipx-brands{display:flex;flex-wrap:wrap;justify-content:center;gap:8px}
.vipx-brands span{background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);
  border-radius:8px;padding:6px 12px;font-size:12px;font-weight:700;color:rgba(255,255,255,.75)}

.vipx-cta{display:block;width:100%;text-align:center;border:0;border-radius:999px;padding:16px;cursor:pointer;
  font-size:16px;font-weight:800;color:#3a2400;
  background:linear-gradient(135deg,#f5d488,#e0a942);
  box-shadow:0 10px 30px -10px rgba(230,180,90,.6);transition:transform .15s}
.vipx-cta:active{transform:scale(.985)}
/* Enquanto o gateway responde (2-4s) o botão ficava idêntico a si mesmo: dourado,
   com sombra, com o mesmo texto. Do lado dela isso é "não funcionou", e ela toca
   de novo ou fecha. Apaga, some a sombra e para de responder ao toque. */
.vipx-cta:disabled{opacity:.62;box-shadow:none;transform:none;cursor:default}
/* a .ss-spin padrão tem o topo rosa, invisível sobre o dourado */
.vipx-cta .ss-spin{display:inline-block;vertical-align:-2px;margin-right:2px;
  border-color:rgba(58,36,0,.25);border-top-color:#3a2400}
.vipx-legal{text-align:center;color:rgba(255,255,255,.4);font-size:11.5px;margin:14px 0 0}
.vipx-legal a{color:rgba(255,255,255,.65);text-decoration:underline}
.vipx-skip{display:block;text-align:center;color:rgba(255,255,255,.42);font-size:13px;margin-top:14px}
@media(min-width:768px){
  .vipx{max-width:940px;padding-left:32px;padding-right:32px}
  .vipx-crown{width:180px}
  .vipx-name{font-size:30px}
  /* planos lado a lado, sem scroll (cabem todos na largura) */
  /* empilhado tambem no PC, so que numa coluna estreita: cartao de plano com
     700px de largura fica com o preco de um lado e o beneficio perdido do outro.
     ESCOPADO em .vipx: a folha de assinatura usa o MESMO parcial dentro de uma
     caixa de 716px, e sem o escopo os cartoes ficavam com 560 enquanto o botao
     dourado ia a 716 — sobrando 78px de cada lado do que ele deveria fechar. */
  .vipx .vipx-plans{max-width:560px;margin-left:auto;margin-right:auto}
  /* pagamento e botão numa coluna confortável, centralizados */
  .vipx-pays,.vipx-cta,.vipx-legal,.vipx-skip{max-width:560px;margin-left:auto;margin-right:auto}
  .vipx-pays{width:100%}
}

/* ═══════════ tela Perfil (/profile) — estilo app ═══════════ */
.prof{max-width:720px;margin:0 auto;padding:8px 16px 34px;position:relative;isolation:isolate}
.prof::before{content:"";position:absolute;z-index:-1;pointer-events:none;
  left:0;right:0;top:calc(-1 * var(--nav-h));height:420px;
  background:url(../img/ui/prof-bg.webp) no-repeat top center;background-size:cover}
.prof-head{display:flex;align-items:center;gap:14px;padding:34px 4px 26px}
/* ── MOLDURA VIP NA FOTO ─────────────────────────────────────────────────────
   O anel (coroa + louros) e uma IMAGEM por cima, nao uma borda: ele passa dos
   limites do circulo em cima e nos lados, e o .prof-av precisa manter
   overflow:hidden pra recortar a foto. Por isso a moldura mora num wrapper.
   O brilho por tras e um radial suave — o mesmo tom dourado da casa, baixo o
   bastante pra ler como luz e nao como aro colorido. */
.prof-avwrap{position:relative;flex:none;display:grid;place-items:center;width:76px;height:76px}
.prof-avwrap-on::before{content:"";position:absolute;inset:-26%;border-radius:50%;
  background:radial-gradient(circle,rgba(240,196,110,.42) 0%,rgba(240,196,110,.16) 45%,transparent 70%);
  pointer-events:none}
.prof-ring{position:absolute;left:50%;top:50%;transform:translate(-50%,-52%);
  width:132%;aspect-ratio:256/299;pointer-events:none;
  background:url("../img/ui/vip-ring.png") center/contain no-repeat;
  filter:drop-shadow(0 2px 6px rgba(0,0,0,.5))}
/* dentro da moldura a foto encolhe um pouco: o anel tem espessura e sem isto a
   imagem encostava nele por dentro */
.prof-avwrap-on .prof-av{width:64px;height:64px;border-color:rgba(240,196,110,.5)}

.prof-av{width:76px;height:76px;border-radius:50%;flex:none;display:grid;place-items:center;overflow:hidden;
  background:rgba(255,255,255,.10);border:2px solid rgba(255,255,255,.22)}
.prof-av img{width:100%;height:100%;object-fit:cover}
.prof-id{min-width:0;flex:1}
.prof-id b{display:flex;align-items:center;gap:6px;min-width:0;font-family:'Poppins',sans-serif;font-size:22px;font-weight:800;color:#fff}
.prof-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.prof-id > span{display:block;font-size:13px;color:rgba(255,255,255,.62)}
.prof-online{display:inline-flex!important;align-items:center;gap:5px;margin-top:3px;font-size:12.5px;color:rgba(255,255,255,.72)}
.prof-online .msym{font-size:14px;opacity:.8}
.prof-online b{font-weight:700;color:#fff}

/* cartão de assinatura — papel de parede cream do iDrama (vip-card-bg), texto escuro */
.prof-sub{display:block;border-radius:18px;padding:16px 18px;margin-bottom:22px;position:relative;overflow:hidden;
  background:#f0dcb0 url(../img/ui/vip-card-bg.webp) right center/cover no-repeat;color:#6a4a1e;border:0}
.prof-sub-top{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:14px}
.prof-sub-top b{display:flex;align-items:center;gap:8px;font-size:16px;font-weight:800;color:#5a3a12}
.prof-sub-top b .msym{color:#5a3a12}
.prof-sub-cta{background:linear-gradient(180deg,#e2b855,#cc9834);color:#432d06;font-size:13px;font-weight:800;
  padding:9px 22px;border-radius:999px;flex:none}
.prof-sub-tag{background:rgba(45,125,51,.16);color:#2d7d33;font-size:12px;font-weight:700;padding:4px 12px;border-radius:999px;flex:none}
.prof-sub-benes{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}
.prof-sub-benes span{display:flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;color:#6a4a1e}
.prof-sub-benes .msym{color:#6a4a1e;flex:none}
.prof-sub-benes span img{width:18px;height:18px;object-fit:contain;flex:none}
.prof-vflag{width:18px;height:18px;object-fit:contain;flex:none}
/* badge VIP do nível do plano (perfil) — maior que a flag genérica */
.prof-vbadge{height:22px;width:auto;margin-left:9px;object-fit:contain;flex:none;vertical-align:middle;
  filter:drop-shadow(0 1px 3px rgba(0,0,0,.5))}
.prof-sub-badge{height:24px;width:auto;object-fit:contain;flex:none}
/* moldura VIP no avatar do perfil (avatar DENTRO). A foto é o 100%: wrapper e
   .prof-av ficam do MESMO tamanho e a moldura escala por --vf (=1/furo, medido
   por nível). Sem o halo do -on e sem a borda dourada da foto: o frame já É a
   decoração, e os dois juntos viravam anel duplo desalinhado. */
/* footprint da moldura = container * --fs (fit-map, mira avatar=90% do furo).
   NADA de *0.8 extra: com ele o furo saía menor que a foto e a foto vazava por
   cima do anel (virava borrão). O container fica pequeno (40px) DE PROPÓSITO —
   como a moldura escala ~2.25x, 40px dá um footprint ~90px, tamanho certo pro
   perfil, com a foto sentada dentro do anel. */
.prof-avwrap-vip{overflow:visible;position:relative;width:40px;height:40px}
.prof-avwrap-vip::before{display:none}
.prof-avwrap-vip .prof-av{width:40px;height:40px;border:0}
.prof-vipframe{position:absolute;top:50%;left:50%;
  width:calc(100% * var(--fs,1.9));height:calc(100% * var(--fs,1.9));max-width:none;max-height:none;
  transform:translate(-50%, calc(-50% - var(--fy,0) * 1%));pointer-events:none;z-index:5;object-fit:contain}
/* box do plano com fundo VIP: texto claro sobre a arte escura */
.prof-sub-vip{background-size:cover;background-position:center;border:1px solid rgba(230,180,90,.5)}
.prof-sub-vip .prof-sub-top b,.prof-sub-vip .prof-sub-top b .msym{color:#fff}
.prof-sub-vip .prof-sub-benes span{color:rgba(255,255,255,.9)}

/* blocos (histórico) */
.prof-block{margin-bottom:22px}
.prof-block-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.prof-block-h h2{font-family:'Poppins',sans-serif;font-size:17px}
.prof-clear{background:transparent;border:0;color:var(--muted2);font-size:12px;font-weight:600;cursor:pointer;
  display:inline-flex;align-items:center;gap:4px}

/* menu */
.prof-menu{display:flex;flex-direction:column;background:var(--card2);border-radius:16px;overflow:hidden;margin-bottom:22px}
.prof-menu a{display:flex;align-items:center;gap:14px;padding:15px 16px;color:var(--txt);font-size:14.5px;font-weight:500;
  border-bottom:1px solid rgba(255,255,255,.05);transition:background .15s}
.prof-menu a:last-child{border-bottom:0}
.prof-menu a:active{background:rgba(255,255,255,.05)}
.prof-mi{color:var(--muted);display:grid;place-items:center;flex:none}
.prof-mi-img img{width:24px;height:24px;object-fit:contain;display:block}
.prof-ml{flex:1}
.prof-mv{font-style:normal;font-size:13px;color:var(--muted2)}
.prof-menu a > .msym:last-child{color:var(--muted2)}

/* configurações (dados + senha) */
.prof-cfg-h{font-family:'Poppins',sans-serif;font-size:16px;margin:18px 0 12px}
.prof-config{display:none}.prof-config.open{display:block}
.prof-config .card{margin-bottom:14px}
.prof-logout{margin-top:10px}

/* ── aba Personalização (PORTADO do auraproject.store) ──────────────────────
   Célula mostra a moldura INTEIRA (object-fit:contain) e o balão via border-image
   9-slice; escala ÚNICA. Simples e sempre alinhado — nada de --vf por frame. */
.cust-card{padding:16px 18px}
.cust-h{font-family:'Poppins',sans-serif;font-size:14.5px;font-weight:700;margin:16px 0 3px}
.cust-sub{font-size:12.5px;color:var(--muted2);margin:0 0 12px}
.cust-locked a{color:var(--primary);font-weight:700}
.cust-save{margin-top:8px}
/* preview ao vivo: mini-cartão estilo Bigo — skin de fundo + avatar/moldura + nome/medalha + balão */
.cust-live{display:flex;gap:22px;align-items:center;flex-wrap:wrap;padding:16px 18px;position:relative;
  overflow:hidden;border-radius:16px;min-height:98px;background:rgba(255,255,255,.03);border:1px solid rgba(255,255,255,.07)}
/* preview com a COR real do card (gradiente setado inline) — nítido, sem blur */
.cust-live.has-card{border-color:transparent}
.cust-live.has-card::after{content:"";position:absolute;inset:0;z-index:0;
  background:linear-gradient(100deg,rgba(8,6,14,.52) 0%,rgba(8,6,14,.22) 55%,rgba(8,6,14,.05) 100%)}
/* emblema do card NÍTIDO no tamanho real, como selo no canto do preview.
   selector com > pra ganhar do `.cust-live>*{position:relative}` (mesma especificidade). */
.cust-live>.cust-live-emblem{position:absolute;z-index:2;top:10px;right:12px;width:80px;height:44px;
  background-size:contain;background-repeat:no-repeat;background-position:top right;
  filter:drop-shadow(0 2px 7px rgba(0,0,0,.5))}
.cust-live-emblem[hidden]{display:none}
.cust-live>*{position:relative;z-index:1}
.cust-live-av{position:relative;width:56px;height:56px;border-radius:50%;flex:none;overflow:visible}
.cust-live-img{width:82%;height:82%;border-radius:50%;object-fit:cover;background:rgba(255,117,168,.18);position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}
.cust-live-av .av-frame{position:absolute;top:50%;left:50%;
  width:calc(100% * var(--fs,1.9));height:calc(100% * var(--fs,1.9));max-width:none;max-height:none;
  transform:translate(-50%, calc(-50% - var(--fy,0) * 1%));object-fit:contain;pointer-events:none;z-index:2}
.cust-live-main{display:flex;flex-direction:column;gap:8px;min-width:0}
.cust-live-nameline{display:flex;align-items:center;gap:7px;min-width:0}
.cust-live-name{font-weight:700;color:#fff;font-size:14px;text-shadow:0 1px 3px rgba(0,0,0,.65);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:190px}
.cust-live-medal{height:20px;width:auto;flex:none;display:block;filter:drop-shadow(0 1px 2px rgba(0,0,0,.5))}
.cust-live-medal[hidden]{display:none}
.cust-live-bubble{padding:9px 15px;font-weight:600;color:#fff;font-size:13px;align-self:flex-start;
  background:rgba(255,255,255,.10);border-radius:12px;text-shadow:0 1px 2px rgba(0,0,0,.5)}
.cust-live-bubble.has-bubble{background:transparent;border:15px solid transparent;border-radius:0;
  border-image-slice:30 34 30 34 fill;border-image-width:15px 17px 15px 17px;border-image-repeat:stretch;padding:2px 8px}
/* SLIDER horizontal (desliza pro lado) em vez de grade enchendo a tela — mais
   compacto, organizado e bonito. Uma fileira só; arrasta/rola na horizontal. */
.cos-grid{display:flex;gap:10px;overflow-x:auto;overflow-y:hidden;padding:4px 2px 10px;margin-bottom:6px;
  scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;scrollbar-width:thin;
  scrollbar-color:rgba(255,255,255,.22) transparent;overscroll-behavior-x:contain}
.cos-grid::-webkit-scrollbar{height:7px}
.cos-grid::-webkit-scrollbar-thumb{background:rgba(255,255,255,.20);border-radius:4px}
.cos-grid::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.32)}
.cos-grid::-webkit-scrollbar-track{background:transparent}
.cos-cell{position:relative;flex:0 0 auto;height:84px;aspect-ratio:1;scroll-snap-align:start;
  border:1px solid rgba(255,255,255,.10);border-radius:14px;
  background:rgba(255,255,255,.02);cursor:pointer;display:flex;align-items:center;justify-content:center;
  transition:.15s;padding:6px;margin:0;overflow:hidden;text-align:center}
.cos-cell input{position:absolute;opacity:0;width:0;height:0;pointer-events:none}
.cos-cell:hover{border-color:rgba(255,117,168,.55);background:rgba(255,117,168,.06)}
.cos-cell.sel,.cos-cell:has(input:checked){border-color:var(--primary);background:rgba(255,117,168,.12);
  box-shadow:0 0 0 1px rgba(255,117,168,.6) inset}
.cos-cell img{max-width:100%;max-height:100%;object-fit:contain}
.cos-cell.none{font-size:.64rem;color:var(--muted2);font-weight:800;letter-spacing:.03em;line-height:1.25}
/* item BLOQUEADO pelo plano (gating do admin): cinza, não clicável, com selo de coroa */
.cos-cell.is-locked{opacity:.45;filter:grayscale(.5);cursor:not-allowed}
.cos-cell.is-locked:hover{border-color:rgba(255,255,255,.10);background:rgba(255,255,255,.02)}
.cos-lock{position:absolute;top:3px;right:3px;width:19px;height:19px;border-radius:50%;z-index:3;
  background:linear-gradient(135deg,#f3ca77,#d97c1a);color:#3a1c00;display:flex;align-items:center;justify-content:center;
  box-shadow:0 1px 5px rgba(0,0,0,.55)}
.cos-bcell{aspect-ratio:2/1}
.cos-bprev{width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:.8rem;
  font-weight:700;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6);
  border:15px solid transparent;border-image-slice:30 34 30 34 fill;border-image-width:12px 14px;border-image-repeat:stretch}
/* célula de MEDALHA: selo PNG (fundo transparente), exibido inteiro */
.cos-mcell{aspect-ratio:1}
.cos-mcell img{max-width:86%;max-height:86%;object-fit:contain;filter:drop-shadow(0 1px 3px rgba(0,0,0,.45))}
/* célula de SKIN DO CARTÃO: emblema pequeno (68px) — mostra INTEIRO (contain) em
   célula compacta pra ficar perto do tamanho natural e não borrar. */
.cos-grid-cards{grid-template-columns:repeat(auto-fill,minmax(90px,1fr))}
.cos-ccell{aspect-ratio:16/9;padding:5px}
.cos-cprev{width:100%;height:100%;background-size:contain;background-repeat:no-repeat;background-position:center}
/* MOBILE: no celular as células do seletor de moldura e de balão ficavam coladas
   (poucas colunas largas, gap apertado). Células menores => mais colunas com
   espaço claro entre elas, e mais respiro interno pra as molduras não se tocarem. */
@media(max-width:640px){
  .cos-grid{gap:12px;padding:4px 2px 12px}
  .cos-cell{height:74px;padding:9px}
  .cust-live{gap:16px}
}
@media(min-width:768px){.prof-sub-benes{grid-template-columns:repeat(4,1fr)}}

/* header do paywall inline (overlay) = topo da tela VIP: papel de parede + coroa real */
/* ── SANGRIA (opção C) ───────────────────────────────────────────────────────
   A arte deixou de ser um retangulo DENTRO da folha e virou o topo da PROPRIA
   folha: encosta nas laterais e herda o arredondado de 22px da .ss-box, que
   recorta sozinha porque tem overflow-y:auto.
   Dois problemas caiam juntos com isso: o "cortado" (a coroa em top/right
   negativos era fatiada pelo overflow:hidden e o brilho terminava numa reta) e
   o "quadradao" (so a base tinha degrade; topo e laterais morriam em aresta viva
   contra o fundo).
   As margens negativas TEM que bater com o padding da .ss-box — 24px em cima,
   20px nas laterais, e 28px nas laterais no PC. Se um dos dois mudar sem o
   outro, sobra uma fresta do fundo escuro na lateral. */
.ss-vhead{position:relative;isolation:isolate;overflow:hidden;border-radius:0;
  margin:-24px calc(-1 * var(--bleed)) 10px;
  padding:104px var(--bleed) 14px;min-height:118px}
.ss-vhead::before{content:"";position:absolute;inset:0;z-index:0;
  background:url("../img/ui/vip-top-bg.webp") top center/cover no-repeat}
/* O degrade estava em z-index:0, ou seja ABAIXO da coroa (z-index:1): ele
   dissolvia o papel de parede e a coroa passava por cima intacta, entao quem
   cortava ela era o overflow:hidden — e o corte era aquela reta horizontal seca
   no fim do bloco. Subindo o degrade pra cima de tudo, a coroa e o fundo somem
   JUNTOS dentro da folha, sem aresta.
   O primeiro trecho fica transparente pra nao lavar o brilho da coroa no topo;
   a partir da metade ele fecha ate a cor da folha. */
.ss-vhead::after{content:"";position:absolute;inset:0;z-index:2;pointer-events:none;
  background:linear-gradient(to bottom,
    rgba(18,18,18,0) 0%, rgba(18,18,18,.06) 34%, rgba(18,18,18,.42) 66%,
    rgba(18,18,18,.82) 87%, var(--card) 100%)}
/* A coroa nao e mais CORTADA na borda: ela se DISSOLVE antes de chegar la. Sem
   a mascara o brilho terminava numa reta diagonal, que e o corte que aparecia
   no canto superior direito. */
.ss-vcrown{position:absolute;top:-12px;right:-12px;width:min(94%,320px);height:auto;z-index:1;pointer-events:none;
  -webkit-mask-image:linear-gradient(to bottom left,transparent 4%,#000 46%);
          mask-image:linear-gradient(to bottom left,transparent 4%,#000 46%)}
/* o papel de parede tambem desbota nas pontas, senao o canto superior esquerdo
   continua sendo um retangulo com risco diagonal comecando do nada */
.ss-vhead::before{
  -webkit-mask-image:radial-gradient(135% 125% at 72% 4%,#000 46%,transparent 100%);
          mask-image:radial-gradient(135% 125% at 72% 4%,#000 46%,transparent 100%)}
/* ── ÂNCORA DE MARCA ─────────────────────────────────────────────────────────
   O modal nao tinha NADA do AmoDramas: nem logo, nem a tipografia, nem um
   respingo de rosa. Quem toca em "Ver planos" caia numa tela dourada com cara de
   outro produto — e tela de pagamento parecendo de outro produto e desconfianca
   no exato passo em que ela vai digitar o cartao.
   Canto de cima, altura de assinatura (22px), com uma sombra curta pra sustentar
   sobre a parte clara da arte. Discreto de proposito: e assinatura, nao anuncio. */
.ss-vlogo{position:absolute;top:18px;left:var(--bleed,20px);z-index:3;
  height:40px;width:auto;object-fit:contain;
  filter:drop-shadow(0 3px 10px rgba(0,0,0,.8))}
/* O rosa da marca entra por AQUI — o coracao do proprio logo. A 22px ele era um
   ponto e nao se lia; a 40px a marca aparece de verdade, e o rosa vem junto sem
   precisar pintar nenhum componente da interface. */
/* Nos passos de pagamento o cabecalho vira uma tarja: la o logo troca de lugar
   com o nome. E no checkout que a ancora de marca vale mais — e "Bem-vindo(a)"
   naquela altura nao informa nada. */
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vlogo,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vlogo,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vlogo{
  /* CENTRALIZADO e maior no checkout. No passo dos planos o logo e assinatura
     de canto — la a arte e a coroa mandam. Aqui o cabecalho virou uma tarja e o
     logo e o UNICO elemento de marca que sobrou na tela onde ela vai digitar o
     cartao: centralizado e maior, ele vira o cabecalho, e nao um detalhe do
     canto. margin auto nas laterais e o que centraliza um <img> em bloco. */
  position:static;height:44px;display:block;margin:0 auto}
/* Nos passos de pagamento o cabecalho e' so o logo: nem o nome da cliente nem a
   PROMESSA. A promessa vende no passo dos planos; no checkout ela ja decidiu, e
   "Nunca mais fique sem saber o final da historia" ali em cima do formulario e'
   argumento repetido ocupando a tela onde ela precisa digitar. */
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vname,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vname,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vname,
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vhead-t,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vhead-t,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vhead-t{display:none}

/* a /assinar e tela cheia (sem navbar), entao o logo dela mora no proprio topo */
.vipx-head{position:relative}
.vipx-head .ss-vlogo{top:0;left:0}

/* A PROMESSA no lugar da identificação. Duas linhas: o argumento e o que ele
   entrega. max-width pra não passar por baixo da coroa nem do X. */
.ss-vhead-t{position:relative;z-index:3;font-family:'Poppins',sans-serif;
  font-size:21px;font-weight:800;line-height:1.2;letter-spacing:-.02em;margin:0;
  max-width:min(80%,300px);color:#fff;text-wrap:balance}
/* .ss-vhead-s saiu: o apoio mudou de lugar (ver .vipx-inc-s) */
/* mantidas: o passo de PIX/pronto ainda usa .ss-vname em alguns estados */
.ss-vname{position:relative;z-index:3;font-family:'Poppins',sans-serif;font-size:22px;font-weight:800;margin:0;
  max-width:72%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#fff}
.ss-vstatus{position:relative;z-index:3;color:rgba(255,255,255,.72);font-size:13px;margin:5px 0 0}
/* ── o cabeçalho VIP encolhe a partir do passo de pagamento ──────────────────
   Ele vende no passo dos planos. Depois disso são 134px dizendo "Você ainda não
   é membro" bem na hora em que ela está tentando deixar de não ser — e num
   iPhone SE com o teclado aberto sobram ~350px: o botão dourado nunca aparece
   junto com os campos. Onde :has() não existir, fica como está hoje. */
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vhead,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vhead,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vhead{
  /* mesma sangria do cheio: senao o encolhido vira um retangulo baixinho */
  padding:14px var(--bleed);min-height:0;margin:-24px calc(-1 * var(--bleed)) 12px}
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vcrown,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vcrown,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vcrown,
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vstatus,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vstatus,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vstatus{display:none}
/* max-width:100% apagava a reserva de 72% que existe pro canto do .ss-x: em
   360px o nome corria ate x=340 com ellipsis e o circulo do X ocupa 316..348 —
   as ultimas letras passavam POR BAIXO dele. */
.ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vname,
.ss-box:has(.ss-step[data-step="pix"]:not([hidden])) .ss-vname,
.ss-box:has(.ss-step[data-step="pending"]:not([hidden])) .ss-vname{
  font-size:16px;max-width:calc(100% - 52px)}
/* Tela baixa: no passo de pagar a coroa e enfeite e custa ~90px. Num iPhone SE
   com o teclado aberto ela nao pode gastar um terco da tela com "Voce ainda nao
   e membro" bem na hora em que esta tentando deixar de nao ser. */
@media(max-height:700px){
  .ss-box:has(.ss-step[data-step="pay"]:not([hidden])) .ss-vhead{display:none}
}

/* ── TELA BAIXA, PASSO DOS PLANOS ────────────────────────────────────────────
   ISTO JA FOI MUITO MAIOR. Quando os cinco beneficios ficavam ENTRE o cabecalho
   e os precos, eles comiam ~230px e o cartao Mensal comecava em y=695 numa tela
   de 640 — zero pixel dele aparecia. Pra recuperar esses pixels eu tinha
   encolhido tudo: coroa, titulo, apoio, lista de beneficios e os proprios
   cartoes.
   Com os beneficios agora DEPOIS do botao, o problema deixou de existir: a
   dobra passou a ter so cabecalho + cartoes + barra, que cabem inteiros. Toda
   aquela compactacao virou aperto sem motivo, e foi removida — o que sobrou e o
   cabecalho um pouco menor, que ainda ajuda em tela curta e nao custa leitura. */
@media(max-height:720px){
  .ss-box:has(.ss-step[data-step="plans"]:not([hidden])) .ss-vhead{
    padding-top:72px;padding-bottom:14px;min-height:0}
  .ss-box:has(.ss-step[data-step="plans"]:not([hidden])) .ss-vcrown{width:min(78%,258px)}
  .ss-vhead-t{font-size:19px}
  .ss-vlogo{height:34px;top:15px}
  .ss-planbar{padding-top:10px}
  .ss-planbar .vipx-cta{padding:14px}
}
/* dentro do overlay, os planos empilham (não rolam) pra caber melhor */
/* na folha os cartoes ja nascem empilhados; so o respiro muda */
.ss-box .vipx-plans{gap:9px;margin-bottom:16px}
/* o bloco de beneficios entra mais compacto aqui: a folha e um overlay com
   altura limitada, e o topo dela ja gastou espaco com a coroa */
/* os dois blocos de beneficio vem depois do botao; o de cima ja se separa dele,
   e este so precisa nao encostar no anterior */
.ss-box .vipx-inc{margin:22px 0 16px}
.ss-box .vipx-inc-l{gap:8px}
/* no overlay, botão/pagamento ocupam a largura toda (a coluna de 560 é só da /assinar) */
.ss-box .vipx-cta,.ss-box .vipx-pays{max-width:none;margin-left:0;margin-right:0}


/* ─────────────── parede da amostra: o formulario dentro da parede ───────────────
   Escopado em .vp-wall/.feed-wall porque .field e .input sao usadas no admin e no
   perfil inteiros. Nada aqui muda cor, raio, sombra ou tipografia — o "design
   atual" continua sendo o design. */
/* A parede e uma tela de venda, nao um veu sobre o video. O degrade antigo
   terminava translucido e deixava capa, titulo e controles aparecerem por baixo.
   A base agora e o mesmo #121212 da folha aberta pela coroa do header, com a
   mesma arte VIP. A ultima camada e solida: mesmo se uma imagem falhar, nada do
   video atravessa o paywall. */
.vp-wall,.feed-wall{
  background:
    linear-gradient(180deg,rgba(18,18,18,.14) 0,rgba(18,18,18,.76) 132px,var(--card) 250px),
    url("../img/ui/vip-crown-glow.webp") right -58px top -42px/min(82%,310px) auto no-repeat,
    url("../img/ui/vip-top-bg.webp") top center/100% 250px no-repeat,
    var(--card);
  box-shadow:inset 0 1px 0 rgba(230,180,90,.18)
}

/* O titulo/episodio pertencem ao video e nao podem aparecer dentro da superficie
   de venda. No PC o topo sai inteiro: a grade de episodios e o "Agora nao" ja sao
   as saidas. No celular, onde esses controles ficam fora da primeira dobra, sobra
   somente um X persistente no canto. */
.vp-wall-close{
  width:40px;height:40px;border-radius:50%;display:none;place-items:center;
  color:#fff;background:rgba(0,0,0,.62);border:1px solid rgba(255,255,255,.18);
  -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
  box-shadow:0 8px 24px -10px rgba(0,0,0,.9);pointer-events:auto
}
.vp-wall-close:hover{background:rgba(255,255,255,.13)}
.vplayer.is-walled .vp-top>*:not(.vp-wall-close){display:none}
@media(min-width:1024px){
  .vplayer.is-walled .vp-top{display:none}
}

/* .btn e declarada depois da regra base e reacendia este fallback. A parede do
   player usa os cartoes diretamente em qualquer largura. */
.vp-wall .wall-golink{display:none}
/* O AliPlayer pode manter vp-loading enquanto um episodio pago devolve 402. A
   regra de loading bloqueia a grade inteira; com a parede aberta a grade precisa
   continuar clicavel para a pessoa voltar a qualquer episodio gratuito. */
.vplayer.is-walled .ep-grid{pointer-events:auto}
@media(max-width:1023px){
  .vplayer.is-walled .vp-top{
    top:12px;right:12px;left:auto;width:auto;padding:0;
    opacity:1;visibility:visible;pointer-events:auto;background:none
  }
  .vplayer.is-walled .vp-wall-close{display:grid}
  /* Sem o titulo, centralizar a coluna fazia os planos mudarem de altura conforme
     o aparelho e parecerem soltos no meio do palco. No mobile eles começam sempre
     logo abaixo da arte VIP. */
  .vplayer .vp-wall.is-plan-wall{
    justify-content:flex-start;
    padding-top:calc(112px + env(safe-area-inset-top,0px))
  }
}

/* Mesmo CTA dourado da folha VIP do header. Os cartoes ja usam esta paleta; o
   botao rosa no meio deles fazia o paywall parecer outro fluxo. */
.wall-plans .wall-buy{
  color:#3a2400;
  background:linear-gradient(135deg,#f5d488,#e0a942);
  box-shadow:0 10px 30px -10px rgba(230,180,90,.6)
}
.wall-plans .wall-buy:hover{
  color:#3a2400;background:linear-gradient(135deg,#f5d488,#e0a942);filter:brightness(1.05)
}

.vp-wall .wall-form,.feed-wall .wall-form{width:100%;max-width:300px;text-align:left}
.vp-wall .field,.feed-wall .field{margin-bottom:10px}
.vp-wall .alert,.feed-wall .alert{width:100%;max-width:300px;margin-bottom:0;text-align:left}
/* 16px NAO e capricho: abaixo disso o Safari do iPhone da zoom ao focar e joga o
   overlay (position:absolute) pra fora da tela — mesmo motivo comentado em
   .modal-auth .input (linha 245). */
.vp-wall .input,.feed-wall .input{font-size:16px}
.vp-wall .input:focus,.feed-wall .input:focus{outline:2px solid var(--primary);outline-offset:1px}
.vp-wall .input.err,.feed-wall .input.err{border-color:#ff6b6b}
.vp-wall .btn[aria-busy="true"],.feed-wall .btn[aria-busy="true"]{opacity:.65;pointer-events:none}
.vp-wall .field[data-fld]:not([hidden]),.feed-wall .field[data-fld]:not([hidden]){animation:fieldIn .22s var(--ease) both}
@media(prefers-reduced-motion:reduce){
  .vp-wall .field[data-fld]:not([hidden]),.feed-wall .field[data-fld]:not([hidden]){animation:none}
}
.wall-micro,.wall-legal{max-width:300px;margin:0;font-size:11px;color:var(--muted2);line-height:1.45}
.wall-legal a{color:inherit;text-decoration:underline}
/* Teclado aberto no iPhone SE: o estado A mede 436px de conteudo e sobram ~260px.
   O `safe` impede o classico do flexbox — justify-content:center CORTA o topo
   quando o conteudo estoura, e a caixa fica sem titulo e sem rolagem pra cima.
   Navegador que nao entende `safe` ignora a linha e mantem o center de hoje. */
.vp-wall,.feed-wall{overflow-y:auto;overscroll-behavior:contain;justify-content:safe center}
.vp-wall::-webkit-scrollbar,.feed-wall::-webkit-scrollbar{display:none}

/* Enquanto a parede esta de pe, some o que fica ABAIXO dela no empilhamento e
   aparece pelo veu (que tem so 75% no topo). Medido: .vp-mute cai em y=261,8..306,2
   e o input do e-mail em y=256,2..306,2 (320x568) — a pilula rosa "Toque para ativar
   o som" fica exatamente em cima do rotulo E-mail. Nao sao controles perdidos: a
   parede ja bloqueava o clique deles. O .vp-top (z20) e o .feed-back (z20) FICAM —
   sao a saida. */
.vplayer.is-walled .vp-mute,.vplayer.is-walled .vp-progwrap,
.vplayer.is-walled .vp-side,.vplayer.is-walled .vp-info,
.vplayer.is-walled .vp-skip,.vplayer.is-walled .vp-playbtn{display:none}
/* ...e o ocioso NÃO pode recolher o .vp-top enquanto a parede está de pé. MEDIDO:
   quem está parada digitando o e-mail é justamente quem não toca em nada, então
   1,5s depois entrava .vp-idle, o topo ia a opacity 0 / visibility hidden e o
   elementFromPoint no centro da seta devolvia div.vp-wall — a única saída morria. */
.vplayer.is-walled.vp-idle .vp-top{opacity:1;visibility:visible;pointer-events:auto}
/* CRITICO pego na verificacao final: com o painel embaixo do video a PAGINA passa a
   rolar, e o #paywall e absolute dentro do palco. Quem rolou pra ler a sinopse batia
   nos 40% e a parede aparecia ACIMA do campo de visao — invisivel. showPaywall() nao
   rola a tela (e nao pode: player.js esta na regra de ouro). Prender o palco enquanto
   a parede esta de pe resolve sem encostar em JS. */
@media(max-width:1023px){
  .vplayer.is-walled .vp-stage{position:sticky;top:0}
  /* Episódio PAGO tocado na grade de episódios: a parede sobe (sticky top:0),
     mas o painel embaixo — que hoje é só a GRADE de episódios — ficava "embutido
     junto", aparecendo colado na parede como se a tela tivesse travado. A faixa
     de preço que justificava manter o painel visível aqui foi REMOVIDA a pedido,
     então some com o painel inteiro enquanto a parede está de pé: a decisão agora
     é assinar/entrar, não escolher outro episódio. */
  .vplayer.is-walled .vp-panel{display:none}
}
.feed-slide.is-walled .feed-muted,.feed-slide.is-walled .feed-side,
.feed-slide.is-walled .feed-info,.feed-slide.is-walled .feed-prog{display:none}
/* Com o painel FORA do video, a parede cobre so o palco — e o painel, com a faixa VIP
   e o preco, fica de pe embaixo dela. Que e exatamente a hora em que a pessoa esta
   decidindo. As linhas acima escondiam .vp-info/.vp-side porque ali eles ficavam
   DEBAIXO da parede, sobrepostos ao video; agora nao ficam mais. PRECISA vir depois
   delas: mesma especificidade, ganha quem vem por ultimo. MEDIDO com is-walled de pe:
   faixa VIP visivel em 320/390/820/844x390/1024/1280 e elementFromPoint no botao do
   plano devolvendo o proprio link. */
.vplayer.is-walled .vp-info,.vplayer.is-walled .vp-side{display:flex}
/* No mobile a parede ocupa o palco inteiro e o painel inferior ja esta oculto.
   Reacender estas duas camadas aqui fazia coracao, salvar e a tag de categoria
   pintarem POR CIMA do paywall perto da borda inferior. No desktop a regra de
   cima continua valendo; no palco mobile nenhuma UI do video atravessa a venda. */
@media(max-width:1023px){
  .vplayer.is-walled .vp-info,.vplayer.is-walled .vp-side{display:none}
}

/* Rede de seguranca baseada no estado REAL da parede. Ha motores legados que
   removem [hidden] antes de a classe is-walled chegar ao player; em navegadores
   modernos :has() mantem o mesmo desenho mesmo nesse intervalo/caminho. O bloco
   fica em @supports para navegadores antigos preservarem as regras acima. */
@supports selector(.vplayer:has(.vp-wall:not([hidden]))){
  .vplayer:has(.vp-wall:not([hidden])) .vp-top>*:not(.vp-wall-close){display:none}
  .vplayer:has(.vp-wall:not([hidden])) .ep-grid{pointer-events:auto}
  .vplayer:has(.vp-wall:not([hidden])) .vp-mute,
  .vplayer:has(.vp-wall:not([hidden])) .vp-progwrap,
  .vplayer:has(.vp-wall:not([hidden])) .vp-skip,
  .vplayer:has(.vp-wall:not([hidden])) .vp-playbtn{display:none}
  .vplayer.vp-idle:has(.vp-wall:not([hidden])) .vp-top{
    opacity:1;visibility:visible;pointer-events:auto
  }
  @media(min-width:1024px){
    .vplayer:has(.vp-wall:not([hidden])) .vp-top{display:none}
  }
  @media(max-width:1023px){
    .vplayer:has(.vp-wall:not([hidden])) .vp-top{
      top:12px;right:12px;left:auto;width:auto;padding:0;
      opacity:1;visibility:visible;pointer-events:auto;background:none
    }
    .vplayer:has(.vp-wall:not([hidden])) .vp-wall-close{display:grid}
    .vplayer:has(.vp-wall:not([hidden])) .vp-stage{position:sticky;top:0}
    .vplayer:has(.vp-wall:not([hidden])) .vp-panel,
    .vplayer:has(.vp-wall:not([hidden])) .vp-info,
    .vplayer:has(.vp-wall:not([hidden])) .vp-side{display:none}
  }
}

/* ─────────────── faixa sem JavaScript ───────────────
   MEDIDO: no mobile .vp-rail e display:contents (linha 1612), entao uma faixa
   ESTATICA ali herda z-index auto e fica debaixo do #video (z1) e do .vp-tap (z5) —
   invisivel, elementFromPoint devolve o .vp-tap. Por isso ela e absolute com
   z-index 18 ate 1023px, voltando pro fluxo do trilho no PC.
   <details> e HTML puro: abre e fecha sem uma linha de JS. Fechado ocupa 53px —
   avisa sem roubar a amostra e sem cobrir a sinopse. */
.wall-nojs{position:absolute;left:12px;right:12px;bottom:calc(14px + env(safe-area-inset-bottom));
  z-index:18;max-height:64dvh;overflow-y:auto;background:var(--card);
  border:1px solid var(--line);border-radius:var(--radius-lg);text-align:left}
.wall-nojs>summary{list-style:none;cursor:pointer;padding:12px 16px;font-size:13px;font-weight:700;
  display:flex;align-items:center;justify-content:space-between;gap:10px}
.wall-nojs>summary::-webkit-details-marker{display:none}
.wall-nojs>summary::after{content:"+";font-size:18px;font-weight:700;color:var(--muted)}
.wall-nojs[open]>summary::after{content:"\2212"}
.wall-nojs-body{padding:0 16px 16px}
.wall-nojs-body p{font-size:12.5px;color:var(--muted);line-height:1.5;margin-bottom:12px}
.wall-nojs .input{font-size:16px}
@media(min-width:1024px){.wall-nojs{position:static;max-height:none;bottom:auto}}

/* ── parede: estado "logada e sem plano" ──────────────────────────────────
   Antes era so titulo + botao: uma confirmacao vazia justo no momento de
   decidir. Os beneficios e o preco dao conteudo pra decisao sem tirar o
   destaque do CTA — nenhuma cor, raio ou tipografia nova. */
.wall-sell{display:flex;flex-direction:column;gap:12px;align-items:center;width:100%;max-width:300px}
.wall-benes{display:flex;flex-direction:column;gap:8px;width:100%;margin:0;padding:0;list-style:none;text-align:left}
.wall-benes li{display:flex;align-items:center;gap:9px;font-size:12.5px;color:var(--txt);line-height:1.35}
.wall-benes .msym{flex:none;color:var(--primary);font-size:16px}
.wall-price{margin:0;font-size:12.5px;font-weight:700;color:var(--premium)}
.wall-sell:not([hidden]){animation:fieldIn .24s var(--ease) both}
@media(prefers-reduced-motion:reduce){.wall-sell:not([hidden]){animation:none}}

/* ---------- aviso flutuante curto (toast) ----------
   Nasceu pro episódio que a ReelShort ainda não liberou: a assinante toca, e em
   vez de tabela de preço (ela já pagou) ou de "erro ao reproduzir" (não é erro
   dela), recebe uma linha de texto que some sozinha. Não tem botão de propósito
   — é recado, não decisão. Fica ACIMA do player em tela cheia, senão no celular
   ele apareceria atrás do vídeo, que é onde a pessoa está olhando. */
.toast{
  position:fixed; left:50%; bottom:calc(22px + env(safe-area-inset-bottom));
  transform:translateX(-50%);
  z-index:2147483000;
  max-width:min(90vw,420px);
  padding:11px 16px;
  border-radius:var(--radius-lg);
  background:rgba(24,24,24,.96);
  border:1px solid var(--line2);
  box-shadow:0 8px 28px rgba(0,0,0,.55);
  color:var(--txt); font-size:13.5px; line-height:1.35; text-align:center;
  backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
  animation:toastIn .22s var(--ease) both;
  pointer-events:none;
}
.toast[hidden]{display:none}
/* ── AVISO DO FLASH (entrou / saiu / erro) ───────────────────────────────────
   REAPROVEITA o .toast que ja existe no site (o mesmo que o app-episodes.js
   usa) — a primeira versao disto criou um segundo .toast e um segundo
   @keyframes toastIn com o mesmo nome, e o de baixo no arquivo vencia: o aviso
   ficava com a duracao e a posicao do OUTRO componente e nunca sumia.
   Aqui so entra o que e diferente: o fio de cor por tipo e o desaparecer
   sozinho. Substitui a faixa .alert que empurrava a pagina inteira pra baixo
   ("a coluna verde") — este nao ocupa espaco nenhum no fluxo.
   Some por animacao, sem JS: o aviso e impresso pelo servidor, entao funciona
   igual com o JavaScript desligado. */
.flashtoast{
  bottom:calc(64px + env(safe-area-inset-bottom) + 14px);   /* acima da menubar */
  font-weight:600;
  animation:toastIn .22s var(--ease) both, flashOut .32s ease 3.4s forwards;
}
@media(min-width:768px){   /* no PC nao ha menubar */
  .flashtoast{bottom:calc(22px + env(safe-area-inset-bottom))}
}
/* SEM COR NENHUMA no aviso comum: cinza, e so. O fio verde/rosa que existia
   aqui era o ultimo residuo da "coluna verde" — pra dizer "voce saiu da conta"
   nao e' preciso pintar nada. So o ERRO merece cor, porque ai a cor e' a
   informacao, nao enfeite. */
.flashtoast-err{box-shadow:0 8px 28px rgba(0,0,0,.55), inset 3px 0 0 #ff6b6b}
@keyframes flashOut{to{opacity:0;transform:translate(-50%,8px);visibility:hidden}}
@media(prefers-reduced-motion:reduce){
  .flashtoast{animation:flashOut .01s linear 3.4s forwards}
}
@keyframes toastIn{from{opacity:0;transform:translate(-50%,10px)}to{opacity:1;transform:translate(-50%,0)}}
@media(prefers-reduced-motion:reduce){.toast{animation:none}}

/* ---------- "Meus pedidos" no perfil ---------- */
.prof-sug-lead{font-size:12.5px;color:var(--muted);margin:10px 0 8px}
.prof-sug-fila{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}
.prof-sug-fila li{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:10px 13px;border-radius:10px;background:var(--card2);border:1px solid var(--line)}
.prof-sug-fila span{font-size:13px;color:var(--txt);line-height:1.3}
.prof-sug-fila em{flex:none;font-style:normal;font-size:11px;font-weight:600;color:var(--muted2);
  text-transform:uppercase;letter-spacing:.4px}

/* ---------- comentários do player ----------
   Mesma folha do compartilhar; o que muda é o conteúdo. Altura limitada com
   rolagem própria: a conversa não pode empurrar o campo de escrever pra fora da
   tela do celular, que é onde a pessoa está. */
.sheet-h{display:flex;align-items:baseline;gap:8px;margin:0 0 12px}
.com-n{font-size:13px;font-weight:600;color:var(--muted)}
.com-list{max-height:46vh;overflow-y:auto;display:flex;flex-direction:column;gap:12px;
  margin-bottom:12px;-webkit-overflow-scrolling:touch}
.com-item{display:flex;gap:10px;align-items:flex-start}
.com-av{position:relative;flex:none;width:48px;height:48px;border-radius:50%;display:grid;place-items:center;
  background:var(--card2);border:1px solid var(--line);font-size:18px;font-weight:700;color:var(--primary)}
/* foto real do autor no lugar da inicial */
.com-av-photo{background:transparent;border:0}
.com-av-img{width:100%;height:100%;border-radius:50%;object-fit:cover;display:block}
/* moldura (badge) do autor por cima da foto — escala única (auraproject) */
.com-av-framed{overflow:visible;background:transparent;border:0;width:40px;height:40px;margin-right:14px}
/* a moldura transborda ~18px pra cada lado da caixa de 40px; a margem à direita
   reserva esse espaço pra ela não colar/sobrepor a bolha do comentário ao lado */
.com-av-frame{position:absolute;top:50%;left:50%;
  width:calc(100% * var(--fs,1.9));height:calc(100% * var(--fs,1.9));max-width:none;max-height:none;
  transform:translate(-50%, calc(-50% - var(--fy,0) * 1%));object-fit:contain;pointer-events:none;z-index:2}
.com-body{flex:1;min-width:0}
.com-au{font-size:13px;font-weight:600;color:var(--txt)}
.com-t{font-size:11px;color:var(--muted2);margin-left:7px}
/* LIMITE de conteúdo: no máximo 2 linhas, com reticências, e quebra palavra
   gigante (o "TesteTesteTeste…" sem espaço estourava o balão). A largura é
   barrada em .com-item-bg. */
.com-tx{margin:3px 0 0;font-size:13.5px;line-height:1.45;color:var(--txt);
  overflow-wrap:break-word;text-wrap:balance;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  line-clamp:2;overflow:hidden}
/* BALÃO DO CHAT do autor: border-image 9-slice SÓ no texto da mensagem — o avatar
   e o nome ficam FORA, como chat de verdade e IGUAL ao feed da comunidade
   (.comm-row-quote.has-bubble). Envolver o corpo inteiro (nome+hora+texto)
   esticava o ornamento e vazava pra fora da linha; envolver só o .com-tx deixa o
   balão justo ao texto. Canto fixo, meio estica — nunca distorce. */
.com-tx.has-bubble{display:inline-block;align-self:flex-start;max-width:min(100%,420px);
  margin-top:6px;padding:3px 10px;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.7);
  background:transparent;border:15px solid transparent;border-radius:0;
  border-image-slice:30 34 30 34 fill;border-image-width:15px 17px 15px 17px;border-image-repeat:stretch;
  -webkit-line-clamp:unset;line-clamp:unset;overflow:visible}
.com-form{display:flex;gap:8px;align-items:center}
.com-form .input{flex:1}
.com-erro{color:var(--red);margin:8px 0 0}
/* contador de caracteres (atual/limite) dentro da barra */
.com-inwrap{position:relative;flex:1;display:flex}
.com-input-count{flex:1;padding-right:58px}
.com-count{position:absolute;right:12px;top:50%;transform:translateY(-50%);font-size:11px;
  color:var(--muted2);pointer-events:none;font-variant-numeric:tabular-nums}
.com-count-near{color:#e0a94a}
.com-count-full{color:#ff6b6b}
/* ações do comentário: editar (dono) e apagar (dono/admin) */
.com-acts{display:flex;gap:6px;margin-top:7px}
.com-act{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:8px;
  background:rgba(255,255,255,.06);border:0;color:var(--muted2);cursor:pointer;transition:background .15s,color .15s}
.com-act:hover{background:rgba(255,255,255,.12);color:var(--txt)}
.com-del:hover{background:rgba(229,72,77,.18);color:#ff6b6b}
.com-body.has-bubble .com-act{background:rgba(0,0,0,.30);color:rgba(255,255,255,.9)}
.com-body.has-bubble .com-act:hover{background:rgba(0,0,0,.45)}
.com-edited{font-size:10.5px;color:var(--muted2);margin-left:7px}
.com-body.has-bubble .com-edited{color:rgba(255,255,255,.85)}
/* edição inline */
.com-edit-form{display:flex;gap:6px;align-items:center;margin-top:7px;flex-wrap:wrap}
.com-edit-in{flex:1;min-width:150px}
.com-ecancel{background:transparent;border:0;color:var(--muted2);font-size:12px;font-weight:600;cursor:pointer}

/* ---------- barra lateral some junto com a timeline ----------
   Pedido do dono: quando os controles recolhem, os botões da direita recolhem
   também. Faz sentido de UX — a coluna de seis ícones é o que mais tapa o vídeo
   num celular, e quem está assistindo quer a cena, não a interface.

   SÓ ABAIXO DE 1024. No PC o .vp-side não fica sobre o vídeo: ele mora no
   trilho da direita (position:static), e some-lo esvaziaria a coluna sem motivo
   — tanto que o próprio bloco de 1024 já mantém ele visível no ocioso. Estas
   regras entram no fim do arquivo, então sem o media query elas venceriam
   aquela exceção e quebrariam o desktop. */
@media (max-width: 1023px) {
  .vp-side{transition:opacity .28s ease,visibility .28s ease,transform .28s ease}
  .vplayer.vp-idle .vp-side{opacity:0;visibility:hidden;pointer-events:none;transform:translateX(8px)}

  /* Degradê atrás da coluna: dá contraste pro ícone branco em cena clara sem
     desenhar caixa nenhuma. Sai de cena junto com os botões.

     AS QUATRO BORDAS PRECISAM MORRER EM NADA. A primeira versão era só um
     gradiente horizontal dentro de um retângulo: a esquerda desmanchava, mas o
     topo e a base cortavam reto e apareciam como uma faixa mais clara colada na
     coluna — foi o "corte" que o dono viu na tela.
     A máscara vertical resolve o que o gradiente não alcança: ela apaga o
     próprio elemento nas pontas, então não existe mais aresta pra enxergar.
     Sobra bem além dos botões (-70px) pra que o desmanche aconteça fora da área
     onde o olho está. */
  /* ATENCAO AO INSET DA DIREITA. Ele era -40px, e a coluna fica a 8px da borda:
     sobravam 32px de caixa PRA FORA DA TELA. O navegador nao corta isso — ele
     ESTICA a viewport (medido: 390 virava 429), e a pagina inteira passava a
     rolar de lado, com a faixa escura do degrade aparecendo solta na direita.
     Foi assim que o dono viu, e o meu proprio teste nao pegou porque eu comparava
     a largura da pagina com innerWidth, que ja vinha esticado — 429 = 429, "ok".
     -8px encosta exatamente na borda: a ponta escura do degrade morre no fim da
     tela, que e onde ela ja ia sumir de qualquer jeito. */
  .vp-side::before{
    content:"";position:absolute;inset:-70px -8px -70px -78px;z-index:-1;pointer-events:none;
    background:linear-gradient(to left,
      rgba(0,0,0,.58) 0%,
      rgba(0,0,0,.42) 26%,
      rgba(0,0,0,.20) 58%,
      rgba(0,0,0,0)   100%);
    /* MEDIDO: a coluna tem 362px e o degradê 502px (os -70px de sobra em cima e
       embaixo), então os botões começam a 14% e terminam a 86% da altura dele.
       Com o desmanche indo até 22% o PRIMEIRO e o ÚLTIMO botão caíam dentro da
       zona que apaga e ficavam sem fundo — justamente o "Curtir" e o "Tela
       cheia". Parar em 12% / 88% deixa a parte cheia cobrindo os seis e ainda
       sobra folga pra dissolver fora do alcance do olho. */
    -webkit-mask-image:linear-gradient(to bottom,transparent 0,#000 12%,#000 88%,transparent 100%);
            mask-image:linear-gradient(to bottom,transparent 0,#000 12%,#000 88%,transparent 100%);
    opacity:1;transition:opacity .28s ease;
  }
  .vplayer.vp-idle .vp-side::before{opacity:0}

  /* Tela cheia por último. A folga separa "ações" de "modo de ver", mas 14px em
     cima do gap de 12 dava 26 — o dobro do resto, e o botão parecia solto do
     grupo. 5px chega a 17: dá pra perceber a divisão sem descolar. */
  .vp-side .vp-fs{margin-top:5px}
}

/* curtido: o número acompanha o coração */
/* is-fav (nao mais is-on): o coracao passou a ser o proprio botao de salvar, e
   quem marca o estado ligado e a classe do favorito. */
.vp-act.is-fav .vp-act-n{color:var(--primary)}

/* ---------- título ao lado da seta de voltar ----------
   Discreto de propósito: o protagonista é o vídeo. Duas linhas no máximo, com
   corte por reticências — título de dorama passa de 60 caracteres com
   frequência e não pode empurrar nada. Some junto com o resto da interface,
   pelas regras de .vp-top que já existem. */
.vp-head{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;
  min-width:0;flex:1;pointer-events:none}
.vp-head-t{font-size:15px;font-weight:700;color:#fff;line-height:1.2;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  text-shadow:0 1px 6px rgba(0,0,0,.55)}
.vp-head-s{font-size:11.5px;font-weight:500;color:rgba(255,255,255,.72);line-height:1.3;margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  text-shadow:0 1px 5px rgba(0,0,0,.5)}
@media (min-width:1024px){ .vp-head{display:none} }   /* no PC o título já está no trilho */

/* ---------- relatar problema ----------
   Botão de saída de emergência: existe, mas não disputa atenção com nada. Sem
   fundo, texto pequeno, cor apagada — quem não está com problema não vê. */
.vp-report{display:inline-flex;align-items:center;gap:6px;margin:4px 0 2px;padding:8px 0;
  background:none;border:0;cursor:pointer;font-size:12.5px;color:var(--muted2);
  transition:color .15s}
.vp-report:hover{color:var(--muted)}
.vp-report .msym{font-size:15px}
.rep-lead{font-size:13px;color:var(--muted);margin:0 0 14px;line-height:1.45}
.rep-tipos{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.rep-tipo{padding:9px 13px;border-radius:999px;cursor:pointer;font-size:12.5px;
  background:var(--card2);border:1px solid var(--line);color:var(--txt);transition:.15s}
.rep-tipo:hover{border-color:var(--line2)}
.rep-tipo.on{background:var(--primary);border-color:var(--primary);color:var(--primary-ink);font-weight:600}
.rep-detalhe{width:100%;resize:vertical;font-size:13px}
.rep-ok{margin:12px 0 0;text-align:center;font-size:13.5px;color:var(--green);font-weight:600}

/* ═══════════════════════════════════════════════════════════════════════════
   BARRA DE BAIXO FLUTUANTE + MENU DE CONTA NO TOPO
   ═══════════════════════════════════════════════════════════════════════════
   Entra no FIM do arquivo de proposito: sobrescreve o bloco de ~1013 e o de
   ~1330 sem precisar caçar e reescrever aquelas regras (que continuam sendo a
   base — cores, pilula do ativo, rotulo). */
@media(max-width:767px){
  /* Descolada das bordas: a barra vira um objeto sobre a pagina, nao uma
     tarja colada no fim dela. É o que faz parecer app e nao site. */
  .tabbar{
    left:10px;right:10px;
    bottom:calc(10px + env(safe-area-inset-bottom));
    padding-bottom:0;
    border:1px solid rgba(255,255,255,.09);
    border-radius:26px;
    /* .82 e nao .72: com o vidro mais fino, o texto das capas que passam por
       tras ("EM BREVE") competia com os rotulos da propria barra. */
    background:rgba(14,14,18,.82);
    -webkit-backdrop-filter:blur(22px) saturate(1.7);backdrop-filter:blur(22px) saturate(1.7);
    box-shadow:0 18px 40px -14px rgba(0,0,0,.85),0 0 0 1px rgba(0,0,0,.35),
               inset 0 1px 0 rgba(255,255,255,.07);
  }
  /* o corpo precisa render o quanto a barra subiu, senao o ultimo card fica
     por baixo dela */
  body{padding-bottom:calc(var(--tab-h) + 26px + env(safe-area-inset-bottom))}
  .tabbar-in{height:62px;padding:7px 4px 5px;align-items:center;justify-content:space-between}
  .tabbar a{justify-content:center}
  .tabbar a .ico-wrap{width:52px;height:30px}

  /* ── item central: Indique e Ganhe ──────────────────────────────────────
     Cresce mais que os vizinhos e ganha um halo rosa fraco. O ponto e ser
     achado sem gritar: nada de fundo solido nem de botao flutuante gigante,
     que roubariam a atencao de quem so quer assistir. */
  .tabbar a.tb-ganhe{flex:1.25;color:var(--primary)}
  /* `a.tb-ganhe` e nao so `.tb-ganhe`: a regra generica `.tabbar a .ico-wrap`
     tem um seletor de TIPO no meio e por isso vence uma feita so de classes.
     Resultado: o wrap continuava 52x30 com um presente de 32px dentro e
     `overflow:hidden` — o presente saia CORTADO na base. */
  .tabbar a.tb-ganhe .ico-wrap{
    width:58px;height:42px;margin-top:-6px;border-radius:16px;
    background:radial-gradient(60% 70% at 50% 45%,rgba(255,117,168,.26),transparent 72%);
    overflow:hidden
  }
  .tb-ganhe .ico-wrap::before{display:none}   /* o halo substitui a pilula do ativo */
  /* 30px numa caixa de 42: sobra folga em cima e embaixo pra nenhuma sombra ou
     borda do desenho encostar na aresta que corta o brilho. */
  .tb-gift{width:30px;height:30px;object-fit:contain;
    filter:drop-shadow(0 3px 8px rgba(255,117,168,.55))}
  .tb-ganhe span:last-child{font-weight:800;font-size:10.5px;color:var(--primary)}
  .tb-ganhe:active .ico-wrap{transform:scale(.9)}

  /* BRILHO SO NO PRESENTE.
     Antes o .tb-shine ocupava a caixa inteira (58x42) e a faixa de luz varria o
     halo e o vazio dos lados junto — parecia um retangulo claro passando pela
     barra, nao um reflexo no laco do presente.
     Agora ele tem o TAMANHO DO DESENHO (30x30, centralizado no mesmo ponto) e a
     luz e recortada pela silhueta do proprio presente com mask-image: o que
     brilha e so o que esta pintado no PNG.
     Varre rapido e depois fica parado ~2,5s — brilho continuo vira ruido de
     fundo e a pessoa para de ver. */
  .tb-shine{
    position:absolute;top:50%;left:50%;width:30px;height:30px;
    transform:translate(-50%,-50%);pointer-events:none;overflow:hidden;
    /* caminho relativo ao proprio .css: nao depende de style inline (CSP) nem
       de o PHP passar a URL */
    -webkit-mask-image:url("../img/ui/gift.webp");mask-image:url("../img/ui/gift.webp");
    -webkit-mask-size:contain;mask-size:contain;
    -webkit-mask-position:center;mask-position:center;
    -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat
  }
  .tb-shine::after{
    content:"";position:absolute;top:-60%;left:-90%;width:55%;height:220%;
    transform:rotate(18deg);
    background:linear-gradient(100deg,transparent,rgba(255,255,255,.85),transparent);
    animation:tbShine 3.6s ease-in-out infinite
  }
  @keyframes tbShine{0%,68%{left:-90%}100%{left:150%}}

  /* Quem pede menos animacao no sistema nao ganha brilho nenhum — o item
     continua maior e rosa, que ja e o destaque. */
  @media (prefers-reduced-motion:reduce){
    .tb-shine::after{animation:none;opacity:0}
  }
}

/* ── menu de conta do topo (agora tambem no celular) ────────────────────── */
.drop-conta > summary{gap:3px;padding:0 6px 0 4px}
.drop-conta .avatar{width:48px;height:48px}
/* No celular a seta so ocupa espaco ao lado do avatar, que ja diz "sou eu".
   `> summary > .msym` e nao `summary .msym:last-child`: o icone DENTRO do
   .avatar tambem e um .msym e tambem e ultimo filho do pai dele — a regra
   frouxa apagava o bonequinho e sobrava um circulo vazio no topo. */
@media(max-width:767px){
  .drop-conta > summary > .msym{display:none}
  .drop-menu{min-width:236px}
}

/* "Minha conta" e um CARTAO, nao mais um item de lista: e o destino mais
   pedido do menu e serve de confirmacao de qual conta esta logada. */
.drop-conta-card{
  display:flex;align-items:center;gap:10px;padding:10px 11px;margin-bottom:6px;
  border-radius:12px;background:linear-gradient(135deg,rgba(255,117,168,.16),rgba(255,117,168,.05));
  border:1px solid rgba(255,117,168,.24);color:var(--txt)!important
}
.drop-conta-card:hover{background:linear-gradient(135deg,rgba(255,117,168,.24),rgba(255,117,168,.09))}
.drop-conta-card .avatar{width:54px;height:54px;flex:0 0 auto;position:relative}
/* card VIP: fundo com a arte do nível */
.drop-conta-card.is-vip{background-size:cover;background-position:center;border-color:rgba(230,180,90,.55)}
.drop-conta-card.is-vip .dc-txt b,.drop-conta-card.is-vip .dc-txt span{color:#fff}
/* ── MOLDURA VIP em volta do avatar (o avatar do usuário fica DENTRO) ──
   Tira o aro/fundo rosa do .avatar base (senão aparece um anel rosa por dentro
   da moldura) e escala a moldura por --vf, igual ao perfil: cada frame tem furo
   de tamanho diferente e um valor fixo desalinhava. */
.avatar.vip-framed{position:relative;overflow:visible;background:transparent;border:0}
/* foto no FURO da moldura (76% do avatar, centrada) + moldura CAPADA (tamanho fixo,
   não domina) — mesmo tratamento das listas/perfil que ficaram bons. */
.avatar.vip-framed > img{position:absolute;top:50%;left:50%;width:76%;height:76%;
  transform:translate(-50%,-50%);border-radius:50%;object-fit:cover}
.vip-frame{position:absolute;top:50%;left:50%;
  width:min(calc(100% * var(--fs,1.9)),calc(100% * 1.56));height:min(calc(100% * var(--fs,1.9)),calc(100% * 1.56));
  max-width:none;max-height:none;
  transform:translate(-50%, calc(-50% - var(--fy,0) * 1%));pointer-events:none;z-index:4;object-fit:contain}
/* avatar do topo (summary) um pouco menor pra a moldura capada caber sem invadir */
.drop-conta > summary .avatar{width:42px;height:42px}
.drop-conta-card .dc-txt{display:flex;flex-direction:column;min-width:0;flex:1}
.drop-conta-card .dc-txt b{font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.drop-conta-card .dc-txt span{font-size:10.5px;color:var(--muted2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.drop-conta-card .msym:last-child{margin-left:auto;color:var(--primary);opacity:.8}
/* Indique e Ganhe tambem se destaca aqui, na mesma cor da aba do menubar */
.drop-menu a.drop-ganhe{color:var(--primary);font-weight:600}

/* ── "Em breve": botao de salvar dentro da propria caixa ──────────────────
   O coracao da coluna lateral continua funcionando, mas ali nao serve: a tela
   nao esta tocando nada, entao a cliente nao tem motivo pra olhar pro lado.
   Este e o unico gesto util da tela e precisa estar no caminho dos olhos. */
.soon-fav{margin-top:6px}
.soon-fav .btn{display:inline-flex;align-items:center;gap:8px;padding:0 20px;height:42px}
/* Salvo: sai do rosa cheio e vira contorno — a acao ja foi feita, e continuar
   gritando faria a pessoa achar que nao pegou. */
.soon-fav .fav-btn.is-fav{
  background:transparent;border:1px solid rgba(255,117,168,.5);color:var(--primary)
}
.soon-fav .fav-btn.is-fav .msym{color:var(--primary)}

/* ── bolinha de novidade (estilo WhatsApp) ────────────────────────────────
   Vermelho e nao rosa da marca: a barra inteira ja e rosa, e um selo cor de
   marca em cima de fundo cor de marca deixa de ser selo. Aqui ele precisa
   gritar "tem coisa nova", nao combinar. */
.dot-novo{
  position:absolute;top:-3px;right:6px;z-index:3;
  min-width:16px;height:16px;padding:0 4px;border-radius:999px;
  background:#ff3b30;color:#fff;font-size:9.5px;font-weight:800;line-height:16px;
  text-align:center;letter-spacing:0;
  border:2px solid #101014;   /* recorte escuro: separa do icone atras */
  box-shadow:0 2px 8px -2px rgba(255,59,48,.8);
  animation:dotPulse 2.4s ease-in-out infinite
}
/* No avatar do topo e so um ponto — nao ha espaco pra numero num circulo de 30px */
.dot-mini{min-width:9px;width:9px;height:9px;padding:0;top:-1px;right:-1px;font-size:0;border-width:2px}
@keyframes dotPulse{0%,70%,100%{transform:scale(1)}80%{transform:scale(1.18)}}
@media (prefers-reduced-motion:reduce){.dot-novo{animation:none}}
/* o .ico-wrap da barra e o .avatar do topo precisam ancorar a bolinha */
.tabbar a .ico-wrap,.drop-conta .avatar{position:relative}
/* .avatar tem overflow escondido pra recortar a foto; a bolinha fica na borda */
.drop-conta > summary .avatar{overflow:visible}

/* frase do perfil quando ela chega pela bolinha */
.prof-sug-lead.novo{color:var(--primary);font-weight:700}

/* ═══════ prova social do modal de entrada ═══════════════════════════════════
   UMA LINHA. Aqui teve numero de 28px + linha do catalogo + tres vantagens com
   icone; virou um paredao de seis linhas que a pessoa pula, e os pictogramas
   davam cara de material generico. Sobrou o numero, que e a unica prova que
   fala da MESMA acao pedida no campo logo abaixo.

   Sem regra, sem caixa, sem fundo: a hierarquia vem do peso do numero. Qualquer
   moldura aqui dentro faz o bloco ler como anuncio encaixado no modal. */
/* UM EIXO SO: tudo pela esquerda, menos a logo.
   Tentei centralizar o cabecalho inteiro pra acompanhar a logo e ficou pior —
   titulo, subtitulo e numero no centro, mas rotulo, campo e a lista de check na
   esquerda: dois eixos brigando no mesmo cartao, e o olho nao sabe onde comeca
   a linha. A logo sozinha no centro le como MARCA (tem tamanho e respiro
   proprios), nao como texto desalinhado. */
/* Centralizada porque agora e do BLOCO DA MARCA: logo + prova, os dois com o
   mesmo eixo. Dai pra baixo (titulo, subtitulo, campo, checks) tudo corre
   pela esquerda. Um eixo pra identidade, um eixo pra leitura. */
/* nowrap nas carinhas: elas tem que ficar NA MESMA LINHA do numero. Com wrap,
   os tres circulos pulavam pra cima e viravam enfeite solto em vez de sujeito
   da frase. O texto e que quebra, se precisar.
   CENTRALIZADA, mesmo com o resto a esquerda. Parece contradizer o que a gente
   fez no cabecalho, mas e outro caso: la eram titulo e subtitulo centrados com
   rotulo e campo a esquerda — dois blocos de TEXTO CORRIDO em eixos diferentes,
   e o olho se perdia. Aqui e uma peca unica, curta, sozinha entre o botao
   largura-cheia e a lista de checks; centrada ela fica com o mesmo centro do
   botao logo acima, e encostada a esquerda ficava pendurada num canto. */
.lg-social{display:flex;align-items:center;justify-content:center;gap:9px;
  margin:16px 0 2px;font-size:12.5px;color:var(--muted);line-height:1.4}
.lg-social > span:last-child{min-width:0}

/* CARINHAS EMPILHADAS. O numero sozinho e placar; tres circulos com a inicial
   de quem assina viram gente. A borda da cor do cartao e o que cria o recorte
   entre eles — sem ela viram uma mancha rosa unica.
   Matizes levemente diferentes pelo mesmo motivo: tres circulos identicos leem
   como enfeite repetido, tres parecidos leem como tres pessoas. */
.lg-faces{display:flex;flex:none}
.lg-faces span{
  width:25px;height:25px;border-radius:50%;display:grid;place-items:center;
  font-family:'Poppins',sans-serif;font-size:10.5px;font-weight:800;color:#fff;
  border:2px solid var(--card);margin-left:-9px;
  background:linear-gradient(135deg,var(--primary),var(--primary-2))
}
.lg-faces span:first-child{margin-left:0}
.lg-faces span:nth-child(2){background:linear-gradient(135deg,#c86bd6,var(--primary))}
.lg-faces span:nth-child(3){background:linear-gradient(135deg,#ff9d6b,var(--primary))}

/* VOLTAR PRO E-MAIL. Discreto de proposito: e uma saida de emergencia pra quem
   errou uma letra, nao um caminho concorrente com o botao rosa. */
/* Colado no botao (10px) porque explica o clique que acabou de acontecer; no
   fim da caixa ele chegava depois da prova social e dos checks, tarde demais
   pra tranquilizar quem hesita. */
.lg-foot{margin:10px 0 0}
.lg-foot[hidden]{display:none}
.lg-volta{margin:6px 0 0;text-align:center}
.lg-perks{margin-top:15px}
.lg-volta[hidden]{display:none}
.lg-volta a{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--muted2);
  padding:5px 10px;border-radius:999px;transition:.15s}
.lg-volta a:hover{color:var(--txt);background:rgba(255,255,255,.06)}
.lg-volta .msym{color:inherit}
/* 17px e nao 28: o titulo "Entrar" tem 20px, e numero maior que o titulo cria
   dois destaques e nenhum vence. var(--txt) e nunca var(--primary) — o rosa e
   do botao. tabular-nums pra o numero nao dancar quando muda de faixa. */
/* margin-right de 4px: o numero em 17px semibold colado num texto de 12.5px
   ficava grudado, sem a pausa que a leitura pede entre valor e rotulo.
   tabular-nums e obrigatorio por causa do contador: com largura variavel o
   texto ao lado dança a cada quadro da contagem. */
.lg-social b{font-family:'Poppins',sans-serif;font-size:17px;font-weight:800;
  color:var(--txt);letter-spacing:-.02em;font-variant-numeric:tabular-nums;margin-right:4px}

/* Linha do "aqui agora". O ponto pulsa SO nela: pulsar ao lado de numero
   historico e mentir com CSS — sugere tempo real onde nao ha. */
.lg-online{display:flex;align-items:center;justify-content:center;gap:7px;margin:7px 0 0;
  font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.lg-online i{flex:none;width:6px;height:6px;border-radius:50%;background:var(--primary);
  animation:lgPulse 2s ease-out infinite}
@keyframes lgPulse{
  0%{box-shadow:0 0 0 0 rgba(255,117,168,.55)}
  70%{box-shadow:0 0 0 7px rgba(255,117,168,0)}
  100%{box-shadow:0 0 0 0 rgba(255,117,168,0)}
}
@media (prefers-reduced-motion:reduce){.lg-online i{animation:none}}

/* O partial de icone devolve <span class="msym">, nao <svg> — a regra antiga
   (.modal-perks li svg) nunca pintou nada. Vale pro modal de planos, que e quem
   usa .modal-perks agora. */
.modal-perks li .msym{flex:none;margin-top:1px;color:var(--primary);opacity:.85}
/* No login sao frases de UMA linha: alinhar pelo centro em vez do topo, e um
   respiro maior porque aqui elas vem logo abaixo do botao rosa. */
.lg-perks{margin-top:15px;gap:9px}
.lg-perks li{align-items:center}
.lg-perks li .msym{margin-top:0}

/* Tela baixa (iPhone SE com teclado aberto): o campo de e-mail nao pode exigir
   rolagem pra ser alcancado. Some o que e reforco, fica o que e prova. */
@media (max-height:660px){
  .lg-social{margin:8px 0 12px}
  .lg-online{margin:-8px 0 12px}
}

/* titulo das secoes do passo de pagamento da folha — mesmo papel do <h2> da
   pagina /pagamento, so que menor porque aqui e overlay */
/* RITMO. Estava .ss-fieldsh{margin:14px 0 8px} contra .ss-box .field{margin-bottom:10px}
   = 1,4x. A regra que Stripe, Shopify e Material seguem e gap-de-grupo >= 2x o
   gap-de-campo; abaixo disso o olho nao enxerga grupo nenhum e a tela vira uma
   pilha de caixas iguais — e por isso que "Seus dados" e "Forma de pagamento"
   nao pareciam duas coisas diferentes.
   ALTURA: .input{padding:12px 14px;font-size:14px} com o line-height herdado da
   47px no PC e 50px no iOS (que forca 16px). Altura diferente por plataforma e a
   definicao de porco. 48px travado, line-height 1.25 pra a fonte parar de mandar
   na caixa. 16px tambem fora do iOS porque o Samsung Internet da zoom ao focar
   campo menor que isso e joga o overlay fixed pra fora da tela.
   FOCO: esta era a UNICA tela de formulario do site sem outline — justo a tela
   onde dinheiro troca de mao, com 1px de rosa a 55% que num celular ao sol nao
   se distingue da borda normal.
   PLACEHOLDER: #6b6b6b sobre #181818 = 3,4:1. E por isso que o dono jurou que o
   campo do numero estava "sem placeholder" — ele esta la desde sempre, so nao
   dava pra ver. #8a8a8a da 5,1:1 e continua bem mais fraco que o texto digitado
   (#fff), entao nao passa a impressao de campo ja preenchido. */
/* SECAO NUMERADA. Era 11.5px em cinza, do mesmo tamanho do apoio dos campos —
   nao lia como cabecalho, lia como mais uma linha de texto. Agora tem numero
   dourado num circulo e texto claro no tamanho de titulo: a cliente ve QUANTAS
   etapas existem e em qual esta, que e o que falta pra quem nunca comprou
   online. O contador e do CSS, entao nao ha numero escrito no markup pra
   dessincronizar se uma secao entrar ou sair. */
.ss-payform{counter-reset:sec}
.ss-fieldsh{counter-increment:sec;display:flex;align-items:center;justify-content:center;gap:9px;
  font-size:15px;font-weight:800;letter-spacing:-.01em;text-transform:none;
  color:var(--txt);margin:26px 0 14px;padding-top:20px;border-top:1px solid var(--line);text-align:center}
.ss-fieldsh::before{content:counter(sec);flex:none;display:grid;place-items:center;
  width:23px;height:23px;border-radius:50%;
  font-size:12px;font-weight:800;color:#2a1c05;
  background:linear-gradient(135deg,#f0c674,#d19a3c)}
.ss-fieldsh:first-of-type{margin-top:4px;padding-top:0;border-top:0}
.ss-box .field{margin-bottom:14px}
.ss-box .field label{font-size:13px;font-weight:600;color:var(--txt)}
.ss-box .field .hint{font-size:12.5px;color:var(--muted);margin-top:2px}
/* Busca ao digitar do painel: enquanto a resposta nao chega, a lista atual fica
   um pouco apagada. Sem nenhum sinal, digitar parecia nao ter efeito ate a tela
   trocar de uma vez. */
.adm-filters.buscando ~ .adm-tablewrap,
.adm-filters.buscando ~ .pager{opacity:.55;transition:opacity .12s}
/* O RECADO DO CAMPO ERRADO, embaixo dele. Ate aqui o erro so aparecia na tarja
   do topo do passo: com nove campos na tela, a cliente lia "esse CPF nao
   confere" a 400px de distancia do CPF e nao ligava as duas coisas — quando
   chegava a ver, porque a tarja podia estar fora da area visivel.
   Vermelho e com um "!" redondo, no tamanho do apoio: nao e alarme, e
   instrucao — ela precisa LER o que consertar. */
.ss-box .ss-fielderr{display:flex;align-items:flex-start;gap:6px;
  font-size:12.5px;font-weight:600;line-height:1.35;color:#ff8080;margin:6px 0 0}
.ss-box .ss-fielderr[hidden]{display:none}
.ss-box .ss-fielderr::before{content:"!";flex:none;display:grid;place-items:center;
  width:15px;height:15px;margin-top:1px;border-radius:50%;
  font-size:10px;font-weight:800;color:#2a0d0d;background:#ff8080}
.ss-box .input{min-height:48px;padding:13px 14px;line-height:1.25;font-size:16px;min-width:0}
/* foco tambem dourado: dentro desta folha, rosa deixou de significar "ativo" */
.ss-box .input:focus{outline:2px solid #e6b45a;outline-offset:1px;border-color:transparent}
.ss-box .input.err{border-color:#ff6b6b;background:rgba(255,69,58,.06)}
.ss-box .input::placeholder{color:#8a8a8a;opacity:1}   /* opacity:1 e obrigatorio no Firefox */
/* o <select> de parcelas vinha com o widget nativo do sistema por cima do tema
   escuro: cinza claro no Android, azul no iOS. Seta em gradiente, sem SVG. */
.ss-box select.input{height:48px;appearance:none;-webkit-appearance:none;padding-right:40px;cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,var(--muted) 50%),
                   linear-gradient(135deg,var(--muted) 50%,transparent 50%);
  background-position:calc(100% - 20px) 50%,calc(100% - 14px) 50%;
  background-size:6px 6px,6px 6px;background-repeat:no-repeat}

/* ═══════════════════════════════════════════════════════════════════════════
   SELETOR DE IDIOMA — 19 idiomas
   ───────────────────────────────────────────────────────────────────────────
   Com dois idiomas o dropdown cabia na tela e crescia sozinho. Com 19 ele
   passaria da altura da janela e os ultimos ficariam inalcancaveis no celular,
   porque o <details> nao rola junto com a pagina. Daqui pra frente a lista tem
   altura maxima e rolagem propria.
   ═══════════════════════════════════════════════════════════════════════════ */

.drop-lang-list{
  max-height:min(60vh,22rem);
  overflow-y:auto;
  overscroll-behavior:contain;          /* rolar ate o fim nao arrasta a pagina atras */
  -webkit-overflow-scrolling:touch;
  min-width:15rem;
  scrollbar-width:thin;
  scrollbar-color:rgba(255,255,255,.22) transparent;
}
.drop-lang-list::-webkit-scrollbar{width:6px}
.drop-lang-list::-webkit-scrollbar-thumb{background:rgba(255,255,255,.22);border-radius:3px}

.drop-lang-list > a{
  display:flex;align-items:center;gap:.6rem;
  padding:.5rem .7rem;white-space:nowrap;
}
.drop-lang-list .flag{flex:0 0 auto;border-radius:2px}

/* O nome ocupa o espaco livre e empurra a contagem pra direita. */
.drop-lang-list .lang-nome{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}

/* Contagem de titulos: informacao secundaria, entao pesa menos que o nome. */
.drop-lang-list .lang-qtd{
  flex:0 0 auto;font-weight:600;font-size:.78rem;
  color:rgba(255,255,255,.45);font-variant-numeric:tabular-nums;
}
.drop-lang-list > a.on .lang-qtd{color:rgba(255,255,255,.7)}

/* ═══════════════════════════════════════════════════════════════════════════
   ARABE (dir="rtl")
   ───────────────────────────────────────────────────────────────────────────
   O <html dir="rtl"> ja espelha o texto sozinho, mas tres coisas ficam de fora
   e precisam ser ditas: os icones direcionais (que apontariam pro lado errado),
   o carrossel (que rola na mao contraria) e a barra de baixo.
   ═══════════════════════════════════════════════════════════════════════════ */

[dir="rtl"] .drop-lang-list > a{flex-direction:row}
[dir="rtl"] .drop-menu.right{right:auto;left:0}

/* Seta de "voltar"/"avancar" aponta pro outro lado quando a leitura inverte. */
[dir="rtl"] .ico-chevron-right,
[dir="rtl"] .ico-chevron-left{transform:scaleX(-1)}

/* O carrossel continua sendo arrastado com o dedo; so a origem muda. */
[dir="rtl"] .row-scroll{direction:rtl}
[dir="rtl"] .row-scroll > *{direction:ltr}   /* o card em si nao inverte */

/* Numero do Top 10 atras da capa: no RTL ele encosta no outro canto. */
[dir="rtl"] .top10-num{left:auto;right:-.15em}

/* ══════════════════════════════════════════════════════════════════════════
   COMUNIDADE — feed de atividade, números, online, em alta, novos membros.
   Duas colunas no desktop (conteúdo + barra lateral), empilha no celular.
   ══════════════════════════════════════════════════════════════════════════ */
.comm{max-width:1180px;margin:0 auto;padding:22px 16px 90px}
@media(min-width:640px){.comm{padding:26px 24px 90px}}
@media(min-width:1024px){.comm{padding:30px 40px 90px}}

/* ── cabeçalho ── */
.comm-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:22px}
.comm-head h1{font-family:'Poppins',sans-serif;font-size:32px;font-weight:800;line-height:1.05;letter-spacing:-.5px}
.comm-sub{color:var(--muted);font-size:14px;margin-top:6px;max-width:520px}
.comm-online-pill{display:inline-flex;align-items:center;gap:8px;flex:none;
  background:var(--card2);border:1px solid var(--line);border-radius:999px;padding:9px 14px;color:var(--txt);font-size:13px}
.comm-online-pill b{font-weight:800}
.comm-online-pill span{color:var(--muted)}
.comm-online-pill .msym{color:var(--muted2)}
.comm-online-pill:hover{border-color:rgba(255,117,168,.4)}
.comm-dot{width:8px;height:8px;border-radius:50%;background:#33d17a;box-shadow:0 0 0 3px rgba(51,209,122,.18);flex:none}

/* ── cartões de número ── */
.comm-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.comm-stats-5{grid-template-columns:repeat(5,1fr)}
@media(max-width:860px){.comm-stats,.comm-stats-5{grid-template-columns:repeat(2,1fr)}}
.comm-stat{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:15px 16px;min-width:0}
.comm-stat-l{display:block;color:var(--muted);font-size:12px;font-weight:600;margin-bottom:8px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.comm-stat-n{font-family:'Poppins',sans-serif;font-size:26px;font-weight:800;line-height:1;letter-spacing:-.5px;display:inline-block}
.comm-stat-d{font-style:normal;color:var(--primary);font-size:11.5px;font-weight:700;margin-left:6px;white-space:nowrap}
.comm-stat-sub{display:block;font-style:normal;color:var(--muted2);font-size:11.5px;font-weight:600;margin-top:5px}

/* ── dados gerais (colável) ── */
.comm-general{margin-top:12px;background:var(--card);border:1px solid var(--line);border-radius:16px;overflow:hidden}
.comm-general>summary{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:14px 16px;cursor:pointer;list-style:none;user-select:none}
.comm-general>summary::-webkit-details-marker{display:none}
.comm-general-t{font-size:13.5px;font-weight:700}
.comm-general-h{display:inline-flex;align-items:center;gap:6px;color:var(--muted2);font-size:12.5px}
.comm-general-h .msym{transition:transform .2s}
.comm-general[open]>summary .comm-general-h .msym{transform:rotate(180deg)}
.comm-general .comm-stats{padding:0 14px 16px}
.comm-general .comm-stat{background:var(--card2)}

/* ── abas ── */
.comm-tabs{display:flex;gap:4px;margin:22px 0 0;border-bottom:1px solid var(--line);overflow-x:auto;scrollbar-width:none}
.comm-tabs::-webkit-scrollbar{display:none}
.comm-tab{display:inline-flex;align-items:center;gap:7px;padding:12px 14px;color:var(--muted);font-size:14px;font-weight:600;
  white-space:nowrap;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s}
.comm-tab .msym{color:currentColor}
.comm-tab:hover{color:var(--txt)}
.comm-tab.on{color:var(--txt);border-bottom-color:var(--primary)}
.comm-tab-b{font-style:normal;font-size:11px;font-weight:700;color:var(--muted2);background:var(--card2);
  border-radius:999px;padding:1px 7px;min-width:18px;text-align:center}
.comm-tab.on .comm-tab-b{color:#fff;background:var(--primary)}

/* ── corpo: duas colunas ── */
.comm-body{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:26px;margin-top:24px;align-items:start}
@media(max-width:960px){.comm-body{grid-template-columns:minmax(0,1fr)}}
.comm-main{min-width:0}

/* ── MOBILE: comunidade sem estouro horizontal ──
   O header empilha — a pílula "online agora", que o justify-content:space-between
   jogava pra borda direita, passava da viewport e alargava a PÁGINA inteira (navbar,
   cards e feed cortavam junto, medido: 390→410px). Empilhada, ela cai numa linha
   própria à esquerda e nada mais estoura. overflow-x:clip é rede de segurança p/
   títulos longos; clip (≠ hidden) não cria container de scroll, então não quebra o
   sticky da sidebar nem o scroll interno das abas. */
@media(max-width:960px){
  .comm{overflow-x:clip}
}
@media(max-width:640px){
  .comm{padding-left:14px;padding-right:14px}
  .comm-head{flex-direction:column;align-items:flex-start;gap:12px;margin-bottom:18px}
  .comm-head h1{font-size:26px}
  .comm-online-pill{max-width:100%}
  .comm-general>summary{gap:8px}
  .comm-general-h{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .comm-stat-n{font-size:22px}
  .comm-feed-h{font-size:17px}
}

/* ── sub-filtros da atividade ── */
.comm-subtabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px}
.comm-sub-chip{display:inline-flex;align-items:center;gap:6px;background:var(--card2);border:1px solid var(--line);
  border-radius:999px;padding:7px 12px;font-size:12.5px;font-weight:600;color:var(--muted)}
.comm-sub-chip .msym{color:currentColor}
.comm-sub-chip em{font-style:normal;color:var(--muted2);font-weight:700}
.comm-sub-chip:hover{color:var(--txt);border-color:rgba(255,255,255,.16)}
.comm-sub-chip.on{color:#fff;background:rgba(255,117,168,.16);border-color:rgba(255,117,168,.5)}
.comm-sub-chip.on em{color:#fff}

.comm-feed-h{font-family:'Poppins',sans-serif;font-size:19px;font-weight:800;margin-bottom:14px}

/* ── feed ── */
.comm-feed-group{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted2);
  padding:14px 2px 8px;border-top:1px solid var(--line);margin-top:6px}
.comm-feed-group:first-child{border-top:0;padding-top:2px;margin-top:0}
.comm-row{display:flex;align-items:center;gap:13px;padding:13px 4px;border-bottom:1px solid rgba(255,255,255,.05)}
.comm-row:last-child{border-bottom:0}
.comm-row-main{flex:1;min-width:0}
.comm-row-line{display:flex;align-items:center;flex-wrap:wrap;gap:5px 6px;font-size:14px;color:var(--muted);line-height:1.35}
.comm-row-ic{display:inline-grid;place-items:center;color:var(--muted2);flex:none}
.comm-row-who{color:var(--txt);font-weight:700;text-decoration:none}
.comm-row-who:hover{text-decoration:underline}
/* bandeira do país REAL do usuário, ao lado do nome — SVG (flag-icons), renderiza
   em todo lugar (inclusive Windows). O .fi dá o tamanho; aqui só o espaçamento. */
.comm-flag.fi{margin-left:5px;vertical-align:-2px;border-radius:2px;
  box-shadow:0 0 0 .5px rgba(0,0,0,.18);width:1.25em;line-height:.9em}
.comm-row-av-link{flex:none;display:block;text-decoration:none}
.comm-row-verb{color:var(--muted)}
.comm-row-of{color:var(--muted2)}
.comm-row-movie{color:var(--primary);font-weight:700;text-decoration:none}
.comm-row-movie:hover{text-decoration:underline}
.comm-ep{font-size:11px;font-weight:700;color:var(--txt);background:var(--card2);border:1px solid var(--line);
  border-radius:6px;padding:1px 7px;white-space:nowrap}
.comm-row-quote{margin:6px 0 0;padding:2px 0 2px 11px;border-left:3px solid var(--line);
  color:var(--txt);font-size:13.5px;line-height:1.45;overflow-wrap:break-word;text-wrap:balance}
.comm-row-time{display:block;color:var(--muted2);font-size:12px;margin-top:4px}
.comm-row-cov{flex:none;width:46px;height:62px;border-radius:8px;overflow:hidden;background:var(--card2);display:block}
.comm-row-cov img{width:100%;height:100%;object-fit:cover;display:block}
.comm-row.is-fresh{animation:commIn .5s ease}
@keyframes commIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}

/* ── avatar do feed/listas ── */
.comm-av{position:relative;flex:none;border-radius:50%;display:inline-grid;place-items:center;overflow:visible}
.comm-av-img,.comm-av-ini{width:100%;height:100%;border-radius:50%;display:grid;place-items:center;object-fit:cover}
.comm-av-ini{color:#fff;font-weight:700;font-size:.9em;text-transform:uppercase}
.comm-av-on{position:absolute;right:-1px;bottom:-1px;width:11px;height:11px;border-radius:50%;
  background:#33d17a;border:2px solid var(--bg)}
.comm-av-crown{position:absolute;left:50%;top:-9px;transform:translateX(-50%);color:#f0c46e;
  filter:drop-shadow(0 1px 2px rgba(0,0,0,.6));line-height:0}

/* ── paginador ── */
.comm-pager{display:flex;align-items:center;justify-content:center;gap:6px;margin:26px 0 4px;flex-wrap:wrap}
.comm-pg{min-width:36px;height:36px;padding:0 10px;display:inline-grid;place-items:center;border-radius:9px;
  background:var(--card2);border:1px solid var(--line);color:var(--muted);font-size:13px;font-weight:700}
.comm-pg:hover{color:var(--txt);border-color:rgba(255,255,255,.2)}
.comm-pg.on{color:#fff;background:var(--primary);border-color:var(--primary)}
.comm-pg-arrow .msym{display:block}
.comm-pg-arrow:first-child .msym{transform:none}
.comm-pg.is-off{opacity:.35;pointer-events:none}
.comm-pg-gap{color:var(--muted2);padding:0 2px}

/* ── aba online (grade de gente) ── */
.comm-people{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:14px 10px}
.comm-person{display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;min-width:0;text-decoration:none;color:inherit;transition:opacity .15s}
.comm-person:hover{opacity:.8}
.comm-person-n{font-size:12.5px;color:var(--txt);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* grade de online v2: 5 por linha no PC, 2 no celular; só o 1º nome, truncado */
.comm-online-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:22px 12px}
.comm-online-cell{display:flex;flex-direction:column;align-items:center;gap:9px;text-align:center;min-width:0;text-decoration:none;color:inherit;transition:transform .15s,opacity .15s}
.comm-online-cell:hover{opacity:.85;transform:translateY(-2px)}
.comm-online-nm{display:flex;align-items:center;justify-content:center;gap:5px;max-width:100%;min-width:0}
.comm-online-first{font-size:13px;font-weight:600;color:var(--txt);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.comm-online-nm .comm-flag{flex:0 0 auto}
@media(max-width:640px){.comm-online-grid{grid-template-columns:repeat(2,1fr);gap:20px 10px}}

/* ── aba ranking ── */
.comm-rank{list-style:none;display:flex;flex-direction:column;gap:2px}
.comm-rank-row{display:flex;align-items:center;gap:12px;padding:10px 6px;border-bottom:1px solid rgba(255,255,255,.05)}
.comm-rank-pos{flex:none;width:26px;text-align:center;font-family:'Poppins',sans-serif;font-weight:800;font-size:15px;color:var(--muted2)}
.comm-rank-pos-1{color:#f0c46e}.comm-rank-pos-2{color:#cfd3d8}.comm-rank-pos-3{color:#d69a6a}
.comm-rank-link{flex:1;min-width:0;display:flex;align-items:center;gap:10px;text-decoration:none;color:inherit;transition:opacity .15s}
.comm-rank-link:hover{opacity:.8}
.comm-rank-n{flex:1;min-width:0;font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.comm-rank-v{flex:none;display:inline-flex;align-items:center;gap:5px;color:var(--muted);font-size:12.5px;font-weight:600}
.comm-rank-v .msym{color:var(--muted2)}

/* ── barra lateral ── */
.comm-side{display:flex;flex-direction:column;gap:16px;min-width:0;position:sticky;top:calc(var(--nav-h) + 12px)}
@media(max-width:960px){.comm-side{position:static}}
.comm-side-online{display:flex;align-items:center;gap:4px;flex-wrap:wrap;background:linear-gradient(135deg,rgba(51,209,122,.12),rgba(51,209,122,.03));
  border:1px solid rgba(51,209,122,.28);border-radius:14px;padding:14px 16px;color:var(--txt)}
.comm-side-online-l{display:flex;align-items:center;gap:8px;font-size:14px;font-weight:600;flex:1;min-width:0}
.comm-side-online-l b{font-weight:800}
.comm-side-online-s{width:100%;color:var(--muted);font-size:12px;padding-left:16px}
.comm-side-online .msym{color:var(--muted2);margin-left:auto}
.comm-side-block{background:var(--card);border:1px solid var(--line);border-radius:16px;padding:15px 16px}
.comm-side-h{display:flex;align-items:center;gap:8px;font-family:'Poppins',sans-serif;font-size:14.5px;font-weight:700;margin-bottom:12px}
.comm-side-h .msym{color:var(--primary)}
.comm-side-sub{color:var(--muted2);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;margin:12px 0 8px}
.comm-side-sub:first-of-type{margin-top:0}

/* em alta */
.comm-trend{list-style:none;display:flex;flex-direction:column;gap:12px}
.comm-trend li{display:flex;align-items:center;gap:10px;min-width:0}
.comm-trend-pos{flex:none;width:16px;text-align:center;font-weight:800;font-size:14px;color:var(--muted2)}
.comm-trend li:nth-child(1) .comm-trend-pos{color:#f0c46e}
.comm-trend-cov{flex:none;width:40px;height:54px;border-radius:7px;overflow:hidden;background:var(--card2);display:block}
.comm-trend-cov img{width:100%;height:100%;object-fit:cover;display:block}
.comm-trend-txt{min-width:0;display:block}
.comm-trend-t{display:block;font-size:13px;font-weight:600;color:var(--txt);line-height:1.25;
  display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.comm-trend-s{display:block;font-size:11.5px;color:var(--muted2);margin-top:3px}

/* chegaram hoje — cabeçalho com tabs */
.comm-side-block-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:10px}
.comm-side-block-head .comm-side-h{margin:0}
.comm-stabs{display:flex;gap:4px;flex:none}
.comm-stab{font-size:11.5px;font-weight:600;padding:3px 9px;border-radius:20px;text-decoration:none;
  color:var(--muted2);background:transparent;transition:background .15s,color .15s;white-space:nowrap}
.comm-stab:hover{color:var(--txt)}
.comm-stab.on{background:var(--accent-alpha,rgba(255,79,163,.15));color:var(--accent,#ff4fa3)}
.comm-newlist{display:flex;flex-direction:column;gap:14px}
.comm-new{display:flex;align-items:center;gap:11px;min-width:0;text-decoration:none;color:inherit;transition:opacity .15s}
.comm-new:hover{opacity:.8}
.comm-new-n{flex:1;min-width:0;font-size:13px;font-weight:600;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.comm-new-t{flex:none;color:var(--muted2);font-size:11.5px}
.comm-new-empty{font-size:12px;color:var(--muted2);text-align:center;padding:8px 0}
/* MOLDURA nas listas laterais (novos premium / chegaram hoje): capa o tamanho pra
   caber na linha sem dominar — a foto segue no tamanho normal (76% do span). */
.comm-new .comm-av-frame{width:min(calc(100% * var(--fs,1.9)),54px);height:min(calc(100% * var(--fs,1.9)),54px)}
.comm-ver-todos{display:block;text-align:center;font-size:12px;font-weight:600;color:var(--accent,#ff4fa3);
  text-decoration:none;margin-top:13px;padding:6px;border-radius:8px;
  background:var(--accent-alpha,rgba(255,79,163,.08));transition:background .15s}
.comm-ver-todos:hover{background:var(--accent-alpha,rgba(255,79,163,.18))}

/* vazio */
.comm-empty{padding:40px 16px;text-align:center;color:var(--muted2);font-size:14px}

/* RTL: a seta do "anterior" aponta pro outro lado e a coroa some do fluxo */
[dir="rtl"] .comm-pg-arrow:first-child .msym{transform:scaleX(-1)}
[dir="rtl"] .comm-pg-arrow:last-child .msym{transform:scaleX(-1)}

/* ── cosméticos do usuário na comunidade ────────────────────────────────────
   A MOLDURA VIP (mesma dos comentários do player) entra por cima do avatar,
   escalada por --fs/--fy pra a foto caber no furo; o BALÃO de chat vira fundo do
   comentário via border-image 9-slice. Só aparece pra quem tem plano ativo. */
.comm-av-framed{overflow:visible;background:transparent;border:0}
/* foto a 76% do container — dentro do anel para todas as molduras calibradas,
   com folga visível sem deixar o círculo pequeno demais nas listas de feed. */
.comm-av-framed .comm-av-img,
.comm-av-framed .comm-av-ini{
  border-radius:50%;
  position:absolute;
  top:50%;left:50%;
  width:76%;height:76%;
  transform:translate(-50%,-50%);
  object-fit:cover
}
/* perfil: foto um pouco maior (80%) e frame limitado a 160px para não dominar o card */
.cprf-av-wrap .comm-av-framed .comm-av-img,
.cprf-av-wrap .comm-av-framed .comm-av-ini{width:80%;height:80%}
.cprf-av-wrap .comm-av-frame{
  width:min(calc(100% * var(--fs,1.9)),140px);
  height:min(calc(100% * var(--fs,1.9)),140px)
}
.comm-av-frame{position:absolute;top:50%;left:50%;
  width:calc(100% * var(--fs,1.9));height:calc(100% * var(--fs,1.9));max-width:none;max-height:none;
  transform:translate(-50%, calc(-50% - var(--fy,0) * 1%));object-fit:contain;pointer-events:none;z-index:2}
/* com moldura, o pontinho de online sairia no meio do ornamento — some (a
   moldura já é o destaque) */
.comm-av-framed .comm-av-on{display:none}
/* MOLDURA menor nas LISTAS (feed/ranking): estava enorme, dominando a linha.
   Escala o conjunto foto+moldura JUNTO (transform no wrapper), então a foto nunca
   vaza do furo — só encolhe o badge inteiro. Perfil (.cprf) e grade de membros
   (.cmem) NÃO são afetados (o seletor exige .comm-row / .comm-rank-row). */
/* MOLDURA nas linhas (feed/ranking): tamanho FIXO capado (foto no tamanho normal,
   não encolhida) — igual às listas laterais que ficaram boas, em vez do scale antigo
   que espremia a foto. */
.comm-row .comm-av-frame,
.comm-rank-row .comm-av-frame{width:min(calc(100% * var(--fs,1.9)),60px);height:min(calc(100% * var(--fs,1.9)),60px)}
/* linhas com moldura: altura acompanha o footprint JÁ reduzido pela escala */
.comm-row-framed{min-height:62px;padding-top:12px;padding-bottom:12px;align-items:center}
.comm-rank-framed{min-height:58px}
/* BALÃO DO CHAT no corpo do comentário — border-image 9-slice (canto fixo, meio
   estica; nunca distorce), igual ao .com-body.has-bubble do player. O
   border-image-source vem inline (URL do asset do usuário). */
.comm-row-quote.has-bubble{display:inline-block;align-self:flex-start;max-width:min(100%,440px);
  margin-top:7px;padding:3px 10px;color:#fff;
  background:transparent;border:15px solid transparent;border-radius:0;
  border-image-slice:30 34 30 34 fill;border-image-width:15px 17px 15px 17px;border-image-repeat:stretch}
/* com moldura, o texto recua um respiro pra a asa direita do ornamento não
   encostar na primeira letra do nome */
.comm-row-framed .comm-row-main{margin-left:15px}

/* ══════════════════════════════════════════════════════════════════════════════
   PERFIL PÚBLICO DA COMUNIDADE  (/comunidade/perfil/{id})
   Layout: cover com gradiente → avatar grande sobreposto → stats bar → covers
   ══════════════════════════════════════════════════════════════════════════════ */
.cprf{max-width:880px;margin:0 auto;padding-bottom:48px}

/* cover: faixa de cor derivada do avatar/skin, com gradiente suave */
.cprf-cover{border-radius:22px;overflow:visible;padding:30px 28px;position:relative;border:1px solid var(--line)}
.cprf-cover-inner{display:flex;align-items:center;gap:26px;flex-wrap:wrap}

/* SKIN DO CARTÃO (estilo Bigo): a arte comprada vira o fundo do cover.
   span absoluto atrás do conteúdo, recortado no raio do cover, com overlay
   escuro embaixo pra o nome branco ficar legível sobre qualquer arte. */
/* overlay escuro só do lado do texto — legibilidade sem apagar a cor do card */
.cprf-cover-skin::before{content:"";position:absolute;inset:0;z-index:0;border-radius:20px;
  background:linear-gradient(100deg,rgba(8,6,14,.58) 0%,rgba(8,6,14,.30) 48%,rgba(8,6,14,.08) 100%)}
.cprf-cover-skin .cprf-cover-inner{position:relative;z-index:1}
/* emblema do card NÍTIDO perto do tamanho real (68px) — sem upscale forte, sem blur */
.cprf-cover-emblem{position:absolute;z-index:0;top:16px;right:20px;
  width:92px;height:50px;background-size:contain;background-repeat:no-repeat;background-position:top right;
  filter:drop-shadow(0 3px 9px rgba(0,0,0,.55))}
@media(max-width:640px){.cprf-cover-emblem{width:74px;height:40px;right:12px;top:12px}}
.cprf-cover-skin .cprf-cover-inner{position:relative;z-index:1}
.cprf-cover-skin .cprf-name{color:#fff;text-shadow:0 2px 8px rgba(0,0,0,.6)}
.cprf-cover-skin .cprf-uid{color:rgba(255,255,255,.82)}
.cprf-cover-skin .cprf-joined{color:rgba(255,255,255,.78)}
/* nome + medalha + bandeira numa linha (flex) — medalha fica AO LADO do nome
   (como no Bigo); o nome trunca com ellipsis e a medalha nunca quebra pra baixo. */
.cprf-name{display:flex;align-items:center;gap:9px;overflow:visible;white-space:normal}
.cprf-name-txt{min-width:0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cprf-medal{height:27px;width:auto;flex:none;filter:drop-shadow(0 1px 3px rgba(0,0,0,.5))}
.cprf-name .comm-flag{flex:none}
/* MEDALHA no feed da comunidade (menor, inline) */
.comm-row-medal{height:15px;width:auto;flex:none;vertical-align:-2px;margin-left:5px;
  filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}

/* avatar no cover */
.cprf-av-wrap{flex:none;width:150px;display:flex;align-items:center;justify-content:center;
  position:relative;filter:drop-shadow(0 4px 16px rgba(0,0,0,.35))}
.cprf-online-badge{position:absolute;bottom:-6px;left:50%;transform:translateX(-50%);
  display:inline-flex;align-items:center;gap:5px;background:#14231a;color:#5fe39b;
  font-size:10.5px;font-weight:700;border-radius:20px;padding:3px 9px;white-space:nowrap;
  border:1px solid rgba(95,227,155,.35)}

/* info ao lado do avatar */
.cprf-head-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:10px}
.cprf-name{font-family:'Poppins',sans-serif;font-size:clamp(20px,4vw,28px);font-weight:800;
  line-height:1.15;color:var(--txt);margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cprf-uid{font-size:11px;color:var(--muted2);font-weight:600;font-family:ui-monospace,monospace;
  max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.72}
.cprf-plan-badge{display:inline-flex;align-items:center;gap:5px;border-radius:20px;
  padding:3px 10px;font-size:11.5px;font-weight:700;width:fit-content}
.cprf-vip{background:linear-gradient(135deg,#f0c46e,#d97c1a);color:#1a0a00}
.cprf-joined{font-size:12px;color:var(--muted)}
/* linha "última visita" — ícone de relógio + data completa, alinhados */
.cprf-lastseen{display:inline-flex;align-items:center;gap:5px}
.cprf-lastseen svg{flex:none;opacity:.85}

/* stats bar: faixa abaixo do cover */
.cprf-stats{display:flex;flex-wrap:wrap;gap:0;background:var(--card);border:1px solid var(--line);
  border-radius:16px;overflow:hidden;margin-top:-2px}
.cprf-stat{flex:1;min-width:100px;display:flex;flex-direction:column;align-items:center;
  gap:4px;padding:18px 10px;border-right:1px solid var(--line);text-align:center}
.cprf-stat:last-child{border-right:0}
.cprf-stat b{font-family:'Poppins',sans-serif;font-size:clamp(17px,3vw,22px);font-weight:800;
  color:var(--txt);display:flex;align-items:center;gap:5px}
.cprf-stat>span{font-size:11px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em}
.cprf-stat-rank b{color:#f0c46e}
.cprf-stat-rank .msym{color:#f0c46e}
@media(max-width:500px){.cprf-stats{border-radius:12px}.cprf-stat{min-width:80px;padding:14px 6px}
  .cprf-stat b{font-size:15px}}

/* corpo da página */
.cprf-body{margin-top:28px;display:flex;flex-direction:column;gap:28px}
.cprf-section{}
.cprf-section-h{display:flex;align-items:center;gap:8px;font-family:'Poppins',sans-serif;
  font-size:15px;font-weight:700;margin-bottom:14px;color:var(--txt)}
.cprf-section-h .msym{color:var(--primary)}

/* grade de capas de séries assistidas — 5/linha no PC, 2 no celular (paginada 10/pág) */
.cprf-covers{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
.cprf-cov{display:block;border-radius:10px;overflow:hidden;background:var(--card2);
  position:relative;text-decoration:none;aspect-ratio:2/3;transition:transform .18s,box-shadow .18s}
.cprf-cov:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(0,0,0,.4)}
.cprf-cov img{width:100%;height:100%;object-fit:cover;display:block}
.cprf-cov-when{position:absolute;bottom:0;left:0;right:0;background:linear-gradient(transparent,rgba(0,0,0,.72));
  color:#fff;font-size:10px;padding:18px 6px 5px;opacity:0;transition:opacity .18s;text-align:center}
.cprf-cov:hover .cprf-cov-when{opacity:1}

/* sem atividade */
.cprf-empty{padding:40px 20px;display:flex;flex-direction:column;align-items:center;gap:14px;
  text-align:center;color:var(--muted2)}
.cprf-empty .msym{opacity:.35}
.cprf-empty p{font-size:14px;margin:0}

/* rodapé: voltar */
.cprf-footer{margin-top:32px;display:flex}
.cprf-back{display:inline-flex;align-items:center;gap:8px;color:var(--muted);font-size:13.5px;
  font-weight:600;text-decoration:none;transition:color .15s}
.cprf-back:hover{color:var(--txt)}
.cprf-back .msym{flex:none}

/* ── perfil: meta info, badge online, grade paginada, responsivo (reorg 2026-08) ── */
.cprf-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px}
.cprf-meta-item{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;color:var(--muted);font-weight:500}
.cprf-meta-item svg{flex:none;opacity:.82}
.cprf-cover-skin .cprf-meta-item{color:rgba(255,255,255,.85)}
.cprf-cover-skin .cprf-meta-item svg{opacity:.9}
.cprf-online-dot{width:6px;height:6px;border-radius:50%;background:#33d17a;box-shadow:0 0 0 3px rgba(51,209,122,.22)}
/* ponto verde de "online" na linha do nome (antes da bandeira), sem texto */
.cprf-name-online{width:11px;height:11px;border-radius:50%;background:#33d17a;flex:none;align-self:center;
  box-shadow:0 0 0 3px rgba(51,209,122,.20)}
/* VIP compacto na LINHA DO NOME (ao lado da bandeira) + chip do plano/expiração */
.cprf-name .cprf-vip-inline{font-size:11px;padding:2px 9px;flex:none;align-self:center}
.cprf-plan-chip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;
  color:#f0c46e;background:rgba(240,196,110,.10);border:1px solid rgba(240,196,110,.30);
  border-radius:20px;padding:3px 11px;white-space:nowrap}
.cprf-plan-chip b{color:#f5d488;font-weight:800}
.cprf-plan-exp{color:var(--muted);font-weight:500}
.cprf-cover-skin .cprf-plan-exp{color:rgba(255,255,255,.72)}
.cprf-pager{margin-top:20px}
@media(max-width:760px){
  .cprf-cover{padding:26px 18px}
  /* coluna: a moldura passa ~24px abaixo do avatar; gap maior pra o nome não
     encostar/misturar com a arte da moldura. */
  .cprf-cover-inner{flex-direction:column;text-align:center;gap:28px}
  .cprf-av-wrap{width:auto}
  .cprf-head-info{align-items:center;width:100%}
  .cprf-name{justify-content:center;max-width:100%}
  .cprf-meta{justify-content:center}
  .cprf-uid{max-width:92%}
}
@media(max-width:640px){
  .cprf-covers{grid-template-columns:repeat(2,1fr)}
}
/* stats: 3 por linha no celular (6 stats = 2 linhas limpas). box-border + basis
   exato p/ 3 caberem sem estourar a largura (senão a página ganha scroll lateral). */
@media(max-width:560px){
  .cprf-stat{box-sizing:border-box;flex:0 0 33.333%;min-width:0;padding:14px 4px}
  .cprf-stat b{font-size:16px}
  .cprf-stat>span{font-size:9.5px;letter-spacing:.02em}
  .cprf-stat:nth-child(3n){border-right:0}
  .cprf-stat:nth-child(n+4){border-top:1px solid var(--line)}
}

/* ── página todos os membros (/comunidade/membros) ─────────────────────── */
.cmem{max-width:960px;margin:0 auto;padding:28px 16px 60px}
.cmem-head{margin-bottom:28px}
.cmem-back{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:13px;
  font-weight:600;text-decoration:none;margin-bottom:14px;transition:color .15s}
.cmem-back:hover{color:var(--txt)}
.cmem-title{font-size:22px;font-weight:800;margin:0 0 4px}
.cmem-sub{font-size:13px;color:var(--muted);margin:0}
.cmem-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:14px}
.cmem-card{display:flex;flex-direction:column;align-items:center;gap:8px;padding:18px 10px 14px;
  border-radius:14px;background:var(--card);text-decoration:none;color:inherit;
  transition:transform .15s,box-shadow .15s;position:relative;text-align:center}
.cmem-card:hover{transform:translateY(-2px);box-shadow:0 6px 24px rgba(0,0,0,.18)}
.cmem-name{font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;width:100%;text-align:center}
.cmem-when{font-size:11px;color:var(--muted2)}
.cmem-online-dot{position:absolute;top:10px;right:10px;width:8px;height:8px;
  border-radius:50%;background:#33d17a;border:2px solid var(--card)}
/* paginação */
.cmem-pag{display:flex;gap:6px;justify-content:center;flex-wrap:wrap;margin-top:36px}
.cmem-pag-a{display:inline-flex;align-items:center;justify-content:center;min-width:36px;
  height:36px;padding:0 10px;border-radius:8px;font-size:13px;font-weight:600;
  text-decoration:none;color:var(--txt);background:var(--card);transition:background .15s}
.cmem-pag-a:hover,.cmem-pag-a.on{background:var(--accent,#ff4fa3);color:#fff}
.cmem-pag-ellipsis{display:inline-flex;align-items:center;font-size:13px;color:var(--muted2);
  padding:0 4px}

/* ── Faturas (/faturas) ──────────────────────────────────────────────────── */
.inv{max-width:760px;margin:0 auto;padding:24px 16px 64px}
.inv-head{margin-bottom:20px}
.inv-back{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:13px;
  font-weight:600;text-decoration:none;margin-bottom:14px;transition:color .15s}
.inv-back:hover{color:var(--txt)}
.inv-title{font-size:23px;font-weight:800;margin:0 0 4px}
.inv-sub{font-size:13.5px;color:var(--muted);margin:0}
/* abas */
.inv-tabs{display:flex;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch;
  border-bottom:1px solid var(--line2);margin-bottom:16px;padding-bottom:2px}
.inv-tab{display:inline-flex;align-items:center;gap:7px;padding:10px 4px;margin:0 8px;
  font-size:13.5px;font-weight:600;color:var(--muted);text-decoration:none;white-space:nowrap;
  border-bottom:2px solid transparent;transition:color .15s,border-color .15s}
.inv-tab:first-child{margin-left:0}
.inv-tab:hover{color:var(--txt)}
.inv-tab.on{color:var(--txt);border-bottom-color:var(--accent,#ff4fa3)}
.inv-tab-n{font-size:11px;font-weight:700;min-width:18px;height:18px;padding:0 5px;border-radius:20px;
  display:inline-flex;align-items:center;justify-content:center;background:var(--line2);color:var(--muted)}
.inv-tab.on .inv-tab-n{background:var(--accent,#ff4fa3);color:#fff}
/* lista */
.inv-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.inv-row{display:flex;align-items:center;gap:13px;padding:14px;border-radius:14px;background:var(--card)}
.inv-ic{flex:none;width:40px;height:40px;border-radius:11px;display:grid;place-items:center;
  color:#fff;background:#3a3a44}
.inv-ic .msym{font-size:18px}
.inv-ic-pagas{background:rgba(51,209,122,.18);color:#33d17a}
.inv-ic-expiradas{background:rgba(255,255,255,.1);color:var(--muted)}
.inv-ic-estornos{background:rgba(224,87,75,.18);color:#e0574b}
.inv-ic-pendentes{background:rgba(224,145,58,.18);color:#e0913a}
.inv-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.inv-name{font-size:14.5px;font-weight:700;color:var(--txt);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.inv-meta{font-size:12px;color:var(--muted2)}
.inv-right{flex:none;display:flex;flex-direction:column;align-items:flex-end;gap:5px;text-align:right}
.inv-amount{font-size:14.5px;font-weight:800;color:var(--txt);font-variant-numeric:tabular-nums;white-space:nowrap}
.inv-tag{font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:20px;white-space:nowrap;letter-spacing:.02em}
.inv-tag-pagas{background:rgba(51,209,122,.18);color:#33d17a}
.inv-tag-expiradas{background:rgba(255,255,255,.1);color:var(--muted)}
.inv-tag-estornos{background:rgba(224,87,75,.18);color:#e0574b}
.inv-tag-pendentes{background:rgba(224,145,58,.18);color:#e0913a}
/* vazio */
.inv-empty{display:flex;flex-direction:column;align-items:center;gap:12px;padding:52px 20px;
  text-align:center;color:var(--muted2)}
.inv-empty .msym{opacity:.35}
.inv-empty p{font-size:14px;margin:0}

/* ============================ ROLETA DE EPISÓDIOS GRÁTIS ============================ */
/* Injetada pelo app-roleta.js dentro do paywall do player (.vp-wall/.feed-wall).
   MOBILE: o topo reserva a altura do cabeçalho (← + título + EP) + o notch, senão
   a roda subia POR CIMA do título (medido no iPhone). Centralizado no eixo — o
   conjunto (roda+missões+botão) cabe folgado; no estado de comentários a lista
   rola por dentro (.epr-clist), então nunca estoura. */
.epr-host.epr-active{padding:0!important;overflow:hidden!important}
.epr-host.epr-active>:not(.epr-layer):not(.vp-wall-close){display:none!important}
.epr-host.epr-active>.vp-wall-close{z-index:36!important}
.epr-host:not(.epr-active)>.epr-layer{display:none!important}
.epr-layer{position:absolute;inset:0;z-index:35;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:safe center;gap:12px;padding:calc(env(safe-area-inset-top,0px) + 64px) 18px max(18px,env(safe-area-inset-bottom,0px));overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;background:linear-gradient(180deg,rgba(12,12,16,.97),rgba(8,8,11,.99));touch-action:pan-y}
.epr-wrap{position:relative;width:130px;height:130px;margin:0 auto 2px;flex:0 0 auto;filter:drop-shadow(0 11px 22px rgba(0,0,0,.6))}
.epr-frame{position:absolute;inset:0;border-radius:50%;background:conic-gradient(from 90deg,#6e4a06,#ffe9a8,#c8901a,#fff6d8,#9a6a10,#ffe1a0,#7a5200,#fff3c4,#b8860b,#ffeab0,#8a5a00,#fff6d8,#a9720a,#ffe9a8,#6e4a06);box-shadow:0 0 0 1px rgba(0,0,0,.45),inset 0 0 0 2px rgba(255,255,255,.2),inset 0 0 11px rgba(0,0,0,.5),inset 0 3px 9px rgba(255,255,255,.25)}
.epr-frame::after{content:"";position:absolute;left:50%;top:50%;width:110px;height:110px;transform:translate(-50%,-50%);border-radius:50%;background:#08060c;box-shadow:inset 0 3px 11px rgba(0,0,0,.75),0 0 0 2px rgba(120,80,0,.5),0 0 0 3px rgba(0,0,0,.5)}
.epr-bulb{position:absolute;width:5px;height:5px;border-radius:50%;transform:translate(-50%,-50%);z-index:2;background:radial-gradient(circle at 35% 30%,#fff5d6,#b8860b);box-shadow:0 0 0 1px rgba(70,45,0,.55)}
.epr-bulb--lit{background:radial-gradient(circle at 35% 30%,#fffbe8,#ffcf4d);box-shadow:0 0 6px 1.5px rgba(255,210,80,.92),0 0 0 1px rgba(120,80,0,.45)}
.epr-wheel{position:absolute;top:50%;left:50%;width:110px;height:110px;transform:translate(-50%,-50%);z-index:1;transition:none;will-change:auto}
.epr-wheel.is-spinning{will-change:transform}
.epr-wheel__svg{width:100%;height:100%;display:block}
.epr-wheel__num{fill:#fff;font-size:15px;font-weight:900;font-family:inherit;paint-order:stroke;stroke:rgba(0,0,0,.5);stroke-width:2.6px;stroke-linejoin:round}
.epr-wheel__num--j{fill:#3a2400;stroke:rgba(255,255,255,.55);stroke-width:1.7px;font-size:17px}
.epr-ptr{position:absolute;top:-5px;left:50%;transform:translateX(-50%);z-index:5;width:24px;height:30px;background:linear-gradient(180deg,#fffdf5,#f0d27a 38%,#c8901a 72%,#8a5a00);clip-path:polygon(50% 100%,6% 22%,50% 0,94% 22%);filter:drop-shadow(0 3px 5px rgba(0,0,0,.6))}
.epr-ptr::after{content:"";position:absolute;left:50%;top:3px;width:7px;height:7px;border-radius:50%;transform:translateX(-50%);background:radial-gradient(circle at 35% 30%,#fff,#c8901a)}
.epr-hub{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:3;width:40px;height:40px;border-radius:50%;background:radial-gradient(circle at 38% 30%,#332714,#0c0910 72%);display:flex;align-items:center;justify-content:center;pointer-events:none;box-shadow:0 0 0 2px #8a5a00,0 0 0 3.6px #ffd76a,0 0 0 5px #a9720a,0 3px 10px rgba(0,0,0,.7),inset 0 2px 6px rgba(255,255,255,.16)}
.epr-hub svg{width:18px;height:18px}
.epr-hub.epr-spin{animation:eprHub 1.4s ease-in-out infinite}
@keyframes eprHub{0%,100%{transform:translate(-50%,-50%) scale(1)}50%{transform:translate(-50%,-50%) scale(1.08)}}
.epr-t1{font-size:16px;font-weight:900;color:#fff;margin:0;letter-spacing:-.02em;text-align:center}
.epr-body{width:100%;max-width:340px;display:flex;flex-direction:column;gap:8px}
.epr-m{display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.1);border-radius:12px;padding:9px 11px}
.epr-bdg{flex:0 0 auto;width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;animation:eprPulse 2s ease-in-out infinite}
.epr-bdg svg{width:18px;height:18px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.epr-bdg--c{background:linear-gradient(135deg,#ff6b98,#e11d6b)}
.epr-bdg--l{background:linear-gradient(135deg,#9b5cff,#6a2fd0)}
.epr-bdg--ok{background:linear-gradient(135deg,#33d986,#1aa564);animation:none}
.epr-mi{flex:1;min-width:0;text-align:left}
.epr-mi b{display:block;font-size:13.5px;font-weight:800;color:#fff;line-height:1.2}
.epr-mi span{font-size:11.5px;color:#a9a9b8}
.epr-go{position:relative;flex:0 0 auto;min-height:44px;border:0;border-radius:10px;padding:9px 15px;font:inherit;font-size:12.5px;font-weight:900;color:#fff;cursor:pointer;background:linear-gradient(135deg,#ff5b8a,#e11d6b);touch-action:manipulation}
.epr-go:disabled{opacity:.55;cursor:default}
.epr-go[aria-busy="true"]{padding-left:34px}
.epr-go[aria-busy="true"]::before{content:"";position:absolute;left:13px;top:50%;width:12px;height:12px;margin-top:-7px;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;border-radius:50%;animation:eprLoader .65s linear infinite}
@keyframes eprLoader{to{transform:rotate(360deg)}}
.epr-go--l{background:linear-gradient(135deg,#9b5cff,#6a2fd0)}
.epr-cbox{width:100%;max-width:370px;display:flex;flex-direction:column;gap:10px}
.epr-back{align-self:flex-start;min-height:36px;padding:4px 2px;border:0;background:none;color:#d7d7df;font:inherit;font-size:12px;font-weight:800;cursor:pointer;touch-action:manipulation}
.epr-back:hover{color:#fff}
.epr-ta{width:100%;box-sizing:border-box;background:rgba(0,0,0,.42);border:1px solid rgba(255,255,255,.16);border-radius:10px;color:#fff;font:inherit;font-size:16px;padding:10px 11px;resize:none;height:62px;touch-action:auto}
.epr-ta:focus{outline:2px solid rgba(255,117,168,.65);outline-offset:1px}
.epr-hint{font-size:11px;color:#8b8b97;margin:0}
.epr-meta{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:16px}
.epr-count{font-size:10.5px;color:#85858e;font-variant-numeric:tabular-nums}
.epr-status{min-height:16px;margin:0;font-size:11px;text-align:center;color:#a9a9b8}
.epr-clist{max-height:min(30dvh,190px);overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;display:flex;flex-direction:column;gap:11px;padding-right:4px;text-align:left;touch-action:pan-y}
.epr-clist::-webkit-scrollbar{width:5px}.epr-clist::-webkit-scrollbar-thumb{background:rgba(255,255,255,.22);border-radius:3px}
.epr-ctitle{font-size:10.5px;font-weight:800;letter-spacing:.5px;text-transform:uppercase;color:#9a9aa6;margin:0 0 -1px}
.epr-cempty,.epr-cload{font-size:12.5px;color:#9a9aa6;text-align:center;padding:16px 8px}
.epr-c{display:flex;gap:9px;align-items:flex-start}
.epr-c .epr-cav,.epr-c img{width:30px!important;height:30px!important;border-radius:50%;flex:0 0 auto;object-fit:cover;display:grid;place-items:center;color:#fff;font-weight:800;font-size:12.5px}
.epr-cmain{flex:1;min-width:0}
.epr-ch{display:flex;align-items:center;gap:5px;flex-wrap:wrap;font-size:12.5px;line-height:1.2}
.epr-ch b{color:#fff;font-weight:700}
.epr-ch i{color:#82828e;font-style:normal;font-size:10.5px;margin-left:auto}
.epr-cbody{color:#d3d3db;font-size:12.5px;line-height:1.4;margin-top:2px;word-break:break-word}
.epr-cwrap{display:flex;flex-direction:column;gap:7px;border-top:1px solid rgba(255,255,255,.1);padding-top:10px}
.epr-crow{display:flex;align-items:stretch;gap:9px}
.epr-crow .epr-send{flex:1}
.epr-res{text-align:center;display:flex;flex-direction:column;align-items:center;gap:5px}
.epr-res b{display:block;font-size:22px;font-weight:900;color:#ffd166;margin:2px 0}
.epr-res span{font-size:12.5px;color:#c9c9d3}
.epr-res .epr-cont{margin-top:8px;min-width:190px}
@keyframes eprPulse{0%,100%{transform:scale(1)}50%{transform:scale(1.08)}}
.epr-or{display:flex;align-items:center;gap:8px;width:100%;max-width:340px;margin:5px 0 0;color:#8b8b97;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}
.epr-or span{flex:0 0 auto}
.epr-or::before,.epr-or::after{content:"";flex:1;height:1px;background:rgba(255,255,255,.12)}
.epr-premium{margin-top:1px;display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;max-width:340px;min-height:46px;background:linear-gradient(135deg,#ffd76a,#f5a623);color:#3a2408;font-weight:900;font-size:14px;padding:12px 18px;border:0;border-radius:12px;cursor:pointer;box-shadow:0 10px 26px rgba(245,166,35,.32);transition:filter .15s;touch-action:manipulation}
.epr-premium:hover{filter:brightness(1.06)}
.epr-premium svg{width:18px;height:18px}
[data-like][aria-busy="true"]{pointer-events:none;opacity:.72}
@media(max-width:600px){
  .epr-layer.is-commenting{justify-content:flex-start;gap:8px;padding-top:calc(env(safe-area-inset-top,0px) + 54px)}
  .epr-layer.is-commenting .epr-wrap{width:82px;height:82px;margin-bottom:-2px}
  .epr-layer.is-commenting .epr-frame::after{width:70px;height:70px}
  .epr-layer.is-commenting .epr-wheel{width:70px;height:70px}
  .epr-layer.is-commenting .epr-hub{width:29px;height:29px}
  .epr-layer.is-commenting .epr-hub svg{width:14px;height:14px}
  .epr-layer.is-commenting .epr-ptr{width:18px;height:23px}
  .epr-layer.is-commenting .epr-t1{display:none}
  .epr-layer.is-commenting .epr-or,.epr-layer.is-commenting .epr-premium{display:none}
}
@media(prefers-reduced-motion:reduce){
  .epr-hub.epr-spin,.epr-bdg{animation:none!important}
  .epr-wheel{transition-duration:.08s!important}
}

/* ── Comentários: paginação + nick clicável (player e página de detalhe) ── */
.com-pag{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:16px}
.com-pag:empty{display:none}
.com-pg{width:34px;height:34px;border-radius:9px;border:1px solid #35353f;background:#1b1b22;color:#cfcfd6;cursor:pointer;font-size:16px;line-height:1}
.com-pg:hover:not([disabled]){border-color:#ff2e88;color:#fff}
.com-pg[disabled]{opacity:.4;cursor:default}
.com-pg-info{font-size:13px;color:#8a8a93;font-variant-numeric:tabular-nums}
.com-au-link{color:inherit;text-decoration:none}
.com-au-link:hover{color:#ff2e88;text-decoration:underline}
/* Medalha (badge do plano) ao lado do nick — inline, mesma da atividade da comunidade */
.com-medal{height:14px;width:auto;flex:none;vertical-align:-2px;margin-left:5px;filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}
.com-body.has-bubble .com-medal{filter:drop-shadow(0 1px 2px rgba(0,0,0,.6))}

/* ================= PLAYER: EXPERIENCIA MOBILE EM FOLHA =================
   Uma unica arvore de conteudo: no PC e o trilho da direita; no celular sobe
   sobre o palco. Assim a grade de episodios nunca fica empilhada sob o video e
   nunca precisa empurrar a pagina para baixo e depois rolar de volta. */
.vp-head{font:inherit;background:transparent;border:0;padding:0;color:inherit;cursor:pointer;pointer-events:auto}
.vp-head-s::after{content:"  ›";font-size:14px;color:rgba(255,255,255,.9)}
.vp-ep{border:1px solid rgba(255,255,255,.18);background:rgba(0,0,0,.42);color:#fff;
  min-height:34px;padding:5px 10px;border-radius:999px;cursor:pointer;font:inherit;
  font-size:13px;font-weight:800;line-height:1;backdrop-filter:blur(8px)}
.vp-ep:active{transform:scale(.96)}
.vp-panel-info{display:flex;flex-direction:column;gap:14px}

@media(max-width:1023px){
  /* O documento deixa de ser o scroller do player. Somente as folhas e o paywall
     rolam por dentro; o palco acompanha o viewport dinamico inclusive no iOS. */
  body.is-player .vplayer{height:100vh!important;height:100dvh!important;
    min-height:100vh!important;min-height:100dvh!important;overflow:hidden!important}
  body.is-player .vp-stage{width:100%;height:100%!important;min-height:100%;max-height:none;overflow:hidden}
  body.is-player .vp-rail{display:contents!important;padding:0;border:0;overflow:visible}

  /* A venda usa toda a altura util: os beneficios absorvem a folga vertical e o
     "Agora nao" termina junto da safe-area, em vez de deixar um bloco preto vazio
     embaixo. Em tela curta o tamanho intrinseco continua maior e a propria parede
     rola, portanto nenhum plano ou beneficio e comprimido/cortado. */
  body.is-player .vplayer .vp-wall.is-plan-wall .wall-plans{
    display:flex;flex:1 0 auto;flex-direction:column
  }
  body.is-player .vplayer .vp-wall.is-plan-wall .wall-plans .vipx-inc{
    display:flex;flex:1 0 auto;flex-direction:column;margin-bottom:0
  }
  body.is-player .vplayer .vp-wall.is-plan-wall .wall-plans .vipx-inc-l{
    flex:1;justify-content:space-evenly
  }
  body.is-player .vplayer .vp-wall.is-plan-wall>[data-wall-dismiss]{flex:none}
  /* O X e a saida da venda: aparece no mesmo frame em que a parede abre, sem
     herdar os 280ms de fade dos controles do video. */
  body.is-player .vplayer.is-walled .vp-top{transition:none!important}

  body.is-player .vp-content-sheet{z-index:90}
  body.is-player .vp-content-sheet .vp-content-box{
    display:flex;flex-direction:column;width:100%;height:min(86dvh,760px);max-height:86dvh;
    padding:22px 14px calc(16px + env(safe-area-inset-bottom));overflow:hidden;
    background:linear-gradient(180deg,#17171c 0%,#101014 100%);
    border:1px solid rgba(255,255,255,.09);border-bottom:0;
    box-shadow:0 -24px 70px rgba(0,0,0,.72)
  }
  body.is-player .vp-content-tabs{flex:none;justify-content:flex-start;gap:6px;
    margin:2px 42px 14px 0;padding:4px;border-radius:14px;
    background:rgba(255,255,255,.055)}
  body.is-player .vp-content-tabs .sub-tab{flex:1;min-height:38px;padding:8px 12px;border-radius:10px;
    color:var(--muted);font-size:13.5px;transition:background .18s,color .18s,box-shadow .18s}
  body.is-player .vp-content-tabs .sub-tab.on{color:#fff;background:linear-gradient(135deg,var(--primary),var(--primary-2));
    box-shadow:0 8px 20px -12px rgba(255,91,144,.9)}
  body.is-player .vp-content-tabs .sub-tab::before,
  body.is-player .vp-content-tabs .sub-tab::after{display:none}
  body.is-player .vp-content-body{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;
    overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding:2px 2px 4px}
  body.is-player .vp-content-body::-webkit-scrollbar{width:5px}
  body.is-player .vp-content-body::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:999px}

  body.is-player .vp-content-sheet .vp-info{position:static;inset:auto;display:flex;width:100%;
    opacity:1;visibility:visible;pointer-events:auto;gap:10px;padding:2px 2px 8px}
  body.is-player .vp-content-sheet .vp-title{font-size:21px;line-height:1.25}
  body.is-player .vp-content-sheet .vp-syn-full{display:block;margin:5px 0 0;font-size:14px;
    line-height:1.65;color:rgba(255,255,255,.8)}
  body.is-player .vp-content-sheet .vp-panel{display:flex;gap:14px}
  body.is-player .vp-content-sheet .vp-panel-info{padding:4px 2px 2px}
  body.is-player .vp-content-sheet #vp-eps{width:100%;padding:0 2px 4px}
  body.is-player .vp-content-sheet #vp-eps .ep-head{display:none}
  body.is-player .vp-content-sheet .ep-grid{display:grid!important;
    grid-template-columns:repeat(auto-fill,minmax(52px,1fr))!important;gap:9px!important}
  body.is-player .vp-content-sheet .ep-cell{min-width:0;min-height:54px;width:100%;touch-action:manipulation}
  body.is-player .vp-content-sheet .ep-ranges{position:sticky;top:0;z-index:2;padding:4px 0 10px;
    margin:0;background:linear-gradient(#131318 72%,transparent)}
  body.is-player .vp-content-sheet .ep-range{flex:1;min-height:38px;padding:7px 10px}

  /* Se uma folha ja estiver aberta quando a parede entrar, somente o conteudo
     ativo continua consistente; nenhum controle do video reaparece nos planos. */
  .vplayer.is-walled .vp-content-sheet.is-open .vp-panel{display:flex!important}
  .vplayer.is-walled .vp-content-sheet.is-open .vp-info:not([hidden]){display:flex!important}
  @supports selector(.vplayer:has(.vp-wall:not([hidden]))){
    .vplayer:has(.vp-wall:not([hidden])) .vp-content-sheet.is-open .vp-panel{display:flex!important}
    .vplayer:has(.vp-wall:not([hidden])) .vp-content-sheet.is-open .vp-info:not([hidden]){display:flex!important}
  }
}

@media(max-width:1023px) and (orientation:landscape){
  body.is-player .vp-content-sheet .vp-content-box{height:92dvh;max-height:92dvh}
}

/* No desktop a mesma folha perde veil, moldura e comportamento modal e volta a
   ser apenas o conteudo rolavel do trilho direito. */
@media(min-width:1024px){
  body.is-player .vp-content-sheet{display:block!important;position:static;inset:auto;z-index:auto;
    flex:1;min-height:0;width:100%}
  body.is-player .vp-content-sheet .sheet-veil,
  body.is-player .vp-content-sheet .sheet-x,
  body.is-player .vp-content-sheet .vp-content-tabs{display:none!important}
  body.is-player .vp-content-sheet .vp-content-box{position:static;display:flex;flex-direction:column;
    gap:22px;max-width:none;max-height:none;margin:0;padding:0;overflow:visible;
    background:transparent;border:0;border-radius:0;box-shadow:none;animation:none!important}
  body.is-player .vp-content-sheet .vp-content-box::before{display:none}
  body.is-player .vp-content-sheet .vp-content-body{display:contents}
  body.is-player .vp-content-sheet [data-sub][hidden]{display:block!important}
}

/* ================= PLAYER: TEMA GRAFITE PREMIUM =================
   Tokens locais: esta linguagem pertence ao player e nao altera header, checkout,
   paywall ou paginas comuns. O rosa claro fica nos indicadores; fundos com texto
   branco usam um rosa mais profundo para manter contraste. */
body.is-player{
  --vp-canvas:#050506;
  --vp-sheet:#0d0d12;
  --vp-surface:#17171c;
  --vp-surface-2:#202027;
  --vp-glass:rgba(10,10,14,.82);
  --vp-glass-strong:rgba(10,10,14,.94);
  --vp-border:rgba(255,255,255,.09);
  --vp-border-strong:rgba(255,255,255,.15);
  --vp-text:#f7f7fa;
  --vp-muted:#b7b7c2;
  --vp-muted-2:#8f8f9b;
  --vp-accent:var(--primary,#ff75a8);
  --vp-accent-solid:#d83274;
  --vp-accent-deep:#b9235e;
  --vp-shadow:0 22px 64px rgba(0,0,0,.62);
  --vp-radius:14px;
  --vp-radius-lg:22px
}
body.is-player .vplayer{background:var(--vp-canvas)}

/* Controles sobre o video: uma unica familia de vidro preto, com contraste
   constante mesmo quando a cena e muito clara. */
body.is-player .vp-back,
body.is-player .vp-ep{
  color:var(--vp-text);background:var(--vp-glass);border:1px solid var(--vp-border-strong);
  box-shadow:0 8px 24px rgba(0,0,0,.34),inset 0 1px 0 rgba(255,255,255,.06)
}
body.is-player .vp-back{border-radius:999px}
body.is-player .vp-back:hover,
body.is-player .vp-ep:hover{background:rgba(28,28,34,.92);border-color:rgba(255,255,255,.22)}
body.is-player .vp-playbtn{
  background:var(--vp-glass);border:1px solid var(--vp-border-strong);
  box-shadow:0 14px 38px rgba(0,0,0,.52),inset 0 1px 0 rgba(255,255,255,.08)
}
body.is-player .vp-act-ic{
  color:var(--vp-text);background:rgba(10,10,14,.76);border:1px solid var(--vp-border);
  box-shadow:0 8px 22px rgba(0,0,0,.34),inset 0 1px 0 rgba(255,255,255,.05);
  transition:transform .14s ease,background .18s ease,border-color .18s ease,color .18s ease
}
body.is-player .vp-act:hover .vp-act-ic{background:var(--vp-surface-2);border-color:var(--vp-border-strong)}
body.is-player .vp-cat,
body.is-player .vp-content-sheet .syn-tag{
  color:var(--vp-muted);background:var(--vp-surface);border:1px solid var(--vp-border);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035)
}

/* Dock inferior inspirado na referencia: chapa curta quase-preta, timeline fina e
   area de toque ampla. O video continua visivel por baixo sem filtros caros no mobile. */
body.is-player .vp-progwrap{
  left:10px;right:10px;bottom:calc(12px + env(safe-area-inset-bottom));min-height:56px;
  gap:8px;padding:6px 8px;border:1px solid var(--vp-border-strong);border-radius:16px;
  background:var(--vp-glass-strong);
  box-shadow:0 16px 44px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.055)
}
body.is-player .vp-time{color:var(--vp-text);text-shadow:none}
body.is-player .vp-dur{color:var(--vp-muted)}
body.is-player .vp-prog{height:44px}
body.is-player .vp-prog::before{height:4px;background:rgba(255,255,255,.2)}
body.is-player .vp-prog i{height:4px;background:var(--vp-accent);box-shadow:0 0 12px rgba(255,117,168,.28)}
body.is-player .vp-prog i::after{width:11px;height:11px;box-shadow:0 0 0 3px rgba(255,117,168,.16),0 2px 8px rgba(0,0,0,.6)}
body.is-player .vp-vol-btn{width:44px;height:44px;border-radius:12px;color:var(--vp-text)}
body.is-player .vp-vol-btn:hover{background:rgba(255,255,255,.055)}
body.is-player .vp-vol-panel{
  background:rgba(13,13,18,.98);border-color:var(--vp-border-strong);
  box-shadow:0 18px 48px rgba(0,0,0,.62),inset 0 1px 0 rgba(255,255,255,.055)
}
body.is-player .vp-vol-pct{color:var(--vp-text)}

@media (hover:hover) and (pointer:fine){
  body.is-player .vp-progwrap,
  body.is-player .vp-back,
  body.is-player .vp-ep{
    -webkit-backdrop-filter:blur(10px) saturate(1.08);
    backdrop-filter:blur(10px) saturate(1.08)
  }
}

/* Folha de sinopse/episodios e tiles: preto/grafite em camadas, com o rosa reservado
   a selecao. Tudo fica dentro de #sheet-player para nao contaminar outros sheets. */
body.is-player #sheet-player .sheet-veil{background:rgba(2,2,5,.74)}
body.is-player #sheet-player .vp-content-box::before{
  width:46px;height:4px;background:#5d5d68;box-shadow:0 1px 0 rgba(255,255,255,.05)
}
body.is-player #sheet-player .sheet-x{
  width:40px;height:40px;color:var(--vp-muted);background:#19191f;
  border:1px solid var(--vp-border);box-shadow:0 8px 22px rgba(0,0,0,.32)
}
body.is-player #sheet-player .sheet-x:hover{color:#fff;background:#23232a;border-color:var(--vp-border-strong)}
body.is-player #sheet-player .vp-content-tabs{
  background:#19191f;border:1px solid var(--vp-border);box-shadow:inset 0 1px 0 rgba(255,255,255,.035)
}
body.is-player #sheet-player .vp-content-tabs .sub-tab{color:var(--vp-muted)}
body.is-player #sheet-player .vp-content-tabs .sub-tab:hover{color:var(--vp-text);background:rgba(255,255,255,.045)}
body.is-player #sheet-player .vp-content-tabs .sub-tab.on{
  color:#fff;background:var(--vp-accent-solid);
  box-shadow:0 8px 22px rgba(216,50,116,.28),inset 0 1px 0 rgba(255,255,255,.16)
}
body.is-player #sheet-player .vp-title{color:var(--vp-text)}
body.is-player #sheet-player .vp-syn-full{color:#c3c3cc}
body.is-player #sheet-player .ep-range{
  color:var(--vp-muted);background:linear-gradient(180deg,#1a1a1f,#151519);
  border:1px solid var(--vp-border);border-radius:10px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035);
  transition:color .16s ease,background .16s ease,border-color .16s ease,transform .12s ease,box-shadow .16s ease
}
body.is-player #sheet-player .ep-range:hover{
  color:var(--vp-text);background:var(--vp-surface-2);border-color:rgba(255,117,168,.48)
}
body.is-player #sheet-player .ep-range.on{
  color:#fff;background:var(--vp-accent-solid);border-color:rgba(255,255,255,.14);
  box-shadow:0 8px 22px rgba(216,50,116,.24),inset 0 1px 0 rgba(255,255,255,.15)
}
body.is-player #sheet-player .ep-cell{
  color:#e7e7ec;background:linear-gradient(180deg,#1a1a1f,#151519);
  border:1px solid var(--vp-border);border-radius:11px;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035);
  transition:color .16s ease,background .16s ease,border-color .16s ease,transform .12s ease,box-shadow .16s ease
}
body.is-player #sheet-player .ep-cell:hover{
  color:#fff;background:var(--vp-surface-2);border-color:rgba(255,117,168,.5)
}
body.is-player #sheet-player .ep-cell:active{transform:scale(.96)}
body.is-player #sheet-player .ep-cell.on{
  color:#fff;background:var(--vp-accent-solid);border-color:rgba(255,255,255,.14);
  box-shadow:0 9px 24px rgba(216,50,116,.26),inset 0 1px 0 rgba(255,255,255,.16)
}
body.is-player #sheet-player .ep-cell.ep-lock{color:var(--vp-muted-2)}
body.is-player #sheet-player .ep-cell.ep-lock .ep-lockico{color:var(--vp-muted-2);opacity:.9}
body.is-player #sheet-player .ep-cell.ep-watched{color:var(--vp-muted);border-color:rgba(255,117,168,.46)}
body.is-player #sheet-player .ep-cell.ep-watched::after{
  background:var(--vp-accent);box-shadow:0 0 0 2px #17171c,0 0 9px rgba(255,117,168,.42)
}
body.is-player #sheet-player .ep-cell.on.ep-watched{
  color:#fff;border-color:rgba(255,255,255,.14);
  box-shadow:0 9px 24px rgba(216,50,116,.26),inset 0 1px 0 rgba(255,255,255,.16)
}
body.is-player #sheet-player .ep-cell.on.ep-watched::after{
  background:#fff;box-shadow:0 0 0 2px var(--vp-accent-solid)
}
body.is-player #sheet-player .ep-range:focus-visible,
body.is-player #sheet-player .ep-cell:focus-visible,
body.is-player #sheet-player .sub-tab:focus-visible{
  outline:2px solid #fff;outline-offset:2px;box-shadow:0 0 0 4px var(--vp-accent)
}

/* Caixas auxiliares do proprio video (comentarios, relato e legenda). Mantidas em
   uma allowlist explicita para checkout/login continuarem com o tema original. */
body.is-player #sheet-report .sheet-veil,
body.is-player #sheet-com .sheet-veil{background:rgba(2,2,5,.78)}
body.is-player #sheet-report>.sheet-box,
body.is-player #sheet-com>.sheet-box{
  color:var(--vp-text);background:linear-gradient(180deg,#17171d 0%,#0d0d12 100%);
  border:1px solid var(--vp-border-strong);border-bottom:0;
  box-shadow:var(--vp-shadow),inset 0 1px 0 rgba(255,255,255,.05)
}
body.is-player #sheet-report>.sheet-box::before,
body.is-player #sheet-com>.sheet-box::before{background:#5d5d68}
body.is-player #sheet-report .sheet-x,
body.is-player #sheet-com .sheet-x{
  width:40px;height:40px;color:var(--vp-muted);background:#19191f;
  border:1px solid var(--vp-border);box-shadow:0 8px 22px rgba(0,0,0,.32)
}
body.is-player #sheet-report .rep-tipo,
body.is-player #sheet-report .rep-detalhe,
body.is-player #sheet-com .input,
body.is-player #sheet-com .com-pg{
  color:var(--vp-muted);background:var(--vp-surface);border-color:var(--vp-border);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035)
}
body.is-player #sheet-report .rep-tipo:hover,
body.is-player #sheet-com .com-pg:hover:not([disabled]){
  color:#fff;background:var(--vp-surface-2);border-color:rgba(255,117,168,.48)
}
body.is-player #sheet-report .rep-tipo.on{
  color:#fff;background:var(--vp-accent-solid);border-color:var(--vp-accent-solid)
}
body.is-player .vp-ccpanel-card{
  color:var(--vp-text);background:rgba(13,13,18,.98);border:1px solid var(--vp-border-strong);
  box-shadow:var(--vp-shadow),inset 0 1px 0 rgba(255,255,255,.05)
}
body.is-player .vp-ccpanel-x{color:var(--vp-muted)}
body.is-player .vp-ccrow{border-bottom-color:var(--vp-border)}
body.is-player .vp-ccrow>span{color:var(--vp-muted)}
body.is-player .vp-ccreset{
  color:var(--vp-text);background:var(--vp-surface-2);border:1px solid var(--vp-border);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.035)
}
body.is-player .vp-ccreset:hover{background:#292931;border-color:var(--vp-border-strong)}

@media(max-width:1023px){
  body.is-player .vp-side{bottom:calc(100px + env(safe-area-inset-bottom))}
  body.is-player #sheet-player .vp-content-box{
    background:linear-gradient(180deg,rgba(18,18,24,.985) 0%,rgba(8,8,12,.995) 100%);
    border-color:var(--vp-border-strong);border-radius:var(--vp-radius-lg) var(--vp-radius-lg) 0 0;
    box-shadow:var(--vp-shadow),inset 0 1px 0 rgba(255,255,255,.055)
  }
  body.is-player #sheet-player .vp-content-tabs{margin-right:48px;border-radius:13px}
  body.is-player #sheet-player .vp-content-tabs .sub-tab{min-height:42px;border-radius:10px}
  body.is-player #sheet-player .ep-ranges{
    background:linear-gradient(180deg,rgba(16,16,21,.99) 72%,rgba(16,16,21,0));gap:8px
  }
  body.is-player #sheet-player .ep-range{min-height:42px}
  body.is-player #sheet-player .ep-grid{grid-template-columns:repeat(5,minmax(0,1fr))!important;gap:8px!important}
  body.is-player #sheet-player .ep-cell{min-height:52px}
}
@media(min-width:360px) and (max-width:1023px){
  body.is-player #sheet-player .ep-grid{grid-template-columns:repeat(6,minmax(0,1fr))!important}
}

@media(min-width:1024px){
  body.is-player .vp-rail{
    background:
      radial-gradient(circle at 18% 0,rgba(255,117,168,.045),transparent 32%),
      linear-gradient(180deg,#0e0e12 0%,#09090c 100%);
    border-left-color:rgba(255,255,255,.09)
  }
  body.is-player #sheet-player .vp-info,
  body.is-player #sheet-player #vp-eps{
    padding:18px;background:linear-gradient(180deg,rgba(27,27,33,.78),rgba(17,17,22,.82));
    border:1px solid var(--vp-border);border-radius:18px;
    box-shadow:0 16px 38px rgba(0,0,0,.18),inset 0 1px 0 rgba(255,255,255,.035)
  }
  body.is-player #sheet-player #vp-eps .ep-head{margin-top:0}
}
