/* ============================================================
   Dentalplus · componentes.css
   Convención de nombres: bloque, bloque--variante, bloque__parte.
   Sin utilidades tipo framework: cada componente es una clase.
   Ningún color de marca escrito a mano; todo sale de los tokens.
   ============================================================ */

/* ============ BOTONES ============ */
.boton {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--e-2);
  min-height: var(--toque-min);
  padding: 0 var(--e-5);
  border: 1px solid transparent;
  border-radius: var(--r-md);
  font: var(--peso-semi) var(--txt-base)/1 var(--fuente);
  text-decoration: none;
  white-space: nowrap;
  transition: background var(--t-media) var(--curva),
              border-color var(--t-media) var(--curva),
              color var(--t-media) var(--curva);
}
.boton svg { width: 1.15em; height: 1.15em; stroke-width: 1.8; }

.boton--primario { background: var(--color-primario); color: var(--texto-sobre-primario); }
.boton--primario:hover { background: var(--primario-hover); }
.boton--primario:active { background: var(--primario-activo); }

.boton--secundario { background: transparent; border-color: var(--primario-borde); color: var(--primario-texto); }
.boton--secundario:hover { background: var(--primario-tenue); }

.boton--terciario { background: transparent; color: var(--primario-texto); padding: 0 var(--e-3); text-decoration: underline; text-underline-offset: 3px; }
.boton--terciario:hover { background: var(--primario-tenue); text-decoration: none; }

/* `boton--fantasma` SE USABA EN DOS VISTAS Y NO EXISTÍA AQUÍ.

   Sin la regla, el botón «Limpiar» del área de firma se quedaba con el
   `.boton` base —fondo claro heredado, texto claro— y en modo oscuro resultaba
   ILEGIBLE: se leía como un rectángulo vacío. Está en la pantalla de firma del
   médico y también en la que se le pasa al paciente, que es la que ve alguien
   de fuera de la clínica.

   Es el mismo defecto que `csrfInput()` y que `Flash::exito()`: un nombre que
   no existe. La diferencia es que en PHP eso da un error 500 y aquí no da nada
   —el navegador ignora una clase desconocida en silencio— así que sobrevive
   hasta que alguien mira la pantalla. De aquí nace la séptima capa. */
.boton--fantasma { background: transparent; color: var(--texto-suave); }
.boton--fantasma:hover { background: var(--superficie-2); color: var(--texto-fuerte); }

