/* ============================================================
   Fluxion — design tokens & primitives
   Concept: instrument-panel. Zero border-radius. Mono for data.
   ============================================================ */

:root {
  /* Surfaces (dark-first; light theme below) */
  --canvas: #0A0E14;
  --row:    #11161E;
  --row-2:  #161D27;
  --elev:   #1A2230;
  --rule:   #1F2A37;
  --rule-2: #2A3A4F;

  /* Ink */
  --ink:    #D6DEE8;
  --ink-2:  #95A0AE;
  --muted:  #818C9A;
  --dim:    #5A6575;

  /* Signals */
  --go:     #6FD08A;
  --wait:   #E6B450;
  --stop:   #E5484D;
  --info:   #7DD3FC;
  /* Aliases for the semantic role names used across components. Keep them in sync
     with --go / --stop so a future palette swap touches one place. */
  --ok:     var(--go);
  --fail:   var(--stop);
  --warn:   var(--wait);

  /* Brand mark / one accent */
  --mark:   #3B82F6;
  /* Quarantine — used by DLQ badges and the evidence card */
  --quarantine: #C97064;

  /* Type */
  --sans: "IBM Plex Sans", system-ui, -apple-system, "Segoe UI", sans-serif;
  --mono: "IBM Plex Mono", ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace;

  --t-xs: 11px;
  --t-sm: 12px;
  --t-md: 13px;
  --t-lg: 15px;
  --t-xl: 20px;

  --row-h: 28px;
  --gutter: 16px;

  /* #109 · tokens compostos pra hover/row backgrounds.
     Antes hardcoded rgba(...) em 6+ lugares — sem reagir ao theme. Agora
     deriva de --stop/--wait/--quarantine pra ambos os temas escolherem alpha
     adequado ao próprio canvas. */
  --hover-strong: rgba(255, 255, 255, 0.08);
  --hover-soft:   rgba(255, 255, 255, 0.04);
  --row-dlq-bg:        rgba(201, 112, 100, 0.05);
  --row-dlq-bg-hover:  rgba(201, 112, 100, 0.10);
  --row-slow-bg:       rgba(216, 163, 46, 0.04);
  --row-fail-bg:       rgba(178, 34, 48, 0.04);
  --row-pass-bg:       rgba(46, 125, 69, 0.05);

  color-scheme: dark;
}

[data-theme="light"] {
  /* Surfaces — push more separation between canvas and the elevated bars so the top
     nav and footer feel anchored. Rules deepen to ~10% darker than the dark theme's
     proportional contrast against the brighter background. */
  --canvas: #E8E6DE;
  --row:    #F4F2EA;
  --row-2:  #EDEAE0;
  --elev:   #FBF9F2;
  --rule:   #BFBCAE;
  --rule-2: #A09D8E;

  /* Ink — keep near-black for legibility; tighten muted/dim ladder so secondary text
     stays readable on cream (the dark theme's --dim becomes invisible on light). */
  --ink:    #1A1F26;
  --ink-2:  #3A434E;
  --muted:  #5F6A75;
  --dim:    #6E7883;

  /* Signals — the dark theme uses neon-bright accents that work on near-black but
     wash out on cream. Light theme uses deeper, saturated variants of each hue.
     Picked to keep semantic identity (green=ok, red=fail) while landing readable. */
  --go:     #2E7D45;   /* forest green, contrast ratio ~5:1 on cream */
  --wait:   #9A6B17;   /* dark goldenrod — same family as the --warn yellow */
  --stop:   #B22230;   /* deeper crimson, less neon than #E5484D */
  --info:   #1E5FA8;   /* saturated blue (cyan #7DD3FC was invisible) */

  /* Brand mark — slightly deepen the coral so it reads against cream without
     looking pale. Same hue, ~15% more saturated. */
  --mark:   #2563EB;

  /* Quarantine — match the deeper coral palette of stop/mark. Maintains the
     "quarantine ward" identity without competing with the brand mark. */
  --quarantine: #A53E33;

  /* #109 · light theme — overrides com alpha mais sutil (cream base é menos
     tolerante a overlay branco/escuro). Sources mais escuras pra contrast. */
  --hover-strong: rgba(0, 0, 0, 0.06);
  --hover-soft:   rgba(0, 0, 0, 0.03);
  --row-dlq-bg:        rgba(165, 62, 51, 0.07);
  --row-dlq-bg-hover:  rgba(165, 62, 51, 0.12);
  --row-slow-bg:       rgba(154, 107, 23, 0.07);
  --row-fail-bg:       rgba(165, 62, 51, 0.05);
  --row-pass-bg:       rgba(46, 125, 69, 0.07);

  color-scheme: light;
}

/* ---- Accent presets do --mark · AZUL é o default · settável pra ÍNDIGO ----
   Espelha o mecanismo de tema (localStorage 'fluxion-accent' → data-accent no <html>).
   Cada preset redefine --mark nos 2 temas: dark (sem data-theme) e light. */
[data-accent="indigo"]                     { --mark: #8B5CF6; }   /* índigo · dark  */
[data-theme="light"][data-accent="indigo"] { --mark: #6D28D9; }   /* índigo · light */

/* Reset Bootstrap’s rounded everywhere ---------------------- */
*, *::before, *::after {
  border-radius: 0 !important;
}

html, body {
  margin: 0;
  padding: 0;
  background: var(--canvas);
  color: var(--ink);
  font-family: var(--sans);
  font-size: var(--t-md);
  line-height: 1.4;
  -webkit-font-smoothing: antialiased;
  font-feature-settings: "ss01", "ss02";
}
/* Trava o scroll do DOCUMENTO nas telas com shell (o scroll vive dentro do .canvas, height:100dvh).
   Sem isto o Safari RESTAURA um scroll fantasma do document (herdado de um estado antigo que
   transbordava) no reload e empurra o .app-shell pra fora do viewport → o fundo do html aparece =
   "sobra" cinza no embed (incidente 2026-08-14, diagnosticado por medição no Safari real: scrollY=799
   num document de 609px). :has() escopa pra NÃO afetar páginas sem shell (login/erro), que rolam normal. */
html:has(.app-shell), body:has(.app-shell) { height: 100%; overflow: hidden; }

code, pre, .mono { font-family: var(--mono); }

a { color: var(--info); text-decoration: none; }
a:hover { text-decoration: underline; text-underline-offset: 3px; }

/* ============================================================
   Shell: command-bar header / canvas / instrument footer
   ============================================================ */
/* Shell em COLUNA-FLEX (fix "preview não ocupa toda a altura" · v2 2026-08-14): header e footer
   têm altura NATURAL (flex:0 0 auto); o .canvas é o ÚNICO esticável (flex:1 1 auto) — ele é quem
   sobra depois do header/footer, SEMPRE, não importa quanto o header cresce (crumbs, badge de
   demo...) nem o que precede o conteúdo dentro dele (page-head, flow-picker...). min-height:0 no
   item flexível é OBRIGATÓRIO (o default min-height:auto do flexbox usa o CONTEÚDO como piso e o
   item nunca encolhe pra caber — raiz de 4 tentativas anteriores que só mexiam num
   calc(100vh-Npx) local sem consertar a cadeia). Substitui o grid antigo (auto 1fr auto), que não
   tinha essa trava e deixava o 1fr crescer com o conteúdo em vez de ficar preso ao viewport. */
.app-shell {
  height: 100dvh;
  display: flex;
  flex-direction: column;
}

.cmdbar {
  display: flex;
  align-items: center;
  gap: 12px;
  height: 36px;
  flex: 0 0 auto;
  padding: 0 16px;
  background: var(--row);
  border-bottom: 1px solid var(--rule);
  font-family: var(--mono);
  font-size: var(--t-sm);
}
.cmdbar .mark {
  color: var(--mark);
  font-weight: 600;
  letter-spacing: 0.02em;
}
.cmdbar .crumb { color: var(--ink); }
.cmdbar .sep   { color: var(--dim); }
.cmdbar .grow  { flex: 1; }
.cmdbar .cmd-actions { display: flex; gap: 4px; align-items: center; }
.cmdbar .theme-toggle { font-family: var(--mono); width: 28px; padding: 0; justify-content: center; }
.cmdbar .appearance-gear { width: 28px; padding: 0; justify-content: center; font-size: 13px; color: var(--muted); text-decoration: none; }
.cmdbar .appearance-gear:hover, .cmdbar .appearance-gear.active { color: var(--ink); }

/* Nav groups (Onda 1 · F-03) — 4 cognitive groups + aria-current on active link */
.nav-group {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.nav-group-trigger {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  height: 24px;
  padding: 0 10px;
  font-family: var(--sans);
  font-size: var(--t-sm);
  background: transparent;
  color: var(--ink-2);
  border: 1px solid transparent;
  cursor: pointer;
}
.nav-group-trigger:hover {
  background: var(--row-2);
  color: var(--ink);
  border-color: var(--rule-2);
}
.nav-group-trigger:focus-visible {
  outline: 1px solid var(--info);
  outline-offset: 1px;
}
.nav-group.is-active .nav-group-trigger { color: var(--mark); }
.nav-group-trigger .chev-down {
  font-size: 9px;
  color: var(--dim);
  margin-left: 2px;
}
.nav-group.is-active .nav-group-trigger .chev-down { color: var(--mark); }

.nav-group-menu {
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 224px;
  background: var(--elev);
  border: 1px solid var(--rule-2);
  padding: 4px 0;
  z-index: 100;
  display: none;
  flex-direction: column;
  margin-top: 0;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35);
}
[data-theme="light"] .nav-group-menu { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); }
/* grupos da direita (Governance/Security) abrem ancorados à direita pra o dropdown (com badge) não estourar a viewport */
.nav-group-alignright .nav-group-menu { left: auto; right: 0; }
.nav-group:hover .nav-group-menu,
.nav-group:focus-within .nav-group-menu {
  display: flex;
}
.nav-group-menu a {
  padding: 6px 14px;
  font-family: var(--sans);
  font-size: var(--t-sm);
  color: var(--ink-2);
  text-decoration: none;
  border-left: 2px solid transparent;
}
.nav-group-menu a:hover {
  background: var(--row-2);
  color: var(--ink);
  text-decoration: none;
}
/* foco de teclado visível nos itens de menu + triggers (F-02 · WCAG 2.4.7) */
.nav-group-menu a:focus-visible,
.nav-group-trigger:focus-visible { outline: 2px solid var(--mark); outline-offset: -2px; }
/* item de feature paga não licenciada: dimmed + pill com o tier mínimo (leva ao /upgrade).
   grid 1fr/auto alinha o pill numa coluna consistente; label trunca em vez de quebrar linha (F-04). */
.nav-group-menu a.nav-locked { color: var(--muted); display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 12px; }
.nav-group-menu a.nav-locked:hover { color: var(--ink-2); }
.nav-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* pill do tier: sem borda (contraste falhava) — fundo sutil + tier em --ink-2 (F-06) */
.nav-lock { font-size: 10.5px; color: var(--ink-2); white-space: nowrap; padding: 1px 7px; background: var(--row-2); border-radius: 10px; letter-spacing: 0.02em; }
/* separador "Desbloqueie com um plano" que agrupa os itens bloqueados no fim do dropdown (F-05) */
.nav-upsell-head { margin: 6px 0 0; padding: 6px 14px 3px; border-top: 1px solid var(--rule-2);
  font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--muted); }
/* sub-cabeçalho de PLANO dentro da seção de upsell (agrupa os bloqueados por tier) */
.nav-upsell-tier { padding: 4px 14px 2px; font-size: 10px; font-weight: 600; letter-spacing: 0.03em; color: var(--ink-2); }
/* glifo de cadeado do item agrupado (sem o pill de tier — o cabeçalho já diz o plano) */
.nav-lock-glyph { font-size: 11px; opacity: 0.65; }
.nav-group-menu a.active,
.nav-group-menu a[aria-current="page"] {
  border-left-color: var(--mark);
  color: var(--mark);
  background: var(--row);
}

.canvas {
  /* Inset horizontal de TODO o conteúdo (24px) — nada de texto/tabela encostando na borda.
     O .page-head "estoura" com margin negativa pra manter a régua (border-bottom) full-width.
     flex:1 1 auto + min-height:0: é o item esticável do .app-shell — ocupa TODO o espaço que
     sobra entre cmdbar e footbar, e nunca menos (min-height:0 destrava o encolhimento). É
     também um container de flex-COLUNA pros próprios filhos (page-head/flow-picker/.editor
     empilham em ordem normal — nenhum ganha flex-grow a menos que peça, então páginas comuns
     seguem exatamente como block/grid antes). overflow-y:auto: quando o conteúdo de uma
     página comum (lista, tabela) é mais alto que o canvas, ELA rola — o header/footer ficam
     fixos, não o document inteiro (troca o scroll de página por scroll de canvas). */
  display: flex;
  flex-direction: column;
  flex: 1 1 auto;
  min-height: 0;
  padding: 0 24px;
  overflow-x: auto;
  overflow-y: auto;
}

.footbar {
  display: flex;
  align-items: center;
  gap: 16px;
  height: 24px;
  flex: 0 0 auto;
  padding: 0 16px;
  background: var(--row);
  border-top: 1px solid var(--rule);
  font-family: var(--mono);
  font-size: var(--t-xs);
  color: var(--ink-2);
}
.footbar .seg + .seg::before {
  content: "·";
  color: var(--dim);
  margin-right: 16px;
  margin-left: 0;
}

/* ============================================================
   Buttons — flat, sharp, two ranks
   ============================================================ */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 24px;
  padding: 0 10px;
  font-family: var(--sans);
  font-size: var(--t-sm);
  background: transparent;
  color: var(--ink);
  border: 1px solid var(--rule-2);
  cursor: pointer;
}
.btn:hover { background: var(--row-2); border-color: var(--ink-2); }
.btn:focus-visible { outline: 1px solid var(--info); outline-offset: 1px; }
.btn[disabled] { color: var(--dim); border-color: var(--rule); cursor: not-allowed; background: transparent; }
/* Disabled do primary: neutraliza o fundo (o .btn-primary do Bootstrap deixava fundo azul +
   texto dim = ilegível). Especificidade sobe pra vencer o bundle do Bootstrap. */
.btn-primary:disabled, .btn-primary[disabled] { background: transparent; color: var(--muted); border-color: var(--rule); }

.btn-primary {
  background: var(--ink);
  color: var(--canvas);
  border-color: var(--ink);
  font-weight: 500;
}
.btn-primary:hover { background: var(--mark); border-color: var(--mark); color: var(--canvas); }

.btn-ghost { border-color: transparent; color: var(--ink-2); }
.btn-ghost:hover { background: var(--row-2); color: var(--ink); border-color: var(--rule-2); }

.btn-danger { color: var(--stop); border-color: var(--rule-2); }
.btn-danger:hover { background: rgba(229, 72, 77, .1); border-color: var(--stop); color: var(--stop); }

/* ============================================================
   Table — signature: left-rail, vertical-only rules, dense
   ============================================================ */
.itable {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--mono);
  font-size: var(--t-sm);
  background: var(--canvas);
}
.itable thead th {
  text-align: left;
  font-family: var(--sans);
  font-weight: 500;
  font-size: var(--t-xs);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
  padding: 10px 14px 8px;
  border-bottom: 1px solid var(--rule);
  background: var(--row);
  position: sticky;
  top: 0;
}
.itable thead th + th { border-left: 1px solid var(--rule); }

.itable tbody td {
  padding: 0 14px;
  height: var(--row-h);
  color: var(--ink);
  vertical-align: middle;
  white-space: nowrap;
}
.itable tbody td + td { border-left: 1px solid var(--rule); }
.itable tbody tr {
  border-left: 2px solid transparent;
}
/* Cells that should ellipsis when content is long (e.g. name) opt-in via class. */
.itable td.col-truncate {
  max-width: 240px;
  overflow: hidden;
  text-overflow: ellipsis;
}
.itable tbody tr:hover { background: var(--row); }

.itable tbody tr.go     { border-left-color: var(--go); }
.itable tbody tr.wait   { border-left-color: var(--wait); }
.itable tbody tr.stop   { border-left-color: var(--stop); }
.itable tbody tr.idle   { border-left-color: var(--dim); }
.itable tbody tr.off    { border-left-color: var(--rule); }
.itable tbody tr.off td { color: var(--ink-2); }

.itable .col-actions {
  text-align: right;
  white-space: nowrap;
}
.itable .col-actions .btn + .btn { margin-left: 4px; }
.itable .col-num     { text-align: right; font-variant-numeric: tabular-nums; }
.itable .col-narrow  { width: 1px; }
.itable .col-center  { text-align: center; }
/* Linha-agrupadora dentro de uma tabela densa (ex.: matriz RBAC, PII) — subhead sem hover. */
.itable tbody tr.group-row td {
  font-family: var(--mono);
  font-size: var(--t-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--muted);
  background: var(--row-2);
  border-left-color: var(--rule);
  padding-top: 8px;
}
.itable tbody tr.group-row:hover td { background: var(--row-2); }
/* Header de grupo colapsável dentro da tabela (abstração do colapso do editor de job). */
.grp-toggle {
  display: inline-flex; align-items: center; gap: 6px;
  background: transparent; border: 0; cursor: pointer; padding: 0;
  font-family: var(--mono); font-size: var(--t-xs); text-transform: uppercase;
  letter-spacing: 0.06em; color: var(--muted);
}
.grp-toggle:hover { color: var(--ink); }
.grp-toggle .chev { font-size: 9px; }
.grp-toggle .grp-count { color: var(--muted); text-transform: none; letter-spacing: 0; }
/* Edição-no-lugar: a coluna de um papel vira editável; as outras esmaecem (foco na ação). */
.itable .col-dim { opacity: 0.4; }
.cell-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 20px; padding: 0 4px; cursor: pointer;
  font-family: var(--mono); font-size: var(--t-sm);
  background: transparent; border: 1px solid var(--rule-2); color: var(--ink-2);
}
.cell-toggle.on { color: var(--go); border-color: var(--go); background: color-mix(in srgb, var(--go) 12%, transparent); }
.cell-toggle:hover { border-color: var(--ink-2); }
.cell-toggle.on:hover { border-color: var(--go); }
/* marca de alteração não-salva (accent) — some ao salvar/cancelar */
.cell-toggle.changed { box-shadow: 0 0 0 1px var(--mark); border-color: var(--mark); }
.role-edit {
  background: transparent; border: 0; cursor: pointer; color: var(--ink-2);
  font-size: 11px; margin-left: 4px; padding: 0 2px;
}
.role-edit:hover { color: var(--mark); }
.role-edit.active { color: var(--mark); }
/* barra de ação do modo-edição (papel), colada ao topo do conteúdo */
.rbac-editbar {
  display: flex; align-items: center; gap: 8px; padding: 8px 0; margin-bottom: 8px;
  border-bottom: 1px solid var(--rule);
  font-family: var(--mono); font-size: var(--t-sm);
}
.rbac-editbar .grow { flex: 1; }
.rbac-editbar .unsaved { color: var(--mark); }

