/* ============================================================================
   UI ÓPTAGO: Design System v1.2.2
   CSS puro, sem dependências. Tema escuro por padrão.
   Para tema claro: adicione a classe "light" ao <html> (o ui-optago.js
   gerencia isso automaticamente via localStorage).

   Convenção de nomes: todas as classes usam o prefixo "op-".
   Estados usam "is-" (is-open, is-collapsed, is-active, is-error...).
   ============================================================================ */

/* ----------------------------------------------------------------------------
   1. TOKENS (CSS Custom Properties)
---------------------------------------------------------------------------- */
:root {
  /* Marca */
  --op-accent:        #C0FF6B;
  --op-accent-hover:  #AEF552;
  --op-accent-ink:    #000000;   /* texto sobre o verde-lima */
  --op-cyan:          #6BE0FF;   /* cor secundária da marca: glow e detalhes */
  --op-cyan-hover:    #8FE9FF;
  --op-cyan-ink:      #000000;   /* texto sobre o ciano */

  /* Cores semânticas */
  --op-info:    #3B82F6;
  --op-success: #10B981;
  --op-warning: #F59E0B;
  --op-danger:  #EF4444;

  /* Superfícies: TEMA ESCURO (padrão) */
  --op-bg:       #050505;
  --op-panel:    #0A0A0A;
  --op-panel-2:  #111111;
  --op-panel-3:  #1A1A1A;
  --op-border:   #262626;
  --op-border-2: #333333;
  --op-text:     #D5D5D5;
  --op-strong:   #FFFFFF;
  --op-muted:    #656565;

  /* Botão primário (no escuro = verde-lima; no claro = quase-preto) */
  --op-primary:       var(--op-accent);
  --op-primary-hover: var(--op-accent-hover);
  --op-primary-ink:   #000000;

  /* Tipografia */
  --op-font-display: "Chakra Petch", system-ui, sans-serif;
  --op-font-sans:    "Inter", system-ui, sans-serif;
  --op-font-mono:    "JetBrains Mono", ui-monospace, monospace;

  /* Forma */
  --op-radius-sm: 8px;
  --op-radius:    12px;
  --op-radius-lg: 16px;
  --op-oct: polygon(29% 0%, 71% 0%, 100% 29%, 100% 71%, 71% 100%, 29% 100%, 0% 71%, 0% 29%);

  /* Sombras */
  --op-shadow-sm:   0 1px 2px rgba(0,0,0,.3);
  --op-shadow:      0 8px 24px -8px rgba(0,0,0,.5);
  --op-shadow-lg:   0 25px 50px -12px rgba(0,0,0,.6);
  --op-shadow-side: -16px 0 40px rgba(0,0,0,.35);
  --op-glow:        0 0 20px rgba(192,255,107,.35);
  --op-glow-danger: 0 0 20px rgba(239,68,68,.35);
  --op-glow-info:   0 0 20px rgba(59,130,246,.35);
  --op-glow-cyan:   0 0 20px rgba(107,224,255,.35);

  /* Layout fixo */
  --op-header-h:            56px;
  --op-footer-h:            42px;
  --op-sidebar-w:           260px;
  --op-sidebar-w-collapsed: 4.5rem;

  /* Transições */
  --op-ease: cubic-bezier(.4, 0, .2, 1);
  --op-spring: cubic-bezier(.16, 1, .3, 1);

  color-scheme: dark;
}

/* Superfícies: TEMA CLARO */
html.light {
  --op-bg:       #DDE3EA;
  --op-panel:    #EDF1F5;
  --op-panel-2:  #D5DCE4;
  --op-panel-3:  #CDD5DE;
  --op-border:   #D6DEE7;
  --op-border-2: #BDC9D8;
  --op-text:     #334155;
  --op-strong:   #0F172A;
  --op-muted:    #64748B;

  --op-primary:       #0F172A;
  --op-primary-hover: #1E293B;
  --op-primary-ink:   #FFFFFF;

  --op-shadow-sm: 0 1px 3px rgba(15,23,42,.08);
  --op-shadow:    0 10px 30px -10px rgba(15,23,42,.16);
  --op-shadow-lg: 0 30px 60px -15px rgba(15,23,42,.28);
  --op-shadow-side: -16px 0 40px rgba(15,23,42,.10);
  --op-glow:      0 4px 14px rgba(15,23,42,.25);

  color-scheme: light;
}

/* Fundo do tema claro: gradiente suave com um toque de verde-lima no topo.
   Baseado em --op-bg (não em hex fixo) e propositalmente mais escuro que
   --op-panel, pra telas (fundo) não ficarem parecidas com cards (painel). */
html.light body {
  background:
    radial-gradient(900px 420px at 75% -10%, rgba(192,255,107,.20) 0%, transparent 60%),
    radial-gradient(700px 380px at 10% 110%, rgba(192,255,107,.10) 0%, transparent 60%),
    linear-gradient(180deg, var(--op-bg) 0%, color-mix(in srgb, var(--op-bg) 85%, black) 100%);
}

/* ----------------------------------------------------------------------------
   2. RESET & BASE
---------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
  margin: 0;
  font-family: var(--op-font-sans);
  font-size: 14px;
  line-height: 1.6;
  background: var(--op-bg);
  color: var(--op-text);
  -webkit-font-smoothing: antialiased;
  transition: background-color .3s ease, color .3s ease;
}

::selection { background: var(--op-accent); color: #000; }

h1, h2, h3, h4, h5, h6 {
  font-family: var(--op-font-display);
  font-weight: 700;
  color: var(--op-strong);
  line-height: 1.2;
  margin: 0 0 .5em;
  letter-spacing: -.02em;
}
h1 { font-size: 2.5rem; }
h2 { font-size: 1.75rem; }
h3 { font-size: 1.25rem; }
h4 { font-size: 1rem; }

p { margin: 0 0 1em; }
a { color: var(--op-accent); }
html.light a:not(.op-btn) {
    color: #3F6212;
}
code, kbd { font-family: var(--op-font-mono); font-size: .85em; }

kbd {
  padding: 2px 7px;
  background: var(--op-panel-3);
  border: 1px solid var(--op-border-2);
  border-bottom-width: 2px;
  border-radius: 6px;
  color: var(--op-strong);
  font-weight: 600;
}

hr, .op-divider {
  border: 0;
  height: 1px;
  background: var(--op-border);
  margin: 1.5rem 0;
}

:focus-visible {
  outline: 2px solid color-mix(in srgb, var(--op-accent) 80%, transparent);
  outline-offset: 2px;
  border-radius: 4px;
}
html.light :focus-visible {
  outline-color: color-mix(in srgb, var(--op-info) 70%, transparent);
}

/* Scrollbar própria (Chromium/WebKit: Chrome, Edge, Safari, Opera) - fina,
   trilho invisível, "polegar" em pílula que fica sutil em repouso e assume
   a cor de marca (verde-lima) ao passar o mouse, pra ter identidade própria
   em vez do scrollbar cinza genérico do navegador. `border: transparent` +
   `background-clip: padding-box` (em vez de pintar a borda com --op-bg
   direto) deixa o "respiro" ao redor do polegar de verdade transparente,
   então funciona igual dentro de qualquer container (modal, card, sidebar)
   mesmo quando o fundo por trás não é exatamente --op-bg. */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  background: var(--op-border-2);
  border-radius: 10px;
  border: 2px solid transparent;
  background-clip: padding-box;
  transition: background-color .15s var(--op-ease);
}
::-webkit-scrollbar-thumb:hover {
  background: color-mix(in srgb, var(--op-accent) 55%, var(--op-muted));
  background-clip: padding-box;
}
::-webkit-scrollbar-corner { background: transparent; }

/* Firefox: única customização que o navegador permite (sem raio/hover
   próprios) - ainda assim fica fino e na paleta certa em vez do padrão do
   SO. `*` (não só html/body) porque scrollbar-width/-color NÃO herdam pros
   containers internos com overflow próprio (.op-main, .op-sidebar-nav,
   modais, tabelas com scroll horizontal etc.) do mesmo jeito que o
   ::-webkit-scrollbar acima já cobre globalmente. */
* { scrollbar-width: thin; scrollbar-color: var(--op-border-2) transparent; }

/* Octógono da marca */
.op-oct { -webkit-clip-path: var(--op-oct); clip-path: var(--op-oct); }

/* Fundo pontilhado decorativo */
.op-bg-pattern {
  background-image: radial-gradient(var(--op-border) 1.5px, transparent 1.5px);
  background-size: 32px 32px;
}

/* ----------------------------------------------------------------------------
   3. LAYOUT: app shell com header, footer e sidebar (direita) fixos.
   Somente .op-main rola.

   <body class="op-app">
     <div class="op-app-body">
       <header class="op-header">...</header>
       <main class="op-main">...</main>
       <footer class="op-footer">...</footer>
     </div>
     <aside class="op-sidebar" id="opSidebar">...</aside>
   </body>
---------------------------------------------------------------------------- */
/* overflow:hidden só em .op-app (= <body>) não basta pra impedir scroll de
   verdade: sem restrição também em <html>, o navegador ainda enxerga o
   tamanho de layout NÃO cortado do documento (scrollWidth/scrollHeight de
   `document.documentElement`) - isso inclui a .op-sidebar mobile fora da
   tela (position:fixed + translateX(100%), que desloca sua caixa pra fora
   do viewport mas ainda soma no tamanho de layout). Resultado: um espaço
   "fantasma" que normalmente fica invisível mas pode ficar alcançável (scroll
   por toque em iOS Safari, roda do mouse em alguns casos, etc), revelando um
   vão em branco abaixo do rodapé com o cabeçalho fora de vista. */
html { overflow: hidden; overflow: clip; }
.op-app {
  display: flex;
  height: 100vh;
  height: 100dvh;
  overflow: hidden;
  overflow: clip;
}

.op-app-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  position: relative;
  /* Sem overflow:clip aqui (era o comportamento antigo): isso cortava
     qualquer coisa que vazasse do header/footer, incluindo tooltips
     (data-op-tip) de botões perto da sidebar — a borda direita da
     .op-app-body é exatamente onde a sidebar começa. A contenção do
     .op-glow (pra não tornar o documento rolável) agora é feita dentro
     do .op-main, que é onde o glow realmente é usado. */
}

/* Header */
.op-header {
  position: relative;
  height: var(--op-header-h);
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0 1.25rem;
  border-bottom: 1px solid var(--op-border);
  background: var(--op-panel);
  box-shadow: 0 8px 24px -12px rgba(0,0,0,.5);
  z-index: 30; /* precisa ficar abaixo da .op-sidebar (50) no mobile, pra o drawer cobrir o header ao abrir */
}
/* filete de brilho verde-lima sob o header */
.op-header::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -1px;
  height: 1px;
  background: linear-gradient(90deg,
    transparent 5%,
    color-mix(in srgb, var(--op-accent) 55%, transparent) 50%,
    transparent 95%);
  pointer-events: none;
}
html.light .op-header { box-shadow: 0 8px 24px -14px rgba(15,23,42,.18); }
.op-header-group { display: flex; align-items: center; gap: .75rem; min-width: 0; }
.op-header-divider { width: 1px; height: 20px; background: var(--op-border-2); }

