/* ===========================================================
   Validades — mundo Lab
   Off-white, preto, UM laranja em campo cheio. Escala editorial
   cheia: título gigante, respiro largo, numeral de seção girado
   na margem, faixa laranja sangrando.
   =========================================================== */

:root{
  --paper:#F3F2EF;
  --paper-2:#EAE9E5;
  --ink:#0A0A09;
  --ink-2:#5F5E59;      /* 5.6:1 sobre --paper */
  --ink-3:#9C9B96;
  --line:#D9D7D1;
  --line-2:#BFBDB6;
  --accent:#FF3B12;
  --accent-lo:#DE2F09;
  --on-accent:#0A0A09;  /* preto sobre laranja: 5.8:1 */
  --sans:'Archivo',system-ui,-apple-system,sans-serif;
  --display:'Manrope','Archivo',system-ui,sans-serif;
  --gut:clamp(20px,5vw,64px);   /* respiro lateral da bancada */
}

*,*::before,*::after{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html{scroll-behavior:smooth}
html,body{height:100%}
body{background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:15px;
  line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden}
.hidden{display:none!important}
button{font:inherit;color:inherit;background:none;border:none}
input,select,textarea{font:inherit}
:focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* ---------- Vocabulário ---------- */
.eyebrow{display:block;font-size:9.5px;font-weight:600;letter-spacing:.24em;
  text-transform:uppercase;color:var(--ink-2)}
.micro-row{display:flex;justify-content:space-between;align-items:baseline;gap:16px;
  padding-bottom:10px;border-bottom:1px solid var(--line);margin-bottom:clamp(12px,2vw,20px)}
.wordmark,.screen-title{font-family:var(--display);font-weight:800;letter-spacing:-.05em;
  line-height:.84;text-transform:lowercase}
/* nowrap é obrigatório: o ponto precisa de display:inline-block
   para aceitar transform no carimbo, e inline-block cria uma
   oportunidade de quebra que a palavra sozinha não tinha —
   sem isso o ponto desce de linha. */
.wordmark{font-size:clamp(46px,10vw,84px);white-space:nowrap}
/* Título de tela bem menor que o da entrada: no login ele é a
   marca, aqui é só rótulo — e cada pixel dele custa uma linha
   de produto que o dono deixa de ver sem rolar. */
.screen-title{font-size:clamp(30px,3.6vw,44px)}
.dot{color:var(--accent)}
.micro-cols{display:grid;gap:18px;margin:clamp(20px,4vw,34px) 0 clamp(26px,5vw,44px);
  grid-template-columns:1fr}
@media(min-width:520px){.micro-cols{grid-template-columns:1fr 1fr;gap:26px}}
.micro-cols p{font-size:11.5px;line-height:1.7;color:var(--ink-2);letter-spacing:.02em}

/* Numeral de seção girado na margem — assinatura da referência */
/* Fora. Girado, o numeral vira mancha ilegível em vez de
   informação, e numa ferramenta que precisa caber na tela ele
   é o primeiro elemento a não pagar o próprio espaço. */
.section-num{display:none}

.sq{width:38px;height:38px;flex:none;display:grid;place-items:center;
  background:var(--ink);color:var(--paper);transition:background .15s}
.sq svg{width:18px;height:18px}
.sq.light{background:var(--ink);color:var(--paper)}

/* Esferas: só na entrada */
.sphere{position:absolute;border-radius:50%;pointer-events:none;z-index:0;
  background:radial-gradient(circle at 30% 26%,#FFF 0%,#F8F7F4 36%,#E0DED7 70%,#C6C4BC 100%);
  box-shadow:0 40px 70px -26px rgba(0,0,0,.18)}
.sphere.s1{width:min(34vw,300px);aspect-ratio:1;top:-8%;left:38%}
.sphere.s2{width:min(20vw,164px);aspect-ratio:1;bottom:4%;left:-5%}
.sphere.s3{width:min(9vw,74px);aspect-ratio:1;top:34%;left:26%}

/* ===========================================================
   LOGIN — composição editorial cheia
   =========================================================== */
#tela-login{position:fixed;inset:0;z-index:60;background:var(--paper);overflow:auto}
.login-grid{display:grid;grid-template-columns:1fr;min-height:100%;
  padding:clamp(22px,5vw,56px) var(--gut) clamp(30px,6vw,56px)}
@media(min-width:900px){.login-grid{grid-template-columns:1fr 42%;gap:clamp(30px,5vw,70px);
  align-items:stretch}}
.login-left{position:relative;z-index:1;max-width:520px;width:100%;align-self:center}
.login-msg{display:none;font-size:13.5px;line-height:1.5;padding:12px 14px;margin-bottom:18px}
.login-msg.show{display:block}
.login-msg.bad{background:var(--accent);color:var(--on-accent)}
.login-msg.ok{background:var(--ink);color:var(--paper)}
.linkbtn{font-size:10px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-2);cursor:pointer;margin-top:24px;padding-bottom:3px;
  border-bottom:1px solid var(--line-2)}
.linkbtn:hover{color:var(--ink);border-bottom-color:var(--accent)}

/* Faixa laranja sangrando + recorte por cima */
.login-right{display:none}
@media(min-width:900px){
  /* Sangra até as quatro bordas: a margem negativa cancela o
     respiro da grade, senão a foto flutua num quadro branco em
     vez de encostar na tela. */
  .login-right{display:block;position:relative;overflow:hidden;
    margin:calc(clamp(22px,5vw,56px) * -1) calc(var(--gut) * -1)
           calc(clamp(30px,6vw,56px) * -1) 0}
}
.band{position:absolute;left:0;right:0;top:24%;height:46%;background:var(--accent)}
.shot{position:absolute;inset:0;background-image:url('https://images.unsplash.com/photo-1618183479302-1e0aa382c36b?w=1400&q=80');
  background-size:cover;background-position:center 46%;
  /* Multiply deixa a faixa laranja atravessar a espuma em vez
     de um retângulo colado por cima da foto. */
  mix-blend-mode:multiply}
/* Rótulo e numeral assentam sobre a foto escura, então vão em
   claro — em preto eles sumiam. */
.vert-box{position:absolute;right:clamp(16px,2vw,28px);top:7%;z-index:2;
  writing-mode:vertical-rl;font-size:9.5px;font-weight:600;letter-spacing:.24em;
  text-transform:uppercase;color:var(--paper);padding:16px 8px;
  border:1px solid rgba(243,242,239,.55)}
/* Numeral vazado da entrada. NÃO chamar de .big-num: esse nome
   já é do valor dos KPIs em Relatórios, e a colisão fazia os
   quatro números virarem absolutos e transparentes, empilhados
   sobre o título. Fica no alto, sobre a parte escura da foto:
   embaixo a imagem abre num tecido claro e o contorno sumia. */
.num-vazado{position:absolute;left:clamp(16px,2vw,30px);top:clamp(16px,2.5vw,34px);z-index:2;
  font-family:var(--display);font-size:clamp(64px,8vw,112px);font-weight:800;
  letter-spacing:-.05em;line-height:1;color:transparent;
  -webkit-text-stroke:1.5px rgba(243,242,239,.8)}

/* ===========================================================
   NAVEGAÇÃO NO TOPO
   =========================================================== */
.topbar{display:none}
.botbar{position:fixed;left:0;right:0;bottom:0;z-index:35;display:grid;
  grid-template-columns:repeat(6,1fr);background:var(--paper);
  border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom)}
