/* ==========================================================================
   CARROSSEL EM ANEL 3D — prefixo ring-
   Oito cards de foto dispostos sobre um cilindro visto de frente. O anel gira
   sozinho, no arrasto, nas setas e nos dois botões, encaixando no card da
   frente. A metade de trás não aparece; as laterais escurecem.

   Tokens usados:
     --display --sans     tipografia do projeto
     --ease               curva única do projeto
     --accent             anel de foco do palco e hover dos botões
     --dark               véu de profundidade (cortina sólida sobre o card)
     --dark-rgb           gradiente da legenda dentro da foto
     --dark-2             fundo do card enquanto a foto não pintou
     --light              texto DENTRO da foto — ilha escura, não escopo de tom
     --radius-media       canto do card
     --radius-pill        disco dos botões e pílula da categoria
     --fg --fg-2 --fg-muted   legenda, contador e ícone dos botões
     --rule-2             borda dos botões

   O respiro da dobra (--sec-gap) e a coluna (--pad, --max) chegam pelas
   primitivas .sec-pad e .wrap; nenhuma regra deste arquivo os lê.

   TRÊS DECISÕES QUE EXPLICAM O ARQUIVO INTEIRO:

   1. A GEOMETRIA É UMA CONTA, NÃO UMA TABELA. Cada card só declara
      --ring-i (a sua casa no anel). O passo (--ring-step = 360/N) e o raio
      (--ring-radius) são escritos pelo script a partir da largura REAL do
      card. Seis, oito ou dez cards fecham o anel sozinhos, e mudar
      --ring-card não pede tocar em mais nada.

   2. O FRENTE É O PLANO DA PERSPECTIVA. A cena inteira recua --ring-radius
      antes de girar, então o card da frente pousa exatamente em z=0: escala
      1, sem ampliação e sem o borrão que texto ampliado em 3D carrega. Quem
      recua é a cena, e não cada card — a conta do anel exige que todos
      partam do mesmo centro.

   3. O RECORTE É DA SEÇÃO. overflow no palco ou na cena achataria o 3D
      (grouping property: overflow ≠ visible força transform-style:flat).
      Aqui o palco tem overflow visível e o anel sangra; quem corta é o
      overflow:hidden do .ring, que está FORA do contexto de perspectiva.
   ========================================================================== */

.ring{
  /* Largura do card. O anel inteiro é dimensionado a partir daqui. */
  --ring-card:clamp(180px,17vw,260px);
  /* Retrato 3:4 — a mesma proporção dos placeholders 900×1200. */
  --ring-h:calc(var(--ring-card) * 4 / 3);
  /* Respiro vertical entre o card mais alto e a borda do palco. Existe para
     o anel de foco do palco não encostar na foto. */
  --ring-air:clamp(16px,2.4vw,34px);

  /* Profundidade da câmera, em px. Menor = mais dramático. Abaixo de ~900 o
     card da frente começa a distorcer nas quinas. */
  --ring-perspective:1400px;

  /* FOLGA DO ANEL, sem unidade. O raio de um polígono regular de N lados de
     largura W é (W/2)/tan(pi/N) — nesse raio os cards fecham como um tambor,
     encostados um no outro. A folga afasta o card do centro na proporção
     dada: 1.12 abre um vão de 12% da largura entre vizinhos, o suficiente
     para o olho ler CARDS EM VOLTA de um eixo, e não uma parede curva.
     Quem lê e aplica é o script. */
  --ring-slack:1.12;

  /* Velocidade da rotação livre, em GRAUS POR SEGUNDO. A conta do script é
     por tempo, não por quadro: 60Hz e 120Hz giram igual. 0 deixa o anel
     parado, girando só no gesto. */
  --ring-speed:6;

  /* Escritos pelo script. Os valores aqui são o estado sem JS: o anel nasce
     desenhado e legível, com o card 0 na frente. */
  --ring-step:45deg;
  --ring-radius:340px;

  position:relative;
  /* Único recorte do componente, e ele é da SEÇÃO — ver a decisão 3 do topo.
     O anel é mais largo que a coluna e, no celular, mais largo que a janela. */
  overflow:hidden;
}

