/*
 * Design tokens e layout do SGA - mesmo espírito do local_dashboard
 * (Moodle): tudo namespaced (.sga-*), tokens de cor em custom properties
 * (aqui emitidos no <head> por Branding::cssVariables(), não em :root
 * fixo neste arquivo), nada de framework CSS externo. Ver
 * app/Models/Branding.php e resources/views/layouts/app.blade.php.
 *
 * Sem build step (Vite) de propósito nesta primeira tela - arquivo
 * estático servido direto de public/, como o plugin Moodle já fazia com
 * styles/dashboard.css. Um bundler entra quando o app tiver views
 * suficientes para justificar.
 */

:root {
    /* Defaults de segurança caso Branding::cssVariables() não rode por
       algum motivo (ex.: erro de conexão com o banco antes do login) -
       nunca uma tela sem estilo nenhum. */
    --sga-primary: #7A1F2B;
    --sga-nav-bg-start: #5C1620;
    --sga-nav-bg-end: #3B0E15;
    --sga-logo-bg-start: #7A1F2B;
    --sga-logo-bg-end: #4A1219;
    --sga-nav-link-color: #D8B7BC;
    --sga-nav-accent: #C9A227;

    --sga-primary-dark: color-mix(in srgb, var(--sga-primary) 72%, black);
    --sga-primary-light: color-mix(in srgb, var(--sga-primary) 68%, white);

    --sga-ink: #23272B;
    --sga-ink-muted: #6B7280;
    --sga-border: #E5E7EB;
    --sga-bg: #F7F5F4;
}

* { box-sizing: border-box; }

html, body {
    margin: 0;
    padding: 0;
    height: 100%;
    font-family: 'Inter', system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    color: var(--sga-ink);
    background: var(--sga-bg);
}

/* ---------- Tela de login (split-screen, mockup docx 5.1) ---------- */

.sga-login {
    display: flex;
    min-height: 100vh;
}

/* Pedido do usuário (2026-09-19): "inverter as cores do login" = trocar
   os lados (painel de marca <-> formulário), configurável em
   Aparência (Branding.login_flip_sides). */
.sga-login--flipped {
    flex-direction: row-reverse;
}

/* Pedido do usuário (2026-09-19): diferente do flip acima - aqui a
   posição de cada bloco fica igual, só as cores de fundo trocam de lado
   (útil pra logo que "fica melhor com fundo branco"; nesse caso a
   instituição troca a imagem de login pra uma versão colorida/escura,
   já que o painel dela deixa de ser escuro). O card do formulário
   (`.sga-login__card`) tem fundo branco próprio, sempre legível, então
   inverter o painel de trás nunca quebra o formulário em si. */
.sga-login--inverted .sga-login__brand {
    background: var(--sga-bg);
    color: var(--sga-login-text, var(--sga-ink));
}

.sga-login--inverted .sga-login__brand-logo {
    border-top-color: color-mix(in srgb, var(--sga-ink) 25%, transparent);
    border-bottom-color: color-mix(in srgb, var(--sga-ink) 25%, transparent);
}

.sga-login--inverted .sga-login__panel {
    background: linear-gradient(160deg, var(--sga-logo-bg-start), var(--sga-logo-bg-end));
}

.sga-login__brand {
    flex: 1 1 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: linear-gradient(160deg, var(--sga-logo-bg-start), var(--sga-logo-bg-end));
    color: var(--sga-login-text, #fff);
    padding: 3rem;
}

.sga-login__brand-inner {
    text-align: center;
    /* Ajustado junto com o teto da logo (440px = 27.5rem) - achado em
       produção (2026-09-19): com 22rem (352px) aqui, o max-width:100%
       da imagem cortava o novo teto antes dele valer a pena. */
    max-width: 30rem;
}

.sga-login__brand-logo {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    padding: 1.25rem 0;
    border-top: 1px solid rgba(255, 255, 255, .35);
    border-bottom: 1px solid rgba(255, 255, 255, .35);
    font-size: 1.05rem;
    font-weight: 600;
    letter-spacing: .28em;
    text-transform: uppercase;
}

.sga-login__brand-logo img,
.sga-login__brand-image {
    /* Responsivo à largura da tela em vez de um px fixo - achado em
       produção (2026-09-19): um valor fixo fica minúsculo num monitor
       grande e continuaria estourando em telas pequenas se fosse
       fixado grande demais. clamp() entre um piso e um teto, escalando
       com a viewport entre os dois.
       Ajustado de novo no mesmo dia: os limites originais (140-320px,
       18vw) foram calibrados olhando uma logo QUADRADA (só o símbolo) -
       com uma logo mais larga (símbolo + nome por extenso), o mesmo
       limite de largura vira uma imagem baixa e visualmente pequena
       (testado em 1920x1080, 1366x768 e mobile). Teto maior (440px) e
       vw mais generoso (26vw) escalam melhor pra proporção larga sem
       recalcular tudo se a logo mudar nesse formato de novo. */
    width: clamp(160px, 26vw, 440px);
    max-width: 100%;
    height: auto;
}

@media (max-width: 860px) {
    .sga-login__brand { display: none; }
}

.sga-login__panel {
    flex: 1 1 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--sga-bg);
    padding: 2rem;
}

.sga-login__card {
    width: 100%;
    max-width: 25rem;
    /* Card flutuante com fundo branco próprio - achado ao implementar a
       inversão de cores de fundo acima: sem isto, o painel do formulário
       inteiro herdava o fundo do painel (`.sga-login__panel`), e um
       título/label escuro ficava ilegível quando esse painel virava
       escuro. Com o card sempre branco, o formulário nunca depende da
       cor do painel atrás dele. */
    background: #fff;
    padding: 2.5rem;
    border-radius: 1rem;
    box-shadow: 0 20px 50px rgba(0, 0, 0, .12);
}

.sga-login__title {
    margin: 0 0 .25rem;
    font-size: 1.6rem;
    font-weight: 700;
    color: var(--sga-login-form-text, var(--sga-ink));
}

/* Pedido do usuário (2026-09-19): cor do texto do card do formulário
   configurável (Branding.login_form_text_color) - `.sga-field label` é
   usado no app inteiro, por isso escopado só a `.sga-login` aqui, nunca
   vaza pras telas internas do sistema. */
.sga-login .sga-field label {
    color: var(--sga-login-form-text, var(--sga-ink));
}

.sga-login__subtitle {
    margin: 0 0 1.75rem;
    color: var(--sga-ink-muted);
    font-size: .95rem;
}

.sga-field {
    margin-bottom: 1.1rem;
}

.sga-field label {
    display: block;
    margin-bottom: .35rem;
    font-size: .85rem;
    font-weight: 600;
    color: var(--sga-ink);
}

/* Pedido do usuário (2026-09-17): "deixar o estilo dos selects igual aos
   demais campos" - `.sga-select` é o mesmo visual de `.sga-field select`
   pra um <select> avulso (ex.: dentro de uma célula de tabela, como
   "Professor" em "Professores por componente"), que nunca tinha estilo
   nenhum por não estar dentro de um .sga-field. */
.sga-field input,
.sga-field select,
.sga-field textarea,
.sga-select {
    width: 100%;
    padding: .72rem .85rem;
    border: 1px solid var(--sga-border);
    border-radius: .5rem;
    font-size: .95rem;
    background: #fff;
    font-family: inherit;
    color: var(--sga-ink);
    transition: border-color .15s ease, box-shadow .15s ease, background .15s ease;
}

.sga-field input:focus,
.sga-field select:focus,
.sga-field textarea:focus,
.sga-select:focus {
    outline: none;
    border-color: var(--sga-primary);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--sga-primary) 18%, transparent);
}

.sga-field input:hover,
.sga-field select:hover,
.sga-field textarea:hover,
.sga-select:hover {
    border-color: color-mix(in srgb, var(--sga-primary) 28%, var(--sga-border));
}

.sga-field textarea {
    min-height: 6rem;
    resize: vertical;
}

/* Pedido do usuário (2026-09-14, "melhorar UX" das telas de busca) -
   ícone de lupa dentro do próprio campo, em vez de um input pelado. */
.sga-search-input {
    position: relative;
}

.sga-search-input svg {
    position: absolute;
    left: .75rem;
    top: 50%;
    transform: translateY(-50%);
    width: 1.1rem;
    height: 1.1rem;
    color: var(--sga-ink-muted);
    pointer-events: none;
}

.sga-search-input input {
    width: 100%;
    padding: .65rem .8rem .65rem 2.4rem;
    border: 1px solid var(--sga-border);
    border-radius: .5rem;
    font-size: .95rem;
    background: #fff;
    font-family: inherit;
}

.sga-search-input input:focus {
    outline: none;
    border-color: var(--sga-primary);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--sga-primary) 18%, transparent);
}

.sga-error {
    margin: -.5rem 0 1rem;
    color: #B42318;
    font-size: .85rem;
}

.sga-btn-primary {
    width: 100%;
    padding: .75rem 1rem;
    border: 0;
    border-radius: .5rem;
    background: var(--sga-primary);
    color: #fff;
    font-size: .95rem;
    font-weight: 600;
    cursor: pointer;
    box-shadow: 0 8px 18px color-mix(in srgb, var(--sga-primary) 24%, transparent);
    transition: background .15s ease, box-shadow .15s ease, transform .15s ease;
}

.sga-btn-primary:hover {
    background: var(--sga-primary-dark);
    box-shadow: 0 10px 24px color-mix(in srgb, var(--sga-primary) 30%, transparent);
    transform: translateY(-1px);
}

.sga-btn-primary:disabled,
.sga-btn-primary[disabled] {
    cursor: not-allowed;
    opacity: .62;
    box-shadow: none;
    transform: none;
}

.sga-login__forgot {
    display: block;
    margin-top: 1rem;
    text-align: center;
    font-size: .9rem;
    /* Pedido do usuário (2026-09-19): cor própria, separada da cor do
       botão "Entrar" - sem definir, cai pra --sga-login-accent (que por
       sua vez cai pra --sga-primary). */
    color: var(--sga-login-forgot, var(--sga-login-accent, var(--sga-primary)));
    text-decoration: none;
}

/* Pedido do usuário (2026-09-19): cor do botão "Entrar" separada da Cor
   primária usada no resto do sistema - só dentro de `.sga-login`
   (login/esqueci senha/redefinir senha/MFA), nunca nas telas internas. */