.botbar button{color:var(--ink-2);cursor:pointer;padding:10px 1px 11px;display:flex;
  flex-direction:column;align-items:center;gap:5px;font-size:8.5px;font-weight:600;
  letter-spacing:.08em;text-transform:uppercase;position:relative;white-space:nowrap}
.botbar button svg{width:19px;height:19px;flex:none}
.botbar button.on{color:var(--ink)}
.botbar button.on::before{content:'';position:absolute;top:0;left:24%;right:24%;
  height:3px;background:var(--accent)}
.botbar .pill{position:absolute;top:4px;left:calc(50% + 8px)}

@media(min-width:900px){
  .botbar{display:none}
  .topbar{display:flex;align-items:center;gap:clamp(20px,4vw,54px);
    padding:22px var(--gut);border-bottom:1px solid var(--line);
    position:sticky;top:0;z-index:35;background:var(--paper)}
  .topbar-mark{font-family:var(--display);font-size:19px;font-weight:800;
    letter-spacing:-.045em;text-transform:lowercase;flex:none}
  .topbar-links{display:flex;align-items:center;gap:clamp(16px,2.6vw,38px);flex:1}
  .topbar-links button{cursor:pointer;font-size:9.5px;font-weight:600;letter-spacing:.22em;
    text-transform:uppercase;color:var(--ink-2);padding:5px 0;position:relative;
    display:flex;align-items:center;gap:8px;transition:color .15s}
  .topbar-links button:hover{color:var(--ink)}
  .topbar-links button.on{color:var(--ink)}
  .topbar-links button.on::after{content:'';position:absolute;left:0;right:0;bottom:-3px;
    height:2px;background:var(--accent)}
  .topbar-acct{cursor:pointer;font-size:9.5px;font-weight:600;letter-spacing:.22em;
    text-transform:uppercase;color:var(--ink-2);display:flex;align-items:center;gap:9px;
    flex:none;position:relative}
  .topbar-acct:hover{color:var(--ink)}
}
.pill{min-width:16px;height:16px;padding:0 4px;background:var(--accent);
  color:var(--on-accent);font-size:9.5px;font-weight:700;display:grid;place-items:center}
.sync-dot{width:6px;height:6px;border-radius:50%;background:var(--ink);flex:none}
.sync-dot.off{background:var(--accent)}