.empty {
  padding: 40px 24px;
  text-align: center;
  color: var(--muted);
  font-family: var(--mono);
  font-size: var(--t-sm);
}
.empty .hint { color: var(--ink-2); margin-top: 8px; }

/* ============================================================
   Status: 8×8 square (not pill, not circle)
   ============================================================ */
.dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  vertical-align: -1px;
  margin-right: 8px;
  background: var(--dim);
}
.dot.go   { background: var(--go); }
.dot.wait { background: var(--wait); }
.dot.stop { background: var(--stop); }
.dot.idle { background: var(--dim); }
.dot.off  { background: transparent; border: 1px solid var(--dim); }

.tag {
  display: inline-block;
  font-family: var(--mono);
  font-size: var(--t-xs);
  padding: 1px 6px;
  background: var(--row-2);
  color: var(--ink-2);
  border: 1px solid var(--rule);
}
.tag.go   { color: var(--go);   border-color: rgba(111, 208, 138, .35); }
.tag.wait { color: var(--wait); border-color: rgba(230, 180, 80,  .35); }
.tag.stop { color: var(--stop); border-color: rgba(229, 72, 77,   .35); }

.arrow {
  color: var(--dim);
  margin: 0 6px;
  font-family: var(--mono);
}

/* ============================================================
   Editor layout: two panes, denser left form + live JSON right
   ============================================================
   3 states (driven by class on .editor + optional inline --side-w).
   The grid always declares 5 named columns so transitions don't reflow elements:
     1 reopen-left strip (visible only when --expanded)
     2 form
     3 resize handle (4px)
     4 preview
     5 reopen-right strip (visible only when --collapsed)

   - default      → form 1fr · sidebar 480px (or custom via --side-w)
   - --expanded   → form FULLY HIDDEN · sidebar 1fr · reopen strip on the LEFT
   - --collapsed  → sidebar hidden · form 1fr · reopen strip on the RIGHT

   Resize handle drives --side-w via window.fluxionSidebar in wwwroot/sidebar-resize.js.
*/
.editor {
  display: grid;
  grid-template-columns: 0 minmax(0, 1fr) 4px minmax(0, var(--side-w, 480px)) 0;
  /* fill-the-canvas (v2 2026-08-14): era `min-height: calc(100vh - 60px)` — um chute fixo que
     ignorava tudo que o .canvas já tinha renderizado ACIMA do .editor (page-head, flow-picker,
     banners) e tudo que o header/footer somam além dos 60px assumidos (crumbs, badge de demo,
     modo embed). Sempre sobrava/faltava — a "faixa morta" abaixo do preview (curto demais) ou
     overflow (alto demais). Com o .canvas agora bounded+flex-column (acima), .editor só precisa
     pedir o que SOBRA dele: flex:1 esparrama até o fim real do canvas, min-height:0 permite
     encolher abaixo do conteúdo (senão o grid nunca cede). O single-row grid implícito (sem
     grid-template-rows) estica os 5 itens de coluna — inclusive .editor-preview — pra preencher
     essa altura via align-items:stretch (default), então o preview passa a crescer JUNTO. */
  flex: 1 1 auto;
  min-height: 0;
}
.editor.editor--expanded {
  /* Form vanishes. Sidebar takes the canvas. 24px reopen strip on the LEFT
     keeps a way back visible at all times. */
  grid-template-columns: 24px 0 0 minmax(0, 1fr) 0;
}
.editor.editor--collapsed {
  /* Mirror image — preview vanishes, form takes the canvas, reopen strip on the RIGHT. */
  grid-template-columns: 0 minmax(0, 1fr) 0 0 24px;
}

/* Explicit grid placement so child order in markup doesn't fight the columns. */
.editor-reopen-left  { grid-column: 1; }
.editor-form         { grid-column: 2; }
.editor-resize-handle{ grid-column: 3; }
.editor-preview      { grid-column: 4; }
.editor-reopen       { grid-column: 5; }

.editor-form {
  padding: 20px 24px 80px;
  border-right: 1px solid var(--rule);
  overflow-y: auto;
}
.editor.editor--expanded .editor-form  { display: none; }
.editor.editor--collapsed .editor-form { border-right: 0; }

/* Drag handle between form and preview. 4px-wide hot zone that grows visually
   on hover. Hidden in both preset states (nothing to resize when one side is gone). */
.editor-resize-handle {
  cursor: col-resize;
  background: var(--rule);
  position: relative;
  transition: background 120ms;
}
.editor-resize-handle:hover,
.editor-resize-handle:active { background: var(--mark); }
.editor-resize-handle::after {
  content: "";
  position: absolute;
  inset: 0 -4px;
}
.editor.editor--expanded  .editor-resize-handle,
.editor.editor--collapsed .editor-resize-handle { display: none; }

/* Re-open strips. Both are 24px column · single chevron · same visual language;
   they just sit on opposite sides of the editor. */
.editor-reopen-left,
.editor-reopen {
  background: var(--row);
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding-top: 12px;
}
.editor-reopen-left  { border-right: 1px solid var(--rule); }
.editor-reopen       { border-left:  1px solid var(--rule); }
.editor.editor--expanded  .editor-reopen-left { display: flex; }
.editor.editor--collapsed .editor-reopen      { display: flex; }
.editor-reopen-left button,
.editor-reopen button {
  background: transparent;
  border: 0;
  cursor: pointer;
  font-family: var(--mono);
  font-size: var(--t-sm);
  color: var(--muted);
  width: 24px; height: 24px;
  padding: 0;
}
.editor-reopen-left button:hover,
.editor-reopen button:hover { color: var(--ink); }
.editor.editor--expanded  .editor-preview { display: block; }

/* Pane-control cluster pinned to the right of the preview-tabs header.
   3 icon buttons: expand toggle / collapse / reset-width. */
.preview-tabs .pane-controls {
  margin-left: auto;
  display: flex;
  gap: 0;
  padding-right: 4px;
}
.preview-tabs .pane-ctl {
  background: transparent;
  border: 0;
  cursor: pointer;
  width: 28px; height: 32px;
  padding: 0;
  font-family: var(--mono);
  font-size: var(--t-sm);
  color: var(--muted);
}
.preview-tabs .pane-ctl:hover { color: var(--ink); background: var(--row-2); }
.preview-tabs .pane-ctl.active { color: var(--mark); }

.editor-preview {
  background: var(--row);
  padding: 0;
  overflow-y: auto;
  position: relative;
}
.editor.editor--collapsed .editor-preview { display: none; }
.editor-preview header {
  position: sticky; top: 0;
  background: var(--row);
  border-bottom: 1px solid var(--rule);
  padding: 8px 14px;
  font-family: var(--mono);
  font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.editor-preview pre {
  margin: 0;
  padding: 12px 14px;
  font-family: var(--mono);
  font-size: var(--t-sm);
  color: var(--ink);
  white-space: pre-wrap;
  word-break: break-all;
}

/* Form blocks ----------------------------------------------- */
.section {
  margin-bottom: 22px;
  /* toda seção é uma CAIXA com borda de contorno (datasheet panel), igual o header */
  border: 1px solid var(--rule);
  padding: 12px 16px;
}
/* seção aninhada não vira caixa-dentro-de-caixa */
.section .section { border: 0; padding: 0; margin-bottom: 14px; }
/* tabela de lista (Template A) TEM contorno nos 4 lados, SEM padding extra. Envelopada num
   .list-frame com `border` REAL — MESMA espessura das outras caixas (.section/.page-head).
   Por que não `border` no <table> nem box-shadow: com border-collapse o border-left 2px das
   linhas vence o border da tabela (o lado esquerdo some), e box-shadow renderiza mais fino que
   o border — o PO pegou a diferença de espessura. O wrapper é um elemento à parte: não colapsa. */
.canvas > .list-frame { border: 1px solid var(--rule); overflow-x: auto; margin: 0 0 22px; }
.canvas > .list-frame > table.itable { width: 100%; margin: 0; }
/* Config/Security (Template C): a .itable dentro de uma .section COLA na borda da caixa — mesmo
   contorno tight das listas. O padding da section (12/16) é só pra label/texto respirar; a tabela
   já tem o padding das células, então ela é puxada de volta até a borda. */
.section > table.itable { margin-left: -16px; margin-right: -16px; width: calc(100% + 32px); }
.section > table.itable:first-child { margin-top: -12px; }
.section > table.itable:last-child  { margin-bottom: -12px; }
/* quando há um section-label logo acima da tabela, o underline dele acompanha a largura total (alinha com a tabela) */
.section > .section-label:has(+ table.itable) { margin-left: -16px; margin-right: -16px; padding-left: 16px; padding-right: 16px; }

/* Paginador canônico (Paginator.razor) — rodapé abaixo da tabela, padrão datasheet */
.pager { display: flex; align-items: center; gap: 6px; margin: 10px 2px 22px; font-size: var(--t-xs); color: var(--muted); }
.pager .grow { flex: 1 1 auto; }
.pager-range { letter-spacing: 0.04em; }
.pager .pg-btn {
  min-width: 26px; height: 26px; padding: 0 6px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent; color: var(--ink-2);
  border: 1px solid var(--rule); border-radius: 0;
  font-family: var(--mono); font-size: var(--t-xs); line-height: 1; cursor: pointer;
}
.pager .pg-btn:hover:not(:disabled) { border-color: var(--mark); color: var(--ink); }
.pager .pg-btn:disabled { opacity: 0.4; cursor: default; }
.pager .pg-num.on { border-color: var(--mark); color: var(--ink); box-shadow: inset 0 0 0 1px var(--mark); }
.pager .pg-gap { padding: 0 2px; color: var(--ink-2); }
.pager-size { display: inline-flex; align-items: center; gap: 6px; margin-left: 6px; white-space: nowrap; }
/* especificidade (0,4,0) pra vencer o `.fx-select.select.dropdown { width:100% }` (mais abaixo no arquivo) */
.pager .pager-size .fx-select.pg-size { min-width: 78px; width: 78px; flex: 0 0 auto; }

/* cabeçalho de coluna ordenável (SortHeader.razor) */
.itable th.sortable { cursor: pointer; user-select: none; }
.itable th.sortable:hover { color: var(--ink); }
.itable th.sortable.sorted { color: var(--ink); }
.itable th.sortable:focus-visible { outline: 1px solid var(--info); outline-offset: -2px; }
.itable th.sortable .sort-ind { margin-left: 4px; color: var(--mark); font-size: 9px; display: inline-block; min-width: 8px; vertical-align: middle; }
.section-label {
  font-family: var(--mono);
  font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin: 0 0 6px;
  padding-bottom: 4px;
  border-bottom: 1px solid var(--rule);
}

.field {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 12px;
  align-items: center;
  padding: 6px 0;
}
.field > label {
  color: var(--ink-2);
  font-size: var(--t-sm);
  font-family: var(--mono);
}

.input, .select, .textarea {
  width: 100%;
  height: 26px;
  padding: 0 8px;
  font-family: var(--mono);
  font-size: var(--t-sm);
  background: var(--row);
  color: var(--ink);
  border: 1px solid var(--rule-2);
  outline: none;
}
.input:focus, .select:focus, .textarea:focus {
  border-color: var(--info);
  background: var(--canvas);
}
.textarea { height: auto; padding: 6px 8px; min-height: 64px; resize: vertical; }

/* ============================================================
   BootstrapBlazor <Select> retematizado → instrument-panel.
   Terminal/datasheet: mono, zero radius, grupos como `// categoria`,
   accent --go no item ativo. Vale pro type-picker (source/transform/dest/join).
   ============================================================ */
/* trigger — igual ao .select nativo.
   IMPORTANTE: o wrapper raiz do BB tem classe `select`, então a `.select` nativa do app
   (border + bg + height) vaza nele → borda dupla ("colocado sobre outro"). Zera aqui. */
.fx-select.select.dropdown { width: 100%; border: 0; background: transparent; height: auto; padding: 0; }
.fx-select .dropdown-toggle { position: relative; }
.fx-select .form-select {
  width: 100%; height: 26px; padding: 0 24px 0 8px;
  font-family: var(--mono); font-size: var(--t-sm);
  background: var(--row); color: var(--ink);
  border: 1px solid var(--rule-2); border-radius: 0;
  cursor: pointer; box-shadow: none; outline: none;
}
.fx-select .dropdown-toggle.show .form-select,
.fx-select .form-select:focus { border-color: var(--info); background: var(--canvas); }
/* caret: o BB usa ícone Font Awesome, que NÃO carrega no app (fica width 0, invisível).
   Desenho o chevron via CSS — mostra que é um select + rotaciona no aberto (collapse/expand). */
.fx-select .form-select-append {
  right: 9px; display: inline-flex; align-items: center; justify-content: center;
  pointer-events: none;
}
.fx-select .form-select-append i { display: none; }
/* chevron de LINHA FINA (não triângulo preenchido): duas bordas de 1.5px rotacionadas */
.fx-select .form-select-append::after {
  content: ""; display: block; width: 6px; height: 6px;
  border-right: 1px solid var(--muted); border-bottom: 1px solid var(--muted);
  transform: translateY(-2px) rotate(45deg);
  transition: transform .15s ease, border-color .15s ease;
}
.fx-select .dropdown-toggle.show .form-select-append::after {
  transform: translateY(1px) rotate(225deg); border-color: var(--ink-2);
}

/* JobsList — expandir detalhes (chevron de linha fina como o fx-select) + painel compacto */
.col-expand { width: 26px; text-align: center; }
.btn-expand {
  background: none; border: 0; padding: 6px; cursor: pointer; color: var(--muted);
  display: inline-flex; align-items: center; justify-content: center;
}
.btn-expand:hover { color: var(--ink); }
.btn-expand .chev-thin {
  display: block; width: 5px; height: 5px;
  border-right: 1px solid currentColor; border-bottom: 1px solid currentColor;
  transform: rotate(-45deg); transition: transform .15s ease;
}
.btn-expand .chev-thin.open { transform: rotate(45deg); }
.job-detail {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 3px 10px;
  padding: 7px 12px 8px 42px; background: var(--row-2);
  border-top: 1px solid var(--rule); font-size: var(--t-sm); color: var(--ink-2);
}
.job-detail .k {
  color: var(--muted); text-transform: uppercase; font-size: var(--t-xs);
  letter-spacing: .05em; margin-right: 5px;
}
.job-detail .sep { color: var(--dim); }

/* painel (custom-class = popover-region; BB Select é o único BB no app) */
.dropdown-menu.popover-region,
.dropdown-menu.popover-region.shadow {
  background: var(--elev); border: 1px solid var(--rule-2); border-radius: 0;
  box-shadow: 0 8px 26px rgba(0,0,0,.5); padding: 0; min-width: 220px;
}
/* busca */
.popover-region .dropdown-menu-search {
  position: relative; padding: 5px; margin: 0;
  border-bottom: 1px solid var(--rule); background: var(--row-2);
}
.popover-region .dropdown-menu-search .search-text {
  width: 100%; height: 24px; padding: 0 8px 0 24px;
  font-family: var(--mono); font-size: var(--t-sm);
  background: var(--row); color: var(--ink);
  border: 1px solid var(--rule-2); border-radius: 0; outline: none;
}
.popover-region .dropdown-menu-search .search-text:focus { border-color: var(--info); background: var(--canvas); }
.popover-region .dropdown-menu-search .search-icon {
  position: absolute; left: 13px; top: 50%; transform: translateY(-50%);
  color: var(--muted); font-size: 11px;
}
/* corpo */
.popover-region .dropdown-menu-body { max-height: 280px; overflow-y: auto; padding: 3px 0; }
/* header de grupo (BB .divider): o BB dá altura fixa 8px + bg branco no .divider e posiciona
   o texto absoluto. Não mexo em position (quebra o texto) — zero bg no .divider, e as RÉGUAS
   (topo + base) vão no .divider-text, que tem altura real do texto. */
.popover-region .dropdown-menu-body .divider {
  display: block; height: auto; min-height: 0; background: transparent;
  margin: 6px 0 0; padding: 0; border: 0; justify-content: flex-start;
}
.popover-region .dropdown-menu-body .divider:first-child { margin-top: 2px; }
.popover-region .dropdown-menu-body .divider-mask { display: none; }
.popover-region .dropdown-menu-body .divider-text,
.popover-region .dropdown-menu-body .divider-text.is-center {
  position: relative; inset: auto; transform: none;
  display: block; width: 100%; margin: 0; padding: 5px 10px 4px;
  justify-content: flex-start; text-align: left;
  border-top: 1px solid var(--rule-2); border-bottom: 1px solid var(--rule-2);
}
.popover-region .dropdown-menu-body .divider:first-child .divider-text { border-top: 0; }
.popover-region .dropdown-menu-body .divider-text span {
  font-family: var(--mono); font-size: var(--t-xs);
  text-transform: uppercase; letter-spacing: .1em; color: var(--muted);
}
.popover-region .dropdown-menu-body .divider-text span::before { content: "// "; color: var(--dim); }
.popover-region .dropdown-menu-body .divider + .dropdown-item { margin-top: 3px; }
/* itens */
.popover-region .dropdown-menu-body .dropdown-item {
  font-family: var(--mono); font-size: var(--t-sm); color: var(--ink);
  padding: 4px 10px; border-left: 2px solid transparent; border-radius: 0; cursor: pointer;
}
.popover-region .dropdown-menu-body .dropdown-item:hover {
  background: var(--hover-soft); border-left-color: var(--go); color: var(--ink);
}
.popover-region .dropdown-menu-body .dropdown-item.active,
.popover-region .dropdown-menu-body .dropdown-item.selected {
  background: color-mix(in srgb, var(--go) 12%, transparent);
  border-left-color: var(--go); color: var(--go);
}

.checkbox-row { display: flex; align-items: center; gap: 8px; padding: 6px 0; }
.checkbox-row input { accent-color: var(--info); }

/* Key-value editor (for endpoint settings) */
.kv {
  display: grid;
  grid-template-columns: 1fr 2fr auto;
  gap: 6px;
  margin-bottom: 4px;
}
.kv .input { height: 24px; }
/* valor de setting/var secreto: input mascarado + toggle "revelar" (evita leak em screenshot) */
.secret-cell { display: flex; align-items: center; gap: 4px; min-width: 0; }
.secret-cell .input { flex: 1 1 auto; min-width: 0; }
.secret-cell .secret-toggle { flex: 0 0 auto; height: 24px; padding: 0 6px; font-size: var(--t-xs); white-space: nowrap; }
/* typed settings: checkbox de bool no lugar do input de texto */
.kv-bool { display: flex; align-items: center; gap: 6px; height: 24px; font-size: var(--t-xs); }
.kv-bool input[type=checkbox] { margin: 0; }

.transform-list { display: flex; flex-direction: column; gap: 12px; }
.transform-step {
  border-left: 2px solid var(--rule);
  padding-left: 10px;
  transition: opacity 150ms;
}
.transform-step.transform-step--disabled {
  /* Step desabilitado · config preservada mas pipeline pula. Sinal LOUD: borda âmbar tracejada +
     badge OFF âmbar (não atenuado) · conteúdo atenuado. */
  border-left: 2px dashed var(--warn);
}
/* atenua só o CONTEÚDO — o indicador OFF fica loud (senão o próprio "desativado" some) */
.transform-step--disabled .transform-row .fx-select,
.transform-step--disabled .kv,
.transform-step--disabled .discover-actions,
.transform-step--disabled .move-btn { opacity: 0.45; }
.transform-step--disabled .transform-row .fx-select:hover,
.transform-step--disabled .kv:focus-within { opacity: 0.8; }  /* ao interagir, reforça */
/* badge OFF loud — impossível não ver que o step está desativado */
.transform-step--disabled .step-toggle { color: var(--warn); }
.transform-step--disabled .step-toggle span {
  background: color-mix(in srgb, var(--warn) 16%, transparent);
  border: 1px solid var(--warn); padding: 0 5px; font-weight: 600;
}
.transform-row {
  display: grid;
  grid-template-columns: 24px 56px 1fr auto;
  gap: 8px;
  align-items: center;
}
.transform-row .idx { color: var(--muted); font-family: var(--mono); font-size: var(--t-xs); text-align: right; }
.transform-row .step-toggle {
  display: inline-flex; align-items: center; gap: 4px;
  font-family: var(--mono); font-size: 10px;
  text-transform: uppercase; letter-spacing: 0.05em;
  color: var(--muted);
  cursor: pointer;
  user-select: none;
}
.transform-row .step-toggle input { margin: 0; cursor: pointer; }
.transform-row .step-toggle:hover { color: var(--ink); }
.transform-step:not(.transform-step--disabled) .step-toggle { color: var(--mark); }

/* OutputPreview diagnostics (per-column inference + null/distinct counts) */
.preview-diagnostics {
  background: var(--row-2);
  border-bottom: 1px solid var(--rule);
  padding: 10px 12px;
  display: flex; flex-direction: column; gap: 6px;
}
.preview-diagnostics__title {
  color: var(--muted);
  text-transform: uppercase;
  font-size: 10px;
  letter-spacing: 0.08em;
}
.preview-diagnostics__warn {
  color: var(--wait);
  font-size: var(--t-xs);
  border-left: 2px solid var(--wait);
  padding: 2px 8px;
}
.diag-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--t-xs);
}
.diag-table th, .diag-table td {
  padding: 4px 8px;
  text-align: left;
  border-bottom: 1px solid var(--rule);
}
.diag-table th { color: var(--muted); text-transform: uppercase; font-weight: 500; font-size: 10px; }
.diag-table td.warn { color: var(--wait); }
.diag-table td.muted { color: var(--muted); }

