/* ═══════════════════════════════════════════════════════
   MOLARIS — Panel de gestión
   Design: Refined dark sidebar · Clean light content
   Inspired by Vercel + Stripe dashboard aesthetics
═══════════════════════════════════════════════════════ */

:root {
  /* ── Brand ─────────────────────────────── */
  --adm-gold:          #C9A96E;
  --adm-gold-light:    #F0E4C8;
  --adm-gold-dark:     #A87C42;
  --adm-gold-dim:      rgba(201,169,110,0.14);
  --adm-gold-dim2:     rgba(201,169,110,0.07);

  /* ── Sidebar (dark) ────────────────────── */
  --adm-navy:          #14131A;
  --adm-navy-2:        #1D1B24;
  --adm-navy-3:        #2A2833;
  --sidebar-hover:     rgba(255,255,255,0.055);
  --sidebar-active:    rgba(255,255,255,0.09);
  --sidebar-border:    rgba(255,255,255,0.07);
  --sidebar-text:      rgba(255,255,255,0.42);
  --sidebar-text-h:    rgba(255,255,255,0.82);

  /* ── Content (light) ───────────────────── */
  /* Hueso, no gris azulado. El gris frio es lo que hace que un panel se lea
     como plantilla; el hueso lo acerca al papel de un consultorio. */
  --adm-bg:            #F6F4EF;
  --adm-white:         #FFFFFF;
  --adm-surface:       #FFFFFF;
  --adm-surface-2:     #FAF8F4;
  /* Superficie apenas mas calida que el blanco, para cabeceras de tabla. */
  --adm-paper:         #FCFAF6;
  --adm-border:        #E3DDD2;
  --adm-border-2:      #D6CFC1;

  /* ── Text ───────────────────────────────── */
  --adm-text:          #1B1917;
  --adm-text-2:        #3E3A35;
  --adm-muted:         #6E685F;
  --adm-subtle:        #797267;
  --adm-text-muted:    #6E685F;

  /* ── Accent colours ────────────────────── */
  --adm-sage:          #22C55E;
  --adm-warning:       #F59E0B;
  --adm-blue:          #3B82F6;
  --adm-red:           #EF4444;

  /* ── Status ─────────────────────────────── */
  --status-pendiente:  #D97706;
  --status-confirmado: #16A34A;
  --status-completado: #2563EB;
  --status-cancelado:  #DC2626;

  /* ── Layout ─────────────────────────────── */
  --sidebar-w:   252px;
  --topbar-h:    64px;
  /* Radios más generosos: es de lo que más separa un panel que se siente
     actual de uno que parece de 2015. */
  --radius:      10px;
  --radius-lg:   14px;
  --radius-xl:   18px;

  /* Curva de animación propia. La de por defecto del navegador (ease) tiene
     un arranque perezoso que hace sentir lento todo lo que se mueve. */
  --ease:        cubic-bezier(.32,.72,0,1);

  /* ── Typography ─────────────────────────── */
  --font-serif: 'Playfair Display', Georgia, serif;
  --font-sans:  'Outfit', 'DM Sans', system-ui, sans-serif;

  /* ── Shadows ──────────────────────────────
     Cada una arranca con una línea de 1px muy tenue en vez de un borde
     sólido: es lo que le da el aire liviano a los paneles actuales. La
     sombra difusa va aparte y más suave, para que no se vea "pegoteada". */
  /* El anillo va en .10 y no más abajo: por debajo de eso queda MÁS CLARO
     que el fondo de la página (#F4F4F7) y la tarjeta pierde el borde. */
  /* Marron tibio en vez de gris: una sombra fria sobre fondo hueso se ve
     sucia, como si la tarjeta no perteneciera a la pagina. */
  --shadow-xs:  0 0 0 1px rgba(58,46,30,.10), 0 1px 2px rgba(58,46,30,.05);
  --shadow-sm:  0 0 0 1px rgba(58,46,30,.11), 0 1px 3px rgba(58,46,30,.06), 0 2px 8px -2px rgba(58,46,30,.05);
  --shadow-md:  0 0 0 1px rgba(58,46,30,.11), 0 4px 12px -2px rgba(58,46,30,.08), 0 12px 28px -8px rgba(58,46,30,.11);
  --shadow-lg:  0 0 0 1px rgba(58,46,30,.11), 0 12px 28px -8px rgba(58,46,30,.13), 0 24px 48px -12px rgba(58,46,30,.13);
  --shadow-xl:  0 0 0 1px rgba(58,46,30,.11), 0 24px 48px -12px rgba(58,46,30,.19), 0 40px 80px -20px rgba(58,46,30,.17);

  /* Tres tiempos, con criterio, en vez de "200ms en todo". Lo que se recorre
     mucho (filas, caras del odontograma) tiene que sentirse instantaneo; lo
     que aparece de la nada necesita que el ojo lo alcance. */
  --t-rapido:   90ms;
  --t-normal:   160ms;
  --t-entrada:  280ms;
}

/* ── Reset ── */
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{font-size:15px;-webkit-text-size-adjust:100%}
body{font-family:var(--font-sans);background:var(--adm-bg);color:var(--adm-text);min-height:100vh;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}
a{color:inherit;text-decoration:none}
button{font-family:var(--font-sans);cursor:pointer}
input,select,textarea{font-family:var(--font-sans)}
svg{stroke:currentColor;fill:none;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}

/* ═══ LOGIN ═══ */
.login-screen{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;position:relative;overflow:hidden;background:var(--adm-navy)}
.login-screen::before{content:'';position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(ellipse 80% 60% at 20% 50%,rgba(201,169,110,.10) 0%,transparent 65%),radial-gradient(ellipse 60% 80% at 80% 20%,rgba(62,62,80,.5) 0%,transparent 70%);
  background:radial-gradient(ellipse 80% 60% at 20% 50%,color-mix(in srgb,var(--adm-gold) 10%,transparent) 0%,transparent 65%),radial-gradient(ellipse 60% 80% at 80% 20%,rgba(62,62,80,.5) 0%,transparent 70%)}
.login-screen::after{content:'';position:absolute;bottom:-20%;left:-10%;width:60%;height:60%;border-radius:50%;background:radial-gradient(circle,rgba(201,169,110,.06) 0%,transparent 70%);
  background:radial-gradient(circle,color-mix(in srgb,var(--adm-gold) 7%,transparent) 0%,transparent 70%);pointer-events:none}