/* Logo / marca */
.op-brand { display: flex; align-items: center; gap: .625rem; text-decoration: none; transition: opacity .2s; }
.op-brand:hover { opacity: .8; }
.op-brand-mark {
  width: 32px; height: 32px;
  background: var(--op-accent);
  -webkit-clip-path: var(--op-oct); clip-path: var(--op-oct);
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}


html.light .op-brand-mark::after { background: var(--op-accent); }
.op-brand-name {
  font-family: var(--op-font-display);
  font-weight: 700;
  font-size: 1.25rem;
  color: var(--op-strong);
  letter-spacing: .02em;
}

/* Conteúdo rolável */
.op-main {
  flex: 1;
  overflow-y: auto;
  overflow-x: clip; /* contém .op-glow (evita que vaze e torne a página rolável) */
  padding: 1.5rem;
  scroll-behavior: smooth;
  position: relative;
  z-index: 1; /* mantém o conteúdo acima dos .op-glow do fundo */
}
@media (min-width: 1024px) { .op-main { padding: 1.75rem 2rem; } }

/* header/footer ficam acima da sidebar por padrão (55 > 50): evita que um
   tooltip (data-op-tip) de um botão do header/footer fique preso no contexto
   de empilhamento do header/footer e acabe renderizado atrás da sidebar,
   mesmo com z-index nominal maior que o dela. Isso valia só a partir de
   1024px antes, mas o mesmo corte acontecia em qualquer largura abaixo
   disso enquanto a sidebar ainda não é o drawer mobile aberto — por isso
   agora é incondicional. Quando a sidebar VIRA o drawer mobile (.is-open),
   ela sobe pra 60 e volta a cobrir o header normalmente. */
.op-header, .op-footer { z-index: 55; }

/* 1100px é bom pra tela pequena/média (mantém linha de leitura curta), mas
   sobra espaço em branco demais nas laterais em monitor grande. Alarga em
   dois degraus pra telas maiores em vez de deixar fixo ou 100% fluido (que
   deixaria tabelas/formulários exagerados numa tela ultra-wide). */
.op-container { max-width: 1100px; margin: 0 auto; }
@media (min-width: 1440px) { .op-container { max-width: 1320px; } }
@media (min-width: 1800px) { .op-container { max-width: 1600px; } }

/* Footer */
.op-footer {
  height: var(--op-footer-h);
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0 1.25rem;
  border-top: 1px solid var(--op-border);
  background: var(--op-panel);
  font-family: var(--op-font-mono);
  font-size: 11px;
  color: var(--op-muted);
  z-index: 30; /* mesmo motivo do .op-header */
}

/* ----------------------------------------------------------------------------
   4. SIDEBAR (direita, colapsável)
---------------------------------------------------------------------------- */
/* Suprime a transição de width/transform só durante o carregamento inicial
   da página (classe "op-preload" no <html>, ver ui-optago.js) - o JS só
   consegue aplicar o estado salvo (colapsada ou não) depois que este
   elemento existir no DOM, e sem isso essa aplicação inicial ficaria
   animada como se fosse um toggle manual do usuário. */
html.op-preload .op-sidebar { transition: none !important; }
.op-sidebar {
  width: var(--op-sidebar-w);
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  background: var(--op-panel);
  border-left: 1px solid var(--op-border);
  box-shadow: var(--op-shadow-side);
  transition: width .3s var(--op-ease), transform .3s var(--op-ease);
  z-index: 50;
}

.op-sidebar-header {
  height: var(--op-header-h);
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 1rem;
  border-bottom: 1px solid var(--op-border);
}

.op-sidebar-nav {
  flex: 1;
  overflow-y: auto;
  overflow-x: visible;
  padding: 1rem .75rem;
  display: flex;
  flex-direction: column;
  gap: .25rem;
}

.op-sidebar-label {
  padding: 0 .75rem;
  margin: .5rem 0;
  font-family: var(--op-font-mono);
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .2em;
  color: var(--op-muted);
  white-space: nowrap;
}

.op-nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: .75rem;
  padding: .625rem .75rem;
  /* Borda sutil sempre visível (não só transparent até o hover) - mesma
     lógica do ajuste do .op-btn-ghost: sem contorno nenhum em repouso, o
     item fica sem nenhuma affordance de que é clicável antes de passar o
     mouse. Mesma --op-border-2 usada no :hover (--op-border sozinha ficou
     fraca demais em repouso); a diferença de :hover continua vindo do
     background com tingimento, não da borda. */
  border: 1px solid var(--op-border-2);
  border-radius: var(--op-radius);
  color: var(--op-text);
  text-decoration: none;
  font-weight: 600;
  font-size: .875rem;
  white-space: nowrap;
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}
.op-nav-item i { font-size: 1.25rem; flex-shrink: 0; }
html.light .op-nav-item { color: #000000; }
.op-nav-item:hover {
  background: color-mix(in srgb, var(--op-strong) 6%, transparent);
  border-color: var(--op-border-2);
  color: var(--op-strong);
}
html.light .op-nav-item:hover { color: #000000; }
/* Item ativo: pílula preenchida com a cor de marca (em vez da barra na borda) */
.op-nav-item.is-active {
  background: var(--op-accent);
  border-color: var(--op-accent);
  color: var(--op-accent-ink);
}
.op-nav-item.is-active i { color: var(--op-accent-ink); }

/* Estado colapsado: só ícones */
.op-sidebar.is-collapsed { width: var(--op-sidebar-w-collapsed); }
.op-sidebar.is-collapsed .op-nav-text,
.op-sidebar.is-collapsed .op-sidebar-label,
.op-sidebar.is-collapsed .op-sidebar-header-text { display: none; }
.op-sidebar.is-collapsed .op-nav-item { justify-content: center; padding: .625rem; }

/* Tooltip do item (aparece à esquerda quando colapsada).
   position:fixed: o JS calcula top/right no hover, pois o overflow-y:auto
   da nav cortaria um tooltip posicionado com absolute. */
.op-nav-tooltip {
  position: fixed;
  translate: 0 -50%;
  background: var(--op-strong);
  color: var(--op-bg);
  font-family: var(--op-font-mono);
  font-size: 11px;
  font-weight: 700;
  padding: .375rem .75rem;
  border-radius: var(--op-radius-sm);
  box-shadow: var(--op-shadow);
  white-space: nowrap;
  visibility: hidden;
  opacity: 0;
  transform: translateX(-8px) scale(.95);
  transform-origin: right center;
  transition: all .2s var(--op-spring);
  pointer-events: none;
  z-index: 60;
}
.op-nav-tooltip::after {
  content: "";
  position: absolute;
  left: 100%;
  top: 50%;
  translate: 0 -50%;
  border: 5px solid transparent;
  border-left-color: var(--op-strong);
}
.op-sidebar.is-collapsed .op-nav-item:hover .op-nav-tooltip {
  visibility: visible;
  opacity: 1;
  transform: translateX(0) scale(1);
}

/* Sidebar mobile: vira drawer sobreposto */
.op-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,.6);
  backdrop-filter: blur(4px);
  z-index: 40;
  opacity: 0;
  visibility: hidden;
  transition: opacity .3s ease, visibility .3s ease;
}
.op-overlay.is-open { opacity: 1; visibility: visible; }

@media (max-width: 1023px) {
  .op-sidebar {
    position: fixed;
    top: 0; right: 0; bottom: 0;
    transform: translateX(100%);
    box-shadow: var(--op-shadow-lg);
  }
  .op-sidebar.is-open { transform: translateX(0); z-index: 60; }
  .op-sidebar.is-collapsed { width: var(--op-sidebar-w); } /* colapso só no desktop */
  .op-sidebar.is-collapsed .op-nav-text,
  .op-sidebar.is-collapsed .op-sidebar-label,
  .op-sidebar.is-collapsed .op-sidebar-header-text { display: block; }
  .op-sidebar.is-collapsed .op-nav-item { justify-content: flex-start; padding: .625rem .75rem; }
}

/* ----------------------------------------------------------------------------
   5. BOTÕES
---------------------------------------------------------------------------- */
.op-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  padding: .625rem 1.25rem;
  border: 1px solid transparent;
  border-radius: var(--op-radius-sm);
  font-family: var(--op-font-mono);
  font-size: .75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .08em;
  text-decoration: none;
  cursor: pointer;
  user-select: none;
  white-space: nowrap;
  transition: all .2s var(--op-ease);
}
.op-btn i { font-size: 1rem; }
.op-btn:hover { transform: translateY(-2px); }
.op-btn:active { transform: scale(.96); }
.op-btn:disabled, .op-btn.is-disabled {
  opacity: .45;
  pointer-events: none;
}

/* Variantes sólidas */
/* Botão primário: sempre verde-lima (marca), igual nos dois temas. */
.op-btn-primary {
  background: var(--op-accent);
  color: var(--op-accent-ink);
  box-shadow: 0 4px 14px color-mix(in srgb, var(--op-accent) 30%, transparent);
}
.op-btn-primary:hover { background: var(--op-accent-hover); box-shadow: var(--op-glow); }