/* DestinationPreview · shape header + summary banner */
.destination-preview { padding: 0; }
.destination-header {
  padding: 10px 14px;
  border-bottom: 1px solid var(--rule);
  background: var(--row-2);
}
.destination-header__title {
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
  margin-bottom: 4px;
}
.destination-header__shape {
  font-size: var(--t-xs);
}
.destination-header__shape .dim { color: var(--muted); }
.destination-header__shape .hl { color: var(--mark); }
.destination-summary {
  padding: 6px 14px;
  background: rgba(25,213,166,0.06);
  border-bottom: 1px solid var(--rule);
  color: var(--go);
  font-size: var(--t-xs);
}
.kv.kv-nested { margin-left: 32px; margin-top: 4px; }
.btn.btn-nested { margin-left: 32px; margin-top: 4px; }

/* Monaco CodeField — sized to occupy the value cell of a kv row */
.code-field { width: 100%; height: 140px; border: 1px solid var(--rule-2); }
.code-field .monaco-editor, .code-field .monaco-editor .overflow-guard { border-radius: 0 !important; }
.code-cell { width: 100%; }
/* setting code-y (query/body/…): key + × em cima, editor Monaco full-width embaixo — não trunca a key nem solta o × */
.kv.kv--code {
  grid-template-columns: 1fr auto;
  grid-template-areas: "key remove" "code code";
  align-items: center;
}
.kv--code .kv-key    { grid-area: key; }
.kv--code .code-cell { grid-area: code; }
.kv--code > .btn-danger { grid-area: remove; align-self: center; }

/* Schema browser (in-place panel under source/destination settings) */
.schema-browser {
  border: 1px solid var(--rule);
  background: var(--row);
  margin-top: 12px;
  font-family: var(--mono);
  font-size: var(--t-sm);
}
.schema-browser-head {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 12px;
  border-bottom: 1px solid var(--rule);
  background: var(--row-2);
  font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.schema-browser-head .lbl { color: var(--ink-2); }
.schema-browser-head .meta { color: var(--ink); text-transform: none; letter-spacing: 0; }
.schema-browser-head .sep { color: var(--dim); }
.schema-browser-filter { padding: 8px 12px; border-bottom: 1px solid var(--rule); }
.schema-browser-filter .input { width: 100%; }

.schema-tree { max-height: 340px; overflow-y: auto; padding: 6px 0; }
.schema-node + .schema-node { border-top: 1px solid var(--rule); }

.schema-toggle, .table-toggle {
  display: flex; align-items: center; gap: 8px;
  width: 100%;
  padding: 4px 12px;
  background: transparent; border: 0; cursor: pointer;
  color: var(--ink);
  font-family: var(--mono); font-size: var(--t-sm);
  text-align: left;
}
.schema-toggle:hover, .table-toggle:hover { background: var(--row-2); }
.schema-toggle .caret, .table-toggle .caret { width: 12px; color: var(--muted); }
.schema-toggle .name { font-weight: 500; }
.table-toggle { padding-left: 28px; }
.table-toggle .name { color: var(--ink-2); }
.table-toggle .table-pick {
  border-bottom: 1px dashed transparent;
}
.table-toggle .table-pick:hover {
  color: var(--info);
  border-bottom-color: var(--info);
}
.badge {
  font-family: var(--mono); font-size: var(--t-xs);
  color: var(--muted);
  padding: 0 6px;
  margin-left: auto;
  border: 1px solid var(--rule);
}
.column-list { padding: 4px 12px 8px 56px; }
.column-row {
  display: grid;
  grid-template-columns: 1fr auto auto;
  gap: 12px;
  padding: 2px 0;
  font-size: var(--t-xs);
}
.col-name  { color: var(--ink); }
.col-type  { color: var(--muted); }
.col-flag  { color: var(--wait); font-size: var(--t-xs); }

/* discover action button — sits next to "+ setting" */
.discover-actions { display: flex; gap: 6px; margin-top: 6px; align-items: center; }
.discover-actions .hint { color: var(--muted); font-family: var(--mono); font-size: var(--t-xs); }

/* ============================================================
   JoinTransformEditor (#210) — inline join editor dentro da
   lista de transforms. Estilizado pra parecer subseção visualmente
   distinta sem precisar de modal/popover.
*/
.join-editor {
  background: var(--row);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--mark);
  padding: 12px 14px;
  margin-top: 4px;
  display: flex; flex-direction: column; gap: 12px;
}
.join-editor__title {
  display: flex; align-items: center; gap: 10px;
  font-size: var(--t-sm);
  border-bottom: 1px solid var(--rule);
  padding-bottom: 8px;
}
.join-editor__title .muted { font-size: var(--t-xs); }
.join-section {
  display: flex; flex-direction: column; gap: 8px;
  padding: 8px 0;
  border-top: 1px solid var(--rule);
}
.join-section:first-of-type { border-top: 0; padding-top: 0; }
.join-section__label {
  font-family: var(--mono);
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
}
.join-row {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 10px;
  align-items: center;
}
.join-row label {
  font-family: var(--mono);
  font-size: var(--t-xs);
  color: var(--ink);
}
.join-row .input, .join-row .select { width: 100%; }
.join-row .muted.small { color: var(--muted); font-size: var(--t-xs); }
.join-grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
.join-grid-2 .join-row {
  grid-template-columns: 100px 1fr;
}
.join-actions { display: flex; gap: 6px; align-items: center; margin-top: 4px; }
.join-actions .muted.small { color: var(--muted); font-size: var(--t-xs); }
.join-warn {
  background: rgba(255, 200, 87, 0.08);
  border-left: 2px solid var(--wait);
  padding: 6px 10px;
  font-size: var(--t-xs);
  color: var(--wait);
}
.join-warn code {
  background: transparent;
  color: var(--wait);
  padding: 0;
}
/* Dry-validate report inline (C2 #210) */
.join-report {
  background: var(--row-2);
  border: 1px solid var(--rule);
  padding: 10px 12px;
  font-size: var(--t-xs);
  display: flex; flex-direction: column; gap: 6px;
  margin-top: 6px;
}
.join-report__row {
  display: grid;
  grid-template-columns: 130px 1fr 130px 1fr;
  gap: 8px;
  align-items: center;
}
.join-report__k {
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  font-size: 10px;
}
.join-report .ok { color: var(--go); font-weight: 500; }
.join-report .warn { color: var(--wait); }
.join-report .stop { color: var(--stop); font-weight: 500; }
.join-report__warn {
  color: var(--wait);
  border-left: 2px solid var(--wait);
  padding-left: 8px;
  font-size: var(--t-xs);
  margin-top: 4px;
}

/* Editor right-panel tabs */
.preview-tabs {
  display: flex; gap: 0;
  padding: 0 !important;
  border-bottom: 1px solid var(--rule);
  background: var(--row);
  position: sticky; top: 0; z-index: 2;
}
.preview-tabs .tab {
  background: transparent; border: 0; cursor: pointer;
  padding: 10px 16px;
  font-family: var(--mono); font-size: var(--t-xs);
  text-transform: uppercase; letter-spacing: 0.08em;
  color: var(--muted);
  border-bottom: 2px solid transparent;
}
.preview-tabs .tab:hover { color: var(--ink); }
.preview-tabs .tab.active {
  color: var(--ink);
  border-bottom-color: var(--mark);
}

/* Config avançada do job — abas (antes 6 accordions). Alinhadas às preview-tabs. */
.adv-tabs {
  display: flex; flex-wrap: wrap; gap: 0;
  border-bottom: 1px solid var(--rule-2);
  margin: 10px 0 6px;
}
.adv-tab {
  background: transparent; border: 0; cursor: pointer;
  padding: 7px 12px;
  font-family: var(--mono); font-size: var(--t-xs);
  text-transform: uppercase; letter-spacing: .06em;
  color: var(--muted); border-bottom: 2px solid transparent;
  display: inline-flex; align-items: center; gap: 5px;
}
.adv-tab:hover { color: var(--ink); }
.adv-tab.active { color: var(--ink); border-bottom-color: var(--mark); }
/* dot verde "tem config" — standalone (abas E headers de seção); ligeiramente maior pra enxergar */
.adv-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: var(--go); flex: 0 0 auto; }
/* box isolado da config avançada — separa das outras seções do form */
.adv-box {
  border: 1px solid var(--rule-2);
  background: var(--row);
  padding: 2px 12px 12px;
  margin: 14px 0;
}
.adv-box .adv-tabs { margin-top: 2px; }

/* header colapsável de source/transforms/destination (chevron + label + dot verde se setado) */
.section-collapse {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: transparent; border: 0; cursor: pointer; text-align: left;
  padding: 0 0 4px; margin: 0 0 6px; border-bottom: 1px solid var(--rule);
}
.section-collapse .chev { color: var(--muted); font-size: var(--t-xs); }
.section-collapse .section-label { margin: 0; padding: 0; border: 0; }
.section-collapse:hover .section-label,
.section-collapse:hover .chev { color: var(--ink); }
.section-collapse .adv-dot { margin-left: 2px; }

/* header com ação concentrada à direita (ex.: TRANSFORMS · habilitar/desabilitar todos) — o collapse cresce e mantém a área de clique */
.section-head { display: flex; align-items: flex-end; margin: 0 0 6px; border-bottom: 1px solid var(--rule); }
.section-head .section-collapse { flex: 1 1 auto; margin: 0; border-bottom: 0; }
.section-head-action {
  flex: 0 0 auto; background: transparent; border: 0; cursor: pointer;
  font-family: var(--mono); font-size: var(--t-xs); color: var(--muted);
  padding: 0 0 4px 8px; white-space: nowrap;
}
.section-head-action:hover { color: var(--ink); }

/* toolbar do form — botão único de expandir/colapsar todas as seções (persiste) */
.form-toolbar { display: flex; justify-content: flex-end; margin-bottom: 8px; }
.form-toolbar .btn { font-family: var(--mono); font-size: var(--t-xs); letter-spacing: .04em; }

/* Output preview — dense table for source results */
.output-pane { padding: 0; }
.output-toolbar {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 12px;
  border-bottom: 1px solid var(--rule);
  background: var(--row-2);
}
.output-toolbar .meta { color: var(--ink); font-size: var(--t-xs); }
.output-toolbar label { display: flex; align-items: center; gap: 6px; }
.output-toolbar .limit-select { min-width: 92px; width: 92px; }
.output-toolbar .tb-sep { width: 1px; height: 14px; background: var(--rule-2); display: inline-block; flex: 0 0 auto; }

.otable-wrap { overflow-x: auto; max-height: calc(100vh - 220px); }
.otable {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--mono);
  font-size: var(--t-xs);
}
.otable thead th {
  position: sticky; top: 0; z-index: 1;
  text-align: left;
  font-family: var(--sans);
  font-weight: 500;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--muted);
  padding: 6px 10px;
  background: var(--row);
  border-bottom: 1px solid var(--rule);
  white-space: nowrap;
}
.otable thead th + th { border-left: 1px solid var(--rule); }
.otable tbody td {
  padding: 4px 10px;
  border-top: 1px solid var(--rule);
  color: var(--ink);
  white-space: nowrap;
  max-width: 280px;
  overflow: hidden;
  text-overflow: ellipsis;
}
.otable tbody td + td { border-left: 1px solid var(--rule); }
.otable tbody tr:hover { background: var(--row); }
/* UX (frente 2): coluna ordenável, número à direita, null sutil — sem restyling */
.otable th.th-sort { cursor: pointer; user-select: none; }
.otable th.th-sort:hover { color: var(--ink); }
.otable th.sorted { color: var(--ink); }
.otable th .sort-ind { margin-left: 4px; color: var(--mark); font-size: 9px; }
.otable th.num, .otable td.num { text-align: right; font-variant-numeric: tabular-nums; }
.otable td.cell-null { color: var(--muted); }

/* gutter de número de linha — sticky à esquerda, visualmente separado do dado (tipo editor de código) */
.otable-scroll { position: relative; }
.otable-numbered .rownum,
.otable-numbered .rownum-h {
  position: sticky; left: 0;
  width: 1%; white-space: nowrap; text-align: right;
  color: var(--muted); background: var(--row-2);   /* banda distinta do dado — não confunde com número real */
  border-right: 1px solid var(--rule);
  user-select: none; font-variant-numeric: tabular-nums; font-size: 10px;
}
.otable-numbered .rownum { z-index: 2; padding: 4px 8px; }
.otable-numbered .rownum-h { z-index: 3; top: 0; background: var(--row-2); }
.otable-numbered tbody tr { cursor: pointer; }
/* badge do número — container que fica evidente quando a linha está ativa/selecionada */
.otable-numbered .rownum-badge {
  display: inline-block; min-width: 1.5em; padding: 1px 5px; text-align: right;
  border: 1px solid transparent; transition: background .1s, border-color .1s;
}
/* hover (transiente) E selecionada (clique · persiste no scroll) compartilham o mesmo destaque forte */
/* hover (transiente) — realce sutil, sem barra */
.otable-numbered tbody tr:hover td { background: var(--row-2); }
.otable-numbered tbody tr:hover .rownum-badge { color: var(--mark); border-color: var(--mark); background: color-mix(in srgb, var(--mark) 10%, transparent); }
/* selecionada (clique · pina · PERSISTE no scroll) — realce forte + barra de acento sólida (distinta do hover) */
.otable-numbered tbody tr.selected td { background: var(--elev); }
.otable-numbered tbody tr.selected .rownum { box-shadow: inset 3px 0 0 var(--mark); }
.otable-numbered tbody tr.selected .rownum-badge { color: var(--mark); border-color: var(--mark); background: color-mix(in srgb, var(--mark) 22%, transparent); }