/* ---------- Bancada ---------- */
.deck{position:relative;width:100%;max-width:1240px;margin:0 auto;
  padding:clamp(20px,3vw,34px) var(--gut) calc(104px + env(safe-area-inset-bottom))}
@media(min-width:900px){.deck{padding-bottom:80px}}
.deck > section{position:relative}
.deck-head{margin-bottom:clamp(10px,1.2vw,15px)}

/* ===========================================================
   HERO
   =========================================================== */
.hero{display:grid;grid-template-columns:1fr;border-top:1px solid var(--ink);
  margin-bottom:clamp(12px,1.6vw,18px)}
@media(min-width:760px){.hero{grid-template-columns:1fr minmax(230px,30%)}}
/* Agora abriga o disco. Respiro à direita para a legenda não
   encostar no bloco laranja. */
.hero-figure{padding:clamp(16px,2vw,22px) clamp(16px,3vw,44px) clamp(18px,2.4vw,26px) 0}
.hero-figure > .eyebrow{margin-bottom:clamp(10px,1.4vw,16px)}

.hero-block{background:var(--accent);color:var(--on-accent);cursor:pointer;
  padding:clamp(18px,2.4vw,26px) clamp(16px,2.2vw,24px);display:flex;flex-direction:column;
  align-items:flex-start;justify-content:center;gap:5px;position:relative;text-align:left;
  transition:background .15s;min-height:clamp(92px,8.5vw,116px);
  /* Sangra até a borda da tela no desktop, como a faixa da
     referência, em vez de terminar no respiro da bancada. */
  margin-right:calc(var(--gut) * -1)}
@media(max-width:759px){.hero-block{margin-right:0}}
/* Não estica junto com a coluna do disco: esticado, virava meio
   metro de laranja com um "2" perdido no meio. Mantém a própria
   altura e encosta no topo da linha. */
@media(min-width:760px){.hero-block{align-self:start}}
.hero-block:hover{background:var(--accent-lo)}
.hero-block-n{font-family:var(--display);font-size:clamp(38px,4.4vw,56px);font-weight:800;
  letter-spacing:-.055em;line-height:.88;font-variant-numeric:tabular-nums}
.hero-block-l{font-size:10px;font-weight:600;letter-spacing:.24em;text-transform:uppercase}
.hero-block .sq{position:absolute;top:clamp(16px,2.4vw,24px);right:clamp(16px,2.4vw,24px)}

/* No celular o valor em risco ocupa a linha inteira: "R$ 63.960"
   não cabe num terço de tela estreita. */
.tally{display:grid;grid-template-columns:1fr 1fr;border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);margin-bottom:clamp(18px,2.6vw,30px)}
.tally .estatico{grid-column:1/-1;border-bottom:1px solid var(--line)}
@media(min-width:640px){
  .tally{grid-template-columns:1.25fr 1fr 1fr}
  .tally .estatico{grid-column:auto;border-bottom:none}
}
.stat{padding:clamp(11px,1.3vw,15px) 0;cursor:pointer;text-align:left;display:block;
  transition:opacity .15s}
.stat + .stat{border-left:1px solid var(--line);padding-left:clamp(16px,2.2vw,26px)}
.stat:hover{opacity:.62}
/* Não é filtro, é leitura: não finge ser clicável. */
.stat.estatico{cursor:default}
.stat.estatico:hover{opacity:1}
.stat-n{display:block;font-family:var(--display);font-size:clamp(24px,2.5vw,32px);
  font-weight:800;letter-spacing:-.05em;line-height:1;font-variant-numeric:tabular-nums}
.stat-n.alarme{color:var(--accent)}
.stat-l{display:block;font-size:9.5px;font-weight:600;letter-spacing:.24em;
  text-transform:uppercase;color:var(--ink-2);margin-top:8px}
.stat-sub{display:block;font-size:10px;letter-spacing:.1em;text-transform:uppercase;
  color:var(--ink-3);margin-top:5px}
.stat-n.alarme ~ .stat-sub{color:var(--accent)}

/* ---------- Faixa de aviso ---------- */
.cta{display:flex;align-items:center;gap:16px;padding:12px 16px;
  margin-bottom:clamp(14px,2vw,20px);background:var(--ink);color:var(--paper)}
.cta.info{background:var(--accent);color:var(--on-accent)}
.cta-t{flex:1;min-width:0;line-height:1.4}
.cta-t b{display:block;font-size:14px;font-weight:700}
.cta-t small{font-size:11.5px;opacity:.7}
.cta button{flex:none;background:var(--paper);color:var(--ink);cursor:pointer;font-size:10px;
  font-weight:700;letter-spacing:.2em;text-transform:uppercase;padding:11px 17px}
