/* auto-extracted */

/* ── Oculta chrome Streamlit nao necessario na tela de auth ── */
[data-testid="stSidebar"],[data-testid="stToolbar"],[data-testid="stDecoration"],
[data-testid="stHeader"],header[data-testid="stHeader"],div[data-testid="stHeader"],
[data-testid="stStatusWidget"],[data-testid="stStatusWidgetContainer"],
[data-testid="stStatusWidgetRunning"],[data-testid="stRunningWidget"],
[data-testid="stSpinner"],[data-testid="stProgressBar"],
[data-testid="stDeployButton"],[data-testid="stToolbarActions"],
[data-testid="stToolbarActionsButton"],.stApp [class*="StatusWidget"],
.stApp [class*="stRunning"],.stRunningGif,.stRunningGifBicycle,.stSpinner,
button[title="Stop"],#MainMenu {
    display: none !important;
    visibility: hidden !important;
    opacity: 0 !important;
    pointer-events: none !important;
}

/* ── Base: fundo da tela de auth ── */
[data-testid="stAppViewContainer"],.main {
    padding-top: 0 !important;
    background: var(--surface-base) !important;
}
.stApp { background: var(--surface-base) !important; }

/* ── AC-09: transicao global 200ms ease + reduced-motion ── */
*,*::before,*::after {
    box-sizing: border-box;
    transition:
        background-color 200ms ease,
        color            200ms ease,
        border-color     200ms ease,
        box-shadow       200ms ease,
        opacity          200ms ease;
}
@media (prefers-reduced-motion: reduce) {
    *,*::before,*::after {
        transition: none !important;
        animation-duration: 0.01ms !important;
    }
}

/* ── AC-01: topbar simplificada — invariante #16202E ── */
/* Transicao mais rapida na topbar (AC-09) */
.arh-auth-topbar,.arh-auth-topbar * { transition-duration: 120ms !important; }

.arh-auth-topbar {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 200;
    height: 52px;
    background: var(--topbar-bg);
    border-bottom: 1px solid var(--topbar-border);
    display: flex;
    align-items: center;
    padding: 0 20px;
}
.arh-auth-brand {
    display: flex;
    align-items: center;
    gap: 8px;
    flex: 1;
    text-decoration: none;
    color: var(--topbar-text);
    font-weight: 700;
    font-size: 14px;
}
.arh-auth-logo-icon {
    width: 26px;
    height: 26px;
    background: var(--topbar-active-bg);
    border-radius: 5px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 13px;
    font-weight: 800;
    flex-shrink: 0;
}
/* Logo Stefanini (Matias 2026-06-14): quando o ícone vira <img>, fundo branco
   (o PNG já tem fundo branco) + overflow:hidden p/ o border-radius cortar. */
