/* ============================================================================
   GestAI — tema no caminho do WEBSITE (T0??, onda 4).
   Aplicado via `web_include_css` (par de `app_include_css`, que só alcança
   `/app/*`). A tela de login vem por este caminho — é por isso que ela hoje
   é branca com botão preto mesmo com o Desk já temado.

   Este arquivo é INTENCIONALMENTE um subconjunto de `gestai_desk.css`, não
   um include dele. Contém só o que é TOKEN DE TEMA (cor, tipografia, raio,
   sombra) — nada que seja COMPONENTE DO DESK. Testado servindo o arquivo
   inteiro de `gestai_desk.css` como `web_include_css` primeiro: três regras
   de lá pressupõem elemento que não existe no HTML do login e por isso não
   pertencem aqui —
     - `.navbar` (borda de marca): a página de login roda com
       `context.no_header = True` (frappe/www/login.py), então nem chega a
       renderizar navbar — mas OUTRAS páginas do caminho de website (portal
       do paciente, `book_appointment`) têm navbar e RECEBERIAM a borda se
       esta regra estivesse aqui, sem ter sido pedido para elas;
     - `.list-row`/`.list-row-head` (densidade de lista do Desk) — não
       existem fora de `/app`;
     - `.gestai-clinica-ativa*` e o diálogo de horários do Marley (seção 7 de
       `gestai_desk.css`) — não fazem sentido sem sessão autenticada.
   Em vez de duplicar `gestai_desk.css` inteiro e aceitar esse vazamento, as
   seções abaixo são as MESMAS de lá (mesmo texto, mesma fonte), só que
   listadas aqui de novo — ver o docstring de `_asset()` em hooks.py sobre
   por que os dois arquivos não podem ser um só sem tocar `app_include_css`,
   que é hook do lead.
   ========================================================================== */

/* -----------------------------------------------------------------------
   1. Manrope (títulos) — mesma fonte de gestai_desk.css §1. O `<h4>` do
      login ("Entrar no GestAI") é `h4` puro, então a regra de tipografia
      da seção 5 já alcança sem seletor extra.
   ----------------------------------------------------------------------- */
@font-face {
  font-family: "Manrope";
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url("/assets/gestai/fonts/Manrope/ManropeVariable.woff2") format("woff2");
}

/* -----------------------------------------------------------------------
   2. Tokens do GestAI Hub Design System — idêntico a gestai_desk.css §2.
   ----------------------------------------------------------------------- */
:root {
  /* Azuis da assinatura (docs/specs/tela-de-login, C-01, 10/09/2026): #0076ba e' a ponta
     escura do gradiente que gestai_portal.css ja usava -- o #007dc4 puro do logo mede
     4,44:1 sobre branco e reprova por pouco em texto. #00afec so' em preenchimento (2,52:1). */
  --gh-brand-9: #0076ba;
  --gh-brand-10: #00659f;
  --gh-brand-8: #00afec;
  --gh-brand-2: #e6f6fd;
  --gh-brand-3: #cdeefb;
  --gh-slate-12: #0f172a;
  --gh-slate-11: #475569;
  --gh-slate-9: #64748b;
  --gh-slate-6: #d6dee8;
  --gh-slate-7: #c6d0dd;
  --gh-font-heading: "Manrope", "InterVariable", "Inter", -apple-system, BlinkMacSystemFont,
    "Segoe UI", sans-serif;
}

/* -----------------------------------------------------------------------
   3. Ponte para `--primary`/`--btn-primary` — idêntico a gestai_desk.css
      §3 NA REGRA, com uma diferença medida e necessária: `!important`.

      No Desk, `app_include_css` é o ÚLTIMO `<link>` do `<head>` (depois do
      `desk.bundle.css`), então a ordem de cascata já bastava. No caminho de
      website é o INVERSO: `web_include_css` é injetado ANTES do bundle da
      própria página (aqui, `login.bundle.css`) — medido no HTML servido,
      `<link ... gestai_login.css>` vem antes de `<link ... login.bundle.css>`.
      E `login.bundle.css` redeclara ESTAS MESMAS variáveis no MESMO seletor
      `:root` (`--btn-primary: var(--gray-900)`, frappe/public/scss/
      login.bundle.scss compilado) sem `!important` nenhum — então, por
      empate de especificidade, quem vem depois no arquivo ganha, e o botão
      "Entrar" continua preto. `!important` aqui não é gambiarra: é o que
      faz um token de tema declarado ANTES vencer um token de tema
      redeclarado DEPOIS, no único ponto de inversão de ordem que este
      caminho tem.
   ----------------------------------------------------------------------- */
