/* ============================================================================
 * axui.css — Sistema de componentes del rediseño "clean" (Axis UI).
 * Fiel a la referencia (axis-demo.tomesieira.chatgpt.site): valores MEDIDOS con
 * getComputedStyle, no aproximados. CSS PLANO (sin build, sin Tailwind) para
 * evitar choques con el style.css actual de Axis.
 * NO INVASIVO: solo define tokens + clases .axn-*. No toca body/a/button globales
 * (salvo dentro de .axn-root). Se carga en el shell real SOLO cuando design_new.
 * ==========================================================================*/

/* ---- Fuentes self-hosted (la referencia usa DM Sans para texto, Geist para nº) ---- */
@font-face { font-family:'DM Sans'; font-style:normal; font-weight:100 1000; font-display:swap; src:url('/assets/fonts/dm-sans.woff2') format('woff2'); }
@font-face { font-family:'Geist'; font-style:normal; font-weight:100 900; font-display:swap; src:url('/assets/fonts/geist.woff2') format('woff2'); }

/* ---- Tokens (tema activo de la referencia). En :root para que resuelvan en TODA la página
   (sidebar, módulos re-skineados), no solo dentro de .axn-root. Solo se carga con design_new. ---- */
:root {
  /* SÍNTESIS DS Ola3: --axn-* son ALIAS del set canónico --axis-* / --r-* — un color/radio por concepto vive en
   * axui-tokens.css; aquí solo se referencia (los cientos de var(--axn-*) heredan sin tocarse). */
  --axn-bg:#fff;
  --axn-surface:var(--axis-surface);   /* fondo sidebar / secondary */
  --axn-soft:var(--axis-soft);         /* borde suave / muted bg */
  --axn-line:var(--axis-line);         /* borde de controles/cards */
  --axn-ink:var(--axis-ink);           /* texto principal */
  --axn-muted:var(--axis-muted);       /* texto secundario */
  --axn-mint:var(--axis-mint);         /* accent suave */
  --axn-mint-strong:#c5f2e2;
  --axn-green-ink:var(--axis-green-ink); /* texto sobre mint */
  --axn-green:#34d399;                 /* verde vivo de marca: En curso / activo */
  --axn-chip:var(--axis-soft);         /* chip pill */
  --axn-search:var(--axis-surface);    /* buscador */
  --axn-warn-bg:#fdf0e1;               /* badge alerta (lesión) */
  --axn-warn-ink:#b45309;
  --axn-ok-bg:var(--axis-mint);
  --axn-ok-ink:var(--axis-green-ink);
  --axn-r:var(--r-card);               /* radio card */
  --axn-r-sm:var(--r-ctl);             /* radio control */
  --axn-r-lg:var(--r-card);            /* radio card */
  --axn-inset:32px;                    /* padding lateral del contenido */
  --axn-gap:2.5rem;                    /* separación entre secciones */
  --axn-width:1320px;
}
.axn-root {
  font-family:'DM Sans', system-ui, -apple-system, sans-serif;
  color:var(--axn-ink);
  background:var(--axn-bg);
  line-height:1.5;
  -webkit-font-smoothing:antialiased;
}
.axn-root *, .axn-root *::before, .axn-root *::after { box-sizing:border-box; }

/* ---- Layout ---- */
.axn-page { max-width:var(--axn-width); margin-inline:auto; padding:var(--axn-inset); }
.axn-section { margin-top:var(--axn-gap); }
.axn-section:first-child { margin-top:0; }
.axn-divider { height:1px; background:var(--axn-line); border:0; margin:0; }
.axn-row-between { display:flex; align-items:center; justify-content:space-between; gap:1rem; }
.axn-stack { display:flex; flex-direction:column; }
.axn-cluster { display:flex; align-items:center; gap:.5rem; flex-wrap:wrap; }

/* ---- Tipografía ---- */
.axn-h1 { font-size:40px; font-weight:600; letter-spacing:-1.4px; line-height:1.1; margin:0; }
.axn-h2 { font-size:24px; font-weight:600; letter-spacing:-.84px; line-height:1.15; margin:0; }
.axn-title { font-size:18px; font-weight:600; letter-spacing:-.3px; margin:0; }
.axn-sub { font-size:14px; color:var(--axn-muted); margin:0; }
.axn-muted { color:var(--axn-muted); }
.axn-num { font-family:'Geist', system-ui, sans-serif; font-weight:600; letter-spacing:-.04em; line-height:1; }

/* ---- Botones ---- */
.axn-btn {
  display:inline-flex; align-items:center; gap:.4rem; cursor:pointer;
  font-family:inherit; font-size:14px; font-weight:500; line-height:1;
  padding:.6rem .9rem; border-radius:var(--axn-r-sm); border:1px solid transparent;
  background:var(--axn-ink); color:#fff; text-decoration:none; white-space:nowrap;
  transition:opacity .15s, background .15s, border-color .15s;
}
.axn-btn:hover { opacity:.9; }
.axn-btn svg { width:16px; height:16px; }
.axn-btn--ghost { background:transparent; color:var(--axn-ink); border-color:var(--axn-line); }
.axn-btn--ghost:hover { background:var(--axn-surface); opacity:1; }
.axn-btn--pill { border-radius:999px; }
.axn-btn--sm { padding:.4rem .7rem; font-size:13px; }

/* ---- Chip (pill gris claro) ---- */
.axn-chip {
  display:inline-flex; align-items:center; gap:.35rem;
  background:var(--axn-chip); color:var(--axn-green-ink);
  border-radius:999px; padding:.35rem .7rem; font-size:14px; line-height:1;
  border:0; cursor:pointer; text-decoration:none; white-space:nowrap;
}
.axn-chip svg { width:15px; height:15px; }

