/* heartbeat / sistema.
   Mesma paleta e mesmas fontes do cartão, mas o cartão é uma peça editorial e
   isto é uma ferramenta: mais denso, mais rótulo, menos ar. O único elemento
   quente é a polaroid, e ela é quente de propósito, contra a moldura fria. */

:root{
  --bg:        oklch(0.128 0.011 350);
  --superf:    oklch(0.168 0.013 350);
  --ink:       oklch(0.89 0.016 350);
  --ink-dim:   oklch(0.62 0.020 350);
  --ink-faint: oklch(0.43 0.018 350);
  --line:      oklch(0.25 0.016 350);
  --linha-viva:oklch(0.34 0.030 352);
  --rosa:      oklch(0.57 0.140 356);
  --rosa-fraco:oklch(0.30 0.060 356);
  --ambar:     oklch(0.80 0.100 62);
  --papel:     oklch(0.93 0.012 85);   /* a polaroid: o único claro do sistema */
  --papel-ink: oklch(0.30 0.020 300);

  --sp-1:.25rem; --sp-2:.5rem; --sp-3:.75rem; --sp-4:1rem;
  --sp-5:1.25rem; --sp-6:1.5rem; --sp-8:2rem; --sp-12:3rem; --sp-16:4rem;

  --borda: max(var(--sp-4), env(safe-area-inset-left));
  --r: 2px;
}
*{box-sizing:border-box;margin:0;padding:0}
html{
  -webkit-text-size-adjust:100%;
  /* Faz o navegador desenhar os controles NATIVOS em tema escuro: o ícone do
     calendário, o popup do seletor de data e os campos deixam de vir claros
     sobre o preto. Uma linha resolve o que filtros de imagem resolveriam mal. */
  color-scheme:dark;
  /* A barra de rolagem padrão vem clara e risca o fundo preto. Fina e na cor do
     tema, ela some no design sem desaparecer: no PC ainda indica a posição.
     No iPhone é overlay e não ocupa largura nenhuma de qualquer jeito. */
  scrollbar-width:thin;
  scrollbar-color:var(--linha-viva) transparent;
}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--linha-viva);border-radius:8px}
::-webkit-scrollbar-thumb:hover{background:var(--rosa-fraco)}
body{
  background:var(--bg);color:var(--ink);
  font-family:Faustina,Georgia,serif;
  font-size:1.0625rem;line-height:1.7;
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
  padding-bottom:env(safe-area-inset-bottom);
}
.mono{font-family:'Chivo Mono',ui-monospace,monospace}
.rotulo{
  font-family:'Chivo Mono',ui-monospace,monospace;font-weight:400;
  font-size:.625rem;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-faint);
}
a{color:var(--rosa)}
:focus-visible{outline:2px solid var(--rosa);outline-offset:3px}

/* ----------------------------------------------------------- estruturas --- */
.faixa{max-width:62rem;margin:0 auto;padding-inline:var(--borda)}

header.topo{
  position:sticky;top:0;z-index:40;
  background:color-mix(in oklch,var(--bg) 92%,transparent);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
  border-bottom:1px solid var(--line);
}
header.topo .faixa{display:flex;align-items:center;gap:var(--sp-4);
  padding-block:var(--sp-3);flex-wrap:wrap}
.marca{font-family:'Chivo Mono',monospace;font-size:.75rem;letter-spacing:.2em;
  text-transform:uppercase;color:var(--ink-dim)}
.marca b{color:var(--rosa);font-weight:400}
.espaco{flex:1}

nav.abas{display:flex;gap:var(--sp-1)}
/* Aba marcada por sublinhado, não por caixa. Duas razões: o resto do sistema é
   feito de filetes de 1px e nenhuma caixa, e a borda da caixa empurrava o texto
   12px para dentro, desalinhando a primeira aba da marca acima dela. */
nav.abas button{
  font-family:'Chivo Mono',monospace;font-size:.6875rem;letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink-faint);
  background:none;border:0;border-bottom:1px solid transparent;
  padding:.4rem .7rem .35rem;cursor:pointer;transition:color .2s,border-color .2s;
  position:relative;
}
nav.abas button:hover{color:var(--ink-dim)}
nav.abas button[aria-current="true"]{color:var(--rosa);border-bottom-color:var(--rosa)}
/* marcador de novidade: sem sinal de "tem coisa nova", ninguém volta ao site */
nav.abas button[data-novo]::after{
  content:attr(data-novo);
  position:absolute;top:-.3rem;right:-.3rem;
  background:var(--ambar);color:oklch(0.18 0.02 62);
  font-size:.5rem;line-height:1;padding:.2rem .3rem;border-radius:1rem;
  font-weight:500;letter-spacing:0;
}

