/* ==========================================================================
   gestForm — Folha de estilos principal
   Assenta sobre o Bootstrap 5; aqui ficam só o layout da aplicação e os
   componentes próprios.
   ========================================================================== */

:root {
    --gf-sidebar-largura: 248px;
    --gf-topo-altura: 60px;

    --gf-tinta: #0f172a;
    --gf-tinta-suave: #475569;
    --gf-tinta-fraca: #94a3b8;
    --gf-fundo: #f1f5f9;
    --gf-superficie: #ffffff;
    --gf-linha: #e2e8f0;

    --gf-primaria: #2563eb;
    --gf-primaria-escura: #1d4ed8;
    --gf-primaria-fraca: #eff6ff;

    --gf-escuro: #0f172a;
    --gf-escuro-suave: #1e293b;

    --gf-raio: 12px;
    --gf-sombra: 0 1px 2px rgba(15, 23, 42, .04), 0 4px 12px rgba(15, 23, 42, .06);
}

body {
    background: var(--gf-fundo);
    color: var(--gf-tinta);
    font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    font-size: 15px;
}

/* ==========================================================================
   Layout
   ========================================================================== */

.gf-layout {
    display: flex;
    min-height: 100vh;
    /* `dvh` acompanha a barra do Safari a esconder-se; em modo app dá o mesmo
       que 100vh, mas no browser evita a barra de deslocamento fantasma. */
    min-height: 100dvh;
}

.gf-principal {
    flex: 1 1 auto;
    min-width: 0;                  /* impede que tabelas largas estiquem o layout */
    display: flex;
    flex-direction: column;
    margin-left: var(--gf-sidebar-largura);
}

.gf-conteudo {
    flex: 1 1 auto;
    padding: 1.5rem;
    /* Em paisagem, o entalhe do iPhone come a margem esquerda. */
    padding-left: max(1.5rem, env(safe-area-inset-left));
    padding-right: max(1.5rem, env(safe-area-inset-right));
    max-width: 1500px;
    width: 100%;
}

.gf-rodape {
    padding: 1rem 1.5rem 2rem;
    padding-bottom: calc(2rem + env(safe-area-inset-bottom));
    color: var(--gf-tinta-fraca);
    font-size: .8125rem;
}

/* ==========================================================================
   Barra lateral
   ========================================================================== */

.gf-sidebar {
    position: fixed;
    inset: 0 auto 0 0;
    width: var(--gf-sidebar-largura);
    background: var(--gf-escuro);
    color: #cbd5e1;
    display: flex;
    flex-direction: column;
    z-index: 1040;
}

.gf-sidebar__marca {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0 1rem;
    padding-left: max(1rem, env(safe-area-inset-left));
    height: calc(var(--gf-topo-altura) + env(safe-area-inset-top));
    padding-top: env(safe-area-inset-top);
    border-bottom: 1px solid rgba(255, 255, 255, .08);
}

.gf-marca {
    display: flex;
    align-items: center;
    gap: .625rem;
    color: #fff;
    text-decoration: none;
    font-weight: 600;
    font-size: 1.0625rem;
}

.gf-marca__icone {
    display: grid;
    place-items: center;
    width: 32px;
    height: 32px;
    border-radius: 9px;
    background: var(--gf-primaria);
    color: #fff;
    font-size: 1rem;
}

.gf-marca__icone--grande {
    width: 52px;
    height: 52px;
    border-radius: 14px;
    font-size: 1.5rem;
    margin-inline: auto;
}

.gf-sidebar__fechar {
    color: #cbd5e1;
    border: 0;
}

.gf-nav {
    flex: 1 1 auto;
    overflow-y: auto;
    padding: .875rem .625rem;
}

.gf-nav__item {
    display: flex;
    align-items: center;
    gap: .75rem;
    padding: .5625rem .75rem;
    border-radius: 8px;
    color: #cbd5e1;
    text-decoration: none;
    font-size: .9375rem;
    line-height: 1.3;
    transition: background-color .12s, color .12s;
}

.gf-nav__item i {
    font-size: 1.0625rem;
    width: 20px;
    text-align: center;
    flex: 0 0 auto;
    opacity: .85;
}

.gf-nav__item:hover {
    background: rgba(255, 255, 255, .06);
    color: #fff;
}

.gf-nav__item.is-ativo {
    background: var(--gf-primaria);
    color: #fff;
    font-weight: 500;
}

.gf-nav__item.is-ativo i {
    opacity: 1;
}

