/*
 * Base CSS do PetCare Pro.
 *
 * Regras que precisam existir ANTES do Tailwind aplicar as utilities, e que nao
 * dependem do bundle do Tailwind estar carregado. Manter curto: composicao
 * visual e responsabilidade das utilities.
 */

/* Alpine: esconde o elemento ate o componente inicializar, evitando o flash de
   dropdowns e overlays abertos no primeiro paint. */
[x-cloak] {
    display: none !important;
}

/* Fallback tipografico enquanto o bundle do Tailwind ainda nao aplicou
   font-sans. Sem isto a primeira pintura usa a serifada do user agent e o
   layout "pula" quando o Tailwind entra. */
body {
    font-family: Inter, system-ui, -apple-system, 'Segoe UI', sans-serif;
}

/* Alvo de foco visivel em qualquer elemento que receba foco programatico
   (ex.: o resumo de erros de formulario). WCAG 2.2 AA 2.4.7. */
[tabindex='-1']:focus {
    outline: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
   GAVETA DO PAINEL DA CRECHE — `#menu-da-creche`
   ═══════════════════════════════════════════════════════════════════════════

   POR QUE O ESTADO FECHADO MORA AQUI, E NAO NUMA CLASSE DO ALPINE
   ---------------------------------------------------------------
   Uma regra `:class` do Alpine so existe depois que o Alpine hidrata. Entre o
   primeiro paint e a hidratacao, a gaveta fica sem transform -- ou seja,
   ABERTA, cobrindo o conteudo. Com uma transicao declarada, o usuario ve a
   gaveta DESLIZAR PARA FORA a cada carregamento: uma animacao de 200ms fechando
   um menu que ele nao abriu.

   Este arquivo e um `<link rel=stylesheet>` no `<head>`: ele esta aplicado
   antes do primeiro pixel. A gaveta nasce fora da tela e o Alpine so precisa
   dizer quando ABRIR, via `data-aberta`.

   O corte e 1024px para casar com o `lg:` do Tailwind, que e onde a lateral
   deixa de ser gaveta e passa a ser permanente.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (max-width: 1023.98px) {
    #menu-da-creche {
        transform: translateX(-100%);
        transition: transform 0.2s ease-out;
    }

    #menu-da-creche[data-aberta='true'] {
        transform: translateX(0);
    }
}

/* Acima de 1024px a lateral e permanente: nenhum transform, e nenhuma
   transicao -- redimensionar a janela nao deve produzir um menu deslizando. */
@media (min-width: 1024px) {
    #menu-da-creche {
        transform: none;
    }
}

/* WCAG 2.2 AA 2.3.3. Quem pede menos movimento no sistema operacional recebe a
   gaveta aparecendo direto, sem deslizar. O estado final e identico -- so o
   caminho ate ele desaparece. */
@media (prefers-reduced-motion: reduce) {
    #menu-da-creche {
        transition: none;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   GAVETA DO PORTAL DO TUTOR — `#menu-do-tutor`
   ═══════════════════════════════════════════════════════════════════════════

   MESMA REGRA DA GAVETA DA CRECHE, OUTRO CORTE
   --------------------------------------------
   O estado fechado mora aqui pelo motivo ja escrito acima: uma regra `:class`
   do Alpine so existe depois da hidratacao, e ate la a gaveta nasceria ABERTA
   e deslizaria para fora a cada carregamento. Este arquivo e `<link>` no
   `<head>` e ja esta aplicado no primeiro pixel.

   O CORTE E 640px (`sm:`), E NAO 1024px (`lg:`) COMO NO PAINEL
   ------------------------------------------------------------
   Nao e inconsistencia -- e a mesma regra sobre dois menus de tamanhos
   diferentes. A lateral do painel tem mais de vinte itens em quatro grupos e
   so cabe a partir de 1024px. A barra de topo do portal tem cinco links e cabe
   folgada em 640px, que e o corte que o proprio portal ja usava (`sm:flex`).
   Abaixar o corte do portal para 1024px substituiria uma barra de topo que
   funciona por uma gaveta que ninguem pediu, em tablet.

   O que os dois compartilham e a REGRA -- abaixo do corte, barra inferior fixa
   mais gaveta, com o fechado em CSS --, e nao o numero.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (max-width: 639.98px) {
    #menu-do-tutor {
        transform: translateX(100%);
        transition: transform 0.2s ease-out;
    }

    #menu-do-tutor[data-aberta='true'] {
        transform: translateX(0);
    }
}

/* Acima de 640px a gaveta do portal nao existe como interface -- a barra de
   topo horizontal e permanente. Ela continua no DOM e continua fora da tela:
   um menu que reaparecesse ao girar o tablet duplicaria a navegacao. */
@media (min-width: 640px) {
    #menu-do-tutor {
        transform: translateX(100%);
    }
}

@media (prefers-reduced-motion: reduce) {
    #menu-do-tutor {
        transition: none;
    }
}