.sga-login .sga-btn-primary {
    background: var(--sga-login-accent, var(--sga-primary));
    /* Pedido do usuário (2026-09-19): "uma coisa é a cor do botão,
       outra é o texto Entrar que está em branco" - cor do texto
       independente da cor de fundo acima. */
    color: var(--sga-login-btn-text, #fff);
    box-shadow: 0 8px 18px color-mix(in srgb, var(--sga-login-accent, var(--sga-primary)) 24%, transparent);
}

.sga-login .sga-btn-primary:hover {
    background: color-mix(in srgb, var(--sga-login-accent, var(--sga-primary)) 72%, black);
    box-shadow: 0 10px 24px color-mix(in srgb, var(--sga-login-accent, var(--sga-primary)) 30%, transparent);
}

.sga-login__forgot:hover { text-decoration: underline; }

.sga-login__footnote {
    margin-top: 1.75rem;
    text-align: center;
    font-size: .78rem;
    color: var(--sga-ink-muted);
}

/* ---------- Shell/menu lateral (MVP-16, tela 02) ---------- */
/* `--sga-nav-*` já existiam desde o MVP-01 (Branding::cssVariables()),
   só sem uso real até aqui - a sidebar é exatamente pra onde foram
   desenhadas. Renderizada só quando o usuário logado tem pelo menos um
   módulo de staff visível (ver o View Composer em
   AppServiceProvider::boot()) - visitante (login) e Portal do Aluno
   continuam sem shell, como cartão centralizado. */

.sga-shell {
    display: flex;
    min-height: 100vh;
}

.sga-shell__sidebar {
    flex: 0 0 15rem;
    width: 15rem;
    display: flex;
    flex-direction: column;
    padding: 1.5rem 1rem;
    background: linear-gradient(180deg, var(--sga-nav-bg-start), var(--sga-nav-bg-end));
}

/* `.sga-shell__topbar` (brand + botão hambúrguer) e `.sga-shell__mobile-
   panel` (nav + recolher + usuário) - `display:contents` no desktop faz
   esses dois wrappers "sumirem" da árvore de layout, então os netos
   continuam participando do flex-column de `.sga-shell__sidebar`
   exatamente como antes de existirem (nenhuma mudança visual no
   desktop). Só viram elementos "de verdade" dentro do media query
   mobile abaixo. */
.sga-shell__topbar,
.sga-shell__mobile-panel {
    display: contents;
}

.sga-shell__menu-toggle { display: none; }

.sga-shell__brand {
    display: flex;
    align-items: center;
    gap: .75rem;
    margin-bottom: 1.5rem;
    color: #fff;
    text-decoration: none;
}

/* Achado do pedido de 2026-09-12 ("mesmo padrão visual do menu lateral
   do Dash"): a "marca" do plugin Moodle (`.local-dashboard-app__brand-
   mark`) é uma caixa arredondada com gradiente, não só um <img> solto -
   mesmo tratamento aqui, usando os tokens de cor que já existiam desde
   o MVP-01 sem uso real (`--sga-logo-bg-start/end`). Quando há logo
   customizado (Aparência), a caixa vira só a moldura da imagem. */
.sga-shell__brand-mark {
    width: 40px;
    height: 40px;
    flex-shrink: 0;
    border-radius: 10px;
    background: linear-gradient(135deg, var(--sga-logo-bg-start), var(--sga-logo-bg-end));
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.1rem;
    font-weight: 700;
    color: #fff;
    overflow: hidden;
}

.sga-shell__brand-mark img {
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
}

.sga-shell__brand-name {
    font-weight: 700;
    font-size: 1rem;
    line-height: 1.25;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sga-shell__nav {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: .2rem;
}

/* Pedido do usuário (2026-09-15): seletor de "Cliente ativo", primeiro
   item do menu (só platform.manage-tenants) - select claro/legível
   sobre o fundo escuro da sidebar (ao contrário dos links de navegação,
   que herdam a cor clara do texto). Borda de destaque (cor de acento da
   marca, já usada no item ativo do menu) sinaliza visualmente "você não
   está mais na visão global do SIGA" sempre que um cliente está
   selecionado - erro de operador aqui (achar que está num cliente
   quando na verdade voltou pro SIGA, ou vice-versa) é o tipo de engano
   que este destaque existe pra evitar. */
.sga-shell__tenant-selector {
    margin: 0 0 .5rem;
    padding: 0 .75rem;
}

.sga-shell__tenant-selector--active {
    margin: 0 0 .58rem;
    padding: 0 .75rem;
    border: 0;
    border-radius: 0;
    background: transparent;
    box-shadow: none;
}

.sga-shell__tenant-selector label {
    display: block;
    margin: 0 0 .3rem;
    color: rgba(255, 255, 255, .3);
    font-size: .62rem;
    font-weight: 700;
    letter-spacing: .09em;
    text-transform: uppercase;
}

.sga-shell__tenant-selector--active label {
    color: color-mix(in srgb, #FBBF24 42%, #fff);
}

.sga-shell__tenant-selector select {
    width: 100%;
    padding: .5rem .6rem;
    border: 1px solid rgba(255, 255, 255, .25);
    border-radius: .4rem;
    background: rgba(255, 255, 255, .08);
    color: #fff;
    font-size: .82rem;
    font-family: inherit;
}

.sga-shell__tenant-selector select:has(option:checked:not([value=""])) {
    border-color: color-mix(in srgb, #F59E0B 58%, #fff);
    background:
        linear-gradient(135deg, color-mix(in srgb, #F59E0B 24%, rgba(255, 255, 255, .12)), rgba(255, 255, 255, .1));
    box-shadow: 0 0 0 2px color-mix(in srgb, #F59E0B 14%, transparent);
    color: #fff;
    font-weight: 600;
}

.sga-shell__tenant-selector select option { color: var(--sga-ink); }

.sga-shell__tenant-active {
    display: inline-flex;
    margin-top: .42rem;
    padding: .2rem .48rem;
    border-radius: 999px;
    background: color-mix(in srgb, var(--sga-nav-accent) 30%, rgba(255, 255, 255, .1));
    color: #fff;
    font-size: .66rem;
    font-weight: 800;
    letter-spacing: .04em;
    text-transform: uppercase;
}

.sga-shell__tenant-warning {
    display: inline-flex;
    margin-top: .35rem;
    padding: .18rem .42rem;
    border-radius: 999px;
    background: #FEF3C7;
    color: #92400E;
    font-size: .66rem;
    font-weight: 800;
}

html.sga-collapsed .sga-shell__tenant-selector { display: none; }

/* Pedido do usuário (2026-09-16): "sem organização e hierarquia
   visual" - o cabeçalho de categoria (Acadêmico, Administração etc.)
   e os itens dentro dela vinham com o MESMO peso visual (mesmo
   tamanho/peso de fonte), impossível distinguir "isto é uma categoria"
   de "isto é um link" à primeira vista. Cabeçalho agora é
   deliberadamente mais discreto que um link de verdade (menor,
   maiúsculo, cor apagada, sem fundo/borda) - um rótulo de seção, não
   mais um item clicável disfarçado; os links dentro dela (`.sga-shell__nav-group-items
   .sga-shell__nav-link`) continuam com o peso normal de link e ganham
   uma guia vertical à esquerda, deixando a hierarquia grupo → item
   visível mesmo sem ler o texto. Existia um segundo bloco de regras
   pro mesmo seletor mais adiante no arquivo, com `!important`,
   anulando esta distinção de propósito (comentário de lá dizia
   "cabeçalho deve parecer item clicável, não separador apagado") -
   removido; a distinção agora É a intenção. */
.sga-shell__nav-group {
    margin-top: .3rem;
}

.sga-shell__nav-group-label {
    display: flex;
    align-items: center;
    gap: .55rem;
    margin: 0;
    padding: .4rem .75rem;
    border: 0;
    border-radius: .4rem;
    color: color-mix(in srgb, var(--sga-nav-link-color) 58%, transparent);
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .07em;
    text-transform: uppercase;
    cursor: pointer;
    list-style: none;
    position: relative;
    transition: background .15s ease, color .15s ease;
}

.sga-shell__nav-group-label::-webkit-details-marker { display: none; }

.sga-shell__nav-group-label:hover {
    background: color-mix(in srgb, var(--sga-nav-accent) 10%, transparent);
    color: color-mix(in srgb, var(--sga-nav-link-color) 92%, #fff);
}

.sga-shell__nav-group-label--active {
    color: color-mix(in srgb, var(--sga-nav-link-color) 92%, #fff);
}

.sga-shell__nav-group-label .sga-shell__nav-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1rem;
    height: 1rem;
    opacity: .8;
}

.sga-shell__nav-group-label .sga-shell__nav-icon svg {
    width: 100%;
    height: 100%;
}

.sga-shell__nav-group-chevron {
    margin-left: auto;
    width: .8rem;
    height: .8rem;
    flex-shrink: 0;
    opacity: .55;
    transition: transform .15s ease;
}

.sga-shell__nav-group[open] .sga-shell__nav-group-chevron {
    transform: rotate(180deg);
}

.sga-shell__nav-group-items {
    display: grid;
    gap: .08rem;
    margin: .15rem 0 .4rem .95rem;
    padding-left: .55rem;
    border-left: 1px solid rgba(255, 255, 255, .1);
    overflow: hidden;
    transform-origin: top;
}

.sga-shell__nav-group[open] .sga-shell__nav-group-items {
    animation: sgaNavGroupExpand .18s ease-out;
}

@keyframes sgaNavGroupExpand {
    from {
        opacity: 0;
        transform: translateY(-.25rem) scaleY(.96);
    }

    to {
        opacity: 1;
        transform: translateY(0) scaleY(1);
    }
}

.sga-shell__nav-group-items .sga-shell__nav-link {
    padding: .5rem .65rem;
    font-size: .85rem;
    font-weight: 500;
    letter-spacing: 0;
    text-transform: none;
}

.sga-shell__nav-group-label:first-of-type { margin-top: .35rem; }

/* Pedido do usuário (2026-09-16): "Início" e um item solto de topo
   como "Usuários" (fora de qualquer categoria - ver AppServiceProvider)
   em CAIXA ALTA, igual aos cabeçalhos de categoria (`.sga-shell__nav-group-label`)
   - mesma convenção visual em todo item de PRIMEIRO NÍVEL da sidebar.
   Os itens DENTRO de uma categoria (Cursos, Alunos etc.) continuam em
   caixa normal - a regra mais específica logo abaixo
   (`.sga-shell__nav-group-items .sga-shell__nav-link`) desfaz isto de
   propósito, pra manter a hierarquia: caixa alta identifica "nível
   superior" (categoria ou item solto de topo), caixa normal identifica
   "está dentro de uma categoria". */
.sga-shell__nav-link {
    display: flex;
    align-items: center;
    gap: .65rem;
    padding: .55rem .75rem;
    border-radius: .5rem;
    color: var(--sga-nav-link-color);
    text-decoration: none;
    /* Pedido do usuário (2026-09-16): mesmo tamanho dos cabeçalhos de
       categoria (`.sga-shell__nav-group-label`) - tamanho/peso/
       espaçamento idênticos, só a cor continua mais viva (é link de
       verdade, não um rótulo de seção). */
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .07em;
    text-transform: uppercase;
    position: relative;
    transition: background .15s ease, color .15s ease;
}

/* Pedido do usuário (2026-09-12, "faltou alguns itens no front") - um
   ícone por item, mesmo padrão do anexo de referência. `currentColor`
   no SVG (ver x-nav-icon) - acompanha a cor do link sozinho. */
.sga-shell__nav-icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1.2rem;
    height: 1.2rem;
    flex-shrink: 0;
}

.sga-shell__nav-icon svg { width: 100%; height: 100%; }

/* Mesma fórmula do Dash (`.local-dashboard-app__nav-item:hover`): tint
   translúcido da cor de destaque via color-mix(), não um cinza neutro -
   acompanha qualquer paleta que a instituição configure em Aparência. */
.sga-shell__nav-link:hover {
    background: color-mix(in srgb, var(--sga-nav-accent) 14%, transparent);
    color: #fff;
}

/* Idem `.local-dashboard-app__nav-item--active`: gradiente sutil (não
   mais um bloco sólido) + barra de destaque à esquerda com glow. */
.sga-shell__nav-link--active {
    background: linear-gradient(
        90deg,
        color-mix(in srgb, var(--sga-nav-accent) 28%, transparent),
        color-mix(in srgb, var(--sga-nav-accent) 10%, transparent)
    );
    color: #fff;
    font-weight: 600;
}

.sga-shell__nav-link--active::before {
    content: '';
    position: absolute;
    left: 0;
    top: .35rem;
    bottom: .35rem;
    width: 3px;
    border-radius: 0 3px 3px 0;
    background: var(--sga-nav-accent);
    box-shadow: 0 0 8px color-mix(in srgb, var(--sga-nav-accent) 70%, transparent);
}

/* Pedido do usuário (2026-09-12): "opção de recolher o menu" - botão
   com o mesmo visual/hover de um item de menu (não destoa), mas é
   <button>, não <a> (reset de estilo nativo). */
.sga-shell__collapse-toggle {
    display: flex;
    align-items: center;
    gap: .65rem;
    width: 100%;
    margin-top: .5rem;
    padding: .55rem .75rem;
    border: none;
    border-radius: .5rem;
    background: none;
    color: var(--sga-nav-link-color);
    font-family: inherit;
    font-size: .88rem;
    font-weight: 500;
    cursor: pointer;
    transition: background .15s ease, color .15s ease;
}

.sga-shell__collapse-toggle:hover {
    background: color-mix(in srgb, var(--sga-nav-accent) 14%, transparent);
    color: #fff;
}

.sga-shell__collapse-icon {
    width: 1.2rem;
    flex-shrink: 0;
    text-align: center;
    font-size: 1rem;
    transition: transform .2s ease;
}

.sga-shell__sidebar-logout {
    margin: .75rem 0 .25rem;
}

.sga-shell__logout-button {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    width: 100%;
    min-height: 2.35rem;
    padding: .58rem .75rem;
    border: 1px solid #FECACA;
    border-radius: .55rem;
    background: rgba(255, 247, 247, .96);
    color: #B42318;
    cursor: pointer;
    font-family: inherit;
    font-size: .84rem;
    font-weight: 800;
    transition: background .15s ease, border-color .15s ease, transform .15s ease;
}

.sga-shell__logout-button svg {
    width: 1.05rem;
    height: 1.05rem;
    flex-shrink: 0;
}

.sga-shell__logout-button:hover {
    border-color: #FCA5A5;
    background: #FEE2E2;
    transform: translateY(-1px);
}

/* Iniciais do usuário logado (pedido do usuário, 2026-09-12, anexo com
   avatar circular) - mesmas cores da "marca" (--sga-logo-bg-*), sem
   precisar de foto de perfil por padrão (ver User::avatarUrl() pra
   quando existe uma foto de verdade, F3-XX 2026-09-13). Usado hoje só
   no gatilho do menu de perfil no topo (ver `.sga-shell__profile`
   abaixo) - morava no rodapé da sidebar até o pedido de 2026-09-14
   ("como no Moodle") mover pra lá. */
.sga-shell__user-avatar {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.1rem;
    height: 2.1rem;
    flex-shrink: 0;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--sga-logo-bg-start), var(--sga-logo-bg-end));
    color: #fff;
    font-size: .78rem;
    font-weight: 700;
    text-transform: uppercase;
}

/* Pedido do usuário (2026-09-12): "opção de recolher o menu" - a classe
   vai no <html> (não em `.sga-shell`), porque o script anti-flash do
   <head> (antes do body existir) só tem acesso a `document.
   documentElement` nesse momento. Some só o TEXTO (rótulos) - ícone,
   marca e barra de destaque continuam visíveis, sidebar vira uma
   coluna estreita só de ícones (o menu de perfil não mora mais aqui
   desde 2026-09-14, então não participa deste recolhimento). */
/* Achado do teste manual do usuário: "recolher" só faz sentido no
   layout de sidebar VERTICAL (desktop) - em mobile a sidebar já vira
   topbar horizontal (`@media max-width:860px` abaixo) e o estado
   colapsado, salvo em localStorage de uma sessão desktop anterior,
   entrava em conflito e quebrava o layout inteiro (a sidebar ficava
   ocupando a tela toda). Por isso todo o bloco abaixo só existe a
   partir de 861px - abaixo disso, `.sga-collapsed` no <html> não tem
   nenhum efeito, o layout mobile manda sozinho. */
@media (min-width: 861px) {
    /* `flex: 0 0 15rem` do estado normal fixa o `flex-basis` em 15rem,
       que tem prioridade sobre `width` sozinho no eixo do flex - por
       isso o `width` sozinho não bastava (2º achado do mesmo teste:
       menu recolhido ficava largo demais). Precisa sobrescrever o
       `flex` inteiro, não só a largura. */
    html.sga-collapsed .sga-shell__sidebar { flex: 0 0 4.25rem; width: 4.25rem; }

    html.sga-collapsed .sga-shell__nav-label,
    html.sga-collapsed .sga-shell__nav-group-chevron,
    html.sga-collapsed .sga-shell__brand-name {
        display: none;
    }

    html.sga-collapsed .sga-shell__brand,
    html.sga-collapsed .sga-shell__nav-link,
    html.sga-collapsed .sga-shell__nav-group-label,
    html.sga-collapsed .sga-shell__logout-button,
    html.sga-collapsed .sga-shell__collapse-toggle {
        justify-content: center;
    }

    html.sga-collapsed .sga-shell__nav-group-items {
        margin: .12rem 0;
        padding-left: 0;
        border-left: 0;
    }

    html.sga-collapsed .sga-shell__nav-group-items .sga-shell__nav-link {
        padding-left: .75rem;
    }

    html.sga-collapsed .sga-shell__sidebar-logout {
        margin-top: .75rem;
    }

    html.sga-collapsed .sga-shell__logout-button {
        min-height: 2.35rem;
        padding: .55rem 0;
    }

    html.sga-collapsed .sga-shell__collapse-icon { transform: rotate(180deg); }
}

.sga-shell__main {
    flex: 1;
    min-width: 0;
    overflow-x: auto;
}

/* ---------- Menu de perfil no topo (pedido do usuário, 2026-09-14:
   "como no Moodle") ---------- */
/* Barra fixa no topo da ÁREA DE CONTEÚDO (dentro de `.sga-shell__main`,
   não da sidebar) - existe em toda tela que tem sidebar, staff e
   Portal do Aluno igualmente, já que os dois usam o mesmo componente
   de shell. */
.sga-shell__header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 1rem;
    padding: .75rem 1.5rem;
    background: #fff;
    border-bottom: 1px solid var(--sga-border);
}

/* ---------- Trilha de navegação + botão voltar (pedido do usuário,
   2026-09-15: "botão voltar atraente e moderno" + "menu de hierarquia
   para saber onde estamos navegando") ----------
   Substitui os ~75 links de rodapé "← Voltar para X" (texto simples,
   azul sublinhado) por isto no topo de toda tela com sidebar - lado
   ESQUERDO do `.sga-shell__header`, que antes só tinha o menu de
   perfil à direita (`justify-content:flex-end`). `$trail` vem de
   `<x-layouts.app :trail="[...]">` por página (ver comentário em
   components/layouts/app.blade.php); sem ela, cai num padrão mínimo de
   2 níveis (Início > título da página) - toda tela ganha ALGUMA trilha
   e botão voltar, mesmo antes de eu revisar cada view individualmente. */
.sga-shell__nav-trail {
    display: flex;
    align-items: center;
    gap: .5rem;
    min-width: 0;
}

.sga-back-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    flex: none;
    width: 2rem;
    height: 2rem;
    border-radius: 50%;
    background: color-mix(in srgb, var(--sga-bg) 72%, #fff);
    color: var(--sga-primary);
    text-decoration: none;
    transition: background .15s ease, transform .15s ease;
}

.sga-back-btn:hover {
    background: color-mix(in srgb, var(--sga-primary) 12%, var(--sga-bg));
    transform: translateX(-2px);
}

.sga-back-btn svg { width: 1.1rem; height: 1.1rem; }

.sga-breadcrumb {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .34rem;
    font-size: .82rem;
    min-width: 0;
}

.sga-breadcrumb a {
    color: var(--sga-ink-muted);
    text-decoration: none;
    font-weight: 500;
    white-space: nowrap;
}

.sga-breadcrumb a:hover {
    color: var(--sga-primary);
    text-decoration: underline;
}

.sga-breadcrumb__sep {
    color: var(--sga-border);
    font-size: .75rem;
}

.sga-breadcrumb__current {
    color: var(--sga-ink);
    font-weight: 600;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Em celular, a trilha completa raramente cabe do lado do avatar - some
   o meio dela, mantendo só o botão voltar (sempre útil) e o nome da
   página atual (o que importa saber "onde estou"). */
@media (max-width: 640px) {
    .sga-breadcrumb a,
    .sga-breadcrumb__sep { display: none; }
}

.sga-shell__profile {
    position: relative;
    display: flex;
    align-items: center;
    gap: .65rem;
}

.sga-shell__notification-bell {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.35rem;
    height: 2.35rem;
    border-radius: 50%;
    border: 1px solid var(--sga-border);
    background: #fff;
    color: var(--sga-ink);
    cursor: pointer;
    font-family: inherit;
    text-decoration: none;
    box-shadow: 0 8px 18px rgba(15, 23, 42, .05);
    transition: background .15s ease, color .15s ease, border-color .15s ease, transform .15s ease;
}

.sga-shell__notification-bell:hover {
    border-color: color-mix(in srgb, var(--sga-primary) 22%, var(--sga-border));
    background: color-mix(in srgb, var(--sga-primary) 7%, #fff);
    color: var(--sga-primary);
    transform: translateY(-1px);
}

.sga-shell__notification-bell .sga-shell__nav-icon {
    width: 1.34rem;
    height: 1.34rem;
    opacity: 1;
}

.sga-shell__notification-bell span {
    position: absolute;
    top: .1rem;
    right: .05rem;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 1rem;
    height: 1rem;
    padding: 0 .22rem;
    border: 2px solid #fff;
    border-radius: 999px;
    background: #EF4444;
    color: #fff;
    font-size: .6rem;
    font-weight: 800;
    line-height: 1;
    box-shadow: 0 0 0 1px rgba(239, 68, 68, .08);
}

.sga-shell__notification-menu {
    display: none;
    position: absolute;
    top: calc(100% + .5rem);
    right: 0;
    width: min(22rem, calc(100vw - 1.5rem));
    max-height: min(32rem, calc(100vh - 6rem));
    overflow: hidden;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    background: #fff;
    box-shadow: 0 14px 34px rgba(15, 23, 42, .16);
    z-index: 70;
}

.sga-shell__notification-menu--open {
    display: block;
}

.sga-shell__notification-menu-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: .85rem .95rem;
    border-bottom: 1px solid var(--sga-border);
}

.sga-shell__notification-menu-header strong {
    color: var(--sga-ink);
    font-size: .92rem;
}

.sga-shell__notification-menu-header a {
    color: var(--sga-primary);
    font-size: .78rem;
    font-weight: 800;
    text-decoration: none;
}

.sga-shell__notification-list {
    display: grid;
    max-height: 27rem;
    overflow: auto;
    padding: .45rem;
    gap: .35rem;
}

.sga-shell__notification-item {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    gap: .75rem;
    align-items: start;
    padding: .72rem;
    border: 1px solid transparent;
    border-radius: .58rem;
    background: #fff;
}

.sga-shell__notification-item--unread {
    border-color: color-mix(in srgb, var(--sga-primary) 18%, var(--sga-border));
    background: color-mix(in srgb, var(--sga-primary) 5%, #fff);
}

.sga-shell__notification-item strong {
    display: block;
    color: var(--sga-ink);
    font-size: .84rem;
    line-height: 1.25;
}

.sga-shell__notification-item p {
    margin: .16rem 0;
    color: var(--sga-ink);
    font-size: .8rem;
    line-height: 1.3;
}

.sga-shell__notification-item small,
.sga-shell__notification-item > span {
    color: var(--sga-ink-muted);
    font-size: .72rem;
    font-weight: 700;
}

.sga-shell__notification-item form {
    margin: 0;
}

.sga-shell__notification-item button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 1.9rem;
    padding: .34rem .55rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 24%, var(--sga-border));
    border-radius: 999px;
    background: #fff;
    color: var(--sga-primary);
    cursor: pointer;
    font-family: inherit;
    font-size: .72rem;
    font-weight: 800;
    white-space: nowrap;
}

.sga-shell__notification-item button:hover {
    background: color-mix(in srgb, var(--sga-primary) 8%, #fff);
}

.sga-shell__notification-empty {
    margin: 0;
    padding: 1.1rem .9rem;
    color: var(--sga-ink-muted);
    font-size: .84rem;
}

.sga-impersonation-banner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin: 1rem 2rem 0;
    padding: .82rem 1rem;
    border: 1px solid #FBBF24;
    border-radius: .75rem;
    background: #FFFBEB;
    color: #78350F;
    box-shadow: 0 10px 24px rgba(146, 64, 14, .08);
}

.sga-impersonation-banner div {
    display: grid;
    gap: .15rem;
}

.sga-impersonation-banner strong {
    color: #92400E;
    font-size: .88rem;
}

.sga-impersonation-banner span {
    font-size: .82rem;
    line-height: 1.35;
}

.sga-impersonation-banner form {
    margin: 0;
}

.sga-impersonation-banner button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 2.15rem;
    padding: .45rem .75rem;
    border: 1px solid #D97706;
    border-radius: .55rem;
    background: #fff;
    color: #92400E;
    cursor: pointer;
    font-family: inherit;
    font-size: .78rem;
    font-weight: 800;
    white-space: nowrap;
}

.sga-impersonation-banner button:hover {
    background: #FEF3C7;
}

.sga-shell__profile-trigger {
    display: flex;
    align-items: center;
    gap: .6rem;
    background: none;
    border: none;
    padding: .3rem .5rem .3rem .3rem;
    border-radius: 2rem;
    cursor: pointer;
    font-family: inherit;
    transition: background .15s ease;
}

.sga-shell__profile-trigger:hover {
    background: var(--sga-bg);
}

.sga-shell__profile-name {
    font-size: .88rem;
    font-weight: 600;
    color: var(--sga-ink);
}

.sga-shell__profile-chevron {
    font-size: .65rem;
    color: var(--sga-ink-muted);
}

/* Escondido por padrão - `sgaToggleProfileMenu()` alterna esta classe.
   `display:none`/`block` (não animação) - mesma simplicidade do resto
   dos toggles deste projeto (recolher menu, hambúrguer mobile). */
.sga-shell__profile-menu {
    display: none;
    position: absolute;
    top: calc(100% + .5rem);
    right: 0;
    min-width: 13rem;
    background: #fff;
    border: 1px solid var(--sga-border);
    border-radius: .6rem;
    box-shadow: 0 10px 28px rgba(0, 0, 0, .14);
    padding: .4rem;
    z-index: 60;
}

.sga-shell__profile-menu--open {
    display: block;
}

.sga-shell__profile-menu a,
.sga-shell__profile-menu button {
    display: block;
    width: 100%;
    padding: .55rem .7rem;
    border-radius: .4rem;
    background: none;
    border: none;
    text-align: left;
    color: var(--sga-ink);
    text-decoration: none;
    font-size: .85rem;
    font-family: inherit;
    cursor: pointer;
}

.sga-shell__profile-menu a:hover,
.sga-shell__profile-menu button:hover {
    background: var(--sga-bg);
}

/* Nome escondido em telas estreitas (o avatar + seta já bastam pra
   sinalizar "menu de conta"; nome completo ao lado do hambúrguer
   sobraria pouco espaço pro conteúdo da página em celular). */
@media (max-width: 640px) {
    .sga-shell__profile-name { display: none; }
    .sga-shell__header { padding: .6rem 1rem; }
    .sga-impersonation-banner {
        display: grid;
        margin: .8rem 1rem 0;
    }
    .sga-impersonation-banner button {
        width: 100%;
    }
    .sga-shell__notification-menu {
        right: -.25rem;
        width: min(20rem, calc(100vw - 1rem));
    }
    .sga-shell__notification-item { grid-template-columns: 1fr; }
    .sga-shell__notification-item button { width: 100%; }
}

/* Achado do teste manual do usuário em viewport de smartphone real
   (375px): a topbar horizontal antiga (todo item de menu numa linha,
   quebrando texto) virava uma parede de texto vertical, empurrando o
   conteúdo da página inteiro pra fora da tela - não era "responsivo"
   de verdade, só reagia à largura. Modelo novo: barra fixa compacta
   (logo + hambúrguer) e um painel-gaveta que abre por cima do
   conteúdo (nunca empurra o resto da página), fechado por padrão. */
@media (max-width: 860px) {
    .sga-shell { flex-direction: column; }

    .sga-shell__sidebar {
        width: auto;
        flex: 0 0 auto;
        flex-direction: column;
        padding: 0;
        position: relative;
        z-index: 40;
    }

    .sga-shell__topbar {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: .75rem 1rem;
    }

    .sga-shell__brand { margin-bottom: 0; }

    .sga-shell__menu-toggle {
        display: flex;
        flex-direction: column;
        justify-content: center;
        gap: 4px;
        width: 2.25rem;
        height: 2.25rem;
        flex-shrink: 0;
        background: none;
        border: none;
        padding: 0;
        cursor: pointer;
    }

    .sga-shell__menu-toggle span {
        display: block;
        height: 2px;
        border-radius: 2px;
        background: #fff;
    }

    /* Fechado por padrão: altura zero + overflow escondido (não
       `display:none`, pra transição de abertura poder animar). Flutua
       por cima do conteúdo (`position:absolute`) - abrir/fechar nunca
       empurra `.sga-shell__main` pra baixo/cima. */
    .sga-shell__mobile-panel {
        display: block;
        position: absolute;
        top: 100%;
        left: 0;
        right: 0;
        max-height: 0;
        overflow: hidden;
        background: linear-gradient(180deg, var(--sga-nav-bg-start), var(--sga-nav-bg-end));
        transition: max-height .25s ease;
    }

    .sga-shell--menu-open .sga-shell__mobile-panel {
        max-height: calc(100vh - 3.5rem);
        overflow-y: auto;
        padding: 0 1rem 1rem;
        box-shadow: 0 12px 24px rgba(0, 0, 0, .25);
    }

    .sga-shell__nav { flex-direction: column; gap: .2rem; }

    .sga-shell__sidebar-logout {
        margin: .85rem 0 0;
    }

    /* "Recolher" é um conceito de sidebar vertical - em mobile ela já
       é uma gaveta que fecha sozinha, o botão não faria sentido. */
    .sga-shell__collapse-toggle { display: none; }
}

/* ---------- Movimento/fluidez (pedido do usuário, 2026-09-14)
   ---------- */
/* "Cada página ter algum efeito de movimento" - entrada suave (fade +
   leve deslocamento vertical), nunca um framework de animação: só CSS,
   mesmo espírito "sem dependência nova" do resto do projeto. Aplicado
   nos contêineres que já envolvem quase toda tela do sistema
   (`.sga-page`/`.sga-page--wide` cobre tudo que não é a tela de
   login, que usa `.sga-login__panel`), então uma página nova herda o
   efeito de graça, sem precisar lembrar de aplicar em lugar nenhum.
   `prefers-reduced-motion` sempre respeitado - movimento é estética,
   nunca deve ser imposto a quem pediu pro sistema operacional reduzir
   animações. */
@keyframes sgaFadeInUp {
    from { opacity: 0; transform: translateY(10px); }
    to { opacity: 1; transform: translateY(0); }
}

.sga-page,
.sga-login__panel,
.sga-kpi-card,
.sga-course-card {
    animation: sgaFadeInUp .35s ease both;
}

/* Cartões da mesma grade entram em cascata (pequeno atraso crescente)
   em vez de todos ao mesmo tempo - reforça a sensação de fluidez sem
   atrasar a leitura (a diferença total entre o 1º e o último cartão é
   inferior a 1/4 de segundo). */
.sga-kpi-grid .sga-kpi-card:nth-child(1) { animation-delay: .02s; }
.sga-kpi-grid .sga-kpi-card:nth-child(2) { animation-delay: .06s; }
.sga-kpi-grid .sga-kpi-card:nth-child(3) { animation-delay: .1s; }
.sga-kpi-grid .sga-kpi-card:nth-child(4) { animation-delay: .14s; }
.sga-kpi-grid .sga-kpi-card:nth-child(5) { animation-delay: .18s; }
.sga-kpi-grid .sga-kpi-card:nth-child(6) { animation-delay: .22s; }
.sga-kpi-grid .sga-kpi-card:nth-child(7) { animation-delay: .26s; }
.sga-kpi-grid .sga-kpi-card:nth-child(8) { animation-delay: .3s; }

.sga-course-grid .sga-course-card:nth-child(1) { animation-delay: .04s; }
.sga-course-grid .sga-course-card:nth-child(2) { animation-delay: .08s; }
.sga-course-grid .sga-course-card:nth-child(3) { animation-delay: .12s; }
.sga-course-grid .sga-course-card:nth-child(4) { animation-delay: .16s; }

@media (prefers-reduced-motion: reduce) {
    .sga-page,
    .sga-login__panel,
    .sga-kpi-card,
    .sga-course-card {
        animation: none;
    }
}

/* ---------- Páginas internas simples (Usuários, formulários) ---------- */

/* Pedido do usuário (2026-09-16): "padronizar tamanho das divs das
   páginas, hoje cada página tem uma largura" - antes existiam 6
   larguras diferentes (56/72/76/78/82rem) espalhadas em modificadores
   (`--wide`, `--users`, `--academic-list`, `--reports`,
   `--coordination`, `--platform`) sem critério nenhum. Agora toda
   página "de conteúdo" (formulário, listagem, tela de detalhe) usa os
   mesmos 78rem por padrão - só os DASHBOARDS reais (`--dashboard`/
   `--student-dashboard`, grades com layout de grid próprio, já
   tratados à parte em outras regras desta folha, ex. a barra
   gradiente do ::before) continuam com sua largura própria. */
/* Pedido do usuário (2026-09-16): "em resoluções menores acaba não
   tendo margens" - `margin: auto` só cria respiro lateral quando o
   elemento é mais estreito que o pai; sem uma `width` própria, o
   card simplesmente preenche 100% do `.sga-shell__main` em qualquer
   viewport mais estreito que `max-width`, encostando nas bordas. O
   `calc()` abaixo reserva 1.5rem de cada lado SEMPRE, mesmo nessas
   resoluções, e ainda deixa o `max-width` valer (com `margin: auto`
   centralizando de verdade) em telas grandes. */
/* Pedido do usuário (2026-09-17, print do painel "Colunas" cortado em
   "Unidades"): `overflow: hidden` aqui existia só pra arredondar a
   barra de gradiente do topo (::before, abaixo) - efeito colateral
   real: cortava QUALQUER elemento `position:absolute` que precisasse
   ultrapassar o card (o painel de "Colunas" das tabelas, e qualquer
   outro popover futuro), sem aviso nenhum de scroll. Removido daqui;
   a barra agora arredonda os PRÓPRIOS cantos de cima (ver ::before) -
   mesmo efeito visual, sem clipar o resto do card. */
.sga-page {
    position: relative;
    width: calc(100% - 3rem);
    max-width: 78rem;
    margin: 3rem auto;
    padding: 2rem;
    background: #fff;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    box-shadow: 0 12px 34px rgba(15, 23, 42, .05);
}

/* Achado do usuário (2026-09-17): `overflow-x: visible` aqui nunca
   fazia esta div rolar de verdade (era só um wrapper "de nome", sem
   efeito nenhum) - a tabela é quem tinha `overflow-x: auto`, mas isso é
   ignorado pelo navegador quando `border-collapse: collapse` está no
   mesmo elemento (regra do próprio modelo de tabela do CSS - ver
   comentário de `.sga-list-panel` mais abaixo). Corrigido pra `auto` de
   verdade - agora ESTE elemento é quem rola de fato. */
.sga-table-scroll {
    width: 100%;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* Pedido do usuário (2026-09-17): navegação horizontal só pelos ícones
   "<"/">" (`.sga-table-scroll-controls`, ver sga-table-enhance.js) -
   esconde a barra de rolagem NATIVA do navegador sem desligar o scroll
   em si (roda do mouse/trackpad continua funcionando, só a barra visual
   some). `scrollbar-width`/`-ms-overflow-style` cobrem Firefox/Edge
   legado; `::-webkit-scrollbar` cobre Chrome/Safari/Edge atual. */
.sga-table-scroll,
.sga-list-panel {
    scrollbar-width: none;
    -ms-overflow-style: none;
}

.sga-table-scroll::-webkit-scrollbar,
.sga-list-panel::-webkit-scrollbar {
    display: none;
}

.sga-table--users {
    min-width: 0;
    table-layout: fixed;
    font-size: .84rem;
}

.sga-table--users th,
.sga-table--users td {
    padding: .68rem .72rem;
}

.sga-table--users th:nth-child(1),
.sga-table--users td:nth-child(1) {
    width: 19%;
}

.sga-table--users th:nth-child(2),
.sga-table--users td:nth-child(2) {
    width: 19%;
}

/* Pedido do usuário (2026-09-16): coluna Perfis ganhou espaço de
   verdade - era 9% (com table-layout:fixed isso cortava o <select>
   a ponto de só sobrar "A"/"Fi"/"G" visível) e trocou de lugar com
   Instituição (Perfis primeiro). Achado do pedido seguinte
   ("diminuir a largura do select"/"tabela cortada"): a coluna de
   Ações é quem realmente precisava de mais espaço - `white-space:
   nowrap` nela não deixa os 4 ícones quebrarem linha, então uma
   coluna estreita demais "vazava" pra fora da tabela inteira (o
   scrollWidth da tabela crescia além do clientWidth mesmo com
   table-layout:fixed). */
.sga-table--users th:nth-child(3),
.sga-table--users td:nth-child(3) {
    width: 18%;
}

.sga-table--users th:nth-child(4),
.sga-table--users td:nth-child(4) {
    width: 16%;
}

.sga-table--users th:nth-child(5),
.sga-table--users td:nth-child(5) {
    width: 10%;
}

.sga-table--users th:nth-child(6),
.sga-table--users td:nth-child(6) {
    width: 18%;
}

/* Pedido do usuário (2026-09-17): achado testando o truncamento do
   e-mail - `.sga-table--rich .sga-table__title-cell { min-width:
   14rem }` (mesma especificidade, declarada DEPOIS no arquivo) vencia
   este `min-width: 0` no empate de especificidade, empurrando o nome
   pra fora da própria célula e por cima da coluna de e-mail. Selector
   composto (`--rich--users` juntos, sem espaço) sobe a especificidade
   de propósito, pra nunca mais depender da ordem das regras no
   arquivo. */
.sga-table--rich.sga-table--users .sga-table__title-cell {
    gap: .55rem !important;
    min-width: 0;
}

.sga-table--users .sga-table__avatar {
    width: 1.65rem;
    height: 1.65rem;
    margin-right: 0;
    font-size: .62rem;
}

.sga-table--users td:nth-child(1) {
    overflow-wrap: anywhere;
}

/* Pedido do usuário (2026-09-17): e-mail quebrando no meio da palavra
   em resoluções menores ("admin@santacasacuriti" / "ba.edu.br") ficava
   difícil de ler - em vez de quebrar, trunca com "..." numa linha só
   (o `title` no <td>, ver users/index.blade.php, mostra o e-mail
   inteiro ao passar o mouse). */
.sga-table--users td:nth-child(2) {
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}

.sga-table--users .sga-table__actions {
    min-width: 0;
    padding-right: 0;
}

.sga-table--users .sga-table__actions form,
.sga-table--users .sga-table__actions > a {
    margin-left: .16rem;
}

.sga-table--users .sga-table__actions a:has(svg:only-child),
.sga-table--users .sga-table__actions .sga-link-btn:has(svg:only-child) {
    width: 1.75rem;
    height: 1.75rem;
    padding: .34rem;
}

.sga-table--users .sga-table__actions svg {
    width: .9rem;
    height: .9rem;
}

.sga-role-badges {
    display: flex;
    flex-wrap: wrap;
    gap: .35rem;
}

.sga-role-badge {
    display: inline-flex;
    align-items: center;
    min-height: 1.55rem;
    padding: .24rem .58rem;
    border-radius: 999px;
    font-size: .72rem;
    font-weight: 800;
    line-height: 1.1;
    white-space: nowrap;
}

.sga-role-badge--admin {
    background: #FEE2E2;
    color: #991B1B;
}

.sga-role-badge--secretaria {
    background: #DBEAFE;
    color: #1D4ED8;
}

.sga-role-badge--financeiro {
    background: #FEF3C7;
    color: #92400E;
}

.sga-role-badge--aluno {
    background: #DCFCE7;
    color: #166534;
}

.sga-role-badge--academico {
    background: #E0F2FE;
    color: #0369A1;
}

.sga-role-badge--auditoria {
    background: #EDE9FE;
    color: #6D28D9;
}

.sga-role-badge--default {
    background: #F3F4F6;
    color: #4B5563;
}

.sga-role-select-form {
    display: flex;
    align-items: center;
    margin: 0;
}

.sga-role-select {
    width: 100%;
    min-width: 0;
    max-width: 12rem;
    min-height: 1.86rem;
    padding: .28rem 1.58rem .28rem .62rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 18%, var(--sga-border));
    border-radius: 999px;
    background: #fff;
    color: var(--sga-ink);
    font-family: inherit;
    font-size: .7rem;
    font-weight: 800;
}

.sga-role-select:hover,
.sga-role-select:focus {
    outline: none;
    border-color: color-mix(in srgb, var(--sga-primary) 42%, var(--sga-border));
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--sga-primary) 9%, transparent);
}

.sga-role-select.sga-role-badge--admin {
    border-color: #FECACA;
    background-color: #FEE2E2;
    color: #991B1B;
}

.sga-role-select.sga-role-badge--secretaria {
    border-color: #BFDBFE;
    background-color: #DBEAFE;
    color: #1D4ED8;
}

.sga-role-select.sga-role-badge--financeiro {
    border-color: #FDE68A;
    background-color: #FEF3C7;
    color: #92400E;
}

.sga-role-select.sga-role-badge--aluno {
    border-color: #BBF7D0;
    background-color: #DCFCE7;
    color: #166534;
}

.sga-role-select.sga-role-badge--academico {
    border-color: #BAE6FD;
    background-color: #E0F2FE;
    color: #0369A1;
}

.sga-role-select.sga-role-badge--auditoria {
    border-color: #DDD6FE;
    background-color: #EDE9FE;
    color: #6D28D9;
}

.sga-role-select.sga-role-badge--default {
    border-color: #E5E7EB;
    background-color: #F3F4F6;
    color: #4B5563;
}

.sga-role-select option {
    background: #fff;
    color: var(--sga-ink);
}

.sga-page:not(.sga-page--dashboard):not(.sga-page--student-dashboard)::before {
    content: '';
    position: absolute;
    inset: 0 0 auto;
    height: .32rem;
    /* Cantos de cima arredondados pra bater com o card (ver comentário
       de `.sga-page` acima) - só em cima, nunca embaixo (a barra
       termina em cheio dentro do card, não é uma borda). */
    border-radius: .75rem .75rem 0 0;
    background: linear-gradient(90deg, var(--sga-primary), var(--sga-nav-accent));
}

.sga-page-heading {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1.5rem;
}

.sga-page-heading > div {
    min-width: 0;
}

.sga-page__header-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: flex-end;
    gap: .6rem;
}