/* No iPhone as cinco abas mais três ações não cabem numa linha: em vez de
   deixar quebrar em três fileiras desalinhadas, a barra vira duas linhas e as
   abas rolam na horizontal. */
@media(max-width:46rem){
  header.topo .faixa{
    display:grid;
    grid-template-columns:1fr auto;
    grid-template-areas:"marca acoes" "abas abas";
    gap:var(--sp-3) var(--sp-3);
    padding-block:var(--sp-3) 0;      /* o sublinhado da aba encosta na borda */
  }
  .marca{grid-area:marca;align-self:center}
  .espaco{display:none}
  /* A última ação perde o padding lateral para o texto "sair" fechar na mesma
     linha vertical em que a marca começa do outro lado. */
  header.topo .acoes{grid-area:acoes;display:flex;gap:var(--sp-1);align-items:center;
    margin-right:calc(-1 * var(--sp-2))}
  nav.abas{
    grid-area:abas;
    overflow-x:auto;scrollbar-width:none;
    /* Sangra até a borda da tela para a rolagem não parecer cortada, mas o
       padding compensa o do botão: assim o TEXTO da primeira aba cai na mesma
       vertical da marca, e não a caixa invisível dele. */
    margin-inline:calc(-1 * var(--borda));
    padding-inline:calc(var(--borda) - .7rem);
    /* Distribui as abas pela largura toda. Sem isto sobravam 76px mortos depois
       de "agenda", e a fileira terminava antes da linha em que "sair" termina
       logo acima. Quando não couberem, o space-between não atrapalha: os itens
       já preenchem e a rolagem assume. */
    justify-content:space-between;
    gap:0;
  }
  nav.abas::-webkit-scrollbar{display:none}
  nav.abas button{flex:none}
}

main{padding-block:var(--sp-8) var(--sp-16)}
section[hidden]{display:none}
h1{font-weight:400;font-size:clamp(1.75rem,1.3rem + 1.9vw,2.5rem);
  letter-spacing:-.02em;line-height:1.1}
h2{font-weight:500;font-size:1.25rem;letter-spacing:-.01em;margin-bottom:var(--sp-4)}
.vazio{color:var(--ink-faint);font-style:italic;padding-block:var(--sp-8)}

/* --------------------------------------------------------------- home --- */

/* O coração é o único ornamento que entra aqui, e entra porque é a assinatura
   do projeto: o site se chama heartbeat. Enfeite genérico numa tela vazia não
   resolve o vazio, só o decora.

   Centralizado, com o tempo no ar logo abaixo. Tentei antes fundir isto com o
   evento em destaque num painel de duas colunas, para aproveitar o vazio da
   direita; ficou pior, porque o coração precisava encolher para caber ao lado
   do contador e a peça perdia presença. Empilhado e centrado ele volta ao
   tamanho que merece, e o vazio deixa de existir. */
.estado{
  border:1px solid var(--line);
  /* Menos padding em cima: o desenho já traz duas linhas vazias no topo, que
     somavam ao padding e deixavam 58px de vazio contra 33px embaixo. */
  padding:var(--sp-5) var(--sp-6) var(--sp-8);margin-bottom:var(--sp-6);
  display:flex;flex-direction:column;align-items:center;text-align:center;
}
.estado pre{
  color:var(--rosa);font-family:'Chivo Mono',ui-monospace,monospace;
  /* 0.42rem dava ~6.7px: ASCII miúdo demais não lê como coração, lê como
     sujeira. Solto numa linha só, ele tem espaço para ser maior. */
  font-size:.78rem;line-height:1.02;white-space:pre;
  margin-bottom:var(--sp-5);
}
.conta{font-family:'Chivo Mono',ui-monospace,monospace;
  font-size:clamp(1.35rem,1.05rem + 1.5vw,2rem);
  color:var(--rosa);font-variant-numeric:tabular-nums;line-height:1.2;margin-block:.2rem}

.bloco{margin-bottom:var(--sp-8)}
.bloco > h2{display:flex;align-items:baseline;gap:var(--sp-3);margin-bottom:var(--sp-4)}
.bloco > h2 .rotulo{font-size:.5625rem}

/* Prévia do último bilhete: papel, como a polaroid, porque é da mesma família
   de coisa (algo escrito à mão) e não da família dos painéis. */
