/* =============================================================================
   WLC Design System — fundação de tokens + componentes
   -----------------------------------------------------------------------------
   Uso: carregado após o Bootstrap. Namespacing `--ds-*` / `.ds-*` para não
   colidir com estilos existentes (adoção incremental, sem migração forçada).
   Marca: `--ds-brand` herda de `--cor-primaria` (white-label por barbearia).
   Tema escuro: aplicar `.ds-theme-dark` num ancestral (ex.: <body>) para o
   painel master; os tokens semânticos são remapeados.
   ========================================================================== */

/* O seletor de atributo repete os valores claros para que um
   data-bs-theme="light" ANINHADO (ex.: o preview do card público dentro do
   painel escuro) volte à paleta clara — `:root` sozinho não alcança um filho. */
:root,
[data-bs-theme="light"] {
  /* ── Marca (white-label) ─────────────────────────────────────────────── */
  --ds-brand:            var(--cor-primaria, #0d6efd);
  --ds-brand-contrast:   #ffffff;

  /* ── Paleta neutra (primitivos) ──────────────────────────────────────── */
  --ds-neutral-0:   #ffffff;
  --ds-neutral-50:  #f8fafc;
  --ds-neutral-100: #f1f4f9;
  --ds-neutral-200: #e5e9f0;
  --ds-neutral-300: #d3d9e3;
  --ds-neutral-400: #aab2c0;
  --ds-neutral-500: #8492a6;
  --ds-neutral-600: #626d80;
  --ds-neutral-700: #454e5e;
  --ds-neutral-800: #2a2e3a;
  --ds-neutral-900: #161a24;

  /* ── Status (primitivos) — alinhados à paleta já usada no produto ────── */
  --ds-success:    #10b981;  --ds-success-soft: #e7f7ef;
  --ds-danger:     #ef4444;  --ds-danger-soft:  #fdeaea;
  --ds-warning:    #f59e0b;  --ds-warning-soft: #fdf3e2;
  --ds-info:       #3b82f6;  --ds-info-soft:    #e8f0fe;

  /* Versão para TEXTO. Os primitivos acima nasceram para preencher (barra,
     bolinha, borda), onde 3:1 basta. Como texto sobre o fundo do tema eles
     reprovam em AA — #3b82f6 dá 3.68:1 sobre branco. Estes são os que
     contrastam ≥4.5:1 em cada tema; no escuro clareiam. */
  --ds-success-text: #047857;
  --ds-danger-text:  #b91c1c;
  --ds-warning-text: #b45309;
  --ds-info-text:    #1d4ed8;

  /* ── Tokens semânticos (tema claro — padrão) ─────────────────────────── */
  --ds-bg:           var(--ds-neutral-100);
  --ds-surface:      var(--ds-neutral-0);
  --ds-surface-2:    var(--ds-neutral-50);
  --ds-text:         var(--ds-neutral-900);
  --ds-text-muted:   var(--ds-neutral-600);
  --ds-text-subtle:  #616d83; /* entre neutral-500 e 600: contraste AA (≥4.5:1) sobre branco e neutral-100 */
  --ds-border:       var(--ds-neutral-200);
  --ds-border-strong:var(--ds-neutral-300);

  /* ── Espaçamento (base 4px) ──────────────────────────────────────────── */
  --ds-space-1: 4px;
  --ds-space-2: 8px;
  --ds-space-3: 12px;
  --ds-space-4: 16px;
  --ds-space-5: 24px;
  --ds-space-6: 32px;
  --ds-space-7: 48px;
  --ds-space-8: 64px;

  /* ── Raio ────────────────────────────────────────────────────────────── */
  --ds-radius-sm:   6px;
  --ds-radius-md:   10px;
  --ds-radius-lg:   14px;
  --ds-radius-xl:   20px;
  --ds-radius-pill: 999px;

  /* ── Sombra ──────────────────────────────────────────────────────────── */
  --ds-shadow-sm: 0 2px 12px rgba(16, 24, 40, .06);
  --ds-shadow-md: 0 6px 20px rgba(16, 24, 40, .09);
  --ds-shadow-lg: 0 14px 40px rgba(16, 24, 40, .14);

  /* ── Tipografia ──────────────────────────────────────────────────────── */
  --ds-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  /* Escala em passos redondos (12/14/16/18/20…). A anterior partia de 15.2px
     no corpo — abaixo do padrão de 16px do navegador, que é o tamanho que
     quem enxerga menos espera — e tinha razão de 1.14 entre os degraus
     pequenos, perto demais para o olho distinguir hierarquia. */
  --ds-text-xs:   .75rem;   /* 12px — rótulo, badge, legenda curta */
  --ds-text-sm:   .875rem;  /* 14px — apoio, metadado */
  --ds-text-base: 1rem;     /* 16px — corpo: mínimo para texto que se lê */
  --ds-text-lg:   1.125rem; /* 18px — corpo destacado, lead */
  --ds-text-xl:   1.25rem;  /* 20px — subtítulo */
  /* Títulos fluidos: encolhem no celular e travam no desktop (mobile-first) */
  --ds-text-2xl:  clamp(1.5rem,  1.15rem + 1.6vw, 1.875rem);  /* 24 → 30 */
  --ds-text-3xl:  clamp(1.875rem, 1.3rem + 2.6vw, 2.5rem);    /* 30 → 40 */
  --ds-text-4xl:  clamp(2.25rem, 1.3rem + 4.4vw, 3.5rem);     /* 36 → 56 (display) */
  --ds-weight-regular:  400;
  --ds-weight-medium:   500;
  --ds-weight-semibold: 600;
  --ds-weight-bold:     700;
  --ds-weight-black:    800;
  --ds-leading-tight:   1.15;  /* títulos */
  --ds-leading-snug:    1.35;  /* subtítulo, texto curto */
  --ds-leading-normal:  1.5;   /* interface */
  --ds-leading-relaxed: 1.65;  /* parágrafo longo */
  /* Medida de linha: acima de ~75 caracteres o olho erra a volta de linha. */
  --ds-measure:      68ch;
  --ds-measure-tight: 52ch;

  /* ── Movimento ───────────────────────────────────────────────────────── */
  --ds-transition: .18s ease;

  /* Fundo da aplicação. Fica aqui (e não no <style> do base.html) porque o
     base.html é reescrito a cada request; assim o valor de cada tema vem do
     CSS em cache e o body só referencia a variável. */
  --app-bg: #f4f6fb;
}

/* ── Tema escuro ───────────────────────────────────────────────────────────
   Dois gatilhos para o mesmo mapa de tokens:
     .ds-theme-dark          — classe legada (painel master, style guide)
     [data-bs-theme="dark"]  — atributo nativo do Bootstrap 5.3, usado pelo
                               painel do dono para que os componentes do
                               Bootstrap e os tokens `--ds-*` virem juntos.
   Superfícies opacas, e não rgba(255,255,255,.04): translúcido só funciona
   sobre o fundo do tema, e no painel há card dentro de card — dois níveis de
   transparência empilhados clareiam o suficiente para o texto sumir.        */
.ds-theme-dark,
[data-bs-theme="dark"] {
  --ds-bg:           #0d0f1a;
  --ds-surface:      #171b28;
  --ds-surface-2:    #1e2331;
  --ds-text:         #e8eaf0;
  --ds-text-muted:   #a7adbd;
  --ds-text-subtle:  #939ab0;  /* 4.6:1 sobre --ds-surface */
  --ds-border:       rgba(255, 255, 255, .11);
  --ds-border-strong:rgba(255, 255, 255, .2);
  --ds-brand-contrast: #ffffff;

  /* Fundos de status: pastel claro vira véu translúcido da própria cor. */
  --ds-success-soft: rgba(16, 185, 129, .15);
  --ds-danger-soft:  rgba(239, 68, 68, .15);
  --ds-warning-soft: rgba(245, 158, 11, .15);
  --ds-info-soft:    rgba(59, 130, 246, .15);

  /* Texto de status clareia: os tons escuros do tema claro reprovam aqui. */
  --ds-success-text: #34d399;
  --ds-danger-text:  #f87171;
  --ds-warning-text: #fbbf24;
  --ds-info-text:    #60a5fa;

  /* A sombra do tema claro é preta sobre branco — invisível no escuro.
     No escuro a separação vem da borda, então a sombra só aprofunda. */
  --ds-shadow-sm: 0 2px 12px rgba(0, 0, 0, .35);
  --ds-shadow-md: 0 6px 20px rgba(0, 0, 0, .45);
  --ds-shadow-lg: 0 14px 40px rgba(0, 0, 0, .55);

  --app-bg: var(--ds-bg);
}

/* =============================================================================
   Painel — ajustes de tema escuro sobre o Bootstrap
   -----------------------------------------------------------------------------
   O Bootstrap 5.3 já vira sozinho com data-bs-theme (card, form, modal, table,
   dropdown, offcanvas). O que segue cobre o que ele não cobre: regras próprias
   do produto e utilitários de cor FIXA, que não são temáticos por design.
   ========================================================================== */
[data-bs-theme="dark"] {
  /* Alinha a paleta do Bootstrap à do design system: sem isto convivem dois
     cinzas de fundo diferentes (o #212529 do Bootstrap e o nosso #171b28). */
  --bs-body-bg:        var(--ds-bg);
  --bs-body-color:     var(--ds-text);
  --bs-secondary-color: var(--ds-text-muted);
  --bs-border-color:   var(--ds-border);
  --bs-emphasis-color: #ffffff;
  --bs-tertiary-bg:    var(--ds-surface-2);
  --bs-secondary-bg:   var(--ds-surface-2);
}

/* No claro o card se separa do fundo pela sombra. No escuro sombra preta sobre
   fundo escuro não aparece, então a separação passa a ser a borda. */
[data-bs-theme="dark"] .card {
  background-color: var(--ds-surface);
  border: 1px solid var(--ds-border);
  box-shadow: var(--ds-shadow-sm);
}
[data-bs-theme="dark"] .card:hover { box-shadow: var(--ds-shadow-md); }

/* Cabeçalho de tabela temático — substitui `.table-light`, que tem cor fixa e
   viraria uma faixa branca no meio do painel escuro. */
.ds-thead th {
  background-color: var(--ds-surface-2);
  color: var(--ds-text);
}

/* `.form-text` e `.text-muted` do Bootstrap no escuro caem para um cinza que
   reprova em AA sobre a nossa superfície. */
[data-bs-theme="dark"] .form-text,
[data-bs-theme="dark"] .text-muted { color: var(--ds-text-muted) !important; }

/* ── Cores semânticas do Bootstrap usadas como TEXTO ──────────────────────
   As constantes do Bootstrap (#6c757d, #198754, #ffc107, #0d6efd) foram feitas
   para preencher, não para escrever: como texto reprovam em AA — algumas nos
   DOIS temas (o amarelo dá 1.51:1 sobre fundo claro, o cinza 4.34:1). Por isso
   a troca não é só do escuro; os tokens `-text` já são medidos em cada tema. */
.text-secondary { color: var(--ds-text-muted) !important; }
.text-success   { color: var(--ds-success-text) !important; }
.text-danger    { color: var(--ds-danger-text) !important; }
.text-warning   { color: var(--ds-warning-text) !important; }
.text-primary   { color: var(--ds-info-text) !important; }

.btn-outline-secondary {
  --bs-btn-color: var(--ds-text-muted);
  --bs-btn-border-color: var(--ds-border-strong);
  --bs-btn-hover-bg: var(--ds-surface-2);
  --bs-btn-hover-color: var(--ds-text);
  --bs-btn-hover-border-color: var(--ds-border-strong);
}
.btn-outline-success {
  --bs-btn-color: var(--ds-success-text);
  --bs-btn-border-color: var(--ds-success-text);
}
.btn-outline-danger {
  --bs-btn-color: var(--ds-danger-text);
  --bs-btn-border-color: var(--ds-danger-text);
}

/* O rosa do <code> (#d63384) dá 4.27:1 sobre fundo cinza-claro. Escurece no
   claro e clareia no escuro, mantendo a identidade da cor. */
:root, [data-bs-theme="light"] { --bs-code-color: #b5176b; }
[data-bs-theme="dark"]         { --bs-code-color: #f78bb8; }

/* Card da agenda: mesma lógica do `.card` — no escuro quem separa é a borda. */
[data-bs-theme="dark"] .ag-card {
  border: 1px solid var(--ds-border);
  box-shadow: var(--ds-shadow-sm);
}

/* Relógio da agenda: gradiente recortado no texto. Partindo da cor da marca
   ele fica escuro demais sobre o fundo escuro, então clareia junto. */
[data-bs-theme="dark"] .live-clock {
  background: linear-gradient(135deg, var(--cor-primaria-texto) 0%, #22d3ee 100%);
  -webkit-background-clip: text;
  background-clip: text;
}

/* Botão do seletor de tema. */
.ds-tema-btn {
  display: flex; align-items: center; gap: var(--ds-space-2);
  width: 100%; min-height: 44px; padding: 8px 16px;
  background: rgba(255, 255, 255, .07);
  border: 1px solid rgba(255, 255, 255, .14);
  border-radius: var(--ds-radius-md);
  color: rgba(255, 255, 255, .92);
  font-size: var(--ds-text-sm);
  cursor: pointer;
  transition: background var(--ds-transition);
}
.ds-tema-btn:hover { background: rgba(255, 255, 255, .14); }
.ds-tema-btn:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }

/* =============================================================================
   Componentes
   ========================================================================== */

/* ── Card ────────────────────────────────────────────────────────────────── */
.ds-card {
  background: var(--ds-surface);
  border: 1px solid var(--ds-border);
  border-radius: var(--ds-radius-lg);
  box-shadow: var(--ds-shadow-sm);
  padding: var(--ds-space-5);
  transition: transform var(--ds-transition), box-shadow var(--ds-transition);
}
.ds-card--interactive:hover {
  transform: translateY(-2px);
  box-shadow: var(--ds-shadow-md);
}
.ds-card__header {
  font-weight: var(--ds-weight-bold);
  color: var(--ds-text);
  margin-bottom: var(--ds-space-3);
}

/* ── KPI ─────────────────────────────────────────────────────────────────── */
.ds-kpi { padding: var(--ds-space-4) var(--ds-space-5); }
.ds-kpi__value {
  font-size: var(--ds-text-2xl);
  font-weight: var(--ds-weight-black);
  line-height: var(--ds-leading-tight);
  color: var(--ds-text);
}
.ds-kpi__label {
  font-size: var(--ds-text-xs);
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--ds-text-subtle);
  margin-top: var(--ds-space-1);
}

/* ── Título de seção ───────────────────────────────────────────────────── */
.ds-section-title {
  display: flex;
  align-items: center;
  gap: var(--ds-space-2);
  font-size: var(--ds-text-lg);
  font-weight: var(--ds-weight-bold);
  color: var(--ds-text);
  margin: var(--ds-space-6) 0 var(--ds-space-4);
}
.ds-section-title::before {
  content: "";
  width: 4px;
  height: 20px;
  border-radius: var(--ds-radius-sm);
  background: var(--ds-brand);
}

/* ── Badge ───────────────────────────────────────────────────────────────── */
.ds-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--ds-space-1);
  font-size: var(--ds-text-xs);
  font-weight: var(--ds-weight-semibold);
  padding: .3em .7em;
  border-radius: var(--ds-radius-pill);
  background: var(--ds-neutral-100);
  color: var(--ds-neutral-700);
}
.ds-badge--brand   { background: color-mix(in srgb, var(--ds-brand) 14%, transparent); color: var(--ds-brand); }
/* Mesmo motivo do .ds-alert: a cor cheia sobre o fundo suave dá 1.95:1 a
   3.25:1 no tema claro. Os tokens `-text` levam a 4.57:1 a 5.85:1. */