/* ---------------------------------------------------------------- cabeçalho */
/* Só o ajuste de largura: o resto — inclusive a centralização dos filhos vem do .sec-head do core (desde 2026-09-29) — vem da
   primitiva. */
.ring-head{--head-max:700px}

/* ---------------------------------------------------------------- palco */
/* Irmão do .wrap e filho direto da seção: nasce com a largura da página.
   O max-width existe só para o anel de foco: sem ele, o retângulo de
   :focus-visible atravessaria a tela inteira para cercar um anel de 620px.
   Dois raios é a medida certa, e não dois raios mais um card: o card mais
   externo que ainda aparece está a ~60° e a perspectiva já o puxou para
   dentro — medido, 311px de meia-largura contra os 331px do raio. */
.ring-stage{
  position:relative;
  width:100%;
  max-width:calc(2 * var(--ring-radius));
  margin-inline:auto;
  height:calc(var(--ring-h) + 2 * var(--ring-air));
  margin-block:clamp(34px,5vh,56px);
  perspective:var(--ring-perspective);
  /* O gesto horizontal é do anel; o vertical continua sendo da página. */
  touch-action:pan-y;
  /* Arrastar sobre foto e legenda selecionaria as duas. */
  user-select:none;-webkit-user-select:none;
  cursor:grab;
}
.ring-stage.is-dragging{cursor:grabbing}

/* O anel de foco do core desenha 3px PARA FORA; aqui ele cairia na borda da
   seção em tela estreita. Desenhado para dentro, cerca o palco inteiro — que
   é a verdade do widget: quem tem o foco gira o anel, não um card. */
.ring-stage:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}

/* O reveal do core termina em filter:blur(0), que NÃO é filter:none — fica
   uma superfície de composição permanente no elemento. Medido aqui, sobre o
   palco, custa 1% do quadro e não achata nada: o palco tem perspective, não
   preserve-3d. O motivo de tirar mesmo assim é outro: filter é uma das
   grouping properties que ACHATAM 3D, e o mesmo blur(0px) posto no <ul>
   entre a cena e os cards derruba o anel na hora (medido: o card a 90° cai
   de 38px de fatia para 0, e o da frente de 245px para 121). Um componente
   que não carrega grouping property nenhuma dentro da cadeia de perspectiva
   é um componente a menos para quebrar quando alguém mexer aqui.
   A transição continua saindo de blur(14px): `none` interpola como a
   identidade do filtro, então o reveal desfoca do mesmo jeito.
   Especificidade acima do [data-rv].in do core de propósito — o §6.4 proíbe
   depender de qual folha carregou primeiro. */
.ring .ring-stage.in{filter:none}

/* ---------------------------------------------------------------- cena */
/* A única peça que gira, e o único will-change do componente. preserve-3d
   nela E na lista: o <ul> no meio é um plano de achatamento por padrão, e
   sem preserve-3d ele esmagaria os oito cards contra o próprio plano.

   translateZ(-raio) ANTES do rotateY: recua o eixo do anel para trás da tela
   na medida exata do raio, e assim o card da frente pousa em z=0. Invertida,
   a ordem giraria um anel já deslocado e o resultado seria uma órbita torta. */
.ring-scene{
  position:absolute;inset:0;
  transform-style:preserve-3d;
  transform:translateZ(calc(var(--ring-radius) * -1)) rotateY(var(--ring-angle,0deg));
  will-change:transform;
}
.ring-list{position:absolute;inset:0;transform-style:preserve-3d}

/* ---------------------------------------------------------------- card */
/* inset:0 + margin:auto centra o card no palco sem depender de metade da
   própria largura em margem negativa — e o transform-origin cai no centro
   do card, que é o eixo que o rotateY precisa.

   backface-visibility:hidden é o que apaga a metade de trás do anel. Sem
   ela, quatro cards espelhados apareceriam atrás dos da frente e o cilindro
   viraria uma bagunça de texto invertido. */