.previa-bilhete{
  background:var(--papel);color:var(--papel-ink);
  font-family:Kalam,cursive;font-size:1.25rem;line-height:1.4;
  padding:var(--sp-5) var(--sp-6);border-radius:var(--r);
  box-shadow:0 1px 2px oklch(0 0 0/.45), 0 10px 24px -10px oklch(0 0 0/.5);
  transform:rotate(-.5deg);max-width:34rem;
}
.previa-bilhete .quem{
  display:block;margin-top:var(--sp-3);
  font-family:'Chivo Mono',monospace;font-size:.5625rem;letter-spacing:.14em;
  text-transform:uppercase;color:oklch(0.52 0.02 300);
}

/* O destaque volta a ser um bloco próprio, fora da caixa do coração. */
.destaque{border:1px solid var(--line);padding:var(--sp-6);margin-bottom:var(--sp-8)}
.destaque h1{font-size:clamp(1.5rem,1.2rem + 1.2vw,2rem)}
/* .destaque .conta foi removida: era resquício de quando o destaque vivia fora
   do painel, repetia tudo que .conta já faz e, por vir depois com a mesma
   especificidade, sobrescrevia o tamanho responsivo — o contador do evento
   saía maior que o do uptime logo ao lado. */
.destaque .nota{color:var(--ink-dim);margin-top:var(--sp-3);max-width:52ch}

/* ------------------------------------------------------------ polaroid --- */
.mural{display:grid;gap:var(--sp-6) var(--sp-5);
  grid-template-columns:repeat(auto-fill,minmax(min(15rem,100%),1fr));
  align-items:start}
/* Prévia na home: com o mesmo minmax do mural, uma foto ocupava a tela inteira
   do celular e a "prévia" ficava maior que a coisa que ela prevê. */
.mural.compacto{gap:var(--sp-4) var(--sp-3);
  grid-template-columns:repeat(auto-fill,minmax(min(8.5rem,46%),1fr))}
.mural.compacto .polaroid{padding:.45rem .45rem 2.7rem}
.mural.compacto .assina{font-size:.8rem;left:.55rem;right:.55rem;bottom:.7rem}
.mural.compacto .verso{padding:.9rem .8rem;font-size:1rem;gap:.35rem}

.polaroid{
  background:var(--papel);
  /* A margem de baixo precisa caber DUAS linhas de legenda (o line-clamp abaixo
     permite duas). Com 3.2rem a segunda linha subia por cima da foto. */
  padding:.7rem .7rem 4.6rem;
  border-radius:var(--r);
  /* sombra de objeto sobre mesa, não de card de dashboard */
  box-shadow:0 1px 2px oklch(0 0 0/.5), 0 12px 28px -8px oklch(0 0 0/.55);
  cursor:pointer;border:0;display:block;width:100%;
  transform-style:preserve-3d;transition:transform .6s cubic-bezier(.2,.8,.25,1);
  position:relative;
}
/* rotação leve e determinística por índice: pilha de fotos numa mesa, não grade */
.polaroid:nth-child(3n+1){--giro:-1.4deg}
.polaroid:nth-child(3n+2){--giro:.9deg}
.polaroid:nth-child(3n){--giro:-.4deg}
.polaroid{transform:rotate(var(--giro,0deg))}
.polaroid:hover{transform:rotate(0deg) translateY(-3px)}
.polaroid.virada{transform:rotate(var(--giro,0deg)) rotateY(180deg)}

.polaroid .frente,.polaroid .verso{backface-visibility:hidden;-webkit-backface-visibility:hidden}
.polaroid .frente img{display:block;width:100%;aspect-ratio:1;object-fit:cover;
  background:oklch(0.85 0.01 85)}
.polaroid .assina{
  position:absolute;left:.9rem;right:.9rem;bottom:1.1rem;
  font-family:Kalam,'Chivo Mono',cursive;font-size:1.05rem;line-height:1.25;
  color:var(--papel-ink);text-align:center;
  overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
}
.polaroid .verso{
  position:absolute;inset:0;transform:rotateY(180deg);
  background:var(--papel);border-radius:var(--r);
  padding:1.4rem 1.2rem;display:flex;flex-direction:column;gap:.6rem;
  font-family:Kalam,cursive;color:var(--papel-ink);
  font-size:1.35rem;line-height:1.35;overflow:auto;
}
.polaroid .verso .quando{font-family:'Chivo Mono',monospace;font-size:.5625rem;
  letter-spacing:.14em;text-transform:uppercase;color:oklch(0.52 0.02 300)}

/* Confirmação de apagar: aparece só depois de segurar a foto. Sobreposta e
   escura para deixar claro que a foto está "em questão", e com um "não" do lado
   porque a ação é irreversível e o dedo erra. */