.boton--peligro { background: var(--error); color: #fff; }
.boton--peligro:hover { background: color-mix(in oklab, var(--error) 85%, black); }
.boton--peligro-suave { background: var(--error-suave); border-color: var(--error-borde); color: var(--error); }

/* `boton--sm` se usaba en 17 sitios y tampoco existía. Los botones pequeños
   —«Deshacer», «Limpiar», las acciones dentro de una tabla— salían del tamaño
   completo, empujando la maquetación de las filas. No se reduce la altura por
   debajo de 36 px: por debajo de eso un dedo falla el objetivo, y estas
   pantallas se usan en celular. */
/* Caja para MOSTRAR una firma ya guardada.

   El fondo es blanco fijo, no `var(--superficie-2)`, y es a propósito. La firma
   se guarda como PNG transparente con el trazo en negro, porque está pensada
   para imprimirse sobre papel. Puesta sobre el fondo oscuro del tema, el trazo
   negro sobre azul oscuro DESAPARECÍA: la pantalla decía «Firma guardada
   correctamente» y debajo se veía un rectángulo vacío. El médico no tenía forma
   de saber si su firma se había guardado bien.

   La previsualización tiene que enseñar lo que se va a imprimir, y lo que se va
   a imprimir va sobre papel blanco. */
.firma-vista {
  background: #fff;
  border: 1px solid var(--borde);
  border-radius: var(--r-md);
  padding: var(--e-4);
  display: inline-block;
  margin-top: var(--e-3);
}
.firma-vista img { display: block; }

.boton--sm { min-height: 36px; padding: 0 var(--e-4); font-size: var(--txt-sm); }
.boton--sm svg { width: 1em; height: 1em; }

.boton--icono { width: var(--toque-min); padding: 0; }
.boton--icono svg { width: 20px; height: 20px; }

.boton--flotante {
  position: fixed;
  right: var(--e-4);
  bottom: calc(var(--e-4) + env(safe-area-inset-bottom));
  width: 56px; height: 56px;
  padding: 0;
  border-radius: var(--r-full);
  background: var(--color-primario);
  color: var(--texto-sobre-primario);
  box-shadow: var(--sombra-3);
  z-index: var(--z-sticky);
}
/* Solo móvil: en escritorio la acción vive en la barra superior */
@media (min-width: 1024px) { .boton--flotante { display: none; } }

.boton:disabled, .boton[aria-disabled="true"] {
  background: var(--superficie-3);
  border-color: transparent;
  color: var(--texto-suave);
}

/* Estado cargando: el ancho no cambia, para que el botón no salte */
.boton[data-cargando]::before {
  content: "";
  width: 1em; height: 1em;
  border: 2px solid color-mix(in oklab, currentColor 30%, transparent);
  border-top-color: currentColor;
  border-radius: var(--r-full);
  animation: girar 700ms linear infinite;
}
@keyframes girar { to { transform: rotate(360deg); } }

/* ============ CAMPOS ============ */
.campo { display: flex; flex-direction: column; gap: var(--e-2); }
.campo__etiqueta { font: var(--peso-medio) var(--txt-sm)/1 var(--fuente); color: var(--texto-medio); }
.campo__control {
  /* Un <input> sin `width` mide lo que diga su atributo `size`, unos 200 px,
     y NO se estira. Dentro de un `.campo` —que es flex en columna— el input se
     estiraba por ser hijo directo, así que el fallo no se veía… hasta que el
     buscador de medicamentos metió el input dentro de un `<div
     position:relative>` para colgar las sugerencias. Entonces el que se estira
     es el div y el input se queda en 200 px: el campo MÁS importante de la
     receta era el más estrecho de la pantalla, y cortaba el nombre del
     medicamento a media palabra. Se declara aquí y deja de depender de dónde
     esté anidado. `box-sizing: border-box` es global (base.css), así que el
     100 % incluye borde y relleno. */
  width: 100%;
  min-height: var(--toque-min);
  padding: 0 var(--e-3);
  border: 1px solid var(--borde-fuerte);
  border-radius: var(--r-md);
  background: var(--superficie);
  color: var(--texto-fuerte);
  transition: border-color var(--t-media) var(--curva), box-shadow var(--t-media) var(--curva);
}
textarea.campo__control { min-height: 88px; padding: var(--e-3); line-height: var(--alt-comoda); resize: vertical; }
.campo__control:focus-visible { border-color: var(--color-primario); box-shadow: var(--anillo-foco); }
.campo__control[aria-invalid="true"] { border-color: var(--error); background: var(--error-suave); }
.campo__ayuda { font: var(--peso-normal) var(--txt-xs)/1.45 var(--fuente); color: var(--texto-suave); }
.campo__error {
  display: flex; align-items: flex-start; gap: var(--e-2);
  font: var(--peso-medio) var(--txt-xs)/1.45 var(--fuente);
  color: var(--error);
}

/* Moneda: prefijo fijo y cifra alineada a la derecha */
.campo--moneda .campo__grupo { display: flex; align-items: center; border: 1px solid var(--borde-fuerte); border-radius: var(--r-md); background: var(--superficie); overflow: hidden; }
.campo--moneda .campo__prefijo { padding: 0 var(--e-3); background: var(--superficie-2); border-right: 1px solid var(--borde); color: var(--texto-suave); font-family: var(--fuente-mono); line-height: var(--toque-min); }
.campo--moneda input { flex: 1; min-height: var(--toque-min); border: none; background: transparent; text-align: right; font: var(--peso-medio) var(--txt-lg)/1 var(--fuente-mono); font-variant-numeric: tabular-nums; }

.casilla, .radio, .interruptor { display: flex; align-items: flex-start; gap: var(--e-3); min-height: var(--toque-min); cursor: pointer; }
.casilla input, .radio input { width: 20px; height: 20px; margin-top: 2px; accent-color: var(--color-primario); flex: none; }

.zona-soltar {
  display: flex; flex-direction: column; align-items: center; gap: var(--e-2);
  padding: var(--e-6) var(--e-5);
  border: 2px dashed var(--borde-fuerte);
  border-radius: var(--r-lg);
  background: var(--superficie);
  text-align: center;
}
.zona-soltar[data-arrastrando] { border-color: var(--color-primario); background: var(--primario-suave); }

/* ============ TARJETAS ============ */
.tarjeta {
  border: 1px solid var(--borde);
  border-radius: var(--r-lg);
  background: var(--superficie);
  box-shadow: var(--sombra-1);
  padding: var(--e-5);
  display: flex;
  flex-direction: column;
  gap: var(--e-3);
}
.tarjeta--acento { border-left: 4px solid var(--color-primario); }
.tarjeta--pago { border-color: var(--exito-borde); background: var(--exito-suave); }
.tarjeta__titulo { font: var(--peso-semi) var(--txt-lg)/1.25 var(--fuente); }
.tarjeta__pie { padding-top: var(--e-3); border-top: 1px solid var(--borde); display: flex; align-items: center; justify-content: space-between; gap: var(--e-3); }

/* ============ TABLA QUE SE VUELVE TARJETAS ============
   El contenedor declara el contexto; la tabla reacciona a SU ancho,
   no al de la ventana, así funciona igual dentro de un drawer. */
.tabla-envoltura { container-type: inline-size; }
.tabla { width: 100%; border-collapse: collapse; }
.tabla th {
  text-align: left;
  padding: var(--e-3) var(--e-4);
  background: var(--superficie-2);
  font: var(--peso-medio) var(--txt-xs)/1.3 var(--fuente);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--texto-suave);
}
.tabla td { padding: var(--e-4); border-top: 1px solid var(--borde); }
.tabla tbody tr:hover { background: var(--primario-tenue); }
.tabla .num { text-align: right; }