.op-btn-success { background: var(--op-success); color: #fff; box-shadow: 0 4px 14px rgba(16,185,129,.25); }
.op-btn-success:hover { background: color-mix(in srgb, var(--op-success) 85%, #000); box-shadow: 0 0 20px rgba(16,185,129,.35); }

.op-btn-danger { background: var(--op-danger); color: #fff; box-shadow: 0 4px 14px rgba(239,68,68,.25); }
.op-btn-danger:hover { background: color-mix(in srgb, var(--op-danger) 85%, #000); box-shadow: var(--op-glow-danger); }

.op-btn-warning { background: var(--op-warning); color: #000; box-shadow: 0 4px 14px rgba(245,158,11,.25); }
.op-btn-warning:hover { background: color-mix(in srgb, var(--op-warning) 85%, #000); box-shadow: 0 0 20px rgba(245,158,11,.35); }

.op-btn-info { background: var(--op-info); color: #fff; box-shadow: 0 4px 14px rgba(59,130,246,.25); }
.op-btn-info:hover { background: color-mix(in srgb, var(--op-info) 85%, #000); box-shadow: var(--op-glow-info); }

.op-btn-cyan { background: var(--op-cyan); color: var(--op-cyan-ink); box-shadow: 0 4px 14px rgba(107,224,255,.25); }
.op-btn-cyan:hover { background: var(--op-cyan-hover); box-shadow: var(--op-glow-cyan); }

/* Secundário: cor de marca Cinza-chumbo Apoio (#656565), igual nos dois temas. */
.op-btn-secondary {
  background: #656565;
  border-color: #656565;
  color: #FFFFFF;
}
.op-btn-secondary:hover { background: #767676; border-color: #767676; }

/* Ghost (fundo suave) */
/* Sempre com um contorno sutil (--op-border-2) - sem cor de fundo nenhuma,
   um .op-btn-ghost fica praticamente invisível sobre fundos claros/neutros,
   sem nenhuma affordance de que é clicável até passar o mouse. */
.op-btn-ghost { background: transparent; color: var(--op-text); border-color: var(--op-border-2); }
.op-btn-ghost:hover { background: color-mix(in srgb, var(--op-strong) 7%, transparent); color: var(--op-strong); }

.op-btn-ghost-info    { background: color-mix(in srgb, var(--op-info) 12%, transparent);    color: color-mix(in srgb, var(--op-info) 70%, var(--op-strong)); }
.op-btn-ghost-info:hover    { background: color-mix(in srgb, var(--op-info) 22%, transparent); }
.op-btn-ghost-success { background: color-mix(in srgb, var(--op-success) 12%, transparent); color: color-mix(in srgb, var(--op-success) 70%, var(--op-strong)); }
.op-btn-ghost-success:hover { background: color-mix(in srgb, var(--op-success) 22%, transparent); }
.op-btn-ghost-danger  { background: color-mix(in srgb, var(--op-danger) 12%, transparent);  color: color-mix(in srgb, var(--op-danger) 70%, var(--op-strong)); }
.op-btn-ghost-danger:hover  { background: color-mix(in srgb, var(--op-danger) 22%, transparent); }
.op-btn-ghost-warning { background: color-mix(in srgb, var(--op-warning) 14%, transparent); color: color-mix(in srgb, var(--op-warning) 70%, var(--op-strong)); }
.op-btn-ghost-warning:hover { background: color-mix(in srgb, var(--op-warning) 24%, transparent); }
.op-btn-ghost-cyan    { background: color-mix(in srgb, var(--op-cyan) 12%, transparent);    color: color-mix(in srgb, var(--op-cyan) 70%, var(--op-strong)); }
.op-btn-ghost-cyan:hover    { background: color-mix(in srgb, var(--op-cyan) 22%, transparent); }
html.light .op-btn-ghost-cyan { color: #0E7490; }

/* Tamanhos */
.op-btn-sm { padding: .375rem .875rem; font-size: .6875rem; }
.op-btn-lg { padding: .875rem 1.75rem; font-size: .8125rem; }

/* Somente ícone */
.op-btn-icon {
  padding: .625rem;
  aspect-ratio: 1;
  background: var(--op-panel-2);
  border-color: var(--op-border);
  color: var(--op-muted);
}
.op-btn-icon:hover { color: var(--op-strong); background: var(--op-panel-3); }
.op-btn-icon i { font-size: 1.125rem; }

/* Loading */
.op-btn.is-loading { pointer-events: none; opacity: .75; }
.op-btn.is-loading::before {
  content: "";
  width: 14px; height: 14px;
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-radius: 50%;
  animation: op-spin .7s linear infinite;
}

/* Grupo de botões */
.op-btn-group { display: inline-flex; }
.op-btn-group .op-btn { border-radius: 0; }
.op-btn-group .op-btn:hover { transform: none; }
.op-btn-group .op-btn:first-child { border-radius: var(--op-radius-sm) 0 0 var(--op-radius-sm); }
.op-btn-group .op-btn:last-child { border-radius: 0 var(--op-radius-sm) var(--op-radius-sm) 0; }
.op-btn-group .op-btn-secondary + .op-btn-secondary { border-left-width: 0; }

/* ----------------------------------------------------------------------------
   6. BADGES
---------------------------------------------------------------------------- */
.op-badge {
  display: inline-flex;
  align-items: center;
  gap: .375rem;
  padding: .1875rem .625rem;
  border: 1px solid var(--op-border);
  border-radius: 6px;
  background: var(--op-panel-3);
  color: var(--op-text);
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  line-height: 1.6;
  white-space: nowrap;
}
.op-badge-pill { border-radius: 999px; }

.op-badge-brand {
  background: color-mix(in srgb, var(--op-accent) 10%, transparent);
  border-color: color-mix(in srgb, var(--op-accent) 25%, transparent);
  color: var(--op-accent);
}
html.light .op-badge-brand { color: #3F6212; background: #F3FFE0; border-color: #D4F7A5; }

.op-badge-info    { background: color-mix(in srgb, var(--op-info) 14%, transparent);    border-color: color-mix(in srgb, var(--op-info) 30%, transparent);    color: color-mix(in srgb, var(--op-info) 65%, var(--op-strong)); }
.op-badge-success { background: color-mix(in srgb, var(--op-success) 14%, transparent); border-color: color-mix(in srgb, var(--op-success) 30%, transparent); color: color-mix(in srgb, var(--op-success) 65%, var(--op-strong)); }
.op-badge-warning { background: color-mix(in srgb, var(--op-warning) 14%, transparent); border-color: color-mix(in srgb, var(--op-warning) 30%, transparent); color: color-mix(in srgb, var(--op-warning) 65%, var(--op-strong)); }
.op-badge-danger  { background: color-mix(in srgb, var(--op-danger) 14%, transparent);  border-color: color-mix(in srgb, var(--op-danger) 30%, transparent);  color: color-mix(in srgb, var(--op-danger) 65%, var(--op-strong)); }
.op-badge-cyan    { background: color-mix(in srgb, var(--op-cyan) 14%, transparent);    border-color: color-mix(in srgb, var(--op-cyan) 30%, transparent);    color: color-mix(in srgb, var(--op-cyan) 65%, var(--op-strong)); }
html.light .op-badge-cyan { color: #0E7490; }

/* Pontinho de status (com pulso opcional) */
.op-dot {
  width: 7px; height: 7px;
  border-radius: 50%;
  background: currentColor;
  flex-shrink: 0;
}
.op-dot-pulse { animation: op-pulse 1.6s ease-in-out infinite; }

/* ----------------------------------------------------------------------------
   7. ALERTAS
---------------------------------------------------------------------------- */
.op-alert {
  display: flex;
  gap: .75rem;
  padding: 1rem;
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius);
  background: var(--op-panel-2);
}
.op-alert > i { font-size: 1.25rem; flex-shrink: 0; margin-top: .125rem; }
.op-alert-title { font-family: var(--op-font-sans); font-weight: 700; font-size: .875rem; margin: 0 0 .125rem; }
.op-alert-text { font-size: .8125rem; margin: 0; opacity: .92; }
.op-alert-close {
  margin-left: auto;
  background: none; border: 0; cursor: pointer;
  color: inherit; opacity: .6;
  font-size: 1rem;
  padding: .25rem;
  border-radius: 6px;
  transition: opacity .2s;
  align-self: flex-start;
}
.op-alert-close:hover { opacity: 1; }

.op-alert-info    { background: color-mix(in srgb, var(--op-info) 28%, var(--op-panel-2));    border-color: color-mix(in srgb, var(--op-info) 45%, transparent); }
.op-alert-info    > i, .op-alert-info    .op-alert-title { color: color-mix(in srgb, var(--op-info) 65%, var(--op-strong)); }
.op-alert-success { background: color-mix(in srgb, var(--op-success) 28%, var(--op-panel-2)); border-color: color-mix(in srgb, var(--op-success) 45%, transparent); }
.op-alert-success > i, .op-alert-success .op-alert-title { color: color-mix(in srgb, var(--op-success) 65%, var(--op-strong)); }
.op-alert-warning { background: color-mix(in srgb, var(--op-warning) 28%, var(--op-panel-2)); border-color: color-mix(in srgb, var(--op-warning) 45%, transparent); }
.op-alert-warning > i, .op-alert-warning .op-alert-title { color: color-mix(in srgb, var(--op-warning) 65%, var(--op-strong)); }
.op-alert-danger  { background: color-mix(in srgb, var(--op-danger) 28%, var(--op-panel-2));  border-color: color-mix(in srgb, var(--op-danger) 45%, transparent); }
.op-alert-danger  > i, .op-alert-danger  .op-alert-title { color: color-mix(in srgb, var(--op-danger) 65%, var(--op-strong)); }

/* Modo claro: fundo mais saturado e opaco (misturado com --op-panel-2 em vez de
   transparent, senão a cor de fundo da página vaza e o alerta fica "aguado") e
   texto/ícone numa variante mais escura da cor semântica (em vez do tom vivo,
   que perde contraste em fundo claro). Pedido explícito de cor mais forte no
   claro (2026-08-14): percentuais aumentados de 34/55/70% pra 46/68/78%. */
html.light .op-alert-info    { background: color-mix(in srgb, var(--op-info) 46%, var(--op-panel-2));    border-color: color-mix(in srgb, var(--op-info) 68%, transparent); }
html.light .op-alert-info    > i, html.light .op-alert-info    .op-alert-title { color: color-mix(in srgb, var(--op-info) 78%, black); }
html.light .op-alert-success { background: color-mix(in srgb, var(--op-success) 46%, var(--op-panel-2)); border-color: color-mix(in srgb, var(--op-success) 68%, transparent); }
html.light .op-alert-success > i, html.light .op-alert-success .op-alert-title { color: color-mix(in srgb, var(--op-success) 78%, black); }
html.light .op-alert-warning { background: color-mix(in srgb, var(--op-warning) 46%, var(--op-panel-2)); border-color: color-mix(in srgb, var(--op-warning) 68%, transparent); }
html.light .op-alert-warning > i, html.light .op-alert-warning .op-alert-title { color: color-mix(in srgb, var(--op-warning) 78%, black); }
html.light .op-alert-danger  { background: color-mix(in srgb, var(--op-danger) 46%, var(--op-panel-2));  border-color: color-mix(in srgb, var(--op-danger) 68%, transparent); }
html.light .op-alert-danger  > i, html.light .op-alert-danger  .op-alert-title { color: color-mix(in srgb, var(--op-danger) 78%, black); }

/* ----------------------------------------------------------------------------
   8. FORMULÁRIOS
---------------------------------------------------------------------------- */
.op-field { display: flex; flex-direction: column; gap: .375rem; }

.op-label {
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--op-text);
}
.op-label .req { color: var(--op-danger); }

.op-help { font-size: .75rem; color: var(--op-muted); margin: 0; }
.op-help.is-error { color: var(--op-danger); }
.op-help.is-success { color: var(--op-success); }

.op-input, .op-select, .op-textarea {
  width: 100%;
  padding: .625rem .875rem;
  background: var(--op-panel-2);
  border: 1px solid var(--op-border-2);
  border-radius: var(--op-radius-sm);
  color: var(--op-strong);
  font-family: var(--op-font-sans);
  font-size: .875rem;
  transition: border-color .2s, box-shadow .2s, background .2s;
}
.op-input::placeholder, .op-textarea::placeholder { color: var(--op-muted); }
.op-input:focus, .op-select:focus, .op-textarea:focus {
  outline: none;
  border-color: var(--op-accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--op-accent) 20%, transparent);
}
html.light .op-input:focus, html.light .op-select:focus, html.light .op-textarea:focus {
  border-color: var(--op-info);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--op-info) 15%, transparent);
}
.op-input:disabled, .op-select:disabled, .op-textarea:disabled { opacity: .5; cursor: not-allowed; }

.op-textarea { resize: vertical; min-height: 90px; }

.op-select {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 256 256' fill='%23656565'%3E%3Cpath d='M213.7 101.7l-80 80a8.2 8.2 0 0 1-11.4 0l-80-80a8.1 8.1 0 0 1 11.4-11.4L128 164.7l74.3-74.4a8.1 8.1 0 0 1 11.4 11.4Z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right .875rem center;
  padding-right: 2.5rem;
  cursor: pointer;
}

/* Tamanhos: o padrão acima (sem modificador) é o tamanho normal.
   op-input-xs < op-input-sm < (normal) < op-input-lg */
.op-input-xs, .op-select-xs, .op-textarea-xs {
  padding: .3125rem .625rem;
  font-size: .75rem;
  border-radius: 6px;
}
.op-select-xs { padding-right: 1.875rem; background-position: right .625rem center; background-size: 10px; }
.op-input-sm, .op-select-sm, .op-textarea-sm {
  padding: .5rem .75rem;
  font-size: .8125rem;
}
.op-select-sm { padding-right: 2.125rem; background-position: right .75rem center; }
.op-input-lg, .op-select-lg, .op-textarea-lg {
  padding: .875rem 1.125rem;
  font-size: 1rem;
}
.op-select-lg { padding-right: 2.75rem; background-position: right 1rem center; background-size: 14px; }

/* Estados de validação */
.op-input.is-error, .op-select.is-error, .op-textarea.is-error {
  border-color: var(--op-danger);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--op-danger) 15%, transparent);
}
.op-input.is-success, .op-select.is-success, .op-textarea.is-success {
  border-color: var(--op-success);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--op-success) 15%, transparent);
}

/* Input com ícone */
.op-input-icon { position: relative; }
.op-input-icon > i {
  position: absolute;
  left: .875rem;
  top: 50%;
  translate: 0 -50%;
  color: var(--op-muted);
  font-size: 1.125rem;
  pointer-events: none;
}
.op-input-icon .op-input { padding-left: 2.625rem; }

/* Botão de mostrar/ocultar senha: envolva o input com [data-op-reveal] e
   adicione um <button data-op-reveal-toggle> dentro: o toggle de type
   password/text é feito automaticamente pelo JS da lib. */
[data-op-reveal] { position: relative; }
[data-op-reveal] .op-input { padding-right: 2.5rem; }
.op-reveal-btn {
  position: absolute; top: 50%; right: .5rem; translate: 0 -50%;
  background: none; border: 0; cursor: pointer; padding: .25rem;
  color: var(--op-muted); font-size: 1.125rem; line-height: 1;
  display: flex; align-items: center;
}
.op-reveal-btn:hover { color: var(--op-text); }

/* Input group (prefixo/sufixo) */
.op-input-group { display: flex; }
.op-input-group .op-input { border-radius: 0; }
.op-input-group > :first-child { border-radius: var(--op-radius-sm) 0 0 var(--op-radius-sm); }
.op-input-group > :last-child { border-radius: 0 var(--op-radius-sm) var(--op-radius-sm) 0; }
.op-input-addon {
  display: flex; align-items: center;
  padding: 0 .875rem;
  background: var(--op-panel-3);
  border: 1px solid var(--op-border-2);
  color: var(--op-muted);
  font-family: var(--op-font-mono);
  font-size: .75rem;
  font-weight: 600;
  white-space: nowrap;
}
.op-input-group .op-input-addon:first-child { border-right: 0; }
.op-input-group .op-input-addon:last-child { border-left: 0; }

/* Checkbox & Radio */
.op-check {
  display: inline-flex;
  align-items: center;
  gap: .625rem;
  cursor: pointer;
  font-size: .875rem;
  color: var(--op-text);
  user-select: none;
}
.op-check input[type="checkbox"], .op-check input[type="radio"] {
  appearance: none;
  width: 18px; height: 18px;
  margin: 0;
  border: 1.5px solid var(--op-border-2);
  background: var(--op-panel-2);
  cursor: pointer;
  transition: all .2s var(--op-ease);
  flex-shrink: 0;
  display: grid;
  place-content: center;
}
.op-check input[type="checkbox"] { border-radius: 5px; }
.op-check input[type="radio"] { border-radius: 50%; }
.op-check input:checked {
  background: var(--op-accent);
  border-color: var(--op-accent);
}
html.light .op-check input:checked { background: var(--op-primary); border-color: var(--op-primary); }
.op-check input[type="checkbox"]:checked::before {
  content: "";
  width: 10px; height: 10px;
  background: var(--op-accent-ink);
  clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
}
html.light .op-check input[type="checkbox"]:checked::before { background: #fff; }
.op-check input[type="radio"]:checked::before {
  content: "";
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--op-accent-ink);
}
html.light .op-check input[type="radio"]:checked::before { background: #fff; }
.op-check input:disabled { opacity: .4; cursor: not-allowed; }
.op-check input:disabled + span { opacity: .4; }

/* Switch */
.op-switch {
  display: inline-flex;
  align-items: center;
  gap: .625rem;
  cursor: pointer;
  font-size: .875rem;
  user-select: none;
}
.op-switch input {
  appearance: none;
  width: 40px; height: 22px;
  margin: 0;
  border-radius: 999px;
  background: var(--op-panel-3);
  border: 1px solid var(--op-border-2);
  position: relative;
  cursor: pointer;
  transition: background .25s var(--op-ease), border-color .25s;
  flex-shrink: 0;
}
.op-switch input::before {
  content: "";
  position: absolute;
  top: 2px; left: 2px;
  width: 16px; height: 16px;
  border-radius: 50%;
  background: var(--op-muted);
  transition: all .25s var(--op-spring);
}
.op-switch input:checked {
  background: var(--op-accent);
  border-color: var(--op-accent);
}
html.light .op-switch input:checked { background: var(--op-primary); border-color: var(--op-primary); }
.op-switch input:checked::before {
  left: 20px;
  background: var(--op-accent-ink);
}
html.light .op-switch input:checked::before { background: #fff; }

/* Range */
.op-range {
  appearance: none;
  width: 100%;
  height: 6px;
  border-radius: 999px;
  background: var(--op-panel-3);
  border: 1px solid var(--op-border);
  outline: none;
  cursor: pointer;
}
.op-range::-webkit-slider-thumb {
  appearance: none;
  width: 18px; height: 18px;
  border-radius: 50%;
  background: var(--op-accent);
  border: 2px solid var(--op-bg);
  box-shadow: var(--op-shadow-sm);
  transition: transform .15s;
}
html.light .op-range::-webkit-slider-thumb { background: var(--op-primary); }
.op-range::-webkit-slider-thumb:hover { transform: scale(1.2); }

/* Combobox: input de texto que filtra uma lista de opções (autocomplete).
   Uso: <div class="op-combobox" data-op-combobox>
          <input class="op-input" data-op-combobox-input ...>
          <div class="op-combobox-menu" data-op-combobox-menu>
            <button class="op-combobox-option" data-op-combobox-option data-value="br">Brasil</button>
            ...
            <div class="op-combobox-empty" hidden>Nenhum resultado</div>
          </div>
        </div>
   O JS filtra as opções ao digitar, abre no foco, navega com as setas e
   fecha com ESC/clique fora (mesmo padrão do .op-dropdown). */
.op-combobox { position: relative; }
.op-combobox-menu {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  right: 0;
  max-height: 260px;
  overflow-y: auto;
  background: var(--op-panel);
  border: 1px solid var(--op-border-2);
  border-radius: var(--op-radius);
  box-shadow: var(--op-shadow-lg);
  padding: .375rem;
  z-index: 80;
  opacity: 0;
  visibility: hidden;
  transform: translateY(-6px) scale(.98);
  transform-origin: top;
  transition: all .2s var(--op-spring);
}
.op-combobox.is-open .op-combobox-menu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0) scale(1);
}
.op-combobox-option {
  display: flex;
  align-items: center;
  width: 100%;
  padding: .5625rem .75rem;
  background: none;
  border: 0;
  border-radius: var(--op-radius-sm);
  color: var(--op-text);
  font-family: var(--op-font-sans);
  font-size: .8125rem;
  text-align: left;
  cursor: pointer;
  transition: background .15s, color .15s;
}
.op-combobox-option:hover,
.op-combobox-option.is-active {
  background: color-mix(in srgb, var(--op-strong) 6%, transparent);
  color: var(--op-strong);
}
.op-combobox-option.is-selected { color: var(--op-accent); font-weight: 700; }
html.light .op-combobox-option.is-selected { color: #3F6212; }
.op-combobox-option[hidden] { display: none; }
.op-combobox-empty {
  padding: .625rem .75rem;
  color: var(--op-muted);
  font-size: .8125rem;
}

/* ----------------------------------------------------------------------------
   9. TABELAS
---------------------------------------------------------------------------- */
.op-table-wrap {
  overflow-x: auto;
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius);
  background: var(--op-panel);
  box-shadow: var(--op-shadow);
}
.op-table {
  width: 100%;
  border-collapse: collapse;
  text-align: left;
  font-size: .875rem;
}
.op-table thead tr {
  background: var(--op-panel-2);
  border-bottom: 1px solid var(--op-border);
}
.op-table th {
  padding: .875rem 1.25rem;
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .15em;
  color: var(--op-muted);
  white-space: nowrap;
}
.op-table td { padding: .875rem 1.25rem; }
.op-table tbody tr { border-bottom: 1px solid var(--op-border); transition: background .15s; }
.op-table tbody tr:last-child { border-bottom: 0; }
.op-table-hover tbody tr:hover { background: color-mix(in srgb, var(--op-strong) 4%, transparent); }
.op-table-striped tbody tr:nth-child(odd) { background: color-mix(in srgb, var(--op-strong) 2.5%, transparent); }

/* ----------------------------------------------------------------------------
   10. CARDS
---------------------------------------------------------------------------- */
.op-card {
  background: var(--op-panel);
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius-lg);
  padding: 1.5rem;
  box-shadow: var(--op-shadow);
  transition: transform .25s var(--op-ease), box-shadow .25s, border-color .25s;
}
.op-card-hover:hover {
  transform: translateY(-4px);
  border-color: color-mix(in srgb, var(--op-accent) 30%, var(--op-border));
  box-shadow: var(--op-shadow-lg), 0 0 24px color-mix(in srgb, var(--op-accent) 8%, transparent);
}

.op-card-icon {
  width: 48px; height: 48px;
  border-radius: var(--op-radius);
  background: var(--op-panel-3);
  border: 1px solid var(--op-border-2);
  display: flex; align-items: center; justify-content: center;
  font-size: 1.5rem;
  color: var(--op-strong);
  margin-bottom: 1rem;
  transition: transform .25s var(--op-spring);
}
.op-card-hover:hover .op-card-icon { transform: scale(1.1); }

.op-card-title { font-size: 1.125rem; margin-bottom: .375rem; }
.op-card-text { font-size: .8125rem; color: var(--op-muted); line-height: 1.6; margin-bottom: 1rem; }

.op-card-link {
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--op-accent);
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: .375rem;
  transition: gap .2s;
}
html.light .op-card-link { color: #3F6212; }
.op-card-link:hover { gap: .625rem; }

/* Card de estatística (KPI) */
.op-stat { display: flex; flex-direction: column; gap: .25rem; }
.op-stat-label {
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .12em;
  color: var(--op-muted);
}
.op-stat-value {
  font-family: var(--op-font-display);
  font-size: 2rem;
  font-weight: 700;
  color: var(--op-strong);
  line-height: 1.1;
}
.op-stat-delta {
  font-family: var(--op-font-mono);
  font-size: .75rem;
  font-weight: 600;
  display: inline-flex;
  align-items: center;
  gap: .25rem;
}
.op-stat-delta.is-up { color: var(--op-success); }
.op-stat-delta.is-down { color: var(--op-danger); }

/* ----------------------------------------------------------------------------
   11. AVATAR
---------------------------------------------------------------------------- */
.op-avatar {
  width: 40px; height: 40px;
  border-radius: 50%;
  overflow: hidden;
  background: var(--op-panel-3);
  border: 1px solid var(--op-border-2);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--op-font-mono);
  font-size: .75rem;
  font-weight: 700;
  color: var(--op-accent);
  flex-shrink: 0;
}
html.light .op-avatar { color: #3F6212; }
.op-avatar img { width: 100%; height: 100%; object-fit: cover; }
.op-avatar-sm { width: 30px; height: 30px; font-size: .625rem; }
.op-avatar-lg { width: 56px; height: 56px; font-size: 1rem; }
.op-avatar-ring { border: 2px solid var(--op-accent); }
.op-avatar-group { display: inline-flex; }
.op-avatar-group .op-avatar { margin-left: -10px; border: 2px solid var(--op-panel); }
.op-avatar-group .op-avatar:first-child { margin-left: 0; }

/* ----------------------------------------------------------------------------
   12. PROGRESSO, SPINNERS & SKELETON
---------------------------------------------------------------------------- */
.op-progress {
  height: 10px;
  background: var(--op-panel-3);
  border: 1px solid var(--op-border);
  border-radius: 999px;
  overflow: hidden;
}
.op-progress-bar {
  height: 100%;
  background: var(--op-accent);
  border-radius: 999px;
  transition: width .6s var(--op-ease);
  position: relative;
  overflow: hidden;
}
html.light .op-progress-bar { background: var(--op-primary); }
.op-progress-bar.is-animated::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, rgba(255,255,255,.35), transparent);
  animation: op-shimmer 1.6s ease-in-out infinite;
}
.op-progress-bar.is-info { background: var(--op-info); }
.op-progress-bar.is-success { background: var(--op-success); }
.op-progress-bar.is-warning { background: var(--op-warning); }
.op-progress-bar.is-danger { background: var(--op-danger); }

.op-progress-header {
  display: flex;
  justify-content: space-between;
  margin-bottom: .5rem;
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
}
.op-progress-header .lbl { color: var(--op-muted); text-transform: uppercase; letter-spacing: .1em; }
.op-progress-header .val { color: var(--op-strong); }

/* Spinner circular */
.op-spinner {
  width: 24px; height: 24px;
  border: 2.5px solid var(--op-border-2);
  border-top-color: var(--op-accent);
  border-radius: 50%;
  animation: op-spin .7s linear infinite;
  display: inline-block;
}
html.light .op-spinner { border-top-color: var(--op-primary); }
.op-spinner-sm { width: 16px; height: 16px; border-width: 2px; }
.op-spinner-lg { width: 40px; height: 40px; border-width: 3px; }

/* Spinner de pontos */
.op-spinner-dots { display: inline-flex; gap: .375rem; }
.op-spinner-dots span {
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--op-accent);
  animation: op-bounce 1s ease-in-out infinite;
}
html.light .op-spinner-dots span { background: var(--op-primary); }
.op-spinner-dots span:nth-child(2) { animation-delay: .15s; }
.op-spinner-dots span:nth-child(3) { animation-delay: .3s; }

/* Skeleton */
.op-skeleton {
  background: var(--op-panel-3);
  border-radius: var(--op-radius-sm);
  position: relative;
  overflow: hidden;
}
.op-skeleton::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, color-mix(in srgb, var(--op-strong) 6%, transparent), transparent);
  animation: op-shimmer 1.5s ease-in-out infinite;
}
.op-skeleton-text { height: 12px; margin-bottom: .625rem; }
.op-skeleton-circle { border-radius: 50%; }

/* ----------------------------------------------------------------------------
   13. TABS
---------------------------------------------------------------------------- */
.op-tabs {
  display: flex;
  gap: .25rem;
  border-bottom: 1px solid var(--op-border);
  overflow-x: auto;
}
.op-tab {
  padding: .625rem 1.125rem;
  background: none;
  border: 0;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  color: var(--op-muted);
  font-family: var(--op-font-mono);
  font-size: .75rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .08em;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  white-space: nowrap;
  transition: color .2s, border-color .2s;
}
.op-tab:hover { color: var(--op-text); }
.op-tab.is-active {
  color: var(--op-strong);
  border-bottom-color: var(--op-accent);
}
.op-tab-panel { display: none; padding: 1.25rem 0; }
.op-tab-panel.is-active { display: block; animation: op-fade-in .25s ease; }

/* Tabs estilo "pill" */
.op-tabs-pills {
  display: inline-flex;
  gap: .25rem;
  padding: .25rem;
  background: var(--op-panel-2);
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius);
  box-shadow: var(--op-shadow-sm);
}
.op-tabs-pills .op-tab {
  border: 0;
  margin: 0;
  border-radius: var(--op-radius-sm);
  padding: .5rem 1rem;
}
.op-tabs-pills .op-tab.is-active {
  background: var(--op-accent);
  color: var(--op-accent-ink);
}