.polaroid .apagar{
  position:absolute;inset:0;z-index:2;border-radius:var(--r);
  background:color-mix(in oklch, oklch(0.13 0.02 350) 88%, transparent);
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:var(--sp-3);padding:var(--sp-4);
  opacity:0;pointer-events:none;transition:opacity .25s ease;
}
.polaroid.apagando .apagar{opacity:1;pointer-events:auto}
.polaroid.apagando{cursor:default}
.polaroid .apagar .acao{background:none}
.polaroid .apagar .acao:first-child{
  color:oklch(0.80 0.13 25);border-color:oklch(0.45 0.12 25);
}
.polaroid .apagar .acao:first-child:hover{background:oklch(0.32 0.10 25);color:var(--ink)}
.mural.compacto .apagar{gap:var(--sp-2);padding:var(--sp-2)}
.mural.compacto .apagar .acao{padding:.4rem .6rem;font-size:.625rem}

/* ----------------------------------------------------------- bilhetes --- */
.bilhetes{display:grid;gap:var(--sp-4);
  grid-template-columns:repeat(auto-fill,minmax(min(17rem,100%),1fr))}
.bilhete{background:var(--superf);border:1px solid var(--line);
  padding:var(--sp-4);border-radius:var(--r)}
.bilhete p{white-space:pre-wrap;overflow-wrap:anywhere}
.bilhete .quem{margin-top:var(--sp-3);display:flex;justify-content:space-between;gap:var(--sp-2)}

/* -------------------------------------------------------------- lista --- */
ul.desejos{list-style:none;border-top:1px solid var(--line)}
ul.desejos li{display:flex;align-items:flex-start;gap:var(--sp-3);
  padding:var(--sp-3) 0;border-bottom:1px solid var(--line)}
ul.desejos li.feito{color:var(--ink-faint)}
ul.desejos li.feito .texto{text-decoration:line-through}
ul.desejos .texto{flex:1;overflow-wrap:anywhere}
.caixa{appearance:none;width:1.05rem;height:1.05rem;flex:none;margin-top:.42rem;
  border:1px solid var(--linha-viva);border-radius:var(--r);cursor:pointer;
  background:none;display:grid;place-content:center}
.caixa:checked{border-color:var(--rosa)}
.caixa:checked::after{content:'';width:.5rem;height:.5rem;background:var(--rosa);border-radius:1px}

/* ------------------------------------------------------------- agenda --- */
/* O grid vive no UL e cada LI o herda por subgrid. Com o grid em cada LI, as
   colunas eram medidas por linha e a data parava num lugar diferente conforme o
   tamanho do título; assim todas as datas caem na mesma vertical. */
ul.agenda{list-style:none;border-top:1px solid var(--line);
  display:grid;grid-template-columns:1fr auto auto}
ul.agenda li{display:grid;grid-column:1 / -1;grid-template-columns:subgrid;
  gap:var(--sp-2) var(--sp-5);align-items:baseline;
  padding:var(--sp-4) 0;border-bottom:1px solid var(--line)}
@media(max-width:40rem){
  ul.agenda{grid-template-columns:1fr auto}
  ul.agenda .quando{grid-column:1 / -1;order:3}
}
ul.agenda .quando{font-family:'Chivo Mono',monospace;font-size:.75rem;
  color:var(--rosa);font-variant-numeric:tabular-nums;white-space:nowrap}
ul.agenda li.eh-destaque .titulo::before{content:'★ ';color:var(--ambar)}

/* ------------------------------------------------------------ controles --- */
form.linha{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin-bottom:var(--sp-6)}

input[type=text],input[type=date],input[type=password],textarea,select{
  font-family:inherit;font-size:1rem;color:var(--ink);
  background:var(--superf);border:1px solid var(--line);border-radius:var(--r);
  padding:.6rem .75rem;flex:1;min-width:0;
}
textarea{width:100%;resize:vertical;min-height:5rem;line-height:1.6}

/* Data é dado, não prosa: em serif de 16px o "dd/mm/aaaa" destoava de toda a
   linha e o campo esticava sobrando espaço morto antes do ícone. Em mono, menor
   e com a largura do próprio conteúdo. */
