/* SolvoCase stylesheet (v5.13.0).
   All CSS lives here so the Content-Security-Policy can use style-src 'self'
   (no 'unsafe-inline'): no <style> blocks and no style= attributes in the HTML. */

/* ============================== layout (theme) ============================== */
:root{--bg:#f7faf7;--fg:#222;--brand:#1B3A2B;--gold:#9A7B1F;--btn-bg:#6F5411;--card:#fff;--border:#d9e2d9;
--heading:#1B3A2B;--nav-fg:#fff;--th-fg:#fff;--kpi-fg:#fff;--pos:#1B7A3A;--neg:#9B2226;
--muted:#5f6b5f;--label:#333;--input-bg:#fff;--input-border:#bbb;--btn-fg:#fff;--stripe:rgba(0,0,0,.025)}
[data-theme="dark"]{--bg:#0f140f;--fg:#e6ebe6;--brand:#16301f;--gold:#C9A227;--btn-bg:#C9A227;--card:#1a221a;--border:#2c3a2c;
--heading:#7FB896;--nav-fg:#eef4ee;--th-fg:#eef4ee;--kpi-fg:#fff;--pos:#4CAF6A;--neg:#E5736B;
--muted:#9fb0a0;--label:#c4d0c4;--input-bg:#141a14;--input-border:#3a4a3a;--btn-fg:#1a1400;--stripe:rgba(255,255,255,.03)}
*{box-sizing:border-box}body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;margin:0;color:var(--fg);background:var(--bg);line-height:1.5}
.skip{position:absolute;left:-9999px;top:0;background:var(--gold);color:#1a1400;padding:8px 14px;border-radius:0 0 6px 0;font-weight:bold;z-index:100}
.skip:focus{left:0}
.nav{background:var(--brand);padding:12px 24px;display:flex;align-items:center;flex-wrap:wrap;gap:4px;position:sticky;top:0;z-index:120}
.nav a{color:var(--nav-fg);margin-right:16px;text-decoration:none;font-weight:bold}.nav a:hover{color:var(--gold)}
.nav a[aria-current="page"]{color:var(--gold);text-decoration:underline;text-underline-offset:4px}
.brand{color:var(--nav-fg);margin-right:20px;font-size:15px}.right{margin-left:auto;color:var(--nav-fg)}.right select{padding:4px;border-radius:4px;margin-left:4px}
.nav-toggle{display:inline-block;background:transparent;color:var(--nav-fg);font-size:22px;line-height:1;border:0;cursor:pointer;padding:2px 10px 2px 0}
/* --- v5.11.0 sidebar navigation (collapsible; state persists in localStorage) --- */
.shell{display:flex;align-items:stretch;min-height:calc(100vh - 54px)}
.sidebar{width:232px;flex-shrink:0;background:var(--card);border-right:1px solid var(--border);
padding:12px 10px 14px;position:sticky;top:54px;align-self:flex-start;height:calc(100vh - 54px);
overflow-y:auto;display:flex;flex-direction:column}
.sb-body{flex:1}
.sb-foot{margin-top:auto;border-top:1px solid var(--border);padding-top:10px}
.sb-foot a{color:var(--neg)}
.sidebar a{display:block;padding:8px 12px;margin:1px 0;border-radius:6px;color:var(--fg);
text-decoration:none;font-weight:600;font-size:14px}
.sidebar a:hover{background:var(--stripe);color:var(--heading)}
.sidebar a[aria-current="page"]{background:var(--brand);color:var(--nav-fg)}
.sb-head{font-size:11px;text-transform:uppercase;letter-spacing:.8px;color:var(--muted);
margin:14px 10px 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-backdrop{display:none}
html.sb-collapsed .sidebar{display:none}
.wrap{flex:1;min-width:0;max-width:1040px;margin:24px auto;padding:0 20px}h1{color:var(--heading);font-size:1.7rem}h2{color:var(--heading);margin-top:26px;font-size:1.3rem}
.tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
table{border-collapse:collapse;margin:14px 0;width:100%;background:var(--card)}td,th{border:1px solid var(--border);padding:8px 12px}
th{background:var(--brand);color:var(--th-fg);text-align:left}td.n,th.n{text-align:right}
table tr:nth-child(even) td{background:var(--stripe)}
.card{background:var(--card);border:1px solid var(--border);border-radius:8px;padding:18px;margin:14px 0}
.kpi{display:inline-block;background:var(--brand);color:var(--kpi-fg);border-radius:8px;padding:14px 18px;margin:6px;min-width:160px}
.kpi b{color:var(--gold);font-size:22px;display:block}input,select{padding:6px;margin:4px 0;border:1px solid var(--input-border);border-radius:4px;background:var(--input-bg);color:var(--fg)}
button,.btn{background:var(--btn-bg);color:var(--btn-fg);border:0;border-radius:6px;padding:9px 16px;font-weight:bold;cursor:pointer;text-decoration:none;display:inline-block}
button:hover,.btn:hover{filter:brightness(1.08)}
a{color:var(--heading)}
:focus-visible{outline:2px solid var(--gold);outline-offset:2px}
.pos{color:var(--pos);font-weight:bold}.neg{color:var(--neg);font-weight:bold}.muted{color:var(--muted);font-size:13px}
/* v5.13.0 a11y: controls are wrapped INSIDE their label (<label><span class='lbl'>Text</span><input></label>).
   The fixed-width column that used to live on the label itself now lives on the .lbl text span,
   so the rendered alignment is identical while the control is programmatically associated. */
label{font-size:13px;color:var(--label)}
.lbl{display:inline-block;min-width:180px}
/* --- v5.11.0 compact icon actions (users table) --- */
.row-actions{display:flex;gap:6px;align-items:center;white-space:nowrap}
.row-actions form{margin:0;display:inline-flex}
.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;
padding:0;border:0;border-radius:6px;font-size:15px;line-height:1;cursor:pointer;
background:var(--btn-bg);color:var(--btn-fg);text-decoration:none}
.btn-icon:hover{filter:brightness(1.12)}
.btn-icon.neutral{background:var(--muted)}.btn-icon.danger{background:var(--neg)}
.btn-icon[aria-pressed="true"]{outline:2px solid var(--gold);outline-offset:1px}
@media(max-width:900px){
/* sidebar becomes an off-canvas drawer; ☰ opens it (html.sb-open) over a backdrop */
.sidebar{position:fixed;left:0;top:0;bottom:0;height:100vh;width:256px;z-index:220;
transform:translateX(-105%);transition:transform .18s ease;box-shadow:2px 0 14px rgba(0,0,0,.25)}
html.sb-open .sidebar{transform:none}
html.sb-collapsed .sidebar{display:block}
.sb-backdrop{display:none;position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:210}
html.sb-open .sb-backdrop{display:block}}
@media(max-width:640px){.wrap{padding:0 12px;margin:14px auto}.nav{padding:10px 14px}
label{display:block}.lbl{min-width:0;display:block}input,select{max-width:100%}
table{display:block;overflow-x:auto;white-space:nowrap}}

/* ============================== components ============================== */
/* Brand lockup (nav): decision-flow "S" emblem + wordmark. */
.brand-link{display:inline-flex;align-items:center;gap:8px;text-decoration:none}
.brand-word{font-size:16px;font-weight:400;color:var(--nav-fg);letter-spacing:.3px}
.brand-case{font-weight:700;color:var(--gold)}
.flex-none{flex:none}
.st-gold{stroke:var(--gold)}
.fl-gold{fill:var(--gold)}
.fl-nav{fill:var(--nav-fg)}
/* Nav workspace segment */
.sep{opacity:.4;margin:0 6px}
.ws-name{font-weight:600;margin:0 4px}
/* P4 unsaved-draft banner */
.draft-banner{background:var(--gold);color:#222;padding:8px 16px;font-size:14px}
/* Danger-zone card (P5 tiers) */
.card.card-danger{border:2px solid var(--neg)}
.h-neg{color:var(--neg)}
/* Audit-log filter bar + pagination */
.filterbar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.pager{display:flex;gap:8px;margin-top:8px}
/* Dashboard chart grid */
.chartrow{display:flex;flex-wrap:wrap;gap:18px}
.chartcell{flex:1;min-width:300px}
/* Model editor: group header row */
.th-group{background:var(--card);color:var(--heading)}

/* ============================== utilities ============================== */
.inline-form{display:inline}
/* Button color variants. The doubled selectors keep them more specific than the
   base `button,.btn` rule regardless of source order (no !important needed). */
button.btn-danger,.btn.btn-danger{background:var(--neg)}
button.btn-muted,.btn.btn-muted{background:var(--muted)}
button.btn-green,.btn.btn-green{background:#4F6F5A}
.mt8{margin-top:8px}
.mt10{margin-top:10px}
.mt12{margin-top:12px}
.my10{margin:10px 0}
.m4v{margin:4px 0}
.m-auto{margin:auto}
.w140{width:140px}
.w150{width:150px}
.w160{width:160px}
.w-full{width:100%}
.fw6{font-weight:600}
.dim{opacity:.7}
.dim75{opacity:.75}
.right-btn{float:right}
.code-sm{font-size:.8em}
.card-sm{max-width:420px}
.card-md{max-width:460px}

/* ============================== doc viewer ============================== */
.doc-txt{white-space:pre-wrap;word-wrap:break-word;background:var(--card);border:1px solid var(--border);
border-radius:6px;padding:14px;font-family:ui-monospace,Consolas,monospace;font-size:13px;overflow-x:auto}
.doc-md,.doc-docx{background:var(--card);border:1px solid var(--border);border-radius:8px;padding:22px;line-height:1.6}
.doc-md img,.doc-docx img,.doc-img{max-width:100%;height:auto}
.doc-table{border-collapse:collapse;width:100%;margin:10px 0}
.doc-table td,.doc-table th{border:1px solid var(--border);padding:6px 10px;font-size:13px}
.doc-tabs{margin:8px 0}
.doc-tab{background:var(--card);color:var(--fg);border:1px solid var(--border);border-radius:6px 6px 0 0;
padding:6px 12px;margin-right:4px;font-weight:bold}
.doc-tab.active{background:var(--brand);color:var(--nav-fg)}
/* Multi-sheet panels: only the first is visible initially; app.js switches them
   via el.style.display (allowed under style-src — the CSSOM is not inline CSS). */
.doc-hide{display:none}
.doc-page{display:block;width:100%;max-width:900px;margin:0 auto 14px;box-shadow:0 1px 6px rgba(0,0,0,.2);border:1px solid var(--border)}
.doc-slide{background:var(--card);border:1px solid var(--border);border-radius:8px;padding:18px;margin:0 0 14px}
.doc-slide-h{color:var(--gold);margin-top:0}
.doc-image{text-align:center}
/* v5.10.0 (finding 5): la marca de agua y los disuasorios de captura se ELIMINARON —
el contenido se muestra limpio y con selección de texto normal. El control real de
egreso es del SERVIDOR: export.download / export.export_pdf. */
.doc-wrap{position:relative}
.doc-content{position:relative;z-index:1}
.doc-toolbar .btn{cursor:pointer}

/* ============================== charts (inline SVG) ============================== */
/* The SVGs are inline in the document, so document CSS applies (CSS variables do
   NOT work in SVG presentation attributes — classes are required for theming). */
.chart-svg{max-width:440px}
.ch-lbl{fill:var(--muted)}
.ch-title{fill:var(--heading)}
.ch-axis{stroke:var(--border)}

/* ============================== print ============================== */
/* Blank-print deterrent when the profile lacks export.print: the doc-viewer content
   div carries data-noprint and the whole page prints blank. :has() is supported by
   all current browsers; this is an honest DETERRENT, not a control (older browsers
   simply lose the deterrent — the authoritative egress controls are server-side). */
@media print{
  body:has(#docContent[data-noprint]){display:none !important}
}