:root,
[data-theme="light"] {
  --btn-primary: var(--gh-brand-9) !important;
  --primary: var(--gh-brand-9) !important;
}
[data-theme="dark"] {
  --btn-primary: var(--gh-brand-9) !important;
  --primary: var(--gh-brand-9) !important;
}
[data-theme="dark"] .btn.btn-primary {
  color: #fff;
}

/* -----------------------------------------------------------------------
   5. Tipografia de título — idêntico a gestai_desk.css §5. `.page-card-head
      h4` do login é `h4` puro; entra pelo seletor genérico.
   ----------------------------------------------------------------------- */
h1,
h2,
h3,
h4,
h5,
h6,
.page-title .title-text,
.modal-title,
.section-head {
  font-family: var(--gh-font-heading);
}

/* -----------------------------------------------------------------------
   8. Tema de superfície — idêntico a gestai_desk.css §8, com a MESMA
      guarda de dark mode. `--card-bg` resolve para `--fg-color` (branco)
      nos dois temas, e o `.page-card` do login já usa essa variável — o
      contraste cartão/fundo que a seção 8 cria no Desk aparece aqui de
      graça, sem seletor novo.

      `!important` pelo MESMO motivo da seção 3: medido que `login.bundle.css`
      redeclara `--bg-color`, `--border-radius*`, `--card-shadow` e
      `--text-base` no `:root`, depois deste arquivo no `<head>`. Sem
      `!important` aqui, a tela de login fica exatamente como estava —
      fundo branco, raio de 8px, sombra fraca — e nenhuma das evidências
      seria visível no "depois".
   ----------------------------------------------------------------------- */
:root:not([data-theme="dark"]) {
	--bg-color: #f4f7fc !important;
	--border-radius-sm: 10px !important;
	--border-radius: 10px !important;
	--border-radius-md: 12px !important;
	--border-radius-lg: 14px !important;
	--border-radius-xl: 18px !important;
	--card-shadow: 0px 2px 8px rgba(15, 23, 42, 0.08) !important;
	--modal-shadow: 0px 16px 40px rgba(15, 23, 42, 0.18) !important;
	--btn-shadow: 0px 1px 2px rgba(15, 23, 42, 0.06) !important;
	--text-base: 15px !important;
}

/* -----------------------------------------------------------------------
   9. Logo do Frappe/ERPNext, temporário — enquanto `Website Settings.app_logo`
      estiver vazio, `get_app_logo()` (frappe/core/doctype/navbar_settings/
      navbar_settings.py) cai no hook `app_logo_url` de outro app e a tela
      mostra a marca do ERPNext (medido: `/assets/erpnext/images/
      erpnext-logo.svg`, não a do Frappe — são dois apps com esse hook, e
      `get_app_logo` pega o ÚLTIMO quando há exatamente dois).

      `login.html` (frappe/www/login.html:62) renderiza `<img class="app-logo"
      src="{{ logo }}">` incondicionalmente — não há campo vazio que o
      esconda por conta própria. A regra abaixo mira o CAMINHO do arquivo
      (não a classe): ela só apaga a marca de outro produto enquanto o `src`
      apontar para um dos dois SVGs padrão do framework. No dia em que o
      Leonardo definir `Website Settings.app_logo`, o `src` passa a apontar
      para `/files/...` (ou para `/assets/gestai/...`, se vier por fixture de
      File) e esta regra some da seleção sozinha — SEM precisar editar este
      arquivo. Documentado aqui, e não decidido por CSS de verdade: o
      mecanismo certo (Website Settings.app_logo) é o da seção 3 do relatório
      da frente; isto é só o estado neutro enquanto ele não existe.
   ----------------------------------------------------------------------- */