.arh-auth-logo-icon:has(img) { background: #fff; overflow: hidden; }
.arh-auth-brand-name { color: var(--topbar-text); letter-spacing: -0.01em; }
.arh-auth-brand-sep  { color: var(--topbar-text-muted); margin: 0 2px; font-weight: 400; }
.arh-auth-brand-sub  { color: var(--topbar-text-muted); font-weight: 400; font-size: 12px; }

/* AC-01: botao theme toggle 32x32 */
.arh-auth-theme-btn {
    width: 32px;
    height: 32px;
    border-radius: 6px;
    border: 1px solid var(--topbar-border);
    background: transparent;
    color: var(--topbar-text-muted);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 16px;
    flex-shrink: 0;
    padding: 0;
}
.arh-auth-theme-btn:hover {
    background: var(--topbar-hover);
    color: var(--topbar-text);
    border-color: var(--topbar-text-muted);
}
.arh-auth-theme-btn:focus-visible {
    outline: 2px solid var(--focus-ring);
    outline-offset: 2px;
}

/* ── AC-08: centralização vertical do card de auth ──
   FIX-V4 (senha-loop-final 2026-05-08):
   Diagnose Playwright: blockContainer tem data-testid="stMainBlockContainer"
   e display:block por padrão — o seletor .block-container precisa ser
   reforçado com data-testid para garantir display:flex.
   stMain (display:flex) precisa de justify-content + align-items para
   centralizar o blockContainer filho.
   stVerticalBlock (display:flex flex-column) precisa de align-self:center
   para não expandir para 100% da largura do blockContainer.
   Ref: streamlit-native-reference.md §5 (padrão aprovado). */

/* Camada 1: stMain centra blockContainer */
section[data-testid="stMain"] {
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    min-height: 100vh !important;
    padding-top: 0 !important;
}

/* Camada 2: blockContainer — display:flex + centrado + padding-top para topbar fixa */
[data-testid="stMainBlockContainer"],
.block-container {
    max-width: 100% !important;
    width: 100% !important;
    padding-top: 52px !important;
    padding-left: 16px !important;
    padding-right: 16px !important;
    padding-bottom: 32px !important;
    margin: 0 !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    min-height: 100vh !important;
    box-sizing: border-box !important;
}

/* Camada 3: stVerticalBlock colapsa ao conteúdo real do card
   FIX-V4 root cause (senha-loop-final 2026-05-08):
   Streamlit aplica flex:1 1 0% ao stVerticalBlock via Emotion (e12zf7d53).
   flex-grow:1 faz o elemento expandir para 900px no container flex de 900px.
   Solução: flex:0 0 auto — não cresce, não encolhe, usa tamanho natural.
   align-self:flex-start colapsa na cross-axis (width).
   margin:auto centraliza na main-axis do flex parent (blockContainer).
   gap:0 elimina espaço dos ghost containers de CSS/JS injetado. */
[data-testid="stMainBlockContainer"] > [data-testid="stVerticalBlock"],
.block-container > [data-testid="stVerticalBlock"] {
    flex: 0 0 auto !important;
    align-items: center !important;
    align-self: flex-start !important;
    height: auto !important;
    min-height: unset !important;
    width: 100% !important;
    max-width: 400px !important;
    margin-top: auto !important;
    margin-bottom: auto !important;
    margin-left: auto !important;
    margin-right: auto !important;
    gap: 0 !important;
}

/* ── AC-02: card visual 400px (AD-02 — :has() detecta input sem hackear DOM) ──
   FIX-V4: seletor atualizado para usar data-testid canônico do blockContainer
   (stMainBlockContainer) em vez de div:first-child frágil. */
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="password"]),
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="text"]) {
    background: var(--surface-raised) !important;
    border: 1px solid var(--border-default) !important;
    border-radius: 12px !important;
    box-shadow: var(--shadow-card) !important;
    padding: 40px 36px 32px !important;
    width: 100% !important;
    max-width: 400px !important;
}
@media (max-width: 480px) {
    [data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="password"]),
    [data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="text"]) {
        padding: 28px 16px 24px !important;
    }
}

/* ── AC-04: input password estilizado ── */
/* FIX-DUPLA-MOLDURA (2026-05-17): BaseWeb aninha 2 wrappers — [data-baseweb="input"]
   externo (Root) e [data-baseweb="base-input"] interno (InputContainer). Aplicar
   border nos DOIS criava moldura dupla (incidente reportado por Matias).
   Solução canônica: border + bg + radius APENAS no externo, interno transparente. */
[data-testid="stTextInput"] [data-baseweb="input"] {
    background: var(--auth-input-bg, var(--input-bg)) !important;
    border: 1px solid var(--auth-input-border, var(--border-default)) !important;
    border-radius: var(--radius-base, 4px) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"] {
    background: transparent !important;
    border: none !important;
    border-radius: 0 !important;
    padding: 0 !important;
    box-shadow: none !important;
}
[data-testid="stTextInput"] input {
    height: 40px !important;
    padding: 0 40px 0 12px !important;
    background: transparent !important;
    border: none !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    color: var(--auth-input-text) !important;
    font-size: 14px !important;
    letter-spacing: 0.05em !important;
}
[data-testid="stTextInput"] input::placeholder {
    color: var(--auth-input-placeholder) !important;
    opacity: 1 !important;
    letter-spacing: 0.1em;
    font-size: 16px;
}
[data-testid="stTextInput"] input:focus {
    outline: none !important;
    box-shadow: none !important;
}
/* Focus ring SÓ no wrapper externo (consistente com FIX-DUPLA-MOLDURA) */
[data-testid="stTextInput"] [data-baseweb="input"]:focus-within {
    border-color: var(--auth-input-focus-ring, var(--accent-brand)) !important;
    box-shadow: 0 0 0 3px var(--auth-input-focus-glow, rgba(29,78,216,.25)) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"]:focus-within {
    border: none !important;
    box-shadow: none !important;
}
/* AC-04: estado de erro no campo */
[data-testid="stTextInput"] input.arh-input-error {
    border-color: var(--state-danger) !important;
    box-shadow: 0 0 0 3px rgba(231,76,60,.18) !important;
}
[data-theme="light"] [data-testid="stTextInput"] input.arh-input-error {
    box-shadow: 0 0 0 3px rgba(153,27,27,.12) !important;
}
/* AC-04: centraliza icone do olho (baseline canonico rh-manager 2026-05-04)
   FIX-EYE (senha-loop-final 2026-05-08): botão olho BaseWeb tem fundo proprio
   que contrasta com o card em light mode. Override: background transparente,
   sem border, cursor pointer, sem padding extra. */