/* borda de scroll — estreita, ~50% da altura, centrada · fade suave (scroll-shadow) + chevron thin-line */
.scroll-edge {
  position: absolute; top: 25%; height: 50%; width: 26px;
  display: flex; align-items: center; justify-content: center;
  border: 0; cursor: pointer; padding: 0; color: var(--ink-2);
  opacity: 0; transition: opacity .15s, color .1s; z-index: 4;
}
/* left/right são reposicionados por JS (watch): esq na borda do gutter · dir fora do scrollbar. Aqui só fallback. */
.scroll-edge--left  { left: 36px; background: linear-gradient(to right, var(--elev), transparent); }
.scroll-edge--right { right: 4px; background: linear-gradient(to left,  var(--elev), transparent); }
/* chevron thin-line (dois traços 1.4px · consistente com o caret do fx-select) */
.scroll-edge::after {
  content: ""; width: 6px; height: 6px;
  border-right: 1.4px solid currentColor; border-bottom: 1.4px solid currentColor;
}
.scroll-edge--left::after  { transform: rotate(135deg); margin-left: 3px; }
.scroll-edge--right::after { transform: rotate(-45deg); margin-right: 3px; }
/* aparece só quando há scroll disponível NAQUELA direção (.avail via JS) + hover do container */
.otable-scroll:hover .scroll-edge.avail { opacity: 1; }
.scroll-edge:hover { color: var(--mark); }
.scroll-edge--left:hover  { background: linear-gradient(to right, color-mix(in srgb, var(--mark) 22%, var(--elev)), transparent); }
.scroll-edge--right:hover { background: linear-gradient(to left,  color-mix(in srgb, var(--mark) 22%, var(--elev)), transparent); }

/* Libraries page */
.libraries-grid {
  display: grid;
  grid-template-columns: 280px minmax(0, 1fr);   /* minmax(0,...): impede o Monaco de empurrar a coluna além da viewport (botões saíam da tela) */
  min-height: calc(100vh - 110px);
}
.libraries-list {
  border-right: 1px solid var(--rule);
  background: var(--row);
  display: flex; flex-direction: column;
}
.libraries-list .list-head {
  padding: 10px 14px 8px;
  font-family: var(--mono);
  font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  border-bottom: 1px solid var(--rule);
}
.lib-row {
  background: transparent;
  border: 0;
  border-left: 2px solid transparent;
  border-bottom: 1px solid var(--rule);
  padding: 10px 14px;
  text-align: left;
  cursor: pointer;
  font-family: var(--sans);
  color: var(--ink);
}
.lib-row:hover { background: var(--row-2); }
.lib-row.active { border-left-color: var(--mark); background: var(--row-2); }
.lib-row .lib-name { font-size: var(--t-sm); }
.lib-row .lib-meta { font-size: var(--t-xs); color: var(--muted); margin-top: 4px; }
.lib-row .lib-meta .ok { color: var(--go); }
.lib-row .lib-meta .warn { color: var(--wait); }

.library-editor {
  display: flex; flex-direction: column;
  padding: 0;
  min-width: 0;   /* deixa o editor encolher dentro do grid em vez de estourar */
}
.library-editor .editor-head {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--rule);
  background: var(--row);
  flex-wrap: wrap;   /* head (nome + botões) quebra em vez de empurrar botões pra fora */
}
.library-editor .editor-head .input { width: 280px; }
.code-editor-wrap { flex: 1; min-width: 0; min-height: 420px; }
.code-editor-wrap .code-field { height: 100%; min-height: 420px; }

.compile-output {
  border-top: 1px solid var(--rule);
  background: var(--row);
}
.compile-output > header {
  display: flex; align-items: center; gap: 12px;
  padding: 8px 16px;
  font-family: var(--mono); font-size: var(--t-sm);
  border-bottom: 1px solid var(--rule);
}
.compile-output > header.ok { color: var(--go); border-left: 2px solid var(--go); }
.compile-output > header.fail { color: var(--stop); border-left: 2px solid var(--stop); }
.compile-output > header .muted { color: var(--muted); margin-left: auto; }

.diag-list { list-style: none; margin: 0; padding: 0; max-height: 240px; overflow-y: auto; }
.diag-row {
  display: grid;
  grid-template-columns: 60px 60px 1fr;
  gap: 12px;
  padding: 4px 16px;
  font-family: var(--mono);
  font-size: var(--t-xs);
  border-bottom: 1px solid var(--rule);
}
.diag-row .diag-sev { text-transform: uppercase; }
.diag-row .diag-pos { color: var(--muted); }
.diag-row .diag-msg { color: var(--ink); }
.diag-row.diag-error   .diag-sev { color: var(--stop); }
.diag-row.diag-warning .diag-sev { color: var(--wait); }
.diag-row.diag-info    .diag-sev { color: var(--info); }