img.app-logo[src="/assets/erpnext/images/erpnext-logo.svg"],
img.app-logo[src="/assets/frappe/images/frappe-framework-logo.svg"] {
	display: none;
}

/* -----------------------------------------------------------------------
   10. Título "Entrar no GestAI" escondido -- decisão do Leonardo em 21/08:
   a assinatura já faz o trabalho, o texto abaixo dela é redundante.

   NÃO remove a tradução do CSV (continua servindo o `alt`/qualquer lugar
   que precise do texto) nem toca em `login.html`. `logo_section()`
   (frappe/www/login.html:57) é usada por CINCO seções, e só DUAS caem no
   `else` sem título explícito -- `for-login` (:78) e `for-email-login`
   (:145); as outras três (`for-signup`, `for-forgot`,
   `for-login-with-email-link`) passam um título PRÓPRIO ("Create a {0}
   Account", "Forgot Password", "Login with Email Link") que não pode
   desaparecer. Por isso o seletor é por SEÇÃO, nunca `.page-card-head h4`
   solto -- um seletor largo apagaria o título de recuperação de senha
   também, e essa tela ficaria sem dizer o que é.
   ----------------------------------------------------------------------- */
.for-login .page-card-head h4,
.for-email-login .page-card-head h4 {
	display: none;
}

/* -----------------------------------------------------------------------
   11. Navbar e rodapé do WEBSITE escondidos nas telas de ENTRADA -- decisão
   do Leonardo em 21/08 para o login ("Início", a home pública, não faz
   sentido pra quem ainda não entrou) e em 11/09 para a tela de nova senha,
   que ganhou de brinde o rodapé de newsletter e o "Powered by ERPNext" do
   caminho de site.

   `frappe/templates/includes/navbar/navbar.html:9` renderiza
   `(frappe.get_hooks("brand_html") or [_("Home")])[0]` -- é essa a origem
   do "Início" (tradução nativa de "Home"), não string nossa.

   Escopo por `body.gestai-entrada`, não `web_include_css` desligado nem
   regra larga: as duas telas declaram `{% set body_class = "gestai-entrada" %}`
   e `frappe/templates/base.html:56` põe o valor no `<body>`. De propósito não
   é `.navbar { display: none }` sem escopo -- hoje só estas duas páginas de
   site são nossas, mas amanhã pode haver outra (book_appointment, por
   exemplo), e uma regra larga desligaria a navbar ali também, silenciosa até
   alguém notar em produção.

   **Por que a classe, e não `body[data-path="login"]`, que era o escopo até
   11/09/2026:** as duas telas dividem a MESMA casca (§12). A alternativa era
   repetir o caminho de cada rota em cada um dos 73 seletores, ou duplicar a
   seção -- e duas cópias das mesmas regras divergem. A especificidade não
   mudou: `body[data-path="login"]` e `body.gestai-entrada` são as duas
   (0,1,1), um tipo mais um atributo ou uma classe, então a briga com o
   `login.bundle.css` (§3) continua idêntica. Medido no navegador antes e
   depois: rótulo 13/500 com 18 px, campos e botão em 44 px, "Esqueceu a
   senha?" na linha do rótulo, em 1440 e em 390.
   ----------------------------------------------------------------------- */
body.gestai-entrada .navbar {
	display: none;
}

/* O rodapé do caminho de site -- inscrição de newsletter e "Powered by
   ERPNext" -- vem de `Website Settings` (`hide_footer_signup = 0`,
   `footer_powered` vazio) e aparece em QUALQUER página de site. Medido em
   11/09: 185 px de rodapé embaixo de um formulário de senha. Escondido aqui,
   e não na fixture, porque a fixture vale para as outras páginas do portal e
   mexer nela é uma frente própria. O login já não o mostrava, por outro
   caminho (`show_footer_on_login = 0`).

   O seletor mira `footer.web-footer` (`frappe/templates/includes/footer/footer.html:1`) e o
   `.page-footer` que o envolve -- NUNCA `footer` sozinho: o rodapé "© GestAI"
   das nossas duas telas também é um `<footer>`, e a primeira versão desta
   regra o apagou junto. Medido: a coluna do formulário subiu 19 px em 1440
   quando ele sumiu do grid. */