[data-testid="stTextInput"] [data-baseweb="base-input"] > button[type="button"],
[data-testid="stTextInput"] [data-baseweb="input"] > button[type="button"] {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    background: transparent !important;
    border: none !important;
    padding: 0 8px !important;
    color: var(--text-muted) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"] > button[type="button"]:hover,
[data-testid="stTextInput"] [data-baseweb="input"] > button[type="button"]:hover {
    background: transparent !important;
    color: var(--text-secondary) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"] > button[type="button"] svg,
[data-testid="stTextInput"] [data-baseweb="input"] > button[type="button"] svg {
    display: block !important;
    flex-shrink: 0 !important;
    margin: 0 !important;
    position: static !important;
}
/* Oculta tooltip "Press Enter to apply" do Streamlit */
[data-testid="InputInstructions"],[data-testid="stTextInputInstructions"],
.stTextInput [data-baseweb="form-control-message"] { display: none !important; }

/* HIGH-1 fix (Echo 2026-05-09): estiliza label nativo do st.text_input
   (label_visibility='visible') para manter aparência uppercase DNA A.
   Streamlit conecta label ao input via htmlFor/id gerenciado — SR agora lê "Senha". */
[data-testid="stTextInput"] label {
    font-size: 12px !important;
    font-weight: 600 !important;
    color: var(--text-secondary) !important;
    letter-spacing: 0.02em !important;
    text-transform: uppercase !important;
    margin-bottom: 6px !important;
    padding: 0 !important;
}

/* FIX-S2 (senha-loop-final 2026-05-08): spacing do formulário auth
   Proto proto-A a-centered-minimal.html measurements:
   - input → botão Entrar: ~16px gap
   - botão → link Esqueci: ~24px gap
   FIX-V4: seletores atualizados para usar stMainBlockContainer (testid canônico). */
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stTextInput"]),
.block-container > [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stTextInput"]) {
    margin-bottom: 16px !important;
}
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stBaseButton-primary"]),
.block-container > [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stBaseButton-primary"]) {
    margin-bottom: 24px !important;
}

/* ── AC-06: botao Entrar primary ── */
/* FIX-TEXT-WHITE (2026-05-17 iter 2): forçar #fff direto no botão E em todos os
   descendentes (BaseWeb renderiza o texto em <p>/<div> aninhados que ignoram
   herdança). var(--btn-primary-text) virava cor escura no light mode. Como o
   fundo é sempre brand azul (igual nos 2 modos), #fff direto é robusto e único. */
[data-testid="stBaseButton-primary"] {
    height: 42px !important;
    width: 100% !important;
    background: var(--btn-primary-bg) !important;
    border: 1px solid var(--btn-primary-border) !important;
    border-radius: var(--radius-base, 4px) !important;
    color: #fff !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    letter-spacing: 0.01em !important;
    box-shadow: var(--btn-primary-shadow) !important;
    margin-top: 0 !important;
    transition: transform 0.07s ease, box-shadow 0.07s ease,
                background-color 200ms ease !important;
}
[data-testid="stBaseButton-primary"] *,
[data-testid="stBaseButton-primary"] p,
[data-testid="stBaseButton-primary"] div,
[data-testid="stBaseButton-primary"] span {
    color: #fff !important;
}
[data-testid="stBaseButton-primary"]:hover {
    background: var(--btn-primary-bg-hover) !important;
    filter: brightness(1.06);
}
[data-testid="stBaseButton-primary"]:focus-visible {
    outline: 2px solid var(--auth-input-focus-ring) !important;
    outline-offset: 2px !important;
}
[data-testid="stBaseButton-primary"]:active {
    transform: translateY(1px) !important;
    box-shadow: none !important;
}
/* FIX-LIGHT-MODE removido na iter 2 — substituído por #fff global na regra base
   acima (FIX-TEXT-WHITE), que cobre dark + light + todos os descendentes. */

/* ── stVerticalBlock gap (já definido no bloco FIX-V4 acima) ── */
/* gap:0 consolidado no seletor dual acima — não duplicar aqui */

/* ── LAV-R1: subtítulo cor neutra (refino final 2026-05-09) ──
   Dark: --text-muted dark (#7A96B5) ficava azulado — override para --text-secondary mais neutro.
   Light: --text-muted light (#6E665D) ficava bege/quente — override para #525252 cinza neutro.
   Estratégia: light usa [data-theme="light"] explícito;
   dark usa :not([data-theme="light"]) para funcionar mesmo se data-theme ainda não foi setado
   pelo anti-FOIT JS (race condition possível entre CSS e JS do iframe srcdoc).
   Afeta apenas p dentro do card auth — não toca alert de erro (seletor :not(:has(role=alert))).
   FIX-2026-06-23: Exclui stMarkdownContainer DENTRO de botão (stBaseButton-primary).
   Causa: st.button renderiza label via stMarkdownContainer>p; LAV-R1 atingia esse <p>
   com color:#525252 no light, tornando "Entrar" ilegível (medido: rgb(82,82,82)).
   Estratégia: manter LAV-R1 inalterado + regra de override de alta especificidade logo
   abaixo que restaura #fff no <p> do botão (vence por ordem de declaração + specificity). */
[data-testid="stVerticalBlock"]:has(input) [data-testid="stMarkdownContainer"]:not(:has([role="alert"])) p {
    color: var(--text-secondary) !important;
}
[data-theme="light"] [data-testid="stVerticalBlock"]:has(input) [data-testid="stMarkdownContainer"]:not(:has([role="alert"])) p {
    color: #525252 !important;
}
/* FIX-BTN-TEXT-LIGHT (2026-06-23): restaura branco no label do botão Entrar.
   LAV-R1 light tem especificidade 0-5-0 ([data-theme] + [stVerticalBlock] + :has +
   [stMarkdownContainer] + :not = 5 atributos/pseudo). Para vencer por ordem de
   declaração com !important, esta regra precisa de especificidade ≥ 0-5-0.
   Seletor: [data-theme="light"] (1) + [stVerticalBlock]:has(input) (2) +
   [stBaseButton-primary] (1) + [stMarkdownContainer] (1) + :not([role]) (1) = 6.
   Vence LAV-R1 por especificidade superior. Dark: sem [data-theme], especific. 0-5-0
   = empata + vem depois = vence por ordem. */
[data-theme="light"] [data-testid="stVerticalBlock"]:has(input) [data-testid="stBaseButton-primary"] [data-testid="stMarkdownContainer"]:not([role="alert"]) p {
    color: #fff !important;
}
[data-testid="stVerticalBlock"]:has(input) [data-testid="stBaseButton-primary"] [data-testid="stMarkdownContainer"]:not([role="alert"]) p {
    color: #fff !important;
}

/* ── LAV-R2: separador rodapé dark — mais visível (refino final 2026-05-09) ──
   --border-subtle dark (#243347) quase invisível sobre --surface-raised (#16202E).
   Fix: seletor sem data-theme (aplica em dark por padrão, light já tem borda visível).
   Usa --border-default para maior contraste. */
[data-testid="stMarkdownContainer"] div[style*="border-top"] {
    border-top-color: var(--border-default) !important;
}


<header class="arh-auth-topbar" role="banner">
  <div class="arh-auth-brand">
    <div class="arh-auth-logo-icon" aria-hidden="true">{_auth_logo_icon}</div>
    <span class="arh-auth-brand-name">Analytics</span>
    <span class="arh-auth-brand-sep" aria-hidden="true">·</span>
    <span class="arh-auth-brand-sub">Stefanini</span>
  </div>
  <button
    class="arh-auth-theme-btn"
    id="arhAuthThemeBtn"
    aria-label="Alternar entre modo claro e escuro"
    title="Alternar entre modo claro e escuro">
    <i class="ph ph-moon" id="arhAuthThemeIcon" aria-hidden="true"></i>
  </button>
</header>


/* ── Oculta chrome Streamlit nao necessario na tela de auth ── */
[data-testid="stSidebar"],[data-testid="stToolbar"],[data-testid="stDecoration"],
[data-testid="stHeader"],header[data-testid="stHeader"],div[data-testid="stHeader"],
[data-testid="stStatusWidget"],[data-testid="stStatusWidgetContainer"],
[data-testid="stStatusWidgetRunning"],[data-testid="stRunningWidget"],
[data-testid="stSpinner"],[data-testid="stProgressBar"],
[data-testid="stDeployButton"],[data-testid="stToolbarActions"],
[data-testid="stToolbarActionsButton"],.stApp [class*="StatusWidget"],
.stApp [class*="stRunning"],.stRunningGif,.stRunningGifBicycle,.stSpinner,
button[title="Stop"],#MainMenu {
    display: none !important;
    visibility: hidden !important;
    opacity: 0 !important;
    pointer-events: none !important;
}

/* ── Base: fundo da tela de auth ── */
[data-testid="stAppViewContainer"],.main {
    padding-top: 0 !important;
    background: var(--surface-base) !important;
}
.stApp { background: var(--surface-base) !important; }

/* ── AC-09: transicao global 200ms ease + reduced-motion ── */
*,*::before,*::after {
    box-sizing: border-box;
    transition:
        background-color 200ms ease,
        color            200ms ease,
        border-color     200ms ease,
        box-shadow       200ms ease,
        opacity          200ms ease;
}
@media (prefers-reduced-motion: reduce) {
    *,*::before,*::after {
        transition: none !important;
        animation-duration: 0.01ms !important;
    }
}

/* ── AC-01: topbar simplificada — invariante #16202E ── */
/* Transicao mais rapida na topbar (AC-09) */
.arh-auth-topbar,.arh-auth-topbar * { transition-duration: 120ms !important; }

.arh-auth-topbar {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    z-index: 200;
    height: 52px;
    background: var(--topbar-bg);
    border-bottom: 1px solid var(--topbar-border);
    display: flex;
    align-items: center;
    padding: 0 20px;
}
.arh-auth-brand {
    display: flex;
    align-items: center;
    gap: 8px;
    flex: 1;
    text-decoration: none;
    color: var(--topbar-text);
    font-weight: 700;
    font-size: 14px;
}
.arh-auth-logo-icon {
    width: 26px;
    height: 26px;
    background: var(--topbar-active-bg);
    border-radius: 5px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: #fff;
    font-size: 13px;
    font-weight: 800;
    flex-shrink: 0;
}
/* Logo Stefanini (Matias 2026-06-14): quando o ícone vira <img>, fundo branco
   (o PNG já tem fundo branco) + overflow:hidden p/ o border-radius cortar. */
.arh-auth-logo-icon:has(img) { background: #fff; overflow: hidden; }
.arh-auth-brand-name { color: var(--topbar-text); letter-spacing: -0.01em; }
.arh-auth-brand-sep  { color: var(--topbar-text-muted); margin: 0 2px; font-weight: 400; }
.arh-auth-brand-sub  { color: var(--topbar-text-muted); font-weight: 400; font-size: 12px; }

/* AC-01: botao theme toggle 32x32 */
.arh-auth-theme-btn {
    width: 32px;
    height: 32px;
    border-radius: 6px;
    border: 1px solid var(--topbar-border);
    background: transparent;
    color: var(--topbar-text-muted);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 16px;
    flex-shrink: 0;
    padding: 0;
}
.arh-auth-theme-btn:hover {
    background: var(--topbar-hover);
    color: var(--topbar-text);
    border-color: var(--topbar-text-muted);
}
.arh-auth-theme-btn:focus-visible {
    outline: 2px solid var(--focus-ring);
    outline-offset: 2px;
}

/* ── AC-08: centralização vertical do card de auth ──
   FIX-V4 (senha-loop-final 2026-05-08):
   Diagnose Playwright: blockContainer tem data-testid="stMainBlockContainer"
   e display:block por padrão — o seletor .block-container precisa ser
   reforçado com data-testid para garantir display:flex.
   stMain (display:flex) precisa de justify-content + align-items para
   centralizar o blockContainer filho.
   stVerticalBlock (display:flex flex-column) precisa de align-self:center
   para não expandir para 100% da largura do blockContainer.
   Ref: streamlit-native-reference.md §5 (padrão aprovado). */

/* Camada 1: stMain centra blockContainer */
section[data-testid="stMain"] {
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    min-height: 100vh !important;
    padding-top: 0 !important;
}

/* Camada 2: blockContainer — display:flex + centrado + padding-top para topbar fixa */
[data-testid="stMainBlockContainer"],
.block-container {
    max-width: 100% !important;
    width: 100% !important;
    padding-top: 52px !important;
    padding-left: 16px !important;
    padding-right: 16px !important;
    padding-bottom: 32px !important;
    margin: 0 !important;
    display: flex !important;
    flex-direction: column !important;
    align-items: center !important;
    justify-content: center !important;
    min-height: 100vh !important;
    box-sizing: border-box !important;
}

/* Camada 3: stVerticalBlock colapsa ao conteúdo real do card
   FIX-V4 root cause (senha-loop-final 2026-05-08):
   Streamlit aplica flex:1 1 0% ao stVerticalBlock via Emotion (e12zf7d53).
   flex-grow:1 faz o elemento expandir para 900px no container flex de 900px.
   Solução: flex:0 0 auto — não cresce, não encolhe, usa tamanho natural.
   align-self:flex-start colapsa na cross-axis (width).
   margin:auto centraliza na main-axis do flex parent (blockContainer).
   gap:0 elimina espaço dos ghost containers de CSS/JS injetado. */
[data-testid="stMainBlockContainer"] > [data-testid="stVerticalBlock"],
.block-container > [data-testid="stVerticalBlock"] {
    flex: 0 0 auto !important;
    align-items: center !important;
    align-self: flex-start !important;
    height: auto !important;
    min-height: unset !important;
    width: 100% !important;
    max-width: 400px !important;
    margin-top: auto !important;
    margin-bottom: auto !important;
    margin-left: auto !important;
    margin-right: auto !important;
    gap: 0 !important;
}

/* ── AC-02: card visual 400px (AD-02 — :has() detecta input sem hackear DOM) ──
   FIX-V4: seletor atualizado para usar data-testid canônico do blockContainer
   (stMainBlockContainer) em vez de div:first-child frágil. */
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="password"]),
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="text"]) {
    background: var(--surface-raised) !important;
    border: 1px solid var(--border-default) !important;
    border-radius: 12px !important;
    box-shadow: var(--shadow-card) !important;
    padding: 40px 36px 32px !important;
    width: 100% !important;
    max-width: 400px !important;
}
@media (max-width: 480px) {
    [data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="password"]),
    [data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"]:has(input[type="text"]) {
        padding: 28px 16px 24px !important;
    }
}