.login-box{background:var(--adm-white);border-radius:20px;padding:52px 44px 44px;width:100%;max-width:400px;box-shadow:var(--shadow-xl);text-align:center;position:relative;z-index:1;border:1px solid rgba(255,255,255,.06)}
.login-logo{font-family:var(--font-serif);font-size:28px;font-weight:700;color:var(--adm-navy);letter-spacing:8px;margin-bottom:6px}
.login-logo.has-logo{height:56px;letter-spacing:0;margin-bottom:10px;display:flex;align-items:center;justify-content:center}
.sidebar__logo.has-logo{display:inline-flex;align-items:center;height:34px;letter-spacing:0}
.login-logo-bar{width:28px;height:2.5px;background:var(--adm-gold);margin:10px auto 0;border-radius:2px}
.login-sub{font-size:11px;color:var(--adm-muted);letter-spacing:1.5px;text-transform:uppercase;margin-top:14px;margin-bottom:36px;font-weight:500}
.login-group{display:flex;flex-direction:column;gap:6px;margin-bottom:16px;text-align:left}
.login-group label{font-size:11px;font-weight:600;letter-spacing:.8px;text-transform:uppercase;color:var(--adm-muted)}
.login-group input{width:100%;padding:12px 14px;border:1.5px solid var(--adm-border);border-radius:10px;font-size:14px;color:var(--adm-text);background:var(--adm-bg);outline:none;transition:border-color .2s,box-shadow .2s,background .2s;font-family:var(--font-sans)}
.login-group input:focus{border-color:var(--adm-gold);background:var(--adm-white);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.login-error{background:#FEF2F2;color:#991B1B;font-size:13px;padding:10px 14px;border-radius:8px;border:1px solid rgba(153,27,27,.15);margin-bottom:14px;display:none;text-align:left;line-height:1.4}
.login-error.visible{display:block}
.login-btn{width:100%;padding:13px;background:var(--adm-navy);color:#fff;border:none;border-radius:10px;font-size:12px;font-weight:600;letter-spacing:1.5px;text-transform:uppercase;cursor:pointer;transition:background .2s,transform .15s,box-shadow .2s;display:flex;align-items:center;justify-content:center;gap:10px;margin-top:10px;box-shadow:0 2px 10px rgba(14,14,19,.3)}
.login-btn:hover{background:var(--adm-navy-3);transform:translateY(-1px);box-shadow:0 4px 16px rgba(14,14,19,.35)}
.login-btn:active{transform:translateY(0)}
.login-btn:disabled{opacity:.65;cursor:not-allowed;transform:none;box-shadow:none}
.login-btn__spinner{width:15px;height:15px;border:2px solid rgba(255,255,255,.28);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite;display:none}
.login-btn.loading .login-btn__spinner{display:block}
.login-btn.loading .login-btn__text{opacity:.5}
.login-back{display:inline-block;margin-top:22px;font-size:13px;color:var(--adm-subtle);transition:color .2s}
.login-back:hover{color:var(--adm-navy)}
@keyframes spin{to{transform:rotate(360deg)}}

/* ═══ LAYOUT ═══ */
.admin-panel{display:flex;min-height:100vh}

/* ═══ SIDEBAR ═══ */
/* Degradado casi imperceptible en vez de un negro plano: le da profundidad
   a la barra sin que se note el truco. El borde derecho evita el corte duro
   contra el contenido claro. */
.sidebar{width:var(--sidebar-w);
  background:repeating-linear-gradient(58deg,rgba(255,255,255,.016) 0 1px,transparent 1px 7px),
             linear-gradient(180deg,#1C1A24 0%,var(--adm-navy) 45%,#0D0C12 100%);
  border-right:1px solid rgba(0,0,0,.4);
  display:flex;flex-direction:column;flex-shrink:0;position:fixed;top:0;left:0;bottom:0;z-index:100;
  transition:transform .34s var(--ease)}
.sidebar__brand{padding:24px 20px 20px;border-bottom:1px solid var(--sidebar-border)}
.sidebar__logo{font-family:var(--font-serif);font-size:20px;font-weight:700;color:#fff;letter-spacing:6px;display:block}
.sidebar__sub{font-size:9px;letter-spacing:2px;text-transform:uppercase;color:var(--adm-gold);display:block;margin-top:4px;opacity:.8;font-weight:500}
.sidebar__nav{flex:1;padding:12px 10px;overflow-y:auto;scrollbar-width:none}
.sidebar__nav::-webkit-scrollbar{display:none}
.sidebar__group-title{font-size:9.5px;font-weight:600;letter-spacing:1.2px;text-transform:uppercase;color:rgba(255,255,255,.28);padding:12px 12px 6px;user-select:none}
.sidebar__group-title:first-child{padding-top:2px}
.sidebar__link{display:flex;align-items:center;gap:10px;padding:9px 12px;font-size:13px;font-weight:400;
  color:var(--sidebar-text);transition:color .2s var(--ease),background .2s var(--ease);
  position:relative;border-radius:var(--radius);margin-bottom:1px;letter-spacing:.1px}
.sidebar__link svg{width:16px;height:16px;flex-shrink:0;opacity:.55;transition:opacity .2s var(--ease),transform .2s var(--ease)}
.sidebar__link:hover{color:var(--sidebar-text-h);background:var(--sidebar-hover)}
.sidebar__link:hover svg{opacity:.85;transform:scale(1.06)}
/* El activo lleva un tinte del color de la clínica, no un gris neutro: así
   la marca aparece también en la navegación y no solo en los botones. */
.sidebar__link.active{color:#fff;font-weight:500;
  background:linear-gradient(90deg,var(--adm-gold-dim) 0%,var(--sidebar-active) 60%)}
.sidebar__link.active svg{opacity:1;color:var(--adm-gold)}
/* La barrita del activo crece desde el centro al entrar */
.sidebar__link.active::before{content:'';position:absolute;left:0;top:50%;transform:translateY(-50%);
  height:18px;width:3px;background:var(--adm-gold);border-radius:0 3px 3px 0;
  box-shadow:0 0 12px var(--adm-gold);animation:sidebarMarca .3s var(--ease)}
@keyframes sidebarMarca{from{height:0;opacity:0}to{height:18px;opacity:1}}
.sidebar__divider{height:1px;background:var(--sidebar-border);margin:6px 0}
.sidebar__footer{padding:12px 14px;border-top:1px solid var(--sidebar-border);display:flex;align-items:center;justify-content:space-between;gap:8px}
.sidebar__user{display:flex;align-items:center;gap:9px;overflow:hidden;flex:1}
.sidebar__avatar{width:32px;height:32px;border-radius:8px;background:linear-gradient(135deg,var(--adm-gold) 0%,var(--adm-gold-dark) 100%);color:#fff;font-size:13px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.sidebar__user-info{overflow:hidden;flex:1}
.sidebar__user-name{font-size:13px;font-weight:500;color:rgba(255,255,255,.82);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block}
.sidebar__user-role{font-size:10px;color:rgba(255,255,255,.3);display:block;margin-top:1px;text-transform:uppercase;letter-spacing:.5px}
.sidebar__logout{background:none;border:none;color:rgba(255,255,255,.28);cursor:pointer;padding:7px;border-radius:8px;transition:color .18s,background .18s;display:flex;align-items:center;flex-shrink:0}
.sidebar__logout:hover{color:rgba(255,255,255,.8);background:rgba(255,255,255,.07)}
.sidebar__logout svg{width:16px;height:16px}
.sidebar-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:99;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px)}

/* ═══ MAIN ═══ */
.admin-main{flex:1;margin-left:var(--sidebar-w);display:flex;flex-direction:column;min-height:100vh;min-width:0}

/* ═══ TOPBAR ═══ */
.admin-topbar{height:var(--topbar-h);background:var(--adm-white);border-bottom:1px solid var(--adm-border);
  box-shadow:0 1px 0 rgba(58,46,30,.03);display:flex;align-items:center;padding:0 24px;gap:14px;position:sticky;top:0;z-index:50}
.topbar__menu-btn{display:none;background:none;border:none;color:var(--adm-muted);padding:7px;border-radius:var(--radius);cursor:pointer;transition:background .18s,color .18s}
.topbar__menu-btn svg{width:20px;height:20px}
.topbar__menu-btn:hover{background:var(--adm-bg);color:var(--adm-text)}
.topbar__title{font-family:var(--font-serif);font-size:21px;font-weight:600;color:var(--adm-text);
  flex:1;letter-spacing:-.2px;line-height:1.15;position:relative;padding-bottom:7px;margin-top:6px}
/* La regla dorada bajo el titulo es la firma que se repite en las 10
   pantallas. Se apaga hacia la derecha para que no parezca un subrayado. */
.topbar__title::after{content:'';position:absolute;left:0;bottom:0;width:30px;height:2px;border-radius:2px;
  background:linear-gradient(90deg,var(--adm-gold) 0%,transparent 100%)}
.topbar__actions{display:flex;align-items:center;gap:8px}
.topbar__refresh,.topbar__site-link{display:inline-flex;align-items:center;gap:6px;padding:7px 13px;border-radius:var(--radius);font-size:12px;font-weight:500;border:1px solid var(--adm-border);color:var(--adm-muted);background:var(--adm-white);cursor:pointer;transition:all .18s;font-family:var(--font-sans)}
.topbar__refresh svg,.topbar__site-link svg{width:13px;height:13px}
.topbar__refresh:hover{border-color:var(--adm-border-2);color:var(--adm-text);background:var(--adm-bg)}
.topbar__site-link:hover{border-color:var(--adm-gold);color:var(--adm-gold);background:var(--adm-gold-dim2)}
.topbar__refresh.spinning svg{animation:spin .8s linear infinite}

/* ═══ SECTIONS ═══ */
.admin-section{padding:28px 28px 40px;flex:1}

/* ═══ KPI CARDS ═══ */
.kpi-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin-bottom:22px}

/* ── Dashboard de gestión: filtros, alertas y resumen ── */
.dash-filtros{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:18px}
/* Resumen del día de Moni. Se lee como una nota de alguien, no como otro
   KPI: por eso lleva avatar y nombre, y el texto va en serif. */
.dash-moni {
  background: var(--adm-surface);
  border: 1px solid var(--adm-border);
  border-left: 3px solid var(--adm-gold);
  border-radius: var(--radius);
  padding: 1rem 1.15rem;
  margin-bottom: 1rem;
}
.dash-moni__cab { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.dash-moni__avatar {
  width: 24px; height: 24px; border-radius: 50%;
  background: var(--adm-gold); color: var(--adm-navy);
  display: grid; place-items: center;
  font-family: var(--font-serif); font-size: .8rem; font-weight: 600;
}
.dash-moni__nombre {
  font-size: .8rem; font-weight: 600; letter-spacing: .04em;
  text-transform: uppercase; color: var(--adm-muted);
}
.dash-moni__txt {
  font-family: var(--font-serif);
  font-size: 1.02rem; line-height: 1.55;
  color: var(--adm-text); margin: 0;
}
.dash-moni__acciones { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: .85rem; }
.dash-alertas{display:flex;flex-direction:column;gap:8px;margin-bottom:22px}
.dash-alerta{display:flex;align-items:center;gap:12px;padding:12px 16px;
  background:var(--adm-white);border-radius:var(--radius);
  border-left:3px solid var(--adm-border);box-shadow:var(--shadow-sm)}
.dash-alerta__txt{flex:1;font-size:13.5px;color:var(--adm-text);min-width:0}
.dash-alerta--alta{border-left-color:#DC2626}
.dash-alerta--media{border-left-color:var(--adm-warning)}
.dash-alerta--baja{border-left-color:var(--adm-border-2)}
.dash-alerta svg{width:16px;height:16px;flex-shrink:0;opacity:.7}
.dash-alerta--alta svg{color:#DC2626;opacity:1}
.dash-delta{font-size:11.5px;font-weight:600;margin-top:2px;display:block}
.dash-delta--sube{color:#15803D}
.dash-delta--baja{color:#B91C1C}
.dash-delta--neutro{color:var(--adm-subtle);font-weight:400}
.dash-tramos{display:flex;flex-direction:column;gap:8px}
.dash-tramo{display:flex;align-items:center;gap:10px;font-size:12.5px}
.dash-tramo__lbl{width:82px;flex-shrink:0;color:var(--adm-muted)}
.dash-tramo__track{flex:1;height:8px;background:var(--adm-bg);border-radius:4px;overflow:hidden}
.dash-tramo__fill{height:100%;border-radius:4px;background:var(--adm-gold)}
.dash-tramo--viejo .dash-tramo__fill{background:#DC2626}
.dash-tramo__val{width:110px;text-align:right;font-weight:600;flex-shrink:0}
@media(max-width:640px){
  .dash-alerta{flex-wrap:wrap}
  .dash-alerta__txt{flex-basis:100%}
  .dash-tramo__lbl{width:64px}
  .dash-tramo__val{width:88px;font-size:11.5px}
}
.kpi-card{background:var(--adm-white);border-radius:var(--radius-xl);padding:20px 22px;display:flex;flex-direction:column;gap:14px;box-shadow:var(--shadow-sm);transition:box-shadow .24s var(--ease),transform .24s var(--ease);position:relative;overflow:hidden}
.kpi-card:hover{box-shadow:var(--shadow-md);transform:translateY(-2px)}
.kpi-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;border-radius:var(--radius-lg) var(--radius-lg) 0 0;opacity:0;transition:opacity .22s}
.kpi-card:hover::before{opacity:1}
.kpi-card:nth-child(1)::before{background:var(--adm-gold)}
.kpi-card:nth-child(2)::before{background:var(--adm-blue)}
.kpi-card:nth-child(3)::before{background:var(--adm-sage)}
.kpi-card:nth-child(4)::before{background:var(--adm-warning)}
.kpi-card__ico{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.kpi-card__ico svg{width:19px;height:19px}
.kpi-card__ico--gold{background:var(--adm-gold-dim);color:var(--adm-gold-dark)}
.kpi-card__ico--navy{background:rgba(59,130,246,.10);color:var(--adm-blue)}
.kpi-card__ico--sage{background:rgba(34,197,94,.10);color:var(--adm-sage)}
.kpi-card__ico--warning{background:rgba(245,158,11,.10);color:var(--adm-warning)}
.kpi-card__ico svg{stroke:currentColor;fill:none}
.kpi-card__body{display:flex;flex-direction:column;gap:4px}
.kpi-card__label{font-size:10.5px;color:var(--adm-muted);font-weight:600;letter-spacing:.7px;text-transform:uppercase}
/* Cifra en serif y con ancho de digito fijo: una columna de numeros que no
   baila al actualizarse, y el peso de un balance en vez de un contador. */
.kpi-card__value{font-family:var(--font-serif);font-size:27px;font-weight:600;color:var(--adm-text);
  line-height:1.05;letter-spacing:-.5px;font-variant-numeric:lining-nums tabular-nums}
.kpi-card--principal{grid-column:span 2;padding:24px 26px}
.kpi-card--principal .kpi-card__value{font-size:40px}
.kpi-card--principal .kpi-card__ico{width:46px;height:46px;border-radius:13px}
.kpi-card--principal .kpi-card__ico svg{width:22px;height:22px}
/* Halo del color de la clinica en la esquina: marca jerarquia sin agrandar
   la tipografia ni pedirle una fila entera a la grilla. */
.kpi-card--principal::after{content:'';position:absolute;top:-40%;right:-15%;width:60%;height:160%;z-index:0;
  background:radial-gradient(circle,var(--adm-gold-dim) 0%,transparent 70%);pointer-events:none}
.kpi-card__ico,.kpi-card__body{position:relative;z-index:1}
/* Los tres de apoyo van monocromos: el color repartido en cuatro no
   jerarquiza nada, solo hace ruido. */
.kpi-card:not(.kpi-card--principal) .kpi-card__ico{background:var(--adm-surface-2);color:var(--adm-muted);width:34px;height:34px;border-radius:9px}
.kpi-card:not(.kpi-card--principal) .kpi-card__ico svg{width:16px;height:16px}

/* ═══ DASH GRID / CARDS ═══ */
.dash-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:14px}
/* Los elementos de una grilla no se encogen por debajo de su contenido salvo
   que se les diga. Sin esto, una tabla con min-width empuja su tarjeta más
   allá del ancho disponible y aparece scroll horizontal en TODA la página,
   en vez de scrollear dentro de la tabla como corresponde. */
.dash-grid > *,.kpi-grid > *{min-width:0}
/* Sin borde: el anillo de 1px ya viene en la sombra. Dos líneas encimadas
   es lo que hacía que las tarjetas se vieran pesadas. */
.dash-card{background:var(--adm-white);border-radius:var(--radius-xl);padding:24px 26px;
  box-shadow:var(--shadow-sm);margin-bottom:14px;transition:box-shadow .24s var(--ease)}
.dash-card:hover{box-shadow:var(--shadow-md)}
.dash-card h3{font-size:11px;font-weight:600;color:var(--adm-muted);margin-bottom:18px;
  letter-spacing:.8px;text-transform:uppercase}
.dash-card h3 .dash-card__sub{text-transform:none;letter-spacing:0}
.dash-card__sub{font-size:12px;color:var(--adm-subtle);font-weight:400;margin-left:5px}

/* ═══ BAR CHART ═══ */
.bar-chart{display:flex;flex-direction:column;gap:9px}
.bar-item{display:flex;align-items:center;gap:10px}
.bar-item__label{font-size:12px;color:var(--adm-muted);width:140px;flex-shrink:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bar-item__track{flex:1;height:6px;background:var(--adm-bg);border-radius:3px;overflow:hidden}
.bar-item__fill{height:100%;background:linear-gradient(90deg,var(--adm-gold) 0%,var(--adm-gold-dark) 100%);border-radius:3px;transition:width .7s cubic-bezier(.25,.46,.45,.94)}
.bar-item__val{font-size:12px;font-weight:600;color:var(--adm-text-2);min-width:26px;text-align:right}

/* ═══ ACTIVITY CHART ═══ */
.activity-chart{display:flex;align-items:flex-end;gap:4px;height:88px;overflow-x:auto;padding-bottom:4px;scrollbar-width:thin;scrollbar-color:var(--adm-border) transparent}
.activity-bar{flex-shrink:0;display:flex;flex-direction:column;align-items:center;gap:3px;cursor:default;position:relative}
.activity-bar__fill{width:18px;background:var(--adm-navy);border-radius:3px 3px 0 0;min-height:4px;transition:background .18s,transform .12s}
.activity-bar:hover .activity-bar__fill{background:var(--adm-gold);transform:scaleY(1.05);transform-origin:bottom}
.activity-bar__lbl{font-size:9px;color:var(--adm-subtle);writing-mode:vertical-lr;transform:rotate(180deg);white-space:nowrap;max-height:38px;overflow:hidden}

/* ═══ MINI TABLE ═══ */
.mini-table-wrap{overflow-x:auto}
.mini-table{width:100%;border-collapse:collapse;font-size:13px}
.mini-table th{text-align:left;font-size:10px;font-weight:600;letter-spacing:.7px;text-transform:uppercase;color:var(--adm-subtle);padding:0 10px 10px;border-bottom:1px solid var(--adm-border)}
.mini-table td{padding:10px;border-bottom:1px solid var(--adm-border);color:var(--adm-text);vertical-align:middle}
.mini-table tbody tr:last-child td{border-bottom:none}
.mini-table tbody tr{transition:background var(--t-rapido) var(--ease)}
.mini-table tbody tr:hover td{background:var(--adm-gold-dim2)}

/* ═══ TOOLBAR ═══ */
.section-toolbar{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:18px;flex-wrap:wrap}
/* Mismo motivo que en las grillas: sin esto los grupos de la barra no se
   dejan encoger, no llegan a reacomodarse en dos filas y desbordan. */
.section-toolbar > *{min-width:0;flex-wrap:wrap}
.toolbar-left{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* La lupa va incrustada como data-URI, y ahí adentro no entra var(): el color
   queda escrito a mano. Es el valor de --adm-muted; si ese token cambia de
   tono, este hexadecimal hay que cambiarlo acá. */
.toolbar-search{padding:8px 14px 8px 36px;border:1.5px solid var(--adm-border);border-radius:var(--radius);font-size:13px;color:var(--adm-text);background:var(--adm-white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%236E685F' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E") no-repeat 11px center;width:230px;outline:none;transition:border-color .18s,box-shadow .18s;font-family:var(--font-sans)}
.toolbar-search:focus{border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.toolbar-date{padding:8px 10px;border:1.5px solid var(--adm-border);border-radius:var(--radius);font-size:12px;color:var(--adm-text);background:var(--adm-white);outline:none;transition:border-color .18s;font-family:var(--font-sans)}
.toolbar-date:focus{border-color:var(--adm-gold)}
/* Los botones oscuros llevan un degradado sutil y un brillo interno arriba:
   es lo que los hace ver con relieve en vez de un rectángulo plano. */
.toolbar-btn{padding:8px 16px;background:linear-gradient(180deg,var(--adm-navy-3) 0%,var(--adm-navy) 100%);
  color:#fff;border:1px solid transparent;border-radius:var(--radius);font-size:12px;font-weight:500;
  letter-spacing:.2px;cursor:pointer;font-family:var(--font-sans);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08), var(--shadow-xs);
  transition:filter .2s var(--ease),transform .14s var(--ease),box-shadow .2s var(--ease)}
.toolbar-btn:hover{filter:brightness(1.22);transform:translateY(-1px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.1), var(--shadow-sm)}
.toolbar-btn:active{transform:translateY(0);filter:brightness(.95)}
.toolbar-btn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--adm-gold-dim),0 0 0 1px var(--adm-gold)}
.toolbar-btn--ghost{background:var(--adm-white);color:var(--adm-muted);border-color:var(--adm-border);
  box-shadow:var(--shadow-xs)}
.toolbar-btn--ghost:hover{background:var(--adm-bg);color:var(--adm-text);border-color:var(--adm-border-2);
  box-shadow:var(--shadow-xs);transform:none;filter:none}
.total-count{font-size:12px;color:var(--adm-muted);white-space:nowrap;background:var(--adm-bg);padding:5px 12px;border-radius:20px;border:1px solid var(--adm-border);font-weight:500}

/* ═══ DATA TABLE ═══ */
.table-wrap{background:var(--adm-white);border-radius:var(--radius-xl);overflow-x:auto;
  -webkit-overflow-scrolling:touch;box-shadow:var(--shadow-sm)}
.data-table{width:100%;min-width:600px;border-collapse:collapse;font-size:13px}
.data-table thead tr{background:var(--adm-paper);border-bottom:1px solid var(--adm-border)}
.data-table th{padding:11px 16px;text-align:left;font-size:10px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:var(--adm-subtle);white-space:nowrap}
.data-table td{padding:13px 16px;border-bottom:1px solid var(--adm-border);color:var(--adm-text);vertical-align:middle}
.data-table tbody tr:last-child td{border-bottom:none}
/* Rapido a proposito: es lo que mas se recorre con el mouse en todo el
   panel, y cualquier demora ahi se siente como que el panel arrastra. */
.data-table tbody tr{transition:background var(--t-rapido) var(--ease),box-shadow var(--t-rapido) var(--ease)}
.data-table tbody tr:hover td{background:var(--adm-gold-dim2)}
.data-table tbody tr:hover td:first-child{box-shadow:inset 3px 0 0 var(--adm-gold)}
.table-loading{text-align:center!important;padding:52px!important;color:var(--adm-subtle)!important;font-size:13px}

/* ═══ BADGES ═══ */
.badge{display:inline-flex;align-items:center;gap:6px;padding:3px 11px 3px 8px;border-radius:20px;
  font-size:11px;font-weight:600;letter-spacing:.2px;text-transform:capitalize;white-space:nowrap;
  box-shadow:inset 0 0 0 1px rgba(0,0,0,.045)}
.badge::before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0}
.badge--pendiente{background:rgba(217,119,6,.10);color:#B45309}
.badge--confirmado{background:rgba(22,163,74,.10);color:#15803D}
.badge--completado{background:rgba(37,99,235,.10);color:#1D4ED8}
.badge--cancelado{background:rgba(220,38,38,.10);color:#B91C1C}
.badge--ausente{background:rgba(220,38,38,.16);color:#991B1B}
.badge--propuesto{background:rgba(217,119,6,.14);color:#92400E}

/* ═══ ACTION BUTTONS ═══ */
.action-btn{background:var(--adm-white);border:1px solid var(--adm-border);border-radius:6px;padding:5px 11px;font-size:12px;font-weight:500;color:var(--adm-muted);cursor:pointer;transition:all .18s;display:inline-flex;align-items:center;gap:5px;font-family:var(--font-sans)}
.action-btn:hover{border-color:var(--adm-border-2);color:var(--adm-text);background:var(--adm-bg);box-shadow:var(--shadow-xs)}
.action-btn svg{width:12px;height:12px}
.action-btn--danger{color:var(--status-cancelado);border-color:rgba(220,38,38,.2)}
.action-btn--danger:hover{border-color:rgba(220,38,38,.4);background:rgba(220,38,38,.05);color:var(--status-cancelado);box-shadow:none}

/* ═══ EMPTY INFO ═══ */
.empty-info{display:flex;align-items:center;gap:12px;padding:14px 18px;background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius);margin-bottom:18px;color:var(--adm-muted);font-size:13px;box-shadow:var(--shadow-xs)}
.empty-info svg{stroke:var(--adm-subtle);flex-shrink:0}
/* Importador de pacientes */
.imp-chip{display:inline-block;background:var(--adm-bg);border:1px solid var(--adm-border);
  border-radius:20px;padding:2px 9px;font-size:11px;margin:2px 1px;color:var(--adm-muted)}
.imp-detalle{margin-bottom:14px;font-size:12.5px;color:var(--adm-muted)}
.imp-detalle summary{cursor:pointer;padding:6px 0;color:var(--adm-gold)}
.imp-detalle ul{margin:6px 0 0;padding-left:18px;line-height:1.7;max-height:150px;overflow:auto}

/* Con el segundo factor apagado, su columna no ocupa lugar */
body.sin-2fa .col-2fa{display:none}

/* Segundo factor: login paso 2 */
.login-2fa-intro{text-align:center;margin-bottom:18px}
.login-2fa-icono{font-size:30px;margin-bottom:8px}
.login-2fa-intro p{font-size:13.5px;color:var(--adm-muted);margin:0;line-height:1.5}
#login2faCodigo{text-align:center;font-size:22px;letter-spacing:6px;font-variant-numeric:tabular-nums}
.login-2fa-ayuda{font-size:12px;color:var(--adm-subtle);text-align:center;margin-top:16px;line-height:1.6}
.login-link{background:none;border:none;color:var(--adm-gold);cursor:pointer;font-size:12px;padding:4px;text-decoration:underline}

/* Segundo factor: panel de la cuenta */
.seg-estado{display:flex;flex-direction:column;gap:4px;padding:14px 16px;border-radius:10px;margin-bottom:16px}
.seg-estado strong{font-size:14px}
.seg-estado span{font-size:12.5px;line-height:1.5;opacity:.85}
.seg-estado--on{background:#eaf7ef;border:1px solid #b7e2c7;color:#1e6b3a}
.seg-estado--off{background:#fdf3f2;border:1px solid #f0c2bd;color:#8c2f22}
.seg-texto{font-size:13px;color:var(--adm-muted);line-height:1.6;margin:0 0 16px}
.seg-nota{font-size:12px;color:var(--adm-subtle);margin:0 0 16px;line-height:1.5}
/* Aviso legal: tiene que leerse, pero no gritar como un error */
.seg-nota--aviso{background:#FFF8E6;border:1px solid #F0DFA8;color:#7A5C12;border-radius:8px;padding:10px 12px}
.seg-alerta{color:#8c2f22}
.seg-secreto{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:15px;letter-spacing:1px;
  background:var(--adm-bg);border:1px dashed var(--adm-border);border-radius:8px;padding:14px;
  text-align:center;word-break:break-all;cursor:pointer;margin-bottom:10px;line-height:1.7}
.seg-codigos{list-style:none;padding:14px;margin:0 0 16px;background:var(--adm-bg);
  border:1px solid var(--adm-border);border-radius:8px;display:grid;
  grid-template-columns:repeat(2,1fr);gap:8px;font-family:ui-monospace,Menlo,Consolas,monospace;
  font-size:13.5px;text-align:center;letter-spacing:.5px}

/* Aviso en el login cuando la sesión se cerró sola */
.login-aviso{padding:10px 14px;margin-bottom:12px;background:#fdf6e3;border:1px solid #e6d5a8;border-radius:8px;color:#8a6d3b;font-size:13px;line-height:1.45}

/* Aviso previo al cierre por inactividad */
.inac-modal{position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;background:rgba(14,14,19,.72);backdrop-filter:blur(3px);padding:20px}
.inac-box{background:var(--adm-white);border-radius:14px;padding:30px 32px;max-width:380px;width:100%;text-align:center;box-shadow:0 18px 50px rgba(0,0,0,.3)}
.inac-icono{font-size:34px;line-height:1;margin-bottom:12px}
.inac-box h3{margin:0 0 10px;font-size:19px;color:var(--adm-dark)}
.inac-box p{margin:0 0 8px;font-size:14px;color:var(--adm-muted);line-height:1.5}
.inac-box .inac-nota{font-size:12.5px;color:var(--adm-subtle);margin-bottom:20px}
.inac-box strong{color:#c0392b;font-size:17px}

/* Aviso de permisos mal configurados (usuario doctor sin profesional) */
.aviso-permisos{display:flex;align-items:flex-start;gap:10px;margin-top:14px;padding:12px 16px;background:#fdf3f2;border:1px solid #f0c2bd;border-left:3px solid #c0392b;border-radius:var(--radius);color:#8c2f22;font-size:13px;line-height:1.5}

/* ═══ MODAL ═══ */
.modal{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;padding:24px}
.modal__backdrop{position:absolute;inset:0;background:rgba(26,20,12,.62);backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.modal__box{position:relative;background:var(--adm-white);border-radius:var(--radius-xl);width:100%;max-width:520px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-xl);animation:modalIn var(--t-entrada) var(--ease);border:1px solid rgba(0,0,0,.06)}
@keyframes modalIn{from{opacity:0;transform:scale(.93) translateY(14px)}to{opacity:1;transform:scale(1) translateY(0)}}
.modal__header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--adm-border)}
.modal__header h2{font-family:var(--font-serif);font-size:19px;font-weight:600;color:var(--adm-text);letter-spacing:-.2px}
.modal__close{background:none;border:none;width:28px;height:28px;border-radius:7px;font-size:14px;color:var(--adm-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:color .18s,background .18s}
.modal__close:hover{color:var(--adm-text);background:var(--adm-bg)}
.modal__body{padding:22px 24px}
.modal-detail{display:flex;flex-direction:column;gap:8px}
.modal-row{display:flex;gap:10px;align-items:flex-start;font-size:13px;padding:9px 12px;border-radius:var(--radius);background:var(--adm-bg);border:1px solid var(--adm-border)}
.modal-row strong{width:100px;flex-shrink:0;font-size:10px;font-weight:600;letter-spacing:.4px;text-transform:uppercase;color:var(--adm-subtle);padding-top:2px}
.modal-row span{color:var(--adm-text);line-height:1.5}
.modal__footer{padding:15px 24px;border-top:1px solid var(--adm-border);display:flex;gap:8px;align-items:center;flex-wrap:wrap;background:var(--adm-surface-2);border-radius:0 0 var(--radius-xl) var(--radius-xl)}
.modal-select{padding:8px 12px;border:1.5px solid var(--adm-border);border-radius:var(--radius);font-size:13px;color:var(--adm-text);background:var(--adm-white);outline:none;cursor:pointer;flex:1;transition:border-color .18s;-webkit-appearance:none;appearance:none;font-family:var(--font-sans)}
.modal-select:focus{border-color:var(--adm-gold)}
.modal-btn{padding:8px 18px;border-radius:var(--radius);font-size:12px;font-weight:600;letter-spacing:.2px;cursor:pointer;border:none;transition:background .18s,transform .12s,box-shadow .18s;font-family:var(--font-sans)}
.modal-btn--save{background:var(--adm-navy);color:#fff}
.modal-btn--save:hover{background:var(--adm-navy-3);transform:translateY(-1px);box-shadow:var(--shadow-sm)}
.modal-btn--save:active{transform:translateY(0)}
.modal-btn--delete{background:rgba(220,38,38,.08);color:#B91C1C}
.modal-btn--delete:hover{background:rgba(220,38,38,.15)}

/* ═══ TOAST ═══ */
.toast{position:fixed;bottom:80px;right:24px;padding:11px 18px;border-radius:10px;font-size:13px;font-weight:500;color:#fff;background:var(--adm-navy);box-shadow:var(--shadow-lg);z-index:300;transform:translateY(18px);opacity:0;transition:opacity .3s,transform .3s;pointer-events:none;max-width:320px;border:1px solid rgba(255,255,255,.08)}
.toast.visible{opacity:1;transform:translateY(0)}
.toast.success{background:#166534}
.toast.error{background:#991B1B}

/* ═══ RESPONSIVE ═══ */
@media(max-width:1100px){.kpi-grid{grid-template-columns:repeat(2,1fr)}.dash-grid{grid-template-columns:1fr}
  .kpi-card--principal{grid-column:auto;padding:20px 22px}
  .kpi-card--principal .kpi-card__value{font-size:30px}}
@media(max-width:768px){
  /* iOS hace zoom automático al enfocar un input con font-size menor a 16px,
     y no siempre lo revierte solo al desenfocar. !important porque hay
     reglas más específicas (.login-group input, .asistente-panel__form
     input, etc.) que fijan tamaños menores para esta sola propiedad. */
  input,select,textarea{font-size:16px!important}
  .sidebar{transform:translateX(calc(-1 * var(--sidebar-w)))}
  .sidebar.open{transform:translateX(0)}
  .sidebar-overlay.visible{display:block}
  .admin-main{margin-left:0}
  .topbar__menu-btn{display:flex}
  .kpi-grid{grid-template-columns:1fr 1fr}
  .admin-section{padding:16px 16px 32px}
  .toolbar-search{width:100%}
  .data-table{font-size:12px}
  .data-table th,.data-table td{padding:10px 12px}
  .modal{padding:16px}
  .login-box{padding:40px 28px 36px}
}
@media(max-width:480px){
  .kpi-grid{grid-template-columns:1fr}
  .topbar__actions{gap:6px}
  .topbar__site-link span{display:none}
  .login-box{padding:36px 22px 30px}
}

/* ═══ CALENDAR ═══ */
.calendar-wrap{background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius-lg);overflow:hidden;margin-bottom:18px;box-shadow:var(--shadow-xs)}
.calendar-header{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-bottom:1px solid var(--adm-border);background:var(--adm-surface-2)}
.cal-header-left{display:flex;align-items:center;gap:10px}
.cal-header-center h3{font-size:15px;color:var(--adm-text);font-weight:600;margin:0;min-width:190px;text-align:center;letter-spacing:-.2px}
.cal-nav-btn{width:30px;height:30px;border-radius:var(--radius);border:1px solid var(--adm-border);background:var(--adm-white);font-size:17px;color:var(--adm-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .16s;line-height:1}
.cal-nav-btn:hover{border-color:var(--adm-border-2);color:var(--adm-text);background:var(--adm-bg)}
.cal-today-btn{font-size:12px;font-weight:500;padding:5px 13px;border-radius:var(--radius);border:1px solid var(--adm-border);background:var(--adm-white);color:var(--adm-muted);cursor:pointer;transition:all .16s;font-family:var(--font-sans)}
.cal-today-btn:hover{border-color:var(--adm-gold);color:var(--adm-gold);background:var(--adm-gold-dim2)}
.cal-header-right{display:flex;align-items:center;gap:8px}
.cal-legend-inline{display:flex;gap:14px;flex-wrap:wrap}
.cal-legend-inline span{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--adm-muted);white-space:nowrap}
.cal-dot{width:7px;height:7px;border-radius:50%;display:inline-block;flex-shrink:0}
.dot--pendiente{background:var(--status-pendiente)}
.dot--confirmado{background:var(--status-confirmado)}
.dot--completado{background:var(--status-completado)}
.dot--cancelado{background:var(--status-cancelado)}
.calendar-dow{display:grid;grid-template-columns:repeat(7,1fr);border-bottom:1px solid var(--adm-border);background:var(--adm-surface-2)}
.calendar-dow span{text-align:center;font-size:10px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-subtle);padding:8px 4px;border-right:1px solid var(--adm-border)}
.calendar-dow span:last-child{border-right:none}
.calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);grid-auto-rows:minmax(110px,auto)}
.cal-day{border-right:1px solid var(--adm-border-2);border-bottom:1px solid var(--adm-border-2);padding:7px 6px 5px;cursor:pointer;transition:background .12s;position:relative;display:flex;flex-direction:column;gap:3px;min-height:110px;overflow:hidden}
.cal-day:nth-child(7n){border-right:none}
/* Días fuera del mes: se apaga el CONTENIDO, no la celda. Con opacity en
   el elemento entero los bordes también quedaban al 50% y desaparecían. */
.cal-day--empty{background:var(--adm-bg);cursor:default}
.cal-day--empty>*{opacity:.45}
.cal-day:not(.cal-day--empty):hover{background:var(--adm-gold-dim2)}
.cal-day--today{background:rgba(14,14,19,.025)}
.cal-day--selected{background:var(--adm-gold-dim)!important;box-shadow:inset 0 0 0 1.5px var(--adm-gold)}
.cal-day--weekend{background:rgba(0,0,0,.01)}
.cal-day__num{font-size:12px;font-weight:500;color:var(--adm-text-2);line-height:1;display:flex;align-items:center;justify-content:flex-end;margin-bottom:2px}
.cal-day--today .cal-day__num span{background:var(--adm-navy);color:#fff;border-radius:50%;width:22px;height:22px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600}
.cal-turno{display:flex;align-items:center;gap:4px;padding:2px 5px;border-radius:4px;font-size:10.5px;font-weight:500;line-height:1.3;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transition:opacity .12s;flex-shrink:0}
.cal-turno:hover{opacity:.78}
.cal-turno__hora{font-size:9.5px;font-weight:700;opacity:.75;flex-shrink:0}
.cal-turno__nombre{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cal-turno--pendiente{background:rgba(217,119,6,.12);color:#92400E;border-left:2.5px solid var(--status-pendiente)}
.cal-turno--confirmado{background:rgba(22,163,74,.10);color:#14532D;border-left:2.5px solid var(--status-confirmado)}
.cal-turno--completado{background:rgba(37,99,235,.10);color:#1E3A8A;border-left:2.5px solid var(--status-completado)}
.cal-turno--cancelado{background:rgba(220,38,38,.08);color:#7F1D1D;border-left:2.5px solid var(--status-cancelado)}
.cal-turno--ausente{background:rgba(220,38,38,.08);color:#7F1D1D;border-left:2.5px solid var(--status-cancelado)}
.cal-turno--propuesto{background:repeating-linear-gradient(45deg,rgba(217,119,6,.14),rgba(217,119,6,.14) 5px,rgba(217,119,6,.05) 5px,rgba(217,119,6,.05) 10px);color:#92400E;border-left:2.5px solid var(--status-pendiente)}
.cal-turno--mas{background:var(--adm-bg);color:var(--adm-muted);border-left:2.5px solid var(--adm-border-2);font-weight:400;font-size:10px}
.cal-turno--mas:hover{background:var(--adm-border);opacity:1}
.calendar-empty{grid-column:1/-1;text-align:center;padding:48px;color:var(--adm-subtle);font-size:14px}
@media(max-width:768px){.calendar-header{flex-direction:column;gap:12px;align-items:flex-start}.cal-header-right{display:none}.calendar-grid{grid-auto-rows:minmax(80px,auto)}.cal-day{min-height:80px;padding:4px 3px}.cal-turno{font-size:10px;padding:2px 4px}.cal-turno__hora{display:none}}
@media(max-width:480px){.calendar-grid{grid-auto-rows:minmax(60px,auto)}.cal-day{min-height:60px}}

/* ═══ MEDICO / ROLE TAGS ═══ */
.medico-tag{font-size:11px;padding:2px 9px;border-radius:20px;font-weight:600;display:inline-block;
  --medico-color:#5F6C7B;color:var(--medico-color);
  background:color-mix(in srgb, var(--medico-color) 12%, transparent)}
@supports not (background:color-mix(in srgb,red,blue)){
  .medico-tag{background:rgba(95,108,123,.12)}
}
.role-tag{font-size:11px;padding:2px 9px;border-radius:20px;font-weight:600;display:inline-block}
.role-tag--admin{background:rgba(245,158,11,.10);color:#92400E}
.role-tag--doctor{background:rgba(59,130,246,.10);color:#1E40AF}

/* ═══ FORM GROUPS ═══ */
.form-group-adm{display:flex;flex-direction:column;gap:5px;margin-bottom:14px}
.form-group-adm label{font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-muted)}
.form-group-adm input,.form-group-adm select,.form-group-adm textarea{padding:9px 12px;border:1.5px solid var(--adm-border);border-radius:var(--radius);font-family:var(--font-sans);font-size:13px;color:var(--adm-text);background:var(--adm-white);outline:none;transition:border-color .18s,box-shadow .18s;-webkit-appearance:none;appearance:none;width:100%}
.form-group-adm input:focus,.form-group-adm select:focus,.form-group-adm textarea:focus{border-color:var(--adm-gold);background:var(--adm-white);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.form-group-adm input.input-error,.form-group-adm select.input-error{border-color:#F87171!important;box-shadow:0 0 0 3px rgba(248,113,113,.11)!important}

/* ═══ CRED CARDS ═══ */

/* ═══ FICHA CLÍNICA ═══ */
.ficha-tabs{position:sticky;top:65px;z-index:9;display:flex;gap:2px;padding:0 24px;background:var(--adm-surface);border-bottom:1px solid var(--adm-border);overflow-x:auto;scrollbar-width:none}
.ficha-tabs::-webkit-scrollbar{display:none}
.ficha-tab{display:flex;align-items:center;gap:6px;padding:12px 14px;border:none;background:transparent;font-size:13px;font-weight:500;color:var(--adm-muted);cursor:pointer;white-space:nowrap;border-bottom:2px solid transparent;transition:color .15s,border-color .15s;font-family:var(--font-sans)}
.ficha-tab:hover{color:var(--adm-text)}
.ficha-tab.active{color:var(--adm-text);font-weight:600;border-bottom-color:var(--adm-gold)}
.ficha-section[data-tab-panel]{display:none;max-width:100%;overflow:hidden}
.ficha-section[data-tab-panel].active{display:block}
.ficha-section{border:1px solid var(--adm-border);border-radius:var(--radius-lg);padding:20px;margin-bottom:16px;background:var(--adm-surface-2);box-shadow:0 1px 4px rgba(0,0,0,.04)}
.ficha-section__title{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.7px;color:var(--adm-text-2);margin-bottom:16px;padding-bottom:11px;border-bottom:2px solid var(--adm-border)}
.ficha-grid{display:grid;gap:10px}
.ficha-grid--2{grid-template-columns:1fr 1fr}
.ficha-grid--3{grid-template-columns:1fr 1fr 1fr}
.ficha-col--full{grid-column:1/-1}
/* ── Responsive de la ficha clínica ──
   Orden importante: de mayor a menor ancho, misma especificidad,
   así la regla más chica gana cuando ambas aplican. */
@media(max-width:900px){
  #pacienteModal .ficha-grid--3{grid-template-columns:1fr 1fr}
}
@media(max-width:640px){
  .ficha-tabs{top:57px;padding:0 10px}
  .ficha-tab{padding:11px 9px;font-size:12px;gap:4px}
  #pacienteModal .modal__header{padding:14px 16px}
  #pacienteModal .modal__body{padding:16px 14px}
  #pacienteModal .ficha-section{padding:14px 12px}
  #pacienteModal .modal__footer{flex-direction:column;gap:8px;padding:12px 14px}
  #pacienteModal .modal__footer .modal-btn{width:100%}
}
@media(max-width:560px){
  #pacienteModal .ficha-grid--2,
  #pacienteModal .ficha-grid--3{grid-template-columns:1fr}
}

/* ═══ ODONTOGRAMA ═══ */
.odontograma-wrap{width:100%}

/* Barra de herramientas */
.od-toolbar{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;margin-bottom:8px}
.od-tool{display:flex;flex-direction:column;gap:4px;min-width:130px}
.od-tool--grow{flex:1;min-width:210px}
.od-tool label{font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-muted)}
.od-tool select{padding:8px 10px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);color:var(--adm-text);font-size:12.5px;font-family:inherit;outline:none;cursor:pointer}
.od-tool select:focus{border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}

/* Buscador de prestación del odontograma: se escribe para filtrar en lugar de
   recorrer 100 opciones. La lista es absoluta para no empujar las arcadas. */
.od-combo{position:relative}
.od-combo input{width:100%;box-sizing:border-box;padding:8px 10px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);color:var(--adm-text);font-size:12.5px;font-family:inherit;outline:none}
.od-combo input:focus{border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.od-combo__lista{position:absolute;z-index:40;top:calc(100% + 4px);left:0;right:0;max-height:280px;overflow-y:auto;background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius);box-shadow:0 8px 24px rgba(0,0,0,.12)}
.od-combo__lista[hidden]{display:none}
.od-combo__grupo{padding:6px 10px 4px;font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-muted);background:var(--adm-surface-2);position:sticky;top:0}
.od-combo__op{padding:7px 10px;font-size:12.5px;cursor:pointer;display:flex;gap:8px;align-items:baseline}
.od-combo__op:hover,.od-combo__op.activa{background:var(--adm-gold-dim)}
.od-combo__op[aria-selected="true"]{font-weight:700}
.od-combo__cod{font-family:monospace;font-size:11px;color:var(--adm-muted)}
.od-combo__vacio{padding:10px;font-size:12px;color:var(--adm-muted)}

.od-estado-toggle{display:flex;border:1px solid var(--adm-border);border-radius:var(--radius);overflow:hidden}
.od-estado-toggle button{flex:1;padding:8px 12px;border:none;background:var(--adm-white);color:var(--adm-muted);font-size:11.5px;font-weight:600;cursor:pointer;transition:background .15s,color .15s;white-space:nowrap}
.od-estado-toggle button:not(:last-child){border-right:1px solid var(--adm-border)}
.od-estado-toggle button[data-estado="p"].active{background:#FDE8E8;color:#C0392B}
.od-estado-toggle button[data-estado="r"].active{background:#D6EAF8;color:#1F618D}

.od-btn-borrar{padding:8px 14px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);color:var(--adm-muted);font-size:11.5px;font-weight:600;cursor:pointer;transition:all .15s;white-space:nowrap}
.od-btn-borrar:hover{border-color:var(--adm-border-2)}
.od-btn-borrar.active{background:#FEF9E7;border-color:#D68910;color:#B9770E}

.od-hint{font-size:11.5px;color:var(--adm-muted);margin:0 0 12px;min-height:16px}

/* Contenedor principal */
.odontograma-wrap{max-width:100%;min-width:0}
.odontograma-container{display:flex;flex-direction:column;gap:10px;background:var(--adm-white);border:1.5px solid var(--adm-border);border-radius:12px;padding:18px 12px;overflow-x:auto;min-width:0;box-shadow:inset 0 1px 4px rgba(0,0,0,.03)}
.od-arch{display:flex;flex-direction:column;gap:6px;min-width:0}
.od-arch--top{padding-bottom:12px;border-bottom:1px dashed var(--adm-border)}
.od-arch--bottom{padding-top:12px}
/* width:max-content + min-width:100% → centrado si sobra espacio, scroll si falta */
.od-row{display:flex;align-items:center;justify-content:center;gap:4px;width:max-content;min-width:100%}
.od-separator{width:1px;background:var(--adm-border-2);margin:0 8px;align-self:stretch;min-height:16px}

/* Diente */
.od-tooth{display:flex;flex-direction:column;align-items:center;gap:3px;position:relative}
.od-svg{width:42px;height:42px;display:block;overflow:visible}
.od-zona{stroke:#7F8C8D;stroke-width:1.1;cursor:pointer;transition:opacity .12s}
.od-zona:hover{opacity:.55;stroke:var(--adm-gold);stroke-width:2}
.od-tooth__num{font-size:9.5px;font-weight:700;color:var(--adm-muted);font-family:monospace;letter-spacing:.3px}

/* Referencias */
.od-refs{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;margin-top:10px;font-size:11px;color:var(--adm-muted)}
.od-refs span{display:flex;align-items:center;gap:5px}
.od-refs strong{color:var(--adm-text-2);font-weight:700}
.od-refs__sep{width:1px;height:12px;background:var(--adm-border);padding:0}
.od-ref-box{width:11px;height:11px;border-radius:3px;display:inline-block;flex-shrink:0;border:1px solid rgba(0,0,0,.12)}
.od-ref-box--p{background:#E74C3C}
.od-ref-box--r{background:#2980B9}

/* Resumen de prestaciones cargadas */
.od-resumen-wrap{margin-top:14px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);overflow:hidden}
.od-resumen-head{display:flex;align-items:center;gap:8px;padding:9px 14px;border-bottom:1px solid var(--adm-border);background:var(--adm-surface-2);font-size:12px}
.od-resumen-count{background:var(--adm-gold-dim);color:var(--adm-gold-dark);font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:10px}
.od-resumen{max-height:230px;overflow-y:auto}
.od-res-item{display:flex;align-items:center;gap:9px;padding:7px 14px;font-size:12.5px;border-bottom:1px solid var(--adm-border)}
.od-res-item:last-child{border-bottom:none}
.od-res-pieza{font-family:monospace;font-weight:700;font-size:11.5px;color:var(--adm-text-2);background:var(--adm-bg);padding:2px 7px;border-radius:4px;min-width:32px;text-align:center;flex-shrink:0}
.od-res-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}
.od-res-dot--p{background:#E74C3C}
.od-res-dot--r{background:#2980B9}
/* Mini diente con el símbolo real de la prestación */
.od-res-mini{width:28px;height:28px;flex-shrink:0;display:block}
.od-res-txt{flex:1;color:var(--adm-text-2);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.od-res-txt strong{color:var(--adm-text);font-weight:600}
.od-res-cara{font-size:11px;color:var(--adm-muted);background:var(--adm-bg);padding:1px 7px;border-radius:10px}
.od-res-estado{font-size:10.5px;font-weight:700;letter-spacing:.3px;padding:2px 8px;border-radius:10px;white-space:nowrap}
.od-res-estado--p{background:#FDE8E8;color:#C0392B}
.od-res-estado--r{background:#E2EDF8;color:#1F618D}
.od-res-del{border:none;background:transparent;color:var(--adm-subtle);cursor:pointer;font-size:12px;padding:2px 6px;border-radius:4px;flex-shrink:0}
.od-res-del:hover{background:#FEF2F2;color:var(--adm-red)}
.od-res-empty{padding:16px 14px;font-size:12px;color:var(--adm-muted);text-align:center;margin:0}

/* Prestaciones generales: no marcan ningún diente, se suman igual al presupuesto */
.od-generales{margin-top:12px;padding:12px 14px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-surface-2)}
.od-generales>label{display:block;font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-muted);margin-bottom:6px}
.od-generales__fila{display:flex;gap:8px;flex-wrap:wrap}
.od-generales__fila input{flex:1;min-width:200px;padding:8px 10px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);color:var(--adm-text);font-size:12.5px;font-family:inherit;outline:none}
.od-generales__fila input:focus{border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.od-generales__lista{margin-top:8px}
.od-generales__lista .od-res-item{background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius);margin-bottom:6px}
.od-generales__lista .od-res-item:last-child{margin-bottom:0}

/* Tablet / notebook chica: reducir el diente para que la arcada entre entera */
@media(min-width:561px) and (max-width:1000px){
  .od-svg{width:34px;height:34px}
  .od-row{gap:2px}
  .od-separator{margin:0 5px}
}
/* Celular: la arcada scrollea en horizontal (no hay forma de que 16 piezas
   sean legibles en 375px). El resto del panel queda contenido. */
@media(max-width:560px){
  .od-tool,.od-tool--grow{min-width:100%}
  .od-svg{width:34px;height:34px}
  .od-row{gap:2px}
  .odontograma-container{padding:14px 8px}
  .od-res-item{font-size:12px;padding:7px 10px;gap:7px}
  .od-resumen-head{padding:8px 10px}
  #trabajosTable{min-width:520px}
}

/* ═══ VISTA "HOY" ═══ */
.hoy-grid{display:grid;grid-template-columns:1.15fr 1fr;gap:18px;align-items:start}
.hoy-col{background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius-lg);padding:18px 18px 12px;box-shadow:var(--shadow-xs)}
.hoy-col__head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.hoy-col__head h3{display:inline-flex;align-items:center;gap:7px;font-size:15px;font-weight:600;color:var(--adm-text)}
.hoy-col__head h3 svg{width:16px;height:16px;flex-shrink:0;opacity:.65}
.hoy-count{background:var(--adm-gold-dim);color:var(--adm-gold-dark);font-size:12px;font-weight:700;padding:3px 11px;border-radius:12px}
.hoy-fecha{font-size:12px;color:var(--adm-muted);margin:4px 0 14px;text-transform:capitalize}
.hoy-lista{display:flex;flex-direction:column;gap:9px}
.hoy-vacio{padding:26px 14px;text-align:center;font-size:13px;color:var(--adm-muted);background:var(--adm-surface-2);border:1px dashed var(--adm-border);border-radius:var(--radius)}

.hoy-card{display:grid;grid-template-columns:auto 1fr auto;grid-template-areas:"hora info estado" "hora acciones acciones";gap:4px 14px;align-items:center;padding:11px 14px;border:1px solid var(--adm-border);border-left-width:4px;border-radius:var(--radius);background:var(--adm-surface-2);transition:box-shadow .15s}
.hoy-card:hover{box-shadow:var(--shadow-sm)}
.hoy-card--pendiente{border-left-color:var(--status-pendiente)}
.hoy-card--confirmado{border-left-color:var(--status-confirmado)}
.hoy-card--completado{border-left-color:var(--status-completado);opacity:.75}
.hoy-card--cancelado{border-left-color:var(--status-cancelado);opacity:.55}
.hoy-card--ausente{border-left-color:var(--status-cancelado);opacity:.6}
.hoy-card--propuesto{border-left-color:var(--status-pendiente)}
.hoy-card__hora{grid-area:hora;font-family:monospace;font-size:16px;font-weight:700;color:var(--adm-text);background:var(--adm-white);border:1px solid var(--adm-border);border-radius:8px;padding:8px 10px;align-self:start}
.hoy-card__info{grid-area:info;display:flex;flex-direction:column;gap:1px;min-width:0}
.hoy-card__info strong{font-size:13.5px;color:var(--adm-text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hoy-card__info>span{font-size:11.5px;color:var(--adm-muted)}
.hoy-card__tel a{color:var(--adm-text-2)}
.hoy-card__tel--falta{font-style:italic;color:var(--adm-subtle)}
.hoy-card__estado{grid-area:estado;align-self:start}
.hoy-card__acciones{grid-area:acciones;display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}

.hoy-btn{display:inline-flex;align-items:center;gap:4px;padding:5px 10px;border:1px solid var(--adm-border);border-radius:6px;background:var(--adm-white);color:var(--adm-text-2);font-size:11.5px;font-weight:600;cursor:pointer;text-decoration:none;transition:all .15s;white-space:nowrap}
.hoy-btn:hover{border-color:var(--adm-border-2)}
.hoy-btn--ok{border-color:#BBF7D0;background:#F0FDF4;color:#15803D}
.hoy-btn--ok:hover{border-color:#16A34A}
.hoy-btn--done{border-color:#BFDBFE;background:#EFF6FF;color:#1D4ED8}
.hoy-btn--done:hover{border-color:#2563EB}
.hoy-btn--wa{border-color:#A7F3D0;background:#ECFDF5;color:#047857}
.hoy-btn--wa:hover{border-color:#059669}
.hoy-btn--x{border-color:#FECACA;background:#FEF2F2;color:#B91C1C;padding:5px 9px}
.hoy-btn svg{width:13px;height:13px;flex-shrink:0}
.hoy-btn--x:hover{border-color:#DC2626}
/* Botón «Anotar en espera» + la X, agrupados a la derecha del header del
   modal de ficha: sin este contenedor, un tercer hijo en un
   `.modal__header` con `space-between` queda flotando en el medio en vez
   de pegado a la X. */
.modal__header-acciones{display:flex;align-items:center;gap:10px}

.hoy-huecos{margin-bottom:20px}
.hoy-huecos h3{display:inline-flex;align-items:center;gap:7px;font-size:15px;font-weight:600;color:var(--adm-text);margin-bottom:10px}
.hoy-huecos h3 svg{width:16px;height:16px;flex-shrink:0;opacity:.65}
.smartfill-card{border:1px solid var(--adm-border);border-left:3px solid var(--status-pendiente);border-radius:8px;padding:12px;margin-bottom:8px}
.smartfill-card--ofrecida{border-left-color:var(--status-confirmado);background:rgba(22,163,74,.04)}
.smartfill-card__hueco{font-size:13px}
.smartfill-card__candidato{font-size:12.5px;color:var(--adm-muted);margin-top:2px}
.smartfill-card__acciones{display:flex;gap:6px;margin-top:8px;flex-wrap:wrap}
.smartfill-advertencia{color:#B91C1C;font-size:12px;margin-top:4px}

@media(max-width:960px){.hoy-grid{grid-template-columns:1fr}}
@media(max-width:560px){
  .hoy-card{grid-template-columns:auto 1fr;grid-template-areas:"hora info" "hora estado" "acciones acciones"}
  .hoy-card__estado{justify-self:start}
}

/* ═══ VISTA POR ROL ═══
   Los doctores acceden a toda la información clínica Y financiera de
   los pacientes (fichas, cuenta corriente, presupuestos). Reservado al
   admin: crear/eliminar pacientes, catálogo de precios, usuarios. */
body.role-doctor #nuevoPacienteBtn{display:none}

/* ═══ RECORRIDOS DE AYUDA ═══ */
/* Cuatro paneles alrededor del elemento en vez de un fondo entero: el
   agujero queda sin cubrir, así el clic llega al botón real y el que
   quiere hacer el paso no puede errarle. */
.rec-blk{position:fixed;background:rgba(14,14,19,.55);z-index:940}
.rec-aro{position:fixed;z-index:941;pointer-events:none;border-radius:var(--radius);
  border:2.5px solid var(--adm-gold);
  box-shadow:0 0 0 6px rgba(201,169,110,.25),0 0 24px rgba(201,169,110,.35);
  box-shadow:0 0 0 6px color-mix(in srgb,var(--adm-gold) 25%,transparent),
             0 0 24px color-mix(in srgb,var(--adm-gold) 35%,transparent)}

/* El agujero deja pasar el clic para que el usuario pueda hacer el paso.
   Eso solo tiene sentido cuando el paso se lo pide: en la ayuda de lectura
   el botón señalado puede ser «Confirmar» o «Atendido», que guardan en la
   base. Sin esta tapa, abrir la ayuda un martes a la mañana confirma un
   turno real. */
.rec-tapa{position:fixed;z-index:941;background:transparent}

.rec-globo{position:fixed;z-index:942;width:100%;max-width:380px;
  background:var(--adm-surface);border-radius:var(--radius-lg);
  padding:20px 22px 14px;box-shadow:var(--shadow-xl);
  transition:top .22s var(--ease),left .22s var(--ease)}
.rec-globo__x{position:absolute;top:10px;right:12px;background:none;border:none;
  font-size:15px;line-height:1;color:var(--adm-subtle);cursor:pointer;padding:4px}
.rec-globo__x:hover{color:var(--adm-text)}
.rec-globo__titulo{font-family:var(--font-serif);font-size:17px;color:var(--adm-text);
  margin:0 22px 6px 0}
.rec-globo__texto{font-size:13px;line-height:1.65;color:var(--adm-text-2)}

.rec-pie{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-top:16px;padding-top:12px;border-top:1px solid var(--adm-border)}
.rec-pie__salir{background:none;border:none;padding:0;cursor:pointer;
  font-family:var(--font-sans);font-size:11.5px;color:var(--adm-subtle)}
.rec-pie__salir:hover{color:var(--adm-text)}
.rec-pie__cuenta{font-size:11px;color:var(--adm-subtle);margin-left:auto}
.rec-pie__saltar{background:none;border:none;padding:0;cursor:pointer;
  font-family:var(--font-sans);font-size:11.5px;color:var(--adm-gold-dark)}
.rec-pie__saltar:hover{text-decoration:underline}
.rec-pie__next{padding:7px 14px;border-radius:var(--radius);border:1px solid var(--adm-navy);
  background:var(--adm-navy);color:#fff;font-family:var(--font-sans);
  font-size:12.5px;font-weight:600;cursor:pointer;transition:background .15s}
.rec-pie__next:hover{background:var(--adm-navy-3)}

@media(max-width:640px){
  .rec-globo{padding:16px 16px 12px;max-width:none;left:12px!important;right:12px!important;width:auto}
  .rec-pie__cuenta{margin-left:0}
}

/* ═══ SEGURIDAD Y RESPALDO ═══ */
.seg-wrap{display:flex;flex-direction:column;gap:10px;margin-top:16px}
.seg-item{display:flex;gap:12px;padding:13px 15px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-surface-2)}
.seg-item--ok{background:#F0FDF4;border-color:#BBF7D0}
.seg-item--warn{background:#FFFBEB;border-color:#FDE68A}
.seg-item__ico{font-size:18px;line-height:1.2;flex-shrink:0}
.seg-item strong{display:block;font-size:13px;font-weight:600;color:var(--adm-text);margin-bottom:3px}
.seg-item span{display:block;font-size:12.5px;color:var(--adm-muted);line-height:1.55}
.seg-item em{font-style:normal;font-weight:600;color:var(--adm-text-2)}
.seg-btn{white-space:nowrap}

/* ═══ PRESUPUESTOS GUARDADOS ═══ */
.presup-lista-wrap{margin-top:18px;border-top:1px solid var(--adm-border);padding-top:16px}
.presup-lista-head{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.presup-lista-head strong{font-size:13px;color:var(--adm-text)}
.presup-count{background:var(--adm-gold-dim);color:var(--adm-gold-dark);font-size:11px;font-weight:700;padding:2px 8px;border-radius:10px}
.presup-lista{display:flex;flex-direction:column;gap:10px}
.presup-vacio{font-size:12.5px;color:var(--adm-muted);padding:14px;background:var(--adm-surface-2);border:1px dashed var(--adm-border);border-radius:var(--radius);text-align:center;line-height:1.5}
.presup-item{border:1px solid var(--adm-border);border-radius:var(--radius);padding:12px 14px;background:var(--adm-white)}
.presup-item__top{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.presup-item__fecha{font-size:12px;color:var(--adm-muted)}
.presup-item__total{margin-left:auto;font-size:15px;font-variant-numeric:tabular-nums;color:var(--adm-text)}
.presup-item__detalle{font-size:12px;color:var(--adm-muted);margin-top:7px;line-height:1.45}
.presup-acciones{display:flex;gap:8px;margin-top:11px}
.presup-btn{padding:6px 14px;border-radius:6px;border:1px solid var(--adm-border);background:var(--adm-white);font-size:12px;font-weight:600;cursor:pointer;transition:all .15s}
.presup-btn--ok{border-color:#BFE4CD;color:#1E8449;background:#EAF7EF}
.presup-btn--ok:hover{border-color:#1E8449}
.presup-btn--no{border-color:#F5C6C6;color:#C0392B;background:#FDECEC}
.presup-btn--no:hover{border-color:#C0392B}
.presup-btn--wa{border-color:#A7E3C4;color:#0B7A47;background:#EAF9F1}
.presup-btn--wa:hover{border-color:#0B7A47}
.presup-resuelto{font-size:11.5px;color:var(--adm-muted);align-self:center}

/* ═══ CUENTA CORRIENTE ═══ */
.cc-saldos{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;margin-bottom:16px}
.cc-saldo{background:var(--adm-surface-2);border:1px solid var(--adm-border);border-radius:var(--radius-lg);padding:14px 16px;display:flex;flex-direction:column;gap:3px}
.cc-saldo__lbl{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.7px;color:var(--adm-muted)}
.cc-saldo__val{font-family:var(--font-serif);font-size:21px;font-weight:600;font-variant-numeric:lining-nums tabular-nums;color:var(--adm-text);line-height:1.1}
.cc-saldo--debe{background:#FDECEC;border-color:#F5C6C6}
.cc-saldo--debe .cc-saldo__val{color:#C0392B}
.cc-saldo--favor{background:#EAF7EF;border-color:#BFE4CD}
.cc-saldo--favor .cc-saldo__val{color:#1E8449}
.cc-saldo--os{background:#FEF6E7;border-color:#F5DF9E}
.cc-saldo--os .cc-saldo__val{color:#9C6A12}
.cc-saldo--muted .cc-saldo__val{font-size:15px;color:var(--adm-muted)}

.cc-acciones{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.cc-btn{padding:9px 15px;border-radius:8px;border:1px solid var(--adm-border);background:var(--adm-white);font-size:13px;font-weight:600;cursor:pointer;transition:all .15s}
.cc-btn:hover:not(:disabled){transform:translateY(-1px);box-shadow:var(--shadow-xs)}
.cc-btn:disabled{opacity:.45;cursor:not-allowed}
.cc-btn--cargo{border-color:#F5C6C6;color:#C0392B;background:#FDECEC}
.cc-btn--pago{border-color:#BFE4CD;color:#1E8449;background:#EAF7EF}
.cc-btn--os{border-color:#F5DF9E;color:#9C6A12;background:#FEF6E7}

.cc-tabla-wrap{border:1px solid var(--adm-border);border-radius:var(--radius);overflow:hidden;overflow-x:auto}
.cc-tabla{width:100%;border-collapse:collapse;font-size:13px;min-width:520px}
.cc-tabla th{background:var(--adm-surface-2);text-align:left;padding:9px 12px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:var(--adm-muted);border-bottom:1px solid var(--adm-border)}
.cc-tabla th.der,.cc-tabla td.der{text-align:right}
.cc-tabla td{padding:9px 12px;border-bottom:1px solid var(--adm-border);vertical-align:top}
.cc-tabla tr:last-child td{border-bottom:none}
.cc-fecha{white-space:nowrap;color:var(--adm-muted);font-variant-numeric:tabular-nums}
.cc-concepto{font-weight:600;color:var(--adm-text)}
.cc-meta{font-size:11px;color:var(--adm-muted);margin-top:2px;display:flex;flex-wrap:wrap;gap:6px}
.cc-os-tag{color:#9C6A12;font-weight:600}
.cc-recibo,.cc-forma{text-transform:capitalize}
.cc-debe{color:#C0392B;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.cc-haber{color:#1E8449;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}
.cc-saldo-col{font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.cc-row--anulado .cc-concepto,.cc-row--anulado .cc-debe,.cc-row--anulado .cc-haber{text-decoration:line-through;opacity:.5}
.cc-anulado-tag{font-size:9.5px;font-weight:700;letter-spacing:.4px;background:var(--adm-bg);color:var(--adm-muted);padding:1px 6px;border-radius:4px;vertical-align:middle}
.cc-anular{background:none;border:none;color:var(--adm-subtle);cursor:pointer;font-size:13px;padding:2px 6px;border-radius:4px;transition:all .15s}
.cc-anular:hover{background:#FDECEC;color:#C0392B}
.cc-anulado-info{color:var(--adm-subtle);cursor:help;font-size:14px}
.cc-empty{text-align:center;color:var(--adm-muted);padding:26px 14px;font-size:13px}
.cc-nota{font-size:11.5px;color:var(--adm-muted);margin-top:10px;line-height:1.5}

/* Modal de movimiento */
.mov-cobertura{background:var(--adm-surface-2);border:1px solid var(--adm-border);border-radius:var(--radius);padding:12px 14px;margin-top:4px}
.mov-cobertura .form-group-adm{margin-bottom:0}
.mov-hint{font-weight:400;font-size:11px;color:var(--adm-subtle);text-transform:none;letter-spacing:0}
.mov-coseguro{font-size:12px;color:var(--adm-text-2);margin-top:8px;min-height:16px;font-weight:600}

/* ═══ MARCA MOLARIS (firma del proveedor) ═══ */
.login-powered{margin-top:18px;font-size:11px;color:var(--adm-subtle);letter-spacing:.3px}
.login-powered strong{color:var(--adm-text-2);font-weight:600;letter-spacing:.5px}
.sidebar__powered{padding:10px 20px 14px;font-size:10px;font-weight:600;letter-spacing:2px;
  text-transform:uppercase;color:rgba(255,255,255,.22);text-align:center}

/* ═══ CATÁLOGO: tag de área ═══ */
.cat-tag{display:inline-block;font-size:11px;font-weight:600;padding:2px 9px;border-radius:20px;
  background:var(--adm-bg);color:var(--adm-text-2);white-space:nowrap}

/* Precio editable en la misma fila: cargar 111 precios abriendo un modal
   por cada uno son cientos de clics. Acá se escribe y se pasa con Tab. */
.precio-input{width:118px;padding:6px 10px;text-align:right;font-family:var(--font-mono,monospace);
  font-size:13px;font-weight:600;color:var(--adm-text);background:transparent;
  border:1px solid transparent;border-radius:6px;transition:border-color .16s,background .16s}
.precio-input:hover{border-color:var(--adm-border);background:var(--adm-white)}
.precio-input:focus{outline:none;border-color:var(--adm-gold);background:var(--adm-white);
  box-shadow:0 0 0 3px var(--adm-gold-dim)}
.precio-input--vacio{color:var(--adm-subtle);font-weight:400}
.precio-input--vacio::placeholder{color:var(--adm-subtle);font-style:italic}
.precio-input--ok{border-color:#3EA76F;background:#EAF7EF}
.precio-input--error{border-color:#C0392B;background:#FDECEA}
.precio-input:disabled{opacity:.55}

.ajuste-fila{display:flex;gap:14px;margin:16px 0 6px;flex-wrap:wrap}

/* Enlace al tour de bienvenida, en el pie de la barra lateral */
.sidebar__guia{display:block;width:calc(100% - 20px);margin:0 10px 8px;padding:8px 10px;border:none;background:none;
  font-family:var(--font-sans);font-size:11.5px;color:rgba(255,255,255,.38);text-align:left;cursor:pointer;
  border-radius:var(--radius);transition:color .18s,background .18s}
.sidebar__guia:hover{color:rgba(255,255,255,.75);background:var(--sidebar-hover)}

/* Receta e indicaciones */


.receta-plantillas{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.receta-plantillas>span{font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-subtle)}
#recetaTexto{width:100%;padding:12px 14px;border:1px solid var(--adm-border);border-radius:10px;font-family:var(--font-sans);font-size:13.5px;line-height:1.6;color:var(--adm-text);background:var(--adm-bg);resize:vertical;margin-bottom:14px}
#recetaTexto:focus{outline:none;border-color:var(--adm-gold);background:var(--adm-white);box-shadow:0 0 0 3px var(--adm-gold-dim)}

/* Reportes de producción */
.rep-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:22px}
.rep-kpi{background:var(--adm-bg);border:1px solid var(--adm-border);border-radius:10px;padding:14px 16px;display:flex;flex-direction:column;gap:2px}
.rep-kpi span{font-size:10.5px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:var(--adm-subtle)}
.rep-kpi strong{font-size:1.35rem;font-weight:700;letter-spacing:-.5px}
.rep-kpi small{font-size:11px;color:var(--adm-muted)}
/* `overflow-x:auto` NO es cosmético: `.data-table` tiene `min-width:600px`, y
   estas tablas son las únicas del panel que no van dentro de un `.table-wrap`.
   Sin esto, a 375 px la tabla empuja la página entera y toda la sección
   Dashboard queda con scroll horizontal. El título se queda quieto y solo
   scrollea la tabla, igual que en el resto del panel. */
.rep-bloque{margin-bottom:20px;overflow-x:auto;-webkit-overflow-scrolling:touch}
.rep-bloque h4{font-size:12px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-muted);margin-bottom:8px}
.rep-barra{display:block;height:7px;background:var(--adm-bg);border-radius:5px;overflow:hidden}
.rep-barra i{display:block;height:100%;background:var(--adm-gold);border-radius:5px}
.rep-nota{font-size:11.5px;color:var(--adm-subtle);margin-top:6px}

/* ═══ PROFESIONALES ═══ */
.prof-form{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px;align-items:center}
.prof-form input[type="text"]{flex:1;min-width:160px;padding:9px 12px;border:1px solid var(--adm-border);border-radius:var(--radius-sm);font-size:13px;font-family:inherit;color:var(--adm-text);background:var(--adm-white)}
.prof-form input[type="text"]:focus{outline:none;border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.prof-form input[type="color"]{width:40px;height:38px;padding:2px;border:1px solid var(--adm-border);border-radius:var(--radius-sm);background:var(--adm-white);cursor:pointer}

/* ═══ CAMPAÑAS DE EMAIL ═══ */
/* El mensaje a la izquierda y a quién le llega a la derecha: son las dos
   preguntas de una campaña, y verlas juntas evita escribir un texto que no
   le corresponde al público elegido. */
.camp-layout{display:grid;grid-template-columns:1.6fr 1fr;gap:26px;align-items:start}
.camp-layout textarea{resize:vertical;line-height:1.65;min-height:170px}

/* El ejemplo va pegado abajo del cuadro, como una ayuda y no como un botón
   más: quien ya sabe qué escribir no tiene que verlo compitiendo con nada. */
.camp-ejemplo{align-self:flex-start;margin-top:2px;background:none;border:none;padding:0;
  font-family:var(--font-sans);font-size:11.5px;color:var(--adm-gold-dark);cursor:pointer;
  border-bottom:1px solid transparent;transition:border-color .18s}
.camp-ejemplo:hover{border-bottom-color:var(--adm-gold-dark)}

/* El número de destinatarios es el dato que decide si mandás o no: va grande
   y solo. */
.camp-conteo{background:var(--adm-surface-2);border:1px solid var(--adm-border);
  border-radius:var(--radius-lg);padding:16px 18px;display:flex;flex-direction:column;gap:2px}
.camp-conteo__num{font-family:var(--font-serif);font-size:27px;line-height:1.1;color:var(--adm-text)}
.camp-conteo__txt{font-size:11.5px;color:var(--adm-muted)}
.camp-conteo--error .camp-conteo__num{font-size:15px;color:var(--status-cancelado)}

.camp-nota{font-size:11.5px;line-height:1.6;color:var(--adm-subtle);margin-top:12px}

/* Guardar, probar y enviar en una fila, numerados: el orden no es sugerencia
   —enviar no se habilita sin prueba— y verlo escrito ahorra la pregunta. */
.camp-pasos{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-top:22px;
  padding-top:18px;border-top:1px solid var(--adm-border)}
.camp-mail{width:190px;padding:8px 12px;border:1px solid var(--adm-border);
  border-radius:var(--radius);font-size:12.5px;font-family:inherit;
  color:var(--adm-text);background:var(--adm-white)}
.camp-mail:focus{outline:none;border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.camp-pasos .toolbar-btn:disabled,.camp-pasos .action-btn:disabled{opacity:.45;cursor:not-allowed;
  transform:none;filter:none;box-shadow:none}
.camp-aviso{font-size:11.5px;color:var(--adm-subtle);flex:1;min-width:160px}

/* Resultados de una campaña ya mandada. */
.camp-res{background:var(--adm-surface-2);border:1px solid var(--adm-border);
  border-radius:var(--radius-lg);padding:20px 22px;margin-bottom:6px}
.camp-res__top{display:flex;justify-content:space-between;align-items:flex-start;gap:14px}
.camp-res__asunto{font-size:14px;font-weight:600;color:var(--adm-text)}
.camp-res__meta{font-size:11.5px;color:var(--adm-muted);margin-top:3px}
.camp-res__kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));
  gap:12px;margin-top:16px}
.camp-res__kpi{background:var(--adm-white);border:1px solid var(--adm-border);
  border-radius:var(--radius);padding:12px 14px}
.camp-res__kpi b{display:block;font-family:var(--font-serif);font-size:21px;
  line-height:1.2;color:var(--adm-text);font-weight:400}
.camp-res__kpi span{font-size:10.5px;text-transform:uppercase;letter-spacing:.6px;color:var(--adm-muted)}
.camp-res__kpi--alta b{color:var(--status-confirmado)}
.camp-res__nota{font-size:11px;line-height:1.6;color:var(--adm-subtle);margin-top:14px}

@media(max-width:900px){
  .camp-layout{grid-template-columns:1fr;gap:18px}
  .camp-mail{width:100%}
}

/* ═══ CAJA DEL DÍA ═══ */
.caja-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:14px;margin-bottom:18px}
.caja-kpi{background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius-lg);padding:18px 20px;display:flex;flex-direction:column;gap:4px}
.caja-kpi--in{background:#EAF7EF;border-color:#BFE4CD}
.caja-kpi__lbl{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.7px;color:var(--adm-muted)}
.caja-kpi__val{font-family:var(--font-serif);font-size:26px;font-weight:600;font-variant-numeric:lining-nums tabular-nums;color:var(--adm-text);line-height:1.1}
.caja-kpi--in .caja-kpi__val{color:#1E8449}
/* Egresos en rojo y el total en oro: de un vistazo se ve qué salió y con
   cuánto se cierra el día, que es lo que se compara contra el cajón. */
.caja-kpi--out{background:#FDECEC;border-color:#F5C6CB}
.caja-kpi--out .caja-kpi__val{color:#C0392B}
.caja-kpi--total{background:var(--adm-gold-dim);border-color:var(--adm-gold)}
.caja-kpi--total .caja-kpi__val{color:var(--adm-text)}
.caja-tipo{display:flex;gap:18px;margin:4px 0 16px}
.caja-tipo label{display:flex;align-items:center;gap:6px;font-size:13.5px;cursor:pointer}
.dash-card--ancha{grid-column:1/-1}
.caja-formas{display:flex;flex-direction:column;gap:12px;margin-top:8px}
.caja-forma__top{display:flex;justify-content:space-between;align-items:baseline;font-size:13px;margin-bottom:5px}
.caja-forma__top strong{font-variant-numeric:tabular-nums}
.caja-forma__bar{height:7px;background:var(--adm-bg);border-radius:4px;overflow:hidden}
.caja-forma__bar span{display:block;height:100%;background:var(--adm-sage);border-radius:4px;transition:width .3s}

/* Saldo en la lista de pacientes */
.saldo-tag{display:inline-block;font-size:12px;font-weight:600;padding:3px 9px;border-radius:6px;white-space:nowrap}
.saldo-tag--debe{background:#FDE8E8;color:#C0392B}
.saldo-tag--favor{background:#D5F5E3;color:#1E8449}
.deudores-check{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--adm-text-2);cursor:pointer;user-select:none;white-space:nowrap}
.deudores-check input{cursor:pointer;accent-color:var(--adm-gold)}
.deuda-total{font-size:12.5px;color:var(--adm-muted);white-space:nowrap}
.deuda-total strong{color:var(--adm-red)}

/* ── Archivos: ficha del paciente y documentos de la clínica ── */
.arc-subir{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:14px}
.arc-tipo{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--adm-muted)}
.arc-subir input[type="text"]{flex:1;min-width:180px;padding:7px 11px;border:1px solid var(--adm-border);
  border-radius:6px;font-family:var(--font-sans);font-size:13px;background:var(--adm-white);color:var(--adm-text)}

.arc-progreso{padding:9px 13px;margin-bottom:12px;border-radius:var(--radius);
  background:var(--adm-gold-dim2);border:1px solid var(--adm-gold);
  font-size:12.5px;color:var(--adm-text-2)}

.arc-inactivo{padding:14px 16px;border-radius:var(--radius);background:var(--adm-bg);
  border:1px dashed var(--adm-border);color:var(--adm-muted);font-size:13px;line-height:1.5}

.arc-lista{display:flex;flex-direction:column;gap:6px}
.arc-item{display:flex;align-items:center;gap:11px;padding:10px 13px;
  border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white)}
.arc-item__ico{font-size:20px;line-height:1;flex-shrink:0}
.arc-item__info{flex:1;min-width:0}
.arc-item__nom{font-size:13.5px;font-weight:600;color:var(--adm-text);
  display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.arc-item__meta{font-size:11.5px;color:var(--adm-muted);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis}
.arc-tag{padding:1px 8px;border-radius:20px;background:var(--adm-gold-dim2);
  color:var(--adm-gold-dark);font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em}

@media (max-width:600px){
  .arc-item{flex-wrap:wrap}
  .arc-item__info{flex-basis:100%;order:-1}
}

/* ── Punto de venta: pestañas ── */
.pdv-tabs{display:flex;gap:4px;border-bottom:1px solid var(--adm-border);margin-bottom:18px}
.pdv-tab{padding:9px 16px;border:none;background:none;cursor:pointer;
  font-family:var(--font-sans);font-size:13.5px;font-weight:600;color:var(--adm-muted);
  border-bottom:2px solid transparent;margin-bottom:-1px;transition:all .15s}
.pdv-tab:hover{color:var(--adm-text-2)}
.pdv-tab--activa{color:var(--adm-gold-dark);border-bottom-color:var(--adm-gold)}

/* ── Vender: grilla + carrito ── */
.pdv-layout{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:18px;align-items:start}
@media (max-width:900px){ .pdv-layout{grid-template-columns:1fr} }

.pdv-cats{display:flex;flex-wrap:wrap;gap:6px;margin:12px 0}
.pdv-cat{padding:5px 13px;border:1px solid var(--adm-border);border-radius:20px;
  background:var(--adm-white);color:var(--adm-text-2);font-size:12.5px;font-weight:600;cursor:pointer;
  font-family:var(--font-sans);transition:all .15s}
.pdv-cat:hover{border-color:var(--adm-gold)}
.pdv-cat--activa{background:var(--adm-gold);border-color:var(--adm-gold);color:#fff}

.pdv-grilla{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:10px}
.pdv-card{display:flex;flex-direction:column;gap:3px;align-items:flex-start;text-align:left;
  padding:14px;border:1px solid var(--adm-border);border-radius:var(--radius);
  background:var(--adm-white);cursor:pointer;font-family:var(--font-sans);transition:all .15s}
.pdv-card:hover:not(:disabled){border-color:var(--adm-gold);box-shadow:0 2px 10px rgba(0,0,0,.06);transform:translateY(-1px)}
.pdv-card--sin{opacity:.5;cursor:not-allowed}
.pdv-card__nom{font-size:13.5px;font-weight:600;color:var(--adm-text);line-height:1.3}
.pdv-card__precio{font-family:var(--font-serif);font-size:19px;font-weight:700;color:var(--adm-text)}
.pdv-card__stock{font-size:11.5px;color:var(--adm-muted)}

.pdv-carrito{position:sticky;top:16px;display:flex;flex-direction:column;
  border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);
  max-height:calc(100vh - 120px)}
.pdv-carrito__head{display:flex;align-items:center;justify-content:space-between;
  padding:14px 16px;border-bottom:1px solid var(--adm-border)}
.pdv-carrito__head h3{margin:0;font-family:var(--font-serif);font-size:17px}
.pdv-carrito__items{flex:1;overflow-y:auto;padding:8px 16px;min-height:120px}
.pdv-carrito__pie{border-top:1px solid var(--adm-border);padding:14px 16px}

.pdv-vacio{text-align:center;color:var(--adm-muted);padding:28px 8px;font-size:13px}
.pdv-vacio__ico{font-size:30px;opacity:.4;margin-bottom:6px}
.pdv-vacio small{display:block;margin-top:4px;font-size:11.5px;color:var(--adm-subtle)}

.pdv-linea{display:grid;grid-template-columns:1fr auto auto auto;gap:8px;align-items:center;
  padding:9px 0;border-bottom:1px solid var(--adm-border)}
.pdv-linea:last-child{border-bottom:none}
.pdv-linea__info{display:flex;flex-direction:column;min-width:0}
.pdv-linea__nom{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pdv-linea__unit{font-size:11px;color:var(--adm-muted)}
.pdv-linea__cant{display:flex;align-items:center;gap:5px;font-variant-numeric:tabular-nums;font-size:13px}
.pdv-mas{width:22px;height:22px;border:1px solid var(--adm-border);border-radius:5px;
  background:var(--adm-bg);cursor:pointer;font-size:14px;line-height:1;color:var(--adm-text-2);padding:0}
.pdv-mas:hover{border-color:var(--adm-gold);color:var(--adm-gold-dark)}
.pdv-linea__sub{font-size:13px;font-weight:600;white-space:nowrap;font-variant-numeric:tabular-nums}
.pdv-quitar{border:none;background:none;color:var(--adm-subtle);cursor:pointer;font-size:13px;padding:2px 4px}
.pdv-quitar:hover{color:var(--adm-red)}

.pdv-total{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:12px}
.pdv-total span{font-size:13px;color:var(--adm-muted)}
.pdv-total strong{font-family:var(--font-serif);font-size:24px;font-variant-numeric:tabular-nums}

/* Venta anulada, en el historial */
.fila-anulada{opacity:.55}
.fila-anulada .pdv-linea__sub,.fila-anulada td{text-decoration:none}
.vta-anulada{font-size:11.5px;color:var(--adm-red);margin-top:2px}

/* Punto de venta: stock del catálogo */
.stock-tag{display:inline-block;min-width:34px;padding:2px 9px;border-radius:20px;
  background:var(--adm-bg);border:1px solid var(--adm-border);
  font-size:12.5px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--adm-text-2)}
.stock-tag--bajo{background:var(--adm-red-dim,#FBEAE7);border-color:var(--adm-red);color:var(--adm-red)}

/* Historial de stock, dentro del modal */
.stock-hist{margin-top:16px;border-top:1px solid var(--adm-border);padding-top:12px}
.stock-hist__titulo{font-size:12px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;
  color:var(--adm-muted);margin-bottom:8px}
.stock-hist__fila{display:grid;grid-template-columns:48px 62px 1fr auto;gap:8px;align-items:baseline;
  padding:6px 0;border-bottom:1px solid var(--adm-border);font-size:12.5px}
.stock-hist__fila:last-child{border-bottom:none}
.stock-hist__cant{font-weight:700;font-variant-numeric:tabular-nums;color:var(--adm-sage,#4B7B62)}
.stock-hist__cant--baja{color:var(--adm-red)}
.stock-hist__tipo{color:var(--adm-text-2)}
.stock-hist__motivo{color:var(--adm-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stock-hist__fecha{color:var(--adm-subtle);font-size:11.5px;white-space:nowrap}

/* Recorte de la lista de pacientes que llega desde una alerta del Dashboard */
.pac-filtro-alerta{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;
  margin-bottom:12px;padding:10px 14px;border-radius:var(--radius);
  background:var(--adm-gold-dim2);border:1px solid var(--adm-gold)}
.pac-filtro__txt{font-size:13px;color:var(--adm-text-2)}
.pac-filtro__txt strong{color:var(--adm-gold-dark)}

/* Plan: acciones (traer del odontograma / generar presupuesto) */
.plan-label-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;margin-bottom:5px}
.plan-actions{display:flex;flex-wrap:wrap;gap:6px}
.plan-import-btn{padding:5px 12px;border:1px solid var(--adm-border);border-radius:6px;background:var(--adm-white);color:var(--adm-text-2);font-size:11.5px;font-weight:600;cursor:pointer;transition:all .15s;white-space:nowrap}
.plan-import-btn:hover{border-color:var(--adm-gold);color:var(--adm-gold-dark);background:var(--adm-gold-dim2)}

/* Presupuesto (modal) */
.presup-doc{padding:12px 6px}
.presup-agregar{margin:4px 6px 0;padding-top:12px;border-top:1px dashed var(--adm-border)}
.presup-agregar label{display:block;font-size:10px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--adm-muted);margin-bottom:6px}
.presup-agregar__fila{display:flex;gap:8px;flex-wrap:wrap}
.presup-agregar__fila input{flex:1;min-width:200px;padding:8px 10px;border:1px solid var(--adm-border);border-radius:var(--radius);background:var(--adm-white);color:var(--adm-text);font-size:12.5px;font-family:inherit;outline:none}
.presup-agregar__fila input:focus{border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.presup-quitar{border:none;background:none;color:var(--adm-muted);cursor:pointer;font-size:14px;line-height:1;padding:2px 6px;border-radius:6px}
.presup-quitar:hover{background:#FDE8E8;color:#C0392B}
.presup-doc__hdr{display:flex;justify-content:space-between;align-items:flex-start;padding-bottom:12px;border-bottom:2px solid var(--adm-text)}

/* ═══ ANAMNESIS ═══ */
.anamnesis-checks{display:flex;flex-direction:column;gap:7px}
.anam-row{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:9px 14px;background:var(--adm-white);border-radius:var(--radius);border:1px solid var(--adm-border);transition:border-color .15s,background .15s}
.anam-row:hover{border-color:var(--adm-gold)}
.anam-row--si{background:#fffdf0;border-color:#F39C12}
.anam-label{font-size:13px;font-weight:500;color:var(--adm-text);min-width:130px}
.anam-check{display:flex;align-items:center;gap:5px;font-size:13px;cursor:pointer;color:var(--adm-text)}
.anam-check input[type="checkbox"]{accent-color:var(--adm-gold);width:14px;height:14px}
.anam-input{flex:1;min-width:140px;padding:5px 9px;border:1.5px solid var(--adm-border);border-radius:6px;background:var(--adm-bg);color:var(--adm-text);font-size:12px;font-family:var(--font-sans)}
.anam-input:focus{outline:none;border-color:var(--adm-gold)}

/* ═══ NUEVO TURNO MODAL ═══ */
.nt-modal-box{overflow-y:auto}
.nt-header{gap:0}
.nt-header-inner{display:flex;align-items:center;gap:12px}
.nt-header-icon{font-size:1.5rem;line-height:1}
.nt-header-sub{margin:2px 0 0;font-size:12px;color:var(--adm-muted);font-weight:400}
.nt-body{padding:20px 24px!important}
.nt-footer{display:flex;justify-content:flex-end;gap:8px;padding:14px 24px!important;border-top:1px solid var(--adm-border);background:var(--adm-surface-2)}
.nt-section-label{font-size:10px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--adm-gold);margin-bottom:10px}
.nt-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.nt-full{grid-column:1/-1}
.nt-required{color:#F87171;font-size:13px}
.nt-field-error{display:block;font-size:11px;color:#F87171;margin-top:4px;min-height:14px}
.nt-autocomplete-wrap{position:relative}
.nt-sugg-list{position:absolute;top:calc(100% - 4px);left:0;right:0;z-index:9999;background:var(--adm-white);border:1.5px solid var(--adm-gold);border-top:none;border-radius:0 0 10px 10px;box-shadow:var(--shadow-md);list-style:none;margin:0;padding:4px 0;max-height:200px;overflow-y:auto}
.nt-sugg-item{display:flex;align-items:center;justify-content:space-between;padding:9px 14px;cursor:pointer;transition:background .12s}
.nt-sugg-item:hover{background:var(--adm-gold-dim2)}
.nt-sugg-nombre{font-size:13px;font-weight:600;color:var(--adm-text)}
.nt-sugg-meta{font-size:11px;color:var(--adm-muted)}
.nt-save-btn{background:var(--adm-gold)!important;color:#fff!important;border-color:var(--adm-gold)!important;min-width:130px;font-weight:600}
.nt-save-btn:hover:not(:disabled){filter:brightness(1.07);transform:translateY(-1px)}
.nt-save-btn:disabled{opacity:.6;cursor:not-allowed;transform:none}

/* ═══ HISTORIAL DEL DÍA — card ═══ */
.historial-card{background:var(--adm-white);border:1px solid var(--adm-border);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-xs);transition:box-shadow .2s}
.historial-card:hover{box-shadow:var(--shadow-sm)}

/* ═══ SPINNERS ═══ */
.btn-spinner{display:inline-block;width:13px;height:13px;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;border-radius:50%;animation:spin .6s linear infinite;vertical-align:middle;margin-right:5px}
.modal--closing .modal__box{animation:modalOut .16s ease forwards}
@keyframes modalOut{to{opacity:0;transform:scale(.95) translateY(8px)}}

/* ═══ SCROLLBAR ═══ */
/* ── 1024×768 and similar tablet/low-height screens ──
   Lo de ancho vive en el bloque RESPONSIVE de mas arriba, no repetido aca. */
@media(max-height:800px){
  .modal{padding:12px;align-items:flex-start;padding-top:56px}
  .modal__box{max-height:calc(100vh - 68px)}
  .nt-body{padding:14px 18px!important}
  .nt-footer{padding:10px 18px!important}
  .form-group-adm{margin-bottom:8px}
}
::-webkit-scrollbar{width:5px;height:5px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--adm-border-2);border-radius:3px}
::-webkit-scrollbar-thumb:hover{background:var(--adm-muted)}

/* Historial del día, ahora dentro de la pantalla Hoy */
.hoy-historial{margin-top:22px;padding-top:22px;border-top:1px solid var(--adm-border)}
.hoy-historial .hoy-col__head{margin-bottom:14px}

/* Configuración de la clínica */
.cfg-nota{font-size:12.5px;color:var(--adm-muted);margin-bottom:16px;line-height:1.55}
.cfg-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:18px 20px}
.cfg-campo{display:flex;flex-direction:column;gap:5px}
.cfg-campo label{font-size:10.5px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:var(--adm-subtle)}
.cfg-campo input,.cfg-campo select{padding:9px 12px;border:1px solid var(--adm-border);border-radius:var(--radius);
  font-family:var(--font-sans);font-size:13.5px;color:var(--adm-text);background:var(--adm-bg);transition:all .16s}
.cfg-campo input:focus,.cfg-campo select:focus{outline:none;border-color:var(--adm-gold);
  background:var(--adm-white);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.cfg-campo small{font-size:11px;color:var(--adm-subtle);line-height:1.45}
.cfg-campo--guardado input{border-color:#3EA76F;background:#EAF7EF}
.aud-accion{font-size:11px;font-weight:600;padding:2px 9px;border-radius:20px;white-space:nowrap;
  background:var(--adm-bg);color:var(--adm-text-2)}
.aud-accion--alerta{background:#FDECEA;color:#C0392B}

.cfg-campo--ancho{grid-column:1/-1;margin-bottom:14px}
.cfg-campo textarea{padding:10px 12px;border:1px solid var(--adm-border);border-radius:var(--radius);
  font-family:var(--font-sans);font-size:13.5px;line-height:1.6;color:var(--adm-text);
  background:var(--adm-bg);resize:vertical;transition:all .16s}
.cfg-campo textarea:focus{outline:none;border-color:var(--adm-gold);background:var(--adm-white);
  box-shadow:0 0 0 3px var(--adm-gold-dim)}
.cfg-campo--guardado textarea{border-color:#3EA76F;background:#EAF7EF}
.cfg-nota code{background:var(--adm-bg);border:1px solid var(--adm-border);border-radius:4px;
  padding:1px 5px;font-size:11.5px;font-family:ui-monospace,monospace}
.cfg-aviso{font-size:12.5px;line-height:1.6;color:var(--adm-text-2);background:var(--adm-gold-dim2);
  border:1px solid var(--adm-gold-dim);border-radius:10px;padding:12px 14px;margin-top:4px}

/* Encabezado de cada tarjeta de Configuración: un ícono le da a cada bloque
   una identidad reconocible, en vez de cinco tarjetas blancas idénticas. */
.cfg-card__head{display:flex;gap:13px;align-items:flex-start;margin-bottom:18px;
  padding-bottom:16px;border-bottom:1px solid var(--adm-border)}
.cfg-card__ico{flex-shrink:0;width:40px;height:40px;border-radius:10px;display:flex;
  align-items:center;justify-content:center;
  background:var(--adm-gold-dim);border:1px solid var(--adm-gold-dim)}
.cfg-card__ico svg{width:19px;height:19px;color:var(--adm-gold-dark)}

/* Ícono chico incrustado en una línea de texto (avisos, teléfonos, rótulos
   de una tarjeta): mismo trazo fino que el resto del panel, sin desalinear
   el renglón. */
.ico-inline{width:13px;height:13px;flex-shrink:0;vertical-align:-2.5px;
  display:inline-block;opacity:.75}
.cfg-card__head h3{margin:0 0 5px;font-size:16px;letter-spacing:-.2px}
.cfg-card__head .cfg-nota{margin-bottom:0}

/* Cada tarjeta es un tema cerrado: el aire entre ellas es lo que hace que
   se lean como bloques y no como una lista larga de campos. */
.cfg-card{margin-bottom:0}

/* ── Layout de Configuración: lista de secciones a la izquierda, el
   contenido de UNA sola sección a la derecha. Antes eran ocho tarjetas
   apiladas con scroll infinito; ahora se alternan con .cfg-card--activa
   (ver cfgMostrarSeccion en admin.js). Los ids internos no se tocan: es
   el mismo contenido, solo cambia cómo se muestra. ── */
.cfg-layout{display:grid;grid-template-columns:216px 1fr;gap:24px;align-items:start}
.cfg-content{min-width:0}

.cfg-nav{display:flex;flex-direction:column;gap:3px;position:sticky;top:84px}
.cfg-nav__item{display:flex;align-items:center;gap:11px;width:100%;text-align:left;
  padding:9px 12px;border:none;border-left:3px solid transparent;border-radius:0 var(--radius) var(--radius) 0;
  background:none;font-family:var(--font-sans);font-size:13px;font-weight:500;
  color:var(--adm-text-2);cursor:pointer;transition:all .14s var(--ease)}
/* Mismo tratamiento que .sidebar__link svg: ícono de línea que hereda el
   color del texto (stroke:currentColor, definido en el reset global), así
   pasar a dorado en el estado activo no pide tocar el SVG. */
.cfg-nav__item svg{width:16px;height:16px;flex-shrink:0;opacity:.6;
  transition:opacity .2s var(--ease)}
.cfg-nav__item:hover{background:var(--adm-gold-dim2);color:var(--adm-text)}
.cfg-nav__item:hover svg{opacity:.9}
/* Fondo Y borde, no solo un cambio de color: tiene que leerse igual de
   claro para quien no distingue bien el dorado del gris. */
.cfg-nav__item--activa,.cfg-nav__item--activa:hover{border-left-color:var(--adm-gold);
  background:var(--adm-gold-dim);color:var(--adm-gold-dark);font-weight:600}
.cfg-nav__item--activa svg,.cfg-nav__item--activa:hover svg{opacity:1}
.cfg-nav__item:focus-visible{outline:2px solid var(--adm-gold);outline-offset:-2px}

/* Una sola sección visible a la vez. El interruptor del Laboratorio sigue
   mandando: ExperimentosUI.pintar() pone display:none inline cuando no hay
   experimentos, y eso pisa esta clase igual (estilo inline > clase). */
.cfg-content .cfg-card{display:none}
.cfg-content .cfg-card.cfg-card--activa{display:block}

@media(max-width:820px){
  /* Sin lugar para dos columnas: la lista pasa a una fila de chips
     horizontal arriba, y el contenido de la sección elegida abajo. */
  .cfg-layout{display:block}
  .cfg-nav{position:static;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;
    gap:8px;padding-bottom:10px;margin-bottom:18px;-webkit-overflow-scrolling:touch}
  .cfg-nav__item{flex-shrink:0;border-left:none;border:1px solid var(--adm-border);
    border-radius:20px;background:var(--adm-white);white-space:nowrap}
  .cfg-nav__item--activa,.cfg-nav__item--activa:hover{border-color:var(--adm-gold)}
}

/* Modal de explicación del segundo factor */
.cfg-modal__txt{font-size:13.5px;line-height:1.65;color:var(--adm-text-2);margin:0 0 14px}
.cfg-modal__txt strong{color:var(--adm-text)}
.cfg-modal__pie{justify-content:flex-end}

/* ── Marcadores como botones ──
   Antes había que saber de memoria que existía {paciente} y escribirlo con
   llaves. Ahora cada dato es un botón con su nombre en castellano. */
.cfg-chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-bottom:2px}
.cfg-chips__lbl{font-size:10.5px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;
  color:var(--adm-subtle);margin-right:2px}
.cfg-chip{font-family:var(--font-sans);font-size:12px;font-weight:500;color:var(--adm-text-2);
  background:var(--adm-white);border:1px solid var(--adm-border);border-radius:20px;
  padding:4px 11px;cursor:pointer;transition:all .14s;white-space:nowrap}
.cfg-chip:hover{border-color:var(--adm-gold);background:var(--adm-gold-dim);color:var(--adm-gold-dark)}
.cfg-chip:active{transform:translateY(1px)}
.cfg-chip:focus-visible{outline:2px solid var(--adm-gold);outline-offset:1px}

/* Vista previa: cómo le llega al paciente, con datos de ejemplo */
.cfg-previa{background:var(--adm-bg);border:1px solid var(--adm-border);border-left:3px solid var(--adm-gold);
  border-radius:8px;padding:10px 13px;margin-top:2px}
.cfg-previa__lbl{display:block;font-size:10px;font-weight:700;letter-spacing:.7px;text-transform:uppercase;
  color:var(--adm-subtle);margin-bottom:5px}
.cfg-previa__txt{margin:0;font-size:13px;line-height:1.6;color:var(--adm-text);white-space:pre-wrap;
  word-break:break-word}
/* Configuración va abajo del menú, separada del trabajo del día a día */
.sidebar__aparte{margin-top:auto;padding:10px;border-top:1px solid rgba(255,255,255,.07)}
.sidebar__aparte .sidebar__link{margin:0}
/* El de Ayuda es un <button>: sin resetear fondo y borde queda con el gris
   por defecto del navegador, que sobre la barra oscura se ve como un parche. */
button.sidebar__link{width:100%;text-align:left;background:none;border:none;
  color:var(--sidebar-text);font-family:var(--font-sans);font-size:13px;font-weight:400;
  letter-spacing:.1px;cursor:pointer}
button.sidebar__link:hover{color:var(--sidebar-text-h);background:var(--sidebar-hover)}

/* Importe editable dentro del presupuesto: se escribe en el momento, sea
   que venga del catálogo o que la clínica cotice caso por caso. */
.presup-precio{width:120px;padding:6px 10px;border:1px solid var(--adm-border);border-radius:8px;
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;text-align:right;
  color:var(--adm-text);background:var(--adm-white);outline:none;
  transition:border-color .18s var(--ease),box-shadow .18s var(--ease)}
.presup-precio:focus{border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.presup-precio::placeholder{color:var(--adm-subtle);font-style:italic}
/* Importe que no se entiende (un "-", un negativo): se marca en vez de
   blanquearse en silencio, como ya hace el precio de Prestaciones. */
.presup-precio--error{border-color:#F87171;background:#FEF2F2}
/* "a favor" en la columna de saldo: el importe va en positivo y el signo se
   dice con palabras, igual que en el recuadro de arriba. */
.cc-a-favor{font-size:10px;font-weight:600;letter-spacing:.3px;text-transform:uppercase;
  color:#1E8449;background:#EAF7EF;border:1px solid #BFE4CD;border-radius:5px;
  padding:1px 5px;margin-left:5px;white-space:nowrap}


/* ═══════════════════════════════════════════════════════
   AJUSTES FINALES DEL LENGUAJE VISUAL
   Lo que quedaba fuera del sistema: entrada de las pantallas,
   foco visible uniforme y respeto por quien pide menos movimiento.
═══════════════════════════════════════════════════════ */

/* Cada pantalla entra desde 4px abajo. Cuatro pixeles no se "ven", pero
   avisan que la pantalla cambio: sin eso el contenido se reemplaza de golpe
   y en una PC de recepcion cuesta darse cuenta de que uno navego. */
.admin-section{animation:seccionEntra var(--t-entrada) var(--ease)}
@keyframes seccionEntra{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}

/* Un unico anillo de foco para todo lo que se navega con teclado, del color
   de la clinica. Antes cada control tenia el suyo (o el del navegador). */
.toolbar-search:focus-visible,.toolbar-date:focus-visible,.modal-select:focus-visible,
.sidebar__link:focus-visible,.action-btn:focus-visible,.modal-btn:focus-visible,
.topbar__refresh:focus-visible,.topbar__site-link:focus-visible{
  outline:2px solid var(--adm-gold);outline-offset:2px}

/* Deshabilitado: se ve apagado, no roto. */
button:disabled,input:disabled,select:disabled,textarea:disabled{
  opacity:.5;cursor:not-allowed;filter:saturate(.4)}

/* Quien pidio menos movimiento en su sistema no quiere que el panel se
   mueva "un poquito igual": se apaga todo, no se atenua. */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.01ms!important;animation-iteration-count:1!important;
    transition-duration:.01ms!important;scroll-behavior:auto!important}
  .login-btn__spinner,.btn-spinner,.topbar__refresh.spinning svg{
    animation-duration:.8s!important;animation-iteration-count:infinite!important}
}

/* ── Permisos por usuario: el check se dibuja acá ──
   No se deja librado a `accent-color`, que es una *sugerencia* al navegador y
   no todos la pintan: en algunas instalaciones el color de la clínica no
   llegaba a la marca y el check salía gris. Dibujado a mano, el color es el
   mismo en todos lados. */
#permisosLista input[type="checkbox"]{
  appearance:none;-webkit-appearance:none;
  width:16px;height:16px;margin:0;flex:0 0 16px;position:relative;
  border:1.5px solid var(--adm-border);border-radius:4px;
  background:var(--adm-surface);cursor:pointer;
  transition:background .12s var(--ease),border-color .12s var(--ease)}
#permisosLista input[type="checkbox"]:hover{border-color:var(--adm-gold)}
#permisosLista input[type="checkbox"]:checked{
  background:var(--adm-gold);border-color:var(--adm-gold)}
#permisosLista input[type="checkbox"]:checked::after{
  content:'';position:absolute;left:4.5px;top:1.5px;
  width:4px;height:8px;border:solid #fff;border-width:0 2px 2px 0;
  transform:rotate(45deg)}
#permisosLista input[type="checkbox"]:focus-visible{
  outline:2px solid var(--adm-gold);outline-offset:2px}

/* ── Laboratorio (funciones experimentales) ── */
.exp-item{padding:14px 0;border-bottom:1px solid var(--adm-border)}
.exp-item:last-child{border-bottom:0;padding-bottom:0}
.exp-item:first-child{padding-top:0}
.exp-item h4{font-family:var(--font-sans);font-size:14px;font-weight:600;color:var(--adm-text);margin:0 0 3px}
.exp-advertencia{font-size:12px;color:var(--adm-text-2);background:var(--adm-gold-dim2);
  border-left:2px solid var(--adm-gold);border-radius:0 6px 6px 0;padding:7px 10px;margin:8px 0 10px}

/* ═══════════════════════════════════════════════════════
   ASISTENTE IA
   Fase 3, Task 1: solo estructura y estilos, sin comportamiento.
   El panel es hijo directo de .admin-panel (display:flex), igual que
   .sidebar y .admin-main: se muestra/oculta con `display:none` → `flex`
   en vez de position:fixed, así el propio flexbox reacomoda .admin-main
   (flex:1) y "empuja" el contenido en vez de taparlo. El botón flotante
   sí es position:fixed, para quedar visible sobre cualquier sección sin
   participar del layout. Toggle manual para probar sin JS (Task 2 lo
   reemplaza por un listener real):
     document.getElementById('asistentePanel').classList.add('abierto')
     document.getElementById('asistentePanel').classList.remove('abierto')
═══════════════════════════════════════════════════════ */
.asistente-btn{
  /* En la esquina real (24px), no a 92px: el hueco de arriba hacía que se
     viera flotando lejos del borde en vez de "pegado". El toast (mismo
     lugar, z-index:300) se movió más arriba para no superponerse. */
  position:fixed;bottom:24px;right:24px;z-index:120;
  width:44px;height:44px;border-radius:50%;border:none;
  background:linear-gradient(135deg,var(--adm-gold) 0%,var(--adm-gold-dark) 100%);
  color:#fff;display:flex;align-items:center;justify-content:center;
  box-shadow:var(--shadow-lg);cursor:pointer;
  transition:transform .18s var(--ease),box-shadow .18s var(--ease)}
.asistente-btn:hover{transform:translateY(-2px) scale(1.04);box-shadow:0 14px 32px -8px rgba(58,46,30,.35)}
.asistente-btn:active{transform:translateY(0) scale(.98)}
.asistente-btn svg{width:20px;height:20px;stroke:#fff}
/* Con el panel abierto el botón queda pegado a la esquina inferior del
   propio panel (position:fixed no participa del layout que empuja
   .admin-main) — se ve flotando encima del formulario. Ocultarlo mientras
   .asistente-panel tiene .abierto. */
.admin-panel:has(.asistente-panel.abierto) .asistente-btn{display:none}

.asistente-panel{
  display:none;/* → flex cuando tiene .abierto */
  flex-direction:column;
  width:380px;flex-shrink:0;
  height:100vh;position:sticky;top:0;
  background:var(--adm-white);border-left:1px solid var(--adm-border);
  box-shadow:var(--shadow-lg);z-index:60}
.asistente-panel.abierto{display:flex}
.asistente-panel__header{
  display:flex;align-items:center;justify-content:space-between;
  padding:18px 20px;border-bottom:1px solid var(--adm-border);flex-shrink:0}
.asistente-panel__header h2{
  font-family:var(--font-serif);font-size:17px;font-weight:600;
  color:var(--adm-text);letter-spacing:-.2px}
.asistente-panel__close{
  background:none;border:none;width:28px;height:28px;border-radius:7px;
  font-size:14px;color:var(--adm-muted);cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  transition:color .18s,background .18s}
.asistente-panel__close:hover{color:var(--adm-text);background:var(--adm-bg)}
.asistente-panel__hilo{
  flex:1;overflow-y:auto;padding:18px 20px;
  display:flex;flex-direction:column;gap:12px}
.asistente-panel__footer{
  border-top:1px solid var(--adm-border);padding:14px 16px;flex-shrink:0;
  background:var(--adm-surface-2)}
.asistente-panel__form{display:flex;gap:8px}
.asistente-panel__form input{
  flex:1;padding:10px 13px;border:1.5px solid var(--adm-border);
  border-radius:var(--radius);font-size:13.5px;color:var(--adm-text);
  background:var(--adm-white);outline:none;font-family:var(--font-sans);
  transition:border-color .18s,box-shadow .18s}
.asistente-panel__form input:focus{
  border-color:var(--adm-gold);box-shadow:0 0 0 3px var(--adm-gold-dim)}
.asistente-panel__enviar{
  width:38px;height:38px;flex-shrink:0;border:none;border-radius:var(--radius);
  background:var(--adm-gold);color:#fff;font-size:16px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  transition:background .18s,transform .12s}
.asistente-panel__enviar:hover{background:var(--adm-gold-dark)}
.asistente-panel__enviar:active{transform:scale(.94)}
.asistente-panel__cupo{
  margin-top:9px;font-size:11px;color:var(--adm-muted);text-align:center}
/* Task 3: aviso anticipado de cupo, antes de que el 400 real lo bloquee.
   80% de uso → tono de alerta; 0 consultas restantes → tono fuerte. */
.asistente-cupo--alto{color:var(--adm-warning);font-weight:600}
.asistente-cupo--lleno{color:var(--adm-red);font-weight:600}

/* Task 2: burbujas del hilo. .asistente-panel__hilo ya es flex-column con
   gap, así que cada burbuja solo necesita alinearse a un lado. */
.asistente-msg{
  max-width:88%;padding:9px 12px;border-radius:12px;font-size:13.5px;
  line-height:1.45;white-space:pre-wrap;word-break:break-word}
.asistente-msg--usuario{
  align-self:flex-end;background:var(--adm-gold-dim);color:var(--adm-text);
  border-bottom-right-radius:4px}
.asistente-msg--asistente{
  align-self:flex-start;background:var(--adm-bg);color:var(--adm-text);
  border-bottom-left-radius:4px}
/* Mensajes que no son de la conversación (loading, errores, aviso de cupo
   agotado): centrados y sin burbuja, para no confundirlos con una respuesta
   real del asistente. */
.asistente-msg--sistema{
  align-self:center;max-width:96%;text-align:center;font-size:12px;
  color:var(--adm-muted);font-style:italic;padding:2px 8px}
/* Formato del mensaje del asistente. El texto ya viene como <p>, <ul>/<ol> y
   <strong> desde formatearMensaje(); acá solo se le saca el margen suelto que
   el navegador le pone por defecto, que dentro de una burbuja se ve como un
   agujero. `white-space:normal` porque el salto de línea ya lo da el <p>: con
   el pre-wrap heredado, cada párrafo sumaría un renglón vacío de más. */
.asistente-msg--asistente{white-space:normal}
.asistente-msg p{margin:0 0 7px}
.asistente-msg p:last-child{margin-bottom:0}
.asistente-msg ul,.asistente-msg ol{margin:0 0 7px;padding-left:20px}
.asistente-msg ul:last-child,.asistente-msg ol:last-child{margin-bottom:0}
.asistente-msg li{margin:0 0 3px}
.asistente-msg li:last-child{margin-bottom:0}
.asistente-msg strong{font-weight:600;color:var(--adm-navy)}
.asistente-msg code{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em;
  background:var(--adm-gold-dim);padding:1px 4px;border-radius:4px}
.asistente-msg--cargando{animation:asistentePulso 1.3s ease-in-out infinite}
.asistente-msg--error{color:var(--adm-red);font-style:normal}
.asistente-msg--bloqueo{color:var(--adm-warning);font-style:normal;font-weight:600}
@keyframes asistentePulso{0%,100%{opacity:.45}50%{opacity:1}}

/* Task 4: tarjetas de confirmación. Van en el mismo hilo que las burbujas
   (spec: "en línea, no un modal aparte"), pero necesitan campos editables,
   así que reusan .form-group-adm (label + input, ya definido para los
   modales del panel) y .modal-btn--save para el botón — nada de estilo
   nuevo para inputs/botones, solo el contenedor. */
.asistente-card{
  background:var(--adm-surface-2);border:1px solid var(--adm-border);
  border-radius:12px;padding:14px 14px 12px}
.asistente-card__titulo{
  font-size:12.5px;font-weight:600;color:var(--adm-text);margin-bottom:8px}
.asistente-card__dictado{
  background:var(--adm-bg);border-radius:8px;padding:8px 10px;margin-bottom:10px}
.asistente-card__dictado label{
  display:block;font-size:10.5px;font-weight:600;color:var(--adm-muted);
  text-transform:uppercase;letter-spacing:.03em;margin-bottom:3px}
.asistente-card__dictado p{
  font-size:12.5px;color:var(--adm-text-2,var(--adm-text));font-style:italic;
  white-space:pre-wrap;word-break:break-word;margin:0}
.asistente-card .form-group-adm{margin-bottom:10px}
.asistente-card .form-group-adm:last-of-type{margin-bottom:0}
.asistente-card__fila{display:flex;gap:10px}
.asistente-card__fila .form-group-adm{flex:1;min-width:0}
.asistente-card textarea{resize:vertical;min-height:64px;font-family:inherit}
.asistente-card__error{
  font-size:11.5px;color:var(--adm-red);margin:8px 0 0}
.asistente-card__error:empty{display:none;margin:0}
.asistente-card__acciones{display:flex;justify-content:flex-end;margin-top:10px}
/* Tarjeta ya guardada: nunca desaparece, queda marcada. El botón pasa a
   "Guardado ✓" (JS) y acá solo se refuerza con el borde/fondo verde. */
.asistente-card--guardada{
  border-color:var(--adm-sage);
  background:color-mix(in srgb, var(--adm-sage) 6%, var(--adm-surface-2))}
.asistente-card--guardada .modal-btn--save{
  background:var(--adm-sage);opacity:1}

@media(max-width:768px){
  /* Fondo traslúcido con blur: se sigue viendo la sección de fondo (para
     saber en qué pantalla está o desde dónde abrió Moni), pero el texto del
     panel queda legible encima. Antes era opaco y tapaba todo el sistema. */
  .asistente-panel{
    position:fixed;inset:0;width:100%;height:100%;z-index:250;
    border-left:none;
    background:color-mix(in srgb, var(--adm-white) 35%, transparent);
    backdrop-filter:blur(6px) saturate(150%);
    -webkit-backdrop-filter:blur(6px) saturate(150%)}
  .asistente-panel__header,.asistente-panel__footer{
    background:color-mix(in srgb, var(--adm-white) 50%, transparent)}
  .asistente-panel__hilo{background:color-mix(in srgb, var(--adm-white) 20%, transparent)}
  .asistente-msg--usuario,.asistente-msg--asistente,.asistente-card{
    box-shadow:0 1px 4px rgba(0,0,0,.08)}
  .asistente-btn{bottom:18px;right:18px}
}

/* Barra de aviso crítico (contraseña de fábrica del admin). La barra es
   `position:fixed` arriba de todo, así que el panel tiene que correrse hacia
   abajo o le tapa la primera fila. Se saca sola cuando el aviso se va. */
body.con-aviso-critico .sidebar,
body.con-aviso-critico .admin-main { padding-top: var(--aviso-alto, 46px); }