.gf-nav__grupo {
    margin-top: 1.125rem;
}

.gf-nav__titulo {
    padding: 0 .75rem .375rem;
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: #64748b;
}

.gf-sidebar__rodape {
    padding: .875rem;
    padding-bottom: calc(.875rem + env(safe-area-inset-bottom));
    border-top: 1px solid rgba(255, 255, 255, .08);
}

.gf-sidebar__fundo {
    position: fixed;
    inset: 0;
    background: rgba(15, 23, 42, .5);
    z-index: 1035;
}

/* ==========================================================================
   Barra superior
   ========================================================================== */

.gf-topo {
    position: sticky;
    top: 0;
    z-index: 1020;
    display: flex;
    align-items: center;
    gap: .75rem;
    height: calc(var(--gf-topo-altura) + env(safe-area-inset-top));
    padding: 0 1.5rem;
    padding-top: env(safe-area-inset-top);
    padding-left: max(1.5rem, env(safe-area-inset-left));
    padding-right: max(1.5rem, env(safe-area-inset-right));
    background: rgba(255, 255, 255, .92);
    backdrop-filter: blur(8px);
    border-bottom: 1px solid var(--gf-linha);
}

.gf-topo__menu {
    padding: .25rem .5rem;
    font-size: 1.375rem;
    line-height: 1;
    color: var(--gf-tinta-suave);
}

.gf-topo__acoes {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: .5rem;
}

.gf-topo__botao {
    display: grid;
    place-items: center;
    width: 38px;
    height: 38px;
    border-radius: 9px;
    color: var(--gf-tinta-suave);
    font-size: 1.125rem;
    text-decoration: none;
}

.gf-topo__botao:hover {
    background: var(--gf-fundo);
    color: var(--gf-tinta);
}

.gf-topo__contador {
    position: absolute;
    top: 2px;
    right: 0;
    font-size: .625rem;
    padding: .15em .4em;
}

.gf-topo__perfil {
    display: flex;
    align-items: center;
    gap: .5rem;
    padding: .25rem .5rem .25rem .25rem;
    border: 0;
    background: transparent;
    border-radius: 999px;
    color: var(--gf-tinta);
    font-size: .875rem;
}

.gf-topo__perfil:hover {
    background: var(--gf-fundo);
}

.gf-avatar {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    object-fit: cover;
    flex: 0 0 auto;
}

.gf-avatar--iniciais {
    display: grid;
    place-items: center;
    background: var(--gf-primaria-fraca);
    color: var(--gf-primaria-escura);
    font-size: .75rem;
    font-weight: 600;
}

.gf-avatar--grande {
    width: 96px;
    height: 96px;
    font-size: 1.75rem;
}

/* Pesquisa global -------------------------------------------------------- */

.gf-procura {
    position: relative;
    flex: 1 1 auto;
    max-width: 460px;
}

.gf-procura__icone {
    position: absolute;
    left: .75rem;
    top: 50%;
    transform: translateY(-50%);
    color: var(--gf-tinta-fraca);
    pointer-events: none;
    font-size: .9375rem;
}

.gf-procura .form-control {
    padding-left: 2.25rem;
    background: var(--gf-fundo);
    border-color: transparent;
    font-size: .875rem;
}

.gf-procura .form-control:focus {
    background: #fff;
    border-color: var(--gf-primaria);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, .12);
}

.gf-procura__resultados {
    position: absolute;
    top: calc(100% + .375rem);
    left: 0;
    right: 0;
    max-height: 420px;
    overflow-y: auto;
    background: #fff;
    border: 1px solid var(--gf-linha);
    border-radius: var(--gf-raio);
    box-shadow: var(--gf-sombra);
    padding: .375rem;
    z-index: 1030;
}

.gf-procura__grupo {
    padding: .5rem .625rem .25rem;
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--gf-tinta-fraca);
}

.gf-procura__item {
    display: block;
    padding: .4375rem .625rem;
    border-radius: 8px;
    color: var(--gf-tinta);
    text-decoration: none;
    font-size: .875rem;
}

.gf-procura__item:hover,
.gf-procura__item:focus {
    background: var(--gf-primaria-fraca);
    color: var(--gf-primaria-escura);
}

.gf-procura__item small {
    display: block;
    color: var(--gf-tinta-fraca);
    font-size: .75rem;
}

/* ==========================================================================
   Cabeçalhos de página e breadcrumbs
   ========================================================================== */

