/* ==========================================================================
   Modernist — sistema de diseño (tokens + componentes)
   --------------------------------------------------------------------------
   Copia del `styles.css` del proyecto "Modernist" en claude.ai/design
   (projectId 28958484-e19d-4fc0-ae29-5a09c539cfc0), con DOS correcciones
   marcadas abajo como [FIX A] y [FIX B]. Ver CLAUDE.md sección 13.6.

   Este archivo se mantiene GENÉRICO: no lleva nada específico de Socorrista
   Urbano. Todo lo propio de la marca vive en `socorrista.css`, que se carga
   después y pisa lo que haga falta.

   ──────────────────────────────────────────────────────────────────────────
   LOS DOS CANDADOS QUE HACEN POSIBLE LA MIGRACIÓN POR ETAPAS
   ──────────────────────────────────────────────────────────────────────────
   Durante el rebrand conviven las pantallas viejas (Tailwind, admin.css,
   alumno.css) con este sistema nuevo. Para que enlazar esta hoja NO le cambie
   el aspecto a una pantalla que todavía no se migró, hay dos candados puestos,
   y se necesitan los dos porque tapan agujeros distintos:

   1. TODO ESTÁ DENTRO DE @layer.
      En CSS, cualquier regla SIN capa le gana a una regla CON capa, sin
      importar el orden ni la especificidad. Eso resuelve los CHOQUES: las
      clases .btn, .card y .field ya existen en admin.css y alumno.css, y con
      la capa siguen mandando ellas.

   2. TODO SELECTOR EMPIEZA CON :where([data-modernist]).
      La capa sólo resuelve choques. Si la hoja vieja NUNCA definió una
      propiedad, la de Modernist se aplicaba igual. Pasó de verdad al probar:
      `alumno.css` no fija `font-size` ni `line-height` en body, así que
      Modernist le achicaba el texto de 16px a 15px a TODO el campus.
      Con el atributo, ninguna regla del sistema existe hasta que la pantalla
      lo pide explícitamente.
      `:where(…)` no suma especificidad: `:where([data-modernist]) h1` pesa
      exactamente lo mismo que `h1` a secas, así que no complica nada después.

   >>> CÓMO SE MIGRA UNA PANTALLA (etapas 2 a 6) <<<
       1. Poner `data-modernist` en la etiqueta <html>.
       2. Sacarle el <link> de la hoja vieja (admin.css / alumno.css / Tailwind).
       Recién ahí la pantalla pasa a verse con el sistema nuevo.
   ========================================================================== */

/* Orden de capas: socorrista le gana a modernist.
   OJO con una asimetría de CSS que sorprende: el orden de capas le gana a la
   especificidad. Un selector flojo en una capa posterior vence a un selector
   fuerte de una capa anterior. Por eso el blindaje de [FIX B] no puede
   defenderse solo; ver el LÍMITE CONOCIDO anotado junto a esas reglas. */
@layer modernist, socorrista;