/* ----------------------------------------------------------------------------
   14. ACCORDION (usa <details> nativo)
---------------------------------------------------------------------------- */
.op-accordion {
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius);
  overflow: hidden;
  background: var(--op-panel);
  box-shadow: var(--op-shadow);
}
.op-accordion details { border-bottom: 1px solid var(--op-border); }
.op-accordion details:last-child { border-bottom: 0; }
.op-accordion summary {
  padding: 1rem 1.25rem;
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  font-weight: 700;
  font-size: .875rem;
  color: var(--op-strong);
  transition: background .2s;
}
.op-accordion summary::-webkit-details-marker { display: none; }
.op-accordion summary::after {
  content: "";
  width: 8px; height: 8px;
  border-right: 2px solid var(--op-muted);
  border-bottom: 2px solid var(--op-muted);
  transform: rotate(45deg);
  transition: transform .25s var(--op-ease);
  flex-shrink: 0;
}
.op-accordion details[open] summary::after { transform: rotate(-135deg); }
.op-accordion summary:hover { background: color-mix(in srgb, var(--op-strong) 4%, transparent); }
.op-accordion-body {
  padding: 0 1.25rem 1.25rem;
  font-size: .8125rem;
  color: var(--op-muted);
  line-height: 1.7;
}

/* ----------------------------------------------------------------------------
   15. DROPDOWN
---------------------------------------------------------------------------- */
.op-dropdown { position: relative; display: inline-block; }
/* Abre alinhado à esquerda do gatilho (estende para a direita) por padrão,
   para não vazar pela borda esquerda de containers com scroll/clip (o caso
   mais comum). Use .op-menu-end no botão que fica colado na borda direita
   da tela para alinhar a partir da direita como antes. */