body.gestai-entrada .page-footer,
body.gestai-entrada footer.web-footer {
	display: none;
}

/* -----------------------------------------------------------------------
   12. A CASCA DAS TELAS DE ENTRADA em duas metades -- docs/specs/tela-de-login
   e docs/specs/tela-de-nova-senha.

   Duas paginas usam este bloco, as duas nossas em `gestai/www/` (o Frappe
   resolve pagina por app, o ultimo instalado vence): `login.html`, onde o
   `login.js` do Frappe continua inteiro e amarra os seletores da secao 4 do
   plano do login, e `update-password.html`, cujo JS e' nosso. O que este
   bloco faz e' so' aparencia, e as classes seguem chamando `gestai-login-*`
   de proposito: renomear 73 seletores para `gestai-entrada-*` seria um diff
   grande em CSS que ja' esta em producao, sem ganho para quem le.

   TUDO sob `body.gestai-entrada`: este arquivo entra por `web_include_css`
   em toda pagina do caminho de site (portal do paciente, selecionar-clinica),
   e nada daqui pode alcancar essas paginas. O prefixo tambem da a
   especificidade que vence `login.bundle.css`, que carrega DEPOIS (ver §3) --
   por isso estas regras de componente dispensam `!important`.

   Onde o erro de senha aparece, medido em login.js:184-196: no TEXTO do botao
   primario visivel (`login.set_status`). Por isso o botao tem `min-height`, e
   nao `height`, e pode quebrar linha.
   ----------------------------------------------------------------------- */

/* o wrapper do web.html: some o cromo de pagina de site */
body.gestai-entrada {
	background: #fff;
}
body.gestai-entrada .page-breadcrumbs,
body.gestai-entrada .page-header-wrapper,
body.gestai-entrada .page-footer,
body.gestai-entrada .web-footer {
	display: none;
}
body.gestai-entrada .page-content-wrapper,
body.gestai-entrada main,
body.gestai-entrada .page_content {
	padding: 0;
	margin: 0;
	max-width: none;
}

/* as duas metades */
body.gestai-entrada .gestai-login {
	display: grid;
	grid-template-columns: 52fr 48fr;
	grid-template-rows: 1fr auto;
	min-height: 100vh;
	font-family: "InterVariable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
	color: var(--gh-slate-12);
}