/* ---- Badges de estado ---- */
.axn-badge {
  display:inline-flex; align-items:center; gap:.3rem;
  border-radius:999px; padding:.25rem .6rem; font-size:13px; font-weight:500; line-height:1;
  background:var(--axn-soft); color:var(--axn-muted);
}
.axn-badge--warn { background:var(--axn-warn-bg); color:var(--axn-warn-ink); }
.axn-badge--ok   { background:var(--axn-ok-bg);   color:var(--axn-ok-ink); }
.axn-badge--live { background:var(--axn-green); color:#0b3a2a; }
.axn-badge-dot { width:7px; height:7px; border-radius:50%; background:currentColor; display:inline-block; }

/* ---- Inputs ---- */
.axn-input {
  font-family:inherit; font-size:14px; color:var(--axn-ink);
  background:var(--axn-search); border:0; border-radius:999px; padding:.5rem .9rem; width:100%;
}
.axn-input::placeholder { color:var(--axn-muted); }
.axn-search { position:relative; display:inline-flex; align-items:center; width:100%; }
.axn-search svg { position:absolute; left:12px; width:16px; height:16px; color:var(--axn-muted); pointer-events:none; }
.axn-search .axn-input { padding-left:35px; }

/* ---- Cards ---- */
.axn-card { background:var(--axn-bg); border:1px solid var(--axn-line); border-radius:var(--axn-r-lg); padding:24px; }
.axn-card--flat { border:0; padding:0; background:transparent; }

/* ---- KPI — CANÓNICO DEL DS (icono desnudo + número Geist + label + nota) ----
 * Espejo EXACTO de `.axh-stat` (axhome.css), que es el KPI de "Tu panel de control" de la home y la
 * referencia visual del sistema. Este look es el POR DEFECTO a propósito: antes la base pintaba el
 * icono en círculo relleno y el aspecto correcto solo llegaba si el HTML se acordaba de envolver el
 * KPI en `.axn-fkpis` — una clase opcional que solo ponían 5 de los 18 ficheros que usan dash_kpi, así
 * que los otros 13 salían con el look viejo. Acertar no puede depender de recordar una clase.
 * El espaciado va en margin-top de cada hijo (no en gap) para poder calcarlo de .axh-stat. */
.axn-kpi { display:flex; flex-direction:column; gap:0; }
.axn-kpi-ic { display:grid; place-items:center; width:2rem; height:2rem; color:var(--axis-ink); background:transparent; border-radius:0; }
.axn-kpi-ic svg { width:1.85rem; height:1.85rem; }
.axn-kpi-val { margin-top:1rem; font-family:'Geist','DM Sans',system-ui,sans-serif; font-weight:600; font-size:2rem; letter-spacing:-.035em; line-height:1.15; color:var(--axis-ink); }
.axn-kpi-val small { font-size:1rem; font-weight:500; color:var(--axis-muted); letter-spacing:0; margin-left:2px; }
.axn-kpi-label { margin-top:.7rem; font-size:.875rem; font-weight:500; text-transform:none; letter-spacing:0; color:var(--axis-ink); }
.axn-kpi-note { margin-top:.25rem; font-size:.75rem; color:var(--axis-muted); }
/* TONO SEMÁNTICO del número. El KPI plano deja el valor en tinta a propósito —el color no decora— pero hay
   métricas donde el color ES el dato: un RPE de 9, un dolor de 8 o unas sesiones canceladas no significan
   lo mismo que sus opuestos, y dejarlas en tinta las vuelve indistinguibles del resto. Se tiñe SOLO el
   número: el icono sigue desnudo y la tarjeta sin caja, así que el lenguaje del DS no cambia.
   Usar únicamente cuando el color aporta significado; si es adorno, no se usa. */
.axn-kpi-val--success { color:hsl(var(--success)); }
.axn-kpi-val--warning { color:hsl(var(--warning)); }
.axn-kpi-val--danger  { color:hsl(var(--destructive)); }

/* ---- Banner (sesión en curso / destacado) ---- */
.axn-banner { display:flex; align-items:center; gap:.75rem; border-radius:var(--axn-r); padding:.85rem 1rem; background:var(--axn-mint); color:var(--axn-green-ink); }
.axn-banner--live { background:var(--axn-green); color:#0b3a2a; }

/* ---- Avatar ---- */
.axn-av { width:40px; height:40px; border-radius:50%; object-fit:cover; background:var(--axn-soft); flex-shrink:0; display:inline-flex; align-items:center; justify-content:center; font-size:14px; font-weight:600; color:var(--axn-muted); overflow:hidden; }
.axn-av img { width:100%; height:100%; object-fit:cover; }
.axn-av--sm { width:32px; height:32px; font-size:12px; }
.axn-av--lg { width:56px; height:56px; font-size:18px; }

/* ---- Fila de lista (sin caja, separada por línea) ---- */
.axn-row { display:flex; align-items:center; gap:1rem; padding:1rem 0; border-bottom:1px solid var(--axn-line); }
.axn-row:last-child { border-bottom:0; }
.axn-row-main { flex:1; min-width:0; }
.axn-row-name { font-weight:600; }
.axn-row-sub { font-size:14px; color:var(--axn-muted); }

/* ---- Score (número + subrayado por umbral) ---- */
.axn-score { display:inline-flex; flex-direction:column; align-items:flex-start; }
.axn-score-lbl { font-size:11px; text-transform:uppercase; letter-spacing:.04em; color:var(--axn-muted); }
.axn-score-val { font-family:'Geist', system-ui, sans-serif; font-weight:600; font-size:20px; line-height:1.1; }
.axn-score-val small { font-size:12px; color:var(--axn-muted); font-weight:500; }
.axn-score-bar { height:3px; width:44px; border-radius:2px; margin-top:3px; background:currentColor; }
/* Barra de progreso bajo el número de cada KPI del panel de rendimiento (clean): sustituye al anillo/donut y
 * usa el mismo lenguaje que el score de la lista. Ancho fijo centrado (por el flex-col del wrapper); relleno
 * por valor con color de semáforo (inline). */
.axn-kpi-bar { width:96px; max-width:100%; height:4px; margin-top:10px; border-radius:var(--r-ctl); background:var(--axis-soft); overflow:hidden; }
.axn-kpi-bar > i { display:block; height:100%; border-radius:inherit; }

/* ---- Tabs (subrayadas) ---- */
.axn-tabs { display:flex; gap:1.25rem; border-bottom:1px solid var(--axn-line); }
.axn-tab { appearance:none; background:0; border:0; cursor:pointer; font-family:inherit; font-size:15px; color:var(--axn-muted); padding:.6rem 0; margin-bottom:-1px; border-bottom:2px solid transparent; text-decoration:none; }
.axn-tab.is-active { color:var(--axn-ink); font-weight:600; border-bottom-color:var(--axn-ink); }

/* ---- Link con flecha ---- */
.axn-link { display:inline-flex; align-items:center; gap:.25rem; font-size:14px; color:var(--axn-ink); text-decoration:none; }
.axn-link:hover { color:var(--axn-green-ink); }
.axn-link svg { width:15px; height:15px; }

/* ---- Progreso ---- */
.axn-progress { height:6px; border-radius:999px; background:var(--axn-soft); overflow:hidden; }
.axn-progress > i { display:block; height:100%; border-radius:999px; background:var(--axn-ink); }

/* ============================================================================
 * SIDEBAR del rediseño (estructura de la referencia, cableado a datos reales).
 * Va dentro del <aside class="app-sidebar"> real (que da el layout); solo cuando design_new.
 * ==========================================================================*/
.axn-side { display:flex; flex-direction:column; height:100%; background:transparent; padding-top:14px; font-family:'DM Sans',system-ui,sans-serif; }
.axn-side-head { display:flex; align-items:center; justify-content:space-between; padding:18px 18px 6px; }
.axn-side-head svg.h-4, .axn-side-head .axis-logo { height:22px; width:auto; }
.axn-side-live { display:flex; align-items:center; gap:.6rem; margin:6px 14px 4px; padding:.6rem .8rem; border-radius:var(--r-card); background:var(--axn-green); color:#0b3a2a; text-decoration:none; transition:opacity .15s; }
.axn-side-live:hover { opacity:.92; }
.axn-side-live .dot { width:8px; height:8px; border-radius:50%; background:hsl(var(--card)); box-shadow:0 0 0 3px rgba(255,255,255,.4); flex-shrink:0; }
.axn-side-live b { font-size:13px; display:block; line-height:1.15; font-weight:600; }
.axn-side-live small { font-size:11px; opacity:.85; display:block; }
.axn-side-search { margin:8px 14px; display:flex; align-items:center; gap:.5rem; padding:.5rem .75rem; border-radius:999px; background:var(--axn-search); color:var(--axn-muted); font-size:13px; cursor:pointer; border:0; width:calc(100% - 28px); }
.axn-side-search svg { width:15px; height:15px; }
.axn-side-search kbd { margin-left:auto; font-size:10px; border:1px solid var(--axn-line); border-radius:var(--r-ctl); padding:0 4px; }
.axn-side-nav { flex:1; overflow-y:auto; padding:6px 12px; display:flex; flex-direction:column; gap:2px; }
.axn-side-item { display:flex; align-items:center; gap:.75rem; min-height:3rem; padding:.65rem .85rem; border-radius:var(--r-ctl); color:var(--axn-ink); text-decoration:none; font-size:.9375rem; font-weight:500; transition:background .12s; cursor:pointer; }
.axn-side-item:hover { background:rgba(32,39,35,.05); }
.axn-side-item.is-active { background:var(--axn-chip); font-weight:600; }
.axn-side-item > svg { width:1.15rem; height:1.15rem; flex-shrink:0; color:var(--axn-muted); }
.axn-side-item.is-active > svg { color:var(--axn-green-ink); }
/* Item activo CON submenú: el chevron (.axn-side-caretbtn) es hermano del item dentro de .axn-side-row, así que
 * el sombreado se pinta en la FILA completa (item + flecha) y el item deja de pintarlo — antes la flecha quedaba
 * fuera del sombreado, cortado. */
.axn-side-row:has(> .axn-side-item.is-active) { background:var(--axn-chip); border-radius:var(--r-ctl); }
.axn-side-row:has(> .axn-side-item.is-active) > .axn-side-item.is-active,
.axn-side-row:has(> .axn-side-item.is-active) > .axn-side-item.is-active:hover { background:transparent; }
/* HOVER de una fila con submenú: sombrea la FILA COMPLETA (item + flecha) hasta el borde, no solo el item
 * (antes el hover del .axn-side-item —flex:1— dejaba la flecha .axn-side-caretbtn fuera, cortando el resaltado). */
.axn-side-row:hover { background:rgba(32,39,35,.05); border-radius:var(--r-ctl); }
.axn-side-row:hover > .axn-side-item:hover,
.axn-side-row:hover > .axn-side-caretbtn:hover { background:transparent; }
/* La fila ya activa manda: no aclarar su chip verde con el gris de hover encima. */
.axn-side-row:has(> .axn-side-item.is-active):hover { background:var(--axn-chip); }
.axn-side-group { font-size:11px; font-weight:600; text-transform:uppercase; letter-spacing:.05em; color:var(--axn-muted); padding:14px .7rem 4px; }
.axn-side-foot { padding:12px 14px 14px; display:flex; flex-direction:column; gap:10px; }
.axn-side-plan { border-radius:var(--r-card); background:var(--axn-bg); border:1px solid var(--axn-line); padding:14px; }
.axn-side-plan .top { display:flex; align-items:center; justify-content:space-between; font-size:12px; }
.axn-side-plan .top b { font-size:12px; }
.axn-side-plan .lbl { color:var(--axn-muted); }
.axn-side-plan p { font-size:12px; color:var(--axn-muted); margin:.5rem 0 .7rem; line-height:1.4; }
.axn-side-plan .top span { color:var(--axn-muted); }
.axn-side-plan-bar { height:6px; border-radius:999px; background:var(--axn-line); overflow:hidden; margin:9px 0 2px; }
.axn-side-plan-bar i { display:block; height:100%; background:var(--axn-green-ink); border-radius:999px; }
/* Urgencia (menos de 3 plazas libres): número + barra en rojo para empujar a mejorar el plan. */
.axn-side-plan.is-urgent .top b { color:var(--axis-danger); }
.axn-side-plan.is-urgent .axn-side-plan-bar i { background:var(--axis-danger); }
/* Grupos desplegables del menú (Clientes ▾, Biblioteca ▾, Calendario ▾, Gestión ▾) con <details> nativo */
/* Grupo del sidebar por checkbox-hack (CSS-only, CSP-safe): el LABEL navega, el CHEVRON despliega (como la referencia). */
.axn-side-grp { display:flex; flex-direction:column; }
.axn-side-cb { position:absolute; width:0; height:0; opacity:0; pointer-events:none; }
.axn-side-row { display:flex; align-items:center; gap:2px; }
.axn-side-row > .axn-side-item { flex:1; min-width:0; }
.axn-side-row > .axn-side-item > span { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.axn-side-caretbtn { display:flex; align-items:center; justify-content:center; width:2rem; height:2rem; flex-shrink:0; border-radius:var(--r-ctl); cursor:pointer; }
.axn-side-caretbtn:hover { background:rgba(32,39,35,.05); }
.axn-side-caret { flex-shrink:0; width:15px; height:15px; color:var(--axn-muted); transition:transform .15s; }
.axn-side-item > .axn-side-caret { margin-left:auto; }
.axn-side-cb:checked ~ .axn-side-row .axn-side-caret { transform:rotate(180deg); }
.axn-side-sub { display:none; flex-direction:column; gap:1px; margin:2px 0 8px 1.65rem; padding-left:1rem; border-left:1px solid var(--axn-line); }
.axn-side-cb:checked ~ .axn-side-sub { display:flex; }
.axn-side-sub a { padding:.42rem .55rem; border-radius:var(--r-ctl); font-size:13px; line-height:1.2; color:var(--axn-muted); text-decoration:none; }
.axn-side-sub a:hover { background:rgba(32,39,35,.05); color:var(--axn-ink); }
.axn-side-sub a.is-active { color:var(--axn-ink); font-weight:600; }
.axn-side-user { display:flex; align-items:center; gap:.6rem; padding:.5rem; border-radius:var(--r-ctl); cursor:pointer; text-align:left; width:100%; background:0; border:0; font-family:inherit; }
.axn-side-user:hover { background:rgba(32,39,35,.05); }
.axn-side-user .meta { min-width:0; flex:1; }
.axn-side-user .nm { font-size:14px; font-weight:600; color:var(--axn-ink); display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.axn-side-user .rl { font-size:11px; color:var(--axn-muted); display:block; }
.axn-side-user > svg { width:16px; height:16px; color:var(--axn-muted); }

/* ---- KPI como card (widget del dashboard re-skineado) ----
 * SIN caja: el KPI se apoya en el lienzo, como en la home. El contenedor (grid + gap) aporta la
 * separación y los separadores; la card no dibuja borde ni fondo. Mantiene `position:relative` solo
 * para anclar la flecha de "esto navega". */
.axn-kpi--card { position:relative; background:transparent; border:0; box-shadow:none; border-radius:0; padding:0; min-height:0; height:100%; text-decoration:none; color:inherit; }
.axn-kpi-arrow { position:absolute; top:0; right:0; color:var(--axis-muted); transition:color .15s, transform .15s; }
.axn-kpi-arrow svg { width:16px; height:16px; }
/* Sin caja no hay fondo que resaltar al pasar por encima, así que el feedback de "esto navega" lo da
   la flecha (se oscurece y se desplaza). Solo aplica a los KPI que son enlace: los <div> no la tienen. */
a.axn-kpi--card:hover .axn-kpi-arrow { color:var(--axis-ink); transform:translate(1px,-1px); }
/* Reordenar en el runner: la fila que se arrastra COLAPSA su hueco (altura 0) mientras se mueve el
   fantasma, para que mover un ejercicio HACIA ARRIBA no exija sobre-arrastrar (feedback móvil).
   height:0 en vez de display:none a propósito: la fila es el elemento con la captura de puntero en el
   long-press táctil; display:none la sacaría del render y soltaría la captura → se rompería el arrastre. */
/* Latido del pulsometro en vivo: el punto junto al numero de la grafica. Solo se pinta mientras hay
   banda conectada (o el simulador de la demo), asi que su sola presencia ya dice que esta en directo. */
@keyframes axHrLatido { 0%,100% { transform:scale(1); opacity:1; } 50% { transform:scale(1.55); opacity:.55; } }
@media (prefers-reduced-motion: reduce) { [style*="axHrLatido"] { animation:none !important; } }
.lv-drag-collapse { height:0 !important; min-height:0 !important; margin-top:0 !important; margin-bottom:0 !important; opacity:0 !important; overflow:hidden !important; }

/* ============================================================================
 * CLIENTES — portado 1:1 de la referencia (.axis-client-*), valores MEDIDOS.
 * ==========================================================================*/
.axis-clients-h1 { margin:0 0 .2rem; font-size:40px; font-weight:600; letter-spacing:-.035em; line-height:1.1; color:var(--axis-navy); }
.axis-client-controls { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:center; gap:16px 24px; margin-top:.9rem; margin-bottom:.5rem; }
.axis-client-controls .axis-toolbar { display:flex; align-items:center; gap:8px; flex-wrap:wrap; }
.axis-capacity { display:inline-flex; align-items:center; gap:.4rem; padding:.35rem .65rem; border-radius:var(--r-ctl,8px); background:var(--axis-soft); color:var(--axis-green-ink); font-size:12px; font-weight:600; white-space:nowrap; }
.axis-capacity svg { width:.9rem; height:.9rem; }
.axis-client-controls .axis-btn { display:inline-flex; align-items:center; gap:.4rem; padding:.42rem .8rem; border:0; border-radius:var(--r-ctl,8px); background:var(--axis-soft); color:var(--axis-green-ink); font-size:12px; font-weight:500; cursor:pointer; text-decoration:none; white-space:nowrap; transition:background .12s; font-family:inherit; }
.axis-client-controls .axis-btn:hover { background:#d8ece3; }
.axis-client-controls .axis-btn svg { width:.9rem; height:.9rem; }
.axis-client-controls .axis-new-client { background:#d5efdf; }
/* El botón "Filtros" reutiliza el helper .btn de Axis; aquí se re-skinea a pill como los demás chips. */
.axis-client-controls .btn { height:2.25rem; padding:0 .9rem; border-radius:var(--r-ctl); border:0; background:var(--axis-soft); color:var(--axis-green-ink); font-size:12px; font-weight:500; box-shadow:none; }
.axis-client-controls .btn:hover { background:#d8ece3; }
.axis-client-search { position:relative; display:inline-flex; align-items:center; }
.axis-client-search input { height:2.25rem; width:min(340px,58vw); padding:0 .9rem 0 2.1rem; border:1px solid var(--axis-border); border-radius:999px; background:hsl(var(--card)); font-size:14px; color:var(--axis-navy); font-family:inherit; }
.axis-client-search input:focus { outline:none; border-color:var(--axis-navy); }
.axis-client-search > svg { position:absolute; left:.75rem; width:1rem; height:1rem; color:var(--axis-muted); pointer-events:none; }

.axis-client-row { display:grid; grid-template-columns:56px minmax(180px,1fr) minmax(100px,.45fr) 110px auto 32px; align-items:center; gap:24px; padding:26px 8px; border-bottom:1px solid var(--axis-line); transition:background .15s; cursor:pointer; text-decoration:none; color:inherit; }
.axis-client-row:hover { background:var(--axis-surface); }
.axis-client-row-avatar,
.axis-client-row > img, .axis-client-row > span:first-child { width:56px; height:56px; border-radius:50%; object-fit:cover; flex-shrink:0; }
.axis-client-row-identity h2 { margin:0; font-size:1.125rem; font-weight:600; color:var(--axis-navy); }
.axis-client-row-identity p { margin-top:6px; color:var(--axis-muted); font-size:14px; }
.axis-client-row-health { display:flex; flex-wrap:wrap; gap:8px; }
.axis-client-row-health:empty { display:none; }
.axis-health-tag { display:inline-flex; align-items:center; gap:7px; padding:8px 12px; border-radius:var(--r-ctl); background:var(--axn-warn-bg); color:var(--axn-warn-ink); font-size:14px; font-weight:600; white-space:nowrap; }
.axis-health-tag svg { width:18px; height:18px; }
.axis-health-tag.is-status { background:var(--axis-soft); color:var(--axis-muted); }
.axis-client-row-score > span { display:block; color:var(--axis-muted); font-size:12px; }
.axis-client-row-score strong { display:block; font-size:2rem; font-weight:600; line-height:1.2; letter-spacing:-.035em; color:var(--axis-navy); }
.axis-client-row-score small { margin-left:4px; color:var(--axis-muted); font-size:12px; font-weight:400; letter-spacing:0; }
.axis-client-score-track { height:3px; margin-top:8px; border-radius:var(--r-ctl); background:var(--axis-soft); overflow:hidden; }
.axis-client-score-track i { display:block; height:100%; background:var(--axis-navy); }
.axis-client-row-open { display:inline-flex; align-items:center; gap:.3rem; background:0; border:0; padding:0; color:var(--axis-navy); font-size:14px; font-weight:500; cursor:pointer; white-space:nowrap; font-family:inherit; }
.axis-client-row-open:hover { text-decoration:underline; text-underline-offset:4px; }
.axis-client-row-open svg { width:1rem; height:1rem; }
.axis-client-row-more { display:inline-flex; align-items:center; justify-content:center; width:32px; height:32px; border:0; border-radius:999px; background:0; color:var(--axis-muted); cursor:pointer; }
.axis-client-row-more:hover { background:var(--axis-soft); }
.axis-client-row-more svg { width:18px; height:18px; }

@media (max-width:768px) {
  .axis-client-row { grid-template-columns:48px minmax(0,1fr) 90px 28px; gap:16px; padding:18px 4px; }
  .axis-client-row-avatar,
  .axis-client-row > img, .axis-client-row > span:first-child { width:48px; height:48px; }
  .axis-client-row-identity { grid-area:1/2; }
  .axis-client-row-score { grid-area:1/3; }
  .axis-client-row-more { grid-area:1/4; }
  .axis-client-row-health { grid-area:2/2; }
  .axis-client-row-open { grid-area:2/3/auto/5; justify-self:end; }
  .axis-clients-h1 { font-size:30px; }
}

/* ============================================================================
 * FICHA DE CLIENTE — cabecera estilo referencia (breadcrumb-título + hero).
 * ==========================================================================*/
.axis-client-head { margin-bottom:1.25rem; }
.axis-client-head-top { display:flex; justify-content:space-between; align-items:flex-start; gap:1rem; flex-wrap:wrap; }
.axis-client-breadcrumb { display:flex; align-items:center; gap:.4rem; margin:0; font-size:40px; font-weight:600; letter-spacing:-.035em; line-height:1.1; color:var(--axis-navy); }
.axis-client-breadcrumb a { color:var(--axis-muted); text-decoration:none; }
.axis-client-breadcrumb a:hover { color:var(--axis-navy); }
.axis-client-breadcrumb > svg { width:1.6rem; height:1.6rem; color:var(--axis-muted); flex-shrink:0; }
.axis-client-breadcrumb span { color:var(--axis-navy); }
.axis-client-head-actions { display:flex; align-items:center; gap:.5rem; flex-shrink:0; }
.axis-client-head-actions .btn { border-radius:var(--r-ctl); }
.axis-client-hero { display:flex; align-items:center; gap:.9rem; margin-top:1rem; }
.axis-client-hero > img, .axis-client-hero > .axn-hero-ini { width:4.2rem; height:4.2rem; border-radius:50%; object-fit:cover; flex-shrink:0; display:flex; align-items:center; justify-content:center; background:var(--axis-mint); color:var(--axis-green-ink); font-size:1.4rem; font-weight:600; }
.axis-client-hero-details { flex:1; min-width:0; }
.axis-client-goal { display:flex; align-items:flex-start; gap:.45rem; color:var(--axis-navy); }
.axis-client-goal > svg { width:1rem; height:1rem; margin-top:.2rem; color:var(--axis-green-ink); flex-shrink:0; }
.axis-client-goal p { margin:0; font-size:.95rem; color:#3a4640; }
.axis-client-tags { display:flex; flex-wrap:wrap; align-items:center; gap:.4rem; margin-top:.5rem; }
.axis-client-tags:empty { display:none; }
.axis-add-client-tag { display:inline-flex; align-items:center; justify-content:center; width:1.75rem; height:1.75rem; border:1px solid var(--axis-border); border-radius:var(--r-ctl); background:hsl(var(--card)); color:var(--axis-muted); cursor:pointer; }
.axis-add-client-tag:hover { background:var(--axis-soft); }
.axis-add-client-tag svg { width:1rem; height:1rem; }
@media (max-width:1023px) { .axis-client-breadcrumb { font-size:26px; } }
/* Ficha cliente · navegación de 2 niveles como la referencia: grupos (underline) + sub-pestañas (pills). */
.axis-cli-tabs { margin-bottom:1.5rem; }
.axis-cli-tabs-l1 { display:flex; gap:1.5rem; border-bottom:1px solid var(--axis-line); overflow-x:auto; scrollbar-width:none; }
.axis-cli-tabs-l1::-webkit-scrollbar { display:none; }
.axis-cli-tab { position:relative; display:inline-flex; align-items:center; gap:.4rem; padding:.7rem 0; margin-bottom:-1px; font-size:14px; font-weight:600; color:var(--axis-muted); border-bottom:2px solid transparent; white-space:nowrap; transition:color .12s; }
.axis-cli-tab:hover { color:var(--axis-ink); }
.axis-cli-tab.is-active { color:var(--axis-navy); border-bottom-color:var(--axis-navy); }
.axis-cli-tab-badge, .axis-cli-subtab-badge { display:inline-flex; align-items:center; justify-content:center; min-width:1.1rem; height:1.1rem; padding:0 .3rem; border-radius:999px; background:var(--axis-danger); color:#fff; font-size:.68rem; font-weight:600; line-height:1; }
/* Sub-pestañas = SEGMENTED CONTROL de la referencia (medido): activa fondo suave + tinta, inactiva
 * transparente + muted; radio 8px, 8×16px, gap 4px. NO pills redondeadas (corrección feedback usuario).
 * SÍNTESIS DS Ola3: los grises PUROS medidos (#f1f1f1/#f7f7f7/#6b6b6b/#252525) se llevan a la paleta
 * verde-grisácea del sistema (soft/surface/muted/ink) — imperceptibles al ojo, un color por concepto. */
.axis-cli-subtabs { display:flex; flex-wrap:wrap; gap:4px; margin-top:.55rem; }
.axis-cli-subtab { display:inline-flex; align-items:center; gap:.4rem; height:36px; padding:8px 16px; border-radius:var(--r-ctl); font-size:14px; font-weight:400; line-height:1; color:var(--axis-muted); background:transparent; border:0; transition:background .12s,color .12s; }
.axis-cli-subtab:hover { background:var(--axis-surface); color:var(--axis-ink); }
.axis-cli-subtab.is-active { background:var(--axis-soft); color:var(--axis-ink); font-weight:600; }
/* Diálogos: el contenedor recibe el foco al abrir (para Esc/Tab), pero SIN anillo visible — así no sale la "×
 * seleccionada" rara al abrir un modal. El foco de teclado en los controles internos sí se ve (focus-visible). */
[role="dialog"][tabindex]:focus { outline:none; }

/* ============================================================================
 * CONTENIDO DE PANTALLAS (ficha de cliente, config, etc.) — reconduce las cajas
 * Material de Axis (.card-unified) al PANEL LIMPIO de la referencia: fondo blanco,
 * borde muy sutil, radio amplio, SIN sombra ni realce. Así el contenido de las
 * pestañas (no solo su barra) adopta el lenguaje clean sin reescribir cada vista.
 * ==========================================================================*/
/* Card SUELTA / panel / modal (patrón .axis-card de catálogo de la referencia): caja blanca ligera, borde
 * sutil, radio amplio y SIN sombra. Es el modo por defecto de .card-unified fuera del contenido de página. */
.card-unified { border:1px solid var(--axis-line) !important; border-radius:var(--r-card-lg) !important; box-shadow:none !important; background:hsl(var(--card)); }
.card-unified.bg-warning-soft { background:#fff9ef !important; border-color:#f6e0b8 !important; }
.card-unified.bg-destructive-soft { background:#fdf3f3 !important; border-color:#f3cccc !important; }

/* ── Cards PLANAS EN PÁGINA (patrón .axis-page .axis-card de la referencia) ─────────────────────────────
 * En la referencia, la card de CONTENIDO en página no es una caja: es una sección separada por una LÍNEA de
 * 1px (sin borde completo, sin sombra, sin radio, fondo transparente) → el contenido respira en vez de
 * apilarse en cajas "Material". En Axis el mismo helper .card-unified sirve para caja Y para contenido, así
 * que se aplana SOLO dentro del contenido de la ficha (.axn-content), preservando por especificidad de clase:
 *   · la tira de KPIs (.axn-fkpis): plana pero SIN línea de separación (es una rejilla, no una sección);
 *   · los modales/hojas (.ax-sheet): conservan su CAJA (son overlays, no contenido de la página).           */
.axn-content .card-unified {
  border:0 !important; border-top:1px solid var(--axis-line) !important; border-radius:0 !important;
  background:transparent !important; box-shadow:none !important; padding:28px 0 !important;
}
/* Los AVISOS (RIR alto / al fallo…) NO son "sección de datos": conservan su caja de alerta suave con color,
 * para seguir destacando como banner (la línea plana los diluiría). */
.axn-content .card-unified.bg-warning-soft { border:1px solid #f6e0b8 !important; border-radius:var(--r-card) !important; background:#fff9ef !important; padding:16px !important; }
.axn-content .card-unified.bg-destructive-soft { border:1px solid #f3cccc !important; border-radius:var(--r-card) !important; background:#fdf3f3 !important; padding:16px !important; }
.axn-content .axn-fkpis .card-unified { border-top:0 !important; padding:.5rem .25rem !important; }
.axn-content .ax-sheet .card-unified {
  border:1px solid var(--axis-line) !important; border-radius:var(--r-card-lg) !important;
  background:hsl(var(--card)) !important; padding:1.25rem !important;
}
.axn-content .ax-sheet .card-unified.bg-warning-soft { background:#fff9ef !important; }
.axn-content .ax-sheet .card-unified.bg-destructive-soft { background:#fdf3f3 !important; }

/* ── Resumen de la ficha en 2 COLUMNAS (patrón de la referencia) ───────────────────────────────────────
 * IZQ (ancha): Objetivos + Plan/Cupones · DER (estrecha): Indicadores (KPIs 2×2) + Contacto/Detalles.
 * El contenido y las acciones son EXACTAMENTE los mismos que en 1 columna (se recomponen por buffers en el
 * PHP); aquí solo se maqueta. El separador de secciones lo da el padding+línea de las cards planas (bloque 2). */
.axn-rez { display:grid; grid-template-columns:minmax(0,1.3fr) minmax(0,1fr); gap:clamp(28px,3.4vw,52px); align-items:start; margin-top:8px; }
.axn-rez-l, .axn-rez-r { min-width:0; }
/* El wrapper de sección (mt-5) no debe acumular hueco: la separación ya la dan las cards planas. */
.axn-rez-sec > .mt-5 { margin-top:0 !important; }
/* La 1ª sección de cada columna es "cabecera de columna": su card no lleva línea superior. */
.axn-rez-l > .axn-rez-sec:first-child .card-unified,
.axn-rez-r > .axn-rez-sec:first-child .card-unified { border-top:0 !important; padding-top:0 !important; }
/* Títulos de sección estilo referencia (H2 DM Sans, fluido 22→24px, -.035em, #202723; NO el rótulo
 * uppercase pequeño). Medido EN VIVO: 24px a ~1009px de contenido, 22px a ~613px → clamp fluido.
 * Reconduce los .text-label del resumen (Contacto, Detalles, Objetivos, Plan, Sesiones, Notas) dentro del grid. */
.axn-rez .text-label, .axn-rez-h {
  font-family:'DM Sans', system-ui, sans-serif; font-size:clamp(22px, 1.1rem + .5vw, 24px);
  font-weight:600; letter-spacing:-.035em; text-transform:none; color:var(--axis-ink); line-height:1.15;
}
.axn-rez .text-label svg { width:1.1rem; height:1.1rem; }
.axn-rez-h { margin:0 0 18px; }
/* Indicadores (columna derecha estrecha): rejilla 2×2 de anillos, con su título encima. */
.axn-rez-ind .axn-fkpis { grid-template-columns:repeat(2,minmax(0,1fr)) !important; margin-bottom:0 !important; }
/* Detalles: la tabla de 6 columnas se reduce a 3 en la columna estrecha para no apretar los valores. */
.axn-rez-r dl.lg\:grid-cols-6 { grid-template-columns:repeat(3,minmax(0,1fr)) !important; }
@media (max-width:1023px){
  .axn-rez { grid-template-columns:1fr; gap:0; }
  .axn-rez-r { order:-1; }   /* en móvil: Indicadores + Contacto ANTES que Objetivos/Plan */
  .axn-rez-l > .axn-rez-sec:first-child .card-unified { border-top:1px solid var(--axis-line) !important; padding-top:28px !important; }
  .axn-rez-r dl.lg\:grid-cols-6 { grid-template-columns:repeat(2,minmax(0,1fr)) !important; }
}
/* Título de sección (text-label) → el rótulo de la referencia: gris apagado, mayúscula sutil, buen espaciado. */
.text-label { color:var(--axis-muted); font-weight:600; letter-spacing:.02em; }
/* Icono en círculo suave (stat-icon) como el de la referencia (mint muy claro + trazo verde). */
.stat-icon { border-radius:var(--r-card); }
.stat-icon-muted { background:var(--axis-soft); color:var(--axis-muted); }
/* KPIs de la ficha sin caja (ya venía marcado con .axn-fkpis): refuerzo de que no lleven borde ni fondo. */
.axn-fkpis > .card-unified { border:0 !important; background:transparent !important; padding:.25rem !important; }

/* ── H1 de página (page_header) en clean = maqueta: DM Sans, fluido 28→40px, -.035em, #202723 ──────────
 * Medido EN VIVO (ref a 1280px): Biblioteca/Analítica = 40px/600/-1.4px/DM Sans. Sustituye al text-h2 (Geist
 * 22px) SOLO en el carril clean (page_header bifurca). Fluido para que en móvil no quede gigante. */
.axn-page-h1 { margin:0; font-family:'DM Sans', system-ui, sans-serif; font-size:clamp(28px, 1.6rem + 1.2vw, 40px); font-weight:600; letter-spacing:-.035em; line-height:1.1; color:var(--axis-ink); }

/* ── Títulos de sección del CONTENIDO de la ficha (clean) = escala H2 de la referencia ──────────────────
 * Medido EN VIVO en la maqueta (Notas/Mediciones/Salud/Bienestar): H2 22→24px fluido, 600, -.035em, #202723,
 * DM Sans. Solo ELEMENTOS DE ENCABEZADO (h2/h3) que actúan como título de sección — NUNCA los .text-label de
 * campos/rótulos pequeños (esos son <label>/<p>/<span>, no headings). Homogeneiza los distintos rótulos que
 * las pestañas usan (text-h3 / text-h2 / h3.text-label / h3.text-base font-semibold) al mismo H2 de la ref. */
.axn-content h2.text-h2,
.axn-content h3.text-h3,
.axn-content h3.text-label,
.axn-content h3.text-base.font-semibold,
.axn-content h2.text-base.font-semibold,
.axn-content h3.text-sm.font-semibold,
.axn-content h2.text-sm.font-semibold {
  font-family:'DM Sans', system-ui, sans-serif; font-size:clamp(22px, 1.1rem + .5vw, 24px);
  font-weight:600; letter-spacing:-.035em; text-transform:none; color:var(--axis-ink); line-height:1.2;
}
/* Excepción: los rótulos de KPI (dash_kpi / .axn-fkpis) y de bloques compactos NO son títulos de sección:
 * si usan h3.text-sm font-semibold, se quedan a su tamaño (no se inflan a 24px). */
.axn-content .axn-fkpis h3.text-sm.font-semibold,
.axn-content .dash-kpi h3, .axn-content [class*="kpi"] h3.text-sm.font-semibold { font-size:14px; letter-spacing:normal; }
/* El icono que acompaña a algunos títulos (Bienestar/Hábitos/Facturación) sube acorde al nuevo tamaño. */
.axn-content h2.text-h2 > svg, .axn-content h3.text-h3 > svg,
.axn-content h3.text-base.font-semibold > svg, .axn-content h2.text-base.font-semibold > svg,
.axn-content h3.text-sm.font-semibold > svg, .axn-content h2.text-sm.font-semibold > svg { width:20px; height:20px; }
/* Analítica (fuera de .axn-content): mismos títulos de sección al H2 de la maqueta. SOLO text-base/text-h3
 * (sus títulos reales); NO text-sm (evita inflar rótulos de gráficas/sub-bloques). Icono en <span> → 20px. */
.axn-analytics h3.text-base.font-semibold, .axn-analytics h2.text-base.font-semibold,
.axn-analytics h3.text-h3, .axn-analytics h2.text-h2 {
  font-family:'DM Sans', system-ui, sans-serif; font-size:clamp(22px, 1.1rem + .5vw, 24px);
  font-weight:600; letter-spacing:-.035em; text-transform:none; color:var(--axis-ink); line-height:1.2;
}
.axn-analytics h3.text-base.font-semibold svg, .axn-analytics h2.text-base.font-semibold svg { width:20px; height:20px; }

/* SIN CAJAS en Analítica (clean): las secciones (.card-unified) se aplanan a bloques separados por una línea
 * de 1px + aire, como el resto del DS clean — la referencia no encaja cada sección en una caja con borde. */
.axn-analytics .card-unified {
  border:0 !important; border-top:1px solid var(--axis-line) !important; border-radius:0 !important;
  background:transparent !important; box-shadow:none !important; padding:28px 0 !important; margin-bottom:0 !important;
}
/* (Las barras de gráfica se pintan navy #202723 desde PHP en $an_bars — monocromas como la referencia.) */

/* ════════════════════════════════════════════════════════════════════════════════════════════════════
 * SISTEMA DE DISEÑO CLEAN · reglas GLOBALES del carril (body.axn-on) — aplican a TODAS las páginas.
 * Medido EN VIVO en la referencia (axis-demo.tomesieira.chatgpt.site): los títulos de SECCIÓN son solo
 * TEXTO, sin icono (24px DM Sans/600/-.035em). El código de Axis mete el icono en el primer <span>/<svg>
 * del heading; aquí se OCULTA en todo el carril clean. No afecta a KPIs/botones (no son headings) ni al
 * H1 de página (no lleva icono). ══════════════════════════════════════════════════════════════════════ */
.axn-on :is(h1,h2,h3) > span:first-child:has(> svg),
.axn-on :is(h1,h2,h3) > svg:first-child { display:none !important; }
/* Variante del portal cliente: el icono va como HERMANO justo ANTES del h2/h3 (patrón <div class="flex"><svg/><heading>),
 * NO dentro del heading, así que la regla de arriba no lo alcanza. Se oculta el svg que precede inmediatamente a un h2/h3
 * → títulos de sección solo TEXTO, como la referencia. Seguro con los KPIs clean (dash_kpi usa <span>, sin heading). */
.axn-on :is(div,p,span) > svg:first-child:has(+ :is(h2, h3)) { display:none !important; }

/* Portal cliente clean: barra de filtros (strip semanal + chips de hora) PEGADA bajo el topbar al hacer
 * scroll — así se puede navegar de día/hora sin perder el filtro de vista. El topbar móvil es sticky con
 * min-h-12 (3rem) + safe-area; el filtro se pega justo debajo. bg-card (en el markup) tapa el contenido que
 * sube por detrás. z<30 para que el topbar quede por encima. */
.axn-cli-sticky { position:sticky; top:calc(3rem + env(safe-area-inset-top)); z-index:20; }
/* El contenedor de contenido del portal lleva overflow-x:hidden, que crea un scroll-container y ROMPE el
 * position:sticky de sus descendientes (el filtro de arriba). overflow-x:clip recorta igual el desbordamiento
 * horizontal pero SIN crear scroll-container → el sticky vuelve a funcionar respecto al scroll de la página. */
.axn-on #main > div { overflow-x:clip; }

/* Rótulos/etiquetas: la referencia usa texto NORMAL 14px ("Clientes activos"), no el "eyebrow" 10px en
 * MAYÚSCULAS con tracking de Axis ("CLIENTES ACTIVOS"). Se lee como frase. Afecta a KPIs y labels de sección
 * de todo el carril. (medido ref: .axis-metric-card h3 = 14px/500 DM Sans, sin uppercase). */
.axn-on .text-eyebrow {
  font-family:'DM Sans', system-ui, sans-serif !important; font-size:14px !important; font-weight:500 !important;
  letter-spacing:normal !important; text-transform:none !important; color:var(--axis-muted, #647169) !important;
}
/* Texto secundario/descripción bajo los títulos: peso normal (la ref usa 400, no 500) y color de la ref. */
.axn-on .text-muted-foreground { font-weight:400; }
/* Números grandes (KPIs/métricas): la referencia usa Geist 600 (no 700), más ligero y elegante. */
.axn-on .text-numeric, .axn-on .tabular-nums { font-weight:600; }
/* Cifras en `font-mono` (totales de fichaje, etc.): la ref no usa monoespaciada para números, sino DM Sans
 * con tabular-nums. Solo cuando ya hay tabular-nums (= número alineado); NO toca código/tokens/IBAN, que
 * usan font-mono sin tabular-nums. */
.axn-on .font-mono.tabular-nums { font-family:'DM Sans', system-ui, sans-serif; }
/* Color de texto secundario/muted alineado EXACTO a la referencia: #647169 = hsl(144 6% 42%)
 * (la demo resolvía a #5d6f64, un pelín más frío). Afecta a todo el texto muted del carril. */
.axn-on { --muted-foreground: 144 6% 42%; }
/* Ficha de cliente (.axn-content): títulos de sección a UN tamaño consistente como la referencia
 * (.axis-client-section-title = Geist ~17px/650); el .text-h4 de algunos bloques se iguala. */
.axn-content .text-h4 { font-size:17px; line-height:1.25; font-weight:600; letter-spacing:-.02em; }
/* Descripción/subtítulo INMEDIATAMENTE bajo un título de sección: 14px como la referencia
 * (.axis-card-title p / .axis-client-section-title p = 14px; la demo la servía a 12-13px). */
.axn-on :is(h2,h3):is(.font-semibold,.text-h3,.text-h4,.axn-rez-h) + p { font-size:14px; line-height:1.4; }
/* Input real (.field/.input-factorial) SELLADO al radio de CONTROL (8px): se quedaba en --radius-lg (16px,
 * pensado para cards) mientras los botones ya usan --r-ctl (8px) — dos radios distintos en la misma fila de
 * formulario. Solo en el carril clean; legacy conserva su --radius-lg de siempre. */
.axn-on .field, .axn-on .input-factorial { border-radius: var(--r-ctl) !important; }

/* CONFIGURACIÓN (/settings): jerarquía de encabezados de BLOQUE. En clean los 3 niveles (grupo/subgrupo/
 * sección) caían casi al mismo tamaño (~15px) → los bloques no se separaban visualmente. Se escala como el
 * resto del DS: encabezado de GRUPO = 22px; título de cada BLOQUE de ajustes = 18px (antes text-h4 15px),
 * con algo más de aire debajo. Acotado a `.axn-set-groups` (solo la página Configuración). */
.axn-on .axn-set-groups > h2 { font-size:22px !important; font-weight:700 !important; letter-spacing:-.02em !important; }
/* El título va dentro del PRIMER div de cada <section>, pero según el bloque cuelga a distinta profundidad:
 * directo (`<div class="mb-3"><h3>`) o anidado si hay un CTA "Nuevo" a la derecha
 * (`<div class="flex justify-between"><div><h3></div><button></div>`, depth 3) o doble (Servicios/Premios,
 * depth 4). Se sigue la cadena de first-child hasta el h3 → captura los 3 casos SIN tocar los sub-títulos
 * internos (que cuelgan de divs posteriores, no del first-child). */
.axn-on .axn-set-groups > section > div:first-child > :is(h3,h4),
.axn-on .axn-set-groups > section > div:first-child > div:first-child > :is(h3,h4),
.axn-on .axn-set-groups > section > div:first-child > div:first-child > div:first-child > :is(h3,h4) { font-size:18px !important; font-weight:600 !important; letter-spacing:-.015em !important; }
.axn-on .axn-set-groups > section > div:first-child { margin-bottom:.85rem; }

/* ── SIN CAJAS en TODO el carril clean (no solo Analítica/ficha) ──────────────────────────────────────
 * Las secciones de CONTENIDO de página (.card-unified) se aplanan a bloque separado por línea de 1px, como
 * la referencia (.axis-page .axis-card). Se aplica a TODAS las páginas del carril (Inicio, Biblioteca,
 * Config, etc.). Las EXCEPCIONES (modales/hojas .ax-sheet y avisos suaves) conservan su caja — reglas
 * posteriores, que ganan por orden. */
.axn-on main .card-unified {
  border:0 !important; border-top:1px solid var(--axis-line) !important; border-radius:0 !important;
  background:transparent !important; box-shadow:none !important; padding:28px 0 !important; margin-bottom:0 !important;
}
.axn-on .ax-sheet .card-unified { border:1px solid var(--axis-line) !important; border-top:1px solid var(--axis-line) !important; border-radius:var(--r-card-lg) !important; background:hsl(var(--card)) !important; padding:1.25rem !important; }
/* EXCEPCIÓN borde-a-borde: modales que ya llevan su propio p-0 (cabecera/cuerpo/pie con padding propio, p.ej.
 * los modales de Axis Intelligence) NO deben recibir el padding:1.25rem de arriba — dejaba un marco en blanco
 * alrededor de la cabecera/pie del modal. Gana por especificidad (clase .p-0 añadida al selector). */
.axn-on .ax-sheet .card-unified.p-0 { padding:0 !important; }
.axn-on .card-unified.bg-warning-soft { border:1px solid #f6e0b8 !important; border-radius:var(--r-card) !important; background:#fff9ef !important; padding:16px !important; }
.axn-on .card-unified.bg-destructive-soft { border:1px solid #f3cccc !important; border-radius:var(--r-card) !important; background:#fdf3f3 !important; padding:16px !important; }
/* La tira de KPIs de la ficha (rejilla, no sección) no lleva línea superior ni padding grande. */
.axn-on .axn-fkpis .card-unified { border-top:0 !important; padding:.5rem .25rem !important; }
/* EXCEPCIÓN "CAJA" (decisión usuario 2026-09-13): elementos que SÍ deben verse como CAJA con el DS clean
 * (plantillas de Planificación, Bloques, tiles reutilizables…) en vez de aplanarse a bloque-línea. Caja =
 * borde 1px línea + radio de card + fondo blanco + SIN sombra. Se marcan con `.axn-boxed` (gana por orden). */
.axn-on main .card-unified.axn-boxed,
.axn-on main .axn-boxed { border:1px solid var(--axis-line) !important; border-top:1px solid var(--axis-line) !important; border-radius:var(--r-card-lg) !important; background:hsl(var(--card)) !important; box-shadow:none !important; padding:1.25rem !important; }
/* EXCEPCIÓN borde-a-borde: caja .axn-boxed que ya lleva su propio p-0 (p.ej. el chat de messages.php) no debe
 * recibir el padding:1.25rem de arriba — dejaba un marco en blanco y descolocaba el solape con el bottom-nav. */
.axn-on main .card-unified.axn-boxed.p-0 { padding:0 !important; }

/* CONSTRUCTOR DE RUTINAS (editor de workouts): los bloques (.wk-block) NO se aplanan como el resto del
 * contenido clean — se ven como CAJA (borde 1px + radio, sin sombra) con BARRA IZQUIERDA de 4px del color del
 * TIPO de bloque (calentamiento/fuerza/acondicionamiento/enfriamiento…), para diferenciarlos con claridad. El
 * color lo fija el JS del editor en `--wk-accent` (= dotColor del tipo). Gana a la regla de aplanado por
 * especificidad (.wk-block.card-unified). El padding interno lo llevan la cabecera y la zona de ejercicios. */
.axn-on main .wk-block.card-unified {
  border:1px solid var(--axis-line) !important;
  border-left:4px solid var(--wk-accent, var(--axis-line)) !important;
  /* FONDO tenido por tipo de bloque. Antes era `hsl(var(--card))` fijo, y ese !important pisaba la clase
     de fondo suave que el JS ponia en la card: el editor perdia el color y solo quedaba la barra lateral,
     asi que un calentamiento y un AMRAP se veian igual de blancos. --wk-tint lo fija el JS con el MISMO
     color-mix que el resumen de sesion; si falta, cae al fondo de card de siempre. */
  border-radius:var(--r-card-lg) !important; background:var(--wk-tint, hsl(var(--card))) !important; box-shadow:none !important; padding:0 !important;
}
/* Separación entre bloques: Tailwind v4 implementa `space-y-*` con margin-BOTTOM, pero el aplanado de arriba
 * pone `margin-bottom:0 !important` en todo .card-unified y lo anula → las cajas quedaban pegadas. Se restaura
 * aquí (gana por especificidad). El último no lleva (lo separa el botón "Añadir bloque" con su margen). */
.axn-on main .wk-block.card-unified:not(:last-child) { margin-bottom:.75rem !important; }
/* MISMA causa en TODAS las cajas del clean: cualquier `.axn-boxed` apilada dentro de un contenedor `space-y-*`
 * (tarjetas de sesión del cliente, listas de cajas, etc.) quedaba pegada porque el aplanado anula el
 * margin-bottom que Tailwind v4 usa para el space-y. Se restaura aquí. Las cajas en GRID/FLEX (sin space-y) no
 * llevan space-y, así que este selector no las toca → no rompe las rejillas de Biblioteca. */
.axn-on main [class*="space-y-"] > .card-unified.axn-boxed:not(:last-child) { margin-bottom:.75rem !important; }
/* UNA CAJA CONSERVA EL MARGEN QUE PIDE EL MARCADO. El aplanado de arriba pone `margin-bottom:0 !important`
 * en TODO `.card-unified`, asi que se llevaba por delante cualquier `mb-*` del HTML. A una seccion APLANADA
 * no le hace falta -la separa su linea de 1px-, pero una CAJA sin aire queda pegada a lo siguiente: en el
 * editor de rutinas el bloque de musculos tocaba el primer bloque, sin un pixel de por medio.
 * Iban ya tres parches caso por caso; esto lo cierra por donde se pide, que es la clase. */
.axn-on main .axn-boxed.mb-1 { margin-bottom:.25rem !important; }
.axn-on main .axn-boxed.mb-2 { margin-bottom:.5rem !important; }
.axn-on main .axn-boxed.mb-3 { margin-bottom:.75rem !important; }
.axn-on main .axn-boxed.mb-4 { margin-bottom:1rem !important; }
.axn-on main .axn-boxed.mb-5 { margin-bottom:1.25rem !important; }
.axn-on main .axn-boxed.mb-6 { margin-bottom:1.5rem !important; }
.axn-on main .axn-boxed.mb-8 { margin-bottom:2rem !important; }

/* ── CAJA DE EJERCICIO UNIFICADA (`.axe-item`) — mismo marco visual en las 3 vistas de sesión (activa/runner,
 * pendiente y resumen); el contenido de la derecha (inputs, prescripción o resultado) cambia por vista.
 * Miniatura prominente + nombre + subtítulo + datos, con BARRA IZQUIERDA de color por ESTADO (verde=hecho,
 * gris=pendiente, azul=en curso), igual que las cards del calendario → identidad de producto coherente. */
.axe-item { display:flex; align-items:center; gap:12px; padding:10px 12px; border:1px solid var(--axis-line);
  border-left:3px solid var(--axe-st,var(--axis-line)); border-radius:var(--r-card); background:hsl(var(--card)); }
.axe-item + .axe-item { margin-top:8px; }
.axe-item .axe-thumb { width:48px; height:48px; flex-shrink:0; border-radius:var(--r-ctl) !important; object-fit:cover; }
.axe-item .axe-main { min-width:0; flex:1; }
.axe-item .axe-name { display:flex; align-items:center; gap:6px; min-width:0; font-size:14px; font-weight:600; color:var(--axis-ink); line-height:1.25; }
.axe-item .axe-name > span.axe-txt { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.axe-item .axe-sub { font-size:12px; color:var(--axis-muted); margin-top:1px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.axe-item .axe-meta { flex-shrink:0; margin-left:auto; text-align:right; font-size:13px; font-weight:500; color:var(--axis-ink); white-space:nowrap; }
.axe-item .axe-check { display:inline-flex; flex-shrink:0; align-items:center; justify-content:center; width:18px; height:18px; border-radius:50%; background:hsl(var(--success)); color:#fff; }
.axe-item.is-skip .axe-name { color:var(--axis-muted); }
.axe-item.is-skip .axe-name > span.axe-txt { text-decoration:line-through; }
/* Datos REALIZADOS como stats visuales (resumen): número destacado + unidad debajo, en pastilla suave.
 * Sustituye a la línea de texto apretada `.axe-meta` para que series/reps/peso/RIR se lean de un vistazo. */
.axe-item .axe-stats { display:flex; align-items:stretch; gap:6px; flex-shrink:0; margin-left:auto; }
.axe-item .axe-stat { display:flex; flex-direction:column; align-items:center; justify-content:center; min-width:44px; padding:4px 8px; border-radius:8px; background:var(--axis-soft); }
.axe-item .axe-stat b { font-size:13px; font-weight:700; line-height:1.1; color:var(--axis-ink); font-variant-numeric:tabular-nums; white-space:nowrap; }
.axe-item .axe-stat i { font-size:9px; font-style:normal; line-height:1.2; color:var(--axis-muted); margin-top:2px; white-space:nowrap; }
.axe-item.is-skip .axe-stat { background:transparent; border:1px solid var(--axis-line); }
.axe-item.is-skip .axe-stat b { color:var(--axis-muted); font-weight:600; }
@media (max-width:560px){
  .axe-item { flex-wrap:wrap; }
  .axe-item .axe-stats { width:100%; margin-left:60px; margin-top:8px; justify-content:flex-start; flex-wrap:wrap; }
}
/* ── CABECERA DE BLOQUE (`.axe-blk`) + CARD DE EJERCICIO ACORDEON (`.axe-x`) — replica de la referencia:
 * el bloque lleva numero + nombre + "N ejercicios" + barra de progreso + caret colapsable; cada ejercicio se
 * muestra COLAPSADO (miniatura pequena + resumen en linea) o EXPANDIDO (miniatura grande + 4 celdas
 * Series/Reps/Carga/Descanso + detalle por serie). El COLOR lo da el bloque; el ESTADO (verde=hecho) via --axe-st. */
.axe-blk { border:1px solid var(--axis-line); border-radius:var(--r-card); padding:10px 12px; }
.axe-blk + .axe-blk { margin-top:12px; }
.axe-blk-head { display:flex; align-items:center; gap:10px; cursor:pointer; user-select:none; }
.axe-blk-num { flex-shrink:0; display:inline-flex; align-items:center; justify-content:center; width:24px; height:24px; border-radius:50%; font-size:12px; font-weight:700; color:#fff; }
.axe-blk-name { min-width:0; margin-right:auto; font-size:14px; font-weight:600; color:var(--axis-ink); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.axe-blk-count { flex-shrink:0; font-size:12px; color:var(--axis-muted); white-space:nowrap; }
/* El CANAL de la barra se tiñe de TINTA translúcida, no de --axis-line. La línea es un gris claro pensado
   para fondo blanco: sobre el tinte de color del bloque (ámbar, rosa…) quedaba casi invisible y la barra
   no se leía. Con tinta al 10% el canal contrasta sobre cualquier tinte y en modo oscuro también. */
.axe-blk-bar { flex:0 1 130px; height:6px; min-width:44px; border-radius:999px; background:color-mix(in oklab,var(--axis-ink),transparent 90%); overflow:hidden; }
.axe-blk-bar > span { display:block; height:100%; border-radius:999px; background:hsl(var(--success)); transition:width .3s ease; }
.axe-blk-prog { flex-shrink:0; font-size:12px; font-weight:600; color:var(--axis-muted); font-variant-numeric:tabular-nums; white-space:nowrap; }
.axe-blk-caret { flex-shrink:0; color:var(--axis-muted); transition:transform .18s ease; }
.axe-blk.is-closed .axe-blk-caret { transform:rotate(-90deg); }
.axe-blk-body { margin-top:10px; }
.axe-blk.is-closed .axe-blk-body { display:none; }
.axe-blk-add { display:flex; align-items:center; justify-content:center; gap:6px; width:100%; margin-top:8px; padding:8px; border:1px dashed var(--axis-line); border-radius:var(--r-ctl); font-size:13px; font-weight:500; color:var(--axis-muted); background:transparent; }

.axe-x { border:1px solid var(--axis-line); border-left:3px solid var(--axe-st,var(--axis-line)); border-radius:var(--r-card); background:hsl(var(--card)); padding:9px 11px; }
.axe-x + .axe-x { margin-top:8px; }
.axe-x.axe-collapsible { cursor:pointer; }
.axe-x.is-done { background:color-mix(in oklab,hsl(var(--card)),hsl(var(--success)) 12%); }
.axe-x-head { display:flex; align-items:center; gap:11px; }
.axe-x .axe-x-thumb { width:46px; height:46px; flex-shrink:0; align-self:center; border-radius:var(--r-ctl) !important; object-fit:cover; transition:width .15s ease, height .15s ease; }
.axe-x.is-open .axe-x-head { align-items:stretch; }
.axe-x.is-open .axe-x-thumb { width:84px; height:auto; min-height:90px; align-self:stretch; }
.axe-x-body { flex:1; min-width:0; display:flex; flex-direction:column; gap:8px; }
.axe-x-titlerow { display:flex; align-items:center; gap:8px; min-width:0; }
.axe-x-name { min-width:0; font-size:15px; font-weight:600; color:var(--axis-ink); line-height:1.25; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.axe-x.is-open .axe-x-name { white-space:normal; overflow-wrap:anywhere; }
.axe-x.is-skip .axe-x-name { color:var(--axis-muted); text-decoration:line-through; }
.axe-x-tag { flex-shrink:0; padding:2px 9px; border-radius:999px; font-size:11px; font-weight:600; background:var(--axis-soft); color:var(--axis-muted); }
.axe-x.is-done .axe-x-tag { background:color-mix(in oklab,hsl(var(--success)) 14%,transparent); color:hsl(var(--success)); }
.axe-x-check { flex-shrink:0; margin-left:auto; display:inline-flex; align-items:center; justify-content:center; width:22px; height:22px; border-radius:50%; background:hsl(var(--success)); color:#fff; }
/* Resumen EN LINEA (solo colapsado), a la derecha del nombre. */
.axe-x-inline { margin-left:auto; flex-shrink:0; font-size:13px; font-weight:500; color:var(--axis-ink); font-variant-numeric:tabular-nums; white-space:nowrap; }
.axe-x.is-open .axe-x-inline { display:none; }
/* 4 CELDAS (Series/Reps/Carga/Descanso) — solo expandido. */
.axe-x-cells { display:none; gap:6px; }
.axe-x.is-open .axe-x-cells { display:grid; grid-template-columns:repeat(4,1fr); }
.axe-cell { display:flex; flex-direction:column; align-items:center; justify-content:center; gap:3px; padding:8px 4px; border-radius:8px; background:var(--axis-soft); text-align:center; }
.axe-x.is-done .axe-cell { background:color-mix(in oklab,hsl(var(--card)),hsl(var(--success)) 20%); }
.axe-cell b { font-size:15px; font-weight:700; line-height:1; color:var(--axis-ink); font-variant-numeric:tabular-nums; white-space:nowrap; }
.axe-cell i { font-size:10px; font-style:normal; line-height:1.1; color:var(--axis-muted); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:100%; }
/* Carets: ">" a la derecha (colapsado), "v" centrado abajo (expandido). */
.axe-x .axe-caret { flex-shrink:0; color:var(--axis-muted); transition:transform .18s ease; pointer-events:none; }
.axe-x .axe-caret-inline { align-self:center; }
.axe-x.is-open .axe-caret-inline { display:none; }
.axe-x .axe-caret-bottom { display:none; align-self:center; margin:8px auto 0; }
.axe-x.is-open .axe-caret-bottom { display:block; }
/* Desplegable de detalle por serie (tabla + meta + nota) — solo expandido y solo si hay datos ampliados. */
.axe-x .axe-detail { display:none; margin-top:12px; padding-top:12px; border-top:1px solid var(--axis-line); }
.axe-x.is-open .axe-detail { display:block; }
.axe-x .axe-x-alt { font-size:12px; font-weight:600; color:hsl(var(--primary)); margin-bottom:8px; }
.axe-x .axe-x-note { margin-top:10px; font-size:13px; font-style:italic; color:var(--axis-muted); white-space:pre-line; }
.axe-x .axe-sets { border-collapse:collapse; font-variant-numeric:tabular-nums; }
.axe-x .axe-sets th { padding:0 22px 6px 0; text-align:left; font-size:10px; font-weight:600; text-transform:uppercase; letter-spacing:.04em; color:var(--axis-muted); border-bottom:1px solid var(--axis-line); white-space:nowrap; }
.axe-x .axe-sets td { padding:7px 22px 7px 0; text-align:left; font-size:13px; color:var(--axis-ink); border-bottom:1px solid color-mix(in oklab,var(--axis-line),transparent 45%); white-space:nowrap; }
.axe-x .axe-sets tr:last-child td { border-bottom:0; }
.axe-x .axe-sets th:last-child, .axe-x .axe-sets td:last-child { padding-right:0; }
.axe-x .axe-sets .c-n { color:var(--axis-muted); font-weight:600; }
.axe-x .axe-detail-meta { display:flex; flex-wrap:wrap; gap:10px 24px; margin-top:12px; }
.axe-x .axe-detail-meta .m { display:flex; flex-direction:column; gap:2px; }
.axe-x .axe-detail-meta .k { font-size:10px; font-weight:600; text-transform:uppercase; letter-spacing:.04em; color:var(--axis-muted); }
.axe-x .axe-detail-meta .v { font-size:13px; color:var(--axis-ink); font-variant-numeric:tabular-nums; }
@media (max-width:560px){
  .axe-x.is-open .axe-x-thumb { width:64px; min-height:78px; }
  .axe-x-cells { gap:4px; }
  .axe-cell { padding:7px 3px; }
  .axe-cell b { font-size:14px; }
  .axe-cell i { font-size:9px; }
  .axe-x-inline { font-size:12px; }
  /* COLAPSADO en movil: el NOMBRE del ejercicio manda (se ve completo, puede envolver a 2 lineas); el grupo
     muscular se omite y el resumen (S x R · carga · descanso) baja a una 2a linea, para que nunca se aplaste el nombre. */
  .axe-x:not(.is-open) .axe-x-titlerow { flex-wrap:wrap; }
  .axe-x:not(.is-open) .axe-x-name { white-space:normal; }
  .axe-x:not(.is-open) .axe-x-tag { display:none; }
  .axe-x:not(.is-open) .axe-x-inline { order:3; flex-basis:100%; margin:3px 0 0; }
}
/* Variante COMPACTA para el PORTAL DEL CLIENTE (100% móvil): fila baja y horizontal, los datos a la DERECHA
 * EN LÍNEA (nunca a una 2ª fila → sin hueco blanco). Anula el flex-wrap móvil de arriba por especificidad. */
.axn-on .axe-item.axe-cli { padding:8px 10px; gap:10px; flex-wrap:nowrap; }
.axn-on .axe-item.axe-cli .axe-thumb { width:44px; height:44px; }
.axn-on .axe-item.axe-cli .axe-stats { width:auto; margin-left:auto; margin-top:0; flex-wrap:nowrap; gap:5px; }
.axn-on .axe-item.axe-cli .axe-stat { min-width:0; padding:3px 8px; }
.axn-on .axe-item.axe-cli .axe-stat b { font-size:12px; }
.axn-on .axe-item.axe-cli .axe-stat i { font-size:8px; }
/* Caja de ejercicio de SESIÓN del cliente — MISMA en resumen (pasada) y preview (futura) para COHERENCIA.
 * MANTIENE la CAJA con color de estado (border-left = --axe-st: verde realizado / neutro pendiente) dentro de
 * la estructura por bloques con color. Datos principales (series×reps · peso/tiempo) GRANDES y CENTRADOS
 * verticalmente a la derecha (.axe-lead); info secundaria (RIR/descanso/tempo/1RM) bajo el nombre (.axe-sub). */
.axn-on .axe-item.axe-sess { flex-wrap:nowrap; align-items:center; gap:11px; }
.axn-on .axe-item.axe-sess .axe-thumb { width:44px; height:44px; }
.axn-on .axe-item.axe-sess .axe-main { min-width:0; }
.axn-on .axe-item.axe-sess .axe-sub { white-space:normal; margin-top:2px; }
.axn-on .axe-item.axe-sess .axe-lead { flex-shrink:0; margin-left:auto; padding-left:12px; text-align:right; font-size:15px; font-weight:700; color:var(--axis-ink); white-space:nowrap; font-variant-numeric:tabular-nums; line-height:1.2; }
.axn-on .axe-item.axe-sess .axe-done { color:hsl(var(--success)); flex-shrink:0; }
/* Miniatura de ejercicio CUADRADA con bordes suaves (no redonda). El --radius-lg=16 del DS clean es
 * demasiado para miniaturas pequeñas (h-9/h-14) y las deja casi circulares → se fija a 10px en el runner. */
.axn-on #lv-body .overflow-hidden.rounded-lg,
.axn-on #lv-body img.rounded-lg,
.axn-on #lv-body span.rounded-lg { border-radius:10px !important; }
/* Caja de ejercicio en el RUNNER (mismo marco visual que `.axe-item` del resumen): borde + barra de estado a la
 * izquierda (verde=hecho, gris=pendiente). Solo pinta bordes en el contenedor swipe; NO toca el contenido, el
 * deslizamiento ni el arrastre. El radius (10px) lo hereda de la regla de arriba. Si el ejercicio tiene color
 * manual (has-hl → `border-l-4` de Tailwind), ese color manda en el borde izquierdo. */
.axn-on #lv-body .lv-swipe.axn-lvbox { border-top:1px solid var(--axis-line); border-right:1px solid var(--axis-line); border-bottom:1px solid var(--axis-line); }
.axn-on #lv-body .lv-swipe.axn-lvbox:not(.has-hl) { border-left:3px solid var(--axis-line); }
.axn-on #lv-body .lv-swipe.axn-lvbox:not(.has-hl).is-done { border-left-color:hsl(var(--success)); }
/* Barra de distribución (Analítica) al estilo de la referencia `.axis-segmented-bar`: segmentos SEPARADOS por un
 * hueco y con esquinas redondeadas, SIN pista de fondo continua. Solo cambia el ESTILO; conserva los colores
 * semánticos de cada segmento (verde=bueno, ámbar/rojo=alerta) y los tooltips `.ax-hit`. */
.axn-on .axn-segbar { gap:3px; background:transparent !important; overflow:visible !important; border-radius:0 !important; }
.axn-on .axn-segbar > div { border-radius:999px; }
/* Cabeceras de columna de listas/tablas (Biblioteca, Config…): texto normal, NO mayúsculas apretadas con
 * tracking (mismo criterio que las etiquetas de KPI). La referencia usa rótulos en minúscula normal. */
.axn-on .uppercase:is(.tracking-wide, .tracking-wider, .tracking-widest), .axn-on thead th { text-transform:none !important; letter-spacing:normal !important; }
/* Inputs / labels / celdas de tabla a 14px como la referencia (.axis-page input/label/select/th/td =
 * --type-secondary 0.875rem, line-height 1.25). En la demo había mezcla de 12-13-14px. */
.axn-on :is(input, select, textarea, label, th, td) { font-size:14px; line-height:1.25; }
/* El <h1> de página SIEMPRE con el estilo grande de la maqueta (DM Sans fluido 28→40px/600/-.035em),
 * aunque el módulo no use page_header() (p.ej. Comunidad servía h1.text-h4 = 15px). El h1 = título de página. */
.axn-on main h1 {
  font-family:'DM Sans', system-ui, sans-serif !important; font-size:clamp(28px, 1.6rem + 1.2vw, 40px) !important;
  font-weight:600 !important; letter-spacing:-.035em !important; line-height:1.12 !important; color:var(--axis-ink) !important;
}
/* Contenedor de página centrado (mx-auto max-w-*) como HIJO DIRECTO del shell de contenido: el shell es
 * flex-col, y `mx-auto` (márgenes laterales auto) sobre un hijo flex ANULA el stretch del eje transversal,
 * así que la columna encogía a su contenido (p.ej. Control Horario → 329px, media pantalla vacía). width:100%
 * la devuelve a su max-width previsto (centrada). Solo hijos directos: no toca elementos centrados dentro de
 * cards/modales. */
.axn-on .flex-1.flex-col.bg-card > .mx-auto[class*="max-w-"] { width:100%; }
/* Números de métrica de Analítica al tamaño de la ref (32px, .axis-metric-card strong). */
.axn-analytics .text-numeric { font-size:32px; line-height:1.15; letter-spacing:-.02em; }
/* Mini-cifras internas (dolor/bienestar/retención): número plano, sin caja redondeada ni borde. */
.axn-analytics .card-unified .rounded-xl.border { border:0 !important; border-radius:0 !important; padding-left:0 !important; padding-right:0 !important; }

/* ============================================================================
 * CALENDARIO clean — DÍAS en filas / HORAS en columnas (layout de la referencia).
 * Posición por CSS puro (left/width por hora, top por pista de solape); clic→detalle.
 * ==========================================================================*/
/* Barra de controles del calendario (Hoy · navegación de semana · Filtros · vista): PEGAJOSA arriba para
   cambiar de semana y de vista sin tener que subir. El scroll es el de la VENTANA (#main no scrollea a
   propósito), así que sticky funciona. Escritorio: sin cabecera fija (top:0). Móvil: bajo la barra superior. */
.cal-toolbar { position: sticky; top: 0; z-index: 20; background: hsl(var(--card)); padding-block: .55rem; margin-bottom: .55rem; }
@media (max-width: 1023.98px) { .cal-toolbar { top: calc(3rem + env(safe-area-inset-top)); } }
/* Barra de navegación inferior (móvil): MÁS OPACA que el liquid-glass genérico — con 0.85 el contenido de
   detrás se transparentaba y no se leía bien (feedback móvil). Mantiene el desenfoque, sube el fondo. */
.axn-navbar-solid { background: hsl(var(--surface) / 0.97) !important; }
html.dark .axn-navbar-solid { background: hsl(var(--surface-elevated) / 0.95) !important; }
.axcal-scroll { overflow-x:auto; padding-bottom:8px; scrollbar-color:#999 #f3f3f3; }
/* ARRASTRAR PARA DESPLAZAR: el cursor de mano es lo que hace descubrible el gesto — sin él nadie prueba
   a agarrar el tablero. Solo en puntero FINO (ratón/trackpad): en táctil el scroll ya es nativo y un
   cursor de agarre ahí no significa nada. Mientras se arrastra se corta la selección de texto, que si no
   el gesto pinta media rejilla en azul. */
@media (hover:hover) and (pointer:fine) {
  .axcal-scroll { cursor:grab; }
  .axcal-scroll.axcal-panning { cursor:grabbing; user-select:none; scroll-behavior:auto; }
  /* La sesión conserva su propio cursor: ahí el gesto es MOVER la sesión, no desplazar el tablero. */
  .axcal-scroll .axcal-booking { cursor:grab; }
}
.axcal-scroll::-webkit-scrollbar { height:10px; }
.axcal-scroll::-webkit-scrollbar-thumb { background:#bbb; border-radius:10px; }
.axcal-board { --date-col:128px; --hourw:210px; min-width:calc(var(--date-col) + var(--axcal-hours) * var(--hourw)); border-top:1px solid var(--axis-line); }
.axcal-heading, .axcal-day-row { display:grid; grid-template-columns:var(--date-col) minmax(0,1fr); }
.axcal-heading { border-bottom:1px solid var(--axis-border); }
/* LA FILA DE HORAS SE QUEDA A LA VISTA al bajar por la semana: sin ella, a partir de la tercera fila ya no
 * se sabe a que hora corresponde cada columna y hay que subir a mirar.
 *
 * No basta con poner sticky a .axcal-heading: .axcal-scroll tiene overflow-x:auto para el scroll horizontal
 * y el navegador convierte TAMBIEN el eje vertical en auto, asi que ese contenedor -y no la pagina- es el
 * que manda sobre el sticky de sus hijos. Mientras el tablero no tenga altura propia, no hay scroll interno
 * respecto al que pegarse y la cabecera se va con la pagina igual que antes.
 * Por eso se le da altura al tablero: pasa a tener su PROPIO scroll vertical y la fila de horas se pega a
 * su borde. Solo en escritorio: en movil el tablero se maneja de otra forma y un scroll dentro de otro es
 * incomodo justo donde menos sitio hay. */
@media (min-width:1024px) {
  .axcal-scroll { max-height:calc(100vh - var(--axcal-board-top, 13rem)); }
  .axcal-heading { position:sticky; top:0; z-index:6; background:hsl(var(--card)); }
  /* La esquina cruza los dos ejes (sticky left + este sticky top): necesita ir por encima de las horas. */
  .axcal-heading .axcal-corner { z-index:7; }
}
.axcal-corner { position:sticky; left:0; z-index:5; background:hsl(var(--card)); padding:.85rem .6rem; font-size:.72rem; color:var(--axis-muted); text-transform:uppercase; align-self:center; }
.axcal-hhours { display:grid; grid-template-columns:repeat(var(--axcal-hours),1fr); }
.axcal-hhours span { padding:.85rem .5rem; font-size:12px; color:var(--axis-muted); border-left:1px solid var(--axis-soft); }
.axcal-hhours span:first-child { border-left:0; }
.axcal-day-row { border-bottom:1px solid var(--axis-line); }
.axcal-day-row > header { position:sticky; left:0; z-index:3; background:hsl(var(--card)); padding:1.25rem .6rem; box-shadow:1px 0 0 var(--axis-line); }
.axcal-day-row > header > span { text-transform:capitalize; font-size:.8125rem; color:var(--axis-navy); display:block; }
.axcal-day-row > header > time { margin-top:.3rem; font-size:1.5rem; font-weight:600; color:var(--axis-navy); line-height:1; display:block; }
.axcal-day-row.today > header > time { display:inline-grid; place-items:center; width:2.2rem; height:2.2rem; border-radius:50%; background:var(--axis-navy); color:#fff; }
.axcal-day-row > header > small { margin-top:.25rem; color:var(--axis-muted); font-size:12px; display:block; }
.axcal-track { position:relative; min-height:190px; border-right:1px solid var(--axis-line); background-image:linear-gradient(to right, var(--axis-soft) 1px, transparent 1px); background-size:calc(100% / var(--axcal-hours)) 100%; }
.axcal-day-row.closed .axcal-track { background-color:var(--axis-surface); }
/* Altura por SOLAPE: --rows = nº de sesiones que coinciden en esa franja, --row = su posición. Sola (rows=1) →
 * ocupa el alto completo de la fila del día; si coincide, se reparte el alto (mitad si son 2, etc.). El FONDO lo
 * pinta $sbg (color entrenador); el BORDE IZQUIERDO lleva --st (color del ESTADO), el resto del borde = tono suave
 * del entrenador ($sbd, se respeta al NO fijar aquí border-color general). */
.axcal-booking { position:absolute; top:calc(var(--row,0) / var(--rows,1) * 100% + 6px); height:calc(100% / var(--rows,1) - 12px); width:calc(var(--bw) - 8px); box-sizing:border-box; border-width:1px; border-style:solid; border-left-width:3px; border-left-color:var(--st, var(--axis-line)); border-radius:var(--radius); padding:10px 13px; overflow:hidden; text-decoration:none; }
.axcal-booking time { font-size:12px; line-height:1.2; color:var(--axis-muted, #647169); display:block; }
.axcal-booking strong { margin-top:4px; font-size:14px; font-weight:600; line-height:1.2; letter-spacing:-.01em; color:var(--axis-ink, #202723); display:block; }
.axcal-booking .axcal-status { margin-top:6px; font-size:12px; line-height:1.2; font-weight:500; color:var(--st, var(--axis-muted)); display:block; }
.axcal-booking .axcal-details { display:grid; gap:4px; margin-top:9px; }
.axcal-booking .axcal-details span { display:flex; align-items:flex-start; gap:5px; font-size:12px; line-height:1.25; color:var(--axis-muted, #647169); }
.axcal-booking .axcal-details svg { flex-shrink:0; margin-top:1px; width:13px; height:13px; opacity:.7; }
.axcal-booking.is-cancel strong { text-decoration:line-through; opacity:.7; }
.axcal-empty { position:absolute; left:.8rem; top:1rem; font-size:.72rem; color:var(--axis-muted); }
/* Línea de la HORA ACTUAL (vertical) con punto arriba */
.axcal-now { position:absolute; top:0; bottom:0; width:2px; margin-left:-1px; background:var(--axis-danger); z-index:4; pointer-events:none; }
.axcal-now::before { content:""; position:absolute; top:-3px; left:-3px; width:8px; height:8px; border-radius:50%; background:var(--axis-danger); }
/* Drag horizontal de sesiones (staff con permiso) */
.axcal-board[data-can-drag="1"] .axcal-booking { cursor:grab; }
.axcal-booking.axcal-dragging { cursor:grabbing; opacity:.9; box-shadow:0 8px 24px rgba(32,39,35,.22); }
/* Sombra/placeholder del hueco destino durante el drag */
.axcal-ghost { position:absolute; top:12px; bottom:12px; border-radius:var(--r-card); border:2px dashed var(--axis-navy); background:rgba(32,39,35,.09); z-index:6; pointer-events:none; }
/* Asa de redimensionar (borde derecho de la celda) */
.axcal-board[data-can-drag="1"] .axcal-booking { position:absolute; }
.axcal-rz { position:absolute; top:0; right:0; width:9px; height:100%; cursor:ew-resize; z-index:3; }
.axcal-rz::after { content:""; position:absolute; top:50%; right:2px; transform:translateY(-50%); width:3px; height:26px; border-radius:2px; background:currentColor; opacity:0; transition:opacity .12s; }
.axcal-booking:hover .axcal-rz::after { opacity:.35; }
/* Track: cursor de "crear" en hueco vacío (staff con permiso) */
.axcal-board[data-can-drag="1"] .axcal-track { cursor:copy; }
.axcal-board[data-can-drag="1"] .axcal-booking { cursor:grab; }
/* Barra de navegación horizontal (flechas), como la referencia */
/* .axcal-navhint retirado: las flechas viven ahora en la barra sticky (.cal-toolbar). */
.axcal-navbtns { display:flex; gap:.4rem; }
.axcal-navbtn { display:inline-flex; align-items:center; justify-content:center; width:2.1rem; height:2.1rem; border:1px solid var(--axis-border); border-radius:var(--r-ctl); background:hsl(var(--card)); color:var(--axis-navy); cursor:pointer; }
.axcal-navbtn:hover { background:var(--axis-soft); }
.axcal-navbtn svg { width:1rem; height:1rem; }
/* A que altura se pegan el panel y el riel. El valor por defecto cubre el encabezado pegajoso del
 * calendario (titulo + barra de filtros, ~108px) MAS aire, para que se vea el rotulo "Calendario" y su
 * flecha y no queden debajo de la barra. calendar.js lo mide y lo afina, porque los filtros hacen wrap
 * y la barra crece en ventanas medianas; este valor es el que vale si ese JS no llega a correr. */
:root { --axcal-side-top: 7.5rem; }
/* Mini-calendario lateral COLAPSABLE (clean, a petición del usuario). Se oculta con .axcal-side-hidden en el
 * <body> (estado persistido en localStorage). El botón "Mini calendario" reaparece para volver a mostrarlo. */
/* El panel se queda FIJO en la columna izquierda: una semana cargada mide cientos de pixeles y al bajar
 * el mini-calendario se iba arriba, dejando la columna vacia (que es justo lo que se veia).
 * sticky y NO fixed a proposito: fixed lo sacaria del flujo, la columna perderia su hueco y el tablero se
 * correria a la izquierda ocupandolo — el mismo error que ya se cometio con el riel cuando flotaba.
 * align-self:flex-start es imprescindible: dentro de un flex los items se estiran a la altura del
 * contenedor por defecto, y un item tan alto como su contenedor nunca llega a pegarse. */
.axcal-side { width:15rem; flex-shrink:0; flex-direction:column; gap:.5rem;
  position:sticky; top:var(--axcal-side-top); align-self:flex-start;
  max-height:calc(100vh - var(--axcal-side-top) - 1rem); overflow-y:auto; }
.axcal-side-head { display:flex; align-items:center; justify-content:space-between; padding:0 .15rem; font-size:12px; font-weight:600; color:var(--axis-muted); }
.axcal-side-x, .axcal-side-show { display:inline-flex; align-items:center; gap:.4rem; border:1px solid var(--axis-border); border-radius:var(--r-ctl); background:hsl(var(--card)); color:var(--axis-navy); cursor:pointer; }
.axcal-side-x { width:1.7rem; height:1.7rem; justify-content:center; padding:0; }
.axcal-side-x:hover, .axcal-side-show:hover { background:var(--axis-soft); }
/* RIEL del mini-calendario colapsado: ocupa su hueco en el flex, a la izquierda del tablero. En flujo
   normal -no flotando-, asi que no puede solaparse con la barra sticky ni desplazar el titulo.
   MISMA UI que el boton de ocultar (.axcal-side-x): antes era un icono pelado sin borde ni fondo, asi que
   el mismo control se veia de dos maneras distintas segun estuviera abierto o cerrado. Mismo cuadrado,
   mismo borde, mismo radio y mismo hover. Y sticky, para que acompañe al panel al que sustituye. */
.axcal-side-rail { display:none; width:1.7rem; height:1.7rem; flex-shrink:0; align-items:center; justify-content:center;
  padding:0; border:1px solid var(--axis-border); border-radius:var(--r-ctl); background:hsl(var(--card));
  color:var(--axis-navy); cursor:pointer;
  position:sticky; top:var(--axcal-side-top); align-self:flex-start; }
.axcal-side-rail:hover { background:var(--axis-soft); }
body.axcal-side-hidden .axcal-side-rail { display:flex; }
@media (max-width:1023.98px) { .axcal-side-rail { display:none !important; } }
body.axcal-side-hidden .axcal-side { display:none !important; }
@media (max-width:1023.98px) { .axcal-side-show { display:none !important; } }
/* El mini-calendario usa .card-unified: en clean lo devolvemos a card compacta (el aplanado global lo dejaría plano). */
.axn-on .axcal-side .card-unified { border:1px solid var(--axis-line) !important; border-radius:var(--r-card) !important; background:hsl(var(--card)) !important; padding:.7rem !important; box-shadow:none !important; margin:0 !important; }
/* Estilo de card UNIFICADO en el resto de vistas del calendario (Día/Mes/Lista/agenda), coherente con Semana:
 * borde izquierdo por ESTADO (--st), hora en gris, sin sombra. El fondo y el resto del borde siguen siendo del
 * entrenador. Se aplica a las cards marcadas `.axn-ev` (mes-chip, lista-fila, agenda-fila, día-cal-event). */
.axn-on .axn-ev { border-left-color:var(--st, var(--axis-line)) !important; box-shadow:none !important; }
.axn-on .axn-ev-time { color:var(--axis-muted, #647169) !important; }
/* SELLADO DS · card de sesión: UN solo radio (token --radius) y UN solo ancho de borde izquierdo (3px) en TODAS
 * las vistas del calendario (Semana .axcal-booking + Día/Mes/Lista/agenda .axn-ev). Antes convivían 4/10/12px de
 * radio y 2/3/4px de borde; ahora es un único valor por concepto — se cambia aquí y propaga a todo. */
.axn-on .axcal-booking, .axn-on .axn-ev { border-radius:var(--radius) !important; border-left-width:3px !important; }
/* Clase grupal con plazas libres (.trs-lite): en el clean el color del ENTRENADOR debe VERSE (más suave que una
 * sesión normal, pero NO casi-blanco). El original (sat−20% · 96% luz) dejaba Álvaro (azul) y Marcos (morado)
 * casi idénticos; ahora sat−6% · 93% luz → color presente y distinguible, aún más claro que el normal (88%). */
.axn-on .trs.trs-lite { background:hsl(var(--h) calc(var(--sa) - 6%) 93%) !important; }

/* Barra de filtros del calendario = 2 desplegables (Equipo · Tipo de entreno) + resumen,
 * EXACTO a la referencia (.axis-filter-trigger h44/pad10-14/border1/radius8/font14, gap12). Sustituye
 * al panel lateral (mini-cal + chips). Server-side: cada opción es un <a> que hace toggle del CSV. */
.axcal-filterbar { display:flex; align-items:center; justify-content:space-between; gap:1rem; flex-wrap:wrap; margin-bottom:1.1rem; }
.axcal-filters { display:flex; gap:.75rem; flex-wrap:wrap; }
.axcal-filterinfo { font-size:14px; color:var(--axis-muted); }
.axn-filter { position:relative; }
.axn-filter > .axis-filter-trigger { display:inline-flex; align-items:center; gap:.75rem; height:2.75rem; padding:0 .875rem; border:1px solid var(--axis-border); border-radius:var(--r-ctl); background:hsl(var(--card)); color:var(--axis-ink); font-size:14px; font-weight:400; line-height:1; cursor:pointer; white-space:nowrap; list-style:none; user-select:none; }
.axn-filter > .axis-filter-trigger::-webkit-details-marker { display:none; }
.axn-filter > .axis-filter-trigger::marker { content:""; }
.axn-filter > .axis-filter-trigger:hover { background:var(--axis-soft); }
.axn-filter > .axis-filter-trigger > svg { width:1rem; height:1rem; opacity:.65; transition:transform .15s; }
.axn-filter[open] > .axis-filter-trigger > svg { transform:rotate(180deg); }
.axn-filter-count { display:inline-flex; align-items:center; justify-content:center; min-width:1.2rem; height:1.2rem; padding:0 .35rem; border-radius:999px; background:var(--axis-navy); color:#fff; font-size:.72rem; font-weight:600; }
.axn-filter-pop { position:absolute; top:calc(100% + .4rem); left:0; z-index:30; width:18rem; max-height:22rem; overflow-y:auto; display:flex; flex-direction:column; gap:.1rem; padding:.5rem; background:hsl(var(--card)); border:1px solid var(--axis-border); border-radius:var(--r-card); box-shadow:0 12px 32px rgba(32,39,35,.14); }
.axn-filter-opt { display:flex; align-items:center; gap:.6rem; padding:.5rem .55rem; border-radius:var(--r-ctl); font-size:14px; color:var(--axis-ink); cursor:pointer; }
.axn-filter-opt:hover { background:var(--axis-soft); }
.axn-filter-opt.is-on { font-weight:500; }
.axn-filter-check { display:inline-flex; align-items:center; justify-content:center; width:1.1rem; height:1.1rem; flex:none; border:1px solid var(--axis-border); border-radius:var(--r-ctl); color:#fff; }
.axn-filter-opt.is-on .axn-filter-check { background:var(--axis-navy); border-color:var(--axis-navy); }
.axn-filter-check svg { width:.8rem; height:.8rem; }
.axn-filter-dot { width:.6rem; height:.6rem; border-radius:50%; flex:none; }
.axn-filter-clear { margin-top:.2rem; padding:.55rem; border-top:1px solid var(--axis-line); font-size:14px; color:var(--axis-navy); font-weight:500; cursor:pointer; }
.axn-filter-clear:hover { text-decoration:underline; }
/* Móvil: el popover no debe salirse. El último desplegable (Tipo) ancla a la derecha; el único/primero (Equipo), a la izquierda. */
@media (max-width:640px) {
  .axn-filter-pop { width:min(18rem, calc(100vw - 1.5rem)); }
  .axcal-filters .axn-filter:last-child:not(:first-child) .axn-filter-pop { left:auto; right:0; }
}

/* ============================================================================
 * SISTEMA DE BOTONES / CTA — jerarquía ÚNICA (carril clean). Para no tener "20
 * CTA distintos": un solo radio + 4 variantes claras. Axis está tokenizado, así
 * que basta reconducir las clases base .btn/.btn-outline/.btn-ghost. Se CONSERVA
 * el morado de Axis Intelligence (gradiente = marca) y el rojo semántico (peligro).
 * ==========================================================================*/
.btn, .btn-lg, .icon-btn { border-radius:var(--r-ctl); }   /* 9.6px medido en la referencia */
.btn-sm, .btn-xs { border-radius:var(--r-ctl); }            /* 6.4px pequeños */
/* PRIMARIO = navy sólido (acción principal). Excluye outline/ghost/gradiente/rojo/ámbar. */
.btn:not(.btn-outline):not(.btn-ghost):not(.btn-destructive):not([class*="gradient"]):not([class*="rose"]):not([class*="red"]):not([class*="amber"]):not([class*="emerald"]) { background:var(--axis-navy); color:#fff; border:1px solid var(--axis-navy); box-shadow:none; }
.btn:not(.btn-outline):not(.btn-ghost):not(.btn-destructive):not([class*="gradient"]):not([class*="rose"]):not([class*="red"]):not([class*="amber"]):not([class*="emerald"]):hover { background:hsl(var(--primary-hover)); border-color:hsl(var(--primary-hover)); }
/* SECUNDARIO = outline suave */
.btn-outline { background:hsl(var(--card)); border:1px solid var(--axis-border); color:var(--axis-navy); box-shadow:none; }
.btn-outline:hover { background:var(--axis-soft); border-color:var(--axis-border); color:var(--axis-navy); }
/* TERCIARIO = ghost (texto) */
.btn-ghost { background:0 0; border-color:transparent; color:var(--axis-muted); box-shadow:none; }
.btn-ghost:hover { background:var(--axis-soft); color:var(--axis-navy); }
/* PELIGRO = rojo semantico. Vive aqui y no solo en style.css porque el primario de arriba se aplica con
 * cinco :not() y gana por especificidad a un `.btn-destructive` suelto: el boton de "vas a cerrar algo en
 * curso" y el de fichar salida salian navy, no rojos. Se excluye ARRIBA y se re-pinta aqui. */
.btn-destructive { background:hsl(var(--destructive)); border:1px solid hsl(var(--destructive)); color:hsl(var(--destructive-foreground)); box-shadow:none; }
.btn-destructive:hover { background:hsl(var(--destructive) / .88); border-color:hsl(var(--destructive) / .88); color:hsl(var(--destructive-foreground)); }
/* Botón de icono unificado */
.icon-btn { color:var(--axis-muted); }
.icon-btn:hover { background:var(--axis-soft); color:var(--axis-navy); }

/* ============================================================================
 * PERFIL / DATOS DEL CLIENTE (clean) — patrón medido EN VIVO en la referencia:
 * secciones ABIERTAS (sin card) separadas por una línea de 1px, títulos H2 de
 * 24px, filas label-valor (dt gris a la izq · dd negrita a la der) e inputs
 * suaves. Clases reutilizables → se reaprovechan en el resto de la ficha (F2).
 *   H2 24/600 -.035em #202723 · sección border-top #e5ebe7 + pt32 · stack gap40
 *   fila kv: flex space-between, pb12, línea #f0f4f1 · input #f6f9f7/#e5ebe7 r12 h32
 * ==========================================================================*/
.axn-profile { display:grid; gap:40px; }
/* Sección apilada: línea superior + aire. La 1ª (título de página, 2 columnas) NO lleva .axn-sec. */
.axn-sec { border-top:1px solid var(--axis-line); padding-top:32px; }
/* Cabecera de sección: título (+ subtítulo) a la izquierda, acción a la derecha. */
.axn-sec-head { display:flex; justify-content:space-between; align-items:flex-start; gap:16px; margin-bottom:24px; }
.axn-sec-title { margin:0; font-size:24px; font-weight:600; letter-spacing:-.035em; line-height:1.15; color:var(--axis-ink); }
.axn-sec-sub { margin:8px 0 0; font-size:16px; font-weight:400; line-height:1.4; color:var(--axis-muted); }
.axn-sec-head .axn-sec-sub { margin-top:6px; }
/* Dos columnas (Contacto · Datos personales); colapsa a 1 en móvil. */
.axn-two-col { display:grid; grid-template-columns:1fr 1fr; gap:28px 48px; }
.axn-info-card { min-width:0; }
.axn-info-card > .axn-sec-title { margin:0 0 20px; }
/* Filas label-valor. */
.axn-kv { display:grid; gap:12px; margin:0; }
.axn-kv > div { display:flex; justify-content:space-between; align-items:baseline; gap:20px; padding-bottom:12px; border-bottom:1px solid var(--axis-soft); }
.axn-kv > div:last-child { border-bottom:0; padding-bottom:0; }
.axn-kv dt { margin:0; font-size:14px; font-weight:400; color:var(--axis-muted); }
.axn-kv dd { margin:0; font-size:14px; font-weight:600; color:var(--axis-ink); text-align:right; min-width:0; }
.axn-kv dd .axn-kv-note { font-weight:400; color:var(--axis-muted); font-size:12px; }
/* Rejilla de formulario (2 col) + campo (label apilado sobre input). */
.axn-form-grid { display:grid; grid-template-columns:1fr 1fr; gap:20px 48px; }
.axn-form-grid .is-wide { grid-column:1 / -1; }
.axn-field { display:grid; gap:8px; margin:0; align-content:start; font-size:14px; font-weight:400; color:var(--axis-muted); }
.axn-field > .field-label, .axn-field > span:first-child { display:block; font-size:14px; font-weight:400; text-transform:none; letter-spacing:normal; color:var(--axis-muted); margin:0; }
/* Input suave estilo referencia (fondo #f6f9f7, borde #e5ebe7, radio 12, alto 32, 14px). */
.axn-in { height:32px; width:100%; min-width:0; background:var(--axis-surface); border:1px solid var(--axis-line); border-radius:var(--r-ctl); padding:4px 10px; font-size:14px; line-height:1.5; color:var(--axis-ink); outline:none; transition:border-color .12s, box-shadow .12s; }
textarea.axn-in { height:auto; min-height:64px; padding:8px 10px; resize:vertical; }
.axn-in:focus { border-color:var(--axis-green-ink); box-shadow:0 0 0 3px rgba(49,92,68,.12); }
.axn-in::placeholder { color:var(--axis-muted); }
select.axn-in { appearance:none; -webkit-appearance:none; padding-right:30px; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23647169' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 10px center; }
/* Insights de onboarding (icono + rótulo + valor + apostilla), 2 col. */
.axn-insights { display:grid; grid-template-columns:1fr 1fr; gap:28px 48px; }
.axn-insight { display:flex; align-items:center; gap:11px; min-width:0; }
.axn-insight > svg { flex-shrink:0; width:20px; height:20px; }
.axn-insight > div { min-width:0; }
.axn-insight-eyebrow { display:block; font-size:10px; font-weight:400; text-transform:uppercase; letter-spacing:.04em; color:var(--axis-muted); }
.axn-insight strong { display:block; font-size:13px; font-weight:600; color:var(--axis-ink); }
.axn-insight small { display:block; font-size:14px; font-weight:400; color:var(--axis-muted); }
.axn-insight--warn > svg { color:#d9822b; }
.axn-insight--goal > svg { color:var(--axis-green-ink); }
/* Lista PAR-Q+ (pregunta a la izq, toggle No/Sí a la der). */
.axn-parq > div { display:flex; justify-content:space-between; align-items:center; gap:20px; padding:16px 0; border-bottom:1px solid var(--axis-line); }
.axn-parq-q { font-size:14px; color:var(--axis-ink); min-width:0; margin:0; }
.axn-parq-toggle { display:flex; gap:8px; flex-shrink:0; }
.axn-parq-toggle label { cursor:pointer; height:26px; display:inline-flex; align-items:center; padding:0 12px; border-radius:999px; font-size:14px; font-weight:400; border:1px solid var(--axis-muted); color:var(--axis-muted); background:transparent; transition:background .12s, color .12s, border-color .12s; }
.axn-parq-toggle label.is-on { background:var(--axis-ink); border-color:var(--axis-ink); color:#fff; }
/* Botón secundario "Compartir onboarding" a medida de la referencia (blanco, borde tenue, r10, h28). */
.axn-btn-soft { display:inline-flex; align-items:center; gap:.4rem; height:28px; padding:0 10px; border-radius:var(--r-ctl); border:1px solid var(--axis-soft); background:hsl(var(--card)); color:var(--axis-ink); font-size:14px; font-weight:400; white-space:nowrap; transition:background .12s, border-color .12s; }
.axn-btn-soft:hover { background:var(--axis-surface); border-color:var(--axis-line); }
.axn-btn-soft svg { width:16px; height:16px; }
/* El diálogo "Compartir onboarding" es un overlay: conserva su CAJA (escapa del aplanado .axn-content .card-unified). */
.axn-content #ob-share .card-unified { border:1px solid var(--axis-line) !important; border-radius:var(--r-card-lg) !important; background:hsl(var(--card)) !important; padding:1.25rem !important; }
/* La <form> del onboarding usa display:contents para que sus <section> sean hijas directas del grid .axn-profile. */
.axn-form-contents { display:contents; }
/* Móvil: dos-columnas, form-grid e insights a 1 columna (sin scroll horizontal). */
@media (max-width:767px) {
  .axn-two-col, .axn-form-grid, .axn-insights { grid-template-columns:1fr; }
  .axn-profile { gap:28px; }
  .axn-sec { padding-top:24px; }
  .axn-sec-title, .axn-info-card > .axn-sec-title { font-size:20px; }
}

/* ══ MODO OSCURO · valores hardcodeados del carril clean ════════════════════════════════════════════
 * Complementa la variante .dark de axui-tokens.css (que ya cubre todos los tokens de color). Aqui
 * caen los colores escritos a mano que no salían de un token. Los `background:#fff` de superficie ya se
 * migraron a hsl(var(--card)) (idéntico en claro, oscuro en dark → responden solos). Quedan: los 4 tokens
 * --axn-* propios, las cards "soft" de aviso, el texto que iba en blanco SOBRE un fondo tinta (ahora claro)
 * y los hover/acentos translúcidos. Solo aplica al carril clean (este archivo solo carga con design_new). */
html.dark {
  --axn-bg: hsl(var(--card));
  --axn-mint-strong: #1e3a2a;
  --axn-warn-bg: #3a2e18;
  --axn-warn-ink: #f0c079;
}
/* Cards de aviso ámbar/rojo: del pálido claro al soft OSCURO del token (que ya tiene variante dark en
 * style.css). Prefijo html.dark body.axn-on para ganar a las reglas base (!important + 4 clases). */
html.dark body.axn-on .card-unified.bg-warning-soft,
html.dark .ax-sheet .card-unified.bg-warning-soft { background: hsl(var(--warning-soft)) !important; border-color: hsl(var(--warning) / .32) !important; }
html.dark body.axn-on .card-unified.bg-destructive-soft,
html.dark .ax-sheet .card-unified.bg-destructive-soft { background: hsl(var(--destructive-soft)) !important; border-color: hsl(var(--destructive) / .32) !important; }
/* Texto que iba en BLANCO sobre un fondo tinta/navy (que en oscuro es CLARO) → se re-tinta a oscuro para
 * conservar el contraste (botón/badge claro con texto oscuro, como el resto del dark). Los fondos de estado
 * (rojo del badge, verde del check) NO están aquí: su texto blanco sigue correcto sobre su color. */
html.dark .axn-btn:not(.axn-btn--ghost),
html.dark .btn:not(.btn-outline):not(.btn-ghost):not(.btn-destructive):not([class*="gradient"]):not([class*="rose"]):not([class*="red"]):not([class*="amber"]):not([class*="emerald"]),
html.dark .axn-filter-count,
html.dark .axcal-day-row.today > header > time,
html.dark .axn-parq-toggle label.is-on { color: hsl(var(--primary-foreground)) !important; }
/* Marca de check del filtro (iba #fff sobre relleno navy, ahora claro): tinta oscura. */
html.dark .axn-filter-opt.is-on .axn-filter-check { color: hsl(var(--primary-foreground)); }
/* Hover translúcido del menú lateral: en claro es tinta al 5%; en oscuro, blanco tenue. */
html.dark .axn-side-item:hover,
html.dark .axn-side-caretbtn:hover,
html.dark .axn-side-row:hover,
html.dark .axn-side-sub a:hover,
html.dark .axn-side-user:hover { background: rgba(255, 255, 255, .06); }
/* Botones de acción de la ficha del cliente (verde muy claro sólido) → verde translúcido sobre oscuro. */
html.dark .axis-client-controls .axis-btn:hover,
html.dark .axis-client-controls .btn:hover { background: rgba(52, 211, 153, .14); }
html.dark .axis-client-controls .axis-new-client { background: rgba(52, 211, 153, .16); }
/* Texto del objetivo del cliente escrito a mano (#3a4640) → muted del token. */
html.dark .axis-client-goal p { color: hsl(var(--muted-foreground)); }
/* Barra de scroll del calendario: apagada en oscuro. */
html.dark .axcal-scroll { scrollbar-color: #4a4f4c #1b211d; }
html.dark .axcal-scroll::-webkit-scrollbar-thumb { background: #3a3f3c; }

/* ══ COMPACTACION DE ESCALA (zoom-out SIN `zoom`) ════════════════════════════════════════════════════
 * El clean se veia un pelin grande. Reducimos ~10% los TITULOS y numeros grandes + el aire entre
 * secciones, SIN tocar ninguna ALTURA (por eso el sidebar fijo y los menus con scroll NO se cortan, a
 * diferencia de `zoom`, que si lo hacia). Va al final del archivo para ganar en cascada a los font-size
 * de arriba; las media queries re-declaran los valores moviles ya reducidos para no romper el responsive. */
:root { --axn-inset:28px; --axn-gap:2.15rem; }
.axn-h1 { font-size:36px; }
.axn-h2, .axn-sec-title { font-size:22px; }
.axn-title { font-size:17px; }
.axn-kpi-val, .axn-analytics .text-numeric { font-size:29px; }
.axn-score-val { font-size:18px; }
.axis-clients-h1, .axis-client-breadcrumb { font-size:36px; }
.axn-on .axn-set-groups > h2 { font-size:20px !important; }
@media (max-width:1023px) {
  .axis-clients-h1, .axis-client-breadcrumb { font-size:27px; }
}
@media (max-width:767px) {
  .axn-sec-title, .axn-info-card > .axn-sec-title { font-size:18px; }
  /* Tiras de KPI (.axn-fkpis) en movil: con 3-4 columnas en 390px cada celda baja de ~110px y un valor
     con unidad ("45 min", "73,2 kg") desborda a 29px. Se reduce el NUMERO y se deja que el rotulo parta
     de linea; asi la tira nunca provoca scroll horizontal, que es innegociable. */
  .axn-fkpis .axn-kpi-val { font-size:23px; }
  .axn-fkpis .axn-kpi-val small { font-size:.8rem; }
  .axn-fkpis .axn-kpi-ic { width:1.6rem; height:1.6rem; }
  .axn-fkpis .axn-kpi-ic svg { width:1.5rem; height:1.5rem; }
  .axn-fkpis .axn-kpi-val { margin-top:.7rem; }
  .axn-fkpis .axn-kpi-label { margin-top:.45rem; font-size:.8125rem; }
}
