/* ═══════════════════════════════════════════════════════════════════════════
   LUNFE BASE · camada soberana de design tokens (arquivo vivo — sobrevive
   a qualquer re-export do Claude Design; NUNCA editar as páginas para isto)
   Só variáveis :root — zero regra de layout. Carregado em todos os viewports.
   Sistema: LUNFE BASE — a pele/fundação canônica (z-index, espaço, tipografia).
   ═══════════════════════════════════════════════════════════════════════════ */
:root {
  /* ── Espaçamento · escala 4pt ── */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --space-10: 40px;
  --space-12: 48px;
  --space-16: 64px;

  /* ── Tipografia fluida (clamp min · fluida · max) ── */
  --text-xs:   clamp(0.6875rem, 0.65rem + 0.2vw, 0.75rem);
  --text-sm:   clamp(0.8125rem, 0.77rem + 0.25vw, 0.875rem);
  --text-base: clamp(0.9375rem, 0.88rem + 0.3vw, 1rem);
  --text-lg:   clamp(1.0625rem, 1rem + 0.4vw, 1.1875rem);
  --text-xl:   clamp(1.1875rem, 1.05rem + 0.7vw, 1.4375rem);
  --text-2xl:  clamp(1.4375rem, 1.2rem + 1.2vw, 1.875rem);
  --text-3xl:  clamp(1.75rem, 1.35rem + 2vw, 2.5rem);
  --text-4xl:  clamp(2.125rem, 1.5rem + 3.2vw, 3.375rem);

  /* ── Escada de z-index · sistema LUNFE BASE (única autoridade de empilhamento) ──
     Escala canônica LUNFE BASE, extraída dos 144 literais já em uso e que casa com os
     fallbacks autorados nas lojas (var(--z-drawer,1000), var(--z-header,900), …).
     CORR-001 (2026-08-12): a escala anterior (drawer:300 · modal:400 · critical:900,
     com header/panel/menu OMITIDOS) invertia o empilhamento — header(→900) e panel(→950)
     pintavam SOBRE a gaveta(300)/modal(400). Aqui todos os patamares são definidos, na
     ordem: local < rail < sticky-bar < toast < header < panel < menu < modal-full
            < drawer < overlay < modal < critical.  (engine: float aberto = var(--z-drawer)) */
  --z-ambient: 0;
  --z-base: 1;
  --z-media: 2;
  --z-badge: 3;
  --z-card-ui: 4;
  --z-card-veil: 5;
  --z-sticky-local: 6;
  --z-raised: 10;         /* legado — mantido p/ compat */
  --z-dropdown: 30;
  --z-rail: 40;
  --z-sticky-bar: 60;
  --z-toast: 75;
  --z-sticky: 100;        /* legado — mantido p/ compat */
  --z-header: 900;
  --z-panel: 950;
  --z-menu: 960;
  --z-modal-full: 970;
  --z-drawer: 1000;
  --z-overlay: 1100;
  --z-modal: 1200;
  --z-critical: 1300;

  /* ── Ergonomia ── */
  --tap-min: 44px;
  --header-h: 60px;
}

/* Lição 5 (dc-runtime, MEDIDA 15/08): regra PLANA de <link> externo é descartada
   nas páginas dc — só @media/@supports aplicam. Todo o RESTAURO vive sob um
   @supports sempre-verdadeiro (semântica idêntica em qualquer browser; prova:
   --tap-comfort vazio antes do wrap, 48px depois). */
@supports (display:block) {

/* ═══ RESTAURO GATE-D · PM-01 WP-0 · 15/08/2026 — seção ADITIVA (zero override de valor vivo) ═══
   15 tokens + space-20/24 + guardas L8/L9 presentes no canônico e ausentes em produção.
   NOTA DE FUSÃO (correção sobre o candidato do pacote): o candidato original re-declarava
   --text-xs..3xl em px APÓS a escala rem-clamp viva — a última declaração vence e isso
   sobrescreveria a tipografia viva, violando o invariante do próprio WP ("o vivo vence").
   Esta fusão define SOMENTE nomes novos. Divergência px×rem-clamp segue registrada para a
   manutenção do dossiê (número de contrato se mede, não se recorda). Zero !important. */
:root{
  /* respiro lateral da página: 16px no telefone, 24px a partir de 768 */
  --page-pad:16px;
  /* piso anti-zoom do iOS: NUNCA abaixo de 16px */
  --text-input:16px;
  --text-md:17px;
  --leading-tight:1.12;
  --leading-snug:1.35;
  --leading-base:1.6;
  /* --tap-min (44px WCAG) já vive acima; comfort = caminho de compra */
  --tap-comfort:48px;
  /* extensão da escala 4pt (aditiva) */
  --space-20:80px;
  --space-24:96px;
  /* SAFE AREAS (iOS) — só têm efeito com <meta viewport-fit=cover> */
  --safe-top:env(safe-area-inset-top,0px);
  --safe-bottom:env(safe-area-inset-bottom,0px);
  --safe-left:env(safe-area-inset-left,0px);
  --safe-right:env(safe-area-inset-right,0px);
  /* altura de viewport estável (o contrato refina p/ dvh onde suportado) */
  --vh-full:100vh;
  --vh-hero:88vh;
}

@media (min-width:768px){
  :root{ --page-pad:24px; }
}

/* ══ GUARDAS L9 · CONTENÇÃO DE VAZAMENTO — piso onde não existe declaração ══ */

/* mídia nunca ultrapassa o contêiner (L9) — ausente em 5/5 lojas */
img,video,canvas,svg,iframe{ max-width:100%; }

img,video{ height:auto; }

/* o documento não rola na horizontal por acidente (L9). `clip` não cria
   contexto de scroll — preserva position:sticky, ao contrário de `hidden`. */
html{ overflow-x:clip; }

body{ overflow-x:clip; }

/* piso anti-zoom do iOS: campo com fonte <16px faz o Safari dar zoom no foco.
   Piso, não override de família, peso, cor ou espaçamento. */
input,select,textarea{ font-size:max(16px,1em); }

/* ══ UTILITÁRIOS L8 · POLÍTICA DE ESTOURO DE TEXTO (opt-in no markup) ══ */
[data-clamp="1"],[data-clamp="2"],[data-clamp="3"]{
  display:-webkit-box; -webkit-box-orient:vertical; overflow:hidden;
  overflow-wrap:anywhere;
}

[data-clamp="1"]{ -webkit-line-clamp:1; line-clamp:1; }

[data-clamp="2"]{ -webkit-line-clamp:2; line-clamp:2; }

[data-clamp="3"]{ -webkit-line-clamp:3; line-clamp:3; }

/* linha única com reticências (rótulo de faixa, nome de variante) */
[data-truncate]{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; min-width:0; }

/* filho de flex/grid que precisa poder encolher (causa nº 1 de vazamento) */
[data-shrink]{ min-width:0; }

}  /* fim do @supports · RESTAURO WP-0 */

/* GOAL lojas-cms (2026-09-23) · tokens que o design passou a declarar (espelho be75d932) — união, sem sobrescrever o soberano */
@supports (display:block){
:root{--gap-atual:16px;--surface-model:#F2F2F0;--eco-h:48px;--eco-h-mob:40px;}
}