.op-menu {
  position: absolute;
  top: calc(100% + 8px);
  left: 0;
  min-width: 200px;
  background: var(--op-panel);
  border: 1px solid var(--op-border-2);
  border-radius: var(--op-radius);
  box-shadow: var(--op-shadow-lg);
  padding: .375rem;
  z-index: 80;
  opacity: 0;
  visibility: hidden;
  /* --op-menu-shift: correção horizontal calculada em JS (ui-optago.js,
     toggle de .op-dropdown-toggle) quando o menu abriria vazando pra fora
     da tela perto de qualquer borda - soma ao transform de abertura/
     fechamento em vez de substituí-lo, então a animação continua intacta. */
  --op-menu-shift: 0px;
  transform: translateY(-6px) scale(.98) translateX(var(--op-menu-shift));
  transform-origin: top left;
  transition: all .2s var(--op-spring);
}
.op-menu-end { left: auto; right: 0; transform-origin: top right; }
.op-dropdown.is-open .op-menu {
  opacity: 1;
  visibility: visible;
  transform: translateY(0) scale(1) translateX(var(--op-menu-shift));
}
.op-menu-item {
  display: flex;
  align-items: center;
  gap: .625rem;
  width: 100%;
  padding: .5625rem .75rem;
  background: none;
  border: 0;
  border-radius: var(--op-radius-sm);
  color: var(--op-text);
  font-family: var(--op-font-sans);
  font-size: .8125rem;
  font-weight: 500;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  transition: background .15s, color .15s;
}
.op-menu-item i { font-size: 1rem; color: var(--op-muted); }
.op-menu-item:hover { background: color-mix(in srgb, var(--op-strong) 6%, transparent); color: var(--op-strong); }
.op-menu-item:hover i { color: var(--op-strong); }
.op-menu-item.is-danger { color: var(--op-danger); }
.op-menu-item.is-danger i { color: var(--op-danger); }
.op-menu-item.is-danger:hover { background: color-mix(in srgb, var(--op-danger) 12%, transparent); color: var(--op-danger); }
.op-menu-divider { height: 1px; background: var(--op-border); margin: .375rem .25rem; }
.op-menu-label {
  padding: .375rem .75rem .125rem;
  font-family: var(--op-font-mono);
  font-size: .625rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .15em;
  color: var(--op-muted);
}

