/* =========================================================================
 * css/pz-ui.css — a ADAPTAÇÃO da entrega Parazona UI v2 (design/handoff/).
 *
 * Os tokens vêm de css/pz-tokens.css, que é cópia verbatim do pacote. Aqui mora
 * o que o handoff NÃO traz: o leiaute das telas. A folha de verdade visual
 * (`Parazona UI v2.dc.html`) não veio no pacote, então o arranjo abaixo é
 * construído a partir das medidas das §4/§5 do HANDOFF.md — cores, tipos e
 * espaçamentos são da entrega; a disposição é interpretação, e está marcada
 * como tal em docs/ui-v2.md.
 *
 * REGRA 1 DO PACOTE: nenhum valor cru. Tudo sai de var(--pz-*). Onde um token
 * falta, ele é criado em pz-tokens.css — não se escreve hex aqui.
 * ========================================================================= */

/* ---- shell de três camadas (HANDOFF §1) ---------------------------------
   z 0  vinheta   ATRÁS do conteúdo — §6 chama isso de "a regra que já custou
                  um bug": por cima, ela escurece os rótulos de canto e derruba
                  o contraste pra ~1,4:1.
   z 1  #pz-ui    a interface. `pointer-events: none` no root; cada painel
                  interativo reativa. Sem isso o HUD come o clique do mundo.
   z 60 scanlines por cima de tudo.
   As classes .pz-vinheta / .pz-scanlines / .pz-conteudo são da entrega
   (pz-tokens.css); daqui pra baixo é adaptação. */

#pz-ui {
  position: fixed;
  inset: 0;
  pointer-events: none;
  font-family: var(--pz-font-dados);
  color: var(--pz-tinta);
  text-transform: uppercase;
  display: none;                      /* ligado por G.pzui.abrir() */
}
#pz-ui[data-ligado='1'] { display: block; }

/* A pele v2 e a v36 não podem desenhar juntas: as duas têm scanline e as duas
   pintam o rodapé. Enquanto a substituição não termina (são 8 passos), quem
   está ligado esconde a outra — ver G.pzui em src/pzui.js. */
body[data-pz='1'] #hud,
body[data-pz='1'] .paperhud { display: none !important; }
body[data-pz='1'] { background: var(--pz-bg); }

/* ---- página e painéis (HANDOFF §4) -------------------------------------- */

.pz-pagina {
  max-width: var(--pz-largura-max);
  margin: 0 auto;
  padding: var(--pz-pad-pagina);
  height: 100%;
  display: grid;
  grid-template-columns: 300px 1fr 320px;
  grid-template-rows: 1fr auto;
  gap: var(--pz-grelha);
  align-content: start;
}

.pz-painel { pointer-events: auto; }
.pz-painel--largo { padding: 16px; }

/* ---- vitais (HANDOFF §4: barra h 9, ícone 20) --------------------------- */

.pz-vitais { display: flex; flex-direction: column; gap: var(--pz-gap); }

.pz-vital { display: grid; grid-template-columns: 1fr auto; gap: 4px 8px; }
.pz-vital__nome { font-size: var(--pz-fs-rotulo); letter-spacing: var(--pz-tr-rotulo); color: var(--pz-tinta-fraca); }
.pz-vital__num  { font-size: var(--pz-fs-log); color: var(--pz-tinta-media); }
.pz-vital .pz-barra { grid-column: 1 / -1; }

.pz-vital--saude    { color: var(--pz-saude); }
.pz-vital--fome     { color: var(--pz-fome); }
.pz-vital--sede     { color: var(--pz-sede); }
.pz-vital--radiacao { color: var(--pz-radiacao); }
.pz-vital--sono     { color: var(--pz-sono); }

/* §5: abaixo de 25% a barra pisca e o ícone sobe pra cor plena */
.pz-vital[data-baixo='1'] .pz-barra > i { animation: pz-blink 1s infinite; }

/* VITAL QUE O JOGO NÃO SIMULA (fome, sede, sono — ver docs/ui-v2.md). Aparece
   apagado e com um traço no lugar do número, em vez de mentir um valor. Sumir
   com a linha seria pior: o painel da entrega tem cinco, e quem compara ia
   achar que faltou implementar a barra, não o sistema. */
.pz-vital[data-ausente='1'] { opacity: .38; }
.pz-vital[data-ausente='1'] .pz-barra > i { width: 0 !important; }

/* ---- grade de itens (HANDOFF §4: 4 colunas, gap 8) ---------------------- */

.pz-grade {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--pz-gap-celula);
}
.pz-celula--vazia { border-color: var(--pz-traco-interno); cursor: default; }
.pz-celula__nome {
  font-size: 10px;
  letter-spacing: .04em;
  color: var(--pz-tinta-media);
  padding: 2px;
  text-align: center;
  line-height: 1.15;
  word-break: break-word;
}

/* ---- log (HANDOFF §5: 5 linhas no painel, sem slide) -------------------- */

.pz-log { display: flex; flex-direction: column; gap: 3px; }
.pz-log__linha { font-size: var(--pz-fs-log); color: var(--pz-tinta-media); }
.pz-log__tag { color: var(--pz-tinta-fraca); }
.pz-log__linha[data-tag='RADIO']   .pz-log__tag { color: var(--pz-log-radio); }
.pz-log__linha[data-tag='SISTEMA'] .pz-log__tag { color: var(--pz-log-sistema); }
.pz-log__linha[data-tag='ALERTA']  .pz-log__tag { color: var(--pz-log-alerta); }