/* ── AC-04: input password estilizado ── */
/* FIX-DUPLA-MOLDURA (2026-05-17): BaseWeb aninha 2 wrappers — [data-baseweb="input"]
   externo (Root) e [data-baseweb="base-input"] interno (InputContainer). Aplicar
   border nos DOIS criava moldura dupla (incidente reportado por Matias).
   Solução canônica: border + bg + radius APENAS no externo, interno transparente. */
[data-testid="stTextInput"] [data-baseweb="input"] {
    background: var(--auth-input-bg, var(--input-bg)) !important;
    border: 1px solid var(--auth-input-border, var(--border-default)) !important;
    border-radius: var(--radius-base, 4px) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"] {
    background: transparent !important;
    border: none !important;
    border-radius: 0 !important;
    padding: 0 !important;
    box-shadow: none !important;
}
[data-testid="stTextInput"] input {
    height: 40px !important;
    padding: 0 40px 0 12px !important;
    background: transparent !important;
    border: none !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    color: var(--auth-input-text) !important;
    font-size: 14px !important;
    letter-spacing: 0.05em !important;
}
[data-testid="stTextInput"] input::placeholder {
    color: var(--auth-input-placeholder) !important;
    opacity: 1 !important;
    letter-spacing: 0.1em;
    font-size: 16px;
}
[data-testid="stTextInput"] input:focus {
    outline: none !important;
    box-shadow: none !important;
}
/* Focus ring SÓ no wrapper externo (consistente com FIX-DUPLA-MOLDURA) */
[data-testid="stTextInput"] [data-baseweb="input"]:focus-within {
    border-color: var(--auth-input-focus-ring, var(--accent-brand)) !important;
    box-shadow: 0 0 0 3px var(--auth-input-focus-glow, rgba(29,78,216,.25)) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"]:focus-within {
    border: none !important;
    box-shadow: none !important;
}
/* AC-04: estado de erro no campo */
[data-testid="stTextInput"] input.arh-input-error {
    border-color: var(--state-danger) !important;
    box-shadow: 0 0 0 3px rgba(231,76,60,.18) !important;
}
[data-theme="light"] [data-testid="stTextInput"] input.arh-input-error {
    box-shadow: 0 0 0 3px rgba(153,27,27,.12) !important;
}
/* AC-04: centraliza icone do olho (baseline canonico rh-manager 2026-05-04)
   FIX-EYE (senha-loop-final 2026-05-08): botão olho BaseWeb tem fundo proprio
   que contrasta com o card em light mode. Override: background transparente,
   sem border, cursor pointer, sem padding extra. */