/* ----------------------------------------------------------------------------
   16. TOOLTIP (CSS puro via atributo data-op-tip)
---------------------------------------------------------------------------- */
[data-op-tip] { position: relative; }
[data-op-tip]::after {
  content: attr(data-op-tip);
  position: absolute;
  bottom: calc(100% + 10px);
  left: 50%;
  translate: -50% 0;
  background: var(--op-strong);
  color: var(--op-bg);
  font-family: var(--op-font-mono);
  font-size: 11px;
  font-weight: 700;
  padding: .375rem .75rem;
  border-radius: var(--op-radius-sm);
  /* width:max-content (em vez de auto) é o que faz o balão medir o texto
     de verdade antes de decidir se quebra linha - sem isso, o algoritmo de
     shrink-to-fit padrão do CSS pra width:auto num elemento absolute com
     left:50%+translate (sem right definido) subestima a largura disponível
     e quebra QUALQUER texto com mais de uma palavra, mesmo cabendo fácil
     dentro do max-width. max-width continua sendo o teto real pra textos
     genuinamente longos. */
  width: max-content;
  max-width: min(220px, 90vw);
  white-space: normal;
  text-align: center;
  box-shadow: var(--op-shadow);
  opacity: 0;
  visibility: hidden;
  transform: translateY(4px);
  transition: all .2s var(--op-spring);
  pointer-events: none;
  z-index: 70;
}
[data-op-tip]::before {
  content: "";
  position: absolute;
  bottom: calc(100% + 2px);
  left: 50%;
  translate: -50% 0;
  border: 5px solid transparent;
  border-top-color: var(--op-strong);
  opacity: 0;
  visibility: hidden;
  transition: all .2s var(--op-spring);
  pointer-events: none;
  z-index: 70;
}
[data-op-tip]:hover::after, [data-op-tip]:hover::before {
  opacity: 1;
  visibility: visible;
  transform: translateY(0);
}

/* Alinhamento automático perto da borda da tela (classes aplicadas em JS,
   ui-optago.js, no mouseover de qualquer [data-op-tip] - ver
   ajustarAlinhamentoTooltip()). Só muda o balão (::after); a setinha
   (::before) continua centralizada no próprio gatilho, então sempre aponta
   certo pra ele independente de pra qual lado o balão se estendeu. */
[data-op-tip].op-tip-align-start::after { left: 0; translate: 0 0; }
[data-op-tip].op-tip-align-end::after { left: auto; right: 0; translate: 0 0; }

/* Variante: tooltip abaixo do elemento (para itens colados no topo da tela) */
.op-tip-bottom::after {
  bottom: auto;
  top: calc(100% + 10px);
  transform: translateY(-4px);
}
.op-tip-bottom::before {
  bottom: auto;
  top: calc(100% + 2px);
  border-top-color: transparent;
  border-bottom-color: var(--op-strong);
}

/* ----------------------------------------------------------------------------
   17. BREADCRUMB & PAGINAÇÃO
---------------------------------------------------------------------------- */
.op-breadcrumb {
  display: flex;
  align-items: center;
  gap: .5rem;
  font-family: var(--op-font-mono);
  font-size: .75rem;
  list-style: none;
  padding: 0;
  margin: 0;
  flex-wrap: wrap;
}
.op-breadcrumb li { display: flex; align-items: center; gap: .5rem; }
.op-breadcrumb li:not(:last-child)::after {
  content: "/";
  color: var(--op-border-2);
}
.op-breadcrumb a { color: var(--op-muted); text-decoration: none; transition: color .2s; }
.op-breadcrumb a:hover { color: var(--op-strong); }
.op-breadcrumb li:last-child { color: var(--op-accent); font-weight: 700; }
html.light .op-breadcrumb li:last-child { color: #3F6212; }

.op-pagination { display: inline-flex; gap: .25rem; list-style: none; padding: 0; margin: 0; }
.op-page {
  min-width: 36px; height: 36px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 .5rem;
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius-sm);
  background: var(--op-panel-2);
  color: var(--op-text);
  font-family: var(--op-font-mono);
  font-size: .75rem;
  font-weight: 700;
  text-decoration: none;
  cursor: pointer;
  transition: all .2s;
}
.op-page:hover { border-color: var(--op-border-2); color: var(--op-strong); background: var(--op-panel-3); }
.op-page.is-active {
  background: var(--op-accent);
  border-color: var(--op-accent);
  color: var(--op-accent-ink);
}
html.light .op-page.is-active { background: var(--op-primary); border-color: var(--op-primary); color: var(--op-primary-ink); }
.op-page.is-disabled { opacity: .4; pointer-events: none; }

/* ----------------------------------------------------------------------------
   18. MODAL
---------------------------------------------------------------------------- */
.op-modal {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 1rem;
  background: rgba(0,0,0,.7);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
html.light .op-modal { background: rgba(15,23,42,.5); }
.op-modal.is-open { display: flex; }

.op-modal-box {
  width: 100%;
  max-width: 520px;
  max-height: calc(100vh - 2rem);
  display: flex;
  flex-direction: column;
  background: var(--op-panel);
  border: 1px solid var(--op-border-2);
  border-radius: var(--op-radius-lg);
  box-shadow: var(--op-shadow-lg);
  overflow: hidden;
}
.op-modal-sm .op-modal-box { max-width: 400px; }
.op-modal-lg .op-modal-box { max-width: 760px; }

.op-modal.is-open .op-modal-box { animation: op-modal-in .3s var(--op-spring); }
.op-modal.is-closing .op-modal-box { animation: op-modal-out .2s ease-in forwards; }

.op-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.25rem 1.5rem;
  border-bottom: 1px solid var(--op-border);
  background: var(--op-panel-2);
}
.op-modal-title {
  display: flex;
  align-items: center;
  gap: .75rem;
  font-family: var(--op-font-display);
  font-size: 1.25rem;
  font-weight: 700;
  color: var(--op-strong);
  margin: 0;
}
.op-modal-close {
  background: none;
  border: 0;
  color: var(--op-muted);
  font-size: 1.375rem;
  cursor: pointer;
  padding: .25rem;
  border-radius: var(--op-radius-sm);
  display: flex;
  transition: all .2s;
}
.op-modal-close:hover { color: var(--op-strong); background: color-mix(in srgb, var(--op-strong) 8%, transparent); }
.op-modal-close:active { transform: scale(.9); }

.op-modal-body { padding: 1.5rem; overflow-y: auto; }
.op-modal-footer {
  display: flex;
  justify-content: flex-end;
  gap: .75rem;
  padding: 1.25rem 1.5rem;
  border-top: 1px solid var(--op-border);
  background: var(--op-panel-2);
}
/* Modais com formulário real (method="post") costumam envolver o body e o
   footer num único <form> para o submit incluir os dois. Sem isso, o <form>
   (um bloco comum) quebra a coluna flex do .op-modal-box e o body deixa de
   rolar internamente: o modal cresce para fora da tela em vez de rolar. */
.op-modal form { display: contents; }

/* ----------------------------------------------------------------------------
   19. TOASTS (criados via OptagoUI.toast)
---------------------------------------------------------------------------- */
.op-toast-container {
  position: fixed;
  top: 1.5rem;
  left: 50%;
  translate: -50% 0;
  z-index: 110;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .625rem;
  pointer-events: none;
  width: min(420px, calc(100vw - 2rem));
}
.op-toast {
  position: relative;
  overflow: hidden;
  pointer-events: auto;
  display: flex;
  align-items: center;
  gap: .75rem;
  width: 100%;
  padding: .875rem 1rem;
  background: var(--op-panel);
  border: 1px solid var(--op-border-2);
  border-radius: var(--op-radius);
  box-shadow: var(--op-shadow-lg);
  font-family: var(--op-font-mono);
  font-size: .8125rem;
  font-weight: 600;
  color: var(--op-strong);
  opacity: 0;
  transform: translateY(-16px) scale(.97);
  transition: all .3s var(--op-spring);
}
.op-toast.is-visible { opacity: 1; transform: translateY(0) scale(1); }
.op-toast > span { flex: 1; }
.op-toast-close {
  background: none;
  border: 0;
  color: var(--op-muted);
  font-size: 1.125rem;
  cursor: pointer;
  padding: .25rem;
  border-radius: 6px;
  display: flex;
  flex-shrink: 0;
  transition: color .2s, background .2s;
}
.op-toast-close:hover {
  color: var(--op-strong);
  background: color-mix(in srgb, var(--op-strong) 8%, transparent);
}
.op-toast-icon {
  width: 32px; height: 32px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.125rem;
  flex-shrink: 0;
  border: 1px solid transparent;
}
.op-toast-info    { border-color: color-mix(in srgb, var(--op-info) 35%, var(--op-border)); }
.op-toast-info    .op-toast-icon { background: color-mix(in srgb, var(--op-info) 15%, transparent);    color: var(--op-info);    border-color: color-mix(in srgb, var(--op-info) 30%, transparent); }
.op-toast-success { border-color: color-mix(in srgb, var(--op-success) 35%, var(--op-border)); }
.op-toast-success .op-toast-icon { background: color-mix(in srgb, var(--op-success) 15%, transparent); color: var(--op-success); border-color: color-mix(in srgb, var(--op-success) 30%, transparent); }
.op-toast-warning { border-color: color-mix(in srgb, var(--op-warning) 35%, var(--op-border)); }
.op-toast-warning .op-toast-icon { background: color-mix(in srgb, var(--op-warning) 15%, transparent); color: var(--op-warning); border-color: color-mix(in srgb, var(--op-warning) 30%, transparent); }
.op-toast-danger  { border-color: color-mix(in srgb, var(--op-danger) 35%, var(--op-border)); }
.op-toast-danger  .op-toast-icon { background: color-mix(in srgb, var(--op-danger) 15%, transparent);  color: var(--op-danger);  border-color: color-mix(in srgb, var(--op-danger) 30%, transparent); }

/* Modo claro: o toast usa só borda fina + ícone colorido no tema escuro
   (funciona bem lá, o fundo escuro já contrasta), mas em fundo claro isso
   fica "aguado" quase indistinguível de um toast neutro - ganha o mesmo
   tratamento de fundo saturado que .op-alert já usa (2026-08-14). */