/* Prompts page — reuses libraries-grid + lib-row, adds prompt-specific bits */
.prompt-editor {
  display: flex; flex-direction: column;
  padding: 16px 20px;
  gap: 10px;
}
.prompt-label {
  font-family: var(--mono);
  font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.prompt-monaco { height: 180px; border: 1px solid var(--rule-2); }
.prompt-monaco .code-field { height: 100%; }
.prompt-hint {
  font-size: var(--t-xs);
  color: var(--muted);
  padding: 8px 0 0;
  border-top: 1px dashed var(--rule);
  margin-top: 8px;
}
.prompt-hint code { font-size: 11px; }

/* LLM test panel — inline conversation under the transform step */
.llm-panel {
  border: 1px solid var(--rule);
  background: var(--row);
  margin-top: 12px;
  font-family: var(--mono);
  font-size: var(--t-sm);
}
.llm-head {
  display: flex; align-items: center; gap: 10px;
  padding: 6px 12px;
  border-bottom: 1px solid var(--rule);
  background: var(--row-2);
  font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.llm-head .lbl { color: var(--ink-2); }
.llm-head .meta { color: var(--ink); text-transform: none; letter-spacing: 0; }
.llm-head .sep { color: var(--dim); }
.llm-sample { border-bottom: 1px solid var(--rule); }
.llm-sample > header {
  padding: 6px 12px;
  font-family: var(--mono); font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.08em;
  background: var(--row-2);
  border-bottom: 1px solid var(--rule);
}
.llm-sample pre {
  margin: 0; padding: 8px 12px;
  font-size: var(--t-xs); color: var(--ink-2);
  background: var(--row); border-left: 0;
  max-height: 120px; overflow: auto;
  white-space: pre-wrap;
}
/* #89 — attachments pane in the LLM test panel */
.llm-attachments { border-bottom: 1px solid var(--rule); }
.llm-attachments > header {
  display: flex; align-items: baseline; gap: 8px;
  padding: 6px 12px;
  font-family: var(--mono); font-size: var(--t-xs);
  color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.08em;
  background: var(--row-2);
  border-bottom: 1px solid var(--rule);
}
.llm-attachments > header .lbl { color: var(--ink-2); }
.llm-attachments > header .meta { text-transform: none; letter-spacing: 0; color: var(--ink); }
.llm-attachments .chips {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 8px 12px;
}
.llm-attachments .chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 4px 3px 6px;
  border: 1px solid var(--rule);
  background: var(--row);
  font-family: var(--mono); font-size: var(--t-xs);
  line-height: 1.4;
}
.llm-attachments .chip.warn { border-color: var(--warn); background: color-mix(in srgb, var(--warn) 8%, var(--row)); }
.llm-attachments .chip-fmt { color: var(--info); text-transform: uppercase; letter-spacing: 0.04em; padding-right: 4px; border-right: 1px solid var(--rule); }
.llm-attachments .chip-name { color: var(--ink); max-width: 240px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.llm-attachments .chip-size { color: var(--muted); }
.llm-attachments .chip-trunc { color: var(--warn); text-transform: uppercase; letter-spacing: 0.06em; font-size: calc(var(--t-xs) - 1px); }
.llm-attachments .chip-x {
  border: 0; background: transparent; cursor: pointer;
  color: var(--muted); font-size: 14px; line-height: 1; padding: 0 4px;
}
.llm-attachments .chip-x:hover { color: var(--stop); }
.llm-head .btn label.btn { display: inline-flex; align-items: center; gap: 4px; cursor: pointer; }
.llm-history { max-height: 480px; overflow-y: auto; padding: 8px 0; }
.llm-attempt {
  border-left: 2px solid var(--info);
  margin: 6px 12px;
  background: var(--canvas);
}
.llm-attempt.ok   { border-left-color: var(--go); }
.llm-attempt.fail { border-left-color: var(--stop); }
.llm-attempt > header {
  display: flex; gap: 10px; align-items: center;
  padding: 6px 10px;
  font-size: var(--t-xs); color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.08em;
  background: var(--row);
}
.llm-attempt > header .num { color: var(--mark); }
.llm-attempt > header .meta { margin-left: auto; color: var(--ink); text-transform: none; letter-spacing: 0; }
.llm-attempt .bubble { padding: 8px 12px; border-top: 1px dashed var(--rule); }
.llm-attempt .bubble .role {
  display: block; font-family: var(--mono); font-size: 10px;
  color: var(--muted); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 4px;
}
.llm-attempt .bubble pre {
  margin: 0; padding: 0;
  font-size: var(--t-sm); color: var(--ink);
  background: transparent; border-left: 0;
  white-space: pre-wrap; word-break: break-word;
}
.llm-attempt .bubble.user pre { color: var(--ink-2); }
.llm-attempt .btn-restore {
  font-size: 10px;
  padding: 1px 6px;
  height: 18px;
  border-color: var(--rule);
  color: var(--ink-2);
}
.llm-attempt .btn-restore:hover { color: var(--mark); border-color: var(--mark); }
.llm-head .meta.toks { color: var(--info); }
.llm-head .btn.active { color: var(--mark); border-color: var(--mark); }

.llm-attempt.streaming { border-left-color: var(--info); animation: streaming-pulse 1.5s ease-in-out infinite; }
.llm-attempt.streaming > header .lbl { color: var(--info); }
.llm-attempt.streaming .bubble.assistant .role { color: var(--info); }
@keyframes streaming-pulse {
  0%, 100% { background: var(--canvas); }
  50%      { background: var(--row); }
}
.llm-attempt .cursor {
  display: inline-block;
  color: var(--mark);
  animation: cursor-blink 0.9s steps(2) infinite;
  margin-left: 2px;
  font-weight: 600;
}
@keyframes cursor-blink {
  0%, 50%  { opacity: 1; }
  51%, 100% { opacity: 0; }
}

/* Saved-prompt popover (used inside the llm test panel header) */
.popover-host { position: relative; display: inline-block; }
.popover {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 60;
  min-width: 280px;
  max-width: 380px;
  max-height: 320px;
  overflow-y: auto;
  background: var(--canvas);
  border: 1px solid var(--rule);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
  padding: 4px;
}
.popover-title {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  padding: 6px 8px 4px;
  border-bottom: 1px solid var(--rule-2);
  margin-bottom: 2px;
}
.popover-row {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  width: 100%;
  text-align: left;
  background: transparent;
  border: 0;
  padding: 6px 8px;
  cursor: pointer;
  color: var(--ink);
  gap: 2px;
}
.popover-row:hover { background: var(--row); }
.popover-name { font-size: 12px; color: var(--mark); }
.popover-sub { font-size: 11px; color: var(--ink-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.popover-empty {
  padding: 12px;
  color: var(--ink-2);
  font-size: 11px;
  line-height: 1.5;
}

.save-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: var(--row);
  border-bottom: 1px solid var(--rule-2);
}
.save-bar .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.save-bar .input { flex: 0 0 auto; min-width: 220px; height: 26px; padding: 0 8px; }
.save-bar .meta { color: var(--ink-2); font-size: 11px; }

.webhook-box {
  margin-top: 6px;
  padding: 10px 12px;
  background: var(--row);
  border-left: 2px solid var(--info);
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.webhook-box .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.webhook-url {
  font-size: 12px;
  color: var(--mark);
  word-break: break-all;
  padding: 4px 8px;
  background: var(--canvas);
  border: 1px solid var(--rule-2);
}
.webhook-curl {
  font-size: 11px;
  color: var(--ink-2);
  background: var(--canvas);
  border: 1px dashed var(--rule-2);
  padding: 6px 8px;
  white-space: pre-wrap;
  word-break: break-all;
}
.webhook-box .hint { color: var(--ink-2); font-size: 10px; }

.notify-box {
  margin-top: 6px;
  padding: 10px 12px;
  background: var(--row);
  border-left: 2px solid var(--mark);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.notify-box .hint { color: var(--ink-2); font-size: 10px; }
.checkbox-cluster { display: flex; gap: 18px; }
.notify-actions { display: flex; align-items: center; gap: 10px; padding-top: 4px; }
.notify-actions .meta.ok { color: var(--ok); }
.notify-actions .meta.stop { color: var(--stop); }

/* /runs page */
.runs-filters {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 0 12px;
  border-bottom: 1px solid var(--rule-2);
  margin-bottom: 12px;
  flex-wrap: wrap;
}
.runs-filters .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.runs-filters .select { min-width: 200px; flex: 0 0 auto; }
.runs-filters .meta { color: var(--ink-2); font-size: 11px; }
.runs-filters .input { flex: 0 0 auto; width: auto; }
.runs-filters input[type="datetime-local"] { width: 200px; }
.runs-filters .runs-search { width: 260px; }
.runs-filters .btn-clear { padding: 2px 8px; }
.filter-chips { display: flex; gap: 4px; }
.chip {
  background: transparent;
  border: 1px solid var(--rule);
  color: var(--ink-2);
  font-family: inherit;
  font-size: 11px;
  padding: 3px 10px;
  cursor: pointer;
  letter-spacing: 0.02em;
}
.chip:hover { color: var(--ink); border-color: var(--rule-2); }
.chip.active { color: var(--mark); border-color: var(--mark); background: var(--row); }
.chip.ok.active { color: var(--ok); border-color: var(--ok); }
.chip.fail.active { color: var(--stop); border-color: var(--stop); }
.chip.slow.active { color: var(--warn, #d8a32e); border-color: var(--warn, #d8a32e); border-style: dashed; }

.runs-table { width: 100%; border-collapse: collapse; }
.runs-table th {
  text-align: left;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  font-weight: 500;
  padding: 6px 10px;
  border-bottom: 1px solid var(--rule);
}
.runs-table th.num, .runs-table td.num { text-align: right; }
.runs-table td {
  padding: 7px 10px;
  font-size: 12px;
  border-bottom: 1px solid var(--rule-2);
}
.runs-table tr:hover td { background: var(--row); }
.runs-table tr.row-detail:hover td { background: transparent; }
.badge {
  display: inline-block;
  font-family: inherit;
  font-size: 10px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 2px 7px;
  border: 1px solid currentColor;
}
.badge.ok { color: var(--ok); }
.badge.fail { color: var(--stop); }
.badge.slow {
  color: var(--warn, #d8a32e);
  margin-left: 4px;
  border-style: dashed;
}
.badge.dlq {
  color: var(--quarantine);
  margin-left: 4px;
  border-style: dashed;
}
.runs-table tr.row-slow td { background: var(--row-slow-bg); }
.runs-table tr.row-dlq td { background: var(--row-dlq-bg); }
.detail-meta .dlq-jump {
  color: var(--quarantine);
  text-decoration: none;
  border-bottom: 1px dotted var(--quarantine);
}
.detail-meta .dlq-jump:hover { color: var(--ink); border-bottom-color: var(--ink); }

/* ============================================================
   Job preview diagram tab (#112)
   Shows the active flow with connector types filled in,
   active feature flags, and audit notes (warnings/info).
   ============================================================ */
.job-diagram {
  padding: 16px 18px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.diagram-shape {
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--mark);
}
.diagram-ascii {
  margin: 0;
  padding: 14px 16px;
  background: var(--canvas);
  border: 1px solid var(--rule);
  font-family: var(--mono);
  font-size: 16px;
  line-height: 1.4;
  color: var(--ink);
  letter-spacing: 0;
  white-space: pre;
  overflow-x: auto;
}
.diagram-flags {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.diagram-flag {
  display: inline-block;
  padding: 2px 8px;
  font-size: 10px;
  letter-spacing: 0.06em;
  color: var(--ink-2);
  border: 1px dashed var(--rule-2);
}
.diagram-notes {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.diagram-note {
  display: flex;
  gap: 8px;
  align-items: flex-start;
  padding: 6px 10px;
  font-size: 12px;
  line-height: 1.4;
  border-left: 2px solid var(--rule-2);
}
.diagram-note.warn { border-left-color: var(--stop); color: var(--ink); background: var(--row-fail-bg); }
.diagram-note.info { border-left-color: var(--info); color: var(--ink-2); }
.diagram-note .note-glyph { font-size: 13px; color: inherit; min-width: 14px; }
.diagram-note.warn .note-glyph { color: var(--stop); }
.diagram-clean {
  padding: 6px 10px;
  font-size: 11px;
  color: var(--go);
  border-left: 2px solid var(--go);
  background: var(--row-pass-bg);
}

/* JSON preview gets light syntax coloring. The pre block keeps the existing
   .editor-preview styling; we layer the spans on top via inline classes. */
.job-json {
  padding: 12px 14px;
  margin: 0;
  font-family: var(--mono);
  font-size: 12px;
  line-height: 1.5;
  color: var(--ink);
  background: var(--canvas);
  overflow: auto;
  white-space: pre-wrap;
  word-break: break-word;
}
.job-json .json-key  { color: var(--ink-2); }
.job-json .json-str  { color: var(--go); }
.job-json .json-num  { color: var(--info); }
.job-json .json-null { color: var(--dim); }

/* ============================================================
   Job flow picker (#111)
   Four cards at the top of /jobs/{id}/edit. Each one is a
   monospace ASCII diagram of the flow shape — the picker reads
   as the product describing itself in its own grammar, not a
   ui-kit "card with title + icon + blurb" template.
   ============================================================ */
.flow-picker {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
  margin: 12px 0 16px;
}
@media (max-width: 900px) {
  .flow-picker { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
.flow-card {
  appearance: none;
  background: var(--row);
  border: 1px solid var(--rule);
  padding: 10px 12px 12px;
  text-align: left;
  font: inherit;
  color: var(--ink);
  cursor: pointer;
  display: flex;
  flex-direction: column;
  gap: 6px;
  transition: border-color 80ms linear, background 80ms linear;
}
.flow-card:hover { border-color: var(--rule-2); background: var(--row-2); }
.flow-card:focus-visible { outline: 2px solid var(--mark); outline-offset: 1px; }
.flow-card.active {
  border-color: var(--mark);
  border-width: 1px;
  box-shadow: inset 2px 0 0 var(--mark);
  background: var(--row-2);
}
.flow-card-title {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.flow-card.active .flow-card-title { color: var(--mark); }
.flow-shape {
  margin: 0;
  padding: 6px 0;
  font-family: var(--mono);
  font-size: 13px;
  line-height: 1.4;
  color: var(--ink);
  white-space: pre;
  letter-spacing: 0;
}
.flow-card-blurb {
  font-size: 11px;
  color: var(--muted);
  line-height: 1.4;
}

/* Collapsible advanced group at the bottom of the form. */
.advanced-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 16px 0 0;
  padding: 8px 10px;
  background: transparent;
  border: 1px dashed var(--rule);
  color: var(--ink-2);
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  cursor: pointer;
  width: 100%;
  text-align: left;
}
.advanced-toggle:hover { color: var(--ink); border-color: var(--rule-2); }
.advanced-toggle[aria-expanded="true"] { color: var(--ink); border-color: var(--rule-2); }
.advanced-toggle .chev { color: var(--mark); }
.advanced-toggle .adv-name { /* inherits uppercase from parent */ }
.advanced-toggle .adv-hint {
  font-family: var(--mono);
  color: var(--dim);
  text-transform: none;
  letter-spacing: 0.02em;
  margin-left: 4px;
  font-size: 11px;
  font-weight: normal;
}

/* ============================================================
   /dlq — quarantine ward
   Forensic exhibit: error, row snapshot (with violating key
   highlighted in coral), provenance back to the run.
   ============================================================ */
.dlq-table { width: 100%; border-collapse: collapse; }
.dlq-table th {
  text-align: left;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  padding: 8px 10px;
  border-bottom: 1px solid var(--rule);
}
.dlq-table td { padding: 6px 10px; border-bottom: 1px solid var(--rule); vertical-align: middle; }
.dlq-table tr.row-dlq td { background: var(--row-dlq-bg); }
.dlq-table tr.row-dlq:hover td { background: var(--row-dlq-bg-hover); }
.dlq-table .col-error {
  color: var(--ink);
  max-width: 480px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.dlq-source-pill {
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--quarantine);
  border: 1px dashed var(--quarantine);
  padding: 1px 6px;
}

/* Signature element: evidence card. Two-column on wide screens —
   ERROR + FROM RUN stacked left, ROW SNAPSHOT right. */
.evidence-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
  gap: 18px;
  padding: 14px 16px 16px;
  border-left: 2px solid var(--quarantine);
  background: var(--row);
}
@media (max-width: 1024px) {
  .evidence-card { grid-template-columns: minmax(0, 1fr); }
}
.evidence-meta {
  grid-column: 1 / -1;
  display: flex;
  gap: 10px;
  align-items: center;
  font-size: 11px;
  color: var(--ink-2);
  padding-bottom: 8px;
  border-bottom: 1px solid var(--rule);
}
.evidence-meta .dot { color: var(--dim); }
.evidence-section {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.evidence-section .lbl {
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--quarantine);
}
.evidence-error {
  padding: 8px 10px;
  background: var(--canvas);
  border: 1px solid rgba(201, 112, 100, 0.35);
  color: var(--ink);
  font-family: var(--mono);
  font-size: 12px;
  line-height: 1.55;
}
.row-snapshot {
  margin: 0;
  padding: 8px 10px;
  background: var(--canvas);
  border: 1px solid var(--rule);
  font-family: var(--mono);
  font-size: 12px;
  line-height: 1.55;
  color: var(--ink);
  overflow-x: auto;
  white-space: pre-wrap;
  word-break: break-word;
}
/* The signature treatment: when the error names a column, highlight the
   matching key inside the row JSON so the eye lands on the violation. */
.row-snapshot .col-violation {
  background: rgba(201, 112, 100, 0.18);
  color: var(--quarantine);
  padding: 0 2px;
  border-left: 2px solid var(--quarantine);
}
.row-snapshot .json-key { color: var(--ink-2); }
.row-snapshot .json-str { color: var(--go); }
.row-snapshot .json-num { color: var(--info); }
.row-snapshot .json-null { color: var(--dim); }

.evidence-provenance {
  grid-column: 1 / -1;
  display: flex;
  align-items: center;
  gap: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--rule);
  font-family: var(--mono);
  font-size: 12px;
  color: var(--ink-2);
}
.evidence-provenance a {
  color: var(--mark);
  text-decoration: none;
  border-bottom: 1px dotted var(--mark);
}
.evidence-provenance a:hover { color: var(--ink); border-bottom-color: var(--ink); }

.trigger-pill {
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--ink-2);
  padding: 1px 6px;
  border: 1px dashed var(--rule);
}
.trigger-pill.scheduled { color: var(--info); border-color: var(--info); }
.trigger-pill.webhook   { color: var(--mark); border-color: var(--mark); }
.trigger-pill.manual    { color: var(--ink-2); }
.trigger-pill.dryrun    { color: var(--info); border-color: var(--info); border-style: dotted; }
.trigger-pill.replay    { color: var(--mark); border-color: var(--mark); border-style: dashed; }
.jobs-search { width: 280px; height: 28px; padding: 0 10px; }
.prune-days { width: 64px; height: 26px; padding: 0 8px; }

.bulk-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: var(--row);
  border-left: 2px solid var(--mark);
  margin: 6px 0;
  font-size: 11px;
}
.bulk-bar .mono { color: var(--mark); letter-spacing: 0.04em; }
.col-check { width: 28px; padding: 0 6px; }
.col-check input { margin: 0; }
.row-selected td { background: rgba(255, 138, 76, 0.05); }

/* vars usa a .itable canônica (Template A) — só mantém a largura do input inline nas células */
.vars-table .input { width: 100%; height: 24px; padding: 0 8px; }
.row-new td { background: rgba(255, 138, 76, 0.06); }
.dim { color: var(--ink-2); }
.src-pill {
  font-size: 10px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 1px 7px;
  border: 1px solid currentColor;
  display: inline-block;
}
.src-pill.file { color: var(--ok); }
.src-pill.env  { color: var(--info); }
.vars-help {
  margin-top: 16px;
  padding: 12px 14px;
  background: var(--row);
  border-left: 2px solid var(--info);
  font-size: 11px;
  color: var(--ink-2);
}
.vars-help .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 6px;
}
.vars-help ul { margin: 0; padding-left: 16px; line-height: 1.7; }

/* /backup */
.backup-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 12px;
}
.backup-card {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  padding: 18px 22px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.backup-head { display: flex; flex-direction: column; gap: 4px; padding-bottom: 8px; border-bottom: 1px solid var(--rule-2); }
.backup-title { font-size: 16px; color: var(--ink); }
.backup-sub { font-size: 11px; color: var(--ink-2); }
.backup-body { font-size: 12px; color: var(--ink-2); line-height: 1.6; margin: 0; }
.upload-btn { cursor: pointer; align-self: flex-start; }
.pick-info {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  background: var(--row);
  border-left: 2px solid var(--info);
  font-size: 11px;
}
.pick-info .mark { color: var(--mark); }
.banner.go { border-left-color: var(--ok); color: var(--ok); }
.banner.stop { border-left-color: var(--stop); color: var(--stop); }

/* /workflows */
.wf-section { margin-top: 18px; }
.wf-section-head {
  display: flex;
  align-items: baseline;
  gap: 12px;
  padding: 6px 0;
  border-bottom: 1px solid var(--rule-2);
  margin-bottom: 8px;
}
.wf-section-title { font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink); }
.wf-section-sub { font-size: 10px; color: var(--ink-2); }
.wf-tree { padding: 4px 0; margin-bottom: 8px; }
.wf-node {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  background: var(--canvas);
  border-left: 2px solid var(--rule);
  margin-bottom: 2px;
  cursor: pointer;
  font-size: 12px;
}
.wf-node:hover { background: var(--row); border-left-color: var(--mark); }
.wf-node.depth-0 { border-left-color: var(--info); }
.wf-node.depth-1 { margin-left: 24px; border-left-color: var(--ok); }
.wf-node.depth-2 { margin-left: 48px; border-left-color: var(--mark); }
.wf-node.depth-3 { margin-left: 72px; }
.wf-node.depth-4 { margin-left: 96px; }
.wf-node.depth-5 { margin-left: 120px; }
.wf-node.depth-6 { margin-left: 144px; }
.wf-edge-arm { color: var(--ink-2); font-family: var(--mono, monospace); font-size: 11px; }
.wf-node-name { color: var(--ink); }
.wf-node-meta { display: flex; flex-wrap: wrap; gap: 4px; }
.wf-arrow { color: var(--ink-2); }
.wf-pill {
  font-size: 9px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  padding: 1px 6px;
  border: 1px solid var(--rule);
  color: var(--ink-2);
}
.wf-pill.cron    { color: var(--info); border-color: var(--info); }
.wf-pill.webhook { color: var(--mark); border-color: var(--mark); }
.wf-pill.watch   { color: var(--mark); border-color: var(--mark); border-style: dotted; }
.wf-pill.chain   { color: var(--ok); border-color: var(--ok); }
.wf-pill.window  { color: var(--info); border-color: var(--info); border-style: dashed; }
.wf-pill.off     { color: var(--stop); border-color: var(--stop); }
.wf-orphan-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 6px;
}
.wf-orphan {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 8px 12px;
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  cursor: pointer;
  font-size: 12px;
}
.wf-orphan:hover { border-color: var(--mark); background: var(--row); }
.wf-orphan-name { color: var(--ink); }
.wf-orphan-meta { display: flex; flex-wrap: wrap; gap: 4px; }

.wf-view-toggle {
  display: inline-flex;
  border: 1px solid var(--rule-2);
  margin-right: 6px;
}
.wf-view-toggle .btn {
  border: none;
  border-right: 1px solid var(--rule-2);
  border-radius: 0;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 4px 12px;
  color: var(--ink-2);
}
.wf-view-toggle .btn:last-child { border-right: none; }
.wf-view-toggle .btn.active { background: var(--mark); color: var(--canvas); }
.wf-view-toggle .btn:hover:not(.active) { color: var(--ink); background: var(--row); }
.wf-mermaid-host {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  padding: 14px;
  min-height: 240px;
  overflow: auto;
}
.wf-mermaid-host svg { max-width: 100%; height: auto; cursor: default; }
.wf-mermaid-host .node { cursor: pointer; }
.wf-mermaid-host .node:hover rect, .wf-mermaid-host .node:hover polygon {
  stroke-width: 3.5px;
  filter: brightness(1.15);
}

.wf-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  align-items: center;
  padding: 8px 12px;
  margin-bottom: 10px;
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  border-left: 3px solid var(--info);
  font-size: 11px;
}
.wf-legend strong {
  color: var(--ink);
  margin-right: 4px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 10px;
}
.wf-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: var(--ink-2);
}
.wf-glyph {
  display: inline-block;
  width: 16px;
  text-align: center;
  color: var(--ink);
  font-weight: 600;
}
.wf-swatch {
  display: inline-block;
  width: 14px;
  height: 14px;
  border: 2px solid var(--rule);
  background: #1A2542;
  vertical-align: middle;
}
.wf-sw-cron     { border-color: #FFC857; }
.wf-sw-webhook  { border-color: #7DD3FC; }
.wf-sw-folder   { border-color: #A78BFA; }
.wf-sw-manual   { border-color: #19D5A6; }
.wf-sw-disabled { border-color: #4A5878; border-style: dashed; background: #0E1525; }

/* Editor section help (per-section disclosure expanded) */
.section-help {
  background: var(--row);
  border-left: 3px solid var(--info);
  padding: 10px 14px;
  margin: 6px 0 12px;
  font-size: 12px;
  line-height: 1.55;
  color: var(--ink-2);
}
.section-help strong {
  color: var(--ink);
  font-weight: 600;
}
.section-help code {
  background: var(--canvas);
  padding: 1px 5px;
  font-size: 11px;
  border: 1px solid var(--rule);
}
.section-help a {
  color: var(--info);
  text-decoration: underline;
}
.section-help-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  margin-left: auto;
  border: 1px solid var(--rule);
  border-radius: 50%;
  color: var(--ink-2);
  text-decoration: none;
  font-size: 11px;
  font-weight: 600;
  font-family: var(--mono);
  flex-shrink: 0;
}
.section-help-link:hover {
  background: var(--info);
  color: white;
  border-color: var(--info);
}

.type-row { display: flex; gap: 8px; align-items: center; }
.type-row .select { flex: 1; }
.type-row .btn { flex: 0 0 auto; }
.test-banner {
  margin-top: 6px;
  padding: 4px 8px;
  font-size: 11px;
  border-left: 2px solid var(--rule);
  background: var(--row);
}
.test-banner.ok   { color: var(--ok);   border-left-color: var(--ok); }
.test-banner.fail { color: var(--stop); border-left-color: var(--stop); }

/* /templates */
.templates-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  gap: 12px;
  margin-top: 12px;
}
.tpl-card {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  padding: 14px 16px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.tpl-card:hover { border-color: var(--mark); }
.tpl-head {
  display: flex;
  align-items: baseline;
  gap: 10px;
  border-bottom: 1px solid var(--rule-2);
  padding-bottom: 8px;
}
.tpl-name { font-size: 14px; color: var(--ink); }
.tpl-cat {
  font-size: 10px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-2);
  margin-left: auto;
}
.tpl-desc {
  font-size: 12px;
  color: var(--ink-2);
  line-height: 1.5;
  margin: 0;
  min-height: 36px;
}
.tpl-tags { display: flex; flex-wrap: wrap; gap: 4px; }
.tpl-pill {
  font-size: 10px;
  letter-spacing: 0.04em;
  padding: 1px 7px;
  border: 1px solid var(--rule);
  color: var(--ink-2);
}
.tpl-pill.src   { color: var(--info); border-color: var(--info); }
.tpl-pill.dst   { color: var(--mark); border-color: var(--mark); }
.tpl-pill.tf    { color: var(--ok); border-color: var(--ok); }
.tpl-pill.cron  { color: var(--info); border-color: var(--info); border-style: dashed; }
.tpl-pill.watch { color: var(--mark); border-color: var(--mark); border-style: dotted; }
.tpl-actions { display: flex; justify-content: flex-end; }

/* Cron preset chips */
.cron-presets {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-bottom: 6px;
}
.cron-chip {
  background: transparent;
  border: 1px solid var(--rule);
  color: var(--ink-2);
  font-family: inherit;
  font-size: 11px;
  padding: 2px 9px;
  cursor: pointer;
  letter-spacing: 0.02em;
}
.cron-chip:hover { color: var(--mark); border-color: var(--mark); }
.cron-chip.active { color: var(--mark); border-color: var(--mark); background: var(--row); }
.cron-chip.clear { color: var(--ink-2); border-style: dashed; margin-left: auto; }

.timeout-hint {
  margin-top: 4px;
  font-size: 11px;
  color: var(--ink-2);
  padding: 4px 8px;
  border: 1px dashed var(--rule-2);
  background: var(--canvas);
}
.timeout-hint .mark { color: var(--mark); }

.description-area {
  font-family: inherit;
  resize: vertical;
  min-height: 60px;
  line-height: 1.5;
}
.move-btn {
  background: transparent;
  border: 1px solid var(--rule);
  color: var(--ink-2);
  font-family: inherit;
  font-size: 11px;
  padding: 0 6px;
  height: 22px;
  cursor: pointer;
  line-height: 1;
}
.move-btn:hover:not(:disabled) { color: var(--mark); border-color: var(--mark); }
.move-btn:disabled { opacity: 0.3; cursor: not-allowed; }
.scheduler-resume { color: var(--mark); border-color: var(--mark); }

/* /health */
.health-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 12px;
}
.health-grid .span-2 { grid-column: 1 / -1; }
.health-card {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  padding: 12px 16px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.health-head { display: flex; align-items: baseline; gap: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--rule-2); }
.health-title { font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink); }
.health-sub { font-size: 11px; color: var(--ink-2); margin-left: auto; }
.health-sub .mark { color: var(--mark); }
.status-badge {
  margin-left: auto;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 2px 8px;
  border: 1px solid currentColor;
}
.status-badge.ok   { color: var(--ok); }
.status-badge.warn { color: var(--mark); }

/* /audit */
/* audit usa a .itable canônica (Template A). audit-action = texto colorido (signal), NÃO chip boxado. */
.audit-action {
  font-family: var(--mono);
  font-size: var(--t-xs);
  letter-spacing: 0.04em;
  color: var(--ink-2);
}
.audit-action.save     { color: var(--ok); border-color: var(--ok); }
.audit-action.update   { color: var(--ok); border-color: var(--ok); border-style: dashed; }
.audit-action.delete   { color: var(--stop); border-color: var(--stop); }
.audit-action.clone    { color: var(--info); border-color: var(--info); }
.audit-action.pause    { color: var(--mark); border-color: var(--mark); }
.audit-action.resume   { color: var(--mark); border-color: var(--mark); border-style: dashed; }
.audit-type { font-family: var(--mono, monospace); font-size: 10px; color: var(--ink); }

/* /jobs/{id}/history */
.history-table { width: 100%; border-collapse: collapse; margin-top: 8px; }
.history-table th {
  text-align: left;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  font-weight: 500;
  padding: 6px 10px;
  border-bottom: 1px solid var(--rule);
}
.history-table th.right, .history-table td.right { text-align: right; }
.history-table td { padding: 5px 10px; font-size: 11px; border-bottom: 1px solid var(--rule-2); vertical-align: middle; }
.history-table tr:hover td { background: var(--row); }
.hist-action {
  display: inline-block;
  font-size: 10px;
  letter-spacing: 0.04em;
  padding: 1px 7px;
  border: 1px solid var(--rule);
  color: var(--ink-2);
}
.hist-action.created  { color: var(--ok); border-color: var(--ok); }
.hist-action.updated  { color: var(--ok); border-color: var(--ok); border-style: dashed; }
.hist-action.cloned   { color: var(--info); border-color: var(--info); }
.hist-action.restored { color: var(--mark); border-color: var(--mark); }
.hist-action.deleted  { color: var(--stop); border-color: var(--stop); }
.btn-restore { color: var(--mark); border-color: var(--mark); }
.btn-restore:hover { background: var(--mark); color: var(--bg); }
.hist-detail-row td { padding: 0 !important; background: var(--row); }
.hist-detail {
  padding: 12px;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.hist-detail header {
  display: flex; align-items: center; gap: 8px;
  margin-bottom: 8px;
  font-size: 10px;
  letter-spacing: 0.04em;
}
.hist-detail pre {
  background: var(--bg-1);
  padding: 10px;
  font-size: 11px;
  max-height: 480px;
  overflow: auto;
  border: 1px solid var(--rule-2);
  margin: 0;
}
.hist-tabs { display: inline-flex; gap: 4px; margin-left: 12px; }
.hist-tabs .tab {
  background: transparent;
  border: 1px solid var(--rule);
  color: var(--ink-2);
  font-family: var(--mono, monospace);
  font-size: 10px;
  letter-spacing: 0.04em;
  padding: 2px 9px;
  cursor: pointer;
}
.hist-tabs .tab:hover { color: var(--ink); }
.hist-tabs .tab.active { color: var(--ink); border-color: var(--ink); background: var(--bg-1); }
.hist-tabs .tab:disabled { opacity: 0.4; cursor: not-allowed; }
.hist-diff { white-space: pre; }
.hist-diff .diff-line { display: block; padding: 0 4px; }
.hist-diff .diff-add { color: var(--ok); background: rgba(80,200,120,0.08); }
.hist-diff .diff-rem { color: var(--stop); background: rgba(220,90,90,0.10); }
.hist-diff .diff-ctx { color: var(--ink-2); }

/* /caches */
.cache-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
  margin-top: 14px;
}
@media (max-width: 1100px) { .cache-grid { grid-template-columns: 1fr; } }
.cache-card {
  border: 1px solid var(--rule);
  background: var(--bg-1);
  padding: 14px 16px;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.cache-card > header {
  display: flex; align-items: baseline; gap: 8px;
  border-bottom: 1px solid var(--rule-2);
  padding-bottom: 8px;
  margin-bottom: 2px;
}
.cache-title {
  font-family: var(--mono, monospace);
  font-size: 12px;
  letter-spacing: 0.04em;
  color: var(--ink);
}
.cache-key { font-size: 9px; }
.cache-metric {
  display: flex; align-items: baseline; gap: 8px;
  margin: 4px 0 6px;
}
.cache-metric .big { font-size: 32px; line-height: 1; color: var(--ink); }
.cache-metric .lbl { font-size: 10px; color: var(--ink-2); text-transform: uppercase; letter-spacing: 0.08em; }
.cache-row {
  display: flex; justify-content: space-between;
  font-size: 11px;
  padding: 2px 0;
}
.cache-row .lbl { color: var(--ink-2); }
.cache-row .mono { color: var(--ink); }
.cache-bar {
  height: 4px;
  background: var(--bg);
  border: 1px solid var(--rule-2);
  margin: 6px 0 2px;
  overflow: hidden;
}
.cache-bar-fill {
  height: 100%;
  background: var(--ok);
  transition: width 0.25s ease;
}
.cache-hint { font-size: 10px; margin-top: 6px; }
.cache-foot {
  margin-top: 18px;
  padding: 8px 0;
  font-size: 10px;
  border-top: 1px solid var(--rule-2);
}

/* /dashboard */
.dash-hero {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
  margin-top: 14px;
}
@media (max-width: 1100px) { .dash-hero { grid-template-columns: repeat(2, 1fr); } }
.dash-card {
  border: 1px solid var(--rule);
  background: var(--bg-1);
  padding: 14px 16px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.dash-card.big .lbl {
  font-size: 10px;
  color: var(--ink-2);
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
.dash-card.big .num {
  font-size: 36px;
  line-height: 1;
  color: var(--ink);
  font-family: var(--mono, monospace);
  font-weight: 300;
  margin: 4px 0 6px;
}
.dash-card.big .sub { font-size: 11px; color: var(--ink-2); }
.dash-card.big .sub .fail { color: var(--stop); }
.dash-card.big.live {
  position: relative;
  border-color: var(--ok);
}
.dash-card.big.live::after {
  content: "";
  position: absolute;
  top: 12px;
  right: 14px;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--ok);
  animation: dash-pulse 1.4s ease-in-out infinite;
}
@keyframes dash-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }

.dash-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 14px;
  margin-top: 14px;
}
@media (max-width: 900px) { .dash-grid { grid-template-columns: 1fr; } }
.dash-card > header {
  display: flex; align-items: baseline; gap: 8px;
  border-bottom: 1px solid var(--rule-2);
  padding-bottom: 8px;
  margin-bottom: 4px;
}
.dash-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.dash-list li {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: 6px 0;
  border-bottom: 1px solid var(--rule-2);
  font-size: 11px;
  gap: 12px;
}
.dash-list li:last-child { border-bottom: none; }
.dash-list .row-name { color: var(--ink); text-decoration: none; }
.dash-list .row-name:hover { text-decoration: underline; }
.dash-list .row-name.fail { color: var(--stop); }
.dash-card .empty {
  padding: 16px 0;
  font-size: 11px;
  text-align: center;
}

/* Welcome state — shown on /dashboard when _jobsTotal == 0 (Onda 1 · F-10) */
.dash-welcome {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
  margin: 32px 24px;
  padding: 28px 30px;
  max-width: 640px;
  background: var(--row);
  border: 1px solid var(--rule-2);
  border-left: 3px solid var(--mark);
}
.dash-welcome .welcome-title {
  margin: 0;
  font-family: var(--sans);
  font-weight: 500;
  font-size: 22px;
  color: var(--ink);
  letter-spacing: -0.01em;
}
.dash-welcome .welcome-sub {
  margin: 0;
  font-size: var(--t-md);
  color: var(--ink-2);
  line-height: 1.55;
}
.dash-welcome .welcome-cta {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  margin-top: 6px;
}
.dash-welcome .welcome-foot {
  margin: 8px 0 0;
  font-size: var(--t-sm);
  color: var(--muted);
}
.dash-welcome .welcome-foot a {
  color: var(--mark);
  text-decoration: none;
  border-bottom: 1px dashed var(--mark);
}

/* Inline help on setting rows */
.kv-key {
  display: flex; align-items: center; gap: 4px;
  position: relative;
}
.kv-key .input { flex: 1; }
.setting-help {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
  border: 1px solid var(--rule);
  border-radius: 50%;
  font-size: 9px;
  color: var(--ink-2);
  cursor: help;
  user-select: none;
  flex-shrink: 0;
}
.setting-help:hover { color: var(--ink); border-color: var(--ink); }

/* Toast stack — bottom-right of viewport */
.toast-stack {
  position: fixed;
  bottom: 40px;
  right: 16px;
  z-index: 200;
  display: flex;
  flex-direction: column;
  gap: 6px;
  pointer-events: none;
  max-width: 380px;
}
.toast {
  pointer-events: auto;
  background: var(--canvas);
  border: 1px solid var(--rule);
  border-left-width: 3px;
  padding: 8px 10px;
  font-size: 12px;
  color: var(--ink);
  display: flex;
  align-items: center;
  gap: 10px;
  box-shadow: 0 6px 18px rgba(0,0,0,0.45);
  animation: toast-in 180ms ease-out;
}
@keyframes toast-in {
  from { transform: translateX(20px); opacity: 0; }
  to   { transform: none; opacity: 1; }
}
.toast.info    { border-left-color: var(--info); }
.toast.success { border-left-color: var(--ok); }
.toast.warn    { border-left-color: var(--mark); color: var(--mark); }
.toast.error   { border-left-color: var(--stop); color: var(--stop); }
.toast-text { flex: 1; line-height: 1.4; }
.toast-close {
  background: transparent;
  border: 0;
  color: var(--ink-2);
  cursor: pointer;
  font-size: 14px;
  padding: 0 4px;
  line-height: 1;
}
.toast-close:hover { color: var(--ink); }

/* Per-job environment badge */
.env-badge {
  display: inline-block;
  font-size: 9px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 1px 6px;
  border: 1px solid currentColor;
  margin-left: 6px;
  vertical-align: middle;
}
.env-badge.prod    { color: var(--stop); }
.env-badge.staging { color: var(--mark); }
.env-badge.stg     { color: var(--mark); }
.env-badge.dev     { color: var(--ok); }
.env-badge.test    { color: var(--info); }

/* Queue depth row · aparece numa linha SEPARADA abaixo do nome pra não ser
   cortada pela col-truncate (max-width:240px) que limita o cell name. */
.job-pending-row {
  margin-top: 4px;
  overflow: visible;
}

/* Queue depth badge · aparece quando ConcurrencyMode.Queue tem pending triggers (E + D) */
.queued-badge {
  display: inline-block;
  font-size: 9px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 1px 6px;
  border: 1px solid var(--mark);
  color: var(--mark);
  margin-left: 6px;
  vertical-align: middle;
}

.btn-warn { color: var(--mark) !important; border-color: var(--mark) !important; }
.btn-warn:hover { background: var(--mark); color: var(--canvas) !important; }

.running-pill {
  display: inline-block;
  font-size: 10px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  padding: 1px 8px;
  border: 1px solid var(--info);
  color: var(--info);
  background: var(--row);
  margin-right: 6px;
  animation: running-pulse 1.4s ease-in-out infinite;
}
@keyframes running-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.55; }
}

.pause-banner {
  border-left-color: var(--mark) !important;
  color: var(--mark);
  background: var(--row);
}
.pause-banner .hint { color: var(--ink-2); font-size: 10px; margin-left: 6px; }
.pause-banner .mono { color: var(--ink); }
.job-desc-preview {
  font-size: 10px;
  color: var(--ink-2);
  font-style: italic;
  margin-top: 2px;
  max-width: 320px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tag-chip {
  /* Colored variant: chips set --tag-hue (0..360) inline; uncolored chips fall back to neutral. */
  --tag-hue: 0;
  --tag-sat: 0%;
  display: inline-block;
  background: hsl(var(--tag-hue), var(--tag-sat), 18%);
  border: 1px solid hsl(var(--tag-hue), var(--tag-sat), 38%);
  color: hsl(var(--tag-hue), calc(var(--tag-sat) + 10%), 78%);
  font-family: inherit;
  font-size: 10px;
  letter-spacing: 0.02em;
  padding: 1px 6px;
  margin: 1px 3px 1px 0;
  cursor: pointer;
  transition: background 0.12s, border-color 0.12s, color 0.12s;
}
.tag-chip[style*="--tag-hue"] { --tag-sat: 55%; }
.tag-chip:hover {
  background: hsl(var(--tag-hue), var(--tag-sat), 26%);
  border-color: hsl(var(--tag-hue), var(--tag-sat), 55%);
  color: hsl(var(--tag-hue), calc(var(--tag-sat) + 10%), 92%);
}
.tag-chip.small { font-size: 9px; padding: 0px 5px; }

.window-block {
  margin-top: 6px;
  padding: 10px 12px;
  background: var(--row);
  border-left: 2px solid var(--info);
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.window-row { display: flex; gap: 12px; }
.window-row .field { flex: 1; min-width: 140px; }
.window-row .input { width: 100%; }
.day-checkboxes { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.day-checkboxes .lbl {
  font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-2);
  margin-right: 4px;
}
.day-checkboxes .hint { color: var(--ink-2); text-transform: none; letter-spacing: 0; font-size: 10px; }
.day-chip {
  display: inline-flex; align-items: center; gap: 4px;
  border: 1px solid var(--rule);
  padding: 2px 8px;
  font-family: inherit;
  font-size: 11px;
  color: var(--ink-2);
  cursor: pointer;
  user-select: none;
}
.day-chip input { margin: 0; }
.day-chip.active { color: var(--info); border-color: var(--info); background: var(--canvas); }
.window-hint {
  font-size: 11px;
  color: var(--info);
  padding: 4px 8px;
  border: 1px dashed var(--rule-2);
  background: var(--canvas);
}

.watch-box {
  margin-top: 6px;
  padding: 10px 12px;
  background: var(--row);
  border-left: 2px solid var(--mark);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.watch-row { display: flex; gap: 12px; }
.watch-row .field { flex: 1; }
.watch-row .input { width: 100%; }
.watch-row .select { width: 100%; }
.watch-box .hint { color: var(--ink-2); font-size: 10px; }
.watch-hint {
  font-size: 11px;
  color: var(--ink-2);
  padding: 6px 8px;
  border: 1px dashed var(--rule-2);
  background: var(--canvas);
}
.watch-hint .placeholder {
  color: var(--mark);
  background: var(--row);
  padding: 1px 5px;
  border: 1px solid var(--rule);
}
.trigger-pill.filewatch { color: var(--mark); border-color: var(--mark); border-style: dotted; }

/* /calendar */
.cal-legend { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 0 12px; }
.cal-legend-chip {
  display: inline-flex; align-items: center; gap: 6px;
  background: var(--row);
  padding: 4px 8px 4px 8px;
  font-size: 11px;
}
.cal-legend-chip .dot { width: 6px; height: 6px; display: inline-block; }
.cal-legend-chip .meta { color: var(--ink-2); font-size: 10px; margin-left: 4px; }

.cal-grid {
  display: grid;
  grid-auto-rows: 32px;
  background: var(--canvas);
  border: 1px solid var(--rule-2);
}
.cal-grid > * { border-right: 1px solid var(--rule-2); border-bottom: 1px solid var(--rule-2); }
.cal-grid > .cal-corner { border-right: 1px solid var(--rule); }
.cal-corner { background: var(--row); }
.cal-day-head {
  background: var(--row);
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding: 4px 0;
}
.cal-day-name {
  font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-2);
}
.cal-day-date { font-size: 12px; color: var(--ink); }
.cal-hour-label {
  background: var(--row);
  color: var(--ink-2);
  font-size: 10px;
  display: flex; align-items: flex-start; justify-content: flex-end;
  padding: 2px 6px 0 0;
}
.cal-cell {
  padding: 1px;
  position: relative;
  overflow: hidden;
}
.cal-cell.has-events { background: rgba(255,255,255,0.015); }
.cal-event {
  background: var(--row);
  padding: 1px 4px;
  font-size: 9px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  margin-bottom: 1px;
}
.cal-event .cal-time { color: var(--ink); margin-right: 4px; }
.cal-event .cal-job { color: var(--ink-2); }
.cal-more { font-size: 9px; color: var(--ink-2); padding: 0 4px; }
.tag-chip-row, .job-tag-row { display: flex; flex-wrap: wrap; gap: 2px; margin-top: 4px; }
.job-tag-row { margin-top: 2px; }
.btn-dry { color: var(--info); border-color: var(--info); border-style: dashed; }
.btn-dry:hover:not(:disabled) { background: var(--row); }

.trigger-pill.chained { color: var(--ok); border-color: var(--ok); }

.retry-block {
  margin-top: 8px;
  padding: 10px 12px;
  background: var(--row);
  border-left: 2px solid var(--stop);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.retry-head { display: flex; align-items: center; gap: 8px; }
.retry-head .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.retry-head .hint { color: var(--ink-2); font-size: 10px; text-transform: none; letter-spacing: 0; }
.retry-head .meta { color: var(--stop); font-size: 11px; }
.retry-head .meta.dim { color: var(--ink-2); }
.retry-row { display: flex; gap: 12px; }
.retry-row .field { flex: 1; min-width: 110px; }
.retry-row .input { width: 100%; }
.chain-block {
  margin-top: 8px;
  padding: 10px 12px;
  background: var(--row);
  border-left: 2px solid var(--ok);
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.chain-block .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.chain-row { display: flex; gap: 10px; flex-wrap: wrap; }
.chain-row .select { flex: 1; min-width: 240px; }
.chain-hint {
  font-size: 12px;
  color: var(--ink-2);
  padding: 4px 8px;
  border: 1px dashed var(--rule-2);
  background: var(--canvas);
}
.chain-hint .parent { color: var(--info); }
.chain-hint .self   { color: var(--ok); }
.btn-sm { padding: 2px 8px; font-size: 11px; height: 22px; }

.run-detail { padding: 12px 16px; background: var(--row); }
.detail-meta { display: flex; gap: 8px; color: var(--ink-2); font-size: 11px; margin-bottom: 8px; }
.detail-error pre, .detail-log pre {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  padding: 8px 12px;
  font-size: 11px;
  color: var(--ink);
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 280px;
  overflow-y: auto;
}
.detail-error pre { border-color: var(--stop); color: var(--stop); }
.detail-error .lbl, .detail-log .lbl {
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  margin: 8px 0 4px;
}
.empty-mini { color: var(--ink-2); font-size: 11px; padding: 8px 0; }
.empty-state {
  padding: 60px 24px;
  text-align: center;
  color: var(--ink-2);
}
.empty-state .big { font-size: 16px; color: var(--ink); margin-bottom: 8px; }
.empty-state .hint { font-size: 12px; }
.empty-state a { color: var(--mark); }

/* /metrics */
.metrics-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin-top: 12px;
}
.metrics-grid .span-2 { grid-column: 1 / -1; }
.metric-card {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  padding: 12px 16px;
}
.metric-head { display: flex; align-items: baseline; gap: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--rule-2); margin-bottom: 12px; }
.metric-title { font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink); }
.metric-sub { font-size: 11px; color: var(--ink-2); }

.bar-chart { width: 100%; height: auto; display: block; }
.bar-chart .axis { stroke: var(--rule-2); stroke-width: 1; }
.bar-chart .bar-ok   { fill: var(--ok); fill-opacity: 0.7; }
.bar-chart .bar-fail { fill: var(--stop); fill-opacity: 0.8; }
.bar-chart .bar-count { fill: var(--ink-2); font-family: inherit; font-size: 9px; }
.bar-chart .bar-date  { fill: var(--ink-2); font-family: inherit; font-size: 9px; letter-spacing: 0; }

.big-stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; }
.big-stat {
  padding: 14px 12px;
  border-left: 2px solid var(--rule);
  background: var(--row);
}
.big-stat .value { font-size: 24px; color: var(--ink); line-height: 1; }
.big-stat .lbl { font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-2); margin-top: 6px; }
.big-stat.ok   { border-left-color: var(--ok); }
.big-stat.ok   .value { color: var(--ok); }
.big-stat.fail { border-left-color: var(--stop); }
.big-stat.fail .value { color: var(--stop); }
.big-stat.mark { border-left-color: var(--mark); }
.big-stat.mark .value { color: var(--mark); }

.top-jobs-table { width: 100%; border-collapse: collapse; }
.top-jobs-table th {
  text-align: left;
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
  font-weight: 500;
  padding: 4px 8px;
  border-bottom: 1px solid var(--rule-2);
}
.top-jobs-table th.num, .top-jobs-table td.num { text-align: right; }
.top-jobs-table td { padding: 6px 8px; font-size: 12px; border-bottom: 1px solid var(--rule-2); }
.top-jobs-table td.ok   { color: var(--ok); }
.top-jobs-table td.fail { color: var(--stop); }
.rate-bar {
  width: 100%;
  height: 6px;
  background: var(--row);
  border: 1px solid var(--rule-2);
  position: relative;
}
.rate-fill {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, var(--stop) 0%, var(--mark) 50%, var(--ok) 100%);
  background-size: 200% 100%;
  background-position: 100% 0;
}