@layer modernist {

/* Los tokens NO van detrás del interruptor: una variable que nadie usa no
   pinta nada, así que no puede alterar una pantalla vieja. Dejarlos sueltos
   permite además que el <style> de una pantalla los use sin más trámite. */
:root {
  --color-bg: #f3f2f2;
  --color-surface: #eae9e9;
  --color-text: #201e1d;
  --color-accent: #ec3013;
  --color-accent-2: #e15b47;
  --color-divider: color-mix(in srgb, #201e1d 40%, transparent);

  /* Rampas tonales — generadas en OKLCH sobre una única escala de luminosidad
     compartida, para que el mismo escalón de cualquier rampa pese igual. */
  --color-neutral-100: #f8f4f4;
  --color-neutral-200: #eae7e7;
  --color-neutral-300: #d7d3d3;
  --color-neutral-400: #bab6b6;
  --color-neutral-500: #9b9797;
  --color-neutral-600: #7d7979;
  --color-neutral-700: #605d5d;
  --color-neutral-800: #444141;
  --color-neutral-900: #2d2b2b;

  --color-accent-100: #fff2ef;
  --color-accent-200: #ffe0d9;
  --color-accent-300: #ffc4b8;
  --color-accent-400: #ff9783;
  --color-accent-500: #ff563c;
  --color-accent-600: #dd2b0f;
  --color-accent-700: #ae1800;
  --color-accent-800: #7c1405;
  --color-accent-900: #4d170e;

  --color-accent-2-100: #fff2ef;
  --color-accent-2-200: #ffe0da;
  --color-accent-2-300: #ffc4b9;
  --color-accent-2-400: #ff9784;
  --color-accent-2-500: #ef6853;
  --color-accent-2-600: #c94b39;
  --color-accent-2-700: #9e3526;
  --color-accent-2-800: #71261b;
  --color-accent-2-900: #471d16;

  /* [FIX A] Estados del botón primario como tokens propios.
     Modernist ataba el hover a --color-accent-600. Eso sólo funciona si el
     color de marca cae ENTRE dos escalones de la rampa. Si la marca cae justo
     encima de un escalón (le pasa a #DC2626, que es exactamente un 600), el
     hover queda del mismo color que el botón y deja de verse. Con estos dos
     tokens, un proyecto que cambia el acento redefine su hover y listo.
     El valor por defecto reproduce el comportamiento original de Modernist. */
  --color-accent-hover: var(--color-accent-600);
  --color-accent-active: var(--color-accent-700);

  --font-heading: "Archivo", system-ui, sans-serif;
  --font-heading-weight: 800;
  --font-body: "Archivo", system-ui, sans-serif;

  --space-1: 4.0px;
  --space-2: 8.0px;
  --space-3: 12.0px;
  --space-4: 16.0px;
  --space-6: 24.0px;
  --space-8: 32.0px;

  --radius-sm: 0px;
  --radius-md: 0px;
  --radius-lg: 0px;

  /* Elevación — sombras tenues teñidas de tinta sobre el fondo claro. */
  --shadow-sm: 0 1px 2px color-mix(in srgb, #2d2b2b 14%, transparent);
  --shadow-md: 0 3px 10px color-mix(in srgb, #2d2b2b 16%, transparent);
  --shadow-lg: 0 12px 32px color-mix(in srgb, #2d2b2b 22%, transparent);
}

/* ══════════════════════════════════════════════════════════════════════════
   Base de elementos
   ══════════════════════════════════════════════════════════════════════════ */

:where([data-modernist]) *,
:where([data-modernist]) *::before,
:where([data-modernist]) *::after { box-sizing: border-box; }

:where([data-modernist]) body {
  margin: 0;
  background: var(--color-bg);
  color: var(--color-text);
  font-family: var(--font-body);
  font-size: 15px; line-height: 1.55; font-weight: 400;
}
:where([data-modernist]) :is(h1, h2, h3, h4, h5, h6) {
  font-family: var(--font-heading); font-weight: var(--font-heading-weight);
  line-height: 1.12; letter-spacing: -0.015em; margin: 0 0 var(--space-2);
}
:where([data-modernist]) h1 { font-size: 42px; }
:where([data-modernist]) h2 { font-size: 32px; }
:where([data-modernist]) h3 { font-size: 25px; }
:where([data-modernist]) h4 { font-size: 20px; }
:where([data-modernist]) h5 { font-size: 16px; }
:where([data-modernist]) h6 { font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase; }
:where([data-modernist]) p { margin: 0 0 var(--space-3); }
:where([data-modernist]) a { color: var(--color-accent); text-underline-offset: 3px; }
:where([data-modernist]) img { display: block; max-width: 100%; }
:where([data-modernist]) figure { margin: 0; }
:where([data-modernist]) figcaption {
  font-size: 11px; margin-top: var(--space-1);
  color: color-mix(in srgb, var(--color-text) 55%, transparent);
}
:where([data-modernist]) .text-muted { color: color-mix(in srgb, var(--color-text) 55%, transparent); }
:where([data-modernist]) :focus { outline: none; }
:where([data-modernist]) :focus-visible { outline: 2px solid var(--color-accent); outline-offset: 2px; }
:where([data-modernist]) ::selection { background: color-mix(in srgb, var(--color-accent) 30%, transparent); }

/* Fotos. Modernist las manda en blanco y negro; Socorrista Urbano pone este
   filtro en cero (ver socorrista.css). Es un interruptor de un solo carácter. */
:where([data-modernist]) .grayscale { filter: grayscale(1) contrast(1.08); }

/* ══════════════════════════════════════════════════════════════════════════
   Componentes — armados con los tokens de arriba. CSS plano sobre HTML plano:
   sin JavaScript, sin paso de compilación.
   ══════════════════════════════════════════════════════════════════════════ */

/* — líneas divisorias — */
:where([data-modernist]) .hr {
  height: 2px; border: 0; margin: var(--space-4) 0;
  background: var(--color-divider);
}

/* — botones — */
:where([data-modernist]) .btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  cursor: pointer; text-decoration: none;
  font-family: var(--font-heading); font-weight: var(--font-heading-weight);
  font-size: 14px; line-height: 1.2; color: var(--color-text);
  background: transparent; border: 1px solid transparent;
  padding: var(--space-2) calc(var(--space-3) * 1.2);
  border-radius: var(--radius-md);
}
:where([data-modernist]) .btn svg { display: block; }
:where([data-modernist]) .btn:disabled,
:where([data-modernist]) .btn[aria-disabled="true"] { opacity: 0.45; cursor: not-allowed; }
:where([data-modernist]) .btn-primary { background: var(--color-accent); color: var(--color-bg); }
:where([data-modernist]) .btn-primary:hover { background: var(--color-accent-hover); }
:where([data-modernist]) .btn-primary:active { background: var(--color-accent-active); }
:where([data-modernist]) .btn-secondary { border-color: var(--color-divider); }
:where([data-modernist]) .btn-secondary:hover { background: color-mix(in srgb, var(--color-text) 7%, transparent); }
:where([data-modernist]) .btn-secondary:active { background: color-mix(in srgb, var(--color-text) 14%, transparent); }
:where([data-modernist]) .btn-ghost { color: var(--color-accent); padding-inline: var(--space-1); }
:where([data-modernist]) .btn-ghost:hover { background: color-mix(in srgb, var(--color-accent) 10%, transparent); }
:where([data-modernist]) .btn-ghost:active { background: color-mix(in srgb, var(--color-accent) 18%, transparent); }
:where([data-modernist]) .btn-icon { width: 36px; height: 36px; padding: 0; }
:where([data-modernist]) .btn-block { width: 100%; margin-top: var(--space-2); justify-content: flex-start; text-align: left; }

/* [FIX B — parte 1] Variante invertida: claro sobre fondo de acento pleno.
   El sistema no la tenía, y en el boceto de la landing se resolvía con estilos
   en línea sobre un `.btn` pelado — que no define ningún :hover, así que el
   botón quedaba muerto al pasar el mouse. Ahora es una variante de verdad.
   El hover NO aclara (ir más claro que el fondo claro no se ve): oscurece
   hacia los neutros, igual que hace .btn-secondary con su tinte. */
:where([data-modernist]) .btn-inverse { background: var(--color-bg); color: var(--color-accent); }
:where([data-modernist]) .btn-inverse:hover { background: var(--color-neutral-200); }
:where([data-modernist]) .btn-inverse:active { background: var(--color-neutral-300); }

/* [FIX B — parte 2] Blindaje del color de los botones que son <a>.
   Una regla genérica `a:hover { color: … }` tiene más especificidad
   (elemento + pseudoclase) que `.btn-primary` (una sola clase), así que le
   gana: el botón primario quedaba con texto rojo sobre fondo rojo, y encima
   subrayado. Estas reglas usan elemento + clase + pseudoclase, que le gana a
   cualquier `a:hover` suelto que aparezca ahora o en el futuro.
   OJO: no se toca el fondo del hover de .btn-secondary — su tinte queda como
   estaba, por pedido explícito.

   LÍMITE CONOCIDO — leer antes de confiar en esto:
   Estas reglas ganan por especificidad, y la especificidad sólo decide DENTRO
   de la misma capa. Un `a:hover { color: … }` escrito en el <style> suelto de
   una pantalla (sin capa) le gana igual, por más flojo que sea el selector.
   No se puede blindar con !important sin repintar de paso los botones que el
   campus todavía tiene con la hoja vieja.
   Por eso el arreglo de verdad está en el origen, en socorrista.css: la regla
   de links del proyecto excluye a los botones con `:not(.btn)`. Este blindaje
   es la segunda línea de defensa, no la primera. */
:where([data-modernist]) a.btn,
:where([data-modernist]) a.btn:hover,
:where([data-modernist]) a.btn:focus,
:where([data-modernist]) a.btn:visited { text-decoration: none; }
:where([data-modernist]) a.btn,
:where([data-modernist]) a.btn:hover,
:where([data-modernist]) a.btn:visited { color: var(--color-text); }
:where([data-modernist]) a.btn-primary,
:where([data-modernist]) a.btn-primary:hover,
:where([data-modernist]) a.btn-primary:visited { color: var(--color-bg); }
:where([data-modernist]) a.btn-secondary,
:where([data-modernist]) a.btn-secondary:hover,
:where([data-modernist]) a.btn-secondary:visited { color: var(--color-text); }
:where([data-modernist]) a.btn-ghost,
:where([data-modernist]) a.btn-ghost:hover,
:where([data-modernist]) a.btn-ghost:visited { color: var(--color-accent); }
:where([data-modernist]) a.btn-inverse,
:where([data-modernist]) a.btn-inverse:hover,
:where([data-modernist]) a.btn-inverse:visited { color: var(--color-accent); }

/* — formularios — */
:where([data-modernist]) .field > label {
  display: block; font-size: 12px; margin-bottom: 5px;
  color: color-mix(in srgb, var(--color-text) 70%, transparent);
}
:where([data-modernist]) .input {
  width: 100%; min-height: 36px; padding: 6px 10px; font: inherit;
  font-size: 14px; color: var(--color-text); caret-color: var(--color-accent);
  background: var(--color-surface);
  border: 1px solid var(--color-divider); border-radius: var(--radius-md);
}
:where([data-modernist]) .input:hover { border-color: color-mix(in srgb, var(--color-text) 45%, transparent); }
:where([data-modernist]) .input:focus-visible { border-color: var(--color-accent); outline-offset: 0; }
:where([data-modernist]) textarea.input { min-height: 90px; resize: vertical; }
:where([data-modernist]) .radio { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: 14px; }
:where([data-modernist]) .radio input,
:where([data-modernist]) .seg-opt input {
  position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none;
}
:where([data-modernist]) .radio .dot {
  width: 16px; height: 16px; flex: none; border-radius: 50%;
  border: 1.5px solid var(--color-divider);
}
:where([data-modernist]) .radio:hover .dot { border-color: var(--color-accent); }
:where([data-modernist]) .radio input:checked + .dot {
  border-color: var(--color-accent); background: var(--color-accent);
  box-shadow: inset 0 0 0 4px var(--color-bg);
}
:where([data-modernist]) .radio input:focus-visible + .dot { outline: 2px solid var(--color-accent); outline-offset: 2px; }
:where([data-modernist]) .seg {
  display: inline-flex; overflow: hidden;
  border: 1px solid var(--color-divider); border-radius: var(--radius-md);
}
:where([data-modernist]) .seg-opt {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 7px 12px; font-size: 13px; cursor: pointer;
}
:where([data-modernist]) .seg-opt + .seg-opt { border-left: 1px solid var(--color-divider); }
:where([data-modernist]) .seg-opt:has(input:checked) { background: var(--color-accent); color: var(--color-bg); }
:where([data-modernist]) .seg-opt:not(:has(input:checked)):hover { background: color-mix(in srgb, var(--color-text) 7%, transparent); }
:where([data-modernist]) .seg-opt:has(input:focus-visible) { outline: 2px solid var(--color-accent); outline-offset: -2px; }

/* — tarjetas — */
:where([data-modernist]) .card {
  display: flex; flex-direction: column; gap: var(--space-2);
  padding: var(--space-3); border-radius: var(--radius-md); background: var(--color-surface);
}
:where([data-modernist]) .card-kicker { font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--color-accent); }
:where([data-modernist]) .card-title {
  font-family: var(--font-heading); font-weight: var(--font-heading-weight);
  font-size: 17px; line-height: 1.2;
}
:where([data-modernist]) .card-body { margin: 0; font-size: 13px; opacity: 0.8; flex: 1; }
:where([data-modernist]) .card-meta {
  display: flex; align-items: center; gap: 6px; font-size: 11px;
  color: color-mix(in srgb, var(--color-text) 50%, transparent);
}
:where([data-modernist]) .elev-sm { box-shadow: var(--shadow-sm); }
:where([data-modernist]) .elev-md { box-shadow: var(--shadow-md); }
:where([data-modernist]) .elev-lg { box-shadow: var(--shadow-lg); }

/* — etiquetas — */
:where([data-modernist]) .tag {
  display: inline-flex; align-items: center; font-size: 11px;
  letter-spacing: 0.02em; padding: 3px 10px;
  border-radius: calc(var(--radius-md) * 0.75);
}
:where([data-modernist]) .tag-accent { background: var(--color-accent-100); color: var(--color-accent-800); }
:where([data-modernist]) .tag-accent-2 { background: var(--color-accent-2-100); color: var(--color-accent-2-800); }
:where([data-modernist]) .tag-neutral { background: var(--color-neutral-100); color: var(--color-neutral-800); }
:where([data-modernist]) .tag-outline { border: 1px solid var(--color-accent); color: var(--color-accent); }

/* — navegación — */
:where([data-modernist]) .nav {
  display: flex; align-items: center; gap: var(--space-4);
  padding: var(--space-3) var(--space-4);
  border-bottom: 2px solid var(--color-divider);
}
:where([data-modernist]) .nav-brand {
  font-family: var(--font-heading); font-weight: var(--font-heading-weight);
  font-size: 18px; margin-right: auto;
}
:where([data-modernist]) .nav a { color: inherit; text-decoration: none; font-size: 14px; }
:where([data-modernist]) .nav a:hover,
:where([data-modernist]) .nav a[aria-current='page'] { color: var(--color-accent); }

/* — tablas — */
:where([data-modernist]) .table { width: 100%; border-collapse: collapse; font-size: 14px; }
:where([data-modernist]) .table th {
  text-align: left; font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase;
  color: color-mix(in srgb, var(--color-text) 60%, transparent);
  padding: var(--space-2); border-bottom: 2px solid var(--color-divider);
}
:where([data-modernist]) .table td {
  padding: var(--space-2);
  border-bottom: 1px solid var(--color-divider);
}
:where([data-modernist]) .table tbody tr:hover { background: color-mix(in srgb, var(--color-text) 4%, transparent); }

/* — ventana modal — */
:where([data-modernist]) .dialog-backdrop {
  position: fixed; inset: 0; display: grid; place-items: center;
  padding: var(--space-4);
  background: color-mix(in srgb, var(--color-neutral-900) 50%, transparent);
}
:where([data-modernist]) .dialog {
  width: min(440px, 100%); display: flex; flex-direction: column; gap: var(--space-3);
  padding: var(--space-4); border-radius: var(--radius-lg);
  background: var(--color-surface); box-shadow: var(--shadow-lg);
}
:where([data-modernist]) .dialog-title {
  font-family: var(--font-heading); font-weight: var(--font-heading-weight);
  font-size: 20px;
}
:where([data-modernist]) .dialog-body { font-size: 14px; opacity: 0.85; }
:where([data-modernist]) .dialog-actions { display: flex; justify-content: flex-end; gap: var(--space-2); margin-top: var(--space-2); }

} /* fin @layer modernist */