input[type=date]{
  font-family:'Chivo Mono',ui-monospace,monospace;
  font-size:.8125rem;letter-spacing:.04em;
  flex:0 0 auto;width:auto;min-width:9.5rem;
  color:var(--ink);
  /* O controle nativo reporta uma altura de conteúdo absurda (176px) quando é
     item de flex em coluna, porque nesse eixo o flex-basis vira a altura.
     min-height:0 é a parte que faltava: o padrão em flex item é min-height:auto,
     que impede encolher abaixo do conteúdo e fazia o height ser ignorado. */
  height:2.5625rem;min-height:0;padding-block:0;
}
input[type=date]:invalid{color:var(--ink-faint)}
input[type=date]::-webkit-calendar-picker-indicator{opacity:.55;cursor:pointer}
input[type=date]::-webkit-calendar-picker-indicator:hover{opacity:1}
input::placeholder,textarea::placeholder{color:var(--ink-faint)}
input:focus,textarea:focus,select:focus{border-color:var(--linha-viva);outline:none}

/* DEPOIS das regras base, de propósito: com a mesma especificidade, quem vem por
   último vence, e este bloco precisa sobrescrever o flex do input[type=date].
   Ele já esteve acima e não tinha efeito nenhum. */
@media(max-width:46rem){
  /* No celular três controles numa linha espremem o campo de texto até cortar o
     placeholder. Empilhados, cada um tem a largura inteira. */
  form.linha{flex-direction:column;align-items:stretch}
  form.linha > *:not(input[type=date]){width:100%}
  /* flex-basis, e não height: em coluna o basis É a altura e vence o height. Com
     basis auto ele resolvia para os 176px que o controle nativo pede como altura
     de conteúdo, e nem height com !important tinha efeito. Data também não
     precisa de linha inteira, então sai do esticamento. */
  input[type=date]{align-self:flex-start;width:auto;flex:0 0 2.5625rem}
  .campo-arquivo{justify-content:space-between}
  .campo-arquivo label{flex:1}
  #escolhidas{max-width:50%;text-align:right}
}

/* .acao, não button.acao: os links "fonte" e "backup" são <a> e ficavam sem
   estilo nenhum, aparecendo em serif no meio de uma barra monoespaçada. */
.acao{
  font-family:'Chivo Mono',ui-monospace,monospace;font-size:.6875rem;letter-spacing:.12em;
  text-transform:uppercase;cursor:pointer;border-radius:var(--r);
  padding:.6rem 1rem;background:none;color:var(--rosa);
  border:1px solid var(--linha-viva);transition:background .2s,color .2s;
  display:inline-block;text-align:center;text-decoration:none;line-height:1.2;
}
.acao:hover{background:var(--rosa-fraco);color:var(--ink)}
.acao:disabled{opacity:.45;cursor:progress}
.discreto{border-color:transparent;color:var(--ink-faint);padding:.35rem .5rem}
.discreto:hover{background:none;color:var(--rosa)}

/* Seletor de arquivo. O controle nativo desenha botão e texto próprios, em fonte
   do sistema, e destoa de tudo em volta. O input fica escondido mas AINDA
   FOCÁVEL — nada de display:none, que o tiraria da navegação por teclado — e o
   label faz o papel do botão, herdando .acao como qualquer outro. */
.campo-arquivo{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.campo-arquivo input[type=file]{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;
  overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0;
}
.campo-arquivo label{margin:0}
.campo-arquivo input[type=file]:focus-visible + label{
  outline:2px solid var(--rosa);outline-offset:3px;
}
.campo-arquivo input[type=file]:hover + label{background:var(--rosa-fraco);color:var(--ink)}
#escolhidas{max-width:14rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#escolhidas[data-tem]{color:var(--rosa)}

.aviso{border:1px solid var(--linha-viva);background:var(--superf);
  padding:var(--sp-3) var(--sp-4);border-radius:var(--r);margin-bottom:var(--sp-4);
  color:var(--ink-dim);font-size:.9375rem}
.aviso.ruim{border-color:oklch(0.50 0.14 25);color:oklch(0.82 0.10 25)}

/* ------------------------------------------------------------- entrada --- */
body.entrada{display:grid;place-content:center;min-height:100svh;text-align:left}
.porta{width:min(24rem,calc(100vw - 2*var(--borda)))}
.porta pre{color:var(--rosa);font-family:'Chivo Mono',monospace;
  font-size:.55rem;line-height:1.02;margin-bottom:var(--sp-6)}
.porta .quem{display:flex;gap:var(--sp-2);margin-block:var(--sp-3)}
.porta .quem button{flex:1}
.porta .quem button[aria-pressed="true"]{background:var(--rosa-fraco);color:var(--ink)}

@media(prefers-reduced-motion:reduce){
  *{animation-duration:.01ms!important;transition-duration:.01ms!important}
}