/* Create-library modal */
.modal-overlay {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, 0.7);
  z-index: 100;
  display: flex; align-items: center; justify-content: center;
  padding: 32px;
}
.modal-card {
  background: var(--canvas);
  border: 1px solid var(--rule-2);
  width: 100%;
  max-width: 1100px;
  height: 100%;
  max-height: 800px;
  display: grid;
  grid-template-rows: auto auto 1fr auto;
}
.modal-head {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--rule);
  background: var(--row);
  font-family: var(--mono); font-size: var(--t-xs);
  text-transform: uppercase; letter-spacing: 0.1em;
  color: var(--muted);
}
.modal-head .lbl { color: var(--mark); }
.modal-head .kind { color: var(--ink); text-transform: none; letter-spacing: 0; }
.modal-head .sep { color: var(--dim); }
.modal-toolbar {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 16px;
  border-bottom: 1px solid var(--rule);
  background: var(--row);
}
.modal-toolbar .name-input { width: 240px; }
.modal-editor { overflow: hidden; }
.modal-editor .code-field { width: 100%; height: 100%; min-height: 320px; }

.modal-result {
  border-top: 1px solid var(--rule);
  background: var(--row);
  max-height: 220px;
  overflow-y: auto;
}
.modal-result .result-head {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 16px;
  font-family: var(--mono); font-size: var(--t-sm);
}
.modal-result .result-head .muted { margin-left: auto; color: var(--muted); font-size: var(--t-xs); }
.modal-result.ok > .result-head { color: var(--go); border-left: 2px solid var(--go); }
.modal-result.fail > .result-head { color: var(--stop); border-left: 2px solid var(--stop); }
.result-types {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  padding: 8px 16px 12px;
  border-top: 1px dashed var(--rule);
}
.result-types .lbl { color: var(--muted); font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.08em; }
.result-warn {
  padding: 10px 16px; color: var(--wait);
  font-family: var(--mono); font-size: var(--t-sm);
  border-top: 1px dashed var(--rule);
}
.result-warn .muted { color: var(--muted); display: block; margin-top: 4px; }