.ds-badge--success { background: var(--ds-success-soft); color: var(--ds-success-text); }
.ds-badge--danger  { background: var(--ds-danger-soft);  color: var(--ds-danger-text); }
.ds-badge--warning { background: var(--ds-warning-soft); color: var(--ds-warning-text); }
.ds-badge--info    { background: var(--ds-info-soft);    color: var(--ds-info-text); }

/* ── Botão ───────────────────────────────────────────────────────────────── */
.ds-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ds-space-2);
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-semibold);
  line-height: 1;
  padding: .65em 1.1em;
  border-radius: var(--ds-radius-md);
  border: 1px solid transparent;
  cursor: pointer;
  text-decoration: none;
  transition: filter var(--ds-transition), background var(--ds-transition),
              color var(--ds-transition), border-color var(--ds-transition);
}
.ds-btn:disabled, .ds-btn.is-disabled { opacity: .55; pointer-events: none; }

/* ── Foco visível ────────────────────────────────────────────────────────── */
/* Quem navega por teclado precisa enxergar onde está. `:focus-visible` só
   aparece na navegação por teclado, então o clique de mouse não ganha anel.
   O offset separa o anel da borda do componente e mantém contraste tanto no
   tema claro quanto no escuro.

   Vale para os elementos nativos, e não só para as classes .ds-*: a adoção do
   design system é incremental, e as telas que ainda usam Bootstrap puro — o
   painel inteiro e a página de agendamento — precisam de foco visível do
   mesmo jeito.

   `.btn` e `.form-control` precisam constar explicitamente: o Bootstrap zera o
   outline em `.btn:focus-visible` (0,2,0) e troca por um box-shadow que classes
   locais como .btn-atalho acabam anulando — resultado, botão sem indicador
   nenhum. Repetir a especificidade aqui faz a ordem de origem decidir, já que
   este arquivo carrega depois do Bootstrap. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible,
.btn:focus-visible,
.form-control:focus-visible,
.form-select:focus-visible,
.form-check-input:focus-visible,
.ds-btn:focus-visible,
.ds-input:focus-visible {
  outline: 2px solid var(--ds-brand);
  outline-offset: 2px;
  border-radius: var(--ds-radius-sm);
}
.ds-btn--primary { background: var(--ds-brand); color: var(--ds-brand-contrast); }
.ds-btn--primary:hover { filter: brightness(.92); color: var(--ds-brand-contrast); }
.ds-btn--outline { background: transparent; color: var(--ds-brand); border-color: var(--ds-brand); }
.ds-btn--outline:hover { background: var(--ds-brand); color: var(--ds-brand-contrast); }
.ds-btn--ghost { background: transparent; color: var(--ds-text-muted); }
.ds-btn--ghost:hover { background: var(--ds-surface-2); color: var(--ds-text); }
.ds-btn--sm { font-size: var(--ds-text-xs); padding: .5em .85em; }
.ds-btn--block { width: 100%; }

/* ── Formulário ────────────────────────────────────────────────────────── */
.ds-label {
  display: block;
  font-size: var(--ds-text-sm);
  font-weight: var(--ds-weight-semibold);
  color: var(--ds-text);
  margin-bottom: var(--ds-space-1);
}
.ds-input {
  width: 100%;
  font-size: var(--ds-text-base);
  color: var(--ds-text);
  background: var(--ds-surface);
  border: 1px solid var(--ds-border-strong);
  border-radius: var(--ds-radius-md);
  padding: .6em .8em;
  transition: border-color var(--ds-transition), box-shadow var(--ds-transition);
}
.ds-input:focus {
  outline: none;
  border-color: var(--ds-brand);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ds-brand) 22%, transparent);
}
.ds-help { font-size: var(--ds-text-xs); color: var(--ds-text-subtle); margin-top: var(--ds-space-1); }

