/* El Aleph — v5, armazón y piezas reutilizables (design-handoff/design_handoff_aleph_v5).
   Fuente: los 6 .dc.html del handoff, fusionados y depurados:
   - se usa el nombre canónico .b--w (no el .b--l de v5-columna.dc.html, superado
     por todos los archivos posteriores y por el glosario del README);
   - .b--d solo aparecía en algunos artboards, se incluye para todos;
   - las clases de sección del handoff (.sec-v/.sec-t/.sec-g) se mapean aquí a
     los nombres reales ya definidos en tokens.css (.sec-eval/.sec-arcade/.sec-salas). */

/* [hidden] SIEMPRE gana: cualquier clase de acá que fije su propio `display`
   (.doors/.tiles con display:grid, etc.) tiene la MISMA especificidad que el
   [hidden] del user-agent stylesheet -- sin esta regla, la tarjeta/bloque
   "oculto" via `el.hidden = true` sigue pintándose igual (bug real: las
   puertas de estado vacío de Participantes se filtraban en un proyecto con
   participantes porque .doors{display:grid} le ganaba al [hidden] nativo).
   Los overrides puntuales de abajo (.screen-shell[hidden] etc.) quedan como
   estaban, redundantes pero inofensivos -- esta regla es la red de
   seguridad para cualquier clase que aún no tenga su propio override. */
[hidden]{display:none !important}