/* Banners --------------------------------------------------- */
.banner {
  font-family: var(--mono);
  font-size: var(--t-sm);
  padding: 8px 12px;
  margin-bottom: 16px;
  border-left: 2px solid var(--info);
  background: var(--row);
  color: var(--ink);
}
.banner.go   { border-left-color: var(--go); }
.banner.wait { border-left-color: var(--wait); }
.banner.stop { border-left-color: var(--stop); }
/* banner amigável de feature bloqueada por plano (componente FeatureLockedBanner) */
.feature-locked {
  display: flex; align-items: center; gap: 14px;
  padding: 14px 16px; margin-bottom: 18px;
  border: 1px solid var(--rule-2); border-left: 3px solid var(--mark);
  background: color-mix(in srgb, var(--mark) 6%, var(--row));
}
.feature-locked-icon { font-size: 20px; line-height: 1; flex: 0 0 auto; }
.feature-locked-body { flex: 1 1 auto; min-width: 0; }
.feature-locked-msg { font-size: var(--t-sm); color: var(--ink); line-height: 1.45; }
.feature-locked-actions { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
.feature-locked-alt { font-size: var(--t-xs); }
@media (max-width: 640px) {
  .feature-locked { flex-wrap: wrap; }
  .feature-locked-actions { width: 100%; }
}
/* Texto cifrado / base64 longo — quebra sem estourar no mobile (evita inline style). */
.enc-wrap { white-space: pre-wrap; word-break: break-all; }
.nug-cache { word-break: break-all; }

/* Headline (page H1, replaces Bootstrap default) ------------ */
.page-title {
  font-family: var(--sans);
  font-weight: 500;
  font-size: var(--t-xl);
  margin: 0;
  letter-spacing: -0.01em;
}
.page-head {
  display: flex;
  align-items: baseline;
  gap: 14px;
  padding: 14px 18px;
  /* header vira uma CAIXA com borda nos 4 lados, recuada do topo e das laterais (inset do canvas) */
  margin: 16px 0 18px;
  border: 1px solid var(--rule);
}
.page-head .subtitle {
  color: var(--muted);
  font-family: var(--mono);
  font-size: var(--t-sm);
}

/* Blazor error UI — hidden by default; styled to match when shown ------ */
#blazor-error-ui {
  display: none;
  position: fixed;
  bottom: 0; left: 0; right: 0;
  z-index: 1000;
  padding: 8px 16px;
  background: var(--stop);
  color: #fff;
  font-family: var(--mono);
  font-size: var(--t-sm);
  box-shadow: 0 -1px 0 rgba(0,0,0,.3);
}
#blazor-error-ui a, #blazor-error-ui .dismiss {
  color: #fff;
  text-decoration: underline;
  margin-left: 12px;
  cursor: pointer;
}
#blazor-error-ui .dismiss { float: right; }

/* Utilities ------------------------------------------------- */
.flex { display: flex; }
.flex-col { display: flex; flex-direction: column; }
.gap-2 { gap: 8px; } .gap-3 { gap: 12px; } .gap-4 { gap: 16px; }
.grow { flex: 1; }
.right { text-align: right; }
.mono { font-family: var(--mono); }
.muted { color: var(--muted); }
.dim   { color: var(--dim); }

/* #139 — KMS-encrypted badge in VarsPage header ------------ */
.kms-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 10px;
  margin-right: 8px;
  border: 1px solid #19D5A6;
  border-radius: 999px;
  color: #19D5A6;
  font-size: 11px;
  letter-spacing: .02em;
}

/* #131 — /forbidden page (RBAC deny) ----------------------- */
.forbidden-detail { display: flex; flex-direction: column; gap: 14px; margin-top: 14px; }
.forbidden-perm { font-size: 14px; color: #f97316; }
.forbidden-perm code { background: rgba(249,115,22,.1); padding: 2px 6px; border-radius: 4px; }
.forbidden-actions { display: flex; gap: 10px; margin-top: 8px; }

/* #136 — approval-required pill in the JobsList ----------- */
.approval-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px;
  margin-left: 6px;
  border: 1px solid #facc15;
  border-radius: 999px;
  color: #facc15;
  font-size: 11px;
  letter-spacing: .02em;
  background: rgba(250,204,21,.06);
}

/* #128 — cloud-demo countdown badge in the cmdbar ---------- */
.demo-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  margin-right: 10px;
  border: 1px solid #19D5A6;
  border-radius: 999px;
  color: #19D5A6;
  font-size: 12px;
  text-decoration: none;
  letter-spacing: .02em;
}
.demo-badge:hover { background: rgba(25,213,166,.08); }