/* ── Alerta ──────────────────────────────────────────────────────────────── */
.ds-alert {
  display: flex;
  gap: var(--ds-space-3);
  align-items: flex-start;
  padding: var(--ds-space-4);
  border-radius: var(--ds-radius-md);
  border: 1px solid transparent;
  font-size: var(--ds-text-sm);
}
/* O texto usa `--ds-*-text`, não `--ds-*`. A cor cheia sobre o fundo suave dá
   1.95:1 (aviso) a 3.25:1 (erro) no tema claro — abaixo do mínimo em todas as
   quatro variantes, e em duas também no escuro. Os tokens `-text` existem para
   isto e passam nos oito casos (4.57:1 a 7.86:1). A borda segue na cor cheia:
   ali é traço, não texto. */
.ds-alert--success { background: var(--ds-success-soft); color: var(--ds-success-text); border-color: color-mix(in srgb, var(--ds-success) 25%, transparent); }
.ds-alert--danger  { background: var(--ds-danger-soft);  color: var(--ds-danger-text);  border-color: color-mix(in srgb, var(--ds-danger) 25%, transparent); }
.ds-alert--warning { background: var(--ds-warning-soft); color: var(--ds-warning-text); border-color: color-mix(in srgb, var(--ds-warning) 25%, transparent); }
.ds-alert--info    { background: var(--ds-info-soft);    color: var(--ds-info-text);    border-color: color-mix(in srgb, var(--ds-info) 25%, transparent); }
/* O ícone fica na cor cheia: é forma, não texto — não precisa de 4.5:1, e o
   contraste de cor ajuda a distinguir o tipo de aviso num relance. */