@container (max-width: 639px) {
  .tabla thead { display: none; }
  .tabla tr {
    display: grid;
    gap: var(--e-2);
    padding: var(--e-4);
    margin-bottom: var(--e-3);
    border: 1px solid var(--borde);
    border-radius: var(--r-lg);
    background: var(--superficie);
  }
  .tabla td { display: flex; justify-content: space-between; gap: var(--e-3); padding: 0; border: none; }
  /* La etiqueta viene del atributo, no de markup duplicado */
  .tabla td::before {
    content: attr(data-etiqueta);
    font: var(--peso-medio) var(--txt-xs)/1.4 var(--fuente);
    color: var(--texto-suave);
  }
  .tabla td[data-principal] { font: var(--peso-semi) var(--txt-lg)/1.3 var(--fuente); }
  .tabla td[data-principal]::before { content: none; }
  .tabla .num { text-align: left; }
}

/* ============ NAVEGACIÓN ============ */
.migas { display: flex; align-items: center; gap: var(--e-2); font-size: var(--txt-sm); }
.migas a { text-decoration: none; }
.migas [aria-current="page"] { color: var(--texto-medio); }

.pestanas { display: flex; gap: var(--e-1); overflow-x: auto; border-bottom: 1px solid var(--borde); }
.pestanas__item {
  min-height: 48px;
  padding: 0 var(--e-4);
  display: flex; align-items: center;
  border: none; background: transparent;
  color: var(--texto-suave);
  font: var(--peso-normal) var(--txt-base)/1 var(--fuente);
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  white-space: nowrap;
}
.pestanas__item[aria-selected="true"] { color: var(--primario-texto); font-weight: var(--peso-semi); border-bottom-color: var(--color-primario); }

.acordeon__disparador {
  width: 100%; min-height: 52px; padding: 0 var(--e-4);
  display: flex; align-items: center; justify-content: space-between; gap: var(--e-3);
  border: none; background: var(--superficie);
  font: var(--peso-semi) var(--txt-base)/1 var(--fuente);
  text-align: left;
}
.acordeon__disparador svg { transition: transform var(--t-media) var(--curva); }
.acordeon__disparador[aria-expanded="true"] svg { transform: rotate(180deg); }

.paginacion { display: flex; align-items: center; justify-content: space-between; gap: var(--e-4); flex-wrap: wrap; }
.paginacion__pagina { min-width: var(--toque-min); height: var(--toque-min); border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie); font-family: var(--fuente-mono); }
.paginacion__pagina[aria-current="page"] { border-color: transparent; background: var(--color-primario); color: var(--texto-sobre-primario); font-weight: var(--peso-semi); }

/* ============ SUPERPOSICIONES ============ */
.velo { position: fixed; inset: 0; background: color-mix(in oklab, var(--n-950) 55%, transparent); }
.modal { position: fixed; inset: 0; z-index: var(--z-modal); display: grid; place-items: center; padding: var(--e-6); }
.modal__caja { width: 100%; max-width: 460px; border-radius: var(--r-xl); background: var(--superficie); box-shadow: var(--sombra-4); overflow: hidden; animation: entrar var(--t-media) var(--curva); }
.modal__pie { padding: var(--e-5); background: var(--superficie-2); display: flex; gap: var(--e-3); justify-content: flex-end; flex-wrap: wrap; }

.panel { position: fixed; inset: 0; z-index: var(--z-drawer); display: flex; justify-content: flex-end; }
.panel__caja { width: min(420px, 100%); height: 100%; background: var(--superficie); box-shadow: var(--sombra-3); display: flex; flex-direction: column; animation: deslizar var(--t-lenta) var(--curva); }
/* En móvil el panel sube desde abajo, al alcance del pulgar */
@media (max-width: 639px) {
  .panel { align-items: flex-end; }
  .panel__caja { width: 100%; height: auto; max-height: 88vh; border-radius: var(--r-xl) var(--r-xl) 0 0; animation: subir var(--t-lenta) var(--curva); }
}

.popover { position: absolute; min-width: 210px; padding: var(--e-2); border: 1px solid var(--borde); border-radius: var(--r-lg); background: var(--superficie); box-shadow: var(--sombra-2); z-index: var(--z-menu); }
.popover__item { width: 100%; min-height: 40px; padding: 0 var(--e-3); border: none; border-radius: var(--r-sm); background: transparent; text-align: left; }
.popover__item:hover { background: var(--superficie-2); }

.globo { padding: var(--e-2) var(--e-3); border-radius: var(--r-md); background: var(--n-900); color: var(--n-0); font-size: var(--txt-xs); box-shadow: var(--sombra-2); }

