:root{
  color-scheme:light;
  --bg:#f6f6f4;--surface:#ffffff;--surface-2:#f0f0ec;--text:#1b1d21;--muted:#5b616b;--border:#e1e1dc;--grid:#e9e9e4;
  --crit:#d03b3b;--crit-ink:#a32020;--crit-bg:#fbe9e9;
  --warn:#fab219;--warn-ink:#8a5a00;--warn-bg:#fff3d9;
  --note-ink:#2b4f9e;--note-bg:#e8eefb;--ok-ink:#17703f;--ok-bg:#e3f3ea;--neutral-bg:#ecebe7;
  --chg-ink:#5b3a9e;--chg-bg:#efe9fb;
  --motor-ink:#3d5a73;--motor-bg:#eaf1f6;
  --accent:#226dc6;--on-accent:#fff;--other:#a3a29d;
  --s1:#2a78d6;--s2:#eb6834;--s3:#1baf7a;--s4:#eda100;--s5:#e87ba4;--s6:#008300;--s7:#4a3aa7;--s8:#e34948;
  --q1:#e6effb;--q2:#b7d3f6;--q3:#86b6ef;--q4:#3987e5;--q5:#1c5cab;--q6:#0d366b;
  --topbar-h:56px;
}
@media (prefers-color-scheme: dark){
  :root:where(:not([data-theme="light"])){
    color-scheme:dark;
    --bg:#131417;--surface:#1c1e22;--surface-2:#25282d;--text:#e8e9ec;--muted:#9da3ae;--border:#32363d;--grid:#2a2d33;
    --crit-ink:#ff8f86;--crit-bg:#3b1d1c;--warn-ink:#f6c25a;--warn-bg:#382a12;
    --note-ink:#a5bdf6;--note-bg:#1d2740;--ok-ink:#72d6a0;--ok-bg:#16301f;--neutral-bg:#2c2f35;
    --chg-ink:#cdb8ff;--chg-bg:#2d2440;
    --motor-ink:#a9c7e0;--motor-bg:#1f2a33;
    --accent:#6da7ec;--on-accent:#0d1b2e;--other:#6f6e69;
    --s1:#3987e5;--s2:#d95926;--s3:#199e70;--s4:#c98500;--s5:#d55181;--s6:#008300;--s7:#9085e9;--s8:#e66767;
    --q1:#1e2a3d;--q2:#184f95;--q3:#1c5cab;--q4:#3987e5;--q5:#6da7ec;--q6:#b7d3f6;
  }
}
:root[data-theme="dark"]{
  color-scheme:dark;
  --bg:#131417;--surface:#1c1e22;--surface-2:#25282d;--text:#e8e9ec;--muted:#9da3ae;--border:#32363d;--grid:#2a2d33;
  --crit-ink:#ff8f86;--crit-bg:#3b1d1c;--warn-ink:#f6c25a;--warn-bg:#382a12;
  --note-ink:#a5bdf6;--note-bg:#1d2740;--ok-ink:#72d6a0;--ok-bg:#16301f;--neutral-bg:#2c2f35;
  --chg-ink:#cdb8ff;--chg-bg:#2d2440;
  --motor-ink:#a9c7e0;--motor-bg:#1f2a33;
  --accent:#6da7ec;--on-accent:#0d1b2e;--other:#6f6e69;
  --s1:#3987e5;--s2:#d95926;--s3:#199e70;--s4:#c98500;--s5:#d55181;--s6:#008300;--s7:#9085e9;--s8:#e66767;
  --q1:#1e2a3d;--q2:#184f95;--q3:#1c5cab;--q4:#3987e5;--q5:#6da7ec;--q6:#b7d3f6;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--text);font:15px/1.55 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;overflow-wrap:break-word}
/* Sticky top bar (T11). --topbar-h is the fallback; app.js sets it from the bar's real height (it wraps on mid widths, R24). */
header.top{position:sticky;top:0;z-index:20;display:flex;flex-wrap:wrap;align-items:center;gap:8px 18px;min-height:var(--topbar-h);padding:8px 16px;background:var(--surface);border-bottom:1px solid var(--border)}
.brand{font-weight:750;color:var(--text);display:flex;align-items:center;gap:6px}.brand:hover{text-decoration:none}.logo{color:var(--accent);font-size:1.2rem}
header.top nav{display:flex;flex-wrap:wrap;gap:2px}
header.top nav a{color:var(--muted);text-decoration:none;padding:6px 10px;border-radius:7px;font-size:.92rem}
header.top nav a:hover{text-decoration:none;color:var(--text)}
header.top nav a.active{color:var(--text);background:var(--surface-2);font-weight:650}
.count{font-size:.7rem;font-weight:700;border-radius:999px;padding:1px 7px;margin-left:5px}
.count.warn{background:var(--warn-bg);color:var(--warn-ink)}.count.crit{background:var(--crit-bg);color:var(--crit-ink)}
.jump{margin-left:auto}.jump input{width:260px;max-width:100%;font:inherit;font-size:.88rem;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:7px;padding:5px 9px}
.usermenu{position:relative}.usermenu summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:7px;font-size:.9rem}
.usermenu summary::-webkit-details-marker{display:none}
.usermenu .menu{position:absolute;right:0;top:calc(100% + 8px);z-index:30;display:grid;gap:8px;min-width:240px;padding:12px 14px;background:var(--surface);border:1px solid var(--border);border-radius:10px;box-shadow:0 6px 24px rgba(0,0,0,.18)}
.usermenu .menu form{margin:0}
.usermenu .menu button.link{text-align:left}
.nav-toggle{display:none}
dialog.help dl{display:grid;grid-template-columns:auto 1fr;gap:6px 14px;margin:6px 0 12px}dialog.help dd{margin:0}
@media (max-width:899px){
  .nav-toggle{display:inline-block;margin-left:auto}
  header.top nav{display:none;flex-basis:100%;flex-direction:column}
  html.nav-open header.top nav{display:flex}
  .jump{display:none;flex-basis:100%;margin:0}html.nav-open .jump{display:block}.jump input{width:100%}
  /* QA 9: the user lives only inside the ☰ menu (it wrapped to a second bar row) */
  .usermenu{display:none;flex-basis:100%}html.nav-open .usermenu{display:block}
  .usermenu .menu{position:static;margin-top:8px;box-shadow:none}
}
main.page{max-width:2400px;margin:0 auto;padding:28px 16px 80px}
@media (min-width:900px){main.page{padding:32px 40px 80px}}
h1{font-size:1.8rem;margin:0 0 4px}
h2{font-size:1.3rem;margin:32px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--border)}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
p a,li a{text-decoration:underline}
a.code{text-decoration:none}a.code:hover{text-decoration:underline}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
pre{white-space:pre-wrap;overflow-wrap:anywhere}
.codeblock{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:start;margin:8px 0}
pre.cmd{font:12.5px/1.5 ui-monospace,"Cascadia Code",Consolas,monospace;background:var(--surface-2);border:1px solid var(--border);border-radius:8px;padding:8px 10px;white-space:pre-wrap;overflow-wrap:anywhere;margin:0}
.codeblock.bad pre.cmd{border-color:var(--crit);background:var(--crit-bg)}
.code{font-family:ui-monospace,"Cascadia Code",Consolas,monospace;font-weight:700}
kbd{font-family:ui-monospace,Consolas,monospace;font-size:.75rem;border:1px solid var(--border);border-bottom-width:2px;border-radius:4px;padding:0 5px;background:var(--surface-2);color:var(--muted)}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.grow{flex:1}.right{text-align:right;margin-top:8px}.hint{font-size:.8rem;color:var(--muted);margin:6px 0 0}
.row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px}
h4.sec,h3.sec,h2.sec{margin:0 0 8px;padding:0;border:0;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.box{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:14px 18px;margin:10px 0}
button{padding:6px 12px;border-radius:7px;border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;font:inherit;font-size:.88rem}
button:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}
button.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
button.primary:hover:not(:disabled){color:var(--on-accent);filter:brightness(1.08)}
button.link{border:0;background:none;color:var(--accent);padding:0}
button.sm,a.btn.sm{font-size:.8rem;padding:3px 10px}
a.btn{display:inline-block;padding:6px 12px;font-size:.88rem;border:1px solid var(--border);border-radius:7px;color:var(--text);background:var(--surface);text-decoration:none}
a.btn:hover{border-color:var(--accent);color:var(--accent);text-decoration:none}
a.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}
a.btn.primary:hover{color:var(--on-accent);filter:brightness(1.08)}
.chip{display:inline-block;font-size:.76rem;padding:1px 8px;border-radius:6px;background:var(--surface-2);border:1px solid var(--border);color:var(--muted);margin:1px 0;white-space:nowrap}
/* PersonChip: a person by display name; the initials come from data-initials (aria-hidden, not part of the text). */
.person{display:inline-flex;align-items:center;gap:7px;font-weight:600}
.person.sm{font-weight:500;font-size:.86rem}
.av{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;background:var(--note-bg);color:var(--note-ink);font-size:.7rem;font-weight:700;flex:0 0 auto}
.av::before{content:attr(data-initials)}
.person.sm .av{width:20px;height:20px;font-size:.62rem}
.person.unknown .av{background:var(--surface-2);color:var(--muted);border:1px dashed var(--border)}
.who-email{font-size:.85rem}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:12px;margin:16px 0}
.kpi{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:12px 16px}
.kpi b{display:block;font-size:1.7rem;line-height:1.15}
.kpi span{color:var(--muted);font-size:.85rem}
.kpi.crit b{color:var(--crit-ink)}.kpi.warn b{color:var(--warn-ink)}.kpi.ok b{color:var(--ok-ink)}
.badge{display:inline-block;font-size:.72rem;font-weight:650;padding:2px 9px;border-radius:999px;white-space:nowrap;vertical-align:middle;letter-spacing:.01em}
.b-critico{color:var(--crit-ink);background:var(--crit-bg)}
.b-aviso,.b-revisar{color:var(--warn-ink);background:var(--warn-bg)}
.b-nota{color:var(--note-ink);background:var(--note-bg)}
.b-ok,.b-cerrado{color:var(--ok-ink);background:var(--ok-bg)}
.b-asignado,.b-diferido,.b-descartado,.b-en_curso{color:var(--text);background:var(--neutral-bg)}
.b-pendiente_asignar,.b-pendiente_cierre{color:var(--warn-ink);background:var(--warn-bg)}
.b-reabierto{color:var(--crit-ink);background:var(--crit-bg)}
.b-nuevo{color:var(--note-ink);background:var(--note-bg)}
/* Iteration 6: "Cambios por revisar" (AA: 7.0:1 light, 8.3:1 dark). */
.b-cambios{color:var(--chg-ink);background:var(--chg-bg)}
/* Engine comments in the ficha (iteration 7; AA: 6.3:1 light, 8.3:1 dark). Their values wrap instead of scrolling. */
.b-motor{color:var(--motor-ink);background:var(--motor-bg)}
.mc{border-left:3px solid var(--motor-ink)}
.mc-head{margin:0 0 4px}.mc dl{display:grid;grid-template-columns:auto minmax(0,1fr);gap:2px 10px;margin:6px 0}.mc dd{margin:0;min-width:0}
.mc code{overflow-wrap:anywhere}
.mc.compact{padding:2px 0 2px 10px;margin:4px 0}
.sev-icon::before{margin-right:4px}
.b-critico.sev-icon::before{content:"⛔"}.b-aviso.sev-icon::before{content:"⚠"}.b-nota.sev-icon::before{content:"ℹ"}
.badge.sev-critico{color:var(--crit-ink);background:var(--crit-bg)}.badge.sev-aviso{color:var(--warn-ink);background:var(--warn-bg)}.badge.sev-nota{color:var(--note-ink);background:var(--note-bg)}
.card{background:var(--surface);border:1px solid var(--border);border-left:5px solid var(--border);border-radius:10px;margin:0 0 14px;min-width:0;scroll-margin-top:calc(var(--topbar-h) + 12px)}
.card.sev-critico{border-left-color:var(--crit)}
.card.sev-aviso{border-left-color:var(--warn)}
.card.sev-nota{border-left-color:var(--note-ink)}
.card>header{display:flex;flex-wrap:wrap;align-items:center;gap:8px 10px;padding:14px 20px 4px}
.card>header h1,.card>header h2,.card>header h3{margin:0;padding-bottom:0;border:0;font-size:1.08rem;flex:1 1 420px;min-width:0}
.card>header h1{font-size:1.3rem}
.card .code{font-size:.95rem}
.card .meta{padding:2px 20px 10px;font-size:.85rem;color:var(--muted)}
.card .impact{display:flex;gap:14px;align-items:flex-start;margin:0 20px 12px;padding:10px 14px;border-radius:8px;background:var(--warn-bg)}
.card.sev-critico .impact{background:var(--crit-bg)}
.card .impact h4,.card .impact h3,.card .impact h2{margin:2px 0 0;padding-bottom:0;border:0;flex:0 0 auto;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--warn-ink);white-space:nowrap}
.card.sev-critico .impact h4,.card.sev-critico .impact h3,.card.sev-critico .impact h2{color:var(--crit-ink)}
.card .impact .txt{min-width:0}.card .impact .txt p{margin:0 0 4px}.card .impact .txt ul{margin:2px 0 4px;padding-left:20px}
.card .impact.missing{background:var(--surface-2)}
@media (max-width:700px){.card .impact{flex-direction:column;gap:4px}}
.card .cols{display:grid;grid-template-columns:1fr;border-top:1px solid var(--border)}
@media (min-width:1300px){.card .cols{grid-template-columns:1.4fr 1fr 1fr}.card .col+.col{border-left:1px solid var(--border)}}
.card .col{padding:12px 20px;min-width:0}
.card .col h4{margin:0 0 6px;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.card .col code{font-size:.84em}
.card .col p{margin:0 0 8px}.card .col ul{margin:0 0 8px;padding-left:20px}.card .col li{margin:3px 0}
.card>footer{display:flex;flex-wrap:wrap;gap:6px 28px;align-items:center;padding:10px 20px;border-top:1px solid var(--border);background:var(--surface-2);border-radius:0 0 10px 0;font-size:.88rem}
.card>footer .k{color:var(--muted);margin-right:6px}.card>footer .actions{margin-left:auto;display:flex;gap:8px;align-items:center}
.tablewrap,.tw{overflow-x:auto;border:1px solid var(--border);border-radius:10px;background:var(--surface)}
table{border-collapse:collapse;width:100%;font-size:.88rem}
th,td{text-align:left;padding:8px 12px;border-bottom:1px solid var(--border);vertical-align:top}
th{font-size:.74rem;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);background:var(--surface-2);white-space:nowrap}
tr:last-child td{border-bottom:0}
td.nowrap{white-space:nowrap}td.num{text-align:right;font-variant-numeric:tabular-nums}
.seg{display:inline-flex;border:1px solid var(--border);border-radius:7px;overflow:hidden}
.seg button{border:0;border-radius:0;background:var(--surface);color:var(--muted);padding:5px 12px;font:inherit;font-size:.85rem;cursor:pointer}
.seg button+button{border-left:1px solid var(--border)}
.seg button[aria-pressed="true"]{background:var(--accent);color:var(--on-accent)}
/* Phones: the five segments (with Aparcados) get their own full-width row, tighter buttons sharing it; they wrap rather than clip on anything narrower than 360 px. */
@media (max-width:479.98px){.seg{display:flex;flex:1 1 100%;flex-wrap:wrap}.seg button{flex:1 1 auto;padding:5px 6px;font-size:.8rem;white-space:nowrap}}
/* Puntos: filter bar, active-filter chips and the report's list table (D11 whole-row click, D12 sticky header ≥900 px). */
.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:8px 10px;margin:12px 0 0;min-width:0}
.toolbar .search{flex:1 1 320px;min-width:0}
.toolbar input,.toolbar select{font:inherit;font-size:.88rem;color:var(--text);background:var(--surface);border:1px solid var(--border);border-radius:7px;padding:5px 9px;max-width:100%}
.toolbar .compact{width:9em}
.toolbar .check{display:inline-flex;gap:6px;align-items:center;font-size:.88rem;white-space:nowrap;cursor:pointer}
.toolbar .check input{padding:0;margin:0}
.toolbar .sort{display:inline-flex;gap:6px;align-items:center;color:var(--muted);font-size:.85rem}
/* QA 8: the Puntos selects fold into "Filtros (n)" below 900 px; from 900 px the fold disappears (summary hidden, content always laid out in the toolbar). */
.ffold{flex:1 1 100%;min-width:0}
.ffold>summary{cursor:pointer;color:var(--muted);font-size:.88rem;padding:2px 0}
.ffold-body{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px;min-width:0}
/* Only where ::details-content works: elsewhere (older browsers) the closed fold keeps its summary, a working "Filtros" toggle. */
@supports selector(::details-content){@media (min-width:900px){.ffold{display:contents}.ffold>summary{display:none}.ffold::details-content{display:contents;content-visibility:visible}.ffold-body{display:contents}}}
@media (max-width:899px){.kpis[data-testid=item-kpis]{display:none}}
.activefilters{display:flex;flex-wrap:wrap;gap:8px 10px;align-items:center;margin:10px 2px;font-size:.88rem}
.fchip{display:inline-flex;align-items:center;gap:4px;background:var(--note-bg);color:var(--note-ink);border-radius:999px;padding:1px 4px 1px 10px;font-size:.8rem}
.fchip button{border:0;background:none;color:inherit;padding:0 4px;font-size:.8rem}
table.list tbody tr.sev-critico td:first-child{box-shadow:inset 4px 0 0 var(--crit)}
table.list tbody tr.sev-aviso td:first-child{box-shadow:inset 4px 0 0 var(--warn)}
table.list tbody tr.sev-nota td:first-child{box-shadow:inset 4px 0 0 var(--note-ink)}
table.list tbody tr:hover{background:var(--surface-2)}
table.list tbody tr[data-row-link]{cursor:pointer}
table.list td.repos .chip{margin-right:4px}
a.title{color:var(--text);font-weight:550}
a.kpi{color:inherit}a.kpi:hover{text-decoration:none;border-color:var(--accent)}
/* Guard cards (GuardCard): Esperado / Obtenido stacked, side by side from 1100 px. */
.gcard .cols.g2{display:grid;grid-template-columns:1fr}
@media (min-width:1100px){.gcard .cols.g2{grid-template-columns:1fr 1.6fr}.gcard .cols.g2 .col+.col{border-left:1px solid var(--border)}}
/* Guard ficha (T7): Qué protege / Cómo se comprueba stack full width, never with the .cols divider (R14). */
.card .gstack{border-top:1px solid var(--border)}
.card .gstack>.col+.col{border-left:0}
/* Fichas (T7, T8): one column; from 1500 px the card and a sticky 360 px side column (owner, items, Admin, sources). */
.detail{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;align-items:start}
.detail>*{min-width:0;margin-top:0}
/* From 1500 px the side column spans the three main rows; rows auto auto 1fr, so a taller side column grows only the last
   one (no gaps between card, verification and conversation). */