.ds-alert__icone { flex-shrink: 0; font-size: 1.05em; line-height: 1.45; }
.ds-alert--success .ds-alert__icone { color: var(--ds-success); }
.ds-alert--danger  .ds-alert__icone { color: var(--ds-danger); }
.ds-alert--warning .ds-alert__icone { color: var(--ds-warning); }
.ds-alert--info    .ds-alert__icone { color: var(--ds-info); }
.ds-alert__corpo { flex: 1; min-width: 0; }
/* Botão de fechar: herda a cor do alerta em vez do filtro do Bootstrap, que
   inverte errado no tema escuro. */
.ds-alert .btn-close {
  flex-shrink: 0; padding: .25rem; margin: -.15rem -.15rem 0 0;
  background: none; opacity: .55; color: inherit;
  border: 0; font-size: 1.1rem; line-height: 1; cursor: pointer;
}
.ds-alert .btn-close::before { content: '\00d7'; }
.ds-alert .btn-close:hover { opacity: 1; }

/* ── Utilitários leves ───────────────────────────────────────────────────── */
.ds-stack   { display: flex; flex-direction: column; gap: var(--ds-space-3); }
.ds-row     { display: flex; align-items: center; gap: var(--ds-space-3); flex-wrap: wrap; }
.ds-muted   { color: var(--ds-text-muted); }
.ds-subtle  { color: var(--ds-text-subtle); }