/* #128 — /cloud-demo signup form -------------------------- */
.cloud-demo-form { display: flex; flex-direction: column; gap: 12px; margin: 16px 0; }
.cloud-demo-form .row { display: flex; flex-direction: column; gap: 4px; }
.cloud-demo-form label { font-size: 12px; opacity: .7; }
.cloud-demo-success { display: flex; flex-direction: column; gap: 10px; margin: 16px 0; align-items: flex-start; }
.cloud-demo-tenant { font-size: 18px; color: #19D5A6; }
.cloud-demo-meta { font-size: 12px; opacity: .7; }

/* ============================================================
   Responsive — Onda 1 ext (mobile · tablet)
   Breakpoints: ≤900px = stacked, ≤640px = compact mobile
   ============================================================ */

/* JobEditor split form/preview — empilha em <1024px (form em cima, preview abaixo) */
@media (max-width: 1023px) {
  .editor {
    grid-template-columns: minmax(0, 1fr) !important;
    grid-template-rows: auto auto auto auto auto;
    /* Empilhado, o .editor NÃO deve mais reivindicar "o resto do canvas" (isso espalharia o
       sobrão entre as 5 rows do grid, inflando reopen-strips/resize-handle junto) — cada bloco
       fica do tamanho do próprio conteúdo e o .canvas (scrollável) rola a pilha inteira. */
    flex: 0 1 auto;
    min-height: auto;
  }
  .editor.editor--expanded,
  .editor.editor--collapsed {
    grid-template-columns: minmax(0, 1fr) !important;
  }
  .editor-reopen-left,
  .editor-form,
  .editor-resize-handle,
  .editor-preview,
  .editor-reopen {
    grid-column: 1 !important;
  }
  .editor-form { border-right: none; border-bottom: 1px solid var(--rule); }
  .editor-resize-handle { display: none !important; }
  .editor-preview {
    border-top: 1px solid var(--rule);
    min-height: 320px;
  }
  /* Re-open strips inúteis quando layout é stacked */
  .editor-reopen-left,
  .editor-reopen { display: none !important; }
}

/* itable horizontal scroll em viewport estreita — preserva todas colunas */
@media (max-width: 1023px) {
  .itable {
    display: block;
    overflow-x: auto;
    white-space: nowrap;
  }
  .itable thead,
  .itable tbody,
  .itable tr {
    display: table;
    width: 100%;
    min-width: 900px;
    table-layout: fixed;
  }
}

/* Page-head wrap melhor em mobile — quebra linha pra acomodar actions */
@media (max-width: 768px) {
  .page-head {
    flex-wrap: wrap;
    row-gap: 8px;
    padding: 12px 16px 10px;
  }
  .page-head .grow { flex-basis: 100%; height: 0; }
  .page-head .subtitle { font-size: 11px; }
}

/* Cmdbar — em mobile esconde "crumbs" não-essenciais e reduz padding */
@media (max-width: 640px) {
  .cmdbar { padding: 0 10px; gap: 6px; }
  .cmdbar .sep,
  .cmdbar .crumb { display: none; }
  .cmdbar .cmd-actions { gap: 2px; }
  .nav-group-trigger { padding: 0 6px; font-size: 11px; }
}
/* <480px: logo + ações não cabem numa linha (ações ~373px) → quebra pra 2ª linha em vez de
   estourar a página. Causa raiz do overflow mobile — o cmdbar aparece em TODA página. */
@media (max-width: 480px) {
  .cmdbar { flex-wrap: wrap; height: auto; min-height: 44px; row-gap: 2px; padding-bottom: 4px; }
  .cmdbar .grow { flex-basis: 100%; height: 0; }
  .cmdbar .cmd-actions { flex-wrap: wrap; min-width: 0; justify-content: flex-end; }
}

/* Flow picker — 2×2 grid em <900px, 1 coluna em <500px */
@media (max-width: 899px) {
  /* minmax(0,...) é essencial: um track "1fr" puro tem mínimo = conteúdo (o ASCII de 436px),
     então empurra a página. Com minmax(0,1fr) o track encolhe e o ASCII rola dentro do card. */
  .flow-picker {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 8px;
  }
  .flow-card { min-width: 0; }
  .flow-shape { min-width: 0; overflow-x: auto; font-size: 12px; }
}
@media (max-width: 499px) {
  .flow-picker {
    grid-template-columns: minmax(0, 1fr);
  }
  .flow-shape { font-size: 11px; }
}

/* Editor em mobile: empilha os 2 painéis (form em cima, preview embaixo) — o grid de 2 colunas
   com preview de 480px nunca colapsava e forçava overflow horizontal (reprova WCAG reflow). */
@media (max-width: 768px) {
  .editor { display: block; }
  .editor-resize-handle,
  .editor-reopen,
  .editor-reopen-left { display: none; }
  .editor-form,
  .editor-preview { width: 100%; min-width: 0; }
  .editor-preview { border-top: 1px solid var(--rule); margin-top: 8px; }
}

/* /dlq e /runs filtros — wrap melhor */
@media (max-width: 899px) {
  .runs-filters {
    flex-wrap: wrap;
    gap: 8px;
  }
  .runs-filters .select { min-width: 0; flex: 1 1 160px; }
  .runs-filters .runs-search { flex: 1 1 200px; width: auto; }
  .runs-filters input[type="datetime-local"] { width: auto; flex: 1 1 140px; }
}

/* Dashboard hero — 1 coluna em mobile small */
@media (max-width: 640px) {
  .dash-hero {
    grid-template-columns: 1fr 1fr;
    gap: 8px;
  }
  .dash-card.big { padding: 12px 14px; }
  .dash-card.big .num { font-size: 28px; }
  .page-head .muted.mono.dim { display: none; } /* auto-refresh badge */
}

/* Cron presets — wrap padrão já existe; só ajustar gap em mobile */
@media (max-width: 640px) {
  .cron-presets {
    flex-wrap: wrap;
    gap: 4px;
  }
  .cron-chip { font-size: 11px; padding: 2px 8px; }
}

/* Buttons em page-head: shrink em mobile (texto pode quebrar) */
@media (max-width: 640px) {
  .page-head .btn {
    flex: 0 1 auto;
    white-space: normal;
    text-align: center;
    line-height: 1.2;
    padding: 4px 8px;
    font-size: 11px;
  }
}

/* JobsList — bulk-bar wrap em mobile */
@media (max-width: 640px) {
  .bulk-bar {
    flex-wrap: wrap;
    gap: 6px;
  }
  .bulk-bar .grow { flex-basis: 100%; height: 0; }
}

/* Approval/DLQ row em mobile: empilha em vez de side-by-side */
@media (max-width: 640px) {
  .dlq-row,
  .retry-row,
  .window-row,
  .watch-row {
    flex-direction: column !important;
    gap: 8px !important;
  }
}

/* ---- Appearance settings (política de accent) ---- */
/* full-width como as demais telas — o inset de 24px vem do .canvas; sem cap estreito (era modelo antigo) */
.appearance-page { padding: 0; }
.acc-card { border: 1px solid var(--rule); background: var(--row); padding: 14px 16px; margin-bottom: 14px; }
.acc-help { margin: 3px 0 12px; font-size: var(--t-xs); }
.acc-swatches { display: flex; gap: 10px; margin-bottom: 12px; flex-wrap: wrap; }
.acc-swatch { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; border: 1px solid var(--rule); background: var(--bg); color: var(--ink); font-family: var(--mono); font-size: var(--t-sm); cursor: pointer; }
.acc-swatch:hover { border-color: var(--mark); }
.acc-swatch.sel { border-color: var(--mark); box-shadow: inset 0 0 0 1px var(--mark); }
.acc-dot { width: 13px; height: 13px; display: inline-block; }
.acc-check { display: flex; align-items: center; gap: 8px; font-size: var(--t-sm); margin-bottom: 14px; cursor: pointer; }
.acc-actions { display: flex; align-items: center; gap: 12px; }

/* ---- Login / cadastro ---- */
.login-shell { max-width: 400px; margin: 5rem auto; padding: 1rem; }
.login-card { border: 1px solid var(--rule); background: var(--row); padding: 30px 28px; }
.login-brand { font-size: 26px; letter-spacing: 0.06em; color: var(--mark); font-weight: 600; }
.login-tagline { margin: 4px 0 22px; color: var(--muted); font-size: var(--t-sm); }
.login-tabs { display: flex; border-bottom: 1px solid var(--rule); margin-bottom: 18px; }
.login-tab { padding: 8px 14px; text-decoration: none; color: var(--muted); font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.06em; border-bottom: 2px solid transparent; margin-bottom: -1px; }
.login-tab:hover { color: var(--ink); }
.login-tab.active { color: var(--mark); border-bottom-color: var(--mark); }
.login-error { border: 1px solid var(--stop); background: color-mix(in srgb, var(--stop) 10%, transparent); color: var(--stop); padding: 8px 12px; margin-bottom: 16px; font-size: var(--t-sm); }
.login-form { display: flex; flex-direction: column; gap: 13px; }
.login-field { display: flex; flex-direction: column; gap: 5px; }
.login-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); }
.login-field .input { width: 100%; height: 34px; }
/* input de senha + botão revelar na mesma linha */
.login-pw-row { display: flex; align-items: stretch; gap: 6px; }
.login-pw-row .input { flex: 1 1 auto; min-width: 0; }
.login-pw-toggle { flex: 0 0 auto; height: 34px; width: 38px; padding: 0; font-size: 15px; line-height: 1; opacity: 0.6; }
.login-pw-toggle:hover { opacity: 1; }
.login-pw-toggle.is-on { opacity: 1; color: var(--mark); }
.login-hint { font-size: var(--t-xs); margin-top: 2px; }
.login-consent { display: flex; align-items: flex-start; gap: 8px; font-size: var(--t-xs); color: var(--muted); cursor: pointer; line-height: 1.45; }
.login-consent input { margin-top: 2px; }
.login-submit { margin-top: 6px; height: 38px; background: var(--mark); color: #fff; border-color: var(--mark); font-weight: 600; justify-content: center; }
.login-submit:hover { filter: brightness(1.08); }
.login-sep { display: flex; align-items: center; gap: 12px; margin: 20px 0 14px; color: var(--muted); font-size: var(--t-xs); text-transform: uppercase; }
.login-sep::before, .login-sep::after { content: ""; height: 1px; background: var(--rule); flex: 1; }
.login-providers { display: grid; gap: 8px; }
.btn-sso { display: flex; align-items: center; gap: 10px; padding: 10px 14px; border: 1px solid var(--rule); background: var(--bg); text-decoration: none; color: var(--ink); font-size: var(--t-sm); }
.btn-sso:hover { border-color: var(--mark); background: var(--elev); }
.btn-sso-icon { width: 20px; text-align: center; opacity: 0.8; }
.btn-sso-label { flex: 1; }
.btn-sso-arrow { opacity: 0.6; }
.login-skip { display: block; text-align: center; margin-top: 20px; font-size: var(--t-xs); text-decoration: none; }
.login-skip:hover { color: var(--ink); }
.login-footnote { text-align: center; margin-top: 18px; font-size: var(--t-xs); }

/* ---- Menu de usuário (cmdbar, canto direito) ---- */
.cmdbar .user-menu { position: relative; }
.cmdbar .user-avatar { width: 28px; height: 24px; padding: 0; justify-content: center; font-family: var(--mono); font-size: 12px; font-weight: 600; color: var(--mark); border: 1px solid var(--mark); background: color-mix(in srgb, var(--mark) 12%, transparent); }
.cmdbar .user-avatar:hover { background: color-mix(in srgb, var(--mark) 20%, transparent); }
.cmdbar .user-menu .user-menu-panel { right: 0; left: auto; min-width: 190px; }
.user-menu-head { display: flex; flex-direction: column; gap: 2px; padding: 8px 12px; border-bottom: 1px solid var(--rule); margin-bottom: 4px; }
.user-menu-name { font-size: var(--t-sm); color: var(--ink); }
.user-menu-email { font-size: var(--t-xs); }
.user-menu-signout { color: var(--stop) !important; }
.cmdbar .login-link { font-size: var(--t-sm); text-decoration: none; }

/* ---- Seletor de workspace (cmdbar) ---- */
.cmdbar .ws-switch { position: relative; }
.ws-switch-glyph { color: var(--mark); font-size: 9px; }
.ws-switch-name { max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cmdbar .ws-switch .ws-switch-menu { right: 0; left: auto; min-width: 200px; }
.ws-switch-head { padding: 6px 14px 3px; font-size: var(--t-xs); text-transform: uppercase; letter-spacing: .05em; border-bottom: 1px solid var(--rule); margin-bottom: 4px; }
.ws-switch-menu a.active { color: var(--mark); }
.ws-switch-menu a.active::before { content: "✓ "; }
.ws-switch-menu a:not(.active)::before { content: "\00a0\00a0\00a0"; }

/* ---- Planos / upgrade ---- */
.plans-page { padding: 18px 24px; max-width: 1120px; }
.plans-sub { margin: 2px 0 20px; font-size: var(--t-sm); }
.plans-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(185px, 1fr)); gap: 12px; }
.plan-card { position: relative; border: 1px solid var(--rule); background: var(--row); padding: 18px 16px; display: flex; flex-direction: column; gap: 7px; }
.plan-card.featured { border-color: var(--mark); }
.plan-card.current { background: color-mix(in srgb, var(--mark) 7%, var(--row)); }
.plan-flag { position: absolute; top: -1px; right: -1px; background: var(--mark); color: #fff; font-size: 9px; padding: 2px 8px; letter-spacing: 0.05em; }
.plan-name { font-size: 16px; font-weight: 600; }
.plan-price { font-size: 22px; font-weight: 600; color: var(--mark); }
.plan-per { font-size: var(--t-xs); color: var(--muted); font-weight: 400; margin-left: 2px; }
.plan-tag { font-size: var(--t-xs); color: var(--muted); min-height: 30px; }
.plan-limits { list-style: none; padding: 8px 0 0; margin: 6px 0; display: flex; flex-direction: column; gap: 3px; font-size: var(--t-xs); color: var(--ink-2); border-top: 1px solid var(--rule); }
.plan-hl { font-size: var(--t-xs); color: var(--go); }
.plan-cta { margin-top: auto; justify-content: center; height: 34px; text-decoration: none; }
.plan-card.featured .plan-cta { background: var(--mark); color: #fff; border-color: var(--mark); }
.plan-cta-current { margin-top: auto; color: var(--muted); border: 1px dashed var(--rule); display: flex; align-items: center; justify-content: center; height: 34px; font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.05em; }
.checkout-page { max-width: 480px; margin: 5rem auto; padding: 1rem; }
.checkout-card { border: 1px solid var(--rule); background: var(--row); padding: 28px; text-align: center; }
.checkout-msg { color: var(--muted); font-size: var(--t-sm); line-height: 1.6; margin: 12px 0 20px; }
.checkout-cta { display: inline-block; margin-bottom: 16px; }

/* Downgrade — corpo à esquerda (título/ações seguem centrados via .checkout-card); impacto + alerta + passos */
.checkout-body { text-align: left; }
.checkout-body .checkout-msg { text-align: left; margin: 0 0 14px; }
.checkout-section-label { text-transform: uppercase; letter-spacing: 0.06em; font-size: var(--t-xs); color: var(--muted); margin: 0 0 8px; }
.checkout-impact { list-style: none; padding: 0; margin: 0 0 16px; display: flex; flex-direction: column; gap: 8px; text-align: left; }
.checkout-impact li { display: flex; gap: 10px; align-items: flex-start; color: var(--ink); font-size: var(--t-sm); line-height: 1.5; }
.checkout-impact li.ci-people { font-weight: 600; }   /* perda de acesso de gente salta mais que job pausado */
.checkout-impact .ci-icon { flex: 0 0 auto; width: 18px; text-align: center; }
.checkout-alert { display: flex; gap: 10px; align-items: flex-start; text-align: left; border-left: 3px solid var(--stop);
    background: color-mix(in srgb, var(--stop) 9%, transparent); color: var(--ink); padding: 12px 14px;
    font-size: var(--t-sm); line-height: 1.5; margin: 4px 0 20px; }
.checkout-alert .ca-icon { flex: 0 0 auto; color: var(--stop); }
.checkout-steps { display: flex; flex-direction: column; gap: 12px; margin-bottom: 18px; text-align: left; }
.checkout-backup { align-self: flex-start; }   /* .btn neutro = passo secundário, não CTA final */
.checkout-backup-done { color: var(--go); font-size: var(--t-sm); display: flex; gap: 6px; align-items: center; }
.checkout-consent { display: flex; gap: 8px; align-items: flex-start; font-size: var(--t-sm); line-height: 1.5; color: var(--ink); cursor: pointer; }
.checkout-consent input { margin-top: 2px; flex: 0 0 auto; }
.checkout-confirm-form { display: block; margin: 0; }
.checkout-confirm { width: 100%; height: 40px; margin-bottom: 8px; }   /* clímax da tela (danger no impacto) */
.checkout-help { color: var(--muted); font-size: var(--t-xs); text-align: center; margin: 0 0 12px; }
.checkout-cancel { display: inline-block; color: var(--ink-2); text-decoration: none; padding: 6px 12px; font-size: var(--t-sm); }
.checkout-cancel:hover { color: var(--ink); text-decoration: underline; }
.plans-ok { border: 1px solid var(--go); background: color-mix(in srgb, var(--go) 10%, transparent); color: var(--go); padding: 8px 12px; margin-bottom: 16px; font-size: var(--t-sm); }
.plan-cta-form { margin-top: auto; }
.plan-cta-form .plan-cta { width: 100%; margin-top: 0; }
.tel-status { font-size: var(--t-sm); margin-bottom: 12px; }
.tel-preview { border: 1px solid var(--rule); background: var(--bg); padding: 12px; font-size: var(--t-xs); color: var(--ink-2); margin: 6px 0 14px; overflow-x: auto; }
.appearance-privacy { display: inline-block; margin-top: 4px; font-size: var(--t-sm); text-decoration: none; }
.auth-canvas { min-height: 100vh; background: var(--canvas); }
.login-sent { border: 1px solid var(--go); background: color-mix(in srgb, var(--go) 12%, transparent); color: var(--go); padding: 10px 12px; margin-bottom: 14px; font-size: var(--t-sm); line-height: 1.5; }
.login-resend-form { margin: -6px 0 14px; }
.login-resend { background: none; border: none; color: var(--mark); cursor: pointer; font-size: var(--t-sm); padding: 0; text-decoration: underline; }
.login-resend:hover { opacity: .8; }
.login-forgot-link { display: inline-block; align-self: flex-end; font-size: var(--t-xs); text-decoration: none; margin: -4px 0 2px; }
.login-forgot-link:hover { color: var(--mark); }
.login-forgot-help { font-size: var(--t-sm); margin: 0 0 14px; line-height: 1.5; }

/* ---- "Entrando no Fluxion" · overlay PADRÃO de entrada (SsoEnterPage) ----
   Modal centrado no auth-canvas; 3 passos ancorados a sinais reais. Usa a mesma paleta do login. */
.sso-overlay { min-height: 100vh; display: grid; place-items: center; padding: 1rem; background: var(--canvas); }
.sso-card { width: 100%; max-width: 420px; border: 1px solid var(--rule); background: var(--row); padding: 26px 26px 22px; }
.sso-head { display: flex; align-items: center; gap: 14px; margin-bottom: 20px; }
.sso-head .mark { display: grid; place-items: center; width: 42px; height: 42px; border: 1px solid var(--mark); color: var(--mark); font-weight: 700; font-size: 20px; flex: 0 0 auto; }
.sso-head .t { font-size: var(--t-md); }
.sso-head .t strong { color: var(--mark); }
.sso-head .s { font-size: var(--t-xs); margin-top: 2px; }
.sso-steps { display: flex; flex-direction: column; gap: 10px; margin: 8px 0 16px; }
.sso-step { display: flex; align-items: center; gap: 12px; font-size: var(--t-sm); color: var(--muted); opacity: .55; transition: opacity .25s ease, color .25s ease; }
.sso-step .marker { display: grid; place-items: center; width: 24px; height: 24px; border: 1px solid var(--rule-2); border-radius: 50%; font-size: var(--t-xs); flex: 0 0 auto; transition: border-color .25s ease, background .25s ease, color .25s ease; }
.sso-step.active { opacity: 1; color: var(--ink); }
.sso-step.active .marker { border-color: var(--mark); color: var(--mark); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mark) 18%, transparent); }
.sso-step.done { opacity: 1; color: var(--ink); }
.sso-step.done .marker { border-color: var(--go); background: var(--go); color: var(--canvas); }
/* v2 — step 2 entitlement chips (tier + grace diagnostic). Let the label wrap so the chips sit under it. */
.sso-step .lbl { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; }
.sso-ent { font-size: var(--t-xs); color: var(--ink-2); border: 1px solid var(--rule-2); border-radius: 999px; padding: 1px 8px; white-space: nowrap; }
.sso-ent-warn { color: var(--warn, #b26a00); border-color: color-mix(in srgb, var(--warn, #b26a00) 40%, transparent); background: color-mix(in srgb, var(--warn, #b26a00) 10%, transparent); }
.sso-nopass { display: flex; align-items: center; gap: 8px; font-size: var(--t-xs); padding-top: 12px; border-top: 1px solid var(--rule); }
.sso-nopass .key { color: var(--mark); }
.sso-outcome { text-align: center; padding: 8px 0 4px; }
.sso-outcome-ic { font-size: 34px; color: var(--stop); line-height: 1; margin-bottom: 10px; }
.sso-outcome-title { font-size: var(--t-md); color: var(--ink); margin-bottom: 6px; }
.sso-outcome-body { font-size: var(--t-sm); line-height: 1.5; margin-bottom: 16px; }
.sso-outcome-actions { display: flex; justify-content: center; gap: 10px; }

.users-remove { color: var(--stop); }
/* contrato de coluna da Users (Template A · itable direto): EMAIL elástico engole o slack, resto fixo */
.users-table .u-c-role   { width: 132px; }
.users-table .u-c-status { width: 128px; }
.users-table .u-c-src    { width: 108px; }
.users-table .u-c-date   { width: 152px; }
.users-table .u-c-act    { width: 188px; }
.users-table td.col-truncate { max-width: 0; width: auto; }
/* fx-select compacto na coluna de papel (row densa) */
.users-table .users-role { width: 100%; }
.users-table .users-role .form-select { height: 28px; min-height: 28px; }
/* convite: modal (alcançável do page-head, não embaixo da lista) */
.users-invite-card { width: min(460px, 92vw); }
.users-invite-card .confirm-field { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; text-align: left; }
.users-invite-card .confirm-field .input,
.users-invite-card .confirm-field .fx-select { width: 100%; }
.users-invite-err { margin: 0 0 12px; }

/* ---- Workspaces page (layout spec Léo · nativo) ---- */
/* SPEC 1 · wrapper com cap de largura, ancorado à esquerda (alinha com o título do page-head) */
.ws-body { padding: 20px 0 0; margin: 0; }   /* full-width (padrão); h-inset vem do .canvas */
.ws-body > .section { margin-bottom: 24px; }
/* SPEC 2 · contrato de coluna — larguras fixas; DESC/EMAIL elásticas engolem o slack */
.ws-table .ws-c-name { width: 220px; }
.ws-table .ws-c-slug { width: 160px; }
.ws-table .ws-c-date { width: 104px; }
.ws-table .ws-c-role { width: 128px; }
.ws-table .ws-c-by   { width: 120px; }
.ws-table td.col-truncate { max-width: 0; width: auto; }   /* célula elástica-com-ellipsis */
.itable td.ws-sub { color: var(--ink-2); }       /* F-07: slug/data secundários mas AA (7.29/8.03) */
.ws-empty { padding: 8px 0; }
.ws-panel-head { display: flex; align-items: baseline; gap: 10px; }
/* SPEC 4 · form em grid com trilha de botão explícita (nunca corta) */
.ws-form { display: grid; grid-template-columns: minmax(180px,1.2fr) minmax(150px,0.9fr) minmax(220px,1.8fr) auto; gap: 12px; align-items: end; }
.ws-form.ws-form-2 { grid-template-columns: 1fr 180px auto; }
.ws-form > label { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.ws-form > .btn { min-width: 140px; height: 32px; align-self: end; }
.ws-label { color: var(--ink-2); font-size: var(--t-xs); display: flex; align-items: center; gap: 4px; }  /* F-07: era .dim (<AA) → --ink-2 */
.hint-q { display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; border: 1px solid var(--rule-2); border-radius: 50%; font-size: 9px; color: var(--muted); cursor: help; }
@media (max-width: 768px) {
    .ws-form, .ws-form.ws-form-2 { grid-template-columns: 1fr; }
    .ws-form > .btn { width: 100%; }
}
/* F-01 · modal de confirmação (reusa .modal-overlay) */
.confirm-card { background: var(--canvas); border: 1px solid var(--rule-2); max-width: 440px; width: 100%; padding: 20px 22px; display: flex; flex-direction: column; gap: 12px; }
.confirm-title { margin: 0; font-size: 15px; }
.confirm-body { color: var(--ink-2); font-size: var(--t-sm); margin: 0; line-height: 1.5; }
.confirm-list { list-style: none; margin: 4px 0; padding: 0; max-height: 240px; overflow-y: auto; font-size: var(--t-sm); }
.confirm-list li { padding: 5px 0; border-bottom: 1px solid var(--rule-2); }
.confirm-list li:last-child { border-bottom: 0; }
.confirm-field { display: flex; flex-direction: column; gap: 4px; }
.confirm-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }
/* #33/#35 · form de provider SSO (add/edit) — mais campos, cabe com scroll interno */
.sso-form-card { max-width: 520px; max-height: 82vh; overflow-y: auto; }
.sso-form-card .confirm-field { margin-bottom: 10px; text-align: left; }
.sso-form-card .input { width: 100%; }
.sso-form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.confirm-check { display: flex; align-items: center; gap: 8px; font-size: var(--t-sm); color: var(--ink-2); cursor: pointer; }
.confirm-check input { width: auto; }
/* botão de confirmar destrutivo — SÓLIDO (distinto do .btn-danger nativo, que é ghost) */
.btn-danger-solid { background: var(--stop); color: #fff; border-color: var(--stop); }
.btn-danger-solid:hover:not(:disabled) { filter: brightness(1.12); }
.btn-danger-solid:disabled { opacity: 0.4; cursor: not-allowed; }
.sso-restart-note { margin: 2px 0 10px; color: var(--muted); }
.filepath-cell { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.setting-upload-err { font-size: var(--t-xs); line-height: 1.4; }
/* label-como-botão: o clique abre o picker nativo (gesto direto · Safari-safe); o input fica escondido mas clicável */
.setting-upload-btn { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; cursor: pointer; }
.setting-upload-input { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; }

/* badge de job pausado por downgrade (leva ao /upgrade) */
.downgrade-badge { display: inline-flex; align-items: center; gap: 3px; font-size: var(--t-xs);
  padding: 1px 7px; border-radius: 10px; background: color-mix(in srgb, var(--wait) 16%, transparent);
  color: var(--wait); text-decoration: none; white-space: nowrap; }
.downgrade-badge:hover { background: color-mix(in srgb, var(--wait) 26%, transparent); text-decoration: none; }