/* --- metade esquerda: frase e ilustracao --- */
body.gestai-entrada .gestai-login-marca {
	background: linear-gradient(160deg, var(--gh-brand-2) 0%, #f3fafe 60%, #ffffff 100%);
	padding: 56px 48px 40px;
	display: flex;
	flex-direction: column;
	justify-content: space-between;
	overflow: hidden;
}
/* So' existe em <=600px, quando a ilustracao sobe para o topo -- ver a media
   query no fim desta secao. Em duas metades o logo vive no cabecalho do
   formulario, a direita. */
body.gestai-entrada .gestai-login-marca-logo {
	display: none;
}
body.gestai-entrada .gestai-login-frase {
	padding-left: 16px;
}
body.gestai-entrada .gestai-login-frase-titulo {
	font-family: var(--gh-font-heading);
	font-size: 30px;
	font-weight: 800;
	line-height: 1.2;
	letter-spacing: -0.01em;
	color: var(--gh-slate-12);
	max-width: 15ch;
	margin: 0;
}
body.gestai-entrada .gestai-login-frase-apoio {
	font-size: 15px;
	line-height: 1.6;
	color: var(--gh-slate-11);
	max-width: 42ch;
	margin: 12px 0 0;
}
body.gestai-entrada .gestai-login-ilustracao {
	flex: 1;
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 24px 0 0;
}
body.gestai-entrada .gestai-login-ilustracao img {
	width: 100%;
	max-width: 600px;
	height: auto;
	display: block;
}

/* --- metade direita: o formulario --- */
body.gestai-entrada .gestai-login-marca {
	grid-row: 1 / span 2;
}
body.gestai-entrada .gestai-login-formulario {
	display: flex;
	flex-direction: column;
	justify-content: center;
	align-items: center;
	padding: 48px 40px 24px;
	background: #fff;
}
body.gestai-entrada .gestai-login-coluna {
	width: 100%;
	max-width: 360px;
}

/* a assinatura: alinhada a esquerda, 40px, sem o cartao de cabecalho do Frappe */
body.gestai-entrada .page-card-head {
	text-align: left;
	margin: 0;
	padding: 0;
}
body.gestai-entrada .page-card-head img.app-logo + h4 {
	margin-top: 32px;
}
body.gestai-entrada .page-card-head img.app-logo {
	height: 40px;
	width: auto;
	max-height: none;
	margin: 0 0 32px;
	display: block;
}
/* Titulos: na secao de entrar, o h4 do Frappe fica escondido pela §10 e o
   titulo e' o nosso `.gestai-login-titulo`. Nas outras secoes (redefinir
   senha, link de e-mail, cadastro) o h4 do Frappe E' o titulo -- o template
   passa o texto certo para `logo_section()` -- e recebe a mesma tipografia.
   Nenhum `.page-card-head h4` sem prefixo de secao: `test_tela_login.py`
   guarda isso, e com razao. */
body.gestai-entrada .gestai-login-titulo,
body.gestai-entrada .for-forgot .page-card-head h4,
body.gestai-entrada .for-login-with-email-link .page-card-head h4,
body.gestai-entrada .for-signup .page-card-head h4 {
	font-family: var(--gh-font-heading);
	font-size: 24px;
	font-weight: 700;
	line-height: 1.25;
	color: var(--gh-slate-12);
	margin: 0;
}
body.gestai-entrada .gestai-login-apoio {
	font-size: 14px;
	line-height: 1.6;
	color: var(--gh-slate-11);
	margin: 6px 0 28px;
}
/* A saida da secao vem antes do titulo (dentro do `page-card-head`), alinhada
   a esquerda como o resto da coluna. Ela carrega o espaco que era do
   `img.app-logo + h4`: 32 px depois do logo, 20 px antes do titulo -- com o
   link no meio, aquele seletor de irmao adjacente deixa de casar. */
body.gestai-entrada .page-card-head .gestai-login-voltar {
	margin: 32px 0 20px;
	font-size: 13px;
	text-align: left;
}
body.gestai-entrada .gestai-login-voltar a {
	color: var(--gh-slate-11);
	text-decoration: none;
}
body.gestai-entrada .gestai-login-voltar a:hover {
	color: var(--gh-brand-9);
}

/* o cartao do Frappe vira superficie plana: a metade direita ja e' o cartao */
body.gestai-entrada .login-content.page-card {
	width: 100%;
	max-width: none;
	margin: 0;
	padding: 0;
	border: 0;
	box-shadow: none;
	background: transparent;
	border-radius: 0;
}
body.gestai-entrada .login-content.page-card .page-card-body {
	padding: 0;
}
body.gestai-entrada .login-content.page-card .form-signin {
	max-width: none;
	width: 100%;
	margin: 0;
}
body.gestai-entrada .form-group {
	margin: 0 0 20px;
}

/* Rotulo visivel (o do Frappe e' sr-only) e a linha rotulo + "Esqueceu a senha?".

   Especificidade medida no navegador (10/09): `login.bundle.css` estiliza rotulo,
   campo e link com `.for-login .page-card .page-card-body .form-label` -- QUATRO
   classes. Um `body.gestai-entrada .form-label` (duas) perde mesmo vindo
   escopado, e a tela fica com o rotulo em 15px/regular sem erro nenhum. Por isso
   as regras de dentro do cartao repetem `.login-content.page-card .page-card-body`
   (cinco classes) -- e' o minimo que vence sem `!important`. */
body.gestai-entrada .login-content.page-card .page-card-body .form-label {
	display: block;
	font-size: 13px;
	font-weight: 500;
	line-height: 1.4;
	color: var(--gh-slate-12);
	margin: 0 0 6px;
}
body.gestai-entrada .gestai-login-rotulo {
	display: flex;
	justify-content: space-between;
	align-items: baseline;
	gap: 12px;
	margin: 0 0 6px;
}
body.gestai-entrada .login-content.page-card .page-card-body .gestai-login-rotulo .form-label {
	margin: 0;
}
body.gestai-entrada .login-content.page-card .page-card-body .forgot-password-message {
	margin: 0;
	font-size: 13px;
	line-height: 1.4;
	text-align: right;
}
body.gestai-entrada .login-content.page-card .page-card-body .forgot-password-message > a {
	color: var(--gh-brand-9);
	font-weight: 500;
	text-decoration: none;
}
body.gestai-entrada .login-content.page-card .page-card-body .forgot-password-message > a:hover {
	color: var(--gh-brand-10);
	text-decoration: underline;
}

/* campo de 44px, borda, raio 8, foco no azul-claro */
body.gestai-entrada .email-field,
body.gestai-entrada .password-field {
	position: relative;
}
body.gestai-entrada .login-content.page-card .page-card-body .form-control {
	height: 44px;
	padding: 0 12px;
	font-size: 15px;
	line-height: 42px;
	color: var(--gh-slate-12);
	background: #fff;
	border: 1px solid var(--gh-slate-6);
	border-radius: 8px;
	box-shadow: none;
}
body.gestai-entrada .login-content.page-card .page-card-body .password-field .form-control {
	padding-right: 84px;
}
body.gestai-entrada .login-content.page-card .page-card-body .form-control::placeholder {
	color: var(--gh-slate-9);
}
body.gestai-entrada .login-content.page-card .page-card-body .form-control:focus {
	border-color: var(--gh-brand-8);
	box-shadow: 0 0 0 1px rgba(0, 175, 236, 0.55), 0 0 0 4px rgba(0, 175, 236, 0.18);
	outline: none;
}
body.gestai-entrada .field-icon {
	display: none;
}
body.gestai-entrada .login-content.page-card .page-card-body .toggle-password {
	position: absolute;
	right: 12px;
	top: 0;
	height: 44px;
	display: flex;
	align-items: center;
	font-size: 13px;
	font-weight: 500;
	color: var(--gh-slate-11);
	cursor: pointer;
}

/* uma acao: 44px, azul da marca; e' tambem onde o erro e' escrito */
body.gestai-entrada .page-card-actions {
	margin: 4px 0 0;
}
body.gestai-entrada .btn.btn-primary,
body.gestai-entrada .btn.btn-default.btn-login-option {
	min-height: 44px;
	height: auto;
	padding: 10px 16px;
	font-size: 15px;
	font-weight: 600;
	line-height: 1.4;
	border-radius: 8px;
	white-space: normal;
	box-shadow: 0px 1px 2px rgba(15, 23, 42, 0.06);
}
body.gestai-entrada .btn.btn-primary:hover {
	background: var(--gh-brand-10);
	border-color: var(--gh-brand-10);
}
body.gestai-entrada .btn.btn-primary:focus-visible {
	box-shadow: 0 0 0 1px #fff, 0 0 0 4px rgba(0, 175, 236, 0.55);
}

/* ajuda abaixo do botao e rodape */
body.gestai-entrada .gestai-login-ajuda,
body.gestai-entrada .sign-up-message {
	margin: 24px 0 0;
	font-size: 13px;
	line-height: 1.5;
	color: var(--gh-slate-9);
	text-align: center;
}
body.gestai-entrada .gestai-login-ajuda span {
	color: var(--gh-slate-11);
	text-decoration: underline;
	text-underline-offset: 3px;
}
body.gestai-entrada .gestai-login-rodape {
	grid-column: 2;
	padding: 0 40px 20px;
	font-size: 12px;
	color: var(--gh-slate-9);
	background: #fff;
}

/* --- ate' 600px: uma coluna, sem faixa, sem frase; ilustracao pequena --- */
@media (max-width: 600px) {
	body.gestai-entrada .gestai-login {
		grid-template-columns: 1fr;
		grid-template-rows: auto auto 1fr;
		align-content: start;
		min-height: 100vh;
	}
	/* A ORDEM E' A DO MOCK APROVADO: logo, ilustracao, formulario, rodape.
	   A primeira implementacao deixou a marca em `order: 2` e a ilustracao
	   caiu DEPOIS do botao Entrar -- e' o que o Leonardo viu em 11/09 num
	   iPhone 14 Pro Max (430 px). */
	body.gestai-entrada .gestai-login-marca {
		grid-row: auto;
		order: 1;
		background: transparent;
		padding: 28px 20px 0;
		justify-content: flex-start;
		overflow: visible;
	}
	body.gestai-entrada .gestai-login-marca-logo {
		display: block;
		/* `align-self` porque a marca e' um flex column: sem ele o item
		   estica na largura toda (medido: 390 px de caixa num viewport de
		   430) e o logo aparece centrado, nao no canto esquerdo do mock. */
		align-self: flex-start;
		height: 40px;
		width: auto;
		margin: 0 0 4px;
	}
	/* O logo do cabecalho do formulario continua no DOM, escondido so' dos
	   olhos: quem enxerga ja' viu a marca no topo, e um `display: none`
	   levaria junto o `alt` com o nome do produto -- a unica coisa que diz
	   "GestAI" para quem navega por audio, ja' que o `h4` desta secao e'
	   escondido pela secao 10. */
	body.gestai-entrada .page-card-head img.app-logo {
		position: absolute;
		width: 1px;
		height: 1px;
		margin: 0;
		padding: 0;
		overflow: hidden;
		clip: rect(0 0 0 0);
		clip-path: inset(50%);
		white-space: nowrap;
	}
	body.gestai-entrada .gestai-login-frase {
		display: none;
	}
	body.gestai-entrada .gestai-login-ilustracao {
		flex: 0 0 auto;
		height: 190px;
		padding: 0;
		margin: 0;
	}
	body.gestai-entrada .gestai-login-ilustracao img {
		width: auto;
		max-width: 100%;
		height: 100%;
	}
	/* O respiro entre a ilustracao e o titulo e' deste padding, igual nas
	   cinco secoes: o `margin-top` que separava o titulo do logo perde o
	   sentido quando o logo sai do fluxo, e sem zera-lo `#forgot` ficaria
	   32 px mais baixo que `#login`. */
	body.gestai-entrada .page-card-head img.app-logo + h4 {
		margin-top: 0;
	}
	body.gestai-entrada .page-card-head .gestai-login-voltar {
		margin: 0 0 16px;
	}
	body.gestai-entrada .gestai-login-formulario {
		order: 2;
		justify-content: flex-start;
		padding: 20px 20px 8px;
	}
	body.gestai-entrada .gestai-login-coluna {
		max-width: none;
	}
	body.gestai-entrada .gestai-login-rodape {
		grid-column: 1;
		order: 3;
		align-self: end;
		padding: 24px 20px 20px;
		text-align: center;
	}
}

/* -----------------------------------------------------------------------
   13. O que so' a TELA DE NOVA SENHA tem -- docs/specs/tela-de-nova-senha.

   A casca (grid, campos de 44 px, botao, mobile) e' a secao 12, dividida com
   o login. Aqui ficam as tres pecas que a senha precisa e o login nao: o
   medidor de forca, a mensagem de erro embaixo do campo a que ela se refere,
   e os dois estados que trocam o formulario inteiro (link invalido e senha
   salva).

   Mesmo escopo `body.gestai-entrada`, pelo mesmo motivo da secao 12: este
   arquivo entra por `web_include_css` em toda pagina do caminho de site.
   ----------------------------------------------------------------------- */

/* A secao visivel e' escolhida pelo JS; nascem todas escondidas menos pelo
   `hidden`, que o reset do Frappe as vezes perde para um `display` de
   componente -- por isso o `[hidden]` explicito. */
body.gestai-entrada .gestai-senha-secao[hidden] {
	display: none;
}

/* A ilustracao desta tela e' mais estreita que a "Medicine" do login (um
   notebook, nao uma cena de fundo inteiro), entao ela pede um teto menor
   para nao encostar nas bordas da metade esquerda. */
body.gestai-entrada .gestai-senha-ilustracao img {
	max-width: 520px;
}

/* --- medidor de forca ---
   Quatro segmentos, um por degrau do `score` que o servidor devolve (0..4;
   0 e 1 sao o mesmo "fraca"). A cor NAO decide se pode salvar -- quem decide
   e' `password_policy_validation_passed`, e o gate de verdade e' o servidor,
   que repete a verificacao no `update_password`. */
body.gestai-entrada .gestai-senha-medidor {
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 4px;
	margin: 8px 0 6px;
}
body.gestai-entrada .gestai-senha-medidor i {
	display: block;
	height: 4px;
	border-radius: 2px;
	background: var(--gh-slate-6);
}
body.gestai-entrada .gestai-senha-medidor.s0 i:nth-child(-n + 1),
body.gestai-entrada .gestai-senha-medidor.s1 i:nth-child(-n + 1) {
	background: #dc2626;
}
body.gestai-entrada .gestai-senha-medidor.s2 i:nth-child(-n + 2) {
	background: #d97706;
}
body.gestai-entrada .gestai-senha-medidor.s3 i:nth-child(-n + 3) {
	background: var(--gh-brand-9);
}
body.gestai-entrada .gestai-senha-medidor.s4 i {
	background: #15803d;
}

/* A frase da forca: a palavra em negrito e a razao do servidor em seguida. */
body.gestai-entrada .gestai-senha-forca {
	margin: 0;
	font-size: 13px;
	line-height: 1.5;
	color: var(--gh-slate-11);
}
body.gestai-entrada .gestai-senha-forca b {
	color: var(--gh-slate-12);
	font-weight: 600;
}
body.gestai-entrada .gestai-senha-forca.gestai-senha-forca-fraca,
body.gestai-entrada .gestai-senha-forca.gestai-senha-forca-fraca b {
	color: #b91c1c;
}

/* --- erro embaixo do campo ---
   O template do Frappe punha a mensagem no fim do formulario, ou numa modal.
   Aqui cada uma mora embaixo do campo a que se refere. */
body.gestai-entrada .gestai-senha-erro {
	margin: 6px 0 0;
	font-size: 13px;
	line-height: 1.5;
	color: #b91c1c;
}
body.gestai-entrada .gestai-senha-erro[hidden] {
	display: none;
}
body.gestai-entrada .login-content.page-card .page-card-body .form-control.gestai-senha-campo-erro {
	border-color: #dc2626;
	box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.12);
}