.gf-breadcrumb {
    font-size: .8125rem;
    margin-bottom: .875rem;
}

.gf-breadcrumb a {
    color: var(--gf-tinta-suave);
    text-decoration: none;
}

.gf-breadcrumb a:hover {
    color: var(--gf-primaria);
}

.gf-cabecalho {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1.25rem;
}

.gf-cabecalho h1 {
    font-size: 1.5rem;
    font-weight: 600;
    margin: 0;
    line-height: 1.25;
}

.gf-cabecalho p {
    margin: .25rem 0 0;
    color: var(--gf-tinta-suave);
    font-size: .875rem;
}

.gf-cabecalho__acoes {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
}

/* ==========================================================================
   Cartões
   ========================================================================== */

.card {
    border: 1px solid var(--gf-linha);
    border-radius: var(--gf-raio);
    box-shadow: var(--gf-sombra);
}

.card-header {
    background: transparent;
    border-bottom: 1px solid var(--gf-linha);
    padding: .875rem 1.125rem;
    font-weight: 600;
    font-size: .9375rem;
}

.gf-indicadores {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
    gap: 1rem;
    margin-bottom: 1.25rem;
}

.gf-indicador {
    background: var(--gf-superficie);
    border: 1px solid var(--gf-linha);
    border-radius: var(--gf-raio);
    box-shadow: var(--gf-sombra);
    padding: 1.125rem;
    display: flex;
    align-items: flex-start;
    gap: .875rem;
}

.gf-indicador__icone {
    display: grid;
    place-items: center;
    width: 42px;
    height: 42px;
    border-radius: 10px;
    background: var(--gf-primaria-fraca);
    color: var(--gf-primaria-escura);
    font-size: 1.125rem;
    flex: 0 0 auto;
}