/* O rodape do portal reserva a altura da barra inferior -- e SO enquanto ela
   existe. Na primeira versao isto era um `style=` inline no template, e como
   atributo inline nao aceita media query o espaco sobrava tambem em tablet e
   desktop: uma faixa de ~72px de branco morto abaixo do rodape, em toda tela,
   reservada para uma barra que ali nao existe. Migrou para ca justamente para
   poder desaparecer acima de 640px. */
#rodape-do-portal {
    padding-bottom: calc(4.5rem + env(safe-area-inset-bottom));
}

@media (min-width: 640px) {
    #rodape-do-portal {
        padding-bottom: 0;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
   CAMPOS DO PAINEL DA CRECHE — `.form-creche`
   ═══════════════════════════════════════════════════════════════════════════

   POR QUE ISTO E CSS, E NAO CLASSE NO TEMPLATE
   --------------------------------------------
   As 152 declaracoes de widget do painel vivem em `dashboard/forms.py` como
   `'class': 'w-full px-4 py-2 border border-gray-300 rounded-lg
   focus:ring-2 focus:ring-primary-500'`. O template escreve `{{ form.campo }}`
   e recebe a string pronta: nao ha ponto de interceptacao no lado do template.

   Dois problemas concretos nessa string, e nenhum e estetico:

     * `py-2` produz controle de ~38px. O minimo de alvo de toque da WCAG 2.2
       AA (2.5.8) e 24px, mas o que este produto precisa e o de balcao: dedo,
       de pe, com o pet puxando a coleira. 44px e o piso adotado aqui.
     * `focus:ring-primary-500` desenha o anel em #0ea5e9, que da 1.6:1 contra
       o branco do campo. Um anel de foco que nao se ve nao e anel de foco --
       e o teclado e a unica forma de operar a tela para parte dos usuarios.

   COMO A SOBREPOSICAO FUNCIONA
   ----------------------------
   O bundle Play do Tailwind injeta as utilities num `<style>` no fim do
   `<head>`, depois deste arquivo. Em empate de especificidade quem vem depois
   vence, entao `.py-2` ganharia de `.campo`. Por isso os seletores abaixo sao
   `.form-creche <elemento>` (0,1,1) e nao `.classe` (0,1,0): ganham das
   utilities sem `!important`, que apagaria tambem os ajustes pontuais que um
   template precise fazer.

   O escopo e o `<form class="form-creche">`. Nada fora dele muda -- a landing
   e o console seguem intactos.

   ───────────────────────────────────────────────────────────────────────────
   A EXCLUSAO DO PORTAL DO TUTOR ESTA REVOGADA — e o motivo dela deixar de
   valer esta escrito aqui, no lugar onde ela foi tomada.
   ───────────────────────────────────────────────────────────────────────────
   Ate esta versao, o paragrafo acima dizia "o portal do tutor (...) segue
   intacto", e a exclusao era deliberada: o bloco nasceu para consertar o
   balcao, e mexer no portal no mesmo commit teria misturado dois publicos.

   O QUE MUDOU: o portal nao e uma tela secundaria do produto -- ele e a cara do
   negocio do ASSINANTE no aparelho do cliente dele. Quem o abre nao e a equipe
   treinada, com tablet de trabalho e alguem ao lado para perguntar; e o tutor,
   no celular dele, uma vez por semana, sem suporte. Um campo de 38px e um anel
   de foco de 1,6:1 sao piores ali do que no balcao, nao melhores -- e a
   conclusao inversa era o que a exclusao estava sustentando na pratica.

   Concretamente, o portal chegou a 2026-08 com:
     * `hidden sm:flex` nos DOIS unicos blocos de navegacao, ou seja, nenhuma
       navegacao abaixo de 640px -- e portanto nenhum caminho para sair da
       conta em qualquer iPhone;
     * `text-gray-400` (#9ca3af, 2,54:1 sobre branco) como a cor de TODA data e
       hora;
     * campos de login em `py-2`, com rotulo apenas `sr-only`.

   Nada disso era mais barato de consertar no portal do que no painel. So nao
   tinha sido olhado.

   O CUSTO DE APLICAR AQUI E ZERO: os formularios do portal renderizam widgets
   de `clients/forms.py` com a mesma string de classe do painel, entao basta o
   `<form>` declarar `form-creche` e os mesmos 44px, os mesmos 16px de fonte
   (que travam o zoom do Safari no iOS) e o mesmo anel de foco passam a valer.
   Reusar aqui e mais barato do que escrever um segundo conjunto de regras --
   e um segundo conjunto e como as duas telas divergiriam de novo.

   DIVERGENCIA REGISTRADA: o certo e as classes sairem de `forms.py`. Enquanto
   estiverem la, este bloco e o unico lugar de onde da para corrigir contraste
   e alvo de toque sem tocar em Python.
   ═══════════════════════════════════════════════════════════════════════════ */

:root {
    /* Espelham `static/js/tailwind-tokens.js`. Sao tres, e so tres, porque
       toda cor que da para aplicar por utility E aplicada por utility -- estas
       nao dao, porque o elemento e gerado pelo Django com classe propria.
       Ao mexer no arquivo de tokens, conferir estas. */
    --creche-linha: #cdd5e0;  /* line.strong */
    --creche-acao: #0284c7;   /* acao.DEFAULT -- 3.1:1 contra branco (1.4.11) */
    --creche-risco: #b4231f;  /* risk.DEFAULT */
}

.form-creche input:not([type='checkbox']):not([type='radio']):not([type='hidden']),
.form-creche select,
.form-creche textarea {
    width: 100%;
    min-height: 2.75rem; /* 44px */
    padding: 0.625rem 0.75rem;
    /* 16px trava o zoom automatico do Safari no iOS ao focar o campo. Abaixo
       disso o iPad "pula" para dentro do campo e a equipe perde o contexto da
       tela no meio do check-in. */
    font-size: 1rem;
    line-height: 1.4;
    color: #0e1524;
    background-color: #fff;
    border: 1px solid var(--creche-linha);
    border-radius: 0.625rem;
    /* Impede que o Safari desenhe o proprio relevo em <select> e date. */
    -webkit-appearance: none;
    appearance: none;
}

/* `textarea` cresce; `select` precisa da seta de volta, ja que `appearance`
   foi zerada acima. A seta e um data URI inline -- nenhuma requisicao. */
.form-creche textarea {
    min-height: 6.5rem;
    resize: vertical;
}

.form-creche select {
    padding-right: 2.25rem;
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235f6a7c' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 0.75rem center;
    background-size: 1.125rem;
}

.form-creche input:focus,
.form-creche select:focus,
.form-creche textarea:focus {
    outline: 2px solid var(--creche-acao);
    outline-offset: 1px;
    border-color: var(--creche-acao);
}

/* Caixas de marcar: o alvo real e o `<label>` que as envolve no template, mas
   a caixa em si tambem cresce -- 16px de quadrado e dificil de acertar com o
   dedo, e e o tamanho que `w-4 h-4` do widget entrega. */
.form-creche input[type='checkbox'],
.form-creche input[type='radio'] {
    width: 1.25rem;
    height: 1.25rem;
    accent-color: var(--creche-acao);
    flex: none;
}

.form-creche input[type='checkbox']:focus-visible,
.form-creche input[type='radio']:focus-visible {
    outline: 2px solid var(--creche-acao);
    outline-offset: 2px;
}

/* Campo de arquivo: e a FOTO do check-in, obrigatoria, tirada na hora com o
   tablet. O controle nativo do Django e um `<input type=file>` cru, com um
   botao de ~24px que e o alvo mais dificil de toda a tela. Aqui o botao vira
   uma faixa alta e clicavel. */
.form-creche input[type='file'] {
    padding: 0.5rem;
    min-height: 3.25rem;
    line-height: 2;
}

.form-creche input[type='file']::file-selector-button {
    min-height: 2.5rem;
    margin-right: 0.75rem;
    padding: 0 1rem;
    font: inherit;
    font-weight: 600;
    color: #fff;
    background-color: #0369a1; /* acao.strong -- 5.93:1 com texto branco */
    border: 0;
    border-radius: 0.5rem;
    cursor: pointer;
}

/* Campo recusado pela validacao. O template ja marca `aria-invalid`, entao a
   cor e reforco e nao a unica pista -- 1.4.1 (Uso de Cor). */
.form-creche [aria-invalid='true'] {
    border-color: var(--creche-risco);
}

/* ───────────────────────────────────────────────────────────────────────────
   BARRA DE ACAO GRUDADA — `.barra-acao`
   ───────────────────────────────────────────────────────────────────────────
   O formulario de check-out tem dez campos. Num tablet em retrato isso e mais
   de uma tela e meia, e o botao "Confirmar Check-out" ficava embaixo de tudo:
   preencher exigia rolar ate o fim, e conferir o que foi preenchido exigia
   rolar de volta e perder o botao de vista. Com a barra grudada, confirmar e
   sempre um toque, de qualquer altura do formulario.

   O `bottom` NAO e zero abaixo de 1024px: a barra inferior de navegacao
   (58px + area segura) e `fixed` ali, e uma barra grudada em zero nasceria
   por baixo dela -- o botao mais importante do formulario coberto pelo menu.

   Acima de 1024px a barra inferior nao existe e nem a necessidade: o
   formulario cabe na tela. Ela volta a ser um bloco normal no fim do
   formulario, sem sombra nem borda superior.
   ─────────────────────────────────────────────────────────────────────────── */
.barra-acao {
    position: sticky;
    bottom: calc(3.625rem + env(safe-area-inset-bottom));
    z-index: 20;
    margin: 0 -0.875rem -0.5rem;
    padding: 0.75rem 0.875rem calc(0.75rem + env(safe-area-inset-bottom));
    background-color: rgba(255, 255, 255, 0.95);
    backdrop-filter: blur(6px);
    border-top: 1px solid #e3e8ef; /* line.DEFAULT */
}

@media (min-width: 1024px) {
    .barra-acao {
        position: static;
        margin: 0;
        padding: 1rem 0 0;
        background-color: transparent;
        backdrop-filter: none;
    }
}