@media (min-width:1500px){
  .detail{grid-template-columns:minmax(0,1fr) 360px;grid-template-rows:auto auto 1fr}
  .detail>*{grid-column:1}
  .detail-side{grid-column:2;grid-row:1 / span 3;position:sticky;top:calc(var(--topbar-h) + 12px);max-height:calc(100vh - var(--topbar-h) - 24px);overflow:auto}
}
.detail-side .box{margin:0 0 12px}
/* Item ficha (T8): breadcrumbs with the pager, suggestions, the owner picker, actions and commits in the side column. */
.crumbs{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}.pager{margin-left:auto;display:flex;gap:6px}
.sugg{border:1px solid var(--border);border-radius:8px;padding:8px 10px;margin:8px 0;background:var(--surface-2)}
.sugg-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.sugg-h button{margin-left:auto}
.sig{font-size:.72rem;color:var(--muted)}.sugg-r{font-size:.83rem;color:var(--muted);margin-top:4px}.sugg-r p{margin:0}
.commits{display:flex;flex-wrap:wrap;gap:6px}.commit{font-family:ui-monospace,Consolas,monospace;font-size:.8rem}
fieldset.picker{margin:8px 0;align-items:center}fieldset.picker select,fieldset.picker input{min-width:0;flex:1 1 160px}
.detail-side .actions{display:flex;flex-wrap:wrap;gap:6px}
.detail-side .decision{margin:8px 0;padding:8px 10px;border-radius:8px;background:var(--surface-2);overflow-wrap:anywhere}
.detail-side .decision p{margin:4px 0 0}
/* Iteration 6: "Cambios por revisar" under the ficha's header and the engine's reports in the timeline. C4: the section is
   .changes, the commit list inside each report is .change-list (it never takes the section's border). */