[data-testid="stTextInput"] [data-baseweb="base-input"] > button[type="button"],
[data-testid="stTextInput"] [data-baseweb="input"] > button[type="button"] {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    background: transparent !important;
    border: none !important;
    padding: 0 8px !important;
    color: var(--text-muted) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"] > button[type="button"]:hover,
[data-testid="stTextInput"] [data-baseweb="input"] > button[type="button"]:hover {
    background: transparent !important;
    color: var(--text-secondary) !important;
}
[data-testid="stTextInput"] [data-baseweb="base-input"] > button[type="button"] svg,
[data-testid="stTextInput"] [data-baseweb="input"] > button[type="button"] svg {
    display: block !important;
    flex-shrink: 0 !important;
    margin: 0 !important;
    position: static !important;
}
/* Oculta tooltip "Press Enter to apply" do Streamlit */
[data-testid="InputInstructions"],[data-testid="stTextInputInstructions"],
.stTextInput [data-baseweb="form-control-message"] { display: none !important; }

/* HIGH-1 fix (Echo 2026-05-09): estiliza label nativo do st.text_input
   (label_visibility='visible') para manter aparência uppercase DNA A.
   Streamlit conecta label ao input via htmlFor/id gerenciado — SR agora lê "Senha". */
[data-testid="stTextInput"] label {
    font-size: 12px !important;
    font-weight: 600 !important;
    color: var(--text-secondary) !important;
    letter-spacing: 0.02em !important;
    text-transform: uppercase !important;
    margin-bottom: 6px !important;
    padding: 0 !important;
}

/* FIX-S2 (senha-loop-final 2026-05-08): spacing do formulário auth
   Proto proto-A a-centered-minimal.html measurements:
   - input → botão Entrar: ~16px gap
   - botão → link Esqueci: ~24px gap
   FIX-V4: seletores atualizados para usar stMainBlockContainer (testid canônico). */
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stTextInput"]),
.block-container > [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stTextInput"]) {
    margin-bottom: 16px !important;
}
[data-testid="stMainBlockContainer"] [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stBaseButton-primary"]),
.block-container > [data-testid="stVerticalBlock"] > [data-testid="stElementContainer"]:has([data-testid="stBaseButton-primary"]) {
    margin-bottom: 24px !important;
}

/* ── AC-06: botao Entrar primary ── */
/* FIX-TEXT-WHITE (2026-05-17 iter 2): forçar #fff direto no botão E em todos os
   descendentes (BaseWeb renderiza o texto em <p>/<div> aninhados que ignoram
   herdança). var(--btn-primary-text) virava cor escura no light mode. Como o
   fundo é sempre brand azul (igual nos 2 modos), #fff direto é robusto e único. */
[data-testid="stBaseButton-primary"] {
    height: 42px !important;
    width: 100% !important;
    background: var(--btn-primary-bg) !important;
    border: 1px solid var(--btn-primary-border) !important;
    border-radius: var(--radius-base, 4px) !important;
    color: #fff !important;
    font-size: 14px !important;
    font-weight: 600 !important;
    letter-spacing: 0.01em !important;
    box-shadow: var(--btn-primary-shadow) !important;
    margin-top: 0 !important;
    transition: transform 0.07s ease, box-shadow 0.07s ease,
                background-color 200ms ease !important;
}
[data-testid="stBaseButton-primary"] *,
[data-testid="stBaseButton-primary"] p,
[data-testid="stBaseButton-primary"] div,
[data-testid="stBaseButton-primary"] span {
    color: #fff !important;
}
[data-testid="stBaseButton-primary"]:hover {
    background: var(--btn-primary-bg-hover) !important;
    filter: brightness(1.06);
}
[data-testid="stBaseButton-primary"]:focus-visible {
    outline: 2px solid var(--auth-input-focus-ring) !important;
    outline-offset: 2px !important;
}
[data-testid="stBaseButton-primary"]:active {
    transform: translateY(1px) !important;
    box-shadow: none !important;
}
/* FIX-LIGHT-MODE removido na iter 2 — substituído por #fff global na regra base
   acima (FIX-TEXT-WHITE), que cobre dark + light + todos os descendentes. */

/* ── stVerticalBlock gap (já definido no bloco FIX-V4 acima) ── */
/* gap:0 consolidado no seletor dual acima — não duplicar aqui */

/* ── LAV-R1: subtítulo cor neutra (refino final 2026-05-09) ──
   Dark: --text-muted dark (#7A96B5) ficava azulado — override para --text-secondary mais neutro.
   Light: --text-muted light (#6E665D) ficava bege/quente — override para #525252 cinza neutro.
   Estratégia: light usa [data-theme="light"] explícito;
   dark usa :not([data-theme="light"]) para funcionar mesmo se data-theme ainda não foi setado
   pelo anti-FOIT JS (race condition possível entre CSS e JS do iframe srcdoc).
   Afeta apenas p dentro do card auth — não toca alert de erro (seletor :not(:has(role=alert))).
   FIX-2026-06-23: Exclui stMarkdownContainer DENTRO de botão (stBaseButton-primary).
   Causa: st.button renderiza label via stMarkdownContainer>p; LAV-R1 atingia esse <p>
   com color:#525252 no light, tornando "Entrar" ilegível (medido: rgb(82,82,82)).
   Estratégia: manter LAV-R1 inalterado + regra de override de alta especificidade logo
   abaixo que restaura #fff no <p> do botão (vence por ordem de declaração + specificity). */
[data-testid="stVerticalBlock"]:has(input) [data-testid="stMarkdownContainer"]:not(:has([role="alert"])) p {
    color: var(--text-secondary) !important;
}
[data-theme="light"] [data-testid="stVerticalBlock"]:has(input) [data-testid="stMarkdownContainer"]:not(:has([role="alert"])) p {
    color: #525252 !important;
}
/* FIX-BTN-TEXT-LIGHT (2026-06-23): restaura branco no label do botão Entrar.
   LAV-R1 light tem especificidade 0-5-0 ([data-theme] + [stVerticalBlock] + :has +
   [stMarkdownContainer] + :not = 5 atributos/pseudo). Para vencer por ordem de
   declaração com !important, esta regra precisa de especificidade ≥ 0-5-0.
   Seletor: [data-theme="light"] (1) + [stVerticalBlock]:has(input) (2) +
   [stBaseButton-primary] (1) + [stMarkdownContainer] (1) + :not([role]) (1) = 6.
   Vence LAV-R1 por especificidade superior. Dark: sem [data-theme], especific. 0-5-0
   = empata + vem depois = vence por ordem. */
[data-theme="light"] [data-testid="stVerticalBlock"]:has(input) [data-testid="stBaseButton-primary"] [data-testid="stMarkdownContainer"]:not([role="alert"]) p {
    color: #fff !important;
}
[data-testid="stVerticalBlock"]:has(input) [data-testid="stBaseButton-primary"] [data-testid="stMarkdownContainer"]:not([role="alert"]) p {
    color: #fff !important;
}

/* ── LAV-R2: separador rodapé dark — mais visível (refino final 2026-05-09) ──
   --border-subtle dark (#243347) quase invisível sobre --surface-raised (#16202E).
   Fix: seletor sem data-theme (aplica em dark por padrão, light já tem borda visível).
   Usa --border-default para maior contraste. */
[data-testid="stMarkdownContainer"] div[style*="border-top"] {
    border-top-color: var(--border-default) !important;
}