.cta.info button{background:var(--ink);color:var(--paper)}
.cta button:hover{background:var(--accent);color:var(--on-accent)}
.cta-x{flex:none;cursor:pointer;font-size:13px;padding:0 2px!important;
  background:none!important;color:inherit!important;opacity:.55;letter-spacing:0}
.cta-x:hover{opacity:1;background:none!important;color:inherit!important}

/* ===========================================================
   LISTAS
   =========================================================== */
.section-label{font-size:9.5px;font-weight:600;letter-spacing:.24em;text-transform:uppercase;
  color:var(--ink-2);margin:clamp(13px,1.6vw,18px) 0 0;padding-bottom:8px;
  border-bottom:1px solid var(--ink)}
.section-label b{color:var(--ink)}
.note{font-size:13px;line-height:1.65;color:var(--ink-2);max-width:64ch;
  margin-bottom:clamp(14px,3vw,24px)}

.list:empty{display:none}
.item{display:flex;align-items:stretch;width:100%;border-bottom:1px solid var(--line);
  transition:background .14s}
.item:hover{background:var(--paper-2)}
.item.inativo{opacity:.42}
.item-main{flex:1;min-width:0;display:flex;align-items:center;gap:clamp(11px,1.6vw,18px);
  padding:clamp(10px,1.2vw,13px) 0;cursor:pointer;text-align:left}

.stripe{width:12px;height:12px;flex:none;background:var(--line-2)}
.item.danger .stripe{background:var(--accent)}
.item.warn .stripe{background:transparent;box-shadow:inset 0 0 0 2.5px var(--accent)}
.item.ok .stripe{background:var(--line-2)}

.thumb{min-width:52px;flex:none;font-size:10px;font-weight:700;letter-spacing:.12em;
  color:var(--ink-3);font-variant-numeric:tabular-nums}