.changes{border-left:3px solid var(--chg-ink);padding:4px 12px;margin:12px 0}
.change-list{margin:4px 0;padding-left:18px}
.change-list .commit{overflow-wrap:anywhere}
.event.ev-cambios{border-left:3px solid var(--chg-ink);padding-left:8px;color:var(--text);margin:6px 0 6px 12px;font-size:.88rem}
/* Iteration 7, the ficha: the lifecycle strip in the card, then the "Conversación" / "Historial" tabs (links: the tab lives
   in the URL). Tabs are 44 px touch targets (R4) and share the row on a phone; the strip stacks under 600 px. */
.lifecycle ol{display:flex;flex-wrap:wrap;gap:4px 18px;list-style:none;margin:8px 0;padding:0}
.lifecycle li{position:relative;padding-left:14px}
.lifecycle li::before{content:"";position:absolute;left:0;top:.45em;width:8px;height:8px;border-radius:50%;background:var(--muted)}
.ms-done::before{background:var(--ok-ink)}
.ms-parked::before{background:var(--muted)}
.ms-reopen::before{background:var(--crit-ink, var(--accent))}
.lifecycle p{margin:4px 0 8px;color:var(--muted);font-size:.88rem}
.tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin:16px 0 8px}
.tabs a{padding:11px 14px;min-height:44px;display:flex;align-items:center;text-decoration:none;color:var(--muted);border-bottom:2px solid transparent}
.tabs a:hover{text-decoration:none;color:var(--text)}
.tabs a[aria-current=page]{color:var(--text);border-bottom-color:var(--accent);font-weight:600}
.hist-filters{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 12px}
.hist-filters a{display:inline-flex;align-items:center;min-height:44px;padding:5px 14px;border-radius:999px;border:1px solid var(--border);color:var(--muted);font-size:.85rem}
.hist-filters a:hover{text-decoration:none;color:var(--text)}
.hist-filters a[aria-current=page]{color:var(--text);background:var(--surface-2);font-weight:600}
.conv-line{color:var(--muted);font-size:.88rem;margin:6px 0 6px 12px}
.hist{margin:6px 0;font-size:.9rem;min-width:0}
.hist-head{color:var(--muted);font-size:.85rem}
.hist summary{cursor:pointer;color:var(--muted)}
.sigue-line{color:var(--muted);font-size:.85rem;margin:2px 0 2px 14px}
.diff{margin:2px 0 2px 12px;min-width:0;overflow-wrap:anywhere}
.diff del{color:var(--muted)}
.diff ins{text-decoration:none;font-weight:600}
.diff code{overflow-wrap:anywhere}
.diff .k,.mc .k{color:var(--muted);font-size:.85rem;margin:6px 0 0}
@media (max-width:599.98px){.lifecycle ol{flex-direction:column;gap:2px}}
@media (max-width:479.98px){.tabs a{flex:1 1 50%;justify-content:center;text-align:center}}
.card>footer .closes{display:flex;flex-wrap:wrap;gap:4px 0;align-items:baseline}.card>footer .closes p{margin:0}
details.box>summary{cursor:pointer}
/* The "…with a reason" dialog (ReasonDialog, D8). */
dialog{border:1px solid var(--border);border-radius:12px;background:var(--surface);color:var(--text);padding:0;width:min(560px,94vw);max-height:90vh}
dialog::backdrop{background:rgba(0,0,0,.45)}
dialog>header{display:flex;align-items:center;gap:10px;padding:14px 20px;border-bottom:1px solid var(--border)}
dialog>header h3{margin:0;font-size:1.05rem;flex:1}
dialog .body{padding:14px 20px;overflow:auto;max-height:calc(90vh - 64px)}
dialog.reason textarea{width:100%;min-height:120px;font:inherit;background:var(--surface-2);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 10px}
/* Puntos asociados in the side column: code, status and owner, the title wrapping below. */
.glist{list-style:none;margin:0;padding:0}
.glist li{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:6px 0;border-top:1px solid var(--border);min-width:0;overflow-wrap:anywhere}
.glist li:first-child{border-top:0}
.glist .gltitle{flex:1 0 100%;min-width:0;font-size:.88rem}
/* Guardas (D13, mockup 5): the guards that need nothing, a compact grid per tema with a status dot. */
.gridlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(420px,100%),1fr));gap:4px 18px;margin-top:10px}
.gridlist a{color:var(--text);font-size:.88rem;display:flex;gap:8px;align-items:center;padding:3px 0;min-width:0}
.gridlist .gtitle{min-width:0;overflow-wrap:anywhere}
.okdot{width:8px;height:8px;border-radius:50%;background:var(--ok-ink);flex:0 0 auto}.okdot.no_verificable{background:var(--other)}.okdot.rota{background:var(--crit)}
details.tema>summary{cursor:pointer;color:var(--text)}
/* Bandeja (T12, D2/D4/D7): the queue and the selected item's detail side by side from 1300 px; a queue row is about 29 px,
   so 40 items fit in two screens at 1440 px. The selected row scrolls into view below the sticky bar (R26). */