.sga-page__header-actions form {
    margin: 0;
}

.sga-btn-secondary {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 2.35rem;
    padding: .55rem .9rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 18%, var(--sga-border));
    border-radius: .55rem;
    background: #fff;
    color: var(--sga-primary);
    cursor: pointer;
    font-family: inherit;
    font-size: .88rem;
    font-weight: 800;
    text-decoration: none;
    transition: background .15s ease, border-color .15s ease, transform .15s ease;
}

.sga-btn-secondary:hover {
    border-color: var(--sga-primary);
    background: color-mix(in srgb, var(--sga-primary) 7%, #fff);
    transform: translateY(-1px);
}

/* Achado do teste manual do usuário (2026-09-12, "totalmente
   responsivo para navegação em smartphones"): em viewport de celular
   (375px), `padding:2rem` de cada lado sobrava pouquíssimo espaço útil,
   e o cabeçalho título+botão (`.sga-page__header`, `display:flex`
   sem quebra) ficava sobrepondo texto quando os dois não cabiam lado a
   lado na mesma linha. */
@media (max-width: 640px) {
    .sga-page { width: calc(100% - 1.5rem); margin: 1rem auto; padding: 1.25rem; border-radius: .5rem; }
    .sga-page-heading { display: grid; }
    .sga-page-heading .sga-btn-primary--inline { width: 100%; }
    .sga-page__header-actions {
        width: 100%;
        justify-content: stretch;
    }
    .sga-page__header-actions > *,
    .sga-page__header-actions form,
    .sga-page__header-actions a,
    .sga-page__header-actions button {
        width: 100%;
    }
}

.sga-page h1 {
    margin-top: 0;
    color: var(--sga-ink);
    font-size: 1.9rem;
    line-height: 1.12;
    letter-spacing: 0;
}

.sga-page:not(.sga-page--dashboard):not(.sga-page--student-dashboard) h1 {
    display: inline-flex;
    align-items: center;
    gap: .45rem;
}

.sga-page h2 {
    color: var(--sga-ink);
    font-size: 1.15rem;
    line-height: 1.25;
    letter-spacing: 0;
}

.sga-section-eyebrow {
    display: inline-flex;
    margin-bottom: .35rem;
    color: color-mix(in srgb, var(--sga-primary) 78%, var(--sga-ink));
    font-size: .72rem;
    font-weight: 800;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.sga-welcome-wave {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: .92em;
    height: .92em;
    font-size: .62em;
    line-height: 1;
    transform-origin: 70% 70%;
    vertical-align: .05em;
    filter: drop-shadow(0 2px 2px rgba(15, 23, 42, .16));
}

.sga-dashboard-hero h1 .sga-welcome-wave,
.sga-student-hero h1 .sga-welcome-wave {
    font-size: .7em;
}

/* Achado do anexo 1 do pedido de 2026-09-12 ("melhorar links"): nome de
   curso/candidato/pessoa como link em tabela e o padrão "← Voltar" que
   se repete em quase toda tela nunca tiveram estilo próprio - caíam no
   azul sublinhado padrão do navegador (122 ocorrências, levantado por
   busca). Regra única aqui - mesmo espírito do CSS-only global redesign
   de `.sga-table__actions a` (pós-MVP-16) - sem tocar em nenhuma das
   ~50 views que usam `.sga-page`. Exclui o que já tem tratamento
   próprio (botão-pílula, badge, botão primário) pra não dar conflito
   visual - achado do F2-05 (o link "Baixar documento" ficava com texto
   invisível: fundo vinho do `.sga-btn-primary` + cor de texto vinho
   desta regra, que tinha especificidade maior. Mesmo bug já afetava
   silenciosamente o "Acessar o Moodle" do Portal do Aluno desde a
   padronização visual original - corrigido aqui pra ambos de uma vez,
   sem ser achado de segurança). `.sga-menu-link` entra na exclusão pelo
   mesmo motivo (2026-09-15) - já tem cor/hover próprios. */
.sga-page a:not(.sga-link-btn):not(.sga-badge):not(.sga-btn-primary):not(.sga-menu-link):not(.sga-kpi-card):not(.sga-metric-bar):not(.sga-alert-badge):not(.sga-quick-action):not(.sga-student-task):not(.sga-course-card):not(.sga-activity-row):not(.sga-event-row):not(.sga-student-link-row):not(.sga-platform-step):not(.sga-platform-client-row):not(.sga-platform-context__link):not(.sga-student-course-row):not(.sga-student-feed-row) {
    color: var(--sga-primary);
    text-decoration: none;
    font-weight: 600;
}

.sga-page a:not(.sga-link-btn):not(.sga-badge):not(.sga-btn-primary):not(.sga-menu-link):not(.sga-kpi-card):not(.sga-metric-bar):not(.sga-alert-badge):not(.sga-quick-action):not(.sga-student-task):not(.sga-course-card):not(.sga-activity-row):not(.sga-event-row):not(.sga-student-link-row):not(.sga-platform-step):not(.sga-platform-client-row):not(.sga-platform-context__link):not(.sga-student-course-row):not(.sga-student-feed-row):hover {
    text-decoration: underline;
}

/* Dashboard (MVP-16) e outras telas com grade de cartões se beneficiam
   de mais largura que o cartão de formulário padrão. */
.sga-page--wide { max-width: 78rem; }
.sga-page--dashboard {
    max-width: 76rem;
    background:
        linear-gradient(180deg, color-mix(in srgb, var(--sga-primary) 5%, #fff), #fff 18rem),
        #fff;
    border-color: color-mix(in srgb, var(--sga-primary) 10%, var(--sga-border));
}

.sga-page__header {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin: -.25rem 0 1.25rem;
    padding-bottom: 1rem;
    border-bottom: 1px solid color-mix(in srgb, var(--sga-border) 82%, transparent);
}

.sga-page__header > div {
    min-width: 0;
}

.sga-page__header h1 {
    margin-bottom: .2rem;
}

.sga-page__header p {
    margin-top: 0 !important;
}

.sga-page-context {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .4rem;
    margin: .25rem 0 0 !important;
    color: var(--sga-ink-muted);
    font-size: .85rem;
    line-height: 1.35;
}

.sga-page-context strong {
    color: var(--sga-primary);
    font-weight: 800;
}

.sga-page-context span {
    color: var(--sga-ink-muted);
}

.sga-page-context span::before {
    content: '•';
    margin-right: .4rem;
    color: color-mix(in srgb, var(--sga-ink-muted) 55%, transparent);
}

/* ---------- Indicadores do Dashboard (MVP-16, tela 02) ---------- */

.sga-dashboard-hero {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(13rem, 24rem);
    gap: 1.5rem;
    align-items: center;
    margin-bottom: 1.75rem;
}

.sga-dashboard-hero__welcome {
    display: flex;
    align-items: center;
    gap: 1.25rem;
    min-width: 0;
}

.sga-dashboard-hero__mark {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 4.5rem;
    height: 4.5rem;
    flex: none;
    border-radius: 1.1rem;
    background:
        radial-gradient(circle at 30% 20%, rgba(255, 255, 255, .72), transparent 36%),
        color-mix(in srgb, var(--sga-primary) 12%, #fff);
    color: var(--sga-primary);
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--sga-primary) 12%, transparent);
}

.sga-dashboard-hero__mark svg {
    width: 2.3rem;
    height: 2.3rem;
}

.sga-dashboard-hero h1 {
    margin: .25rem 0 .35rem;
    color: var(--sga-ink);
    font-size: clamp(1.85rem, 2.65vw, 2.35rem);
    line-height: 1.05;
    letter-spacing: 0;
    white-space: nowrap;
}

.sga-dashboard-hero p {
    margin: 0;
    color: var(--sga-ink-muted);
    font-size: 1.02rem;
}

.sga-dashboard-eyebrow {
    display: block;
    color: color-mix(in srgb, var(--sga-primary) 74%, var(--sga-ink));
    font-size: .72rem;
    font-weight: 800;
    letter-spacing: .08em;
    text-transform: uppercase;
}

.sga-dashboard-hero__aside {
    display: grid;
    gap: .75rem;
    align-self: start;
    min-width: 0;
}

.sga-dashboard-hero blockquote {
    margin: 0;
    padding: 1rem 1.1rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 13%, var(--sga-border));
    border-radius: .75rem;
    background: rgba(255, 255, 255, .72);
    box-shadow: 0 8px 24px rgba(15, 23, 42, .06);
}

.sga-dashboard-date {
    display: flex;
    align-items: center;
    justify-self: end;
    gap: .45rem;
    width: fit-content;
    margin: 0;
    padding: .46rem .62rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 13%, var(--sga-border));
    border-radius: 999px;
    background: rgba(255, 255, 255, .62);
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1;
}

.sga-dashboard-date svg {
    width: .92rem;
    height: .92rem;
    color: color-mix(in srgb, var(--sga-primary) 72%, var(--sga-ink-muted));
}

.sga-dashboard-date strong {
    color: color-mix(in srgb, var(--sga-ink) 88%, var(--sga-primary));
    font-size: .82rem;
    font-weight: 800;
}

.sga-dashboard-date span::after {
    content: '•';
    margin-left: .45rem;
    color: color-mix(in srgb, var(--sga-ink-muted) 52%, transparent);
}

.sga-dashboard-hero blockquote {
    color: color-mix(in srgb, var(--sga-primary) 72%, var(--sga-ink));
    font-size: .95rem;
    font-weight: 700;
    line-height: 1.45;
}

.sga-kpi-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
    gap: 1rem;
    margin-top: 1.5rem;
}