.item-body{flex:1;min-width:0}
.item-body .name{font-size:15px;font-weight:600;letter-spacing:-.02em;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.item-meta{display:flex;align-items:center;gap:14px;margin-top:3px;flex-wrap:wrap}
.item-meta span{font-size:10px;font-weight:500;letter-spacing:.14em;color:var(--ink-2);
  text-transform:uppercase}
.item-meta .qty{color:var(--ink);font-weight:700}
.item-meta .low{color:var(--accent)}
.right{display:flex;flex-direction:column;align-items:flex-end;gap:5px;flex:none;
  padding-left:14px}
.datesm{font-size:10px;letter-spacing:.14em;color:var(--ink-3);font-variant-numeric:tabular-nums}
.badge{font-size:9.5px;font-weight:700;letter-spacing:.18em;text-transform:uppercase;
  white-space:nowrap;flex:none;color:var(--ink-2)}
.badge.danger{color:var(--accent)}
.badge.warn{color:var(--ink)}
.badge.ok,.badge.neutral,.badge.cyan{color:var(--ink-3)}

.item-act{flex:none;width:84px;background:var(--ink);color:var(--paper);cursor:pointer;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  font-size:8.5px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
  margin:10px 0 10px 14px;transition:background .14s}
.item-act svg{width:16px;height:16px}
.item-act:hover{background:var(--accent);color:var(--on-accent)}

.empty{padding:clamp(46px,8vw,80px) 0;color:var(--ink-2);border-bottom:1px solid var(--line)}
.empty .ico{font-size:10px;font-weight:700;letter-spacing:.28em;color:var(--accent);
  margin-bottom:18px;text-transform:uppercase}
.empty h3{font-family:var(--display);font-size:clamp(26px,4vw,40px);font-weight:800;
  letter-spacing:-.04em;color:var(--ink);margin-bottom:12px;text-transform:lowercase}
.empty p{font-size:13.5px;line-height:1.7;max-width:46ch}
.loading{display:flex;align-items:center;gap:13px;padding:48px 0;font-size:9.5px;
  font-weight:600;letter-spacing:.24em;text-transform:uppercase;color:var(--ink-2);
  border-bottom:1px solid var(--line)}
.spin{width:12px;height:12px;border:2px solid var(--line);border-top-color:var(--accent);
  border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- Movimentações ---------- */
.mov{display:flex;align-items:center;gap:clamp(11px,1.5vw,16px);
  padding:clamp(10px,1.3vw,14px) 0;border-bottom:1px solid var(--line)}
.mov .stripe{width:3px;height:28px;background:var(--line-2)}
.mov.entrada .stripe,.mov.ajuste .stripe{background:var(--ink)}
.mov.descarte .stripe{background:var(--accent)}
.mov.saida .stripe{background:var(--ink-3)}
.mov .tipo{width:26px;flex:none;font-size:16px;font-weight:700;text-align:center}
.mov.descarte .tipo{color:var(--accent)}
.mov-body{flex:1;min-width:0}
.mov-body .name{font-size:15px;font-weight:600;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.mov-body .sub{font-size:10px;letter-spacing:.14em;text-transform:uppercase;
  color:var(--ink-2);margin-top:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mov .qtd{font-family:var(--display);font-size:19px;font-weight:800;flex:none;
  text-align:right;font-variant-numeric:tabular-nums;letter-spacing:-.03em}
.mov.descarte .qtd{color:var(--accent)}
.mov .qtd small{display:block;font-size:8.5px;font-weight:600;letter-spacing:.18em;
  color:var(--ink-2);margin-top:4px;font-family:var(--sans)}

/* ===========================================================
   FERRAMENTAS
   =========================================================== */
.toolbar{display:flex;border:1px solid var(--ink);margin-bottom:11px}
.search{flex:1;position:relative;min-width:0}
.search svg{position:absolute;left:16px;top:50%;transform:translateY(-50%);
  width:16px;height:16px;color:var(--ink-2)}
.search input{width:100%;height:clamp(46px,4.4vw,52px);background:none;color:var(--ink);
  font-size:14px;padding:0 14px 0 44px;outline:none;border:none}
.search input::placeholder{color:var(--ink-2)}
.iconbtn{width:clamp(46px,4.4vw,52px);flex:none;background:none;color:var(--ink);
  cursor:pointer;display:grid;place-items:center;border-left:1px solid var(--ink);
  transition:.14s}
.iconbtn:hover{background:var(--ink);color:var(--paper)}
.iconbtn svg{width:19px;height:19px}

.chips{display:flex;gap:6px;margin-bottom:6px;overflow-x:auto;padding-bottom:3px;
  scrollbar-width:none}
.chips::-webkit-scrollbar{display:none}
.chips button{flex:none;cursor:pointer;font-size:9.5px;font-weight:600;letter-spacing:.16em;
  text-transform:uppercase;padding:8px 13px;white-space:nowrap;color:var(--ink-2);
  border:1px solid var(--line);transition:.14s}
.chips button:hover{border-color:var(--ink);color:var(--ink)}
.chips button.on{background:var(--ink);border-color:var(--ink);color:var(--paper)}

.fab{position:fixed;right:clamp(16px,3vw,34px);bottom:calc(88px + env(safe-area-inset-bottom));
  z-index:30;height:56px;padding:0 24px;cursor:pointer;background:var(--accent);
  color:var(--on-accent);font-size:10.5px;font-weight:700;letter-spacing:.2em;
  text-transform:uppercase;display:flex;align-items:center;gap:10px;transition:background .14s}
.fab:hover{background:var(--ink);color:var(--paper)}
.fab svg{width:17px;height:17px}
@media(min-width:900px){.fab{bottom:clamp(24px,3vw,34px)}}

/* ===========================================================
   GRÁFICOS
   =========================================================== */
.charts{display:grid;gap:clamp(22px,3vw,38px);align-items:start;
  grid-template-columns:repeat(auto-fit,minmax(290px,1fr))}
.panel{padding-top:13px;border-top:1px solid var(--ink);margin-bottom:clamp(16px,2.2vw,24px)}
.panel > .eyebrow{margin-bottom:clamp(14px,2vw,20px)}

/* Alinhado à esquerda, na mesma margem do rótulo e da legenda.
   Centrado ele abria um vazio à esquerda que não dizia nada. */
.disc-wrap{position:relative;display:grid;place-items:center;margin:0 auto;
  width:min(206px,72%);aspect-ratio:1}
.hero-figure .disc-wrap{margin:0;width:min(230px,86%)}
.disc{width:100%;height:100%;transform:rotate(-90deg)}
/* Só a reserva: a duração e o atraso reais vêm inline, por arco,
   calculados a partir do tamanho da fatia. Linear de propósito —
   uma caneta traçando não acelera no meio da volta. */
.disc .arc{transition:stroke-dasharray .8s linear,opacity .16s linear}
.disc .arc.clic{cursor:pointer}
.disc-wrap.lendo .arc.clic{opacity:.2}
.disc-wrap.lendo .arc.clic.on{opacity:1}
.disc-center{position:absolute;inset:27%;display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;pointer-events:none;gap:4px}
.disc-center .lbl{font-size:8.5px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-2);line-height:1.35}
.disc-center .val{font-family:var(--display);font-size:22px;font-weight:800;
  letter-spacing:-.04em;line-height:1;font-variant-numeric:tabular-nums;white-space:nowrap}
.disc-center .pct{font-size:12px;font-weight:700;color:var(--accent)}

.legend{margin-top:16px}
.legend button{display:flex;align-items:center;gap:13px;width:100%;padding:7px 0;
  cursor:pointer;text-align:left;border-bottom:1px solid var(--line);transition:.14s}
.legend button:hover,.legend button.on{padding-left:8px}
.legend .sw{width:10px;height:10px;flex:none}
.legend .nm{flex:1;font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.legend .vl{font-size:10.5px;font-weight:700;letter-spacing:.1em;color:var(--ink-2);
  flex:none;font-variant-numeric:tabular-nums}

/* Cauda recolhida. A regra de abrir tem uma classe a mais que a
   de esconder, então vence sem precisar de !important. */
.legend button.oculto{display:none}
.legend.aberta button.oculto{display:flex}
.legend-toggle{justify-content:flex-start!important;gap:0!important;
  font-size:9.5px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-2);border-bottom:none!important;padding-top:11px!important}
.legend-toggle:hover{color:var(--ink);padding-left:0!important}
.legend .menos{display:none}
.legend.aberta .mais{display:none}
.legend.aberta .menos{display:inline}

.horizon{display:flex;flex-direction:column}
.hz{display:grid;grid-template-columns:1fr auto;gap:5px;padding:clamp(9px,1.2vw,12px) 0;
  border-bottom:1px solid var(--line)}
.hz .nm{font-size:13px;font-weight:500;display:flex;align-items:center;gap:11px}
.hz .nm .sw{width:10px;height:10px;flex:none}
.hz .vl{font-size:10.5px;font-weight:700;letter-spacing:.1em;color:var(--ink-2);
  font-variant-numeric:tabular-nums}
.hz .track{grid-column:1/-1;height:3px;background:var(--line);margin-top:6px}
.hz .fill{height:100%;width:100%;transform:scaleX(0);transform-origin:left;
  transition:transform .8s cubic-bezier(.22,.8,.2,1)}
.hz.zero{opacity:.38}
.chart-vazio{font-size:12.5px;color:var(--ink-2);padding:30px 0;line-height:1.7}

/* ---------- Relatórios ---------- */
.kpis{display:grid;grid-template-columns:repeat(2,1fr);border-top:1px solid var(--ink);
  border-bottom:1px solid var(--line);margin-bottom:clamp(18px,2.6vw,28px)}
@media(min-width:760px){.kpis{grid-template-columns:repeat(4,1fr)}}
.kpi{padding:clamp(13px,1.8vw,18px) clamp(12px,1.6vw,18px) clamp(14px,2vw,20px)}
.kpi + .kpi{border-left:1px solid var(--line)}
.big-num{font-family:var(--display);font-size:clamp(22px,2.6vw,30px);font-weight:800;
  letter-spacing:-.045em;line-height:1;font-variant-numeric:tabular-nums}
.big-num.danger{color:var(--accent)}
.big-sub{font-size:9px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-2);margin-top:8px}

.bars{display:flex;flex-direction:column}
.barrow{display:grid;grid-template-columns:1fr auto;gap:5px;padding:clamp(9px,1.2vw,12px) 0;
  border-bottom:1px solid var(--line)}
.barrow .lbl{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.barrow .val{font-size:10.5px;font-weight:700;letter-spacing:.1em;color:var(--ink-2);
  font-variant-numeric:tabular-nums}
.barrow .track{grid-column:1/-1;height:3px;background:var(--line);margin-top:6px}
.barrow .fill{height:100%;width:100%;background:var(--ink);transform:scaleX(0);
  transform-origin:left;transition:transform .6s cubic-bezier(.22,.8,.2,1)}
.barrow .fill.danger{background:var(--accent)}
.barrow .fill.warn{background:var(--ink-3)}

.months{display:flex;align-items:stretch;gap:clamp(6px,1vw,11px);
  height:clamp(112px,13vw,150px);margin-top:6px}
.months .m{flex:1;display:flex;flex-direction:column;align-items:center;gap:10px;min-width:0}
.months .col-track{flex:1;width:100%;display:flex;align-items:flex-end;min-height:0}
.months .col{width:100%;height:100%;background:var(--accent);transform:scaleY(0);
  transform-origin:bottom;transition:transform .6s cubic-bezier(.22,.8,.2,1)}
.months .ml{font-size:8.5px;font-weight:600;letter-spacing:.2em;text-transform:uppercase;
  color:var(--ink-2)}
.months .mv{font-size:10px;font-weight:700;color:var(--ink-2);font-variant-numeric:tabular-nums}

/* ===========================================================
   GAVETAS
   =========================================================== */
.scrim{position:fixed;inset:0;background:rgba(10,10,9,.4);z-index:40;opacity:0;
  pointer-events:none;transition:opacity .22s}
.scrim.open{opacity:1;pointer-events:auto}
.sheet{position:fixed;left:0;right:0;bottom:0;z-index:41;max-width:620px;margin:0 auto;
  background:var(--paper);padding:0 clamp(20px,4vw,32px) calc(28px + env(safe-area-inset-bottom));
  transform:translateY(102%);transition:transform .3s cubic-bezier(.22,.8,.2,1);
  max-height:92vh;overflow-y:auto;overscroll-behavior:contain;border-top:4px solid var(--accent)}
.sheet.open{transform:translateY(0)}
.handle{width:44px;height:2px;margin:18px auto 22px;background:var(--line-2)}
.sheet h2{font-family:var(--display);font-size:clamp(28px,5vw,38px);font-weight:800;
  letter-spacing:-.045em;margin:12px 0 6px;text-transform:lowercase;line-height:.95}
.sheet .sub{color:var(--ink-2);font-size:13px;margin-bottom:26px}
.sheet .sub b{color:var(--ink);font-weight:700}
.sheet .section-label{margin-top:30px}

/* ---------- Controles ---------- */
.field{margin-bottom:18px}
.field label{display:block;font-size:9px;font-weight:600;letter-spacing:.24em;
  text-transform:uppercase;color:var(--ink-2);margin-bottom:8px}
.field label .opt{letter-spacing:.08em;color:var(--ink-3)}
.field input,.field select{width:100%;background:none;color:var(--ink);font-size:16px;
  padding:11px 0;outline:none;border:none;border-bottom:1px solid var(--line-2)}
.field input:focus,.field select:focus{border-bottom-color:var(--accent);outline:none}
.field input::placeholder{color:var(--ink-3)}
.field input[type=number],.field input[type=date]{font-variant-numeric:tabular-nums}
.field input:disabled{color:var(--ink-2)}
.hint{font-size:10.5px;letter-spacing:.1em;color:var(--ink-2);margin-top:7px;
  text-transform:uppercase}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.row3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:13px}
.with-btn{display:flex;gap:12px;align-items:flex-end}
.with-btn input{flex:1;min-width:0}
.with-btn .iconbtn{border:1px solid var(--ink);height:46px;width:46px}

.opt-row{display:flex;gap:7px;flex-wrap:wrap}
.opt-row button{flex:1;min-width:66px;cursor:pointer;font-size:9.5px;font-weight:600;
  letter-spacing:.16em;text-transform:uppercase;padding:12px 4px;color:var(--ink-2);
  border:1px solid var(--line);transition:.14s}
.opt-row button:hover{border-color:var(--ink);color:var(--ink)}
.opt-row button.on{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.opt-row.tipos button.on[data-tipo=descarte]{background:var(--accent);
  border-color:var(--accent);color:var(--on-accent)}

.actions{display:flex;gap:11px;margin-top:30px}
.btn{cursor:pointer;padding:0 22px;min-height:56px;font-size:10.5px;font-weight:700;
  letter-spacing:.2em;text-transform:uppercase;transition:.14s;display:flex;
  align-items:center;justify-content:center;gap:14px}
.btn:disabled{opacity:.42;cursor:not-allowed}
.btn.primary{flex:1;background:var(--ink);color:var(--paper);padding-right:9px;
  justify-content:space-between}
.btn.primary .sq{background:var(--accent);color:var(--on-accent)}
.btn.primary:hover:not(:disabled){background:var(--accent);color:var(--on-accent)}
.btn.primary:hover:not(:disabled) .sq{background:var(--ink);color:var(--paper)}
.btn.ghost{flex:1;color:var(--ink);border:1px solid var(--line-2)}
.btn.ghost:hover{border-color:var(--ink)}
.btn.del{flex:none;width:58px;padding:0;background:var(--accent);color:var(--on-accent)}

/* ---------- Detalhe ---------- */
.detail-grid{display:grid;grid-template-columns:repeat(2,1fr);
  border-top:1px solid var(--ink);border-bottom:1px solid var(--line);margin-bottom:10px}
.detail-grid div{padding:14px 0 15px}
.detail-grid div:nth-child(odd){padding-right:14px;border-right:1px solid var(--line)}
.detail-grid div:nth-child(even){padding-left:14px}
.detail-grid div:nth-child(n+3){border-top:1px solid var(--line)}
.detail-grid dt{font-size:8.5px;font-weight:600;letter-spacing:.22em;text-transform:uppercase;
  color:var(--ink-2)}
.detail-grid dd{font-size:15px;font-weight:600;margin-top:5px;word-break:break-word}
.detail-grid dd.mono{font-variant-numeric:tabular-nums;letter-spacing:.06em}

.quick{display:grid;grid-template-columns:repeat(4,1fr);gap:7px;margin-top:16px}
.quick button{padding:17px 3px;cursor:pointer;font-size:9px;font-weight:600;
  letter-spacing:.14em;text-transform:uppercase;color:var(--ink-2);
  border:1px solid var(--line);display:flex;flex-direction:column;align-items:center;gap:8px;
  transition:.14s}
.quick button:hover{background:var(--ink);border-color:var(--ink);color:var(--paper)}
.quick button b{font-size:17px;font-weight:700}

/* ---------- Leitor ---------- */
#scanBox{position:relative;background:var(--ink);aspect-ratio:4/3;overflow:hidden;
  margin-bottom:18px}
#scanBox video{width:100%;height:100%;object-fit:cover;display:block}
.scan-frame{position:absolute;inset:16% 10%;border:2px solid var(--accent);
  box-shadow:0 0 0 9999px rgba(10,10,9,.58);pointer-events:none}
.scan-frame::after{content:'';position:absolute;left:0;right:0;top:50%;height:2px;
  background:var(--accent)}
/* A varredura só corre com a gaveta aberta. Fora dela a câmera
   está desligada, e um laço rodando fora de tela é bateria
   queimada à toa. */
.sheet.open .scan-frame::after{animation:scanline 2s ease-in-out infinite}
@keyframes scanline{0%,100%{top:8%}50%{top:92%}}
.scan-hint{font-size:12.5px;color:var(--ink-2);line-height:1.6;margin-bottom:18px}

/* ---------- Aviso ---------- */
.toast{position:fixed;left:50%;bottom:calc(104px + env(safe-area-inset-bottom));
  transform:translateX(-50%) translateY(10px);background:var(--ink);color:var(--paper);
  padding:15px 22px;font-size:12.5px;z-index:70;opacity:0;pointer-events:none;
  transition:.24s;max-width:min(92vw,470px);text-align:center;line-height:1.5}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.bad{background:var(--accent);color:var(--on-accent)}
@media(min-width:900px){.toast{bottom:34px}}

/* ===========================================================
   MOTION
   Um momento autoral, na entrada. No app, movimento só explica
   estado — quem está dando baixa em produto vencido não pode
   esperar coreografia.
   =========================================================== */

/* ---------- A entrada se imprime ---------- */
@keyframes varreFaixa{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes assentaFoto{from{transform:scale(1.07)}to{transform:scale(1)}}
@keyframes revelaTipo{from{clip-path:inset(105% 0 0 0)}to{clip-path:inset(-15% 0 0 0)}}
@keyframes carimba{from{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}
@keyframes sobe{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes traçaBorda{from{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 -2% 0)}}

.pagina-login .band{transform-origin:left center;
  animation:varreFaixa .62s cubic-bezier(.16,1,.3,1) both}
.pagina-login .shot{animation:assentaFoto .95s cubic-bezier(.16,1,.3,1) both}
/* A máscara sobe no lugar de opacidade: a letra aparece como
   tinta assentando no papel, que é o gesto desta identidade. */
.pagina-login .wordmark{animation:revelaTipo .66s .16s cubic-bezier(.16,1,.3,1) both}
/* O ponto é carimbado por último, sozinho. */
.pagina-login .wordmark .dot{display:inline-block;
  animation:carimba .26s .72s cubic-bezier(.16,1,.3,1) both}
.pagina-login .micro-row{animation:sobe .5s .3s cubic-bezier(.16,1,.3,1) both}
.pagina-login .micro-cols{animation:sobe .5s .4s cubic-bezier(.16,1,.3,1) both}
.pagina-login #formLogin{animation:sobe .5s .48s cubic-bezier(.16,1,.3,1) both}
.pagina-login .linkbtn{animation:sobe .5s .56s cubic-bezier(.16,1,.3,1) both}
.pagina-login .vert-box{animation:traçaBorda .5s .5s cubic-bezier(.16,1,.3,1) both}
.pagina-login .num-vazado{animation:sobe .6s .58s cubic-bezier(.16,1,.3,1) both}

/* Esferas à deriva: são objetos suspensos, não adesivos. Só
   transform, e só nesta página — o navegador já congela isso em
   aba de fundo. */
@keyframes deriva{
  0%,100%{transform:translate3d(0,0,0)}
  50%{transform:translate3d(-10px,-18px,0)}
}
.pagina-login .sphere{animation:deriva 13s ease-in-out infinite}
.pagina-login .sphere.s2{animation-duration:17s;animation-delay:-4s}
.pagina-login .sphere.s3{animation-duration:10s;animation-delay:-7s}

/* ---------- App: continuidade na troca de seção ---------- */
@keyframes secaoEntra{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.deck > section.entra{animation:secaoEntra .2s cubic-bezier(.16,1,.3,1) both}

/* O número de risco reconhece a própria mudança. É o dado que o
   produto inteiro existe para vigiar, então quando ele se move
   por uma baixa registrada, precisa ser visto se movendo. */
@keyframes pulsaValor{
  0%{opacity:.25;transform:translateY(4px)}
  100%{opacity:1;transform:none}
}
.stat-n.mudou{animation:pulsaValor .34s cubic-bezier(.16,1,.3,1) both}

/* ---------- Retorno imediato ---------- */
.sq svg{transition:transform .16s cubic-bezier(.16,1,.3,1)}
.btn.primary:hover:not(:disabled) .sq svg,
.hero-block:hover .sq svg{transform:translateX(3px)}
.item-act:active{background:var(--accent);color:var(--on-accent)}
.chips button,.opt-row button,.quick button{transition:background .14s,border-color .14s,color .14s}

@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;
    transition-duration:.001ms!important}
  .scan-frame::after{display:none}
  .pagina-login .sphere{animation:none}
}