.triage{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;align-items:start}
@media (min-width:1300px){.triage{grid-template-columns:minmax(380px,34%) minmax(0,1fr)}.qdetail{position:sticky;top:calc(var(--topbar-h) + 12px)}}
.queue{padding:0;overflow:hidden;margin:0}
.qhead{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--border);flex-wrap:wrap}
.qhead h1{font-size:1rem;margin:0}
.bulk{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:.82rem;color:var(--muted)}
.qlist{list-style:none;margin:0;padding:0}
.qlist li{display:flex;gap:8px;align-items:center;padding:0 14px;border-bottom:1px solid var(--border);font-size:.86rem;line-height:1.3;scroll-margin-top:calc(var(--topbar-h) + 8px)}
.qlist li.sel{background:var(--note-bg);box-shadow:inset 3px 0 0 var(--accent)}
.qrow{flex:1;min-width:0;display:flex;gap:8px;align-items:center;padding:6px 0;border:0;background:none;color:var(--text);text-align:left;font:inherit;cursor:pointer}
.qrow .b-cambios{flex:none;padding:1px 7px}
.qt{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.qs{font-size:.78rem;white-space:nowrap}
.sevdot{width:9px;height:9px;border-radius:50%;flex:0 0 auto;background:var(--note-ink)}.sevdot.critico{background:var(--crit)}.sevdot.aviso{background:var(--warn)}
.queue .hint{padding:8px 14px;margin:0}
dialog .right .hint{margin:0 10px 0 0}
.qdetail{margin:0}.qbody{padding:4px 20px 14px}
@media (min-width:900px){
  .tablewrap.list{overflow:visible}
  table.list thead th{position:sticky;top:var(--topbar-h,0px);z-index:2}
}
code{font-family:ui-monospace,"Cascadia Code",Consolas,monospace;font-size:.86em;background:var(--surface-2);padding:1px 5px;border-radius:4px;overflow-wrap:anywhere}
/* Lists that reload: dimmed and not clickable while a slow load runs; at circuit start, header + "Cargando…" row at about the
   prerendered height (app.js sets --min-h-<key> from it). */
.list{transition:opacity .15s}.list.busy{opacity:.5}.list.busy tr{pointer-events:none}
.list.loading[data-min-key=items]{min-height:min(var(--min-h-items,0px),80vh)}.list.loading[data-min-key=guards]{min-height:min(var(--min-h-guards,0px),80vh)}
.list.loading[data-min-key=reviews]{min-height:min(var(--min-h-reviews,0px),80vh)}
.table-loading td,p.table-loading{color:var(--muted);font-style:italic;text-align:center;padding:24px}
.st-cerrado{color:var(--ok-ink);background:var(--ok-bg)}.st-reabierto{color:var(--crit-ink);background:var(--crit-bg)}.st-other{color:var(--muted);background:var(--surface-2)}
.filters{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0}.filters input,.filters select{padding:6px 8px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text)}
.error{color:var(--crit-ink)}.ok{color:var(--ok-ink)}.muted{color:var(--muted)}
main.auth{max-width:420px}main.auth label{display:block;margin:12px 0 4px}
main.auth input:not([type=hidden]){width:100%;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--surface);color:var(--text);font:inherit}
iframe.report{width:100%;height:calc(100vh - 140px);border:1px solid var(--border);border-radius:10px;background:#fff}
code.secret{display:inline-block;word-break:break-all;user-select:all;font-size:.95em;padding:4px 8px}
/* gráficas (del informe: docs/_templates/revision-commits.template.html) */
.charts{display:grid;grid-template-columns:1fr;gap:14px}
@media (min-width:1300px){.charts.two{grid-template-columns:1fr 1fr}}
.chart{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:14px 18px;min-width:0}
.chart h3{margin:0 0 2px;font-size:1rem}
.chart .sub{font-size:.84rem;color:var(--muted);margin-bottom:8px}
.chart svg{display:block;width:100%;height:auto;overflow:visible}
.chart svg text{fill:var(--muted);font-size:12px;font-family:inherit}
.chart svg text.val{fill:var(--text);font-weight:600}
.chart svg .gridline{stroke:var(--grid);stroke-width:1}
.chart svg .axis{stroke:var(--border);stroke-width:1}
.chart svg .hit{fill:transparent;cursor:default}
.chart svg .mark:hover,.chart svg .hit:hover+.mark{opacity:.85}
.chart details{margin:12px 0}.chart summary{cursor:pointer;color:var(--accent)}
.chart table{font-size:.88rem}td.num{text-align:right;font-variant-numeric:tabular-nums}
.legend{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:.84rem;margin:6px 0 2px}
.legend span{display:inline-flex;align-items:center;gap:6px}
.legend i{width:11px;height:11px;border-radius:3px;display:inline-block}
#tip{position:fixed;pointer-events:none;z-index:20;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 10px;font-size:.84rem;box-shadow:0 4px 18px rgba(0,0,0,.18);display:none;max-width:320px}
#tip b{display:block;margin-bottom:2px}
h1:focus{outline:none}
#blazor-error-ui{display:none;position:fixed;bottom:0;left:0;width:100%;padding:.6rem 1.25rem;background:var(--warn-bg);color:var(--text);box-shadow:0 -1px 2px rgba(0,0,0,.2);z-index:1000}
#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem}
/* Controls stay disabled until the circuit is interactive (and while an action runs). */
fieldset.plain{border:0;padding:0;margin:0;min-width:0}fieldset.filters{border:0;padding:0;min-width:0}
button:disabled,select:disabled,input:disabled,textarea:disabled{opacity:.6;cursor:not-allowed}
.connecting{color:var(--muted);font-size:.85rem;font-style:italic}.connecting.up{display:none}
.connecting .connect-reload{display:none}.connecting.failed{color:var(--danger,#c62828);font-style:normal}.connecting.failed .connect-reload{display:inline}