html.light .op-toast-info    { background: color-mix(in srgb, var(--op-info) 22%, var(--op-panel));    border-color: color-mix(in srgb, var(--op-info) 55%, transparent); }
html.light .op-toast-info    .op-toast-icon { background: color-mix(in srgb, var(--op-info) 30%, transparent);    color: color-mix(in srgb, var(--op-info) 78%, black);    border-color: color-mix(in srgb, var(--op-info) 50%, transparent); }
html.light .op-toast-success { background: color-mix(in srgb, var(--op-success) 22%, var(--op-panel)); border-color: color-mix(in srgb, var(--op-success) 55%, transparent); }
html.light .op-toast-success .op-toast-icon { background: color-mix(in srgb, var(--op-success) 30%, transparent); color: color-mix(in srgb, var(--op-success) 78%, black); border-color: color-mix(in srgb, var(--op-success) 50%, transparent); }
html.light .op-toast-warning { background: color-mix(in srgb, var(--op-warning) 24%, var(--op-panel)); border-color: color-mix(in srgb, var(--op-warning) 55%, transparent); }
html.light .op-toast-warning .op-toast-icon { background: color-mix(in srgb, var(--op-warning) 32%, transparent); color: color-mix(in srgb, var(--op-warning) 78%, black); border-color: color-mix(in srgb, var(--op-warning) 50%, transparent); }
html.light .op-toast-danger  { background: color-mix(in srgb, var(--op-danger) 22%, var(--op-panel));  border-color: color-mix(in srgb, var(--op-danger) 55%, transparent); }
html.light .op-toast-danger  .op-toast-icon { background: color-mix(in srgb, var(--op-danger) 30%, transparent);  color: color-mix(in srgb, var(--op-danger) 78%, black);  border-color: color-mix(in srgb, var(--op-danger) 50%, transparent); }

/* Barra de progresso: indica quanto falta para o toast fechar sozinho.
   O JS anima a largura via transition (não @keyframes) para poder
   congelar no ponto exato e retomar dali quando o mouse sai. */
.op-toast-progress {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 3px;
  background: color-mix(in srgb, var(--op-strong) 10%, transparent);
}
.op-toast-progress-bar {
  height: 100%;
  width: 100%;
  background: var(--op-accent);
  transition-property: width;
  transition-timing-function: linear;
}
html.light .op-toast-progress-bar { background: var(--op-primary); }
.op-toast-info    .op-toast-progress-bar { background: var(--op-info); }
.op-toast-success .op-toast-progress-bar { background: var(--op-success); }
.op-toast-warning .op-toast-progress-bar { background: var(--op-warning); }
.op-toast-danger  .op-toast-progress-bar { background: var(--op-danger); }

/* ----------------------------------------------------------------------------
   20. TELA DE CARREGAMENTO (overlay em tela cheia)
   Uso: OptagoUI.showLoading('Mensagem...') / OptagoUI.hideLoading()
   ou data-op-loading-form no <form> para acionar sozinho no submit.
---------------------------------------------------------------------------- */
.op-loading-overlay {
  position: fixed;
  inset: 0;
  z-index: 150;
  display: none;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1.25rem;
  background: color-mix(in srgb, var(--op-bg) 85%, transparent);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  opacity: 0;
  transition: opacity .25s var(--op-ease);
}
.op-loading-overlay.is-open { display: flex; }
.op-loading-overlay.is-visible { opacity: 1; }
.op-loading-overlay .op-spinner { width: 46px; height: 46px; border-width: 3px; }
.op-loading-message {
  max-width: 320px;
  padding: 0 1.5rem;
  font-family: var(--op-font-mono);
  font-size: .875rem;
  font-weight: 600;
  letter-spacing: .01em;
  text-align: center;
  color: var(--op-strong);
}

/* ----------------------------------------------------------------------------
   21. BLOCO DE DEMONSTRAÇÃO (showcase: preview + copiar + ver código)
---------------------------------------------------------------------------- */
.op-demo {
  background: var(--op-panel);
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius-lg);
  box-shadow: var(--op-shadow);
}
/* Sem overflow:hidden no container: dropdowns/tooltips exibidos dentro do
   preview não podem ser cortados. O arredondamento é feito nos filhos. */
.op-demo-preview {
  padding: 1.5rem;
  border-radius: var(--op-radius-lg) var(--op-radius-lg) 0 0;
  background:
    radial-gradient(color-mix(in srgb, var(--op-border) 55%, transparent) 1px, transparent 1px);
  background-size: 22px 22px;
}
.op-demo-bar {
  display: flex;
  justify-content: flex-end;
  gap: .5rem;
  padding: .625rem .875rem;
  border-top: 1px solid var(--op-border);
  background: var(--op-panel-2);
  border-radius: 0 0 var(--op-radius-lg) var(--op-radius-lg);
}
/* Quando o código-fonte está visível, ele passa a ser o último bloco:
   a barra perde o arredondamento inferior e o código assume. */
.op-demo-bar:has(+ .op-demo-code.is-visible) { border-radius: 0; }
.op-demo-code {
  display: none;
  margin: 0;
  padding: 1.25rem;
  background: #0D1117;
  border-top: 1px solid var(--op-border);
  color: #A5D6FF;
  font-family: var(--op-font-mono);
  font-size: .75rem;
  line-height: 1.6;
  overflow-x: auto;
  tab-size: 2;
  white-space: pre;
  border-radius: 0 0 var(--op-radius-lg) var(--op-radius-lg);
}
.op-demo-code.is-visible { display: block; }