/* Botao desligado: cinza de superficie, nao o azul apagado do Frappe -- azul
   claro parece "carregando", cinza parece "ainda nao". O motivo de estar
   desligado esta' sempre escrito logo acima dele. */
body.gestai-entrada .btn.btn-primary:disabled,
body.gestai-entrada .btn.btn-primary[disabled] {
	background: var(--gh-slate-6);
	border-color: var(--gh-slate-6);
	color: var(--gh-slate-9);
	box-shadow: none;
	opacity: 1;
	cursor: not-allowed;
}

/* --- estados que trocam o formulario --- */
body.gestai-entrada .gestai-senha-secao .btn.btn-primary {
	text-decoration: none;
}
body.gestai-entrada .gestai-senha-voltar-invalido {
	margin-top: 16px;
	text-align: left;
}

/* A linha de progresso do sucesso ocupa o lugar do botao -- e' o mock
   aprovado: uma barra parada, nao um spinner. Sem `@keyframes` de proposito:
   o gate de escopo do CSS varre seletores por regex e o `from`/`to` de uma
   at-rule aparece la' como se fosse seletor solto (medido em 11/09). Um
   movimento aqui valeria pouco: a tela some em pouco mais de um segundo. */
body.gestai-entrada .gestai-senha-progresso {
	height: 2px;
	margin: 24px 0 0;
	border-radius: 1px;
	background: var(--gh-slate-6);
	overflow: hidden;
}
body.gestai-entrada .gestai-senha-progresso i {
	display: block;
	width: 40%;
	height: 100%;
	border-radius: 1px;
	background: var(--gh-brand-9);
}
body.gestai-entrada .gestai-senha-saida {
	margin-top: 12px;
	text-align: left;
}
body.gestai-entrada .gestai-senha-saida a {
	color: var(--gh-brand-9);
	font-weight: 500;
}