.gf-indicador__icone--verde { background: #ecfdf5; color: #047857; }
.gf-indicador__icone--ambar { background: #fffbeb; color: #b45309; }
.gf-indicador__icone--roxo  { background: #f5f3ff; color: #6d28d9; }
.gf-indicador__icone--rosa  { background: #fdf2f8; color: #be185d; }
.gf-indicador__icone--cinza { background: #f1f5f9; color: #475569; }

.gf-indicador__valor {
    font-size: 1.5rem;
    font-weight: 650;
    line-height: 1.1;
    letter-spacing: -.02em;
}

.gf-indicador__rotulo {
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--gf-tinta-fraca);
    margin-top: .1875rem;
}

.gf-indicador__extra {
    font-size: .8125rem;
    color: var(--gf-tinta-suave);
    margin-top: .25rem;
}

/* ==========================================================================
   Tabelas
   ========================================================================== */

.gf-tabela-scroll {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

.table {
    margin-bottom: 0;
    font-size: .875rem;
}

.table > thead > tr > th {
    background: #f8fafc;
    border-bottom: 1px solid var(--gf-linha);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--gf-tinta-suave);
    white-space: nowrap;
    padding: .625rem .875rem;
}

.table > tbody > tr > td {
    padding: .6875rem .875rem;
    vertical-align: middle;
    border-color: var(--gf-linha);
}

.table > tbody > tr:hover > td {
    background: #f8fafc;
}

.table tfoot td {
    font-weight: 600;
    background: #f8fafc;
    border-top: 2px solid var(--gf-linha);
}

.gf-tabela__principal {
    font-weight: 500;
    color: var(--gf-tinta);
    text-decoration: none;
}

.gf-tabela__principal:hover {
    color: var(--gf-primaria);
}

.gf-tabela__secundario {
    display: block;
    font-size: .8125rem;
    color: var(--gf-tinta-fraca);
}

.gf-num {
    text-align: right;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* ==========================================================================
   Filtros
   ========================================================================== */

.gf-filtros {
    background: var(--gf-superficie);
    border: 1px solid var(--gf-linha);
    border-radius: var(--gf-raio);
    box-shadow: var(--gf-sombra);
    padding: .875rem 1rem;
    margin-bottom: 1.125rem;
}

.gf-filtros label {
    font-size: .75rem;
    font-weight: 600;
    color: var(--gf-tinta-suave);
    margin-bottom: .1875rem;
}

.gf-filtros .form-control,
.gf-filtros .form-select {
    font-size: .875rem;
}

/* ==========================================================================
   Formulários
   ========================================================================== */

.form-label {
    font-size: .8125rem;
    font-weight: 600;
    color: var(--gf-tinta-suave);
    margin-bottom: .3125rem;
}

.form-control,
.form-select {
    border-color: #cbd5e1;
    border-radius: 8px;
}

.form-control:focus,
.form-select:focus {
    border-color: var(--gf-primaria);
    box-shadow: 0 0 0 3px rgba(37, 99, 235, .12);
}

.gf-obrigatorio::after {
    content: " *";
    color: #dc2626;
}

.gf-form-seccao {
    padding-bottom: .375rem;
    margin-bottom: .875rem;
    border-bottom: 1px solid var(--gf-linha);
    font-size: .8125rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--gf-tinta-fraca);
}

.gf-form-acoes {
    display: flex;
    flex-wrap: wrap;
    gap: .5rem;
    padding-top: 1rem;
    margin-top: .5rem;
    border-top: 1px solid var(--gf-linha);
}

/* ==========================================================================
   Calendário (grelha desenhada no servidor)
   ========================================================================== */

.gf-calendario {
    background: var(--gf-superficie);
    border: 1px solid var(--gf-linha);
    border-radius: var(--gf-raio);
    box-shadow: var(--gf-sombra);
    overflow: hidden;
}

.gf-calendario__grelha {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
}

.gf-calendario__dia-nome {
    padding: .5rem;
    text-align: center;
    font-size: .6875rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--gf-tinta-fraca);
    background: #f8fafc;
    border-bottom: 1px solid var(--gf-linha);
}

.gf-calendario__celula {
    min-height: 112px;
    padding: .375rem;
    border-right: 1px solid var(--gf-linha);
    border-bottom: 1px solid var(--gf-linha);
    position: relative;
}

.gf-calendario__celula:nth-child(7n) {
    border-right: 0;
}

.gf-calendario__celula.is-fora {
    background: #f8fafc;
}

.gf-calendario__celula.is-fora .gf-calendario__numero {
    color: var(--gf-tinta-fraca);
}

.gf-calendario__celula.is-hoje {
    background: var(--gf-primaria-fraca);
}

.gf-calendario__numero {
    display: inline-grid;
    place-items: center;
    min-width: 24px;
    height: 24px;
    border-radius: 6px;
    font-size: .8125rem;
    font-weight: 600;
    color: var(--gf-tinta-suave);
    text-decoration: none;
}

.gf-calendario__celula.is-hoje .gf-calendario__numero {
    background: var(--gf-primaria);
    color: #fff;
}

.gf-evento {
    display: block;
    margin-top: .25rem;
    padding: .25rem .375rem;
    border-radius: 6px;
    border-left: 3px solid var(--gf-primaria);
    background: var(--gf-primaria-fraca);
    color: var(--gf-tinta);
    font-size: .6875rem;
    line-height: 1.35;
    text-decoration: none;
    overflow: hidden;
}

.gf-evento:hover {
    filter: brightness(.97);
    color: var(--gf-tinta);
}

.gf-evento strong {
    display: block;
    font-weight: 600;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.gf-evento span {
    display: block;
    color: var(--gf-tinta-suave);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.gf-evento--realizada { border-left-color: #198754; background: #ecfdf5; }
.gf-evento--cancelada { border-left-color: #dc3545; background: #fef2f2; opacity: .7; }
.gf-evento--cancelada strong { text-decoration: line-through; }
.gf-evento--remarcada { border-left-color: #fd7e14; background: #fff7ed; }

.gf-calendario__mais {
    display: block;
    margin-top: .1875rem;
    font-size: .6875rem;
    color: var(--gf-tinta-fraca);
    text-decoration: none;
}

/* Vista de dia / semana ---------------------------------------------------- */

.gf-agenda__dia {
    border-bottom: 1px solid var(--gf-linha);
    padding: .875rem 1.125rem;
}

.gf-agenda__dia:last-child {
    border-bottom: 0;
}

.gf-agenda__data {
    font-size: .8125rem;
    font-weight: 600;
    color: var(--gf-tinta-suave);
    margin-bottom: .5rem;
}

/* ==========================================================================
   Gráfico de barras (sem dependências)
   ========================================================================== */

.gf-grafico {
    display: grid;
    grid-template-columns: repeat(12, minmax(0, 1fr));
    align-items: end;
    gap: .5rem;
    height: 220px;
    padding: .5rem 0 0;
}

.gf-grafico__coluna {
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    align-items: center;
    height: 100%;
    gap: .375rem;
    text-decoration: none;
}

.gf-grafico__barra {
    width: 100%;
    max-width: 44px;
    min-height: 3px;
    border-radius: 6px 6px 2px 2px;
    background: linear-gradient(180deg, #3b82f6, #2563eb);
    transition: filter .12s;
}

.gf-grafico__coluna:hover .gf-grafico__barra {
    filter: brightness(1.12);
}

.gf-grafico__barra.is-vazia {
    background: var(--gf-linha);
}

.gf-grafico__valor {
    font-size: .6875rem;
    font-weight: 600;
    color: var(--gf-tinta-suave);
    font-variant-numeric: tabular-nums;
}

.gf-grafico__rotulo {
    font-size: .6875rem;
    color: var(--gf-tinta-fraca);
}

/* Barra horizontal, usada em "horas por curso" */
.gf-barra-lista {
    display: flex;
    flex-direction: column;
    gap: .75rem;
}

.gf-barra-lista__item {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: .25rem .75rem;
    font-size: .875rem;
}

.gf-barra-lista__trilho {
    grid-column: 1 / -1;
    height: 6px;
    border-radius: 999px;
    background: var(--gf-linha);
    overflow: hidden;
}

.gf-barra-lista__preenchido {
    height: 100%;
    border-radius: 999px;
    background: var(--gf-primaria);
}

/* ==========================================================================
   Progresso de calendarização
   ========================================================================== */

.gf-progresso {
    display: flex;
    align-items: baseline;
    gap: .5rem;
    font-size: .8125rem;
    color: var(--gf-tinta-suave);
}

.gf-progresso__trilho {
    height: 6px;
    border-radius: 999px;
    background: var(--gf-linha);
    overflow: hidden;
    margin-top: .25rem;
}

.gf-progresso__preenchido {
    height: 100%;
    background: var(--gf-primaria);
}

.gf-progresso__preenchido.is-completo { background: #198754; }
.gf-progresso__preenchido.is-excedido { background: #fd7e14; }

/* ==========================================================================
   Alertas do dashboard
   ========================================================================== */

.gf-alerta {
    display: flex;
    gap: .75rem;
    padding: .75rem 0;
    border-bottom: 1px solid var(--gf-linha);
    font-size: .875rem;
}

.gf-alerta:last-child {
    border-bottom: 0;
    padding-bottom: 0;
}

.gf-alerta__icone {
    flex: 0 0 auto;
    width: 32px;
    height: 32px;
    display: grid;
    place-items: center;
    border-radius: 8px;
    font-size: .9375rem;
}

.gf-alerta--perigo .gf-alerta__icone { background: #fef2f2; color: #b91c1c; }
.gf-alerta--aviso  .gf-alerta__icone { background: #fffbeb; color: #b45309; }
.gf-alerta--info   .gf-alerta__icone { background: var(--gf-primaria-fraca); color: var(--gf-primaria-escura); }

.gf-alerta__titulo {
    font-weight: 600;
    font-size: .8125rem;
}

.gf-alerta__texto {
    color: var(--gf-tinta-suave);
    font-size: .8125rem;
}

/* ==========================================================================
   Cronograma (grelha editável)
   ========================================================================== */

.gf-cronograma-linha.is-removida {
    opacity: .45;
}

.gf-cronograma-linha.is-removida input,
.gf-cronograma-linha.is-removida select {
    text-decoration: line-through;
}

.gf-cronograma-grelha input,
.gf-cronograma-grelha select {
    font-size: .8125rem;
    padding: .3125rem .5rem;
}

/* ==========================================================================
   Ecrãs de entrada
   ========================================================================== */

.gf-auth {
    min-height: 100vh;
    display: grid;
    place-items: center;
    padding: 2rem 1rem;
    background: linear-gradient(160deg, #0f172a 0%, #1e293b 45%, #1e40af 100%);
}

.gf-auth__caixa {
    width: 100%;
    max-width: 420px;
}

.gf-auth__marca {
    text-align: center;
    color: #fff;
    margin-bottom: 1.5rem;
}

.gf-auth__marca h1 {
    font-size: 1.5rem;
    font-weight: 600;
    margin: .875rem 0 .25rem;
}

.gf-auth__marca p {
    color: rgba(255, 255, 255, .68);
    font-size: .875rem;
    margin: 0;
}

.gf-auth__card {
    border: 0;
    box-shadow: 0 20px 45px rgba(2, 6, 23, .35);
}

.gf-auth__rodape {
    margin: 1.25rem 0 0;
    text-align: center;
    font-size: .8125rem;
    color: rgba(255, 255, 255, .55);
}

/* ==========================================================================
   Estados vazios e utilidades
   ========================================================================== */

.gf-chip {
    display: inline-flex;
    align-items: center;
    gap: .3125rem;
    padding: .1875rem .5rem;
    border-radius: 999px;
    background: var(--gf-fundo);
    color: var(--gf-tinta-suave);
    font-size: .75rem;
    font-weight: 500;
}

.gf-lista-limpa {
    list-style: none;
    margin: 0;
    padding: 0;
}

.gf-quebra {
    word-break: break-word;
}

/* ==========================================================================
   Modo aplicação instalada (PWA)
   ========================================================================== */

/* Elementos que só fazem sentido fora do browser — o botão de retroceder, por
   exemplo, que substitui o do Safari. O `display-mode` cobre os browsers
   modernos; a classe `.gf-modo-app` é posta pelo JS para apanhar os iOS antigos,
   que só expõem `navigator.standalone`. */
.gf-so-modo-app {
    display: none;
    align-items: center;
    justify-content: center;
}

@media (display-mode: standalone), (display-mode: minimal-ui) {
    .gf-so-modo-app {
        display: inline-flex;
    }
}

.gf-modo-app .gf-so-modo-app {
    display: inline-flex;
}

/* `[hidden]` tem de continuar a ganhar: o botão de retroceder só aparece
   depois de o JS confirmar que há histórico para trás. */
.gf-so-modo-app[hidden] {
    display: none !important;
}

/* Sem barra de endereço, o toque prolongado a seleccionar texto e o brilho azul
   do toque denunciam que aquilo é uma página web. */
.gf-modo-app {
    -webkit-tap-highlight-color: transparent;
    -webkit-text-size-adjust: 100%;
}

.gf-modo-app .gf-nav__item,
.gf-modo-app .gf-topo__perfil,
.gf-modo-app .btn {
    -webkit-touch-callout: none;
}

/* Impede que o "elástico" do iOS mostre o fundo branco por trás da app.
   Só em modo app: no browser, isto tirava o "puxar para recarregar". */
.gf-modo-app body {
    overscroll-behavior-y: none;
}

/* Aviso de versão nova, mostrado pelo service worker. */
.gf-actualizar {
    position: fixed;
    left: 50%;
    bottom: calc(1rem + env(safe-area-inset-bottom));
    transform: translateX(-50%);
    z-index: 1080;
    display: flex;
    align-items: center;
    gap: .75rem;
    max-width: calc(100vw - 2rem);
    padding: .625rem .75rem .625rem 1rem;
    border-radius: 999px;
    background: var(--gf-escuro);
    color: #fff;
    font-size: .875rem;
    box-shadow: 0 8px 24px rgba(2, 6, 23, .35);
}

/* ==========================================================================
   Responsivo
   ========================================================================== */

/* No iOS, um campo com letra abaixo de 16px faz o ecrã dar um salto de zoom
   ao receber foco. Em ecrãs de toque os campos sobem a 16px; o tamanho menor
   fica para rato e teclado, onde o problema não existe. */
@media (pointer: coarse) {
    .form-control,
    .form-select,
    .form-control-sm,
    .form-select-sm,
    textarea.form-control {
        font-size: 16px;
    }
}

@media (max-width: 991.98px) {
    .gf-principal {
        margin-left: 0;
    }

    .gf-sidebar {
        transform: translateX(-100%);
        transition: transform .2s ease;
    }

    .gf-sidebar.is-aberta {
        transform: translateX(0);
        box-shadow: 0 0 40px rgba(2, 6, 23, .3);
    }

    .gf-topo {
        padding-inline: 1rem;
    }

    .gf-conteudo {
        padding: 1rem;
    }

    .gf-calendario__celula {
        min-height: 78px;
        padding: .25rem;
    }

    .gf-evento span {
        display: none;
    }
}

@media (max-width: 575.98px) {
    .gf-cabecalho h1 {
        font-size: 1.25rem;
    }

    .gf-indicadores {
        grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
        gap: .75rem;
    }

    .gf-indicador {
        padding: .875rem;
    }

    .gf-indicador__valor {
        font-size: 1.25rem;
    }

    .gf-grafico {
        height: 170px;
        gap: .25rem;
    }

    .gf-grafico__valor {
        display: none;
    }
}