.ring-card{
  position:absolute;inset:0;margin:auto;
  width:var(--ring-card);height:var(--ring-h);
  transform:rotateY(calc(var(--ring-i) * var(--ring-step))) translateZ(var(--ring-radius));
  backface-visibility:hidden;-webkit-backface-visibility:hidden;
  border-radius:var(--radius-media);
  overflow:hidden;
  background:var(--dark-2);
}
/* Os cards da metade de trás não são pintados, mas continuam existindo para
   o teste de acerto em alguns motores. O script marca quem passou dos 90° e
   a regra tira o card da frente do clique — senão um card invisível roubaria
   o gesto do que está visível atrás dele. */
.ring-card.is-back{pointer-events:none}

.ring-img{
  position:absolute;inset:0;
  width:100%;height:100%;object-fit:cover;
  object-position:var(--ring-focus,50% 42%);
}

/* Legenda DENTRO da foto, ancorada embaixo (contrato §6). O padding de topo
   generoso é o que põe o texto na parte OPACA da máscara: a máscara apaga o
   véu de baixo para cima, e sem esse respiro ela apagaria as letras junto. */
.ring-cap{
  position:absolute;left:0;right:0;bottom:0;z-index:2;
  display:flex;flex-direction:column;align-items:flex-start;gap:9px;
  padding:52px 15px 15px;
  background:linear-gradient(to top,
    rgba(var(--dark-rgb),.93) 0%,
    rgba(var(--dark-rgb),.56) 46%,
    transparent 100%);
  backdrop-filter:blur(3px);-webkit-backdrop-filter:blur(3px);
  mask-image:linear-gradient(to top,#000 0%,rgba(0,0,0,.9) 44%,transparent 100%);
  -webkit-mask-image:linear-gradient(to top,#000 0%,rgba(0,0,0,.9) 44%,transparent 100%);
}

.ring-cap-name{
  font-family:var(--display);font-weight:700;
  font-size:clamp(14px,1.2vw,17px);line-height:1.22;letter-spacing:-.02em;
  color:var(--light);
}

/* Reaproveita a .pill do core — forma, respiro e tracking vêm de lá. Só o tom
   muda, porque a pílula está sobre foto: ali o texto é ilha escura e lê
   --light, não o escopo de tom da seção. Seletor duplo de propósito: .pill e
   .ring-cap-cat têm a mesma especificidade, e o §6.4 proíbe depender de qual
   folha carregou primeiro. */
.ring-cap .ring-cap-cat{
  font-size:10px;letter-spacing:.14em;padding:4px 10px;
  color:var(--light);
  border-color:color-mix(in srgb,var(--light) 32%,transparent);
}

/* VÉU DE PROFUNDIDADE. --ring-depth vem do script: 0 no card da frente, 1 no
   que está a 90°. É uma cortina sólida com opacidade variável, e não
   filter:brightness no card, por uma razão de custo: opacidade é mudança de
   composição, filtro é repintura — e aqui são oito elementos reescritos a
   cada quadro. Sem transition de propósito: o valor já anda quadro a quadro,
   e uma transição por cima transformaria cada escrita numa animação nova.

   Fica ACIMA da legenda (z maior) para o card recuar inteiro, texto junto. */
.ring-veil{
  position:absolute;inset:0;z-index:3;pointer-events:none;
  background:var(--dark);
  opacity:calc(var(--ring-depth,0) * .66);
}

/* ---------------------------------------------------------------- rodapé */
.ring-foot{
  display:flex;align-items:center;justify-content:space-between;
  gap:clamp(16px,3vw,40px);
}

.ring-caption{
  display:flex;flex-direction:column;gap:6px;min-width:0;
}
.ring-caption-title{
  font-family:var(--display);font-weight:700;
  font-size:clamp(18px,2vw,26px);line-height:1.2;letter-spacing:-.02em;
  color:var(--fg);
}
.ring-caption-cat{
  font-family:var(--sans);font-size:13px;line-height:1.4;
  letter-spacing:.14em;text-transform:uppercase;color:var(--fg-muted);
}

/* A troca da legenda entra com blur e subida, como manda o §5 — e por
   animação, não por transition: a classe é posta e tirada pelo script, e
   animação dispara de novo sem depender do estado anterior. */
.ring-caption.is-changing{animation:ringCap .44s var(--ease) both}
@keyframes ringCap{
  from{opacity:0;filter:blur(9px);transform:translateY(9px)}
  to{opacity:1;filter:blur(0);transform:translateY(0)}
}
@media(prefers-reduced-motion:reduce){
  .ring-caption.is-changing{animation:none}
}

.ring-ctrl{display:flex;align-items:center;gap:12px;flex:0 0 auto}

.ring-count{
  display:inline-flex;align-items:baseline;gap:5px;
  font-family:var(--display);font-weight:700;font-size:12px;
  letter-spacing:.12em;color:var(--fg-muted);
  /* Tabular: sem isto o contador dança um pixel a cada troca de dígito. */
  font-variant-numeric:tabular-nums;
  margin-inline-end:6px;
}
.ring-count-now{color:var(--fg-2)}
.ring-count-sep{opacity:.5}

/* Disco de ícone. Não é .btn: .btn é pílula de TEXTO com padding fixo, e
   espremer 42px nela seria brigar com a primitiva. É a QUARTA cópia desta
   regra na biblioteca (galeria-scroll-horizontal, duas-colunas-produto,
   card-expansivel-fullscreen) — proposta de promoção ao core registrada na
   ficha, conforme o §6 do contrato. */
/* O disco de ícone é a primitiva .btn-disc do core (core/base.css): forma,
   cor, hover e o estado desabilitado vêm de lá, e o markup traz as duas
   classes. Esta pasta escrevia as mesmas seis linhas — era a segunda de cinco
   cópias idênticas, e o §6 manda promover na terceira. */

/* Região viva, fora da tela. clip-path e não display:none nem visibility:
   as duas tiram o elemento da árvore de acessibilidade e o anúncio nunca
   sai. Ver o comentário de topo do markup. */
.ring-live{
  position:absolute;width:1px;height:1px;
  margin:-1px;padding:0;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;
}

/* ---------------------------------------------------------------- movimento reduzido */
/* A rotação livre e a inércia são desligadas no script.js — gesto pedido
   pela pessoa (arrasto, seta, botão) continua funcionando, sem arremesso.
   Aqui fica só o que é CSS: a troca da legenda, tratada junto da regra que
   ela desliga, mais acima. */

/* ---------------------------------------------------------------- toque */
/* Sem ponteiro não existe hover: o cursor de arrasto vira ruído, e os dois
   botões passam a ser o alvo de quem prefere tocar. */
@media(hover:none){
  .ring-stage{cursor:default}
  .ring-btn{color:var(--fg)}
}

/* ---------------------------------------------------------------- mobile */
@media(max-width:760px){
  .ring{
    /* Card menor, folga IGUAL à do desktop. A folga não é o parafuso de
       caber: afastar o card do eixo aumenta a meia-largura do anel na tela
       (medido em 390px — 1.12 chega a 219px de borda, 1.28 chega a 250px),
       porque o recuo em z que ela também provoca encolhe menos do que o
       afastamento em x cresce. Quem faz caber é --ring-card. */
    --ring-card:min(44vw,200px);
    /* Câmera mais curta: em tela estreita a profundidade precisa ser mais
       óbvia, senão o anel lê como três cards tortos lado a lado. O card da
       frente não sofre — em z=0 a escala é 1 para qualquer perspectiva. */
    --ring-perspective:1000px;
  }
  .ring-stage{margin-block:clamp(26px,4vh,40px)}
  .ring-foot{flex-direction:column;align-items:center;text-align:center;gap:22px}
  .ring-caption{align-items:center}
  .ring-cap{padding:44px 13px 13px;gap:7px}
}

@media(max-width:420px){
  .ring-caption-title{font-size:17px}
  .ring-count{margin-inline-end:2px}
}