/* Cabeçalho de seção do showcase */
.op-section-head {
  display: flex;
  align-items: center;
  gap: .75rem;
  padding-bottom: .75rem;
  margin-bottom: 1.125rem;
  border-bottom: 1px solid var(--op-border);
}
.op-section-head i {
  font-size: 1.25rem;
  color: var(--op-accent);
  width: 38px; height: 38px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: color-mix(in srgb, var(--op-accent) 10%, transparent);
  -webkit-clip-path: var(--op-oct); clip-path: var(--op-oct);
  flex-shrink: 0;
}
html.light .op-section-head i { color: #3F6212; background: var(--op-accent); }
.op-section-head h2 { margin: 0; font-size: 1.5rem; }

/* ----------------------------------------------------------------------------
   20b. GLOW: manchas de verde-lima desfocadas no fundo.
   Use dentro de um container com position:relative (ou no .op-app-body).
   O conteúdo por cima deve ter z-index maior (o .op-main já tem z-index:1).
---------------------------------------------------------------------------- */
.op-glow {
  position: absolute;
  width: 460px;
  height: 340px;
  max-width: 70vw;
  background: var(--op-accent);
  opacity: .07;
  filter: blur(110px);
  border-radius: 50%;
  pointer-events: none;
  z-index: 0;
}
.op-glow-info { background: var(--op-info); }
.op-glow-cyan { background: var(--op-cyan); }
.op-glow-sm { width: 260px; height: 200px; }
.op-glow-lg { width: 700px; height: 460px; }
.op-glow-strong { opacity: .12; }

/* No tema claro o verde-lima #C0FF6B é claro demais para aparecer sobre fundo
   branco com opacidade baixa. Usamos um verde mais saturado + mix-blend-mode:
   multiply (tinge o fundo em vez de clarear) para o glow ficar visível. */
html.light .op-glow {
  background: #9AE600;
  opacity: .40;
  mix-blend-mode: multiply;
}
html.light .op-glow-info { background: #3B82F6; opacity: .28; }
/* Mesmo problema do verde-lima: o ciano #6BE0FF também é claro demais no
   tema claro: mesma solução (mais saturado + multiply). */
html.light .op-glow-cyan {
  background: #00B8D9;
  opacity: .40;
  mix-blend-mode: multiply;
}
html.light .op-glow-strong { opacity: .55; }

/* ----------------------------------------------------------------------------
   20c. MODAIS: VARIANTES EXTRAS
---------------------------------------------------------------------------- */
/* Drawer lateral (desliza da direita) */
.op-modal-drawer { justify-content: flex-end; align-items: stretch; padding: 0; }
.op-modal-drawer .op-modal-box {
  max-width: 440px;
  height: 100%;
  max-height: none;
  border-radius: 0;
  border-top: 0;
  border-bottom: 0;
  border-right: 0;
}
.op-modal-drawer .op-modal-body { flex: 1; }
.op-modal-drawer.is-open .op-modal-box { animation: op-drawer-in .35s var(--op-spring); }
.op-modal-drawer.is-closing .op-modal-box { animation: op-drawer-out .25s ease-in forwards; }

/* Modal centrado (confirmações e sucesso, sem header) */
.op-modal-centered .op-modal-box { max-width: 400px; text-align: center; }
.op-modal-centered .op-modal-body {
  padding: 2.25rem 1.75rem 1rem;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.op-modal-centered .op-modal-footer {
  justify-content: center;
  border-top: 0;
  background: transparent;
  padding-top: .5rem;
}
.op-modal-icon {
  width: 68px; height: 68px;
  -webkit-clip-path: var(--op-oct); clip-path: var(--op-oct);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2rem;
  margin-bottom: 1rem;
  animation: op-icon-pop .5s var(--op-spring);
}
.op-modal-icon.is-success { background: color-mix(in srgb, var(--op-success) 15%, transparent); color: var(--op-success); }
.op-modal-icon.is-danger  { background: color-mix(in srgb, var(--op-danger) 15%, transparent);  color: var(--op-danger); }
.op-modal-icon.is-warning { background: color-mix(in srgb, var(--op-warning) 15%, transparent); color: var(--op-warning); }
.op-modal-icon.is-brand   { background: color-mix(in srgb, var(--op-accent) 14%, transparent);  color: var(--op-accent); }
html.light .op-modal-icon.is-brand { color: #3F6212; }

@keyframes op-icon-pop {
  0%   { transform: scale(0) rotate(-20deg); opacity: 0; }
  60%  { transform: scale(1.15) rotate(4deg); opacity: 1; }
  100% { transform: scale(1) rotate(0deg); }
}

@keyframes op-drawer-in {
  from { transform: translateX(100%); }
  to { transform: translateX(0); }
}
@keyframes op-drawer-out {
  from { transform: translateX(0); }
  to { transform: translateX(100%); }
}

/* ----------------------------------------------------------------------------
   20d. TABS VERTICAIS
---------------------------------------------------------------------------- */
.op-tabs-vertical { display: flex; gap: 1.5rem; align-items: flex-start; }
.op-tabs-vertical .op-tabs-col {
  display: flex;
  flex-direction: column;
  gap: .25rem;
  min-width: 190px;
  flex-shrink: 0;
}
.op-tabs-col .op-tab {
  justify-content: flex-start;
  border: 1px solid transparent;
  margin: 0;
  border-radius: var(--op-radius-sm);
  padding: .625rem .875rem;
  text-align: left;
  transition: background .2s ease, color .2s ease, border-color .2s ease;
}
.op-tabs-col .op-tab:hover {
  background: color-mix(in srgb, var(--op-strong) 6%, transparent);
  border-color: var(--op-border-2);
}
/* Aba ativa: pílula preenchida com a cor de marca (igual ao item ativo da sidebar) */
.op-tabs-col .op-tab.is-active {
  background: var(--op-accent);
  border-color: var(--op-accent);
  color: var(--op-accent-ink);
}
.op-tabs-vertical .op-tab-panels { flex: 1; min-width: 0; }
.op-tabs-vertical .op-tab-panel { padding: 0; }
@media (max-width: 640px) {
  .op-tabs-vertical { flex-direction: column; }
  .op-tabs-vertical .op-tabs-col { flex-direction: row; flex-wrap: wrap; min-width: 0; }
}

/* ----------------------------------------------------------------------------
   20e. SKELETON: variações extras
---------------------------------------------------------------------------- */
.op-skeleton-thumb { aspect-ratio: 16 / 9; width: 100%; border-radius: var(--op-radius); margin-bottom: 1rem; }
.op-skeleton-title { height: 16px; width: 55%; margin-bottom: .75rem; }
.op-skeleton-btn { height: 36px; width: 116px; }
.op-skeleton-badge { height: 22px; width: 68px; border-radius: 999px; }
.op-skeleton-row {
  display: flex;
  align-items: center;
  gap: .875rem;
  padding: .625rem 0;
}

/* ----------------------------------------------------------------------------
   20f. TIMELINE
---------------------------------------------------------------------------- */
.op-timeline { position: relative; list-style: none; margin: 0; padding: 0 0 0 2rem; }
.op-timeline::before {
  content: "";
  position: absolute;
  left: 7px;
  top: 6px;
  bottom: 6px;
  width: 2px;
  background: var(--op-border);
}
.op-timeline-item { position: relative; padding-bottom: 1.75rem; }
.op-timeline-item:last-child { padding-bottom: 0; }
.op-timeline-marker {
  position: absolute;
  left: -2rem;
  top: 3px;
  width: 16px; height: 16px;
  background: var(--op-border-2);
  -webkit-clip-path: var(--op-oct); clip-path: var(--op-oct);
}
.op-timeline-marker.is-brand   { background: var(--op-accent); }
.op-timeline-marker.is-success { background: var(--op-success); }
.op-timeline-marker.is-warning { background: var(--op-warning); }
.op-timeline-marker.is-danger  { background: var(--op-danger); }
.op-timeline-marker.is-info    { background: var(--op-info); }
.op-timeline-marker.is-pulse   { animation: op-pulse 1.6s ease-in-out infinite; }
.op-timeline-time {
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--op-muted);
  display: block;
  margin-bottom: .125rem;
}
.op-timeline-title {
  font-weight: 700;
  font-size: .9375rem;
  color: var(--op-strong);
  margin: 0 0 .25rem;
  display: flex;
  align-items: center;
  gap: .5rem;
  flex-wrap: wrap;
}
.op-timeline-text { font-size: .8125rem; color: var(--op-muted); margin: 0; line-height: 1.6; }

/* Timeline horizontal: adicione .op-timeline-horizontal junto com .op-timeline
   no mesmo <ul>. Os itens viram colunas, com o marcador acima do texto. */
.op-timeline.op-timeline-horizontal {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
  gap: 1.5rem;
  overflow-x: auto;
}
.op-timeline.op-timeline-horizontal::before {
  left: 0;
  right: 0;
  top: 7px;
  bottom: auto;
  height: 2px;
  width: auto;
}
.op-timeline-horizontal .op-timeline-item {
  flex: 1;
  min-width: 170px;
  padding-bottom: 0;
  padding-top: 2rem;
  text-align: center;
}
.op-timeline-horizontal .op-timeline-marker { left: 50%; top: 0; translate: -50% 0; }
.op-timeline-horizontal .op-timeline-title { justify-content: center; }

/* ----------------------------------------------------------------------------
   20g. TABULATOR: tema Óptago
   Aplicado quando a tabela é criada via OptagoUI.tabulator() (o JS injeta o
   CSS base do Tabulator ANTES deste arquivo, então estas regras vencem).
---------------------------------------------------------------------------- */
.op-tabulator.tabulator {
  background: var(--op-panel);
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius);
  box-shadow: var(--op-shadow);
  font-family: var(--op-font-sans);
  font-size: .875rem;
  overflow: hidden;
}
.op-tabulator.tabulator .tabulator-header {
  background: var(--op-panel-2);
  border-bottom: 1px solid var(--op-border);
  color: var(--op-muted);
}
.op-tabulator.tabulator .tabulator-header .tabulator-col {
  background: transparent;
  border-right: 1px solid var(--op-border);
}
.op-tabulator.tabulator .tabulator-header .tabulator-col:last-of-type { border-right: 0; }
.op-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-content { padding: .875rem 1rem; }
.op-tabulator.tabulator .tabulator-header .tabulator-col-title {
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .12em;
  color: var(--op-muted);
}
.op-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-sortable:hover {
  background: var(--op-panel-3);
}
/* setas de ordenação */
.op-tabulator.tabulator .tabulator-header .tabulator-col .tabulator-col-sorter .tabulator-arrow {
  border-bottom-color: var(--op-muted);
}
.op-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="ascending"] .tabulator-col-sorter .tabulator-arrow {
  border-bottom-color: var(--op-accent);
}
.op-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="descending"] .tabulator-col-sorter .tabulator-arrow {
  border-top-color: var(--op-accent);
}
html.light .op-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="ascending"] .tabulator-col-sorter .tabulator-arrow { border-bottom-color: #65A30D; }
html.light .op-tabulator.tabulator .tabulator-header .tabulator-col.tabulator-sortable[aria-sort="descending"] .tabulator-col-sorter .tabulator-arrow { border-top-color: #65A30D; }

.op-tabulator.tabulator .tabulator-tableholder { background: var(--op-panel); }
.op-tabulator.tabulator .tabulator-tableholder .tabulator-table {
  background: transparent;
  color: var(--op-text);
}
.op-tabulator.tabulator .tabulator-row {
  background: transparent;
  border-bottom: 1px solid var(--op-border);
  color: var(--op-text);
  min-height: 0;
}
.op-tabulator.tabulator .tabulator-row .tabulator-cell {
  padding: .75rem 1rem;
  border-right: 0;
}
.op-tabulator.tabulator .tabulator-row.tabulator-row-even { background: color-mix(in srgb, var(--op-strong) 2.5%, transparent); }
.op-tabulator.tabulator .tabulator-row.tabulator-selectable:hover {
  background: color-mix(in srgb, var(--op-accent) 6%, transparent);
  cursor: pointer;
}
.op-tabulator.tabulator .tabulator-row.tabulator-selected {
  background: color-mix(in srgb, var(--op-accent) 14%, transparent);
}
.op-tabulator.tabulator .tabulator-placeholder .tabulator-placeholder-contents {
  color: var(--op-muted);
  font-family: var(--op-font-mono);
  font-size: .8125rem;
}
.bb-optago-credit {
  display: inline-flex;
  align-items: center;
  gap: .5rem;
  color: var(--op-muted);
  font-family: var(--op-font-mono);
  font-size: .75rem;
  text-decoration: none;
}
.bb-optago-credit:hover {
  color: var(--op-strong);
}
.bb-optago-mark {
  width: 16px;
  height: 16px;
  background: #C0FF6B;
  flex-shrink: 0;
}
/* rodapé / paginação */
.op-tabulator.tabulator .tabulator-footer {
  background: var(--op-panel-2);
  border-top: 1px solid var(--op-border);
  color: var(--op-muted);
  padding: .5rem .75rem;
}
.op-tabulator.tabulator .tabulator-footer .tabulator-footer-contents { padding: 0; }
.op-tabulator.tabulator .tabulator-footer .tabulator-page-counter,
.op-tabulator.tabulator .tabulator-footer .tabulator-page-size {
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  color: var(--op-muted);
}
.op-tabulator.tabulator .tabulator-footer .tabulator-page-size {
  background: var(--op-panel);
  border: 1px solid var(--op-border-2);
  border-radius: 6px;
  color: var(--op-text);
  padding: .25rem .5rem;
}
.op-tabulator.tabulator .tabulator-footer .tabulator-page {
  background: var(--op-panel);
  border: 1px solid var(--op-border);
  border-radius: var(--op-radius-sm);
  color: var(--op-text);
  font-family: var(--op-font-mono);
  font-size: .6875rem;
  font-weight: 700;
  padding: .3125rem .625rem;
  margin: 0 .125rem;
  transition: all .2s;
}
.op-tabulator.tabulator .tabulator-footer .tabulator-page:not(.disabled):hover {
  background: var(--op-panel-3);
  border-color: var(--op-border-2);
  color: var(--op-strong);
}
.op-tabulator.tabulator .tabulator-footer .tabulator-page.active {
  background: var(--op-accent);
  border-color: var(--op-accent);
  color: var(--op-accent-ink);
}
html.light .op-tabulator.tabulator .tabulator-footer .tabulator-page.active {
  background: var(--op-primary);
  border-color: var(--op-primary);
  color: var(--op-primary-ink);
}
.op-tabulator.tabulator .tabulator-footer .tabulator-page.disabled { opacity: .4; }
/* barra de progresso interna usada em células formatadas */
.op-tabulator .op-progress { min-width: 90px; }

/* ----------------------------------------------------------------------------
   22. UTILITÁRIOS
---------------------------------------------------------------------------- */
.op-row { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; }
.op-stack { display: flex; flex-direction: column; gap: 1rem; }
.op-grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 1.25rem; }
.op-grid-3 { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1.25rem; }
.op-grid-4 { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 1rem; }

/* Visível apenas no mobile (ex.: hamburguer que abre a sidebar) */
.op-mobile-only { display: none !important; }
@media (max-width: 1023px) { .op-mobile-only { display: inline-flex !important; } }

.op-text-muted { color: var(--op-muted); }
.op-text-accent { color: var(--op-accent); }
html.light .op-text-accent { color: #3F6212; }
.op-text-mono { font-family: var(--op-font-mono); }
.op-text-sm { font-size: .8125rem; }
.op-text-xs { font-size: .6875rem; }

.op-mt-1 { margin-top: .5rem; } .op-mt-2 { margin-top: 1rem; } .op-mt-3 { margin-top: 1.5rem; } .op-mt-4 { margin-top: 1.75rem; }
.op-mb-1 { margin-bottom: .5rem; } .op-mb-2 { margin-bottom: 1rem; } .op-mb-3 { margin-bottom: 1.5rem; } .op-mb-4 { margin-bottom: 1.75rem; }

/* ----------------------------------------------------------------------------
   23. ANIMAÇÕES
---------------------------------------------------------------------------- */
@keyframes op-spin { to { transform: rotate(360deg); } }
@keyframes op-bounce {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-7px); }
}
@keyframes op-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: .35; }
}
@keyframes op-shimmer {
  from { transform: translateX(-100%); }
  to { transform: translateX(100%); }
}
@keyframes op-fade-in {
  from { opacity: 0; transform: translateY(4px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes op-modal-in {
  from { opacity: 0; transform: scale(.95) translateY(12px); }
  to { opacity: 1; transform: scale(1) translateY(0); }
}
@keyframes op-modal-out {
  from { opacity: 1; transform: scale(1) translateY(0); }
  to { opacity: 0; transform: scale(.95) translateY(12px); }
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    transition-duration: .01ms !important;
  }
}