/* ---- painel de depuração (HANDOFF §10 passo 2) -------------------------- */

.pz-debug { grid-column: 1 / -1; display: flex; gap: var(--pz-gap); align-items: center; flex-wrap: wrap; }
.pz-debug .pz-botao { padding: 5px 9px; }
.pz-debug__fonte { color: var(--pz-log-sistema); font-size: var(--pz-fs-rotulo); letter-spacing: var(--pz-tr-rotulo); }

/* =========================================================================
 * PASSOS 4 a 8 — telas, rádio, PDA, rodapé.
 * A moldura do PDA é CSS, não `assets/pda-front-cut.png`: o PNG tem 2 MB e,
 * pior, PNG de disco é cross-origin em `file://` — o Chrome bloqueia antes de
 * desenhar. O handoff já prevê a saída (§9): "tudo isso também existe como CSS
 * puro em tokens.css". A área de tela respeita a medida da entrega, 206×637.
 * ========================================================================= */

.pz-pagina {
  /* 180, não 150: INVENTÁRIO no corpo de menu da entrega (16px, 0.14em) mede
     ~150 sozinho, e o item ainda carrega o '>' e o recuo — a 150 ele vazava do
     realce. Encolher a letra trairia o token; a coluna é que é nossa. */
  grid-template-columns: 180px 1fr;
  grid-template-rows: 1fr auto auto;
  align-content: stretch;
}
.pz-abas { grid-row: 1; pointer-events: auto; align-content: start; }
.pz-corpo {
  grid-column: 2; grid-row: 1;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--pz-grelha);
  align-content: start;
}
.pz-debug, .pz-rodape { grid-column: 1 / -1; }

/* célula: foco de teclado é requisito da entrega (regra 6), e por isso ela é
   <button>. A borda de seleção e o glow vêm de pz-tokens.css. */
.pz-celula { font-family: var(--pz-font-dados); color: inherit; }
.pz-celula:focus-visible { outline: 2px solid var(--pz-acento); outline-offset: 2px; }
.pz-celula:hover { border-color: var(--pz-tinta-fraca); transition: border-color 90ms linear; }

/* ---- LCD (HANDOFF §5) --------------------------------------------------- */
.pz-lcd__freq  { font-size: var(--pz-fs-lcd); letter-spacing: var(--pz-tr-lcd); }
.pz-lcd__nome  { font-size: var(--pz-fs-titulo-painel); letter-spacing: var(--pz-tr-rotulo); }
.pz-lcd__faixa { font-size: var(--pz-fs-rotulo); opacity: .8; }
/* §5 "sem sinal": tinta a 40% e sem o flicker de tela ligada */
.pz-lcd--off { animation: none; }
.pz-lcd--off .pz-lcd__freq,
.pz-lcd--off .pz-lcd__nome,
.pz-lcd--off .pz-lcd__faixa { opacity: .4; }

.pz-radio__controles { display: flex; gap: 7px; align-items: center; flex-wrap: wrap; }
.pz-transporte { width: var(--pz-transporte-w); height: var(--pz-transporte-h); }
/* §4: knob 44 circular com marca de 2×14 em acento. É o único círculo da
   interface — o raio zero da regra 2 é sobre painel e botão, não sobre um
   controle que no mundo real gira. */
.pz-knob {
  width: 44px; height: 44px; border-radius: 50%; position: relative; flex: none;
}
.pz-knob::after {
  content: ''; position: absolute; left: 50%; top: 5px;
  width: 2px; height: 14px; margin-left: -1px; background: var(--pz-acento);
}
.pz-knob[aria-pressed='false']::after { background: var(--pz-tinta-fraca); }

.pz-radio__estacoes { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
.pz-estacao { height: 22px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0 6px; }
.pz-estacao[aria-current='true'] { border-color: var(--pz-acento); color: var(--pz-acento); }

/* ---- PDA ---------------------------------------------------------------- */
/* As quatro abas não cabem numa linha de 206 px no corpo de menu, e o
   flex-wrap as quebrava em 2+2 desalinhado. Grade 2×2 com a largura da tela
   do PDA: as abas viram teclas do aparelho, não uma linha que transbordou. */
.pz-pda__abas {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 4px;
  width: 206px; margin-bottom: 8px;
}
.pz-pda__abas .pz-menu-item { font-size: var(--pz-fs-titulo-painel); white-space: nowrap; padding: 4px 6px; gap: 4px; }
.pz-pda__tela {
  width: 206px; min-height: 260px; max-height: 637px;
  background: var(--pz-painel-plano);
  border: 1px solid var(--pz-traco-interno);
  padding: var(--pz-pad-painel);
  font-size: var(--pz-fs-log);
  color: var(--pz-tinta-media);
  overflow: auto;
}
.pz-pda__tela p { margin: 0 0 6px; }

/* ---- rodapé de mapeamento (HANDOFF §8) ---------------------------------- */
.pz-rodape { flex-direction: row; align-items: center; gap: var(--pz-grelha); flex-wrap: wrap; }
.pz-rodape__par { font-size: var(--pz-fs-rotulo); letter-spacing: var(--pz-tr-rotulo); color: var(--pz-tinta-fraca); }
.pz-rodape__par b { color: var(--pz-tinta); font-weight: normal; }

/* §6: reduced-motion desliga piscada de barra além do que pz-tokens já cobre */
@media (prefers-reduced-motion: reduce) {
  .pz-vital[data-baixo='1'] .pz-barra > i { animation: none !important; }
}