/* Texto corrido: limita a medida de linha e solta a entrelinha. Sem isso, um
   parágrafo dentro de um container largo passa de 100 caracteres por linha e
   o olho se perde ao voltar para a linha seguinte. */
.ds-prose {
  max-width: var(--ds-measure);
  line-height: var(--ds-leading-relaxed);
}
.ds-prose--tight { max-width: var(--ds-measure-tight); }
.ds-prose--center { margin-inline: auto; }

/* =============================================================================
   Responsividade & toque (mobile-first)
   Breakpoints (alinhados ao Bootstrap): sm 576 · md 768 · lg 992 · xl 1200px.
   A maioria dos usuários acessa pelo celular — priorize telas pequenas.
   ========================================================================== */

/* Container fluido: largura máxima + respiro lateral que acompanha a tela */
.ds-container {
  width: 100%;
  max-width: 1120px;
  margin-inline: auto;
  padding-inline: clamp(var(--ds-space-4), 4vw, var(--ds-space-6));
}

/* Impede estouro horizontal de mídia dentro dos componentes */
.ds-card img, .ds-card svg, .ds-card table { max-width: 100%; }

/* Alvos de toque confortáveis (mín. 44px — WCAG 2.5.5): em telas de toque
   ou em qualquer viewport pequena (celular), independente do tipo de ponteiro.

   Inclui as classes do Bootstrap porque a adoção do design system é
   incremental: o painel do barbeiro é usado no celular durante o expediente e
   tinha 19 de 31 alvos abaixo do mínimo — a maioria itens do menu lateral, que
   nunca vão virar .ds-btn. Restrito a elementos de ação; link solto dentro de
   parágrafo continua com a altura do texto (exceção de link inline da WCAG). */