/* ── Riel — 74px, navegación fija de 5 destinos ─────────────────────────── */
.rail{position:sticky;top:0;width:78px;height:100vh;height:100svh;flex:none;background:var(--ink);display:flex;flex-direction:column;align-items:center;padding:15px 0 13px;gap:10px;overflow-y:auto;z-index:25}
.rail__nav-group{width:100%;min-height:0;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:clamp(9px,2.2vh,18px)}
.rail .nav-item{position:relative;width:52px;height:52px;min-height:52px;padding:0;display:grid;place-items:center;color:var(--slate);border-radius:15px;background:none;border:none;cursor:pointer}
.rail .nav-icon{display:grid;place-items:center;width:27px;height:27px}
.rail .nav-icon svg{width:25px;height:25px;stroke:currentColor;fill:none;stroke-width:1.65;stroke-linecap:round;stroke-linejoin:round}
.rail .nav-label{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.rail .nav-item:hover{color:#fff;background:rgba(255,255,255,.065)}
.rail .nav-item--active{color:#fff;background:rgba(255,255,255,.11);box-shadow:inset 0 0 0 1px rgba(255,255,255,.06)}
.rail .nav-item--active .nav-icon{color:var(--c-l)}
.rail__utilities{display:flex;flex:none;flex-direction:column;align-items:center;gap:10px}
/* Selector ES/EN del riel (pedido explícito -- ninguno de los 6 artboards
   del handoff lo dibuja, sólo los 5 destinos fijos). style/layout.css ya
   define .babel-language-switcher/.lang-btn para el sidebar viejo, ancho
   -- acá dentro del riel de 74px los dos botones apilan en vez de ir lado a
   lado, y toman el mismo lenguaje visual que .nav-item (mayúscula fina,
   estado activo = fondo translúcido + texto blanco). */
.rail .babel-language-switcher{width:62px;display:grid;grid-template-columns:1fr 1fr;gap:3px;margin:0;padding:3px;border-radius:11px;background:rgba(255,255,255,.045)}
.rail .babel-language-switcher .lang-btn{min-width:0;background:none;border:none;border-radius:8px;color:var(--slate);font:650 9px var(--s);letter-spacing:.03em;padding:7px 0}
.rail .babel-language-switcher .lang-btn:hover{color:#fff;border-color:transparent}
.rail .babel-language-switcher .lang-btn.active{color:#fff;background:rgba(255,255,255,.09)}

/* ── Armazón riel+columna+trabajo de una pantalla ─────────────────────────
   El riel ya es global (index.html); esto envuelve el par columna+trabajo
   que cada template arma dentro de #app. #app es flex-column con
   align-items:center (layout.css) -- sin width:100%/align-self:stretch acá,
   el armazón quedaría encogido a su contenido en vez de ocupar el ancho
   disponible, igual que ya resuelve .content con las mismas propiedades. */
.screen-shell{display:flex;width:100%;align-self:stretch;min-height:100%}
.screen-shell[hidden]{display:none}
/* Envoltorio transparente al layout para pantallas con más de un
   `.screen-shell` baked-in (p. ej. try-test.html: selección/resultado) —
   deja a `.screen-shell` como hijo flex directo de #app, igual que en una
   pantalla de un solo estado. */
.try-test-page{display:contents}
@media (max-width:900px){
  .screen-shell{flex-direction:column}
  .screen-shell>.spine{width:100%;min-height:0}
  /* Los `.doors` de cada template fijan su propio grid-template-columns
     inline (p. ej. "1.1fr 1fr 1fr" en Inicio) para el layout de escritorio
     del handoff — sin esta regla, ese grid no colapsa en pantallas angostas
     y desborda horizontalmente (confirmado: body.scrollWidth 619px a
     320px de viewport). El !important es necesario para ganarle al estilo
     inline. El tratamiento fino por puerta (p. ej. Inicio: "Probar un test"
     completa, "Evaluar"/"Entrenar" compactas) es trabajo de la Fase 6
     ("pasada móvil") — esto es el piso que evita el desborde mientras tanto. */
  .doors{grid-template-columns:1fr !important}
}

/* ── Columna (spine) — 344px, específica de cada pantalla ───────────────── */
.spine{width:var(--spine);flex:none;background:var(--ink);color:#fff;display:flex;flex-direction:column;min-height:100%}
.spine__in{padding:28px 26px 24px;display:flex;flex-direction:column;flex:1;justify-content:space-between;gap:24px}
@media (min-width:901px){
  .screen-shell>.spine{position:sticky;top:0;align-self:flex-start;height:100vh;height:100svh;min-height:0;overflow-y:auto;overscroll-behavior:contain}
  .screen-shell>.spine>.spine__in{min-height:100%}
}
.crumb{font:600 11px var(--s);letter-spacing:.1em;text-transform:uppercase;color:var(--slate);margin:0 0 12px}
.crumb a{color:var(--c-l)}
/* El markup real usa <button data-nav> en vez de <a href> (el router navega
   en JS, no por URL) -- mismo tratamiento visual que .crumb a. */
.crumb button{background:none;border:none;padding:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:var(--c-l);cursor:pointer}
.eyeb{font:600 10.5px var(--s);letter-spacing:.14em;text-transform:uppercase;color:var(--c-l);margin:0 0 13px}
.disp{font:600 30px/1.18 var(--s);letter-spacing:-.032em;margin:0;color:#fff}
.disp span{color:var(--c-l)}
.sub{font:400 13.5px/1.6 var(--s);color:#a9bccf;margin:13px 0 0}
.tiles{display:grid;grid-template-columns:1fr 1fr 1fr;gap:7px;margin-top:20px}
.tile{background:rgba(255,255,255,.07);border-radius:12px;padding:12px 13px}
.tile b{display:block;font:600 22px var(--s);letter-spacing:-.02em;color:#fff}
.tile span{font:400 10.5px var(--s);color:var(--slate)}
.tile--c{background:color-mix(in srgb,var(--c) 34%,transparent)}
.tile--c span{color:#eaf0fb}
.gl{height:4px;border-radius:var(--r-pill);background:rgba(255,255,255,.14);overflow:hidden;margin-top:10px}
.gl>i{display:block;height:4px;border-radius:var(--r-pill);background:var(--c-l)}
.spb{display:flex;flex-direction:column;gap:8px;margin-top:20px}
.dom{padding-top:18px;border-top:1px solid rgba(255,255,255,.12)}
.dom+.flow,.tiles+.dom,.spb+.dom{margin-top:22px}
.dm{display:flex;align-items:center;gap:11px;padding:9px 0}
.dm+.dm{border-top:1px solid rgba(255,255,255,.08)}
.dm b{flex:1;font:600 13px var(--s);color:#fff}
.dm i{font:400 11.5px var(--s);font-style:normal;color:var(--slate);font-variant-numeric:tabular-nums}
.flow{padding-top:20px;margin-top:20px;border-top:1px solid rgba(255,255,255,.12)}
.flow__t{font:600 10.5px var(--s);letter-spacing:.13em;text-transform:uppercase;color:var(--slate);margin:0 0 12px}
.flow__l{display:flex;align-items:center;gap:4px}
.flow__l span{flex:1;height:3px;border-radius:var(--r-pill);background:rgba(255,255,255,.14)}
.flow__l span.on{background:var(--c)}
.flow__l span.dn{background:var(--mint)}
.flow__n{display:flex;justify-content:space-between;gap:6px;margin-top:9px}
.flow__n em{font:600 10.5px var(--s);font-style:normal;color:var(--slate);flex:1}
.flow__n em.on{color:#fff}

/* ── Área de trabajo ──────────────────────────────────────────────────── */
.work{flex:1;min-width:0;background:var(--paper);display:flex;flex-direction:column}
.wnav{flex:none;display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:18px 26px 0}
.wn{font:600 12px var(--s);color:var(--muted);padding:7px 14px;border-radius:var(--r-pill);background:none;border:none;cursor:pointer}
.wn--on{color:#fff;background:var(--c-d)}
/* El contador ".fnt.fig" de una píldora de dominio fija su propio color
   (var(--muted)) sin heredar el blanco de .wn--on -- misma familia de bug
   que domain-filter-btn (Fase de fidelidad 2): un hijo con color propio no
   seguía el estado activo del padre. */
.wn--on .fnt{color:#fff}
.wbody{padding:20px 26px 28px;display:flex;flex-direction:column;gap:20px}
.ask{font:600 19px var(--s);letter-spacing:-.02em;margin:0 0 14px;color:var(--text)}

/* ── Bloque, fila, etiqueta ───────────────────────────────────────────── */
/* flex-shrink:0: dentro de un contenedor columna con overflow (p.ej. .tdlg__body
   en la ficha .sheet), un .blk es contenido a mostrar completo con scroll, nunca
   algo que el flexbox deba comprimir para caber. */
/* --white (#fff) sobre --paper (#f7f7f5) es ~1.04:1 de contraste real --
   básicamente invisible sin ayuda (verificado con estilos computados, no es
   un bug de cascada: --paper/--white resuelven bien en todos los .work/
   .wbody probados). El propio .dc.html del handoff define el mismo par de
   colores sin borde, así que ahí tampoco se vería -- se añade un borde real
   de 1px con --hair (el mismo tono que ya separa filas .it/.mrow en toda la
   app) para que el contorno sea visible de verdad, en vez de perseguir un
   contraste de fondo que nunca va a leerse. */
.blk{border-radius:var(--r-blk);overflow:hidden;background:var(--white);border:1px solid var(--hair);flex-shrink:0}
.blk--t{background:var(--c-s)}
.blk__h{display:flex;align-items:baseline;justify-content:space-between;gap:18px;padding:14px 20px;background:var(--paper-2)}
.blk--t .blk__h{background:color-mix(in srgb,var(--c) 13%,var(--white))}
.wt{font:600 12.5px var(--s);letter-spacing:.02em;margin:0;color:var(--text)}
.mut{font:400 12.5px var(--s);color:var(--muted);margin:0}
.fnt{font:400 11.5px var(--s);color:var(--muted);margin:0}
.tiny{font:600 10px var(--s);letter-spacing:.13em;text-transform:uppercase;color:var(--muted);margin:0}
.it{display:grid;align-items:center;gap:18px;padding:14px 20px}
.it+.it{border-top:1px solid var(--hair)}
.blk--t .it+.it{border-top:1px solid rgba(27,31,36,.07)}
.nm{font:600 14.5px var(--s);letter-spacing:-.01em;margin:0}
.lab{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:var(--r-pill);font:600 11.5px var(--s)}
.lab--ok{background:var(--ok-s);color:var(--ok-d)}
.lab--w{background:var(--warn-s);color:var(--warn-d)}
.lab--a{background:var(--acc-s);color:var(--acc-d)}
.lab--v{background:var(--vio-s);color:var(--vio-d)}
.lab--t{background:var(--teal-s);color:var(--teal-d)}
.lab--r{background:var(--red-s);color:var(--red-d)}
.lab--n{background:var(--paper-2);color:var(--muted)}

/* ── Aviso inline ──────────────────────────────────────────────────────── */
/* Caja de aviso genérica (validación, error de red, nota de privacidad).
   Componente compartido entre varias pantallas -- por eso vive acá y no en
   style/activities.css, aunque haya nacido ahí. */
.activity-alert{margin:16px 0;padding:13px 16px;border-radius:var(--r-fld);border:1px solid color-mix(in srgb,var(--acc-d) 30%,transparent);color:var(--acc-d);background:var(--acc-s)}
.activity-alert--error{border-color:color-mix(in srgb,var(--red-d) 30%,transparent);color:var(--red-d);background:var(--red-s)}
.activity-alert--success{border-color:color-mix(in srgb,var(--ok-d) 30%,transparent);color:var(--ok-d);background:var(--ok-s)}

/* ── Botones, campos ──────────────────────────────────────────────────── */
.b{display:inline-flex;align-items:center;gap:7px;border:none;background:var(--paper-2);color:var(--text);border-radius:var(--r-fld);padding:9px 17px;font:600 12.5px var(--s);white-space:nowrap;cursor:pointer}
/* [hidden] pierde contra el display:inline-flex de arriba sin este override --
   mismo problema ya resuelto para .frame/.screen-shell más abajo en este
   archivo. Sin esto, cualquier botón .b oculto vía `.hidden = true` (p.ej. los
   de la carpeta de respaldo automático en settings.js, o "Conectar una
   cuenta") queda visible igual. */
.b[hidden]{display:none}
.b--p{background:var(--c-d);color:#fff}
.b--w{background:#fff;color:var(--c-d)}
.b--g{background:rgba(255,255,255,.14);color:#fff}
.b--q{background:transparent;color:var(--muted);padding:9px 6px}
.b--s{padding:6px 13px;font-size:11.5px}
.b--d{background:var(--red-s);color:var(--red-d)}
.fld{background:var(--white);border:1px solid var(--hair);border-radius:var(--r-fld);padding:11px 14px;font:400 13.5px var(--s);color:var(--text)}
/* select.fld: mismo campo, con flecha propia en vez del control nativo del
   navegador (appearance:none lo deja sin ningún indicador) -- sigue siendo
   un <select> real, sólo se le redibuja la flecha. */
select.fld.fld{appearance:none;padding-right:36px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='8'%3E%3Cpath d='m1 1 6 6 6-6' fill='none' stroke='%235b6470' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;background-size:14px 8px}
.fldl{background:var(--paper-2);border:none;border-radius:var(--r-fld);padding:11px 14px;font:400 13.5px var(--s);color:var(--text)}

/* ── Marcador de dominio, chip, medidor ───────────────────────────────── */
.dot{width:9px;height:9px;border-radius:50%;flex:none;display:inline-block}
.chipc{width:34px;height:34px;border-radius:var(--r-ico);display:grid;place-items:center;font:600 12px var(--s);flex:none;color:#fff}
.gauge{height:8px;border-radius:var(--r-pill);background:var(--paper-2);overflow:hidden}
.blk--t .gauge{background:var(--white)}
.gauge>i{display:block;height:8px;border-radius:var(--r-pill);background:var(--c)}

/* ── Puerta — decisión principal, sobre color pleno ──────────────────── */
.doors{display:grid;gap:14px}
.door{border-radius:var(--r-blk);padding:20px;display:flex;flex-direction:column;gap:7px;color:#fff}
.door--a{background:var(--acc-d)}
.door--v{background:var(--vio-d)}
.door--t{background:var(--teal-d)}
.door--g{background:var(--ok-d)}
.door__ic{width:36px;height:36px;border-radius:var(--r-ico);background:rgba(255,255,255,.22);display:grid;place-items:center;font:600 15px var(--s);margin-bottom:5px;color:#fff}
.door__k{font:600 10.5px var(--s);letter-spacing:.12em;text-transform:uppercase;color:#fff;margin:0}
.door__t{font:600 25px/1.15 var(--s);letter-spacing:-.03em;margin:0;color:#fff}
.door__d{font:400 12.5px/1.55 var(--s);color:#fff;margin:3px 0 14px}

/* Puerta radio-driven (selector de modalidad, 10a): el estado checked del
   input decide el color, sin JS -- ver Nuevo proyecto / Crear sala. */
.door-pick{cursor:pointer;border-radius:var(--r-blk);padding:20px;display:flex;flex-direction:column;gap:7px;background:var(--white);color:var(--text);position:relative}
.door-pick input{position:absolute;inset:0;opacity:0;margin:0;cursor:pointer}
.door-pick .door__ic{background:var(--paper-2);color:var(--muted)}
.door-pick .door__k{color:var(--muted)}
.door-pick .door__t{color:var(--text)}
.door-pick .door__d{color:var(--muted)}
.door-pick:has(input:checked){background:var(--c-d);color:#fff}
.door-pick:has(input:checked) .door__ic{background:rgba(255,255,255,.22);color:#fff}
.door-pick:has(input:checked) .door__k,.door-pick:has(input:checked) .door__t,.door-pick:has(input:checked) .door__d{color:#fff}

/* Puerta de código de sala (Recepción, auth.html) expandida en el lugar --
   mismo tratamiento "translúcido sobre color pleno" que .b--g, ahora sobre
   inputs (.fld) en vez de botones, para que el formulario de
   helpers/screens/activities.js#bindActivityJoinFlow se lea igual de bien
   ahí que en style/activities.css sobre fondo claro. */
[data-auth-code-door] .fld{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.32);color:#fff}
[data-auth-code-door] .fld::placeholder{color:rgba(255,255,255,.55)}
[data-auth-code-door] select.fld{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='8'%3E%3Cpath d='m1 1 6 6 6-6' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 14px center;background-size:14px 8px}
[data-auth-code-door] select.fld option{color:var(--text);background:#fff}
[data-auth-code-door] .activity-preview{color:var(--text)}
[data-auth-code-door] .b--q{background:rgba(255,255,255,.14);color:#fff}
.auth-code-form{display:grid;gap:16px;margin-top:14px}
.auth-code-form[hidden]{display:none}
.auth-code-form .field>span:first-child{margin-bottom:8px;font:600 12px/1.35 var(--s);color:#fff}
.auth-code-form .fld{width:100%;min-width:0;min-height:46px}
.auth-code-form .fld:focus-visible{outline:0;border-color:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.18)}
.auth-code-form__code{margin:0}
.auth-code-form__actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.auth-code-form__actions .b{min-height:42px}
.auth-code-form .activity-preview{margin:0;padding:15px 16px}
.auth-code-form__details.activity-demographics{display:grid;grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr);gap:16px 12px;margin:0;padding:18px;border:1px solid rgba(255,255,255,.22);border-radius:14px}
.auth-code-form__details legend{padding:0 7px;font:600 12px var(--s);color:#fff}
.auth-code-form__details .field{display:flex;flex-direction:column;min-width:0;margin:0}
.auth-code-form__details .field>.fld{margin-top:auto}
.auth-code-form__name{grid-column:1/-1}
.auth-code-form__name-control{display:grid!important;grid-template-columns:minmax(0,1fr) 46px;gap:10px;margin:0!important}
.auth-code-form__regenerate{width:46px;min-width:46px;height:46px;padding:0;justify-content:center;font-size:17px}
.auth-code-form__submit{justify-content:center;min-height:46px;background:var(--ok-d);color:#fff}
.auth-code-form__submit:disabled{opacity:.48}

/* ── Signo de interrogación, hueco de GIF, ficha modal ───────────────── */
.q{width:22px;height:22px;border-radius:50%;background:var(--paper-2);color:var(--muted);display:grid;place-items:center;font:600 12px var(--s);flex:none;border:none;cursor:pointer}
.q--on{background:var(--acc-d);color:#fff}
.gifslot{border-radius:12px;background:var(--ink);color:var(--slate);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;padding:20px;aspect-ratio:16/9}
.gifslot b{font:600 12px var(--s);color:#fff}
.gifslot p{font:400 11px var(--s);margin:0;max-width:32ch}
.sheet{width:min(920px,calc(100vw - 40px));max-width:100%;background:var(--paper);border-radius:var(--r-blk);overflow:hidden;box-shadow:0 24px 70px rgba(19,32,44,.3);display:flex;flex-direction:column}
/* .sheet-dialog: el <dialog> nativo que envuelve un .sheet (helpers/screens/instrument-sheet.js).
   dialog{border:none;padding:0} y dialog::backdrop ya están en historial.css. */
.sheet-dialog{max-height:90vh;background:transparent}
.sheet-dialog[open]{display:flex}
.sheet-dialog .tdlg__body{overflow-y:auto;min-height:0}

/* Ficha narrativa del instrumento. La cabecera y las superficies completas usan
   el color del dominio; no hay franjas ornamentales ni acentos laterales. */
.instrument-sheet{--instrument:var(--acc);--instrument-dark:var(--acc-d);--instrument-soft:var(--acc-s)}
.instrument-sheet__hero{display:flex;align-items:flex-start;gap:16px;padding:24px 26px;background:var(--instrument-dark);color:#fff;flex:none}
.instrument-sheet__hero-copy{min-width:0;flex:1}
.instrument-sheet__hero .door__k{opacity:.82}
.instrument-sheet__title{margin:4px 0 7px;font:650 clamp(23px,3vw,31px)/1.08 var(--s);letter-spacing:-.035em;color:#fff;text-wrap:balance}
.instrument-sheet__hero-meta{display:flex;align-items:center;gap:8px;font:500 11px var(--s);color:rgba(255,255,255,.78)}
.instrument-sheet__hero-meta .code{font-size:10px;color:#fff}
.instrument-sheet__close{width:44px;min-width:44px;height:44px;padding:0;border-color:transparent;background:rgba(255,255,255,.16);color:#fff;font-size:14px;display:grid;place-items:center;align-self:flex-start;flex:0 0 44px;line-height:1;box-sizing:border-box;margin:0;transform:none}
.instrument-sheet__close:hover{background:rgba(255,255,255,.26);color:#fff}
.instrument-sheet__body{padding:20px;display:flex;flex-direction:column;gap:16px}

.instrument-sheet__opening{display:grid;grid-template-columns:minmax(0,1.55fr) minmax(250px,.85fr);gap:16px;align-items:stretch}
.instrument-sheet__opening>*{min-width:0}
.instrument-sheet__preview{position:relative;width:100%;max-width:100%;min-width:0;margin:0;padding:0;box-sizing:border-box;display:block;overflow:hidden;background:var(--instrument-soft);border:1px solid color-mix(in srgb,var(--instrument) 24%,var(--hair));aspect-ratio:16/9;text-align:left}
.instrument-sheet__preview picture{display:block;width:100%;height:100%;min-width:0}
.instrument-sheet__preview img{display:block;width:100%;max-width:100%;min-width:0;height:100%;object-fit:cover}
.instrument-sheet__overview{display:flex;flex-direction:column;min-width:0;padding:20px;border:1px solid color-mix(in srgb,var(--instrument) 24%,var(--hair));border-radius:var(--r-blk);background:var(--instrument-soft);color:var(--text)}
.instrument-sheet__overview-top{display:flex;align-items:center;gap:9px;margin-bottom:18px}
.instrument-sheet__overview .door__k{color:var(--instrument-dark)}
.instrument-sheet__overview h3{margin:0 0 9px;font:650 21px/1.1 var(--s);letter-spacing:-.025em;color:var(--instrument-dark);text-align:left}
.instrument-sheet__overview>p{margin:0;font:400 12.5px/1.55 var(--s);color:var(--muted);text-align:left}
.instrument-sheet__section-number{width:28px;height:28px;border-radius:9px;display:grid;place-items:center;flex:none;background:var(--instrument-soft,var(--acc-s));color:var(--instrument-dark,var(--acc-d));font:750 10px var(--s);font-variant-numeric:tabular-nums}
.instrument-sheet__overview .instrument-sheet__section-number{background:var(--instrument-dark);color:#fff}
.instrument-sheet__domain-chip{display:inline-flex;align-items:center;gap:7px;align-self:flex-start;margin-top:auto;padding:7px 10px;border-radius:var(--r-pill);background:var(--instrument-dark);color:#fff;font:650 10.5px var(--s)}

.instrument-sheet__flow{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;align-items:start}
.instrument-sheet__section{min-width:0}
.instrument-sheet__section-head{justify-content:flex-start;align-items:center;gap:9px;background:var(--instrument-soft,var(--acc-s))}
.instrument-sheet__section-head .wt{color:var(--instrument-dark,var(--acc-d))}
.instrument-sheet :is(.tdlg__subhead,.instrument-sheet__reference-group h4){color:var(--instrument-dark,var(--acc-d));text-align:left}
.instrument-sheet__section-body{padding:17px 20px}
.instrument-sheet__section-body>.mut{line-height:1.58}
.instrument-score-variables{display:grid;gap:8px;margin-top:14px}
.instrument-score-variable{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:12px;padding:12px;border-radius:11px;background:var(--paper);border:1px solid var(--hair)}
.instrument-score-variable__copy{min-width:0}
.instrument-score-variable .nm{font-size:12.5px;color:var(--text)}
.instrument-score-variable .fnt{margin-top:3px;line-height:1.45}
.instrument-score-variable .lab{max-width:150px;background:var(--instrument-soft,var(--acc-s));color:var(--instrument-dark,var(--acc-d));white-space:normal;text-align:center;justify-content:center}

.instrument-sheet__evidence{display:grid;grid-template-columns:auto 1fr;gap:13px;align-items:start;padding:16px 18px;border-radius:var(--r-blk);background:var(--evidence-soft);color:var(--evidence)}
.instrument-sheet__evidence-icon{width:30px;height:30px;border-radius:10px;display:grid;place-items:center;background:var(--evidence);color:#fff;font:750 13px var(--s)}
.instrument-sheet__evidence .wt{margin:1px 0 4px;color:var(--instrument-dark)}
.instrument-sheet__evidence .mut{color:var(--evidence);line-height:1.5}
.instrument-sheet__bibliography .instrument-sheet__section-head{background:var(--instrument-soft)}
.instrument-sheet__bibliography .instrument-sheet__section-head .wt{color:var(--instrument-dark)}
.instrument-sheet__reference-body{padding:17px 20px;display:flex;flex-direction:column;gap:14px}
.instrument-sheet__footer{display:flex;flex-wrap:wrap;gap:9px;justify-content:flex-end;padding:16px 20px;border-top:1px solid var(--hair);background:var(--white);flex:none}
.instrument-sheet__footer .b--p{background:var(--instrument-dark);border-color:var(--instrument-dark)}

/* Relato de cálculo compartido por Arcade y Actividades. Los títulos se
   alinean siempre a la izquierda y toman el color del dominio completo. */
.score-story{--score-gutter:clamp(26px,5.6cqw,42px);container-type:inline-size;min-width:0;overflow:hidden;border:1px solid color-mix(in srgb,var(--score-color) 24%,var(--hair));border-radius:var(--r-blk);background:#fff;box-shadow:0 8px 24px rgba(19,32,44,.05);text-align:left}
.score-story__header{display:grid;grid-template-columns:minmax(0,1fr) minmax(105px,auto);align-items:center;gap:14px;padding:20px var(--score-gutter);background:var(--score-dark);color:#fff;text-align:left}
.score-story__identity{display:grid;gap:2px;min-width:0;text-align:left}
.score-story__identity small{color:#fff;font-size:10px;font-weight:750;letter-spacing:.1em;text-transform:uppercase;opacity:.76}
.score-story__identity strong{overflow-wrap:anywhere;color:#fff;font-size:17px;line-height:1.25;text-align:left}
.score-story__identity i{color:#fff;font-size:10px;font-style:normal;opacity:.76}
.score-story__score{display:grid;justify-items:end;gap:3px;min-width:0;color:#fff;text-align:right}
.score-story__score b{max-width:100%;overflow-wrap:anywhere;font-size:clamp(24px,3.4cqw,31px);line-height:1}
.score-story__score small{max-width:130px;font-size:10px;font-weight:700;line-height:1.25}
.score-story__relevance{display:grid;gap:6px;padding:19px var(--score-gutter);background:var(--score-soft);color:var(--score-dark)}
.score-story__relevance>*{width:min(100%,780px);margin-inline:auto}
.score-story__relevance small{font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}
.score-story__relevance p{max-width:86ch;margin:0;color:var(--text);font-size:13px;line-height:1.55}
.score-story__project-norm{display:grid;grid-template-columns:minmax(190px,.8fr) minmax(0,2fr);align-items:center;gap:20px;padding:17px var(--score-gutter);border-top:1px solid color-mix(in srgb,var(--score-color) 18%,var(--hair));background:#fff}
.score-story__project-norm>header{display:grid;gap:3px}
.score-story__project-norm>header small{color:var(--score-dark);font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}
.score-story__project-norm>header p{margin:0;color:var(--muted);font-size:12px;line-height:1.45}
.score-story__project-norm>div{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:8px}
.score-story__project-norm>div>div{display:grid;align-content:center;gap:4px;min-width:0;min-height:58px;padding:10px 12px;border-radius:10px;background:var(--score-soft)}
.score-story__project-norm small{color:var(--score-dark);font-size:9px;font-weight:750;letter-spacing:.07em;text-transform:uppercase}
.score-story__project-norm strong{overflow-wrap:anywhere;color:var(--score-dark);font-size:14px;line-height:1.3}
.score-story__steps{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));align-items:start}
.score-story__steps>section{min-width:0;padding:24px var(--score-gutter);text-align:left}
.score-story__steps>section>*{width:min(100%,780px);margin-inline:auto;box-sizing:border-box}
.score-story__step--variables{grid-column:1/-1;border-bottom:1px solid var(--hair)}
.score-story__step--reading{border-left:1px solid var(--hair)}
.score-story__step-title{display:flex;align-items:center;gap:9px;margin-bottom:7px;text-align:left}
.score-story__step-title>span{display:grid;place-items:center;width:30px;height:30px;border-radius:9px;background:var(--score-soft);color:var(--score-dark);font:750 10px var(--s)}
.score-story__step-title h3{margin:0;color:var(--score-dark);font:700 15px/1.25 var(--s);text-align:left}
.score-story__steps p{margin:0;color:var(--muted);font:400 12.5px/1.55 var(--s);text-align:left}
.score-story__variables{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(190px,100%),1fr));align-items:start;gap:9px;margin:14px 0 0}
.score-story__variable{display:grid;align-content:start;gap:5px;min-width:0;padding:12px 13px;border-radius:10px;background:var(--paper);text-align:left}
.score-story__variable--derived{background:var(--score-soft)}
.score-story__variable dt{overflow-wrap:anywhere;color:var(--muted);font-size:10px;font-weight:750;line-height:1.35;letter-spacing:.06em;text-transform:uppercase}
.score-story__variable dd{margin:0;color:var(--score-dark);font-size:17px;font-weight:750;line-height:1.2;overflow-wrap:anywhere}
.score-story__variable p{margin:2px 0 0;color:var(--muted);font-size:11.5px;line-height:1.5}
.score-story__formula{margin-top:14px;padding:13px 14px;border-radius:10px;background:var(--score-soft);color:var(--score-dark);font-size:14px;font-weight:700;line-height:1.5;overflow-wrap:anywhere;text-align:left}
.score-story__result{display:flex;align-items:baseline;gap:4px;margin:12px 0 8px;color:var(--score-dark)}
.score-story__result strong{max-width:100%;overflow-wrap:anywhere;font-size:32px;line-height:1}
.score-story__result span{font-size:12px;font-weight:750;overflow-wrap:anywhere}
.score-story__context{border-top:1px solid var(--hair);background:var(--paper);text-align:left}
.score-story__context>summary{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:10px;padding:16px var(--score-gutter);cursor:pointer;list-style:none}
.score-story__context>summary::-webkit-details-marker{display:none}
.score-story__context>summary::marker{content:""}
.score-story__context>summary strong{color:var(--score-dark);font-size:12px;line-height:1.4}
.score-story__context>summary span{display:grid;place-items:center;width:25px;height:25px;border-radius:8px;color:var(--score-dark);background:var(--score-soft);font-size:10px;font-weight:800}
.score-story__context>summary i{display:grid;place-items:center;width:28px;height:28px;border-radius:9px;color:#fff;background:var(--score-dark);font-size:15px;font-style:normal;transition:transform .16s}
.score-story__context[open]>summary i{transform:rotate(180deg)}
.score-story__context>.score-story__variables{grid-template-columns:repeat(auto-fit,minmax(min(210px,100%),1fr));margin:0;padding:0 var(--score-gutter) 20px}
.score-story__context .score-story__variable{background:#fff}
.score-story__empty{margin:12px 0 0;color:var(--muted);font-size:11.5px}

.score-aggregate{overflow:hidden;border:1px solid color-mix(in srgb,var(--score-color) 24%,var(--hair));border-radius:var(--r-blk);background:#fff;text-align:left;box-shadow:0 8px 24px rgba(19,32,44,.05)}
.score-aggregate>header{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:19px 20px;background:var(--score-dark);color:#fff;text-align:left}
.score-aggregate>header span{display:grid;gap:3px;text-align:left}
.score-aggregate>header small{font-size:9px;font-weight:750;letter-spacing:.1em;text-transform:uppercase;opacity:.78}
.score-aggregate>header h2{margin:0;color:#fff;font:700 21px/1.15 var(--s);text-align:left}
.score-aggregate>header>strong{display:flex;align-items:baseline;gap:3px;font-size:31px}
.score-aggregate>header>strong i{font-size:10px;font-style:normal}
.score-aggregate__body{padding:17px 20px}
.score-aggregate__body>p{margin:0;color:var(--muted);font-size:12.5px;line-height:1.55;text-align:left}
.score-aggregate__contributors{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(190px,100%),1fr));gap:7px;margin-top:13px;min-width:0}
.score-aggregate__contributors>span{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:9px;min-width:0;padding:8px 10px;border-radius:10px;background:var(--score-soft);color:var(--score-dark)}
.score-aggregate__contributors i{min-width:0;overflow-wrap:anywhere;font-size:12px;font-style:normal;line-height:1.4;white-space:normal}
.score-aggregate__contributors b{font-size:14px}
.score-aggregate__note{display:block;margin-top:12px;color:var(--score-dark);font-size:12px;font-weight:700;line-height:1.5}

/* .rdlg ("result dialog", hallazgo B / §3.3): mismo espíritu que .sheet, pero
   con cabecera fija + cuerpo con scroll propio -- un resultado con perfil
   normativo completo (varias secciones .blk/.it/.tiles/.lab, a veces varias
   tarjetas seguidas) no cabe en el patrón de .sheet sin desplazar el título. */
.rdlg{width:680px;max-width:calc(100vw - 40px);max-height:min(760px,calc(100vh - 40px));background:var(--paper);border-radius:var(--r-blk);overflow:hidden;box-shadow:0 24px 70px rgba(19,32,44,.3);display:flex;flex-direction:column}
.rdlg-dialog{max-height:90vh;background:transparent}
.rdlg-dialog[open]{display:flex}
.rdlg__h{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:16px 20px;background:var(--paper-2);border-bottom:1px solid var(--hair);flex-shrink:0}
.rdlg__h h2{margin:0;font:600 16.5px var(--s);letter-spacing:-.01em;color:var(--text)}
.rdlg__body{padding:20px;overflow-y:auto;min-height:0;flex:1;display:flex;flex-direction:column;gap:14px}
.rdlg__body>.score-story{flex-shrink:0}

/* Ficha de participante: una fila de resultado completa funciona como botón
   sin recuperar la apariencia del botón nativo ni el sistema de cards viejo. */
.participant-task{width:100%;grid-template-columns:minmax(190px,1.5fr) repeat(3,auto) auto;border:0;background:var(--white);color:var(--text);text-align:left;font-family:var(--s);cursor:pointer}
.participant-task:hover{background:var(--paper)}
.participant-task:focus-visible{position:relative;z-index:1;outline:2px solid var(--acc);outline-offset:-2px}

/* ── Móvil — riel/columna colapsan a barra inferior + cabecera apilada ────
   Fase 6 ("pasada móvil"): el handoff describe .rail/.spine colapsando a un
   `.mbar`+`.msp` con markup PROPIO y separado. La app real ya tenía, desde
   antes del rediseño, una solución de barra inferior probada:
   `style/responsive.css` reconvierte el propio `.rail` en una barra fija
   abajo (position:fixed;bottom:0) bajo los 700px, reusando el mismo markup
   de siempre (mismos 5 `.nav-item`, sin duplicar nada). Con exactamente 5
   destinos reales hoy (Inicio/Proyectos/Arcade/Salas/Ajustes — igual que el
   `.mbar` del handoff), el botón "Más" que antes escondía Arcade/Salas
   detrás de un diálogo quedó redundante y se retiró (ver commit): los 5
   caben directos en la barra, que es exactamente lo que pide el mockup.
   Por eso NO se agrega markup `.mbar` nuevo -- sería una segunda barra de
   navegación peleando con la que ya funciona. Mismo criterio para `.msp`:
   en vez de duplicar cada `.spine` de cada pantalla en una versión "apilada"
   paralela, `.spine` se reapila con las mismas clases hijas
   (.crumb/.eyeb/.disp/.sub/.tiles/.dom/.flow) bajo el breakpoint de abajo --
   un reflow con CSS, no un segundo componente. `.mst` (el reloj falso
   "9:41" del mockup) es una convención de la herramienta de diseño para
   mostrar "esto es un teléfono", no algo que la app real deba renderizar
   -- se omite a propósito. */
@media (max-width:900px){
  .spine__in{padding:20px 20px 22px;gap:16px}
  .disp{font-size:25px}
  .tiles{margin-top:16px}
  .spb{margin-top:16px}
  .dom{padding-top:14px}
  .dom+.flow,.tiles+.dom,.spb+.dom{margin-top:16px}
  .flow{padding-top:16px;margin-top:16px}
  /* Filas densas (tablas de participantes, por-test, catálogo, historial):
     "pierden columnas hasta dejar nombre + estado" (README §Móvil). Sin
     tratamiento fila-a-fila (fuera de alcance de esta pasada), el piso que
     evita desborde horizontal es apilar todo `.it` a una columna, mismo
     precedente que `.doors` (Fase 1/3) y `.doors` en `.screen-shell` arriba. */
  .it{grid-template-columns:1fr !important}
  .rdlg__h{padding:14px 16px}
  .rdlg__body{padding:16px}
  .instrument-sheet__opening{grid-template-columns:1fr}
  .instrument-sheet__overview{min-height:230px}
}

/* Todo lo pulsable mide al menos 44px en móvil (README §Móvil). */
@media (max-width: 640px) {
  .q{width:44px;height:44px;font-size:15px}
  .b--s{padding:12px 16px;font-size:12.5px}
  .b{min-height:44px}
  .sheet{width:calc(100vw - 20px);max-width:calc(100vw - 20px);border-radius:14px}
  .instrument-sheet__hero{padding:18px 16px;gap:11px}
  .instrument-sheet__title{font-size:22px}
  .instrument-sheet__hero-meta{flex-wrap:wrap}
  .instrument-sheet__hero-copy{min-width:0}
  .instrument-sheet__close{width:42px;min-width:42px;height:42px;flex-basis:42px;inset:auto}
  .instrument-sheet__body{padding:12px;gap:12px}
  .instrument-sheet__preview{aspect-ratio:4/3}
  .instrument-sheet__preview img{object-fit:contain}
  .instrument-sheet__opening,.instrument-sheet__flow{grid-template-columns:minmax(0,1fr);gap:12px}
  .instrument-sheet__overview{min-height:0;padding:17px}
  .instrument-sheet__overview>p{font-size:12px}
  .instrument-sheet__domain-chip{margin-top:18px}
  .instrument-sheet__section-body,.instrument-sheet__reference-body{padding:15px}
  .instrument-score-variable{grid-template-columns:1fr}
  .instrument-score-variable .lab{max-width:none;justify-self:start;text-align:left}
  .instrument-sheet__footer{padding:12px;display:grid;grid-template-columns:1fr}
  .instrument-sheet__footer .b{width:100%}
  .score-story{--score-gutter:18px}
  .score-story__header{grid-template-columns:minmax(0,1fr);align-items:start;padding:18px var(--score-gutter)}
  .score-story__score{grid-column:1;justify-items:start;text-align:left}
  .score-story__project-norm{grid-template-columns:1fr;padding:16px var(--score-gutter)}
  .score-story__steps{grid-template-columns:1fr}
  .score-story__steps>section{grid-column:auto;padding:20px var(--score-gutter)}
  .score-story__step--variables,.score-story__step--calculation{border-bottom:1px solid var(--hair)}
  .score-story__step--reading{border-left:0}
  .score-story__variables{grid-template-columns:1fr}
  .score-story__context>summary{padding:15px var(--score-gutter)}
  .score-story__context>.score-story__variables{padding:0 var(--score-gutter) 18px}
  .score-aggregate>header{align-items:flex-start;flex-direction:column;padding:17px}
  .score-aggregate__body{padding:15px}
  .score-aggregate__contributors{grid-template-columns:1fr}
  .score-aggregate__contributors>span{justify-content:space-between;min-width:0}
}

/* ── Recepción — pantalla completa, sin riel ni columna (11a-c) ───────────
   Mitad tinta con la frase de foco, mitad papel con la acción, según
   v5-recepcion.dc.html. Nota: bare var(--warn)/var(--ok) siguen colisionando
   con valores viejos que quedan en base.css (ver Fase 0) — este archivo, acá
   abajo también, solo usa las variantes -d/-s sin colisión. */
/* .auth-page (antes <div class="content auth-page">) ocupa la pantalla
   completa -- Recepción es la única excepción sin riel/columna, y el usuario
   pidió explícitamente que cubra todo el ancho (no la tarjeta centrada de
   1240px del mockup): se saca la clase .content vieja (layout.css la
   limitaba a max-width:880px) y acá .frame se estira a 100% en vez de
   quedar con un ancho fijo. #app sigue siendo flex-column con
   align-items:center (ver layout.css) para el resto de las pantallas. */
/* align-items:stretch (no "center"): mismo bug que el de ancho de arriba,
   ahora en alto -- "center" en un flex-row centra el hijo en el eje
   transversal (vertical) en vez de estirarlo, dejando bandas --paper vacías
   arriba/abajo cuando .frame es más bajo que el viewport. stretch es el
   default de flexbox, pero se deja explícito para que quede claro que no es
   un olvido. */
.auth-page{width:100%;min-height:100vh;min-height:100svh;display:flex;align-self:stretch;align-items:stretch;justify-content:center}
.frame{display:flex;align-items:stretch;width:100%;min-height:100vh;min-height:100svh;background:var(--paper)}
/* [hidden] pierde contra el display:flex de arriba sin este override -- ver
   el mismo problema ya resuelto para .activity-loading en activities.css. */
.frame[hidden]{display:none}
@media (max-width:900px){
  .frame{flex-direction:column}
  /* Primera vez (11a): el usuario pidió que el bloque oscuro (.half) quede
     DEBAJO de "Acceso con tu cuenta" (.side) en celular -- invierte solo
     este estado, no returning/error, donde .half sí debe ir primero. */
  .frame[data-state="first-time"]{flex-direction:column-reverse}
  .auth-code-form__details.activity-demographics{grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr)}
}
.half{background:var(--ink);color:#fff;padding:44px 40px;display:flex;flex-direction:column;justify-content:space-between;flex:1;min-width:0;gap:28px}
.side{background:var(--paper);padding:44px 40px;display:flex;flex-direction:column;justify-content:center;gap:22px;flex:1;min-width:0}
/* En escritorio, Recepción replica el comportamiento del panel lateral de la
   plataforma: ocupa exactamente un viewport y permanece en su sitio aunque
   el formulario de acceso haga crecer la columna derecha. */
@media (min-width:901px){
  .frame[data-state="first-time"]>.half{position:sticky;top:0;align-self:flex-start;height:100vh;height:100svh;min-height:0;overflow-y:auto;overscroll-behavior:contain}
  .frame[data-state="first-time"]>.side{min-height:100vh;min-height:100svh}
}
@media (max-width:520px){
  .auth-code-form__details.activity-demographics{grid-template-columns:1fr}
  .auth-code-form__name{grid-column:auto}
  .auth-code-form__actions{display:grid;grid-template-columns:1fr 1fr}
  .auth-code-form__actions .b{justify-content:center;padding-inline:10px}
}
.mark{width:44px;height:44px;border-radius:14px;background:var(--c);color:#fff;display:grid;place-items:center;font:600 21px var(--s);flex:none}
.g-btn{display:flex;align-items:center;justify-content:center;gap:12px;background:var(--white);border-radius:12px;padding:15px 22px;font:600 14.5px var(--s);color:var(--text);box-shadow:0 1px 2px rgba(19,32,44,.08),0 4px 14px rgba(19,32,44,.07);border:none;cursor:pointer;width:100%}
.g-btn svg{width:20px;height:20px;flex:none}
.g-btn:disabled{opacity:.6;cursor:default}
.sep{display:flex;align-items:center;gap:14px}
.sep span{flex:1;height:1px;background:var(--hair)}
.sep p{font:600 10.5px var(--s);letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin:0}
.acc{display:flex;align-items:center;gap:13px;padding:14px 16px;border-radius:12px;background:var(--white);box-shadow:0 1px 2px rgba(19,32,44,.08),0 4px 14px rgba(19,32,44,.07)}
.av{width:36px;height:36px;border-radius:50%;background:var(--vio-d);color:#fff;display:grid;place-items:center;font:600 14px var(--s);flex:none}
.steps4{display:flex;flex-direction:column;gap:0;margin-top:6px}
.s4{display:flex;align-items:center;gap:12px;padding:11px 0;font:600 12.5px var(--s);color:var(--slate)}
.s4+.s4{border-top:1px solid rgba(255,255,255,.08)}
.s4 i{width:22px;height:22px;border-radius:8px;background:rgba(255,255,255,.09);display:grid;place-items:center;font:600 10.5px var(--s);font-style:normal;flex:none}
.s4--on{color:#fff}
.s4--on i{background:var(--c);color:#fff}
.load{height:3px;border-radius:var(--r-pill);background:rgba(255,255,255,.14);overflow:hidden;margin-top:14px;max-width:200px}
.load>i{display:block;height:3px;border-radius:var(--r-pill);background:var(--c-l)}

/* Recepción a pantalla completa: sin riel/columna del resto de la app.
   El toggle de la clase body.chromeless-mode vive en style/projects.css
   (ahí ya estaba, renombrado de .project-public-mode -- ver engine.js). */