.toast { position: fixed; right: var(--e-6); bottom: var(--e-6); z-index: var(--z-toast); display: flex; align-items: center; gap: var(--e-3); padding: var(--e-4) var(--e-5); border-radius: var(--r-lg); background: var(--n-900); color: var(--n-0); box-shadow: var(--sombra-4); animation: entrar var(--t-media) var(--curva); }
@media (max-width: 639px) { .toast { left: var(--e-4); right: var(--e-4); bottom: calc(var(--e-4) + env(safe-area-inset-bottom)); } }

@keyframes entrar { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
@keyframes deslizar { from { transform: translateX(24px); opacity: 0; } to { transform: none; opacity: 1; } }
@keyframes subir { from { transform: translateY(24px); } to { transform: none; } }

/* ============ AVISOS Y BADGES ============ */
/* El icono se posiciona y el contenido fluye como texto normal.
   Antes esto era `display:flex`, y entonces CADA hijo suelto del bloque
   —cada <strong>, cada trozo de texto— se convertía en una columna del flex:
   el aviso legal de las plantillas se partía en tres columnas absurdas. Con
   flex, una alerta solo se veía bien si alguien recordaba envolver todo el
   contenido en un <div>, y en la Fase 5 seis vistas no lo hicieron.
   Así el componente tolera las dos formas de escribirlo. */
.alerta {
  display: block;
  position: relative;
  padding: var(--e-4);
  padding-left: calc(var(--e-4) + 20px + var(--e-3));
  border-radius: var(--r-md);
  border: 1px solid;
}
.alerta > svg {
  position: absolute;
  left: var(--e-4);
  top: var(--e-4);
  width: 20px; height: 20px;
  flex: none;
}
/* Sin icono no hace falta reservar el hueco. */
.alerta:not(:has(> svg)) { padding-left: var(--e-4); }
.alerta--exito { background: var(--exito-suave); border-color: var(--exito-borde); }
.alerta--exito .alerta__titulo { color: var(--exito); }
.alerta--aviso { background: var(--aviso-suave); border-color: var(--aviso-borde); }
.alerta--aviso .alerta__titulo { color: var(--aviso); }
.alerta--error { background: var(--error-suave); border-color: var(--error-borde); }
.alerta--error .alerta__titulo { color: var(--error); }
.alerta--info { background: var(--info-suave); border-color: var(--info-borde); }
.alerta--info .alerta__titulo { color: var(--info); }
.alerta__titulo { font: var(--peso-semi) var(--txt-sm)/1.3 var(--fuente); }

/* ---------- Alerta médica permanente ----------
   Va pegada bajo el encabezado del paciente, en TODAS las pestañas.
   No se puede descartar y no depende del color de la clínica. */
.alerta-medica {
  display: flex; align-items: center; gap: var(--e-3);
  padding: var(--e-4) var(--e-5);
  border-radius: var(--r-md);
  background: var(--alerta-medica);
  color: #fff;
}
.alerta-medica svg { flex: none; width: 24px; height: 24px; stroke-width: 2.1; }
.alerta-medica__titulo { font: var(--peso-fuerte) var(--txt-lg)/1.2 var(--fuente); letter-spacing: .03em; text-transform: uppercase; }
.alerta-medica__detalle { font-size: var(--txt-sm); opacity: .9; }
@media (max-width: 639px) {
  .alerta-medica__titulo { font-size: var(--txt-xs); }
  .alerta-medica__detalle { display: none; }
}

.badge { display: inline-flex; align-items: center; gap: var(--e-2); padding: 4px 10px; border-radius: var(--r-full); font: var(--peso-medio) var(--txt-xs)/1.4 var(--fuente); }
.badge--exito { background: var(--exito-suave); color: var(--exito); }
.badge--aviso { background: var(--aviso-suave); color: var(--aviso); }
.badge--error { background: var(--error-suave); color: var(--error); }
.badge--info { background: var(--info-suave); color: var(--info); }
.badge--neutro { background: var(--superficie-3); color: var(--texto-medio); }
.badge--marca { background: var(--primario-suave); color: var(--primario-texto); }

.pildora { display: inline-flex; align-items: center; gap: var(--e-2); min-height: 36px; padding: 0 var(--e-3); border-radius: var(--r-full); border: 1px solid var(--borde-fuerte); color: var(--texto-medio); font-size: var(--txt-xs); }
.pildora[aria-pressed="true"] { border-color: var(--color-primario); background: var(--primario-suave); color: var(--primario-texto); font-weight: var(--peso-semi); }

/* ============ LÍNEA DE TIEMPO ============ */
.linea { display: grid; grid-template-columns: 32px 1fr; gap: var(--e-4); }
.linea__marca { display: flex; flex-direction: column; align-items: center; gap: var(--e-1); }
.linea__punto { width: 32px; height: 32px; border-radius: var(--r-full); display: grid; place-items: center; flex: none; background: var(--color-primario); color: var(--texto-sobre-primario); }
.linea__hilo { flex: 1; width: 2px; background: var(--borde); }

/* Nota firmada: sólida, sellada, inmutable */
.nota { padding: var(--e-4) var(--e-5); border: 1px solid var(--borde); border-radius: var(--r-md); background: var(--superficie); }
.nota__sello { display: flex; align-items: center; gap: var(--e-2); font: var(--peso-medio) var(--txt-xs)/1.3 var(--fuente); color: var(--exito); }
/* Borrador: punteado y ámbar, se distingue de un vistazo */
.nota--borrador { border: 1.5px dashed var(--aviso-borde); background: var(--aviso-suave); }
.nota--borrador .linea__punto,
.linea__punto--borrador { border: 2px dashed var(--aviso); background: var(--aviso-suave); color: var(--aviso); }

/* ============ VACÍOS Y CARGA ============ */
.vacio { display: flex; flex-direction: column; align-items: center; gap: var(--e-4); padding: var(--e-10) var(--e-6); border: 1px solid var(--borde); border-radius: var(--r-lg); background: var(--superficie); text-align: center; }
.vacio__texto { max-width: 34ch; color: var(--texto-medio); }

.esqueleto {
  border-radius: var(--r-sm);
  background: linear-gradient(90deg, var(--superficie-2) 25%, var(--superficie-3) 37%, var(--superficie-2) 63%);
  background-size: 280px 100%;
  animation: brillo 1.4s linear infinite;
}
.esqueleto--linea { height: 11px; }
.esqueleto--titulo { height: 14px; width: 62%; }
.esqueleto--avatar { width: 46px; height: 46px; border-radius: var(--r-full); }
@keyframes brillo { 0% { background-position: -280px 0; } 100% { background-position: 280px 0; } }

/* ============ AVATAR ============ */
.avatar { border-radius: var(--r-full); background: var(--primario-suave); color: var(--primario-texto); display: grid; place-items: center; font-weight: var(--peso-semi); flex: none; overflow: hidden; }
.avatar--sm { width: 36px; height: 36px; font-size: var(--txt-xs); }
.avatar--md { width: 46px; height: 46px; font-size: var(--txt-sm); }
.avatar--lg { width: 72px; height: 72px; font-size: var(--txt-2xl); }
.avatar img { width: 100%; height: 100%; object-fit: cover; }

/* ============ ODONTOGRAMA ============
   Cada diente es una rejilla de cinco superficies accionables.
   Los colores de condición son fijos del sistema: un diagnóstico no
   cambia de color según la marca de la clínica. */
.odontograma { display: flex; flex-direction: column; gap: var(--e-6); overflow-x: auto; }
.cuadrante { display: flex; gap: var(--e-2); }
.diente { display: flex; flex-direction: column; align-items: center; gap: var(--e-1); }
.diente__rejilla {
  display: grid;
  grid-template-columns: 13px 18px 13px;
  grid-template-rows: 13px 18px 13px;
  width: 44px; height: 44px;
  border-radius: var(--r-sm);
  overflow: hidden;
  background: var(--borde);
}
.diente__cara { border: none; padding: 0; background: var(--superficie); min-height: 0; }
.diente__cara--v { grid-area: 1 / 2; }
.diente__cara--m { grid-area: 2 / 1; }
.diente__cara--o { grid-area: 2 / 2; }
.diente__cara--d { grid-area: 2 / 3; }
.diente__cara--l { grid-area: 3 / 2; }
.diente__numero { font: var(--peso-normal) var(--txt-xs)/1 var(--fuente-mono); color: var(--texto-suave); }

.diente__cara[data-condicion="caries"]   { background: #b91c1c; }
.diente__cara[data-condicion="obturado"] { background: #1d4ed8; }
.diente__cara[data-condicion="corona"]   { background: #7c3aed; }
.diente__cara[data-condicion="ausente"]  { background: #475569; }
.diente__cara[data-condicion="endo"]     { background: #b45309; }
.diente__cara[data-condicion="sellador"] { background: #0891b2; }

/* En tablet el diente crece: el dedo necesita más superficie */
@media (pointer: coarse) {
  .diente__rejilla { grid-template-columns: 17px 22px 17px; grid-template-rows: 17px 22px 17px; width: 56px; height: 56px; }
}

/* ============ VISOR DE RADIOGRAFÍAS ============
   Fondo oscuro siempre, incluso en modo claro. */
.visor { border-radius: var(--r-lg); background: #0b1220; padding: var(--e-4); display: flex; flex-direction: column; gap: var(--e-3); }
.visor__imagen { aspect-ratio: 4 / 3; border-radius: var(--r-md); background: #16233a; object-fit: contain; }
.visor__barra { display: flex; align-items: center; justify-content: space-between; gap: var(--e-3); color: #e8eef7; }
.visor__miniaturas { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--e-2); }
.visor__miniatura { aspect-ratio: 1; border-radius: var(--r-md); background: #16233a; border: 2px solid transparent; }
.visor__miniatura[aria-current="true"] { border-color: var(--color-primario); }

/* ============ FIRMA ============ */
.firma { position: relative; height: 250px; border: 2px dashed var(--borde-fuerte); border-radius: var(--r-lg); background: var(--superficie); overflow: hidden; }
.firma__lienzo { width: 100%; height: 100%; display: block; touch-action: none; cursor: crosshair; }
.firma__marca { position: absolute; inset: 0; display: grid; place-items: center; pointer-events: none; color: var(--texto-suave); }
.firma__renglon { position: absolute; left: var(--e-8); right: var(--e-8); bottom: var(--e-10); height: 1px; background: var(--borde); pointer-events: none; }

/* ── Botones que son <a>: color del texto al pasar el mouse ─────────────────
   base.css declara `a:hover { color: var(--primario-hover); }` con
   especificidad 0-1-1, que gana sobre `.boton--primario` (0-1-0). Resultado:
   al pasar el mouse sobre <a class="boton boton--primario"> el texto tomaba
   exactamente el mismo color que el fondo y la etiqueta desaparecía —el botón
   se veía como un rectángulo oscuro vacío. Se reafirma el color por variante
   con la misma especificidad o mayor. */
a.boton,
a.boton:hover,
a.boton:focus,
a.boton:active                 { text-decoration: none; }

a.boton--primario:hover,
a.boton--primario:focus,
a.boton--primario:active,
a.boton--flotante:hover,
a.boton--flotante:focus        { color: var(--texto-sobre-primario); }

a.boton--peligro:hover,
a.boton--peligro:focus         { color: #fff; }

a.boton--peligro-suave:hover,
a.boton--peligro-suave:focus   { color: var(--error); }

a.boton--secundario:hover,
a.boton--secundario:focus,
a.boton--terciario:hover,
a.boton--terciario:focus,
a.boton--icono:hover,
a.boton--icono:focus           { color: var(--primario-texto); }

a.boton[aria-disabled="true"]:hover { color: var(--texto-suave); }

/* ── Campo de fecha mexicana (fecha-mx.js) ──────────────────────────────────
   El campo visible es de texto y siempre muestra dd/mm/aaaa; el <input> nativo
   queda superpuesto e invisible, conservando el valor ISO para el servidor y
   sirviendo de ancla al calendario del sistema. */
.fecha-mx { position: relative; display: block; width: 100%; }
.fecha-mx > input[type="text"] { width: 100%; padding-right: 42px; font-variant-numeric: tabular-nums; }

.fecha-mx__nativo {
  position: absolute; inset: 0;
  width: 100%; height: 100%; min-height: 0;
  margin: 0; padding: 0; border: 0;
  opacity: 0;
  pointer-events: none;   /* los clics son para el campo de texto */
}

.fecha-mx__boton {
  position: absolute; right: 4px; top: 50%;
  transform: translateY(-50%);
  width: 36px; height: 36px;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: none;
  border-radius: var(--r-sm);
  color: var(--texto-suave);
  cursor: pointer;
}
.fecha-mx__boton:hover { background: var(--primario-tenue); color: var(--primario-texto); }
.fecha-mx__boton:focus-visible { box-shadow: var(--anillo-foco); outline: none; }
.fecha-mx__error { margin-top: var(--e-2); }

/* ── Barra de controles pegada arriba ───────────────────────────────────────
   Para pantallas cuyo contenido es más alto que la ventana (la rejilla de
   horas de la agenda, listados largos): los controles de filtro se quedan
   siempre a la vista en lugar de obligar a subir hasta el tope.

   El ::before extiende el fondo hacia arriba para tapar el relleno superior
   de `.contenido`. Sin él se veía una franja del contenido pasando por encima
   de la barra: un elemento `sticky` no puede subir más allá del borde de
   contenido de su bloque contenedor, así que con márgenes negativos no se
   llega —el navegador lo vuelve a bajar. */
.barra-pegajosa {
  position: sticky;
  top: 0;
  z-index: 5;
  background: var(--lienzo);
  padding-block: var(--e-2);
  margin-bottom: var(--e-2);
}
.barra-pegajosa::before {
  content: "";
  position: absolute;
  left: 0; right: 0;
  top: calc(var(--pad-y, 0px) * -1);
  height: var(--pad-y, 0px);
  background: var(--lienzo);
}

/* ── Pareja de campos que colapsa sola ──────────────────────────────────────
   `grid-template-columns: 1fr 1fr` NO cabe en un celular, y como iba escrito
   en el atributo style de la vista ninguna media query podía corregirlo. Con
   auto-fit la rejilla pasa sola a una columna cuando el ancho no da.

   El `min(100%, 170px)` es la parte importante: sin él, en un contenedor más
   estrecho que 170px la pista se sale y aparece el desbordamiento horizontal
   en vez del colapso. */
.campos-2 {
  display: grid;
  gap: var(--e-4);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 170px), 1fr));
}

/* Un hijo de grid o de flex tiene `min-width: auto`: se niega a encogerse por
   debajo del ancho de su contenido. Bastaba una etiqueta larga —«Apellido
   materno»— para que el campo se saliera de su columna. */
.campo { min-width: 0; }
.campo__control { max-width: 100%; }

/* El modal nunca debe pasarse del alto de la pantalla: en un teléfono bajo, o
   con el teclado abierto, el botón de guardar quedaba fuera de alcance. */
.modal__caja { max-height: min(90dvh, 760px); overflow-y: auto; overscroll-behavior: contain; }
@media (max-width: 639px) { .modal { padding: var(--e-3); } }

/* ══ Historia clínica ═══════════════════════════════════════════════════════
   Dos pantallas muy distintas comparten este bloque:

   · El CUESTIONARIO del paciente (layout `minimal`, en la tableta de la
     clínica). Lo usa alguien de fuera, una sola vez, con el aparato en la
     mano y de pie. Todo aquí está dimensionado para el dedo, no para el ratón:
     la fila entera de una casilla es zona de toque, no solo el cuadrito.
   · La PESTAÑA del expediente, donde la clínica lee y corrige lo contestado.

   Prefijo `hc-` en vez de reutilizar `.campo`: el cuestionario no es un
   formulario de captura de la clínica y no debe cambiar cuando cambien los
   formularios de la clínica. */

.hc-envoltura {
  max-width: 640px;
  margin: 0 auto;
  padding: var(--e-6) var(--e-4) var(--e-12);
}

.hc-cabecera { text-align: center; margin-bottom: var(--e-5); }
.hc-clinica {
  font-size: var(--txt-sm);
  font-weight: var(--peso-semi);
  letter-spacing: var(--track-etiqueta);
  text-transform: uppercase;
  color: var(--primario-texto);
  margin-bottom: var(--e-1);
}
.hc-titulo {
  font-size: var(--txt-xl);
  line-height: var(--alt-apretada);
  letter-spacing: var(--track-titulo);
  color: var(--texto-fuerte);
  margin: 0;
}
.hc-paciente { font-size: var(--txt-sm); color: var(--texto-suave); margin: var(--e-1) 0 0; }

/* La barra de avance no es adorno: 119 preguntas sin saber cuánto falta se
   abandonan a la mitad. */
.hc-avance {
  height: 8px;
  border-radius: var(--r-full);
  background: var(--superficie-3);
  overflow: hidden;
}
.hc-avance__barra {
  height: 100%;
  background: var(--color-primario);
  border-radius: inherit;
  transition: width var(--t-media) var(--curva);
}
.hc-paso {
  font-size: var(--txt-xs);
  color: var(--texto-suave);
  margin: var(--e-2) 0 var(--e-5);
  text-align: right;
}

.hc-seccion {
  font-size: var(--txt-lg);
  font-weight: var(--peso-semi);
  color: var(--texto-fuerte);
  margin: 0 0 var(--e-4);
  padding-bottom: var(--e-2);
  border-bottom: 2px solid var(--primario-borde);
}

/* Fila de casilla: toda la fila es el objetivo de toque. Con el cuadrito
   nativo de 20px como única zona activa, en una tableta se falla y se marca
   la pregunta de al lado — y aquí una pregunta mal marcada es una alergia. */
.hc-casilla {
  display: flex;
  align-items: flex-start;
  gap: var(--e-3);
  min-height: var(--toque-min);
  padding: var(--e-3) var(--e-4);
  margin-bottom: var(--e-2);
  border: 1px solid var(--borde);
  border-radius: var(--r-md);
  background: var(--superficie);
  font-size: var(--txt-base);
  line-height: var(--alt-normal);
  color: var(--texto-fuerte);
  cursor: pointer;
  transition: background var(--t-rapida) var(--curva),
              border-color var(--t-rapida) var(--curva);
}
.hc-casilla input[type="checkbox"] {
  width: 24px; height: 24px;
  margin-top: 1px;
  flex: none;
  accent-color: var(--color-primario);
}
.hc-casilla:hover { background: var(--primario-tenue); }
/* Lo marcado tiene que verse de un vistazo al repasar la pantalla antes de
   pasar a la siguiente. `:has()` no es indispensable: donde no exista, la
   casilla nativa sigue enseñando el estado. */
.hc-casilla:has(input:checked) {
  background: var(--primario-suave);
  border-color: var(--primario-borde);
  font-weight: var(--peso-medio);
}
.hc-casilla:has(input:focus-visible) { box-shadow: var(--anillo-foco); outline: none; }

.hc-campo { margin-bottom: var(--e-4); }
.hc-etiqueta {
  display: block;
  font-size: var(--txt-sm);
  font-weight: var(--peso-medio);
  color: var(--texto-medio);
  margin-bottom: var(--e-2);
}
.hc-ayuda {
  font-size: var(--txt-xs);
  color: var(--texto-suave);
  margin: calc(var(--e-2) * -1) 0 var(--e-3);
  padding-left: var(--e-4);
}

.hc-acciones {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--e-3);
  margin-top: var(--e-6);
}
/* En el celular los dos controles ocupan mitad y mitad: «Siguiente» siempre
   en el mismo sitio, sección tras sección, para que el pulgar no lo busque. */
.hc-acciones > * { flex: 1 1 0; text-align: center; }
.hc-acciones .boton { width: 100%; min-height: var(--toque-min); }

.hc-privacidad {
  font-size: var(--txt-xs);
  line-height: var(--alt-comoda);
  color: var(--texto-suave);
  text-align: center;
  margin: var(--e-8) 0 0;
  padding-top: var(--e-4);
  border-top: 1px solid var(--borde);
}

/* ── Historia clínica: pestaña del expediente ─────────────────────────────── */

.hc-barra {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--e-4);
  flex-wrap: wrap;
  margin-bottom: var(--e-4);
}
.hc-barra__acciones { display: flex; gap: var(--e-2); flex-wrap: wrap; }

/* El enlace de invitación: campo de solo lectura para poder copiarlo y botón
   para abrirlo en la misma tableta. En el celular se apilan. */
.hc-enlace {
  display: flex;
  gap: var(--e-2);
  margin-top: var(--e-3);
  flex-wrap: wrap;
}
.hc-enlace .campo__control {
  flex: 1 1 260px;
  font-family: var(--fuente-mono);
  font-size: var(--txt-xs);
}

/* Una fila por pregunta. La franja izquierda es lo único que hace falta ver
   para saber qué falta por revisar: recorrer 119 preguntas buscando un matiz
   de color no lo hace nadie dos veces. */
.hc-fila {
  padding: var(--e-2) var(--e-3);
  border-bottom: 1px solid var(--borde);
}
.hc-fila:last-child { border-bottom: none; }
.hc-fila--pendiente {
  border-left: 3px solid var(--aviso);
  background: var(--aviso-suave);
  border-radius: var(--r-sm);
}

.hc-origen {
  font-size: var(--txt-xs);
  color: var(--texto-suave);
  margin: var(--e-1) 0 0;
  padding-left: var(--e-8);
}
.hc-origen strong { color: var(--aviso); }

/* La marca de alerta va con símbolo además de color: en una pantalla de
   consultorio con reflejo, y para quien no distingue el rojo, el color solo
   no informa de nada. */
.hc-alerta {
  display: inline-block;
  margin-left: var(--e-2);
  padding: 1px var(--e-2);
  border-radius: var(--r-full);
  background: var(--error-suave);
  border: 1px solid var(--error-borde);
  color: var(--error);
  font-size: var(--txt-xs);
  font-weight: var(--peso-semi);
  white-space: nowrap;
}

.hc-cambios {
  margin: var(--e-2) 0 0;
  padding-left: var(--e-8);
  font-size: var(--txt-xs);
  color: var(--texto-suave);
}
.hc-cambios summary { cursor: pointer; color: var(--primario-texto); }
.hc-cambios ul { margin: var(--e-2) 0 0; padding-left: var(--e-4); }
.hc-cambios li { margin-bottom: var(--e-1); line-height: var(--alt-normal); }
.hc-cambios__fecha { font-family: var(--fuente-mono); }

/* El botón de guardar se queda a la vista: la pantalla mide varias veces el
   alto de la ventana y obligar a bajar hasta el final para guardar un cambio
   hecho arriba es cómo se pierden los cambios. */
.hc-guardar {
  position: sticky;
  bottom: 0;
  display: flex;
  justify-content: flex-end;
  padding: var(--e-3) 0;
  background: linear-gradient(to top, var(--lienzo) 70%, transparent);
}

/* ── Historia clínica: pantalla final del paciente ────────────────────────── */

.hc-fin { text-align: center; padding-top: var(--e-16); }
.hc-fin__icono {
  width: 56px; height: 56px;
  margin: 0 auto var(--e-4);
  padding: var(--e-3);
  border-radius: var(--r-full);
  background: var(--exito-suave);
  color: var(--exito);
}
.hc-fin__texto {
  font-size: var(--txt-base);
  line-height: var(--alt-comoda);
  color: var(--texto-medio);
  margin: var(--e-4) 0 0;
}

/* ── Cruce alergia ↔ medicamento, en la pantalla de recetar ────────────────
   El aviso se queda pegado a la fila del medicamento en lugar de pasar
   flotando por la pantalla: quien acaba de elegir el fármaco está mirando el
   teclado, que es justo donde no se ve un mensaje que se va solo. */
.med-alergia {
  margin-top: var(--e-2);
  padding: var(--e-2) var(--e-3);
  border: 1px solid var(--error-borde);
  border-left: 3px solid var(--error);
  border-radius: var(--r-sm);
  background: var(--error-suave);
  color: var(--texto-fuerte);
  font-size: var(--txt-sm);
  font-weight: var(--peso-medio);
  line-height: var(--alt-normal);
}

/* Lo que dijo el paciente y todavía no ha confirmado nadie de la clínica. */
.hc-sinrevisar {
  display: inline-block;
  padding: 0 var(--e-2);
  border-radius: var(--r-full);
  background: var(--aviso-suave);
  border: 1px solid var(--aviso-borde);
  color: var(--aviso);
  font-size: var(--txt-xs);
  font-weight: var(--peso-semi);
  white-space: nowrap;
}