@media (pointer: coarse), (max-width: 767.98px) {
  .ds-btn,
  .ds-input,
  select.ds-input,
  .btn,
  .nav-link,
  .list-group-item-action,
  .dropdown-item,
  .page-link,
  .form-control,
  .form-select,
  .btn-close { min-height: 44px; }

  /* btn-close é quadrado: sem largura vira uma faixa fina e difícil de acertar */
  .btn-close { min-width: 44px; }

  /* Itens de menu e dropdown centralizam o texto na altura nova */
  .nav-link,
  .dropdown-item,
  .list-group-item-action { display: flex; align-items: center; }
}

/* Texto pequeno demais para ler: o .badge do Bootstrap usa .75em, o que dá
   9,6px quando o pai já é pequeno, e o .btn-sm cai para 11,5px. */
.badge { font-size: max(.75em, var(--ds-text-xs)); }
.btn-sm, .btn-group-sm > .btn { font-size: max(.875rem, var(--ds-text-sm)); }

/* Celular: menos respiro gigante, KPI e cards mais compactos */
@media (max-width: 575.98px) {
  :root { --ds-space-7: 32px; --ds-space-8: 44px; }
  .ds-card { padding: var(--ds-space-4); }
  .ds-kpi__value { font-size: var(--ds-text-xl); }
  .ds-row { gap: var(--ds-space-2); }
  .ds-section-title { margin: var(--ds-space-5) 0 var(--ds-space-3); }
}

/* Utilitários de visibilidade por breakpoint (só alternam display:none,
   preservando o display natural do elemento quando visível) */
@media (max-width: 767.98px) { .ds-hide-mobile { display: none !important; } }
@media (min-width: 768px)    { .ds-only-mobile { display: none !important; } }