.sga-kpi-grid--executive {
    grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
    margin-top: 0;
}

.sga-kpi-card {
    display: flex;
    flex-direction: column;
    padding: 1.1rem 1.25rem;
    background: #fff;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    box-shadow: 0 1px 3px rgba(0, 0, 0, .04);
    text-decoration: none;
    color: inherit;
    transition: border-color .15s ease, box-shadow .15s ease;
}

.sga-kpi-card:hover {
    border-color: var(--sga-primary);
    box-shadow: 0 4px 14px rgba(0, 0, 0, .06);
}

/* Pedido do usuário (2026-09-16, dois prints): o `clamp()` baseado em
   `vw` não bastava - a largura real do CARTÃO não acompanha a viewport
   de forma linear (depende de quantas colunas o grid `auto-fit` encaixa
   e da sidebar estar recolhida ou não), então em várias larguras o
   cálculo ainda dava uma fonte grande demais e "R$ 1.500,00" quebrava.
   `container-type: inline-size` faz o próprio CARTÃO virar a régua
   (`cqi` abaixo mede % da largura DELE, não da tela) - a fonte agora
   acompanha o espaço real disponível, não uma aproximação. */
.sga-kpi-card--executive {
    position: relative;
    flex-direction: row;
    align-items: center;
    gap: 1rem;
    min-height: 7.4rem;
    padding: 1.05rem;
    overflow: hidden;
    container-type: inline-size;
}

.sga-kpi-card--executive::before {
    content: '';
    position: absolute;
    inset: 0;
    opacity: .7;
    pointer-events: none;
}

.sga-kpi-card--executive.sga-kpi-card--ok::before {
    background: linear-gradient(135deg, color-mix(in srgb, #16A34A 9%, transparent), transparent 58%);
}

.sga-kpi-card--executive.sga-kpi-card--warn::before {
    background: linear-gradient(135deg, color-mix(in srgb, #D97706 12%, transparent), transparent 58%);
}

.sga-kpi-card--executive.sga-kpi-card--critical::before {
    background: linear-gradient(135deg, color-mix(in srgb, #DC2626 12%, transparent), transparent 58%);
}

.sga-kpi-card--executive > * {
    position: relative;
    z-index: 1;
}

.sga-kpi-card__content {
    display: flex;
    flex: 1;
    min-width: 0;
    flex-direction: column;
}

.sga-kpi-card__arrow {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 1.8rem;
    height: 1.8rem;
    flex: none;
    border-radius: 50%;
    background: color-mix(in srgb, var(--sga-primary) 8%, #fff);
    color: var(--sga-primary);
    font-size: 1.4rem;
    line-height: 1;
    transition: transform .15s ease, background .15s ease;
}

.sga-kpi-card--executive:hover .sga-kpi-card__arrow {
    transform: translateX(2px);
    background: color-mix(in srgb, var(--sga-primary) 14%, #fff);
}

/* Redesenho de UX (pedido do usuário, 2026-09-13, com prints de
   referência) - selo de ícone colorido por `severity` (o mesmo campo já
   usado pelo painel "Alertas operacionais", nunca uma cor nova sem
   significado) no lugar de um cartão só-texto. `ok`/`warn`/`critical`
   já eram o vocabulário existente de HomeController::indicators() -
   aqui só ganham uma cor de fundo pastel + a mesma cor no ícone
   (`currentColor`, herdada por `<x-nav-icon>` sem CSS extra por ícone). */
.sga-kpi-card__icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.6rem;
    height: 2.6rem;
    flex-shrink: 0;
    border-radius: .6rem;
    margin-bottom: .85rem;
}

.sga-kpi-card--executive .sga-kpi-card__icon {
    width: 3rem;
    height: 3rem;
    margin-bottom: 0;
    border-radius: .75rem;
}

.sga-kpi-card__icon .sga-shell__nav-icon { width: 1.3rem; height: 1.3rem; }

.sga-kpi-card__icon--ok { background: #DCFCE7; color: #166534; }
.sga-kpi-card__icon--warn { background: #FEF3C7; color: #92400E; }
.sga-kpi-card__icon--critical { background: #FEE2E2; color: #991B1B; }

/* Pedido do usuário (2026-09-13, refinamento do Portal com print de
   referência): "seguirmos exatamente as mesmas cores dos ícones" - no
   mockup, TODO cartão do Portal usa o MESMO tom (rosa claro + vinho),
   nunca uma cor por severidade feito o dashboard institucional. Deriva
   de `--sga-primary` (nunca uma cor fixa) - acompanha a paleta que
   cada instituição configurar em Aparência, sem precisar reescrever
   este CSS por cliente. Só o Portal do Aluno usa este modificador; o
   dashboard institucional (MVP-16) continua com `--ok/--warn/--critical`
   (a distinção por severidade importa mais ali, é uma tela operacional). */
.sga-kpi-card__icon--brand {
    background: color-mix(in srgb, var(--sga-primary) 12%, white);
    color: var(--sga-primary);
}

.sga-kpi-card__value {
    /* Fallback pra navegador sem container queries - se o valor com
       `cqi` da regra mais específica abaixo for inválido, o CSS ignora
       aquela declaração inteira e este 1.9rem simples continua valendo. */
    font-size: 1.9rem;
    font-weight: 700;
    color: var(--sga-ink);
    line-height: 1.15;
}

/* Pedido do usuário (2026-09-16, dois prints): "R$ 1.500,00" quebrava
   em cartões mais estreitos ("R$" isolado numa linha) - a fonte agora
   escala com a largura real do CARTÃO (`cqi`, ver `container-type` em
   `.sga-kpi-card--executive` acima), então encolhe o suficiente pra
   caber mesmo quando o grid encaixa 4+ colunas numa tela menor. Reta
   calibrada em 2 pontos: ~1.3rem num cartão no mínimo do grid (15rem)
   e volta a 1.9rem (o máximo) a partir de ~23.75rem de cartão. */
.sga-kpi-card--executive .sga-kpi-card__value {
    font-size: clamp(1.3rem, .27rem + 6.86cqi, 1.9rem);
}

.sga-kpi-card__label {
    margin-top: .4rem;
    font-size: .85rem;
    color: var(--sga-ink);
}

.sga-kpi-card__detail {
    margin-top: .2rem;
    font-size: .8rem;
    color: var(--sga-ink-muted);
}

.sga-kpi-card__link {
    margin-top: .6rem;
    font-size: .8rem;
    font-weight: 600;
    color: var(--sga-primary);
}

.sga-dashboard-insights {
    display: grid;
    grid-template-columns: minmax(0, 2.1fr) minmax(17rem, .9fr);
    gap: 1rem;
    margin-top: 1rem;
    align-items: start;
}

/* Pedido do usuário (2026-09-16): "Governança" empilhada abaixo do
   Checklist, na mesma coluna - a coluna esquerda do grid acima vira uma
   pilha vertical de 2 cards em vez de 1 só. `min-width: 0` evita que o
   conteúdo largo de dentro (steps, tabela) force a coluna a crescer além
   do espaço do grid (achado clássico de grid/flex com filho largo). */
.sga-dashboard-insights__main {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    min-width: 0;
}

.sga-dashboard-card {
    padding: 1.1rem 1.25rem;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    background: #fff;
    box-shadow: 0 8px 24px rgba(15, 23, 42, .05);
}

.sga-dashboard-card__header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.sga-dashboard-card__header h2 {
    margin: .15rem 0 0;
    color: var(--sga-ink);
    font-size: 1.05rem;
}

.sga-dashboard-card__header a {
    color: var(--sga-primary);
    font-size: .85rem;
    font-weight: 700;
    text-decoration: none;
    white-space: nowrap;
}

.sga-dashboard-card__header a:hover { text-decoration: underline; }

.sga-metric-bars {
    display: grid;
    gap: .78rem;
}

.sga-metric-bar {
    display: grid;
    grid-template-columns: minmax(11rem, 1fr) minmax(10rem, 1.2fr) 2.5rem;
    gap: .8rem;
    align-items: center;
    color: var(--sga-ink);
    text-decoration: none;
}

.sga-metric-bar__label {
    min-width: 0;
    color: var(--sga-ink-muted);
    font-size: .85rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sga-metric-bar__track {
    height: .62rem;
    border-radius: 999px;
    background: color-mix(in srgb, var(--sga-border) 72%, #fff);
    overflow: hidden;
}

.sga-metric-bar__fill {
    display: block;
    height: 100%;
    min-width: .35rem;
    border-radius: inherit;
    background: var(--sga-primary);
}

.sga-metric-bar--ok .sga-metric-bar__fill { background: #16A34A; }
.sga-metric-bar--warn .sga-metric-bar__fill { background: #D97706; }
.sga-metric-bar--critical .sga-metric-bar__fill { background: #DC2626; }

.sga-metric-bar strong {
    color: var(--sga-ink);
    font-size: .92rem;
    text-align: right;
}

.sga-metric-bar:hover .sga-metric-bar__label {
    color: var(--sga-primary);
}

.sga-dashboard-layout {
    display: flex;
    gap: 1.5rem;
    align-items: flex-start;
    margin-top: 1.5rem;
    flex-wrap: wrap;
}

.sga-dashboard-layout .sga-kpi-grid { flex: 1 1 26rem; margin-top: 0; }

.sga-alerts-panel {
    flex: 0 0 16rem;
    padding: 1.1rem 1.25rem;
    background: var(--sga-bg);
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
}

.sga-alerts-panel--executive {
    flex: none;
    background:
        linear-gradient(160deg, color-mix(in srgb, var(--sga-primary) 6%, #fff), #fff 62%),
        #fff;
}

.sga-alerts-panel h2 {
    margin: 0 0 .75rem;
    font-size: .95rem;
}

.sga-alert-badge {
    display: block;
    margin-bottom: .5rem;
    padding: .45rem .7rem;
    border-radius: .5rem;
    font-size: .82rem;
    font-weight: 600;
    text-decoration: none;
}

.sga-alert-list {
    display: grid;
    gap: .5rem;
}

.sga-alert-badge {
    display: flex;
    align-items: center;
    gap: .55rem;
}

.sga-alert-badge span {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.55rem;
    height: 1.55rem;
    flex: none;
    border-radius: 50%;
    background: rgba(255, 255, 255, .58);
    font-weight: 800;
}

.sga-alert-badge--critical { background: #FEE2E2; color: #991B1B; }
.sga-alert-badge--warn { background: #FEF3C7; color: #92400E; }

.sga-alert-meter {
    display: grid;
    place-items: center;
    width: 9.5rem;
    height: 9.5rem;
    margin: .25rem auto 1rem;
    border-radius: 50%;
    background:
        radial-gradient(circle at center, #fff 0 58%, transparent 59%),
        conic-gradient(var(--sga-primary) var(--sga-alert-share), color-mix(in srgb, var(--sga-primary) 10%, var(--sga-border)) 0);
}

.sga-alert-meter div {
    display: grid;
    place-items: center;
}

.sga-alert-meter strong {
    color: var(--sga-ink);
    font-size: 2rem;
    line-height: 1;
}

.sga-alert-meter span {
    margin-top: .2rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    font-weight: 700;
}

.sga-empty-note {
    color: var(--sga-ink-muted);
    font-size: .85rem;
    text-align: center;
}

.sga-severity-strip {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: .45rem;
    margin-top: 1rem;
}

.sga-severity-strip span {
    padding: .45rem .35rem;
    border-radius: .55rem;
    background: var(--sga-bg);
    color: var(--sga-ink-muted);
    font-size: .72rem;
    text-align: center;
}

.sga-severity-strip strong {
    display: block;
    color: var(--sga-ink);
    font-size: .95rem;
}

.sga-quick-actions {
    margin-top: 1rem;
}

.sga-quick-actions__grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: .85rem;
}

.sga-quick-action {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    gap: .75rem;
    align-items: center;
    min-height: 4rem;
    padding: .8rem .9rem;
    border: 1px solid var(--sga-border);
    border-radius: .65rem;
    background: color-mix(in srgb, var(--sga-bg) 45%, #fff);
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-quick-action:hover {
    transform: translateY(-1px);
    border-color: var(--sga-primary);
    background: #fff;
}

.sga-quick-action .sga-kpi-card__icon {
    width: 2.35rem;
    height: 2.35rem;
    margin: 0;
}

.sga-quick-action strong {
    min-width: 0;
    font-size: .86rem;
    line-height: 1.25;
}

.sga-quick-action > span:last-child {
    color: var(--sga-primary);
    font-size: 1.3rem;
}

.sga-dashboard-secondary {
    display: grid;
    grid-template-columns: minmax(0, 1.35fr) minmax(18rem, .85fr);
    gap: 1rem;
    margin-top: 1rem;
}

/* Pedido do usuário (2026-09-16): "Clientes recentes" com largura
   total - só sobrou ela nesta seção depois que "Governança" mudou de
   coluna (ver .sga-dashboard-insights__main), então o grid de 2
   colunas dá lugar a 1 coluna só, ocupando a largura inteira. */
.sga-dashboard-secondary--full {
    grid-template-columns: 1fr;
}

.sga-dashboard-side-stack {
    display: grid;
    gap: 1rem;
    align-content: start;
}

.sga-activity-list,
.sga-event-list {
    display: grid;
    gap: .55rem;
}

.sga-activity-row,
.sga-event-row,
.sga-student-link-row {
    display: grid;
    align-items: center;
    gap: .75rem;
    min-width: 0;
    border: 1px solid var(--sga-border);
    border-radius: .65rem;
    background: color-mix(in srgb, var(--sga-bg) 42%, #fff);
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-activity-row {
    grid-template-columns: auto minmax(0, 1fr) auto;
    padding: .72rem .82rem;
}

.sga-activity-row:hover,
.sga-event-row:hover,
.sga-student-link-row:hover {
    transform: translateY(-1px);
    border-color: var(--sga-primary);
    background: #fff;
}

.sga-activity-row .sga-kpi-card__icon,
.sga-student-link-row .sga-kpi-card__icon {
    width: 2.45rem;
    height: 2.45rem;
    margin: 0;
    border-radius: .7rem;
}

.sga-activity-row strong,
.sga-activity-row small,
.sga-event-row strong,
.sga-event-row small,
.sga-student-link-row strong,
.sga-student-link-row small {
    display: block;
    min-width: 0;
}

.sga-activity-row strong,
.sga-event-row strong,
.sga-student-link-row strong {
    color: var(--sga-ink);
    font-size: .9rem;
    line-height: 1.25;
}

.sga-activity-row small,
.sga-event-row small,
.sga-student-link-row small {
    margin-top: .15rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.25;
}

.sga-activity-row em {
    color: var(--sga-ink-muted);
    font-size: .76rem;
    font-style: normal;
    font-weight: 700;
    text-align: right;
    white-space: nowrap;
}

.sga-activity-row--critical {
    background: linear-gradient(90deg, #FEF2F2, #fff 72%);
}

.sga-activity-row--warn {
    background: linear-gradient(90deg, #FFFBEB, #fff 72%);
}

.sga-event-row {
    grid-template-columns: auto minmax(0, 1fr);
    padding: .72rem .82rem;
}

.sga-event-row__date {
    display: grid;
    place-items: center;
    width: 3.1rem;
    height: 3.1rem;
    border-radius: .72rem;
    background: color-mix(in srgb, var(--sga-primary) 9%, #fff);
    color: var(--sga-primary);
}

.sga-event-row--warn .sga-event-row__date {
    background: #FEF3C7;
    color: #92400E;
}

.sga-event-row__date strong {
    color: inherit;
    font-size: 1.12rem;
    line-height: 1;
}

.sga-event-row__date small {
    margin: .08rem 0 0;
    color: inherit;
    font-size: .63rem;
    font-weight: 800;
}

.sga-event-empty {
    display: grid;
    place-items: center;
    min-height: 10rem;
    padding: 1.2rem;
    border-radius: .7rem;
    background: color-mix(in srgb, var(--sga-bg) 58%, #fff);
    color: var(--sga-ink-muted);
    text-align: center;
}

.sga-event-empty .sga-kpi-card__icon {
    width: 3rem;
    height: 3rem;
    margin: 0 0 .55rem;
}

.sga-event-empty strong {
    color: var(--sga-ink);
    font-size: .95rem;
}

.sga-event-empty small {
    display: block;
    max-width: 15rem;
    margin-top: .2rem;
    font-size: .8rem;
    line-height: 1.35;
}

.sga-help-card {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: .8rem;
    align-items: center;
    padding: 1rem 1.05rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 14%, var(--sga-border));
    border-radius: .75rem;
    background:
        linear-gradient(145deg, color-mix(in srgb, var(--sga-primary) 8%, #fff), #fff 64%),
        #fff;
    box-shadow: 0 8px 24px rgba(15, 23, 42, .045);
}

.sga-help-card .sga-kpi-card__icon {
    width: 2.75rem;
    height: 2.75rem;
    margin: 0;
}

.sga-help-card strong,
.sga-help-card small {
    display: block;
}

.sga-help-card strong {
    color: var(--sga-ink);
    font-size: .92rem;
    line-height: 1.25;
}

.sga-help-card small {
    margin-top: .2rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.35;
}

.sga-help-card a {
    grid-column: 2;
    color: var(--sga-primary);
    font-size: .8rem;
    font-weight: 800;
    text-decoration: none;
}

.sga-help-card a:hover {
    text-decoration: underline;
}

.sga-page--platform {
    max-width: 82rem;
}

.sga-platform-hero .sga-dashboard-hero__mark .sga-shell__nav-icon {
    width: 2.35rem;
    height: 2.35rem;
}

.sga-platform-context {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    gap: .8rem;
    align-items: center;
    margin: 0 0 1rem;
    padding: .9rem 1rem;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    background: #fff;
    box-shadow: 0 8px 24px rgba(15, 23, 42, .05);
}

.sga-platform-context--warn {
    border-color: #FCD34D;
    background: linear-gradient(135deg, #FFFBEB, #fff 64%);
}

.sga-platform-context .sga-kpi-card__icon {
    width: 2.6rem;
    height: 2.6rem;
    margin: 0;
}

.sga-platform-context strong,
.sga-platform-context small {
    display: block;
    min-width: 0;
}

.sga-platform-context strong {
    color: var(--sga-ink);
    font-size: .96rem;
}

.sga-platform-context small {
    margin-top: .15rem;
    color: var(--sga-ink-muted);
    font-size: .82rem;
    line-height: 1.35;
}

.sga-platform-context__link {
    color: var(--sga-primary);
    font-size: .83rem;
    font-weight: 800;
    text-decoration: none;
    white-space: nowrap;
}

.sga-platform-context__link:hover {
    text-decoration: underline;
}

.sga-platform-steps {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr));
    gap: .75rem;
}

.sga-platform-step {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: .75rem;
    min-height: 7.5rem;
    padding: .9rem;
    border: 1px solid var(--sga-border);
    border-radius: .7rem;
    background:
        linear-gradient(145deg, color-mix(in srgb, var(--sga-primary) 5%, transparent), transparent 64%),
        color-mix(in srgb, var(--sga-bg) 42%, #fff);
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-platform-step:hover {
    transform: translateY(-1px);
    border-color: var(--sga-primary);
    background: #fff;
}

.sga-platform-step > strong {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    border-radius: .6rem;
    background: color-mix(in srgb, var(--sga-primary) 11%, #fff);
    color: var(--sga-primary);
    font-size: .95rem;
}

.sga-platform-step b,
.sga-platform-step small {
    display: block;
    min-width: 0;
}

.sga-platform-step b {
    font-size: .9rem;
    line-height: 1.25;
}

.sga-platform-step small {
    margin-top: .2rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.35;
}

.sga-platform-support-flow {
    display: grid;
    grid-template-columns: minmax(13rem, .75fr) minmax(0, 1.25fr);
    gap: 1rem;
    align-items: stretch;
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid color-mix(in srgb, var(--sga-border) 82%, transparent);
}

.sga-platform-support-flow h3 {
    margin: .15rem 0 .35rem;
    color: var(--sga-ink);
    font-size: 1rem;
    line-height: 1.25;
}

.sga-platform-support-flow p {
    margin: 0;
    color: var(--sga-ink-muted);
    font-size: .84rem;
    line-height: 1.45;
}

.sga-platform-support-actions {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr));
    gap: .7rem;
}

.sga-platform-support-actions a {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: .65rem .75rem;
    align-items: center;
    min-height: 5.8rem;
    padding: .8rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 12%, var(--sga-border));
    border-radius: .7rem;
    background: linear-gradient(135deg, color-mix(in srgb, var(--sga-primary) 5%, #fff), #fff 64%);
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, transform .15s ease, box-shadow .15s ease;
}

.sga-platform-support-actions a:hover {
    border-color: var(--sga-primary);
    box-shadow: 0 10px 22px rgba(15, 23, 42, .06);
    transform: translateY(-1px);
}

.sga-platform-support-actions .sga-kpi-card__icon {
    grid-row: span 2;
    width: 2.35rem;
    height: 2.35rem;
    margin: 0;
}

.sga-platform-support-actions strong,
.sga-platform-support-actions small {
    display: block;
    min-width: 0;
}

.sga-platform-support-actions strong {
    font-size: .88rem;
}

.sga-platform-support-actions small {
    color: var(--sga-ink-muted);
    font-size: .74rem;
    line-height: 1.3;
}

.sga-platform-status-panel .sga-severity-strip {
    margin-top: 0;
}

.sga-platform-status-strip {
    grid-template-columns: 1fr;
}

.sga-platform-status {
    text-align: left !important;
}

.sga-platform-status--ativo strong { color: #166534; }
.sga-platform-status--trial strong { color: #92400E; }
.sga-platform-status--suspenso strong { color: #991B1B; }

.sga-platform-bars {
    margin-top: 1rem;
}

.sga-platform-bars .sga-metric-bar {
    grid-template-columns: minmax(0, 1fr) 2.2rem;
}

.sga-platform-bars .sga-metric-bar__track {
    grid-column: 1 / -1;
    grid-row: 2;
}

.sga-platform-client-list {
    display: grid;
    gap: .55rem;
}

.sga-platform-client-row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto minmax(8rem, auto);
    gap: .8rem;
    align-items: center;
    padding: .72rem .82rem;
    border: 1px solid var(--sga-border);
    border-radius: .65rem;
    background: color-mix(in srgb, var(--sga-bg) 42%, #fff);
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-platform-client-row:hover {
    transform: translateY(-1px);
    border-color: var(--sga-primary);
    background: #fff;
}

.sga-platform-client-row strong,
.sga-platform-client-row small {
    display: block;
    min-width: 0;
}

.sga-platform-client-row strong {
    font-size: .9rem;
}

.sga-platform-client-row small,
.sga-platform-client-row em {
    color: var(--sga-ink-muted);
    font-size: .78rem;
    font-style: normal;
}

.sga-platform-client-row em {
    text-align: right;
}

@media (max-width: 1180px) {
    .sga-quick-actions__grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .sga-dashboard-insights,
    .sga-dashboard-secondary {
        grid-template-columns: 1fr;
    }

    .sga-platform-steps {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .sga-platform-support-flow {
        grid-template-columns: 1fr;
    }
}

@media (max-width: 760px) {
    .sga-dashboard-hero {
        grid-template-columns: 1fr;
    }

    .sga-dashboard-hero h1 {
        font-size: 2rem;
        white-space: normal;
    }

    .sga-dashboard-hero__welcome {
        align-items: flex-start;
    }

    .sga-dashboard-hero__mark {
        width: 3.4rem;
        height: 3.4rem;
        border-radius: .85rem;
    }

    .sga-dashboard-hero__mark svg {
        width: 1.9rem;
        height: 1.9rem;
    }

    .sga-kpi-grid--executive,
    .sga-quick-actions__grid {
        grid-template-columns: 1fr;
    }

    .sga-metric-bar {
        grid-template-columns: 1fr 2.5rem;
    }

    .sga-metric-bar__track {
        grid-column: 1 / -1;
        grid-row: 2;
    }

    .sga-activity-row {
        grid-template-columns: auto minmax(0, 1fr);
    }

    .sga-activity-row em {
        grid-column: 2;
        text-align: left;
    }

    .sga-platform-context,
    .sga-platform-client-row {
        grid-template-columns: 1fr;
    }

    .sga-platform-context__link,
    .sga-platform-client-row em {
        text-align: left;
    }

    .sga-platform-steps {
        grid-template-columns: 1fr;
    }
}

/* ---------- Aparência (logotipo/cores) ---------- */

.sga-branding-layout {
    display: flex;
    gap: 2rem;
    align-items: flex-start;
    margin-top: 1rem;
    flex-wrap: wrap;
}

.sga-branding-layout .sga-form { flex: 1 1 22rem; }

.sga-branding-colors {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(13rem, 1fr));
    gap: .75rem 1.5rem;
}

.sga-branding-colors input[type="color"] {
    width: 100%;
    height: 2.4rem;
    padding: .2rem;
    cursor: pointer;
}

.sga-branding-preview {
    flex: 0 0 14rem;
    position: sticky;
    top: 2rem;
}

.sga-branding-preview__sidebar {
    display: flex;
    flex-direction: column;
    gap: .3rem;
    padding: 1rem .85rem;
    border-radius: .75rem;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .12);
}

.sga-branding-preview__brand {
    padding: .6rem .5rem;
    border-radius: .5rem;
    color: #fff;
    font-weight: 700;
    font-size: .85rem;
    margin-bottom: .5rem;
}

/* Pedido do usuário (2026-09-19): prévia em miniatura da tela de login,
   mesmo espírito da prévia do menu lateral acima - reflete flip/invert/
   cor do botão ao vivo via JS (ver sgaBrandingPreview()), sem precisar
   salvar e abrir /login numa aba separada. */
.sga-branding-preview__login {
    display: flex;
    height: 8rem;
    border-radius: .75rem;
    overflow: hidden;
    box-shadow: 0 4px 14px rgba(0, 0, 0, .12);
}

.sga-branding-preview__login-brand,
.sga-branding-preview__login-form {
    flex: 1 1 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: .5rem;
}

.sga-branding-preview__login-brand img {
    max-width: 70%;
    max-height: 70%;
}

.sga-branding-preview__login-card {
    width: 100%;
    background: #fff;
    border-radius: .4rem;
    padding: .5rem;
    box-shadow: 0 2px 6px rgba(0, 0, 0, .15);
    display: flex;
    flex-direction: column;
    gap: .3rem;
}

.sga-branding-preview__login-title {
    font-size: .6rem;
    font-weight: 700;
    color: var(--sga-ink);
}

.sga-branding-preview__login-input {
    display: block;
    height: .5rem;
    border-radius: .2rem;
    background: var(--sga-border);
}

.sga-branding-preview__login-btn {
    display: flex;
    align-items: center;
    justify-content: center;
    height: .8rem;
    border-radius: .3rem;
    background: var(--sga-primary);
    /* Achado do usuário (2026-09-19): a 1a tentativa com texto vazava
       da barra - achatado pra caber (font-size pequeno, sem quebra de
       linha, cortado se sobrar) e centralizado com flex em vez de
       depender de line-height. */
    color: #fff;
    font-size: .38rem;
    font-weight: 700;
    line-height: 1;
    overflow: hidden;
    white-space: nowrap;
    letter-spacing: .02em;
}

.sga-branding-preview__login-brand-text {
    color: #fff;
    font-weight: 700;
    font-size: .7rem;
    text-align: center;
}

.sga-branding-preview__login-forgot {
    font-size: .5rem;
    text-align: center;
    color: var(--sga-primary);
}

.sga-status {
    padding: .75rem .95rem;
    background: color-mix(in srgb, var(--sga-primary) 10%, white);
    border: 1px solid color-mix(in srgb, var(--sga-primary) 30%, white);
    border-radius: .5rem;
    font-size: .9rem;
    color: color-mix(in srgb, var(--sga-primary) 72%, var(--sga-ink));
    font-weight: 600;
}

.sga-btn-primary--inline {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: auto;
    text-decoration: none;
    white-space: nowrap;
}

/* Achado do teste manual do usuário (2026-09-12, "totalmente
   responsivo para navegação em smartphones"): tabela com muitas
   colunas (ex.: Histórico Acadêmico, tela 27 do F2-02) estourava a
   largura da tela em mobile e rolava a PÁGINA INTEIRA na horizontal -
   `overflow-x:auto` direto na tabela dá scroll PRÓPRIO só a ela.
   Pedido do usuário (2026-09-15, "tabelas mais modernas"): `display:block`
   (a técnica antiga aqui) faz o browser gerar uma tabela ANÔNIMA pra
   conter thead/tbody/tr/td, e essa anônima ignora o `width:100%` do
   elemento real - a tabela sempre ficava do tamanho do conteúdo, sobrando
   espaço morto no card à direita (achado do próprio usuário, print da
   tela de Cursos). `display:table` sozinho já é scrollável com
   `overflow-x:auto` nos browsers atuais (não precisa do hack de bloco) e
   MANTÉM o `width:100%` na tabela de verdade - looks preenche o card
   quando cabe, sem afetar em nada o scroll em mobile quando não cabe.
   Sem tocar em nenhuma das ~50 views que usam `.sga-table`. */
.sga-table {
    display: table;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    width: 100%;
    border-collapse: collapse;
    font-size: .9rem;
    background: #fff;
}

.sga-table thead th {
    text-align: left;
    padding: .78rem .9rem;
    background: color-mix(in srgb, var(--sga-bg) 68%, #fff);
    color: var(--sga-ink-muted);
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    border-bottom: 1px solid var(--sga-border);
    white-space: nowrap;
}

.sga-table td {
    text-align: left;
    padding: .82rem .9rem;
    border-bottom: 1px solid var(--sga-border);
    vertical-align: middle;
}

/* Pedido do usuário (2026-09-14, "melhorar UX" das telas de listagem) -
   destaque sutil de linha ao passar o mouse, benefício automático em
   TODA tabela do sistema (nenhuma tela precisa de CSS próprio). Só
   linhas de dado de verdade (nunca o cabeçalho, nem a linha de
   "nenhum registro encontrado" - `td[colspan]` marca essa exceção). */
.sga-table tbody tr:hover td:not([colspan]) {
    background: color-mix(in srgb, var(--sga-primary) 4%, #fff);
}

.sga-table tbody tr:last-child td {
    border-bottom-color: transparent;
}

/* Avatar de iniciais em linha de tabela (Alunos/Usuários) - mesmo
   gradiente/formato do avatar da sidebar, só menor. */
.sga-table__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.8rem;
    height: 1.8rem;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--sga-logo-bg-start), var(--sga-logo-bg-end));
    color: #fff;
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    flex-shrink: 0;
    margin-right: .5rem;
    vertical-align: middle;
}

/* Achado do pedido de UX de 2026-09-12 ("melhorar o UX destes links"
   sobre a coluna de ações de Usuários): virou botão-pílula em vez de
   texto sublinhado solto - `.sga-table__actions a` (link puro, ex.:
   "Editar") e `.sga-link-btn` (dentro de um <form>, ex.: "Excluir")
   ganham o MESMO visual aqui, sem precisar tocar nenhuma view - toda
   tela com essa coluna (Usuários, Unidades, Cursos, Central de
   Validação etc.) melhora de uma vez só. */
/* Pedido do usuário (2026-09-14): ícones de ação quebrando linha em
   telas com nome mais longo/coluna mais estreita (Usuários etc.) -
   `nowrap` garante que os botões fiquem sempre lado a lado, mesmo que a
   tabela precise rolar horizontalmente (já suportado por
   `.sga-table { overflow-x: auto }` acima). */
.sga-table__actions {
    text-align: right;
    white-space: nowrap;
}

.sga-table__actions form {
    display: inline-flex;
    margin: 0 0 0 .35rem;
    vertical-align: middle;
}

.sga-table__actions > a {
    margin-left: .35rem;
    vertical-align: middle;
}

.sga-table__actions a,
.sga-table__actions .sga-link-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: #fff;
    border: 1px solid var(--sga-border);
    padding: .3rem .65rem;
    border-radius: .4rem;
    color: var(--sga-primary);
    text-decoration: none;
    cursor: pointer;
    font-size: .8rem;
    font-weight: 600;
    line-height: 1.2;
    transition: background .15s ease, border-color .15s ease, transform .15s ease;
}

/* Pedido do usuário (2026-09-14, "Usuários": ícone no lugar do texto) -
   botão vira um quadrado compacto quando o conteúdo é só um ícone
   (nenhum texto visível pra dar largura ao botão sozinho). */
.sga-table__actions a:has(svg:only-child),
.sga-table__actions .sga-link-btn:has(svg:only-child) {
    padding: .4rem;
    width: 2rem;
    height: 2rem;
}

.sga-table__actions svg {
    width: 1rem;
    height: 1rem;
    flex-shrink: 0;
}

.sga-table__actions a:hover,
.sga-table__actions .sga-link-btn:hover {
    background: color-mix(in srgb, var(--sga-primary) 8%, white);
    border-color: var(--sga-primary);
    transform: translateY(-1px);
}

.sga-table__actions .sga-link-btn--danger {
    color: #B42318;
}

.sga-table__actions .sga-link-btn--danger:hover {
    background: #FEE2E2;
    border-color: #B42318;
}

/* Fora de uma tabela (ex.: "Registrar baixa" ao lado de um <select>,
   "Reprocessar" no monitor) - mesmo visual de pílula, só sem o gap de
   flex do container acima. */
.sga-link-btn {
    display: inline-flex;
    align-items: center;
    background: #fff;
    border: 1px solid var(--sga-border);
    padding: .35rem .75rem;
    border-radius: .4rem;
    color: var(--sga-primary);
    text-decoration: none;
    cursor: pointer;
    font-size: .85rem;
    font-weight: 600;
    box-shadow: 0 4px 12px rgba(15, 23, 42, .04);
    transition: background .15s ease, border-color .15s ease, transform .15s ease;
}

.sga-link-btn:hover {
    background: color-mix(in srgb, var(--sga-primary) 8%, white);
    border-color: var(--sga-primary);
    transform: translateY(-1px);
}

.sga-link-btn--danger { color: #B42318; }
.sga-link-btn--danger:hover { background: #FEE2E2; border-color: #B42318; }

.sga-badge {
    display: inline-block;
    padding: .2rem .58rem;
    border-radius: 1rem;
    font-size: .78rem;
    font-weight: 600;
    /* Pedido do usuário (2026-09-14): badge com texto composto (ex.:
       "Pendente (v1)") quebrava em 2 linhas dentro da célula da tabela -
       um selo é sempre uma peça só, nunca deve quebrar. */
    white-space: nowrap;
}

.sga-badge--ok { background: #DCFCE7; color: #166534; }
.sga-badge--info { background: #DBEAFE; color: #1D4ED8; }
.sga-badge--off { background: #FEE2E2; color: #991B1B; }
/* MVP-07: fila de validação - "correção solicitada" (nem aprovado nem
   reprovado) e destaque de SLA estourado (dias de espera). */
.sga-badge--warn { background: #FEF3C7; color: #92400E; }

/* F2-02: integralização curricular (tela 27 "Histórico Acadêmico"). */
.sga-progress {
    height: .68rem;
    border-radius: 1rem;
    background: color-mix(in srgb, var(--sga-border) 72%, #fff);
    overflow: hidden;
    margin: .5rem 0;
}

.sga-progress__bar {
    height: 100%;
    background: linear-gradient(90deg, var(--sga-primary), var(--sga-nav-accent));
    border-radius: 1rem;
    transition: width .2s ease;
}

.sga-form .sga-field { max-width: 28rem; }

.sga-field-help {
    display: block;
    margin-top: .38rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.35;
}

/* Pedido do usuário (2026-09-16): aviso de e-mail já cadastrado sob o
   próprio campo (sga.js, `data-sga-check-email`) - mesmo formato de
   `.sga-field-help`, cor de erro. `.sga-error` (parágrafo do topo do
   formulário) tem margem negativa pensada pra ficar colado no `<h1>`,
   não serve pra um aviso dentro de `.sga-field`. */
.sga-field-error {
    display: block;
    margin-top: .38rem;
    color: #B42318;
    font-size: .78rem;
    line-height: 1.35;
}

.sga-field input[aria-invalid="true"] {
    border-color: #B42318;
}

.sga-field input[aria-invalid="true"]:focus {
    box-shadow: 0 0 0 3px color-mix(in srgb, #B42318 18%, transparent);
}

.sga-password-control {
    display: flex;
    width: 100%;
}

.sga-password-control input {
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

.sga-password-control__button {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 4.8rem;
    padding: 0 .72rem;
    border: 1px solid var(--sga-border);
    border-left: 0;
    background: #fff;
    color: var(--sga-primary);
    cursor: pointer;
    font-family: inherit;
    font-size: .82rem;
    font-weight: 800;
    white-space: nowrap;
}

/* Pedido do usuário (2026-09-16): botão "Mostrar" vira ícone de olho -
   sem `min-width` largo de texto (o de "Gerar" ao lado continua com
   isso) e com o SVG explicitamente dimensionado (sem `width`/`height`
   um SVG cai no tamanho padrão do navegador, 300x150). */
.sga-password-control__button--icon {
    min-width: 2.6rem;
    padding: 0 .6rem;
}

.sga-password-control__button--icon svg {
    width: 1.15rem;
    height: 1.15rem;
}

/* Achado ao testar (2026-09-16): o atributo `hidden` sozinho não
   escondia o SVG (o `display:none` do stylesheet padrão do navegador
   pra `[hidden]` não pegava de forma confiável em elemento SVG neste
   ambiente) - os dois ícones apareciam juntos. Regra explícita própria,
   nunca depender só do comportamento padrão do navegador pra isto. */
.sga-password-control__button--icon svg[hidden] {
    display: none;
}

.sga-password-control__button:last-child {
    border-top-right-radius: .5rem;
    border-bottom-right-radius: .5rem;
}

.sga-password-control__button:hover {
    background: color-mix(in srgb, var(--sga-primary) 7%, #fff);
}

.sga-page > .sga-form,
.sga-page form.sga-form[method="GET"] {
    padding: 1rem;
    border: 1px solid color-mix(in srgb, var(--sga-border) 82%, transparent);
    border-radius: .75rem;
    background: color-mix(in srgb, var(--sga-bg) 42%, #fff);
}

.sga-page > .sga-form + .sga-table,
.sga-page form.sga-form[method="GET"] + .sga-table {
    margin-top: 1.25rem !important;
}

.sga-page--academic-list {
    max-width: 78rem;
}

.sga-list-hero {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1.25rem;
    margin-bottom: 1.25rem;
    padding: 1.1rem 1.15rem;
    border: 1px solid color-mix(in srgb, var(--sga-border) 76%, transparent);
    border-radius: .9rem;
    background:
        linear-gradient(135deg, color-mix(in srgb, var(--sga-primary) 7%, transparent), transparent 25rem),
        rgba(255, 255, 255, .96);
    box-shadow: 0 16px 35px rgba(15, 23, 42, .055);
}

.sga-list-hero h1 {
    margin: .1rem 0 .35rem;
}

.sga-list-hero p {
    max-width: 52rem;
    margin: 0;
    color: var(--sga-ink-muted);
    line-height: 1.55;
}

.sga-list-kpis {
    margin-bottom: 1.25rem;
}

/* Achado do usuário (2026-09-17, print da tela "Alunos"): a tabela
   vazava pra fora do card à direita em vez de rolar - `.sga-table` tem
   `overflow-x: auto` (ver comentário mais abaixo), mas isso NUNCA tem
   efeito quando `border-collapse: collapse` está no mesmo elemento
   (regra real do modelo de tabela do CSS, não um bug deste código -
   nesse caso o navegador sempre usa "visible" pro overflow da própria
   tabela, ignorando o `auto` declarado). `.sga-table-scroll` (usado em
   telas mais antigas) já contornava isso com um `<div>` por fora; todo
   card `.sga-list-panel` (telas "modernas" - Alunos, Candidatos,
   Matrículas, Financeiro, Turmas, Matriz Curricular etc.) precisa do
   mesmo contorno, sem precisar editar view por view. Antes só existia
   dentro do breakpoint mobile (< 860px) - por isso o vazamento só
   aparecia em telas largas. */
.sga-list-panel {
    margin-top: 0;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

.sga-list-result-count {
    color: var(--sga-ink-muted);
    font-size: .85rem;
    font-weight: 600;
    white-space: nowrap;
}

.sga-list-toolbar {
    display: flex;
    align-items: end;
    gap: .7rem;
    margin-bottom: 1rem;
}

.sga-list-toolbar .sga-search-input {
    flex: 1 1 22rem;
    max-width: 34rem;
}

.sga-list-toolbar--filters {
    align-items: end;
    flex-wrap: wrap;
    padding: .9rem;
    border: 1px solid color-mix(in srgb, var(--sga-border) 80%, transparent);
    border-radius: .75rem;
    background: color-mix(in srgb, var(--sga-bg) 46%, #fff);
}

.sga-list-toolbar--filters .sga-field {
    min-width: 13rem;
    margin-bottom: 0;
}

.sga-table--rich td > span:not(.sga-badge):not(.sga-table__avatar) {
    display: grid;
    gap: .14rem;
}

.sga-table--rich .sga-table__title-cell {
    display: inline-flex !important;
    align-items: center;
    gap: .65rem;
    min-width: 14rem;
}

.sga-table--rich .sga-table__title-cell .sga-table__avatar {
    margin-right: 0;
}

.sga-table--rich small {
    display: block;
    margin-top: .14rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.35;
}

.sga-table--rich strong {
    color: var(--sga-ink);
}

.sga-table--rich .sga-table__avatar {
    vertical-align: middle;
}

.sga-table--rich .sga-table__actions {
    text-align: right;
    vertical-align: middle;
}

@media (max-width: 860px) {
    .sga-list-hero {
        display: grid;
    }

    .sga-list-hero .sga-btn-primary,
    .sga-list-toolbar .sga-btn-secondary {
        width: 100%;
    }

    .sga-list-toolbar {
        display: grid;
    }

    .sga-list-toolbar .sga-search-input {
        max-width: none;
    }

    .sga-list-toolbar--filters .sga-field {
        min-width: 0;
    }

    /* `overflow-x`/`-webkit-overflow-scrolling` de `.sga-list-panel`
       viraram regra incondicional (ver comentário lá em cima) - só o
       `min-width` força o scroll em mobile mesmo (telas largas nunca
       precisam, o conteúdo já cabe organicamente). */
    .sga-list-panel .sga-table--rich {
        min-width: 54rem;
    }
}

.sga-page--reports {
    max-width: 78rem;
    background:
        linear-gradient(135deg, color-mix(in srgb, var(--sga-primary) 5%, transparent), transparent 26rem),
        #fff;
}

.sga-reports-hero {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1.5rem;
    padding-bottom: 1.25rem;
    border-bottom: 1px solid color-mix(in srgb, var(--sga-border) 72%, transparent);
}

.sga-reports-hero h1 {
    margin-bottom: .35rem;
}

.sga-reports-hero p {
    max-width: 48rem;
    margin: 0;
    color: var(--sga-ink-muted);
    font-size: .96rem;
    line-height: 1.55;
}

.sga-reports-hero__actions {
    display: flex;
    flex-wrap: wrap;
    gap: .6rem;
    justify-content: flex-end;
}

.sga-reports-filter {
    display: grid !important;
    grid-template-columns: minmax(14rem, 1.4fr) repeat(2, minmax(10rem, .8fr)) auto;
    gap: .9rem;
    align-items: end;
    margin-top: 1.25rem;
}

.sga-reports-filter .sga-field {
    max-width: none;
}

.sga-reports-summary {
    margin-top: 1.25rem;
}

.sga-reports-grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 1rem;
    margin-top: 1.25rem;
}

.sga-report-card {
    display: flex;
    flex-direction: column;
    min-width: 0;
    padding: 1.05rem;
    border: 1px solid var(--sga-border);
    border-radius: .85rem;
    background: rgba(255, 255, 255, .96);
    box-shadow: 0 12px 30px rgba(15, 23, 42, .055);
}

.sga-report-card__header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: .85rem;
}

.sga-report-card__header h2 {
    margin: 0;
    font-size: 1.02rem;
}

.sga-report-card__header a {
    display: inline-flex;
    align-items: center;
    min-height: 2rem;
    padding: .35rem .68rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 22%, var(--sga-border));
    border-radius: 999px;
    color: var(--sga-primary);
    font-size: .78rem;
    font-weight: 800;
    text-decoration: none;
    white-space: nowrap;
}

.sga-report-card__body {
    display: grid;
    grid-template-columns: minmax(13rem, .9fr) minmax(0, 1.1fr);
    gap: 1rem;
    align-items: stretch;
}

.sga-report-chart {
    min-height: 15rem;
    padding: .7rem;
    border-radius: .7rem;
    background: color-mix(in srgb, var(--sga-bg) 62%, #fff);
}

.sga-report-chart canvas {
    width: 100% !important;
    height: 100% !important;
}

.sga-report-table-wrap {
    min-width: 0;
    max-height: 17rem;
    overflow: auto;
    border: 1px solid color-mix(in srgb, var(--sga-border) 78%, transparent);
    border-radius: .7rem;
}

.sga-table--compact {
    margin: 0;
    font-size: .84rem;
}

.sga-table--compact th,
.sga-table--compact td {
    padding: .58rem .72rem;
}

.sga-report-empty {
    display: grid;
    gap: .22rem;
    padding: 1.2rem;
    border: 1px dashed color-mix(in srgb, var(--sga-border) 85%, transparent);
    border-radius: .75rem;
    background: color-mix(in srgb, var(--sga-bg) 55%, #fff);
    color: var(--sga-ink-muted);
}

.sga-report-empty strong {
    color: var(--sga-ink);
}

.sga-page--coordination {
    max-width: 78rem;
}

.sga-coordination-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 1rem;
    margin-bottom: 1.25rem;
}

.sga-coordination-chart-card {
    min-width: 0;
}

.sga-coordination-chart-card--wide {
    grid-column: span 2;
}

.sga-coordination-chart-card .sga-report-chart {
    min-height: 17rem;
}

.sga-report-chart--empty {
    display: grid;
    place-items: center;
}

.sga-report-chart--empty::before {
    content: 'Sem dados para exibir';
    color: var(--sga-ink-muted);
    font-size: .85rem;
    font-weight: 700;
}

.sga-report-chart--empty canvas {
    display: none !important;
}

.sga-coordination-worklist {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 34rem), 1fr));
    gap: 1rem;
    margin: 1.25rem 0;
    align-items: start;
}

.sga-coordination-worklist .sga-list-panel {
    min-width: 0;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

.sga-coordination-worklist .sga-table--rich {
    min-width: 46rem;
}

@media (max-width: 1180px) {
    .sga-reports-grid {
        grid-template-columns: 1fr;
    }

    .sga-coordination-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .sga-coordination-worklist { grid-template-columns: 1fr; }
}

@media (max-width: 860px) {
    .sga-reports-hero,
    .sga-report-card__body {
        grid-template-columns: 1fr;
    }

    .sga-reports-hero {
        display: grid;
    }

    .sga-reports-hero__actions {
        justify-content: stretch;
    }

    .sga-reports-hero__actions > * {
        width: 100%;
    }

    .sga-reports-filter {
        grid-template-columns: 1fr;
    }

    .sga-coordination-grid {
        grid-template-columns: 1fr;
    }

    .sga-coordination-chart-card--wide {
        grid-column: auto;
    }
}

.sga-checkbox {
    display: flex;
    align-items: center;
    gap: .55rem;
    width: fit-content;
    min-height: 2rem;
    margin: .25rem 0;
    padding: .28rem .5rem .28rem .35rem;
    border: 1px solid transparent;
    border-radius: .5rem;
    color: var(--sga-ink);
    font-weight: 400;
    transition: background .15s ease, border-color .15s ease;
}

.sga-checkbox:hover {
    border-color: color-mix(in srgb, var(--sga-primary) 18%, var(--sga-border));
    background: color-mix(in srgb, var(--sga-primary) 5%, #fff);
}

.sga-checkbox input {
    width: 1.05rem;
    height: 1.05rem;
    margin: 0;
    accent-color: var(--sga-primary);
}

.sga-checkbox:has(input:checked) {
    border-color: color-mix(in srgb, var(--sga-primary) 28%, var(--sga-border));
    background: color-mix(in srgb, var(--sga-primary) 7%, #fff);
    font-weight: 600;
}

/* Pedido do usuário (2026-09-15, print da tela de Candidatos): um
   checkbox pelado ao lado de input/select com borda destoava - mesma
   altura/borda/raio dos campos de texto (`.sga-field input`) pra ficar
   na mesma "família" visual da barra de filtro, em vez de um controle
   solto. `:has()` já é usado em outro lugar deste arquivo (ações da
   tabela) - suportado nos browsers alvo deste projeto. */
.sga-filter-toggle {
    display: inline-flex;
    align-items: center;
    gap: .55rem;
    height: 2.55rem;
    padding: 0 .9rem;
    border: 1px solid var(--sga-border);
    border-radius: .5rem;
    background: #fff;
    font-size: .9rem;
    font-weight: 500;
    color: var(--sga-ink);
    cursor: pointer;
    white-space: nowrap;
    transition: border-color .15s ease, background .15s ease;
}

.sga-filter-toggle input {
    width: 1.05rem;
    height: 1.05rem;
    margin: 0;
    accent-color: var(--sga-primary);
    cursor: pointer;
}

.sga-filter-toggle:has(input:checked) {
    border-color: var(--sga-primary);
    background: color-mix(in srgb, var(--sga-primary) 7%, #fff);
}

/* Pedido do usuário (2026-09-15): links soltos "Rótulo →" (texto puro)
   viram um botão-menu de verdade - rótulo à esquerda, ícone à direita,
   mesma linguagem visual dos botões-pílula de ação da tabela. Não se
   aplica a `.sga-kpi-card__link` (já tem tratamento próprio dentro do
   cartão do dashboard). */
.sga-menu-link {
    display: inline-flex;
    align-items: center;
    justify-content: space-between;
    gap: 1.5rem;
    padding: .65rem 1rem;
    background: #fff;
    border: 1px solid var(--sga-border);
    border-radius: .5rem;
    color: var(--sga-ink);
    font-weight: 600;
    font-size: .9rem;
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease;
    box-shadow: 0 6px 16px rgba(15, 23, 42, .035);
}

.sga-menu-link:hover {
    border-color: var(--sga-primary);
    background: var(--sga-bg);
    box-shadow: 0 10px 24px rgba(15, 23, 42, .06);
}

.sga-menu-link svg {
    width: 1rem;
    height: 1rem;
    color: var(--sga-primary);
    flex-shrink: 0;
}

.sga-recovery-codes {
    padding: 1rem 1.2rem;
    background: #FEF9C3;
    border: 1px solid #EAB308;
    border-radius: .5rem;
    margin-bottom: 1.25rem;
}

.sga-recovery-codes ul {
    columns: 2;
    margin: .5rem 0 0;
    padding-left: 1.1rem;
}

.sga-recovery-codes code {
    font-size: .95rem;
}

/* ---------- Portal do Aluno - dashboard (redesign UX, pedido do
   usuário de 2026-09-13: "rapidamente ter em seu dashboard os cursos
   matriculados e todas as informações relevantes de um SGA") ---------- */

.sga-page--student-dashboard {
    max-width: 76rem;
    background:
        linear-gradient(180deg, color-mix(in srgb, var(--sga-primary) 6%, #fff), #fff 19rem),
        #fff;
    border-color: color-mix(in srgb, var(--sga-primary) 10%, var(--sga-border));
}

.sga-student-hero {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(14rem, 19rem);
    gap: 1.5rem;
    align-items: center;
    margin-bottom: 1.35rem;
}

.sga-student-hero__identity {
    display: flex;
    align-items: center;
    gap: 1.2rem;
    min-width: 0;
}

.sga-student-avatar {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 5.2rem;
    height: 5.2rem;
    flex: none;
    border-radius: 50%;
    background: color-mix(in srgb, var(--sga-primary) 13%, #fff);
    color: var(--sga-primary);
    font-size: 1.55rem;
    font-weight: 800;
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--sga-primary) 12%, transparent);
}

.sga-student-hero h1 {
    margin: .2rem 0 .35rem;
    color: var(--sga-ink);
    font-size: 2.35rem;
    line-height: 1.08;
    letter-spacing: 0;
}

.sga-student-hero p {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: .45rem;
    margin: 0;
    color: var(--sga-ink-muted);
    font-size: .98rem;
}

.sga-student-hero__actions {
    display: grid;
    gap: .75rem;
    justify-items: stretch;
}

.sga-student-hero__actions .sga-btn-primary {
    justify-self: end;
}

.sga-student-hero__actions blockquote {
    margin: 0;
    padding: 1rem 1.1rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 13%, var(--sga-border));
    border-radius: .75rem;
    background: rgba(255, 255, 255, .72);
    color: color-mix(in srgb, var(--sga-primary) 72%, var(--sga-ink));
    font-size: .92rem;
    font-weight: 700;
    line-height: 1.45;
}

.sga-student-muted {
    color: var(--sga-ink-muted);
    font-size: .82rem;
}

.sga-student-overview {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(18rem, 22rem);
    gap: 1rem;
    margin: 1rem 0;
}

.sga-student-progress-card,
.sga-student-next-card {
    padding: 1.15rem 1.25rem;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    background: #fff;
    box-shadow: 0 8px 24px rgba(15, 23, 42, .05);
}

.sga-student-progress-card {
    display: flex;
    align-items: center;
    gap: 1.25rem;
}

.sga-student-progress-card h2,
.sga-student-next-card h2 {
    margin: .15rem 0 .35rem;
    color: var(--sga-ink);
    font-size: 1.12rem;
}

.sga-student-progress-card p {
    margin: 0 0 .55rem;
    color: var(--sga-ink-muted);
    font-size: .92rem;
}

.sga-student-progress-card a {
    color: var(--sga-primary);
    font-size: .86rem;
    font-weight: 700;
    text-decoration: none;
}

.sga-student-progress-card a:hover { text-decoration: underline; }

.sga-student-progress-ring {
    display: grid;
    place-items: center;
    width: 8.6rem;
    height: 8.6rem;
    flex: none;
    border-radius: 50%;
    background:
        radial-gradient(circle at center, #fff 0 59%, transparent 60%),
        conic-gradient(var(--sga-primary) var(--sga-student-progress), color-mix(in srgb, var(--sga-primary) 11%, var(--sga-border)) 0);
}

.sga-student-progress-ring div {
    display: grid;
    place-items: center;
}

.sga-student-progress-ring strong {
    color: var(--sga-ink);
    font-size: 1.8rem;
    line-height: 1;
}

.sga-student-progress-ring span {
    margin-top: .2rem;
    color: var(--sga-ink-muted);
    font-size: .74rem;
    font-weight: 700;
}

.sga-student-task-list {
    display: grid;
    gap: .55rem;
    margin-top: .85rem;
}

.sga-student-task {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    gap: .7rem;
    align-items: center;
    padding: .65rem .7rem;
    border: 1px solid var(--sga-border);
    border-radius: .65rem;
    background: color-mix(in srgb, var(--sga-bg) 38%, #fff);
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-student-task:hover {
    transform: translateY(-1px);
    border-color: var(--sga-primary);
    background: #fff;
}

.sga-student-task .sga-kpi-card__icon {
    width: 2.35rem;
    height: 2.35rem;
    margin: 0;
    border-radius: .65rem;
}

.sga-student-task strong,
.sga-student-task small {
    display: block;
    min-width: 0;
}

.sga-student-task strong {
    font-size: .86rem;
}

.sga-student-task small {
    margin-top: .15rem;
    color: var(--sga-ink-muted);
    font-size: .76rem;
    line-height: 1.25;
}

.sga-student-task em {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.85rem;
    height: 1.85rem;
    border-radius: 50%;
    background: color-mix(in srgb, var(--sga-primary) 9%, #fff);
    color: var(--sga-primary);
    font-style: normal;
    font-weight: 800;
}

.sga-student-task--critical em {
    background: #FEE2E2;
    color: #991B1B;
}

.sga-student-task--warn em {
    background: #FEF3C7;
    color: #92400E;
}

.sga-student-task--ok em {
    background: #DCFCE7;
    color: #166534;
}

.sga-kpi-grid--student {
    grid-template-columns: repeat(5, minmax(0, 1fr));
    margin-top: 1rem;
}

.sga-kpi-card--student {
    position: relative;
    min-height: 10.25rem;
    padding: 1rem;
    overflow: hidden;
    background:
        linear-gradient(145deg, color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 7%, transparent), transparent 54%),
        #fff;
    border-color: color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 13%, var(--sga-border));
    box-shadow: 0 10px 26px rgba(15, 23, 42, .045);
    container-type: inline-size;
}

.sga-kpi-card--student::before {
    content: '';
    position: absolute;
    inset: 0 auto 0 0;
    width: 4px;
    background: var(--sga-student-card-color, var(--sga-primary));
    opacity: .85;
}

.sga-kpi-card--student::after {
    content: '';
    position: absolute;
    right: -2rem;
    top: -2.4rem;
    width: 7rem;
    height: 7rem;
    border-radius: 50%;
    background: color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 8%, transparent);
    pointer-events: none;
}

.sga-kpi-card--student-progress { --sga-student-card-color: var(--sga-primary); }
.sga-kpi-card--student-documents { --sga-student-card-color: #2563EB; }
.sga-kpi-card--student-finance { --sga-student-card-color: #D97706; }
.sga-kpi-card--student-requirements { --sga-student-card-color: #7C3AED; }
.sga-kpi-card--student-notifications { --sga-student-card-color: #0891B2; }

.sga-kpi-card--student > * {
    position: relative;
    z-index: 1;
}

.sga-kpi-card--student .sga-kpi-card__icon {
    width: 2.75rem;
    height: 2.75rem;
    margin-bottom: .95rem;
    border-radius: .8rem;
    background: color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 12%, #fff);
    color: var(--sga-student-card-color, var(--sga-primary));
}

.sga-kpi-card--student .sga-kpi-card__value {
    color: var(--sga-ink);
    /* Mesmo raciocínio do cartão "executive" (ver container-type acima)
       - `cqi` mede a largura do próprio cartão, não da viewport. */
    font-size: clamp(1.5rem, .99rem + 5.64cqi, 2.12rem);
    font-weight: 800;
}

.sga-kpi-card--student .sga-kpi-card__label {
    margin-top: .45rem;
    font-size: .92rem;
    font-weight: 700;
    line-height: 1.25;
}

.sga-kpi-card--student .sga-kpi-card__detail {
    min-height: 2.25rem;
    margin-top: .25rem;
    color: var(--sga-ink-muted);
    font-size: .82rem;
    line-height: 1.25;
}

.sga-kpi-card--student .sga-kpi-card__link {
    display: inline-flex;
    align-items: center;
    align-self: flex-start;
    margin-top: auto;
    padding: .42rem .62rem;
    border-radius: 999px;
    background: color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 9%, #fff);
    color: color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 78%, var(--sga-ink));
    font-size: .78rem;
    font-weight: 800;
    transition: background .15s ease, transform .15s ease;
}

.sga-kpi-card--student:hover {
    border-color: var(--sga-student-card-color, var(--sga-primary));
    box-shadow: 0 14px 34px rgba(15, 23, 42, .075);
}

.sga-kpi-card--student:hover .sga-kpi-card__link {
    transform: translateX(2px);
    background: color-mix(in srgb, var(--sga-student-card-color, var(--sga-primary)) 14%, #fff);
}

.sga-student-secondary {
    display: grid;
    grid-template-columns: minmax(0, 1.1fr) minmax(18rem, .9fr);
    gap: 1rem;
    margin-top: 1rem;
}

.sga-student-summary-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: .75rem;
}

.sga-student-summary-card {
    min-width: 0;
    min-height: 8.5rem;
    padding: .9rem;
    border: 1px solid var(--sga-border);
    border-radius: .7rem;
    background:
        linear-gradient(145deg, color-mix(in srgb, var(--sga-primary) 5%, transparent), transparent 60%),
        color-mix(in srgb, var(--sga-bg) 42%, #fff);
}

.sga-student-summary-card .sga-kpi-card__icon {
    width: 2.45rem;
    height: 2.45rem;
    margin: 0 0 .75rem;
    border-radius: .7rem;
}

.sga-student-summary-card strong {
    display: block;
    color: var(--sga-ink);
    font-size: 1.35rem;
    font-weight: 800;
    line-height: 1.05;
    overflow-wrap: normal;
}

.sga-student-summary-card small {
    display: block;
    margin-top: .35rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.3;
}

.sga-student-summary-card--warn {
    border-color: #FCD34D;
    background:
        linear-gradient(145deg, #FFFBEB, #fff 64%),
        #fff;
}

.sga-student-link-list {
    display: grid;
    gap: .55rem;
}

.sga-student-link-row {
    grid-template-columns: auto minmax(0, 1fr) auto;
    padding: .68rem .78rem;
}

.sga-student-link-row em {
    color: var(--sga-primary);
    font-size: 1.25rem;
    font-style: normal;
    font-weight: 800;
}

.sga-student-workspace {
    display: grid;
    grid-template-columns: minmax(0, 1.25fr) minmax(18rem, .75fr);
    gap: 1rem;
    align-items: start;
    margin-top: 1rem;
}

.sga-student-main-stack {
    display: grid;
    gap: 1rem;
    min-width: 0;
}

.sga-student-course-list,
.sga-student-feed-list {
    display: grid;
    gap: .55rem;
}

.sga-student-course-row {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) 3rem auto auto;
    gap: .85rem;
    align-items: center;
    min-height: 4.3rem;
    padding: .62rem .75rem;
    border: 1px solid var(--sga-border);
    border-radius: .65rem;
    background: #fff;
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-student-course-row:hover,
.sga-student-feed-row:hover {
    transform: translateY(-1px);
    border-color: var(--sga-primary);
    background: color-mix(in srgb, var(--sga-bg) 30%, #fff);
}

.sga-student-course-row__thumb {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 3rem;
    height: 3rem;
    border-radius: .7rem;
    background:
        linear-gradient(135deg, color-mix(in srgb, var(--sga-primary) 15%, #fff), #fff),
        #fff;
    color: var(--sga-primary);
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--sga-primary) 10%, transparent);
}

.sga-student-course-row__thumb .sga-shell__nav-icon {
    width: 1.25rem;
    height: 1.25rem;
}

.sga-student-course-row__main {
    display: grid;
    min-width: 0;
}

.sga-student-course-row__main strong,
.sga-student-feed-row strong {
    color: var(--sga-ink);
    font-size: .9rem;
    line-height: 1.25;
}

.sga-student-course-row__main small,
.sga-student-feed-row small {
    margin-top: .15rem;
    color: var(--sga-ink-muted);
    font-size: .78rem;
    line-height: 1.25;
}

.sga-student-course-row__track,
.sga-student-general-progress__track {
    display: block;
    height: .42rem;
    margin-top: .48rem;
    overflow: hidden;
    border-radius: 999px;
    background: color-mix(in srgb, var(--sga-border) 72%, #fff);
}

.sga-student-course-row__track span,
.sga-student-general-progress__track span {
    display: block;
    height: 100%;
    min-width: .35rem;
    border-radius: inherit;
    background: linear-gradient(90deg, var(--sga-primary), var(--sga-nav-accent));
}

.sga-student-course-row__percent {
    color: var(--sga-ink);
    font-size: .85rem;
    font-weight: 800;
    text-align: right;
}

.sga-student-course-row > em {
    color: var(--sga-primary);
    font-size: 1.25rem;
    font-style: normal;
    font-weight: 800;
}

.sga-student-general-progress {
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--sga-border);
}

.sga-student-general-progress .sga-dashboard-card__header {
    align-items: flex-end;
    margin-bottom: .65rem;
}

.sga-student-general-progress .sga-dashboard-card__header strong {
    color: var(--sga-ink);
    font-size: 1.05rem;
}

.sga-student-general-progress small {
    display: block;
    margin-top: .45rem;
    color: var(--sga-ink-muted);
    font-size: .82rem;
}

.sga-student-period-panel .sga-dashboard-card__header > span {
    color: var(--sga-ink-muted);
    font-size: .86rem;
}

.sga-student-period-panel .sga-course-grid--student {
    margin-top: .85rem;
}

.sga-student-feed-stack {
    display: grid;
    gap: 1rem;
    align-content: start;
}

.sga-student-feed-row {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr) auto;
    gap: .7rem;
    align-items: center;
    min-height: 3.75rem;
    padding: .62rem .7rem;
    border: 1px solid var(--sga-border);
    border-radius: .65rem;
    background: #fff;
    color: var(--sga-ink);
    text-decoration: none;
    transition: border-color .15s ease, background .15s ease, transform .15s ease;
}

.sga-student-feed-row__date {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.85rem;
    height: 2.85rem;
    flex-direction: column;
    border-radius: .7rem;
    background: color-mix(in srgb, var(--sga-primary) 9%, #fff);
    color: var(--sga-primary);
}

.sga-student-feed-row--warn .sga-student-feed-row__date {
    background: #FEF3C7;
    color: #92400E;
}

.sga-student-feed-row--critical .sga-student-feed-row__date {
    background: #FEE2E2;
    color: #991B1B;
}

.sga-student-feed-row__date .sga-shell__nav-icon {
    width: 1.15rem;
    height: 1.15rem;
}

.sga-student-feed-row__date strong {
    color: inherit;
    font-size: 1rem;
    line-height: 1;
}

.sga-student-feed-row__date small {
    margin-top: .08rem;
    color: inherit;
    font-size: .62rem;
    font-weight: 800;
}

.sga-student-feed-row em {
    color: var(--sga-ink-muted);
    font-size: .72rem;
    font-style: normal;
    font-weight: 700;
    text-align: right;
    white-space: nowrap;
}

.sga-section-title--student {
    align-items: flex-end;
}

.sga-section-title--student > div {
    min-width: 0;
}

.sga-section-title--student h2 {
    margin: .15rem 0 0;
}

.sga-section-title--student > span {
    color: var(--sga-ink-muted);
    font-size: .85rem;
}

/* Cartão por disciplina em andamento (período atual da matrícula, ver
   Enrollment::currentPeriodOverview()) - mesmo espírito visual dos
   "cartões de curso" do Moodle (motivo do pedido original do usuário
   de "algo mais moderno, como o Moodle mostra", F3-07), sem duplicar a
   tabela completa da matriz, que já tem tela própria ("Meu Curso"). */
.sga-course-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr));
    gap: 1rem;
    margin: 1rem 0 1.5rem;
}

.sga-course-grid--student {
    grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
}

.sga-course-card {
    display: flex;
    flex-direction: column;
    border: 1px solid var(--sga-border);
    border-radius: .75rem;
    overflow: hidden;
    background: #fff;
    text-decoration: none;
    color: inherit;
    transition: box-shadow .15s ease, border-color .15s ease;
}

.sga-course-card:hover {
    border-color: var(--sga-primary);
    box-shadow: 0 4px 14px rgba(0, 0, 0, .08);
}

.sga-course-card--student {
    border-radius: .75rem;
    box-shadow: 0 8px 24px rgba(15, 23, 42, .04);
}

.sga-course-card__banner {
    height: .45rem;
    background: linear-gradient(90deg, var(--sga-primary), var(--sga-nav-accent));
}

.sga-course-card__body {
    padding: 1rem 1.1rem;
    flex: 1;
}

.sga-course-card__top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: .75rem;
    margin-bottom: .65rem;
}

.sga-course-card__top .sga-kpi-card__icon {
    width: 2.5rem;
    height: 2.5rem;
    margin: 0;
}

.sga-course-card__code {
    display: block;
    font-size: .7rem;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--sga-ink-muted);
    margin-bottom: .25rem;
}

.sga-course-card__title {
    font-size: .95rem;
    font-weight: 700;
    line-height: 1.3;
    margin-bottom: .7rem;
}

.sga-course-card__progress {
    height: .45rem;
    margin: 0 0 .75rem;
    overflow: hidden;
    border-radius: 999px;
    background: color-mix(in srgb, var(--sga-border) 70%, #fff);
}

.sga-course-card__progress span {
    display: block;
    height: 100%;
    min-width: .35rem;
    border-radius: inherit;
    background: linear-gradient(90deg, var(--sga-primary), var(--sga-nav-accent));
}

.sga-course-card__meta {
    display: flex;
    flex-wrap: wrap;
    gap: .4rem;
}

.sga-section-title {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: .5rem;
    margin: 2rem 0 0;
}

.sga-section-title h2 { margin: 0; }

.sga-student-footnote {
    color: var(--sga-ink-muted);
    font-size: .85rem;
    margin-top: -.75rem;
}

@media (max-width: 1180px) {
    .sga-kpi-grid--student {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    .sga-student-overview,
    .sga-student-secondary,
    .sga-student-workspace {
        grid-template-columns: 1fr;
    }
}

@media (max-width: 760px) {
    .sga-student-hero {
        grid-template-columns: 1fr;
    }

    .sga-student-hero__identity,
    .sga-student-progress-card {
        align-items: flex-start;
    }

    .sga-student-hero h1 {
        font-size: 2rem;
    }

    .sga-student-avatar {
        width: 3.6rem;
        height: 3.6rem;
        font-size: 1rem;
    }

    .sga-student-hero__actions .sga-btn-primary {
        justify-self: stretch;
        text-align: center;
    }

    .sga-student-progress-card {
        flex-direction: column;
    }

    .sga-student-progress-ring {
        width: 7.4rem;
        height: 7.4rem;
    }

    .sga-kpi-grid--student,
    .sga-course-grid--student,
    .sga-student-summary-grid {
        grid-template-columns: 1fr;
    }

    .sga-student-course-row {
        grid-template-columns: auto minmax(0, 1fr) auto;
    }

    .sga-student-course-row__percent {
        grid-column: 2;
        text-align: left;
    }

    .sga-student-course-row .sga-badge {
        grid-column: 2;
        justify-self: start;
    }

    .sga-student-feed-row {
        grid-template-columns: auto minmax(0, 1fr);
    }

    .sga-student-feed-row em {
        grid-column: 2;
        text-align: left;
    }
}

/* Pedido do usuário (2026-09-16): ordenação por coluna, escolha de
   colunas visíveis e navegação linear (Anterior/Próxima) em toda
   tabela de listagem do sistema - `sga-table-enhance.js` decora
   automaticamente qualquer `table.sga-table` com `<thead>` de mais
   de uma coluna, sem precisar tocar view por view. */
.sga-table-toolbar {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: .5rem;
    margin-bottom: .6rem;
}

.sga-table-columns {
    position: relative;
}

.sga-table-columns__toggle {
    display: inline-flex;
    align-items: center;
    gap: .4rem;
    min-height: 2.1rem;
    padding: .4rem .8rem;
    font-size: .82rem;
}

.sga-table-columns__toggle svg {
    width: 1rem;
    height: 1rem;
    flex-shrink: 0;
}

.sga-table-scroll-controls {
    display: flex;
    gap: .4rem;
}

.sga-table-scroll-controls__btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.1rem;
    min-height: 2.1rem;
    padding: 0;
}

.sga-table-scroll-controls__btn svg {
    width: 1rem;
    height: 1rem;
}

.sga-btn-secondary:disabled,
.sga-btn-secondary:disabled:hover {
    opacity: .4;
    cursor: default;
    background: #fff;
    transform: none;
}

.sga-table-columns__panel {
    position: absolute;
    z-index: 20;
    top: calc(100% + .35rem);
    right: 0;
    min-width: 14rem;
    max-height: 18rem;
    overflow-y: auto;
    padding: .5rem;
    border: 1px solid var(--sga-border);
    border-radius: .6rem;
    background: #fff;
    box-shadow: 0 12px 28px rgba(15, 23, 42, .14);
}

.sga-table-columns__panel .sga-checkbox {
    width: 100%;
    font-size: .84rem;
}

.sga-table thead th.sga-table__sortable {
    cursor: pointer;
    user-select: none;
    -webkit-user-select: none;
}

.sga-table thead th.sga-table__sortable:hover {
    color: var(--sga-ink);
}

.sga-table thead th.sga-table__sortable:focus-visible {
    outline: 2px solid var(--sga-primary);
    outline-offset: -2px;
}

.sga-table__sort-indicator {
    display: inline-block;
    margin-left: .3rem;
    opacity: .35;
}

.sga-table__sort-indicator::after {
    content: '\2195';
}

.sga-table__sortable--asc .sga-table__sort-indicator,
.sga-table__sortable--desc .sga-table__sort-indicator {
    opacity: 1;
    color: var(--sga-primary);
}

.sga-table__sortable--asc .sga-table__sort-indicator::after {
    content: '\2191';
}

.sga-table__sortable--desc .sga-table__sort-indicator::after {
    content: '\2193';
}

.sga-pagination {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    margin-top: 1.2rem;
}

.sga-pagination__link {
    display: inline-flex;
    align-items: center;
    padding: .5rem .95rem;
    border: 1px solid color-mix(in srgb, var(--sga-primary) 18%, var(--sga-border));
    border-radius: .55rem;
    color: var(--sga-primary);
    font-weight: 700;
    font-size: .85rem;
    text-decoration: none;
    transition: background .15s ease, border-color .15s ease, transform .15s ease;
}

.sga-pagination__link:hover {
    border-color: var(--sga-primary);
    background: color-mix(in srgb, var(--sga-primary) 7%, #fff);
    transform: translateY(-1px);
}

.sga-pagination__link--disabled {
    color: var(--sga-ink-muted);
    border-color: var(--sga-border);
    opacity: .55;
    cursor: default;
}

.sga-pagination__link--disabled:hover {
    background: none;
    transform: none;
}

.sga-pagination__status {
    color: var(--sga-ink-muted);
    font-size: .82rem;
    font-weight: 600;
}

@media (max-width: 640px) {
    .sga-table-columns__panel {
        left: 0;
        right: 0;
        min-width: 0;
    }

    .sga-pagination {
        gap: .6rem;
    }

    .sga-pagination__link {
        padding: .5rem .7rem;
        font-size: .8rem;
    }
}

/* Pedido do usuário (2026-09-17): "Templates de notificação" empilhava
   uma tabela por tipo de evento, cada uma com sua própria barra
   "Colunas" (injetada pelo `sga-table-enhance.js`) - poluído demais pra
   navegar. Abas simples (mostra só o tipo selecionado por vez, resto
   fica com `hidden`) - ver notification-templates/index.blade.php. */
.sga-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: .25rem;
    margin: 1.25rem 0 .25rem;
    border-bottom: 1px solid var(--sga-border);
}

.sga-tabs__tab {
    appearance: none;
    border: none;
    background: transparent;
    padding: .65rem 1rem;
    margin-bottom: -1px;
    font-size: .86rem;
    font-weight: 600;
    font-family: inherit;
    color: var(--sga-ink-muted);
    border-bottom: 2px solid transparent;
    cursor: pointer;
    white-space: nowrap;
}

.sga-tabs__tab:hover {
    color: var(--sga-ink);
}

.sga-tabs__tab--active {
    color: var(--sga-primary);
    border-bottom-color: var(--sga-primary);
}

.sga-tabs__panel {
    margin-top: 1.25rem;
}

/* Pedido do usuário (2026-09-17): tela de curso (courses/show.blade.php)
   "bem confusa e pouco intuitiva" - era uma sequência de <h2>+<table>
   soltos, sem separação visual nenhuma entre Matriz/Turmas/
   Coordenadores/Documentos/Financeiro. Cada seção vira um
   `.sga-dashboard-card` (mesmo cartão já usado no dashboard da home),
   com espaçamento consistente entre elas. */
.sga-course-sections {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    margin-top: 1.5rem;
}

.sga-course-sections .sga-table {
    margin-top: 0;
}

/* Formulário "Adicionar coordenador"/"Adicionar tipo de documento" -
   antes era filho direto de `.sga-page`, herdando o quadro pesado
   (borda + fundo) pensado pra filtro de listagem (`.sga-page > .sga-form`
   em sga.css). Dentro do card já tem contorno próprio - só precisa do
   respiro de cima. */
.sga-course-inline-form {
    display: flex;
    gap: 1rem;
    align-items: flex-end;
    flex-wrap: wrap;
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid color-mix(in srgb, var(--sga-border) 70%, transparent);
}

