:root{
    --bg: #0f1013;
    --bg-panel: #16181c;
    --bg-panel-2: #1c1f24;
    --line: #2c2f36;
    --text: #ececec;
    --text-dim: #9a9fa8;
    --accent: #c98a3e;
    --accent-soft: #4a3a24;
    --ok: #5bab6f;
    --ok-soft: #22301f;
    --warn: #c9573e;
    --warn-soft: #331f1a;
    --danger: #e5484d;
    --info: #5b8fab;
    --info-soft: #1f2a30;
    --radius: 12px;
    /* Paleta automática para diferenciar servicios visualmente (franja de
       turno-compacto). Placeholder hasta que cada servicio tenga su color
       propio editable en Servicios. */
    --serv-1: #c98a3e;
    --serv-2: #5b8fab;
    --serv-3: #5bab6f;
    --serv-4: #a35bc9;
    --serv-5: #c95b8f;
    --serv-6: #4fb3a8;
    --serv-7: #c9573e;
    --serv-8: #8f9ec9;
    /* Zona segura (notch / isla dinámica / barra de estado), para que el
       menú flotante (abrirMenuFlotante en app.js) NO se posicione encima
       de esa área cuando lo pega arriba/abajo de todo — igual que ya
       respeta el resto de la app con env(safe-area-inset-*) en CSS, pero
       ese menú calcula su posición en JS y necesita leer el valor ahí. */
    --safe-top: env(safe-area-inset-top, 0px);
    --safe-bottom: env(safe-area-inset-bottom, 0px);
    /* Ancho máximo del contenido (.wrap, header, tabs, páginas tipo Notas).
       En celular no hace nada (la pantalla ya es angosta), pero en compu es
       lo que evita que la app quede como una tira angosta perdida en el
       medio de la pantalla: se agranda en el media query de "pantallas
       grandes" de acá abajo, sin tener que repetir el número en cada regla
       que lo usa. */
    --wrap-max: 720px;
    /* Ancho de la sidebar de navegación en compu (reemplaza la barra de
       tabs de abajo — ver el media query de "Nav en compu" junto a
       .tabs más abajo). En celular no se usa para nada. */
    --sidebar-w: 220px;
    font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
  }

  /* Modo claro. Se activa poniendo data-theme="light" en <html> (ver app.js,
     función aplicarTema). Los nombres de las variables son los mismos que en
     :root de arriba, así que el resto del CSS no necesita ningún cambio. */
  html[data-theme="light"]{
    --bg: #f2efe9;
    --bg-panel: #ffffff;
    --bg-panel-2: #f7f4ee;
    --line: #ddd7c9;
    --text: #201d17;
    --text-dim: #6f6a5f;
    --accent: #a8701f;
    --accent-soft: #f2e0bd;
    --ok: #2f8f4e;
    --ok-soft: #e0f1e4;
    --warn: #b34a34;
    --warn-soft: #fae2d9;
    --danger: #c93a3f;
    --info: #366f8c;
    --info-soft: #e0edf4;
  }

  * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
  html{ -webkit-text-size-adjust: 100%; }

  body{
    margin:0;
    background: var(--bg);
    color: var(--text);
    min-height:100vh;
    padding: env(safe-area-inset-top) 12px calc(92px + env(safe-area-inset-bottom));
    font-size: 16px;
    -webkit-user-select: none;
    user-select: none;
    -webkit-touch-callout: none;
  }

  /* Los textos de la app no se pueden seleccionar/copiar, salvo los números
     y montos (precios, totales, cantidades) y lo que el usuario escribe. */
  input, textarea, [contenteditable="true"]{
    -webkit-user-select: text;
    user-select: text;
    -webkit-touch-callout: default;
  }
  .num, .detalle, .monto, .precio, .cant,
  .info-chip.precio-chip, .income-entry-amount,
  .cliente-sug-meta, .sel-sug-meta{
    -webkit-user-select: text;
    user-select: text;
    -webkit-touch-callout: default;
  }

  .wrap{ max-width: var(--wrap-max); margin: 0 auto; }

  /* ---- Responsive para pantallas grandes (tablet apaisada / compu) ----
     Todo lo de arriba (y el resto del archivo) está pensado para celular y
     se deja intacto: en una pantalla angosta este media query no hace nada.
     A partir de 860px de ancho, el contenido (.wrap, header, tabs, hoja de
     acciones rápidas, páginas tipo Notas/Clientes) pasa de 720px a un ancho
     más cómodo para compu, cambiando solo la variable --wrap-max (ver
     :root) en vez de repetir el número en cada regla. */
  @media (min-width: 860px){
    :root{ --wrap-max: 900px; }
    /* Este padding-left le hace lugar en el body a la sidebar fija
       (.tabs). Pero .tabs vive fuera de #appContenido, así que si no hay
       sesión (pantalla de login/carga) queda oculta con la clase .oculto
       a mano desde supabase-client.js — y en ese caso NO hay que reservarle
       espacio: sin este :has(), el padding quedaba puesto igual, el login
       se centraba dentro de esa caja corrida hacia la derecha, y en la
       pantalla real se veía descentrado hacia un costado. */
    body:has(.tabs:not(.oculto)){ padding: 24px 24px 24px calc(var(--sidebar-w) + 24px); }
  }

  header{
    display:flex;
    flex-direction: column;
    gap: 10px;
    padding: calc(16px + env(safe-area-inset-top)) 12px 14px;
    position: sticky;
    top: 0;
    z-index: 40;
    background: var(--bg);
    margin: 0 -12px;
    border-bottom: 1px solid var(--line);
  }
  .header-top-row{ display:flex; align-items:center; justify-content:space-between; gap:10px; }
  .header-brand{ display:flex; align-items:center; gap:10px; min-width:0; }
  /* Botón invisible que envuelve el h1: clickear el título/logo del header
     lleva a Inicio (mismo comportamiento en cualquier pestaña). Sin fondo,
     sin borde, sin padding propio — visualmente sigue siendo el título de
     siempre, solo que ahora es clickeable. */
  .header-titulo-btn{
    border:none; background:transparent; padding:0; margin:0; min-height:auto;
    display:flex; align-items:center; min-width:0; text-align:left;
    color: var(--text);
    transition: opacity 0.15s ease;
  }
  .header-titulo-btn:active{ opacity:0.6; }
  header h1{ font-size: 1.15rem; margin:0; letter-spacing: 0.3px; font-weight: 700; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  header h1 .accent-mark{ color: var(--accent); }
  header h1 .header-version{ font-size: 0.62rem; font-weight: 500; color: var(--text-dim); letter-spacing: 0; margin-left: 6px; vertical-align: middle; }
  .header-saludo-row{ display:none; flex-direction:column; gap:2px; }
  /* La fila de saludo + fecha ahora es exclusiva de Inicio (2.2): en el resto
     de las pestañas el header global se mantiene fijo pero sin esta fila. */
  .wrap:has(#tab-inicio.active) .header-saludo-row{ display:flex; }
  .header-saludo{ font-size: 1.02rem; font-weight: 700; color: var(--text); }
  header .today{ color: var(--text-dim); font-size: 0.8rem; text-transform: capitalize; }

  /* ---- Botón de menú (hamburguesa) y notas en el header ---- */
  .hamburguesa-btn{
    width:32px; height:32px; min-height:auto; padding:0; border:none; background:transparent;
    color: var(--text); display:flex; align-items:center; justify-content:center; flex-shrink:0;
  }
  .hamburguesa-btn svg{ width:22px; height:22px; stroke:currentColor; fill:none; stroke-width:1.8; stroke-linecap:round; }
  .hamburguesa-btn:active{ color: var(--accent); }
  .header-actions{ display:flex; align-items:center; gap:8px; flex-shrink:0; }
  .notas-btn{
    position:relative; width:36px; height:36px; min-height:auto; padding:0; border-radius:50%;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
  }
  .notas-btn svg{ width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
  .notas-btn:active{ color: var(--accent); border-color: var(--accent); }
  .notas-badge{
    position:absolute; top:-4px; right:-4px; min-width:16px; height:16px; padding:0 4px;
    border-radius:8px; background: var(--accent); color:#16181c; font-size:0.62rem; font-weight:800;
    display:flex; align-items:center; justify-content:center; line-height:1;
  }

  /* ---- Tabs (bottom nav bar) ---- */
  .tabs{
    display:flex;
    position: fixed;
    left: 0; right: 0; bottom: 0;
    background: var(--bg-panel);
    border-top: 1px solid var(--line);
    padding: 6px 4px calc(6px + env(safe-area-inset-bottom));
    z-index: 30;
    max-width: var(--wrap-max);
    margin: 0 auto;
    box-shadow: 0 -4px 16px rgba(0,0,0,0.25);
  }
  .tab-btn{
    flex: 1 1 0;
    min-width: 58px;
    display:flex;
    flex-direction: column;
    align-items:center;
    justify-content:center;
    gap: 3px;
    background: transparent;
    border: none;
    color: var(--text-dim);
    padding: 6px 2px;
    border-radius: 10px;
    font-size: 0.62rem;
    font-weight: 600;
    line-height: 1.1;
    min-height: 50px;
  }
  .tab-btn svg{ width: 21px; height: 21px; stroke: currentColor; fill: none; stroke-width: 1.8; }
  .tab-btn span{ white-space: nowrap; }
  .tab-btn.active{
    color: var(--accent);
  }
  .tab-btn.active svg{ stroke-width: 2.1; }

  /* ---- Nav inferior: botón "+" central elevado (1.5) ---- */
  .tab-fab-wrap{
    flex: 1 1 0;
    min-width: 58px;
    display:flex;
    align-items:flex-start;
    justify-content:center;
  }
  .tab-fab{
    width: 52px; height: 52px;
    margin-top: -26px;
    border-radius: 50%;
    background: linear-gradient(155deg, #e0a55c, var(--accent) 65%);
    color: #16181c;
    display:flex; align-items:center; justify-content:center;
    border: 3px solid var(--bg-panel);
    box-shadow: 0 6px 16px rgba(201,138,62,0.45), 0 2px 4px rgba(0,0,0,0.3);
    flex-shrink:0;
    transition: transform 0.2s ease;
  }
  .tab-fab svg{ width: 24px; height: 24px; stroke: currentColor; fill:none; stroke-width: 2.4; stroke-linecap:round; transition: transform 0.2s ease; }
  .tab-fab:active{ transform: scale(0.94); }
  .tab-fab.abierto svg{ transform: rotate(45deg); }

  /* ---- Nav en compu (2.1.0): lista de "Más" desplegada + perfil anclado
     abajo — ocultos acá por default (celular), se muestran y se stylean
     recién adentro del @media 860px de acá abajo. ---- */
  .sidebar-mas-lista{ display:none; }
  .sidebar-perfil-footer{ display:none; }

  /* ---- Nav en compu: la misma barra de abajo pasa a ser una sidebar fija
     a la izquierda ----
     Ojo: no se toca nada de HTML ni de JS acá — son los mismos botones
     .tab-btn con los mismos data-tab de siempre, y el mismo #navFabAgregar
     de siempre. El clic, la pestaña activa y el sheet de acciones rápidas
     siguen funcionando exactamente igual; esto solo les cambia la pinta y
     la posición en pantallas grandes. En celular esta sección no se lee
     (vive en el media query de compu), así que la barra de abajo sigue
     exactamente igual que siempre. */
  @media (min-width: 860px){
    .tabs{
      left: 0; right: auto; top: 0; bottom: 0;
      width: var(--sidebar-w);
      max-width: none;
      margin: 0;
      flex-direction: column;
      align-items: stretch;
      justify-content: flex-start;
      gap: 4px;
      padding: 24px 12px;
      border-top: none;
      border-right: 1px solid var(--line);
      box-shadow: none;
    }
    .tab-btn{
      flex: none;
      flex-direction: row;
      justify-content: flex-start;
      gap: 12px;
      min-height: 44px;
      padding: 10px 12px;
      font-size: 0.85rem;
      border-radius: 9px;
    }
    .tab-btn:hover{ background: var(--bg-panel-2); }
    .tab-btn.active{ background: var(--accent-soft); }
    .tab-btn svg{ width: 20px; height: 20px; }

    /* En compu no hace falta un botón "+" en la nav: no queda bien como
       ítem de sidebar y las pantallas ya tienen sus propios botones de
       agregar (turno, venta, servicio, etc.). Se oculta entero, la
       navegación queda con Inicio / Turnos / Ventas nomás arriba, y la
       lista de "Más" desplegada abajo (ver más abajo). */
    .tab-fab-wrap{ display: none; }

    /* El menú hamburguesa (versión celular del "Más") ya no hace falta:
       en compu ya no hay nada escondido detrás de un botón "Más" — su
       contenido queda siempre desplegado en la sidebar (ver más abajo). */
    .hamburguesa-btn{ display: none; }

    /* 2.1.0 — "Más" deja de existir como botón propio: se oculta (su
       contenido se despliega abajo, en #sidebarMasLista). */
    .tab-btn[data-tab="config"]{ display: none; }

    /* Inicio / Turnos / Ventas son la navegación principal de la sidebar:
       resaltan un poco más que la lista secundaria de abajo (antes escondida
       detrás de "Más"). */
    .tab-btn[data-tab="inicio"],
    .tab-btn[data-tab="historial"],
    .tab-btn[data-tab="ventas"]{
      font-size: 0.9rem;
      font-weight: 800;
      min-height: 48px;
    }
    .tab-btn[data-tab="inicio"] svg,
    .tab-btn[data-tab="historial"] svg,
    .tab-btn[data-tab="ventas"] svg{ width: 21px; height: 21px; }

    /* Lista secundaria (antes "Más"): mismo #masLista de siempre, movido
       para acá por app.js según el ancho de pantalla (ver
       acomodarMasSegunAncho) — no se duplica nada, los ids/listeners de
       cada ítem siguen siendo los mismos que en celular. Separada de la
       nav principal con un filete arriba, y con menos aire que la tarjeta
       grande de celular para que entre cómoda en la sidebar angosta. */
    .sidebar-mas-lista{
      display:flex; flex-direction:column;
      margin-top: 8px; padding-top: 12px;
      border-top: 1px solid var(--line);
      gap: 2px;
    }
    .sidebar-mas-lista .mas-lista{ display:flex; flex-direction:column; gap:2px; }
    .sidebar-mas-lista .mas-lista-item{
      min-height:auto; padding: 8px 10px; border-bottom:none;
      border-radius: 9px; gap: 10px;
    }
    .sidebar-mas-lista .mas-lista-item:hover{ background: var(--bg-panel-2); }
    .sidebar-mas-lista .mas-lista-icon{ width:28px; height:28px; background:transparent; color: var(--text-dim); }
    .sidebar-mas-lista .mas-lista-icon svg{ width:18px; height:18px; }
    .sidebar-mas-lista .mas-lista-titulo{ font-size: 0.82rem; }
    .sidebar-mas-lista .mas-lista-chevron{ display:none; }
    .sidebar-mas-lista .mas-lista-badge{ font-size: 0.58rem; padding: 2px 6px; }
    /* #perfilBtn sigue viviendo adentro de #masLista para que celular quede
       intacto — acá se oculta nomás, porque el perfil ya tiene su propio
       botón aparte (#sidebarPerfilBtn, justo abajo). */
    .sidebar-mas-lista #perfilBtn{ display:none; }

    /* Perfil: anclado abajo a la izquierda de la sidebar con avatar +
       nombre del negocio, como la cuenta de cualquier app de escritorio.
       margin-top:auto lo empuja al piso dentro del flex-column de .tabs. */
    .sidebar-perfil-footer{
      display:flex; align-items:center; gap:10px;
      margin-top: auto; padding: 10px;
      border-top: 1px solid var(--line);
      border-radius: 9px;
      background: transparent; text-align:left;
    }
    .sidebar-perfil-footer:hover{ background: var(--bg-panel-2); }
    .sidebar-perfil-avatar{
      width:34px; height:34px; border-radius:50%; flex-shrink:0;
      background: var(--accent-soft); color: var(--accent);
      display:flex; align-items:center; justify-content:center;
      font-weight:800; font-size:0.76rem;
    }
    .sidebar-perfil-nombre{
      font-size:0.82rem; font-weight:700; color: var(--text);
      white-space:nowrap; overflow:hidden; text-overflow:ellipsis; min-width:0;
    }
  }

  /* ---- Nav inferior: sheet de acciones rápidas del botón "+" (1.5) ---- */
  .acciones-rapidas-overlay{
    position: fixed; inset: 0; z-index: 60;
    background: rgba(0,0,0,0.55);
    opacity:0; pointer-events:none;
    transition: opacity 0.2s ease;
    display:flex; align-items:flex-end; justify-content:center;
  }
  .acciones-rapidas-overlay.show{ opacity:1; pointer-events:auto; }
  .acciones-rapidas-sheet{
    width:100%; max-width: var(--wrap-max);
    background: var(--bg-panel);
    border-radius: 20px 20px 0 0;
    padding: 10px 18px calc(20px + env(safe-area-inset-bottom));
    transform: translateY(100%);
    transition: transform 0.25s ease;
  }
  .acciones-rapidas-overlay.show .acciones-rapidas-sheet{ transform: translateY(0); }
  .acciones-rapidas-handle{ width:36px; height:4px; border-radius:3px; background: var(--line); margin: 4px auto 14px; }
  .acciones-rapidas-titulo{ font-size:0.9rem; font-weight:700; color: var(--text); text-align:center; margin-bottom:14px; }
  .acciones-rapidas-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap:10px; }

  /* ---- Turnos (Agenda): botón "+" del header, título y bordes ahora siguen
       el mismo patrón .panel/h2 que Ventas y Configuración (ver tab-historial
       en index.html) ---- */
  .turnos-header-add{
    width:36px; height:36px; min-height:auto; padding:0; border-radius:50%; flex-shrink:0;
    background: var(--accent); border:none; color:#16181c;
    display:flex; align-items:center; justify-content:center;
  }
  .turnos-header-add svg{ width:20px; height:20px; stroke:currentColor; fill:none; stroke-width:2.4; stroke-linecap:round; }
  .turnos-header-add:active{ opacity:0.85; }
  .turnos-header-actions{ display:flex; align-items:center; gap:8px; flex-shrink:0; }
  .turnos-dia-grilla{ margin-bottom:14px; }

  /* ---- Turnos: ícono de buscar/filtrar en el header + panel (2.5.B) ---- */
  .turnos-header-buscar{
    width:36px; height:36px; min-height:auto; padding:0; border-radius:50%; flex-shrink:0;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center;
    transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
  }
  .turnos-header-buscar svg{ width:17px; height:17px; stroke:currentColor; fill:none; stroke-width:2.2; stroke-linecap:round; stroke-linejoin:round; }
  .turnos-header-buscar:active{ color: var(--accent); border-color: var(--accent); }
  .turnos-header-buscar.active{ background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }

  .turnos-buscar-panel{
    background: var(--bg-panel); border:1px solid var(--line); border-radius: var(--radius);
    padding: 14px; display:flex; flex-direction:column; gap:12px; margin-bottom:12px;
  }
  .turnos-buscar-input-wrap input{ padding-left:42px; }
  .turnos-buscar-row2{ display:flex; align-items:center; justify-content:space-between; gap:8px; }
  /* Mismo ajuste que en .today-list (ver esa nota, más abajo, para el porqué
     del margin-inline negativo en el contenedor en vez de en la tarjeta). */
  .turnos-buscar-resultados{ display:flex; flex-direction:column; gap:8px; max-height:420px; overflow-y:auto; overflow-x:hidden; padding-inline: 12px; margin-inline: -12px; scrollbar-width:none; -ms-overflow-style:none; }
  .turnos-buscar-resultados::-webkit-scrollbar{ display:none; }

  .tab-content{ display: none; flex-direction: column; gap: 16px; margin-top: 12px; }
  .tab-content.active{ display: flex; }

  .panel{
    background: var(--bg-panel);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    padding: 16px;
  }

  /* ---- Inicio: tarjetas resumen (1.2) ---- */
  .inicio-resumen-grid{
    display:grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto auto;
    gap: 10px;
  }
  .resumen-card{
    background: var(--bg-panel);
    border: 1px solid var(--line);
    border-radius: 14px;
    padding: 14px;
    display:flex;
    flex-direction:column;
    gap: 4px;
    min-width: 0;
  }
  .resumen-card-grande{
    grid-column: 1 / -1;
    position: relative;
    padding-bottom: 6px;
    overflow: hidden;
  }
  .resumen-card-label{ font-size: 0.72rem; color: var(--text-dim); font-weight: 600; }
  .resumen-card-valor{ font-size: 1.55rem; font-weight: 800; color: var(--text); line-height:1.15; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .resumen-card-grande .resumen-card-valor{ font-size: 1.7rem; }
  .resumen-card-delta{ display:flex; align-items:center; gap:2px; font-size: 0.74rem; font-weight:700; color: var(--ok); }
  .resumen-card-delta svg{ width:13px; height:13px; stroke:currentColor; fill:none; stroke-width:2.4; stroke-linecap:round; stroke-linejoin:round; }
  .resumen-card-delta.down{ color: var(--danger); }
  .resumen-card-sub{ font-size: 0.74rem; color: var(--text-dim); }
  /* "Ingresos de hoy" de Inicio ahora reusa el gráfico detallado de
     Estadísticas (.stat-chart), fijo en período "Hoy" — ver
     renderResumenInicio()/renderGraficoLineas() en app.js. Solo achica el
     margen superior para que quede prolijo dentro de esta tarjeta, que es
     más chica que el panel de Estadísticas. */
  .resumen-card-grande .stat-chart{ margin-top:6px; }

  /* ---- Clientes: tarjeta resumen al pie de la lista (3.4), reusa .resumen-card ---- */
  .clientes-resumen-card{ margin-top: 14px; }

  /* ---- Ventas: tarjeta resumen "Ventas de hoy" (4.1), reusa .resumen-card-grande.
     El botón de categorías (antes suelto en el h2) vive ahora como ícono chico
     dentro de la tarjeta, arriba a la derecha. */
  .ventas-resumen-card{ margin-bottom: 14px; padding-right: 44px; }
  .resumen-card-accion{ position: absolute; top: 12px; right: 12px; }
  .resumen-card-accion-grande{ width:40px; height:40px; }
  .resumen-card-accion-grande svg{ width:20px; height:20px; }

  /* ---- Ventas: buscador de productos (4.2), reusa .ff-input-wrap ---- */
  .ventas-buscar-wrap{ margin-bottom:12px; }

  /* ---- Ventas: tabs de categoría raíz (4.3), reusa .notas-filtros/.filtro-chip ---- */
  .ventas-categoria-tabs{ margin-bottom: 10px; }

  /* ---- Ventas: sub-tabs de la categoría elegida (4.3) — fila más chica y
       liviana, sin el fondo en caja de .notas-filtros, para marcar que es
       un segundo nivel de filtro dentro del tab raíz activo. ---- */
  .ventas-subcategoria-tabs{
    display:flex; gap:6px; margin: 0 0 12px; overflow-x:auto;
  }
  .filtro-chip-sub{
    flex:none; min-height:auto; padding:6px 13px; border-radius:20px;
    font-size:0.72rem; font-weight:700; white-space:nowrap;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
  }
  .filtro-chip-sub.active{ background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }

  /* ---- Inicio: acciones rápidas (1.4) ---- */
  .inicio-acciones-rapidas{
    display:grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 10px;
    margin: 12px 0;
  }
  .accion-rapida-btn{
    display:flex; flex-direction:column; align-items:center; gap:7px;
    background: var(--bg-panel); border:1px solid var(--line); border-radius:14px;
    padding: 13px 8px 11px;
    color: var(--text);
    text-transform:none; letter-spacing:normal; font-weight:400;
  }
  .accion-rapida-btn:active{ border-color: var(--accent); }
  .accion-rapida-icono{
    position:relative;
    width:40px; height:40px; border-radius:50%; flex-shrink:0;
    background: var(--accent-soft); color: var(--accent);
    display:flex; align-items:center; justify-content:center;
  }
  .accion-rapida-icono svg{ width:19px; height:19px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .accion-rapida-icono::after{
    content:'+';
    position:absolute; top:-4px; right:-4px;
    width:16px; height:16px; border-radius:50%;
    background: var(--accent); color:#16181c;
    font-size:0.72rem; font-weight:800; line-height:16px; text-align:center;
    border: 2px solid var(--bg-panel);
  }
  .accion-rapida-label{ font-size:0.76rem; font-weight:700; color: var(--text); }

  /* ---- Inicio: próximos turnos compactos (1.3) ---- */
  .ver-agenda-btn{
    width:auto; height:auto; min-height:auto; border-radius:8px; padding:6px 13px;
    font-size:0.66rem; font-weight:800; text-transform:uppercase; letter-spacing:0.4px;
    background: linear-gradient(155deg, #f0c179, var(--accent) 65%);
    color:#16181c; border:1px solid rgba(255,255,255,0.25);
    box-shadow: 0 2px 6px rgba(0,0,0,0.25);
    flex-shrink:0;
  }
  .ver-agenda-btn:active{ transform: scale(0.96); box-shadow: 0 1px 3px rgba(0,0,0,0.2); }
  .turno-compacto{
    display:flex; align-items:stretch; gap:10px;
    background: var(--bg-panel-2); border-radius:10px; padding:10px 12px;
    min-width:0; cursor:pointer;
    position:relative; z-index:1;
    transition: transform 0.12s ease, box-shadow 0.12s ease;
  }
  /* Efecto "seleccionado" al tocar: se agranda levemente en vez de resaltarse
     en color. transform:scale() no cambia el layout, pero SÍ agranda el área
     de overflow pintada de la tarjeta — y sus contenedores (.today-list,
     .turnos-buscar-resultados) tienen overflow-y:auto con max-height, lo que
     por regla del spec de CSS fuerza a que overflow-x también clipee. Sin más,
     la tarjeta agrandada se cortaría en los bordes laterales.
     La solución NO puede ser darle padding-inline al contenedor y cancelarlo
     con margin-inline negativo de la misma magnitud en .turno-compacto (así
     estaba antes): eso deja a la tarjeta exactamente pegada al borde donde
     clipea overflow-x, con CERO aire de sobra — el "crecimiento" del scale()
     se corta igual, apenas la tarjeta crece. En cambio, acá el aire se saca
     del padding del .panel que envuelve la lista (16px, y siempre vacío):
     el contenedor de la lista se estira hacia afuera con margin-inline
     negativo (invadiendo parte de ese padding del panel) y compensa ese mismo
     ancho con su propio padding-inline, así el punto donde clipea overflow-x
     queda más afuera sin mover ni angostar nada visualmente en reposo. */
  /* inset en vez de un box-shadow "hacia afuera": uno hacia afuera con blur
     grande se sale del aire reservado en el contenedor (ver nota de arriba)
     y su difuminado se corta de golpe en ese borde — se ve como una línea
     fija en reposo y, mientras el scale() está animando, como un tembleque
     (el punto de corte se mueve con el tamaño de la tarjeta cuadro a
     cuadro). Un inset nunca sale de la tarjeta, así que no puede clipearse
     pase lo que pase con el contenedor. */
  .turno-compacto.turno-compacto-tocado{
    transform: scale(1.025);
    z-index:2;
    box-shadow: inset 0 0 0 1px rgba(255,255,255,0.14), inset 0 0 12px rgba(0,0,0,0.25);
  }
  .turno-compacto-franja{ width:4px; border-radius:3px; overflow:hidden; display:flex; flex-direction:column; flex-shrink:0; }
  .turno-compacto-franja span{ flex:1 1 0; }
  .turno-compacto-info{ flex:1; min-width:0; display:flex; flex-direction:column; gap:2px; }
  .turno-compacto-top{ display:flex; align-items:baseline; gap:8px; }
  .turno-compacto-hora{ font-size:0.78rem; font-weight:700; color: var(--accent); flex-shrink:0; }
  .turno-compacto-cliente{ font-weight:700; font-size:0.9rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .turno-compacto-servicios{ font-size:0.75rem; color: var(--text-dim); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .turno-compacto-precio{ font-size:0.75rem; font-weight:600; color: var(--text-dim); }
  .turno-compacto-right{ display:flex; flex-direction:column; align-items:flex-end; justify-content:center; gap:4px; flex-shrink:0; }
  .turno-compacto-estado{ width:22px; height:22px; border-radius:50%; display:flex; align-items:center; justify-content:center; }
  .turno-compacto-estado svg{ width:13px; height:13px; stroke:currentColor; fill:none; stroke-width:2.6; stroke-linecap:round; stroke-linejoin:round; }
  .turno-compacto-estado.completado{ background: var(--ok-soft); color: var(--ok); }
  .turno-compacto-estado.pendiente{ background: var(--warn-soft); color: #d9a441; }
  .turno-compacto-estado.cancelado{ background: var(--danger); color: #fff; opacity:0.85; }
  .panel h2{
    font-size: 0.98rem;
    text-transform: uppercase;
    letter-spacing: 0.6px;
    font-weight: 800;
    color: var(--text);
    margin: 0 0 12px;
    display:flex;
    align-items:center;
    justify-content:space-between;
  }
  .icon-btn-round{
    width:28px; height:28px; min-height:auto; padding:0; border-radius:50%;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
    text-transform:none; letter-spacing:normal; font-weight:400;
  }
  .icon-btn-round svg{ width:14px; height:14px; stroke:currentColor; fill:none; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
  .icon-btn-round:active{ color: var(--accent); border-color: var(--accent); }
  .icon-btn-round.active{ background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }

  /* ---- Reminder / today section ---- */
  /* margin-inline negativo + padding-inline en el CONTENEDOR (no en la
     tarjeta): le dan aire horizontal al scale() de .turno-compacto-tocado
     (ver esa regla) sin mover nada visualmente ni angostar las tarjetas en
     reposo. */
  /* scrollbar-width/-ms-overflow-style + ::-webkit-scrollbar: ocultan la
     barra de scroll vertical (el scroll con el dedo/mouse sigue andando
     igual). Sin esto, cuando la lista tiene varios turnos y sí llega a
     scrollear, el navegador reserva el ancho de esa scrollbar SOLO del
     lado derecho — eso le come el aire que padding-inline/margin-inline
     de acá abajo le dan a la tarjeta para crecer con el scale() de
     .turno-compacto-tocado, y por eso el lado derecho se cortaba mientras
     el izquierdo (que nunca pierde aire) se veía bien. */
  .today-list{ display:flex; flex-direction:column; gap:8px; max-height: 420px; overflow-y:auto; overflow-x:hidden; padding-inline: 12px; margin-inline: -12px; scrollbar-width:none; -ms-overflow-style:none; }
  .today-list::-webkit-scrollbar{ display:none; }
  .today-list .turno-card{ border-left: 3px solid var(--accent); }
  .today-list .turno-card.pagado{ border-left-color: var(--ok); }
  .today-list .turno-card.done{ opacity:0.75; }
  .empty-msg{ color: var(--text-dim); font-size:0.85rem; padding: 8px 2px; }

  /* ---- Listas permanentes que pueden acumular muchas filas con el tiempo
     (ingresos manuales, gastos): scroll interno con altura tope en vez de
     empujar el resto del panel hacia abajo a medida que crecen. */
  .lista-scroll{ max-height: 420px; overflow-y:auto; padding-right:2px; }

  /* ---- Listas plegables: mismo header/chevron que .categoria-grupo (Ventas),
     pero para plegar la lista completa, no un subgrupo dentro de ella. */
  .lista-plegable .categoria-header{ padding: 6px 4px; }
  .lista-plegable .lista-scroll{ margin-top: 6px; }
  .lista-plegable.colapsado .categoria-chevron{ transform: rotate(-90deg); }
  .lista-plegable.colapsado .lista-scroll{ display:none; }

  /* ---- Report cards ---- */
  .report-row{ display:grid; grid-template-columns: repeat(3,1fr); gap: 8px; margin-top: 10px; }
  .report-row.stats-row{ grid-template-columns: repeat(2,1fr); }
  .report-row > *{ min-width:0; }
  .report-card.static{ cursor: default; }
  .report-card.static .num{ font-size: 1.4rem; }
  .report-card{ background: var(--bg-panel-2); border-radius: 9px; padding: 12px 6px; text-align:center; cursor:pointer; border: 1px solid transparent; transition: background 0.15s ease, border-color 0.15s ease; }
  .report-card.active{ background: var(--accent-soft); border-color: var(--accent); }
  .report-card .num{ font-size: 1.1rem; font-weight: 700; color: var(--accent); display:block; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .report-card .lbl{ font-size: 0.63rem; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.5px; margin-top: 2px; }

  /* ---- Resumen general: tarjetas con ícono ---- */
  .stat-grid{ display:grid; grid-template-columns: repeat(2,1fr); gap: 12px; margin-top: 14px; }
  .stat-grid > *{ min-width:0; }
  @media (min-width: 860px){
    .stat-grid{ grid-template-columns: repeat(4,1fr); }
  }
  .stat-tile{
    position: relative;
    overflow: hidden;
    background: linear-gradient(160deg, var(--bg-panel-2), var(--bg-panel));
    border: 1px solid var(--line);
    border-radius: 14px;
    padding: 14px 14px 12px;
    display:flex;
    flex-direction:column;
    gap: 10px;
  }
  .stat-tile::after{
    content:"";
    position:absolute;
    top:-26px; right:-26px;
    width:68px; height:68px;
    border-radius:50%;
    background: var(--tile-color, var(--accent));
    opacity: 0.12;
  }
  .stat-tile .stat-icon{
    position:relative; z-index:1;
    width: 32px; height: 32px;
    border-radius: 9px;
    display:flex; align-items:center; justify-content:center;
    background: var(--accent-soft);
    background: color-mix(in srgb, var(--tile-color, var(--accent)) 18%, transparent);
    color: var(--tile-color, var(--accent));
  }
  .stat-tile .stat-icon svg{ width:17px; height:17px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .stat-tile .num{ position:relative; z-index:1; font-size: 1.4rem; font-weight: 800; color: var(--text); line-height:1.1; display:block; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .stat-tile .lbl{ position:relative; z-index:1; font-size: 0.68rem; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.4px; }
  .stat-tile.tile-accent{ --tile-color: var(--accent); }
  .stat-tile.tile-info{ --tile-color: var(--info); }
  .stat-tile.tile-warn{ --tile-color: var(--warn); }
  .stat-tile.tile-ok{ --tile-color: var(--ok); }

  .income-detail{ display:none; flex-direction:column; gap:8px; margin-top:12px; padding-top:12px; border-top:1px solid var(--line); }
  .income-detail.show{ display:flex; }
  .income-entry{ display:flex; justify-content:space-between; align-items:center; gap:10px; background: var(--bg-panel-2); border-radius:9px; padding:10px 12px; }
  .income-entry-main{ display:flex; flex-direction:column; gap:2px; min-width:0; }
  .income-entry-title{ font-size:0.85rem; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:flex; align-items:center; gap:7px; }
  .income-entry-title .tipo-dot{ width:7px; height:7px; border-radius:50%; flex-shrink:0; }
  .income-entry.turno .tipo-dot{ background: var(--accent); }
  .income-entry.producto .tipo-dot{ background: var(--info); }
  .income-entry.manual .tipo-dot{ background: var(--ok); }
  .income-entry-sub{ font-size:0.71rem; color:var(--text-dim); padding-left: 14px; }
  .income-entry-nota{ font-size:0.68rem; color:var(--ok); padding-left: 14px; margin-top:1px; }
  .income-entry-cliente{ display:inline-flex; align-items:center; gap:3px; color: var(--accent); font-weight:600; }
  .income-entry-cliente svg{ width:11px; height:11px; stroke:currentColor; fill:none; stroke-width:2; flex-shrink:0; }
  .income-entry-amount{ font-weight:700; color:var(--accent); font-size:0.85rem; white-space:nowrap; max-width:40%; overflow:hidden; text-overflow:ellipsis; min-width:0; flex-shrink:1; }
  /* Botón "Deshacer" de una fila de Ingresos que vino del carrito
     multi-producto (4.5) — mismo .icon-btn-round de siempre, un toque más
     chico para no competir con el monto al lado. */
  .income-entry-deshacer{ width:24px; height:24px; }
  .income-entry-deshacer svg{ width:12px; height:12px; }
  /* ---- Fila "fundida" de un carrito con varios productos (ver el
     agrupado-por-grupoId en itemsDeIngresos) — clickeable, abre el modal de
     detalle en vez de mostrar el botón de deshacer acá mismo. ---- */
  .income-entry.es-carrito{ cursor:pointer; }
  .income-entry.es-carrito:active{ background: var(--bg-panel); }
  .income-entry-chevron{
    width:18px; height:18px; flex-shrink:0; stroke: var(--text-dim); fill:none;
    stroke-width:2; stroke-linecap:round; stroke-linejoin:round;
  }
  .income-detail-empty{ color: var(--text-dim); font-size:0.82rem; padding: 6px 2px; }
  .income-entry.gasto .tipo-dot{ background: var(--warn); }
  .balance-entry .income-entry-amount{ font-size:0.92rem; }
  .balance-desglose{ display:flex; gap:6px; margin-top:4px; padding-left:14px; flex-wrap:wrap; }
  .desglose-chip{ font-size:0.68rem; font-weight:700; padding:2px 7px; border-radius:20px; }
  .desglose-chip.desglose-plus{ background: var(--ok-soft); color: var(--ok); }
  .desglose-chip.desglose-minus{ background: var(--warn-soft); color: var(--warn); }

  /* ---- Gastos por categoría ---- */
  .gpc-block{ margin-top:16px; padding-top:14px; border-top:1px solid var(--line); }
  .gpc-head{ display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap; }
  .gpc-title{ font-size:0.85rem; font-weight:700; color:var(--text); margin:0; }
  .gpc-periodo{ display:flex; gap:4px; background: var(--bg-panel-2); border-radius:8px; padding:3px; }
  .gpc-periodo-btn{ border:none; background:transparent; color:var(--text-dim); font-size:0.7rem; font-weight:700; padding:5px 9px; border-radius:6px; cursor:pointer; text-transform:uppercase; letter-spacing:0.3px; }
  .gpc-periodo-btn.active{ background: var(--accent-soft); color: var(--accent); }
  /* Selector con 5 opciones (Hoy/Semana/Mes/Año/Histórico): mismo look, letra
     y padding más chicos para que "Histórico" no desborde en pantallas angostas. */
  .gastos-total-periodo.periodo-5 .gpc-periodo-btn{ font-size:0.6rem; padding:5px 2px; letter-spacing:0.1px; }

  /* ---- Gráfico de línea (Ingresos/Gastos/Balance): evolución del total
     según el período elegido, mismo estilo que el sparkline de Inicio
     (línea + relleno degradado), pero con un punto por cada hora/día/mes
     según corresponda y su etiqueta debajo. El último punto (a la derecha)
     es siempre "ahora" (la hora actual en Hoy, hoy en Semana/Mes, este mes
     en Año/Histórico) y se destaca con un punto más grande + una guía
     vertical punteada, para ubicar de un vistazo "dónde estás". Cuando hay
     más puntos de los que entran cómodos (Hoy, Mes), el gráfico se vuelve
     horizontalmente scrolleable y arranca scrolleado del todo a la derecha
     (ver renderGraficoLineas), así el punto de "ahora" siempre es lo
     primero que se ve. Sin librerías externas: un solo SVG por tarjeta. ---- */
  .stat-chart{ margin-top:12px; }
  /* overflow-x:auto es necesario para que el gráfico siga siendo
     scrolleable (arrastrando con el dedo) cuando hay más puntos de los que
     entran en pantalla, pero por default eso hace que el navegador dibuje
     su propia barra de scroll horizontal encima — en varios navegadores
     mobile esa barra se ve como un boton/thumb suelto flotando sobre el
     gráfico. El scroll en sí sigue andando igual (touch/drag/rueda), esto
     solo oculta el dibujito de la barra nativa. */
  .stat-chart-scroll{
    overflow-x:auto; -webkit-overflow-scrolling:touch; margin:0 -2px; padding:0 2px;
    scrollbar-width:none; /* Firefox */
    -ms-overflow-style:none; /* Edge/IE viejos */
  }
  .stat-chart-scroll::-webkit-scrollbar{ display:none; height:0; } /* Chrome/Safari/WebView */
  .stat-chart-inner{ position:relative; min-width:100%; }
  .stat-chart-svg-el{ display:block; width:100%; height:84px; overflow:visible; }
  .stat-chart-labels{ position:relative; height:14px; margin-top:2px; }
  .stat-chart-labels span{ position:absolute; top:0; transform:translateX(-50%); font-size:0.58rem; color:var(--text-dim); white-space:nowrap; }
  .stat-chart-labels span.es-ahora{ color:var(--text); font-weight:800; }
  .stat-chart-labels span.es-ahora::before{ content:'●'; font-size:0.6em; margin-right:2px; color:currentColor; vertical-align:middle; }
  /* Halo del punto de "ahora" (ver puntoHoySvg en app.js): antes era un
     círculo quieto, ahora late suave para que se note que es "el punto en
     vivo" y no uno más de la serie. transform-box:fill-box hace que el
     scale() sea relativo al propio círculo (su centro), no a la esquina
     del SVG entero — sin eso el punto se "correría" de lugar al agrandarse. */
  .stat-chart-ahora-halo{
    transform-box: fill-box; transform-origin: center;
    animation: stat-chart-halo-pulso 2.2s ease-in-out infinite;
  }
  @keyframes stat-chart-halo-pulso{
    0%, 100%{ opacity: 0.16; transform: scale(1); }
    50%{ opacity: 0.05; transform: scale(1.4); }
  }
  /* Interacción tipo "Coco Capital": mantener presionado (o pasar el mouse
     en desktop) y arrastrar sobre la curva muestra la hora/día y el monto
     acumulado de ese punto exacto, con una línea vertical + un punto
     resaltado que siguen el dedo/cursor. Reemplaza la fila fija de
     etiquetas de hora (que se sacó para no saturar) por esta exploración
     bajo demanda. */
  .stat-chart{ position:relative; }
  .stat-chart-inner{ touch-action: pan-x; }
  .stat-chart-crosshair{ position:absolute; top:0; width:1px; height:84px; background:var(--line); pointer-events:none; opacity:0; }
  .stat-chart-crosshair.activo{ opacity:1; }
  /* OJO: el tooltip NO cuelga de .stat-chart-inner (el que se scrollea) —
     .stat-chart-scroll tiene overflow-x:auto y, por cómo funciona CSS,
     eso hace que el eje Y también quede recortado (overflow-y pasa a
     "auto" aunque no se lo haya pedido), así que un tooltip que sobresale
     hacia arriba del gráfico quedaría cortado. Por eso cuelga de
     .stat-chart (que sí tiene overflow visible) y su posición se calcula
     a mano restando el scroll horizontal actual, ver configurarInteraccionGrafico. */
  .stat-chart-tooltip{
    position:absolute; top:0; transform:translate(-50%,-100%); margin-top:-8px;
    background:var(--bg-panel-2); border:1px solid var(--line); border-radius:8px;
    padding:5px 9px; white-space:nowrap; pointer-events:none; opacity:0;
    box-shadow:0 4px 12px rgba(0,0,0,0.35); z-index:2;
  }
  .stat-chart-tooltip.activo{ opacity:1; }
  .stat-chart-tooltip-hora{ font-size:0.58rem; color:var(--text-dim); }
  .stat-chart-tooltip-monto{ font-size:0.74rem; font-weight:800; color:var(--text); }
  .gpc-list{ display:flex; flex-direction:column; gap:10px; margin-top:12px; }
  @media (min-width: 860px){
    .gpc-list{ display:grid; grid-template-columns: 1fr 1fr; gap: 10px 16px; }
  }
  .gpc-row{ display:flex; align-items:center; gap:10px; }
  .gpc-row-icon{ flex-shrink:0; width:30px; height:30px; border-radius:9px; background: var(--warn-soft); color: var(--warn); display:flex; align-items:center; justify-content:center; }
  .gpc-row-icon svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .gpc-row-body{ flex:1; min-width:0; }
  .gpc-row-top{ display:flex; justify-content:space-between; align-items:baseline; gap:8px; margin-bottom:5px; }
  .gpc-row-nombre{ font-size:0.8rem; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .gpc-row-monto{ font-size:0.8rem; font-weight:700; color:var(--warn); white-space:nowrap; flex-shrink:0; }
  .gpc-bar-track{ height:7px; border-radius:5px; background: var(--bg-panel-2); overflow:hidden; }
  .gpc-bar-fill{ height:100%; border-radius:5px; background: var(--warn); }

  .report-card.efectivo{ border: 1px solid rgba(91,171,111,0.3); }
  .report-card.efectivo .num{ color: var(--ok); }
  .report-card.transferencia{ border: 1px solid rgba(91,143,171,0.3); }
  .report-card.transferencia .num{ color: var(--info); }

  /* ---- Stats: servicio más pedido ---- */
  .top-servicio-card{ display:flex; align-items:center; gap:12px; background: var(--bg-panel-2); border: 1px solid var(--line); border-radius: 12px; padding: 14px; margin-top: 14px; }
  .top-servicio-icon{ flex-shrink:0; width:40px; height:40px; border-radius:11px; background: var(--accent-soft); color: var(--accent); display:flex; align-items:center; justify-content:center; }
  .top-servicio-icon svg{ width:20px; height:20px; stroke:currentColor; fill:none; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
  .top-servicio-info{ flex:1; min-width:0; }
  .top-servicio-card .nombre{ font-weight:700; font-size: 0.95rem; }
  .top-servicio-card .veces{ color: var(--text-dim); font-size: 0.74rem; margin-top:2px; }
  .top-servicio-card .num{ font-size: 1.3rem; font-weight:700; color: var(--accent); flex-shrink:1; min-width:0; max-width:35%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

  /* ---- Stats: detalle histórico colapsable ---- */
  .stats-details{ margin-top: 12px; border-top: 1px solid var(--line); padding-top: 10px; }
  .stats-details summary{
    cursor: pointer;
    list-style: none;
    font-size: 0.8rem;
    font-weight: 700;
    color: var(--accent);
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 2px;
  }
  .stats-details summary::-webkit-details-marker{ display:none; }
  .stats-details summary::before{
    content: '▸';
    font-size: 0.7rem;
    transition: transform 0.15s ease;
  }
  .stats-details[open] summary::before{ transform: rotate(90deg); }
  .stats-details-body{ margin-top: 10px; }

  /* ---- Form ---- */
  form.turno-form{ display:flex; flex-direction:column; gap: 12px; }
  .form-row{ display:grid; grid-template-columns: 1fr 1fr; gap: 10px; }
  .form-row > *{ min-width:0; }

  /* ---- Cliente: buscador rápido + autocompletado ---- */
  .cliente-field-head{ display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:5px; }
  .cliente-field-head label{ margin-bottom:0; }
  .cliente-buscar-btn{
    width:auto; min-height:auto; padding:5px 10px 5px 8px; border-radius:20px;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    font-size:0.72rem; font-weight:700; display:flex; align-items:center; gap:4px; flex-shrink:0;
  }
  .cliente-buscar-btn svg{ width:13px; height:13px; stroke:currentColor; fill:none; stroke-width:2; }
  .cliente-buscar-btn:active{ color: var(--accent); border-color: var(--accent); }
  .cliente-autocomplete-wrap{ position:relative; }
  .cliente-sugerencias{
    display:none; position:absolute; left:0; right:0; top:calc(100% + 4px); z-index:35;
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius:10px;
    /* 230px es el máximo — ajustarAlturaSugerencias() en app.js lo recorta en
       JS (vía style.maxHeight inline) al espacio real disponible debajo del
       input cada vez que se muestra, para que nunca quede cortado por el
       borde de la pantalla. */
    max-height:230px; overflow-y:auto; box-shadow: 0 10px 24px rgba(0,0,0,0.4);
  }
  .cliente-sugerencias.show{ display:block; }
  .cliente-sug-item{ display:flex; align-items:center; gap:10px; padding:9px 12px; border-bottom:1px solid var(--line); }
  .cliente-sug-item:last-child{ border-bottom:none; }
  .cliente-sug-item:active{ background: var(--bg-panel); }
  .cliente-sug-avatar{
    width:30px; height:30px; border-radius:50%; background: var(--accent-soft); color: var(--accent);
    display:flex; align-items:center; justify-content:center; font-size:0.7rem; font-weight:800; flex-shrink:0;
  }
  .cliente-sug-info{ min-width:0; flex:1; }
  .cliente-sug-nombre{ font-size:0.86rem; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .cliente-sug-meta{ font-size:0.68rem; color: var(--text-dim); margin-top:1px; }

  /* ---- Directorio de clientes (pantalla aparte) ---- */
  .clientes-search-box{ margin-bottom:12px; }
  /* 3.3: tarjeta compacta (mockup) — antes era una tarjeta densa con
     teléfono/instagram en texto y 4 botones de acción. Ahora es una sola
     fila: avatar + nombre + meta, con el ícono de WhatsApp a la derecha.
     Instagram, "Ver historial" y "Nuevo turno" pasaron a la ficha de
     detalle (.cliente-detalle-acciones), que abre con tap en el resto
     de la fila (.cliente-top). */
  .cliente-item{
    display:flex; align-items:center; gap:10px; background: var(--bg-panel);
    border:1px solid var(--line); border-radius:10px; padding:10px 12px;
  }
  .cliente-top{ display:flex; align-items:center; gap:10px; flex:1; min-width:0; cursor:pointer; }
  .cliente-avatar{
    width:42px; height:42px; border-radius:50%; background: var(--accent-soft); color: var(--accent);
    display:flex; align-items:center; justify-content:center; font-size:0.92rem; font-weight:800; flex-shrink:0;
  }
  .cliente-body{ flex:1; min-width:0; }
  .cliente-nombre{ font-weight:700; font-size:0.95rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .cliente-meta{ color: var(--text-dim); font-size:0.76rem; margin-top:2px; }
  .cliente-icon-btn{
    width:36px; height:36px; min-height:auto; padding:0; border-radius:9px; flex-shrink:0;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text);
    display:flex; align-items:center; justify-content:center;
  }
  .cliente-icon-btn svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:1.8; }
  .cliente-icon-btn.wsp{ color:#3fd16a; border-color: rgba(63,209,106,0.35); }
  .cliente-icon-btn.wsp svg{ fill:currentColor; stroke:none; }
  .cliente-icon-btn.wsp:active{ background: rgba(63,209,106,0.12); }
  .cliente-icon-btn.ig{ color:#e1306c; border-color: rgba(225,48,108,0.35); }
  .cliente-icon-btn.ig svg{ stroke:currentColor; stroke-width:1.8; fill:none; }
  .cliente-icon-btn.ig:active{ background: rgba(225,48,108,0.12); }
  .cliente-top:active{ opacity:0.75; }

  /* ---- Ficha de cliente (resumen + acciones) ---- */
  .cliente-detalle-overlay{
    position: fixed; inset: 0; background: rgba(10,11,13,0.72);
    display:flex; align-items:center; justify-content:center;
    z-index: 210; opacity:0; pointer-events:none; transition: opacity 0.2s ease;
    padding: 20px;
  }
  .cliente-detalle-overlay.show{ opacity:1; pointer-events:auto; }
  .cliente-detalle-box{
    width:100%; max-width: 420px; max-height: 86vh; overflow-y:auto;
    background: var(--bg-panel); border:1px solid var(--line); border-radius: 18px;
    padding: 26px 20px 20px; position:relative;
    transform: scale(0.94); opacity:0; transition: transform 0.2s ease, opacity 0.2s ease;
    box-shadow: 0 12px 40px rgba(0,0,0,0.45);
  }
  .cliente-detalle-overlay.show .cliente-detalle-box{ transform: scale(1); opacity:1; }
  /* En compu (2.1.0) la nav es una sidebar fija, no algo que "se navega
     lejos" como el bottom nav de celular — así que, igual que
     .notas-page-overlay, este fondo oscurecido no debe taparla: si no, un
     click en cualquier pestaña de la sidebar mientras hay una ficha/modal
     de este tipo abierta (ej. Perfil, dentro de "Más") no llega a tocarla
     -el backdrop de acá lo intercepta primero, con pointer-events:auto- y
     no pasa nada hasta cerrar esta pantalla a mano. */
  @media (min-width: 860px){
    .cliente-detalle-overlay{ left: var(--sidebar-w); }
  }
  /* Un poco más ancha para los modales de edición (turno/producto), que tienen
     más campos por fila (form-row a dos columnas) que la ficha de cliente. */
  .cliente-detalle-box-ancho{ max-width: 480px; }
  .cliente-detalle-cerrar{
    position:absolute; top:14px; right:14px; width:32px; height:32px; min-height:auto; padding:0;
    border-radius:50%; background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center;
  }
  .cliente-detalle-cerrar svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:2; }
  .cliente-detalle-header{ display:flex; flex-direction:column; align-items:center; text-align:center; gap:6px; margin-bottom:18px; }
  .cliente-detalle-avatar{ width:58px; height:58px; font-size:1.2rem; margin-bottom:4px; }
  .cliente-detalle-nombre{ font-size:1.1rem; font-weight:800; }
  .cliente-detalle-meta{ font-size:0.8rem; color: var(--text-dim); }

  /* ---- Modal de detalle de una venta con varios productos (carrito de
     "Nueva venta", ver mostrarDetalleVentaCarrito) — reusa el mismo
     .cliente-detalle-overlay/box de arriba (modal centrado), con su propia
     lista de items + total + botón de deshacer abajo de todo. ---- */
  .detalle-venta-items{ display:flex; flex-direction:column; gap:8px; margin-bottom:14px; }
  .detalle-venta-item{
    display:flex; align-items:center; justify-content:space-between; gap:10px;
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius:10px; padding:10px 12px;
  }
  .detalle-venta-item-info{ min-width:0; }
  .detalle-venta-item-nombre{ font-weight:700; font-size:0.88rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .detalle-venta-item-cantidad{ font-size:0.74rem; color: var(--text-dim); margin-top:1px; }
  .detalle-venta-item-monto{ font-weight:800; font-size:0.88rem; flex-shrink:0; white-space:nowrap; }
  .detalle-venta-total{
    display:flex; justify-content:space-between; align-items:center;
    font-weight:800; font-size:1.05rem; color: var(--text);
    border-top:1px solid var(--line); padding-top:12px; margin-bottom:16px;
  }
  .detalle-venta-deshacer{ width:100%; color: var(--warn); border-color: var(--warn); }
  .detalle-venta-deshacer:active{ background: var(--warn-soft); }
  .cliente-detalle-contacto{ display:flex; align-items:center; justify-content:center; gap:10px; margin-top:4px; }
  .cliente-detalle-contacto .cliente-icon-btn{ width:40px; height:40px; }
  .cliente-detalle-contacto .cliente-icon-btn svg{ width:17px; height:17px; }
  .cliente-detalle-stats{
    display:grid; grid-template-columns: 1fr 1fr; gap:8px; margin-bottom:16px;
  }
  .cliente-detalle-stat{
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius:10px;
    padding:10px 8px; text-align:center; min-width:0;
  }
  .cliente-detalle-stat .num{ font-size:1.05rem; font-weight:800; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .cliente-detalle-stat .lbl{ font-size:0.68rem; color: var(--text-dim); margin-top:2px; }
  .cliente-detalle-seccion{ margin-bottom:16px; }
  .cliente-detalle-seccion h4{ font-size:0.76rem; text-transform:uppercase; letter-spacing:0.5px; color: var(--text-dim); margin:0 0 8px; }
  .cliente-detalle-productos{ display:flex; flex-direction:column; gap:6px; }
  .cliente-detalle-producto-row{
    display:flex; align-items:center; justify-content:space-between; gap:8px;
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius:9px; padding:8px 10px;
    font-size:0.82rem;
  }
  .cliente-detalle-producto-row .cant{ color: var(--text-dim); font-size:0.74rem; }

  /* ---- Modal "Ver servicios" de un turno ---- */
  .ver-servicios-lista{ display:flex; flex-direction:column; gap:8px; margin-bottom:18px; max-height:50vh; overflow-y:auto; text-align:left; }
  .ver-servicio-row{
    display:flex; align-items:center; justify-content:space-between; gap:8px;
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius:10px; padding:10px 12px;
  }
  .ver-servicio-info{ min-width:0; }
  .ver-servicio-nombre{ font-size:0.88rem; font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .ver-servicio-precio{ font-size:0.78rem; color: var(--text-dim); margin-top:2px; }
  .ver-servicio-acciones{ display:flex; gap:6px; flex-shrink:0; }
  .ver-servicio-btn{
    width:34px; height:34px; min-height:auto; padding:0; border-radius:9px;
    background: var(--bg-panel); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center;
  }
  .ver-servicio-btn svg{ width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2; }
  .ver-servicio-btn.editar:active{ background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }
  .ver-servicio-btn.borrar:active{ background: rgba(224,95,95,0.14); color:#e05f5f; border-color: rgba(224,95,95,0.4); }
  .cliente-detalle-acciones{ display:flex; flex-direction:column; gap:8px; }
  .cliente-detalle-accion{
    display:flex; align-items:center; justify-content:center; gap:8px;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text);
    border-radius:10px; padding:12px 10px; font-size:0.86rem; font-weight:700; min-height:auto; width:100%;
  }
  .cliente-detalle-accion.primary{ background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }
  .cliente-detalle-accion.warn{ background: var(--warn-soft); color: var(--warn); border-color: var(--warn); }
  .cliente-detalle-accion:active{ filter: brightness(0.95); }
  label{ font-size: 0.72rem; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.5px; display:block; margin-bottom: 5px; }
  input, select{
    width:100%;
    min-width:0;
    background: var(--bg-panel-2);
    border: 1px solid var(--line);
    color: var(--text);
    border-radius: 8px;
    padding: 12px 12px;
    font-size: 1rem;
    min-height: 46px;
  }
  input:focus, select:focus{ outline: none; border-color: var(--accent); }
  button{ cursor:pointer; font-weight:600; border-radius: 8px; border: none; padding: 12px 14px; font-size: 0.92rem; min-height: 44px; transition: transform 0.08s ease, filter 0.15s ease, opacity 0.15s ease, background 0.15s ease; }
  button:active{ transform: scale(0.96); }
  .btn-primary{ background: var(--accent); color: #201400; margin-top: 4px; width: 100%; }
  .btn-primary:active{ filter: brightness(0.95); }
  .btn-primary:disabled{ opacity:0.5; }
  .btn-ghost{ background: transparent; border: 1px solid var(--line); color: var(--text-dim); }
  .btn-ghost:active{ color: var(--text); border-color: var(--text-dim); }
  .btn-small{ padding: 8px 10px; font-size: 0.76rem; min-height: 38px; }
  .btn-ok{ background: var(--ok-soft); color: var(--ok); border: 1px solid var(--ok); }
  .btn-info{ background: var(--info-soft); color: var(--info); border: 1px solid var(--info); }

  /* ---- Config ---- */
  .config-toggle-row{ display:flex; align-items:center; justify-content:space-between; gap: 14px; }
  .config-toggle-label{ font-size: 0.92rem; font-weight: 600; }
  .config-toggle-sub{ font-size: 0.76rem; color: var(--text-dim); margin-top: 3px; }
  .switch{ position: relative; display:inline-block; width: 50px; height: 30px; flex-shrink:0; }
  .switch input{ opacity:0; width:0; height:0; }
  .switch .slider{ position:absolute; cursor:pointer; inset:0; background: var(--bg-panel-2); border: 1px solid var(--line); border-radius: 30px; transition: background 0.15s ease, border-color 0.15s ease; }
  .switch .slider::before{ content:""; position:absolute; height: 22px; width: 22px; left: 3px; top: 3px; background: var(--text-dim); border-radius:50%; transition: transform 0.15s ease, background 0.15s ease; }
  .switch input:checked + .slider{ background: var(--accent-soft); border-color: var(--accent); }
  .switch input:checked + .slider::before{ transform: translateX(20px); background: var(--accent); }
  .config-limite-fields{ display:grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line); transition: opacity 0.15s ease; }
  .config-limite-fields.disabled{ opacity: 0.4; pointer-events: none; }
  .config-hint{ font-size: 0.8rem; color: var(--text-dim); margin: 0 0 12px; line-height: 1.4; }

  /* ---- Menú lateral del header (1.6) ----
     Panel angosto que entra deslizando desde la izquierda (mismo lado que
     el botón de 3 líneas), con el fondo oscurecido atrás — mismo patrón de
     fondo que ya usa el sheet de acciones rápidas del botón "+", pero acá
     el panel entra por el costado en vez de por abajo. El contenido
     (#masLista) se mueve para adentro de .menu-lateral-body por JS al
     abrir, así que este panel no tiene estilos propios de lista: solo el
     encabezado "Más" y el recuadro que lo contiene. */
  .menu-lateral-overlay{
    position: fixed; inset: 0; z-index: 95;
    background: rgba(0,0,0,0.55);
    opacity:0; pointer-events:none;
    transition: opacity 0.2s ease;
  }
  .menu-lateral-overlay.show{ opacity:1; pointer-events:auto; }
  .menu-lateral-panel{
    position:absolute; top:0; left:0; bottom:0;
    width: 78%; max-width: 300px;
    background: var(--bg-panel);
    border-right: 1px solid var(--line);
    padding: calc(18px + env(safe-area-inset-top)) 18px 18px;
    transform: translateX(-100%);
    transition: transform 0.25s ease;
    overflow-y: auto;
    display:flex; flex-direction:column;
  }
  .menu-lateral-overlay.show .menu-lateral-panel{ transform: translateX(0); }
  .menu-lateral-header{ display:flex; align-items:center; gap:10px; margin-bottom: 6px; }
  .menu-lateral-header h2{ flex:1; font-size:1.05rem; font-weight:800; margin:0; color: var(--text); }
  .menu-lateral-body{ flex:1; }

  /* ---- Lista principal de "Más" (mockup imagen 1, pantalla 7) ----
     Reemplaza a la vieja grilla de tarjetas SOLO para el listado de arriba
     de todo (Servicios, Gastos, Estadísticas, Clientes, Configuración,
     Perfil): una lista de una columna, filas separadas por una línea fina,
     sin fondo ni borde propio por fila (a diferencia de .config-hub-card).
     Los íconos van todos del mismo tono (fondo neutro + trazo dorado), como
     en el mockup, en vez de un color por ítem. La pantalla de Configuración
     (Vista/Horarios/Notificaciones/Novedades) NO usa esta lista: sigue con
     el estilo de tarjetas .config-hub-card de siempre, más abajo. */
  .mas-lista{ display:flex; flex-direction:column; }
  .mas-lista-item{
    display:flex; align-items:center; gap:12px; text-align:left;
    background:none; border:none; border-bottom: 1px solid var(--line);
    padding: 13px 2px; transition: opacity 0.15s ease;
  }
  .mas-lista-item:last-child{ border-bottom:none; }
  .mas-lista-item:active{ opacity: 0.7; }
  .mas-lista-icon{
    width:38px; height:38px; border-radius:50%; flex-shrink:0;
    background: var(--bg-panel-2); color: var(--accent);
    display:flex; align-items:center; justify-content:center;
  }
  .mas-lista-icon svg{ width:19px; height:19px; stroke:currentColor; fill:none; stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
  .mas-lista-titulo{ flex:1; font-size:0.92rem; font-weight:700; color: var(--text); }
  .mas-lista-chevron{ width:18px; height:18px; stroke: var(--text-dim); fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; flex-shrink:0; }

  /* Ítems "Próximamente" (Empleados, Ayuda y soporte — 7.1): son <button
     disabled>, así que ni siquiera disparan click (el navegador los bloquea
     solo), no hace falta desactivar el :active de arriba. Solo se atenúan
     un poco y cambian la flecha por un badge, reusando el componente .badge
     ya existente (mismas clases .badge.info que usa el resto de la app). */
  .mas-lista-item-proximamente{ opacity: 0.55; }
  .mas-lista-badge{ flex-shrink:0; }

  /* ---- Hub de Configuración ----
     Pantalla propia a la que ahora se entra desde el ítem "Configuración"
     de la lista de arriba (#masConfiguracionOverlay). Adentro hay 4
     tarjetas grandes (una por tema) que abren cada una su propia pantalla
     aparte (reutiliza .notas-page-overlay, la misma "pantalla que entra
     deslizando" que ya usan Clientes y Notas). Cada tarjeta tiene su color
     de ícono propio (uno de los 4 acentos que ya existen en la paleta) solo
     para diferenciarlas de un vistazo, sin agregar colores nuevos.
     En pantallas anchas (compu) el grid pasa a 2 columnas — en el celular
     queda apilado en 1, así las tarjetas no quedan angostas y recortadas. */
  .config-hub-grid{ display:grid; grid-template-columns: 1fr; gap: 10px; }
  @media (min-width: 640px){
    .config-hub-grid{ grid-template-columns: 1fr 1fr; }
  }
  .config-hub-card{
    display:flex; align-items:center; gap:12px; text-align:left;
    background: var(--bg-panel-2); border: 1px solid var(--line); border-radius: 12px;
    padding: 14px; transition: border-color 0.15s ease, transform 0.1s ease;
  }
  .config-hub-card:active{ transform: scale(0.98); border-color: var(--text-dim); }
  .config-hub-icon{
    width:42px; height:42px; border-radius:11px; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
  }
  .config-hub-icon svg{ width:21px; height:21px; stroke:currentColor; fill:none; stroke-width:1.9; stroke-linecap:round; stroke-linejoin:round; }
  .config-hub-icon-vista{ background: var(--info-soft); color: var(--info); }
  .config-hub-icon-horarios{ background: var(--accent-soft); color: var(--accent); }
  .config-hub-icon-notif{ background: var(--warn-soft); color: var(--warn); }
  .config-hub-icon-novedades{ background: var(--ok-soft); color: var(--ok); }
  .config-hub-texto{ display:flex; flex-direction:column; gap:2px; min-width:0; flex:1; }
  .config-hub-titulo{ font-size:0.92rem; font-weight:700; color: var(--text); }
  .config-hub-desc{ font-size:0.75rem; color: var(--text-dim); line-height:1.35; }
  .config-hub-chevron{ width:18px; height:18px; stroke: var(--text-dim); fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; flex-shrink:0; }

  /* Contenido de cada pantalla de Config (dentro de .notas-page, que ya es
     flex-column): separación entre los paneles agrupados de ese tema. */
  .config-seccion-body{ display:flex; flex-direction:column; gap:16px; }

  /* ---- Horas recomendadas (config) ---- */
  .horas-recomendadas-list{ display:flex; flex-wrap:wrap; gap:8px; margin-bottom: 14px; }
  .hora-recomendada-chip{
    display:flex; align-items:center; gap:8px; background: var(--bg-panel-2);
    border:1px solid var(--line); border-radius:20px; padding:6px 6px 6px 14px;
    font-size:0.85rem; font-weight:600;
  }
  .hora-recomendada-chip button{
    background: var(--warn-soft); color:var(--warn); border:none; border-radius:50%;
    width:22px; height:22px; min-height:auto; padding:0; font-size:0.8rem;
    display:flex; align-items:center; justify-content:center; line-height:1;
  }
  .add-hora-row{ display:flex; gap:8px; }
  .add-hora-row .date-trigger{ flex:1; width:auto; min-width:0; }
  .add-hora-row input{ flex:1; }
  .add-hora-row button{ flex-shrink:0; }

  /* ---- Bloqueos por día (config) ---- */
  .bloqueos-list{ display:flex; flex-direction:column; gap:8px; margin-bottom: 14px; }
  .bloqueo-row{ display:flex; align-items:center; gap:10px; background: var(--bg-panel-2); border-radius: 8px; padding: 10px 12px; }
  .bloqueo-row .bloqueo-dia{ background: var(--accent-soft); color: var(--accent); font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.3px; padding: 4px 8px; border-radius: 6px; flex-shrink:0; }
  .bloqueo-row .bloqueo-rango{ flex:1; font-size: 0.88rem; font-weight: 600; }
  .bloqueo-row button{ background: var(--warn-soft); border: 1px solid var(--warn); color: var(--warn); font-size: 0.95rem; padding: 0; min-height: 30px; width: 30px; border-radius: 50%; display:flex; align-items:center; justify-content:center; flex-shrink:0; }
  .empty-bloqueos{ color: var(--text-dim); font-size:0.82rem; background: var(--bg-panel-2); padding: 10px 12px; border-radius: 8px; margin-bottom: 10px; }
  .add-bloqueo-form{ display:flex; flex-direction:column; gap:8px; }
  .add-bloqueo-form select{ width:100%; }
  .add-bloqueo-row2{ display:grid; grid-template-columns: 1fr 1fr auto; gap: 8px; align-items:end; }
  .add-bloqueo-row2 button{ height: 46px; }

  /* ---- Búsqueda rápida de huecos libres ---- */
  .btn-buscar-hueco{ color: var(--info); border-color: var(--info); margin: 10px 0 4px; }
  .btn-buscar-hueco:active{ background: var(--info-soft); }
  #modalHuecosOverlay .modal-icon{ font-size: 1.3rem; }
  .huecos-list{ display:flex; flex-direction:column; gap:16px; margin: 4px 0 6px; max-height: 340px; overflow-y:auto; padding-right:2px; }
  .hueco-dia-grupo + .hueco-dia-grupo{ padding-top:14px; border-top:1px solid var(--line); }
  .hueco-dia-header{
    font-size:0.72rem; font-weight:700; text-transform:uppercase; letter-spacing:0.4px;
    color: var(--info); margin-bottom:8px;
  }
  .hueco-horas-row{ display:flex; flex-wrap:wrap; gap:8px; }
  .hueco-hora-btn{
    min-height:auto; padding:9px 16px; font-size:0.88rem; font-weight:700; border-radius:20px;
    background: var(--info-soft); border:1px solid var(--info); color: var(--info);
  }
  .hueco-hora-btn:active{ background: var(--info); color: var(--bg-panel); }
  .huecos-empty{
    display:flex; flex-direction:column; align-items:center; text-align:center; gap:6px;
    background: var(--bg-panel-2); border-radius: 12px; padding: 24px 16px;
  }
  .huecos-empty-icon{ font-size:1.8rem; margin-bottom:4px; }
  .huecos-empty-titulo{ font-size:0.92rem; font-weight:700; color: var(--text); }
  .huecos-empty-sub{ font-size:0.8rem; color: var(--text-dim); line-height:1.45; }

  /* ---- Ventana con sub-pestañas dentro de un panel de config ---- */
  .subtabs{
    display:flex; gap:4px; background: var(--bg-panel-2); border-radius: 10px;
    padding: 4px; margin-bottom: 14px;
  }
  .subtab-btn{
    flex:1; background:transparent; border:none; color: var(--text-dim);
    font-size: 0.78rem; font-weight:700; padding: 9px 6px; border-radius: 7px;
    min-height:auto; white-space:nowrap;
  }
  .subtab-btn.active{ background: var(--accent); color:#201400; }
  .subtab-panel{ display:none; }
  .subtab-panel.active{ display:block; animation: subtabIn 0.15s ease; }
  @keyframes subtabIn{ from{ opacity:0; transform: translateY(2px); } to{ opacity:1; transform: translateY(0); } }

  /* ---- Días fijos no laborables (config) ---- */
  .dias-fijos-grid{ display:grid; grid-template-columns: repeat(7, 1fr); gap: 6px; }
  .dia-fijo-chip{
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:4px;
    background: var(--bg-panel-2); border: 1px solid var(--line); color: var(--text);
    border-radius: 10px; padding: 12px 2px; min-height:auto; font-size:0.7rem; font-weight:700;
    text-transform:uppercase; letter-spacing:0.3px;
  }
  .dia-fijo-chip .dot{ width:7px; height:7px; border-radius:50%; background: var(--ok); }
  .dia-fijo-chip.active{ background: var(--warn-soft); border-color: var(--warn); color: var(--warn); }
  .dia-fijo-chip.active .dot{ background: var(--warn); }

  /* ---- Servicios (catálogo) ----
     Rediseño de estética: filas al mismo patrón que .cliente-item de
     Clientes (fila con fondo bg-panel + borde, sobre el bg liso de la
     pestaña — ya no hay .panel envolviendo la lista) y botones de
     editar/borrar como íconos cuadrados en bg-panel-2 (mismo criterio de
     contraste que .cliente-icon-btn sobre .cliente-item), en vez del ✕
     circular suelto que tenía antes. */
  .servicios-list{ display:flex; flex-direction:column; gap:8px; margin-bottom: 14px; }
  @media (min-width: 860px){
    .servicios-list{ display:grid; grid-template-columns: 1fr 1fr; gap: 8px 16px; }
  }
  .servicio-item{
    display:flex; align-items:center; gap:10px; background: var(--bg-panel);
    border:1px solid var(--line); border-radius:10px; padding:10px 12px;
  }
  .servicio-info{ flex:1; min-width:0; }
  .servicio-nombre{ font-weight:700; font-size:0.92rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .servicio-meta{ color: var(--text-dim); font-size:0.78rem; margin-top:2px; }
  .servicio-meta .precio{ color: var(--accent); font-weight:700; }
  .servicio-icon-btn{
    width:36px; height:36px; min-height:auto; padding:0; border-radius:9px; flex-shrink:0;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text);
    display:flex; align-items:center; justify-content:center;
  }
  .servicio-icon-btn svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }
  .servicio-icon-btn.editar:active{ background: var(--accent-soft); color: var(--accent); border-color: var(--accent); }
  .servicio-icon-btn.borrar:active{ background: rgba(224,95,95,0.14); color:#e05f5f; border-color: rgba(224,95,95,0.4); }
  .add-servicio-form{ display:flex; flex-direction:column; gap:8px; }
  .add-servicio-row2{ display:grid; grid-template-columns: 1fr 1fr auto auto auto; gap: 8px; align-items:center; }
  /* Sin esto, un <select> con una opción larga (ej: "Transferencia", "Impuestos")
     no se achica para entrar en su columna del grid -aunque tenga width:100%-,
     porque el ancho mínimo por defecto de un ítem de grid es el de su contenido.
     Eso empuja la fila entera más ancha que el formulario (o el modal de edición
     que la contiene) y termina cortada/tapada en vez de ajustarse o pasar de
     renglón. min-width:0 saca ese piso para que sí se achique como corresponde. */
  .add-servicio-row2 > *{ min-width:0; }
  .servicio-indefinido-check{ display:flex; align-items:center; gap:6px; font-size:0.78rem; color: var(--text-dim); white-space:nowrap; cursor:pointer; user-select:none; }
  .servicio-indefinido-check input{ width:16px; height:16px; accent-color: var(--accent); margin:0; }
  #fServicioDuracion:disabled{ opacity:0.45; }
  .empty-servicios{ color: var(--warn); font-size:0.82rem; background: var(--warn-soft); padding: 10px 12px; border-radius: 8px; margin-bottom: 10px; }

  /* ---- Modo edición: se distingue de "crear nuevo" ---- */
  .form-editando-badge{
    display:none;
    align-items:center;
    gap:6px;
    align-self:flex-start;
    background: var(--info-soft);
    color: var(--info);
    border: 1px solid var(--info);
    font-size:0.7rem;
    font-weight:800;
    text-transform:uppercase;
    letter-spacing:0.4px;
    padding:5px 10px;
    border-radius:7px;
  }
  .add-servicio-form.form-editando{
    border: 1px solid var(--info);
    background: color-mix(in srgb, var(--info) 10%, var(--bg-panel));
    border-radius: var(--radius);
    padding: 12px;
    margin: 0 -4px;
  }
  .add-servicio-form.form-editando .form-editando-badge{ display:flex; }

  /* ---- Formulario de producto (Ventas): campos con etiqueta fija + ícono ----
     Antes cada campo era un input suelto que solo mostraba su nombre como
     placeholder (desaparecía al escribir). Ahora cada campo tiene una
     etiqueta siempre visible arriba (reusa el estilo global de `label`) más
     un ícono a la izquierda del input, para que se entienda de un vistazo
     qué es cada dato incluso con el campo ya completo. */
  .producto-form-v2{ gap: 16px; }
  .ff-field{ display:flex; flex-direction:column; }
  .ff-field label{ margin-bottom: 6px; }
  .ff-opt{ text-transform:none; letter-spacing:0; font-weight:400; opacity:0.7; }
  .ff-row2{ display:grid; grid-template-columns: 1fr 1fr; gap: 12px; }
  .ff-input-wrap{ position:relative; display:flex; align-items:center; }
  .ff-input-wrap input{
    padding-left: 42px;
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
  }
  .ff-input-wrap:focus-within input{ box-shadow: 0 0 0 3px rgba(201,138,62,0.16); }
  .ff-icon{
    position:absolute; left:13px; z-index:1;
    width:18px; height:18px;
    fill:none; stroke: var(--text-dim); stroke-width:1.8;
    stroke-linecap:round; stroke-linejoin:round;
    pointer-events:none;
    transition: stroke 0.15s ease;
  }
  .ff-icon-text{
    font-size:0.95rem; font-weight:700; color: var(--text-dim); line-height:1;
    transition: color 0.15s ease;
  }
  .ff-input-wrap:focus-within .ff-icon{ stroke: var(--accent); }
  .ff-input-wrap:focus-within .ff-icon-text{ color: var(--accent); }

  /* ---- Descuento de producto: selector de tipo + valor + preview ----
     Mismo criterio visual que .nueva-venta-metodo-btn (grid de botones
     "chip", el activo con el dorado de acento), pero de a 3 en vez de 2. */
  .producto-descuento-tipo{ display:grid; grid-template-columns:1fr 1fr 1fr; gap:8px; margin-bottom:10px; }
  .producto-descuento-tipo-btn{
    padding:10px 6px; border-radius:10px; border:1px solid var(--line); background: var(--bg-panel-2);
    color: var(--text-dim); font-weight:700; font-size:0.78rem;
  }
  .producto-descuento-tipo-btn.active{ background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
  .producto-descuento-preview{
    margin-top:10px; font-size:0.82rem; color: var(--text-dim);
    background: var(--bg-panel-2); border-radius:8px; padding:8px 10px;
  }
  .producto-descuento-preview strong{ color: var(--accent); }
  .producto-descuento-preview-antes{ text-decoration:line-through; opacity:0.6; margin-left:4px; }

  .panel.panel-editando{
    border-color: var(--info);
    background: color-mix(in srgb, var(--info) 6%, var(--bg-panel));
  }
  .panel.panel-editando > h2{ color: var(--info); }
  .panel.panel-editando #btnAgregarTurno{ background: var(--info); color:#0e1a20; }

  /* ---- Selección de servicios en el form de turno ---- */
  .servicios-check{ display:flex; flex-direction:column; gap:8px; }
  .servicio-check-item{ display:flex; align-items:center; gap:10px; background: var(--bg-panel-2); border: 1px solid var(--line); border-radius: 8px; padding: 12px; cursor:pointer; }
  .servicio-check-item input[type="checkbox"]{ width: 20px; height:20px; min-height:auto; flex-shrink:0; accent-color: var(--accent); }
  .servicio-check-item .nombre{ flex:1; font-size:0.92rem; }
  .servicio-check-item .detalle{ color: var(--accent); font-weight:700; font-size:0.82rem; text-align:right; }
  .servicio-check-item .detalle small{ display:block; color: var(--text-dim); font-weight:400; font-size:0.72rem; }

  .total-row{ display:flex; justify-content:space-between; align-items:center; background: var(--bg-panel-2); border-radius: 8px; padding: 12px; font-size:0.92rem; gap:10px; }
  .total-row span:first-child{ flex-shrink:1; min-width:0; }
  .total-row .num{ font-weight:700; color: var(--accent); font-size:1rem; flex-shrink:1; min-width:0; max-width:60%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; text-align:right; }

  /* ---- Turnos list ---- */
  .filters{ display:flex; gap:8px; margin-bottom: 12px; flex-wrap: wrap; }
  .filters select, .filters input{ width: auto; flex:1; min-width: 130px; }
  .filters .date-trigger{ width: auto; flex:1; min-width: 130px; text-align:center; }

  .turno-card{ background: var(--bg-panel-2); border-radius: 10px; padding: 12px; margin-bottom: 8px; display:flex; flex-direction: column; gap: 8px; }
  .turno-card .cliente{ font-weight:600; font-size:0.98rem; }
  .turno-card .meta{ color: var(--text-dim); font-size: 0.8rem; margin-top:6px; }
  .turno-card .turno-info-row{ display:flex; align-items:center; gap:7px; flex-wrap:wrap; margin-top:6px; }
  .turno-card .info-chip{
    display:inline-flex; align-items:center; gap:5px;
    background: var(--accent-soft); color: var(--accent);
    font-size: 0.82rem; font-weight:700; letter-spacing:0.1px;
    padding: 4px 10px 4px 8px; border-radius: 20px; white-space:nowrap; line-height:1.3;
  }
  .turno-card .info-chip svg{ width:13px; height:13px; stroke:currentColor; fill:none; stroke-width:2; flex-shrink:0; }
  .turno-card .info-chip.precio-chip{ background: transparent; color: var(--text); font-weight:800; padding: 4px 2px; font-size:0.88rem; }
  .badge-row{ display:flex; gap:6px; flex-wrap:wrap; }
  .badge{ font-size: 0.66rem; font-weight:700; text-transform: uppercase; padding: 4px 9px; border-radius: 20px; white-space:nowrap; }
  .badge.pendiente{ background: var(--accent-soft); color: var(--accent); }
  .badge.completado{ background: var(--ok-soft); color: var(--ok); }
  .badge.cancelado{ background: var(--warn-soft); color: var(--warn); }
  .badge.pagado{ background: var(--ok-soft); color: var(--ok); }
  .badge.no-pagado{ background: var(--warn-soft); color: var(--warn); }
  .badge.info{ background: var(--info-soft); color: var(--info); }

  /* ---- Acciones rápidas de contacto (WhatsApp / Instagram) en la tarjeta de turno ---- */
  .contact-actions{ display:flex; gap:8px; margin-top:2px; }
  .contact-btn{
    flex:1; display:flex; align-items:center; justify-content:center; gap:6px;
    min-height:auto; padding:8px 10px; border-radius:9px; font-size:0.78rem; font-weight:700;
    background: var(--bg-panel); border:1px solid var(--line); color: var(--text);
  }
  .contact-btn svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:1.8; flex-shrink:0; }
  .contact-btn.wsp{ color:#3fd16a; border-color: rgba(63,209,106,0.35); }
  .contact-btn.wsp svg{ fill:currentColor; stroke:none; }
  .contact-btn.wsp:active{ background: rgba(63,209,106,0.12); }
  .contact-btn.ig{ color:#e07a5f; border-color: rgba(224,122,95,0.35); }
  .contact-btn.ig:active{ background: rgba(224,122,95,0.12); }
  /* ---- Encabezado de tarjeta + botón de opciones (menú flotante) ---- */
  .card-head{ display:flex; align-items:flex-start; justify-content:space-between; gap:10px; }
  .card-head > div:first-child{ min-width:0; flex:1; }
  .kebab-btn{
    background: var(--bg-panel); border: 1px solid var(--line); color: var(--text-dim);
    width: 34px; height: 34px; min-height:auto; padding:0; border-radius: 8px;
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
  }
  .kebab-btn:active{ color: var(--text); border-color: var(--text-dim); }
  .kebab-btn svg{ width:18px; height:18px; fill:currentColor; stroke:none; }

  .action-menu-backdrop{ position:fixed; inset:0; z-index:120; background:transparent; }
  .action-menu{
    position:fixed; z-index:121; min-width:224px; max-width: 270px;
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius: 14px;
    box-shadow: 0 12px 32px rgba(0,0,0,0.5); overflow:hidden; overflow-y:auto;
    /* Resta también la zona segura de arriba/abajo, si no un menú largo
       podía terminar con su límite de alto metido bajo el notch. */
    max-height: calc(100vh - var(--safe-top) - var(--safe-bottom) - 32px);
    opacity:0; transform: scale(0.96) translateY(-4px); transition: opacity 0.12s ease, transform 0.12s ease;
    padding: 6px;
  }
  .action-menu.show{ opacity:1; transform: scale(1) translateY(0); }
  .action-menu-item{
    display:flex; width:100%; align-items:center; gap:11px; text-align:left;
    background: transparent; border:none;
    color: var(--text); padding: 10px 10px; font-size: 0.85rem; font-weight:600;
    border-radius:9px; min-height: auto;
  }
  /* ---- Fila de una opción del menú: el botón principal + (opcional) un
     botoncito 🗑 aparte al lado, para poder borrar sin disparar la acción
     principal (ej. categorías de gasto creadas a mano). ---- */
  .action-menu-row{ display:flex; align-items:stretch; gap:4px; }
  .action-menu-row + .action-menu-row{ margin-top:1px; }
  .action-menu-row .action-menu-item{ flex:1; min-width:0; }
  .action-menu-delete-btn{
    flex-shrink:0; width:36px; display:flex; align-items:center; justify-content:center;
    background: transparent; border:none; border-radius:9px; color: var(--text-dim); padding:0;
  }
  .action-menu-delete-btn:active{ background: var(--warn-soft); color: var(--warn); }
  .action-menu-delete-btn svg{ width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .action-menu-item.action-menu-sep{ margin-top:7px; padding-top:11px; position:relative; }
  .action-menu-item.action-menu-sep::before{
    content:''; position:absolute; top:0; left:10px; right:10px; height:1px; background: var(--line);
  }
  /* ---- Secciones plegables dentro del menú (turno: Turno / Servicios / Estado
     / Pago / Zona de peligro): cada título es un botón que despliega/pliega
     sus propias opciones (acordeón — solo una sección abierta a la vez). ---- */
  .action-menu-group.con-separador{ margin-top:6px; padding-top:7px; position:relative; }
  .action-menu-group.con-separador::before{
    content:''; position:absolute; top:0; left:10px; right:10px; height:1px; background: var(--line);
  }
  .action-menu-group-header{
    display:flex; width:100%; align-items:center; justify-content:space-between; gap:8px;
    background:transparent; border:none; text-align:left; padding:9px 10px; margin:0;
    border-radius:9px; min-height:auto;
  }
  .action-menu-group-header:active{ background: var(--bg-panel); }
  .action-menu-group-label{
    font-size:0.65rem; font-weight:800; letter-spacing:0.05em; text-transform:uppercase;
    color: var(--text-dim);
  }
  .action-menu-group.expanded .action-menu-group-label{ color: var(--text); }
  .action-menu-group-chevron{
    width:14px; height:14px; flex-shrink:0; stroke: var(--text-dim); fill:none;
    stroke-width:2.4; stroke-linecap:round; stroke-linejoin:round;
    transition: transform 0.15s ease;
  }
  .action-menu-group.expanded .action-menu-group-chevron{ transform: rotate(90deg); stroke: var(--text); }
  .action-menu-group-body{
    max-height:0; overflow:hidden; transition: max-height 0.18s ease;
  }
  .action-menu-group.expanded .action-menu-group-body{ max-height: 480px; }
  .action-menu-item:active{ background: var(--bg-panel); }
  .action-menu-icon{
    width:30px; height:30px; border-radius:9px; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    background: var(--bg-panel); color: var(--text-dim);
  }
  .action-menu-icon svg{ width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .action-menu-label{ flex:1; min-width:0; }

  .action-menu-item.ok{ color: var(--ok); }
  .action-menu-item.ok .action-menu-icon{ background: var(--ok-soft); color: var(--ok); }
  .action-menu-item.ok:active{ background: var(--ok-soft); }

  .action-menu-item.info{ color: var(--info); }
  .action-menu-item.info .action-menu-icon{ background: var(--info-soft); color: var(--info); }
  .action-menu-item.info:active{ background: var(--info-soft); }

  .action-menu-item.warn{ color: var(--warn); }
  .action-menu-item.warn .action-menu-icon{ background: var(--warn-soft); color: var(--warn); }
  .action-menu-item.warn:active{ background: var(--warn-soft); }

  .action-menu-item.accent{ color: var(--accent); }
  .action-menu-item.accent .action-menu-icon{ background: var(--accent-soft); color: var(--accent); }
  .action-menu-item.accent:active{ background: var(--accent-soft); }

  /* ---- Check de la opción seleccionada (ej. selector de categoría de gasto) ---- */
  .action-menu-check{ color: var(--accent); font-weight:800; font-size:0.9rem; flex-shrink:0; margin-left:4px; }

  /* ---- Botón que reemplaza al <select> nativo de categoría (ver Gastos):
     mismo tamaño/look que un input, pero con ícono + nombre de la categoría
     y una flecha, y abre el menú flotante de categorías en vez del picker
     feo del sistema operativo. ---- */
  .categoria-trigger{
    display:flex; align-items:center; gap:8px; width:100%; text-align:left;
    background: var(--bg-panel-2); border: 1px solid var(--line); color: var(--text);
    border-radius: 8px; padding: 8px 10px; font-size: 0.95rem; min-height: 46px; font-family: inherit; font-weight:600;
  }
  .categoria-trigger:active{ border-color: var(--accent); }
  .categoria-trigger-icon{
    width:26px; height:26px; border-radius:7px; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    background: var(--bg-panel); color: var(--text-dim);
  }
  .categoria-trigger-icon svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .categoria-trigger-label{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .categoria-trigger-chevron{ width:18px; height:18px; flex-shrink:0; stroke: var(--text-dim); fill:none; stroke-width:2.3; stroke-linecap:round; stroke-linejoin:round; }

  .toolbar{ display:flex; flex-direction: column; gap: 8px; margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line); }
  /* Dentro de "Respaldo y sincronización" (7.2): acá .toolbar es el único
     contenido de la pantalla (además del .config-hint de arriba), así que
     no hace falta el margen/borde superior de arriba — pensado para cuando
     el toolbar colgaba suelto al pie de toda la pestaña "Más". El espaciado
     ya lo da el gap:16px de .config-seccion-body y el margin-bottom de
     .config-hint. Un divisor con nada que separar arriba se veía como un
     hueco vacío de más. */
  .config-seccion-body .toolbar{ margin-top:0; padding-top:0; border-top:none; }
  .novedad-item{ padding: 12px 0; border-bottom: 1px solid var(--line); }
  .novedad-item:last-child{ border-bottom: none; }
  .novedad-item-head{ display:flex; align-items:baseline; gap:8px; margin-bottom:6px; }
  .novedad-item-version{ font-weight:700; font-size:0.9rem; color: var(--accent); }
  .novedad-item-fecha{ font-size:0.72rem; color: var(--text-dim); }
  .novedad-item ul{ margin:0; padding-left:18px; }
  .novedad-item li{ font-size:0.84rem; color: var(--text-dim); line-height:1.5; }
  .version-footer{ text-align:center; font-size:0.72rem; color: var(--text-dim); padding-top:12px; }
  .toolbar-left{ display:flex; gap:8px; }
  .toolbar-left button{ flex:1; }

  #toast{
    position: fixed; bottom: calc(78px + env(safe-area-inset-bottom)); left: 12px; right: 12px;
    background: var(--bg-panel-2); border: 1px solid var(--accent); color: var(--text);
    padding: 12px 16px; border-radius: 10px; font-size: 0.85rem;
    opacity: 0; transform: translateY(20px); transition: all 0.25s ease;
    pointer-events:none; text-align:center;
    /* Por encima de CUALQUIER overlay/modal (notas, ficha de cliente, perfil,
       confirmación) — un toast es un aviso momentáneo y siempre tiene que
       verse, sin importar qué pantalla o ventana esté abierta arriba. */
    z-index: 300;
  }
  #toast.show{ opacity:1; transform: translateY(0); }
  /* Toast con botón de acción (ej: "Deshacer" al cobrar el carrito, 4.5) —
     a diferencia del toast normal (de solo texto, no clickeable), este sí
     necesita recibir toques. */
  #toast.con-accion{
    display:flex; align-items:center; justify-content:space-between; gap:10px;
    text-align:left; pointer-events:auto;
  }
  #toast .toast-msg{ flex:1; min-width:0; }
  #toast .toast-accion-btn{
    flex-shrink:0; background:none; border:none; color: var(--accent);
    font-weight:700; font-size:0.85rem; padding:4px 6px; cursor:pointer;
  }

  ::-webkit-scrollbar{ width: 8px; }
  ::-webkit-scrollbar-thumb{ background: var(--line); border-radius: 8px; }

  /* ---- Modal de confirmación ---- */
  .modal-overlay{
    position: fixed; inset: 0; background: rgba(10,11,13,0.72);
    display:flex; align-items:flex-end; justify-content:center;
    /* Tiene que quedar por encima de la ficha de cliente / perfil (z-index
       210): la confirmación de "Cerrar sesión" se dispara desde ahí y antes
       quedaba tapada por ese panel. */
    z-index: 220; opacity:0; pointer-events:none; transition: opacity 0.2s ease;
    padding: 0;
  }
  .modal-overlay.show{ opacity:1; pointer-events:auto; }
  .modal-box{
    width:100%; max-width: 480px; background: var(--bg-panel);
    border: 1px solid var(--line); border-radius: 16px 16px 0 0;
    padding: 20px 18px calc(18px + env(safe-area-inset-bottom));
    transform: translateY(16px); transition: transform 0.2s ease;
    box-shadow: 0 -8px 30px rgba(0,0,0,0.4);
    /* Si el contenido (ej: varias versiones juntas en "Novedades") es más
       alto que la pantalla, la caja ya no sigue creciendo sin límite: se
       frena a los 85% del alto visible y es .modal-msg quien scrollea
       puertas adentro (ver más abajo), dejando título y botones siempre
       visibles arriba y abajo. */
    max-height: 85vh;
    display: flex;
    flex-direction: column;
  }
  .modal-overlay.show .modal-box{ transform: translateY(0); }
  /* Mismo motivo que en .cliente-detalle-overlay (ver esa nota, más arriba):
     en compu la sidebar tiene que quedar siempre clickeable, así que este
     fondo oscurecido tampoco puede taparla. */
  @media (min-width: 860px){
    .modal-overlay{ left: var(--sidebar-w); }
  }
  .modal-icon{
    width: 40px; height: 40px; border-radius: 50%;
    background: var(--warn-soft); color: var(--warn);
    display:flex; align-items:center; justify-content:center;
    font-size: 1.1rem; font-weight:800; margin-bottom: 10px;
    flex: 0 0 auto;
  }
  .modal-title{ font-size: 1rem; font-weight:700; margin: 0 0 6px; flex: 0 0 auto; }
  .modal-msg{
    font-size: 0.88rem; color: var(--text-dim); line-height:1.45; margin: 0 0 18px;
    /* flex:1 1 auto + min-height:0 es lo que le permite a este bloque (y no
       a toda la caja) quedarse con el espacio sobrante y scrollear ahí
       adentro en vez de empujar los botones fuera de pantalla. */
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
  }
  .modal-msg strong{ color: var(--text); font-weight:600; }
  .modal-actions{ display:flex; gap:10px; flex: 0 0 auto; }
  .modal-actions button{ flex:1; }
  .modal-actions-col{ flex-direction: column; gap:8px; }

  /* ---- Checkbox dentro de un modal (ej: "Repone el stock" en Devoluciones) ---- */
  .modal-check-row{
    display:flex; align-items:flex-start; gap:10px;
    background: var(--bg-panel-2); border-radius:10px; padding:12px;
    cursor:pointer; user-select:none;
  }
  .modal-check-row input[type="checkbox"]{ width:20px; height:20px; min-height:auto; flex-shrink:0; accent-color: var(--accent); margin:1px 0 0; }
  .modal-check-row span{ font-size:0.85rem; color: var(--text); line-height:1.35; }

  /* ---- Buscador dentro de un modal (ej: filtrar por cliente en Devoluciones) ---- */
  .modal-search-field{ margin: 0 0 12px; flex: 0 0 auto; }
  .modal-search-field input{ text-align:left; font-size:0.88rem; font-weight:500; }

  /* ---- Selector en árbol de categorías (Paso 2, modal #modalCategoriaArbolOverlay) ----
     Tamaño y scroll del breadcrumb y la lista, copiado del mismo patrón que
     .modal-search-field (arriba) y .huecos-list / .devoluciones-ventas-list
     (abajo). El contenido de ambos lo arma el JS (ver renderCategoriaArbol
     en app.js). */
  .categoria-arbol-breadcrumb{ display:flex; flex-wrap:wrap; align-items:center; gap:4px; margin: 0 0 12px; flex: 0 0 auto; }
  .categoria-arbol-hint{ color: var(--text-dim); font-size:0.74rem; line-height:1.35; margin: -6px 0 10px; flex: 0 0 auto; }
  .categoria-arbol-list{ display:flex; flex-direction:column; gap:8px; margin: 4px 0 6px; max-height: 360px; overflow-y:auto; padding-right:2px; flex: 1 1 auto; min-height:0; }

  /* Migas de pan: cada nivel del camino hasta la categoría actual. La
     última (el nivel en el que se está parado) queda fija en vez de ser un
     botón — no tiene sentido "volver" al lugar en el que ya se está. */
  .categoria-arbol-crumb{
    background: var(--bg-panel-2); border: 1px solid var(--line); color: var(--text-dim);
    border-radius: 8px; padding: 5px 10px; font-size: 0.78rem; font-weight:600;
    min-height:auto; white-space:nowrap; max-width: 140px; overflow:hidden; text-overflow:ellipsis;
  }
  .categoria-arbol-crumb:active{ border-color: var(--accent); color: var(--accent); }
  .categoria-arbol-crumb.active,
  .categoria-arbol-crumb:disabled{
    background: var(--accent-soft); border-color: var(--accent); color: var(--accent); cursor:default;
  }
  .categoria-arbol-crumb-sep{ color: var(--text-dim); font-size:0.78rem; flex-shrink:0; }

  /* Filas de la lista: cada una es una categoría del nivel actual, con dos
     botones hermanos — el principal entra a ver sus subcategorías (ver
     onClickLista en app.js; no elige nada todavía, para eso está "Usar
     esta categoría...") y el kebab (⋮) abre renombrar/borrar (ver
     onClickOpciones). */
  .categoria-arbol-row{
    display:flex; align-items:stretch; gap:8px; width:100%; border-radius:10px;
    transition: box-shadow 0.12s ease;
  }
  .categoria-arbol-row-main{
    display:flex; align-items:center; gap:10px; width:100%; flex:1; min-width:0;
    background: var(--bg-panel-2); border: 1px solid var(--line); border-radius: 10px;
    padding: 12px 12px; min-height:auto; text-align:left;
    /* Antes esto era "pan-y" y recién se ponía en "none" desde JS al activar
       el arrastre (ver activarDrag en app.js). El problema: el navegador fija
       qué gestos permite (touch-action) en el momento del toque inicial, NO
       lo vuelve a evaluar durante ese mismo toque — así que cambiarlo 380ms
       después (cuando se cumple el pulsado largo) no tenía ningún efecto: el
       toque ya había arrancado como "pan-y", y en cuanto el dedo se movía lo
       suficiente el navegador terminaba tomando el gesto como scroll de la
       lista por su cuenta y cancelaba el arrastre (pointercancel) antes de
       soltar sobre el destino. Por eso el arrastre no se sentía roto todo el
       tiempo: activaba (vibración, la fila se levantaba) pero se cortaba solo
       al mover el dedo. Con "none" fijo desde el vamos, el toque nunca queda
       habilitado para que el navegador lo scrollee solo — el scroll de la
       lista en un toque corto (antes de que se cumpla el pulsado largo) ahora
       lo hace a mano el JS (ver el pointermove de acá abajo en app.js).*/
    touch-action: none; user-select:none; -webkit-user-select:none;
    -webkit-touch-callout: none;
    transition: border-color 0.12s ease, background-color 0.12s ease;
  }
  /* transform:none: mismo motivo que .categoria-header:active en Ventas
     (ver esa nota más arriba en este archivo) — sin esto, la regla
     genérica `button:active{transform:scale(0.96)}` de más abajo hacía que
     esta fila se viera "aplastada" apenas se la mantenía presionada,
     compitiendo encima con el `transform` que le pone JS a la fila
     (dragFila, el div padre) mientras se arrastra. */
  .categoria-arbol-row-main:active{ border-color: var(--accent); transform:none; }
  .categoria-arbol-row .kebab-btn{ flex-shrink:0; align-self:center; }
  .categoria-arbol-row-nombre{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:0.9rem; font-weight:600; color: var(--text); }
  .categoria-arbol-row-count{
    flex-shrink:0; background: var(--accent-soft); color: var(--accent);
    border-radius: 20px; padding: 2px 8px; font-size: 0.7rem; font-weight:700;
  }
  .categoria-arbol-row-chevron{ flex-shrink:0; width:18px; height:18px; stroke: var(--text-dim); fill:none; stroke-width:2.3; stroke-linecap:round; stroke-linejoin:round; }

  /* ---- Arrastre de una fila del árbol (reordenar / anidar) ----
     .arrastrando: la fila que se está sujetando en este momento — se
     levanta un poco (sombra + z-index) y sigue al dedo con `transform`
     puesto directamente desde JS (ver dragFila.style.transform en
     abrirSelectorCategoriaArbol). .drag-sobre-antes / -despues: línea de
     inserción arriba o abajo de la fila que está debajo del dedo ahora
     mismo, para reordenar. .drag-sobre-dentro: resalta toda la fila de
     destino cuando soltar ahí la convertiría en su subcategoría en vez de
     reordenarla. Estas tres últimas se recalculan en cada pointermove, así
     que nunca conviven con .arrastrando en la misma fila (se filtra a sí
     misma, ver calcularObjetivoDrag). */
  .categoria-arbol-row.arrastrando{ position:relative; z-index:5; }
  .categoria-arbol-row.arrastrando .categoria-arbol-row-main{
    border-color: var(--accent); box-shadow: 0 8px 20px rgba(0,0,0,0.35); opacity:0.97;
  }
  .categoria-arbol-row.drag-sobre-antes{ box-shadow: inset 0 2px 0 0 var(--accent); }
  .categoria-arbol-row.drag-sobre-despues{ box-shadow: inset 0 -2px 0 0 var(--accent); }
  .categoria-arbol-row.drag-sobre-dentro .categoria-arbol-row-main{
    border-color: var(--accent); background: var(--accent-soft);
  }

  /* Input inline para crear una subcategoría dentro del nivel actual, sin
     salir del modal (aparece al tocar "+ Nueva subcategoría acá adentro"). */
  .categoria-arbol-nueva-row{ display:flex; gap:8px; margin: 0 0 10px; flex: 0 0 auto; }
  .categoria-arbol-nueva-row input{ flex:1; text-align:left; font-size:0.88rem; font-weight:500; }
  .categoria-arbol-nueva-row .btn-primary{ flex-shrink:0; width:auto; }

  /* ---- Devoluciones: historial de ventas de un producto, con acción de devolver ---- */
  .devoluciones-ventas-list{ display:flex; flex-direction:column; margin: 4px 0 6px; max-height: 360px; overflow-y:auto; padding-right:2px; flex: 1 1 auto; min-height:0; }
  .venta-hist-row{ display:flex; align-items:center; justify-content:space-between; gap:10px; background: var(--bg-panel-2); border-radius: 10px; padding: 10px 12px; margin-bottom:8px; }
  .venta-hist-info{ flex:1; min-width:0; }
  .venta-hist-top{ display:flex; align-items:center; justify-content:space-between; gap:8px; }
  .venta-hist-cant{ font-size:0.86rem; font-weight:700; color: var(--text); }
  .venta-hist-monto{ font-size:0.86rem; font-weight:700; color: var(--ok); white-space:nowrap; }
  .venta-hist-meta{ font-size:0.72rem; color: var(--text-dim); margin-top:2px; }
  .venta-hist-row .btn-small{ flex-shrink:0; }

  /* ---- Modal de "cerrar caja" ---- */
  .cierre-caja-fecha{ font-size:0.78rem; color: var(--text-dim); text-transform: capitalize; margin: 0 0 10px; flex: 0 0 auto; }
  .cierre-caja-row{ display:flex; justify-content:space-between; align-items:center; padding: 9px 0; border-bottom: 1px solid var(--line); font-size:0.86rem; }
  .cierre-caja-row:last-child{ border-bottom: none; }
  .cierre-caja-row .ccj-lbl{ color: var(--text-dim); }
  .cierre-caja-row .ccj-val{ font-weight:700; color: var(--text); white-space:nowrap; }
  .cierre-caja-row-total{ margin-top: 4px; padding-top: 12px; border-top: 1px dashed var(--line); border-bottom: none; }
  .cierre-caja-row-total .ccj-lbl{ color: var(--text); font-weight:600; }
  .cierre-caja-row-total .ccj-val{ font-size:0.95rem; }

  @media (min-width: 480px){
    .modal-overlay{ align-items:center; }
    .modal-box{ border-radius: 16px; }
  }

  /* ---- Página de notas y tareas pendientes (pantalla aparte) ----
     Tema "libreta/agenda": la franja de ancladas imita notitas prendidas con
     un alfiler (ligera rotación por nota, como en un corcho), y el resto se
     agrupa en secciones (Vencidas / Hoy / Próximas / Sin fecha / Completadas)
     en vez de una lista plana, para que se entienda de un vistazo qué es
     urgente sin tener que leer nota por nota. */
  .notas-page-overlay{
    position: fixed; inset: 0; background: var(--bg);
    z-index: 90; transform: translateX(100%); transition: transform 0.25s ease;
    display:flex; flex-direction:column; visibility:hidden;
  }
  .notas-page-overlay.show{ transform: translateX(0); visibility:visible; }
  @media (min-width: 860px){
    .notas-page-overlay{ left: var(--sidebar-w); }
  }
  .notas-page{
    flex:1; overflow-y:auto; width:100%; max-width:var(--wrap-max); margin:0 auto;
    padding: calc(16px + env(safe-area-inset-top)) 12px calc(28px + env(safe-area-inset-bottom));
    display:flex; flex-direction:column;
  }
  .notas-page-header{ display:flex; align-items:center; gap:10px; margin-bottom:6px; }
  .notas-page-header h2{ flex:1; font-size:1.05rem; font-weight:800; margin:0; color: var(--text); }
  .notas-back-btn, .notas-clear-btn{
    width:36px; height:36px; min-height:auto; padding:0; border-radius:50%;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
    transition: color 0.15s ease, border-color 0.15s ease;
  }
  .notas-back-btn svg, .notas-clear-btn svg{ width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:1.8; }
  .notas-back-btn:active{ color: var(--accent); border-color: var(--accent); }
  .notas-clear-btn:active{ color: var(--warn); border-color: var(--warn); }

  .notas-resumen{ color: var(--text-dim); font-size:0.8rem; margin: 0 0 14px 2px; min-height: 1em; }

  .notas-add-form{
    position: relative; overflow:hidden; flex-shrink:0;
    background: linear-gradient(165deg, var(--bg-panel), var(--bg-panel-2));
    border:1px solid var(--line); border-radius: calc(var(--radius) + 4px);
    padding:14px; margin-bottom:18px; display:flex; flex-direction:column; gap:11px;
    box-shadow: 0 6px 18px -12px rgba(0,0,0,0.5);
    transition: border-color 0.15s ease;
  }
  /* Filito dorado arriba, como el canto de una libreta forrada */
  .notas-add-form::before{
    content:''; position:absolute; top:0; left:0; right:0; height:2px;
    background: linear-gradient(90deg, transparent, var(--accent), transparent);
    opacity:0.55;
  }
  .notas-add-form:focus-within{ border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); }
  .notas-add-input-wrap textarea{
    margin:0; width:100%; resize:none; overflow:hidden;
    min-height:44px; max-height:220px; padding:10px 12px;
    font-family:inherit; font-size:0.92rem; line-height:1.4; color: var(--text);
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius:12px;
    transition: border-color 0.15s ease, background 0.15s ease;
  }
  .notas-add-input-wrap textarea::placeholder{ color: var(--text-dim); }
  .notas-add-input-wrap textarea:focus{
    outline:none; border-color: var(--accent); background: var(--bg-panel);
  }
  .notas-add-opciones{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; justify-content:space-between; }
  .notas-prioridad-chips{ display:flex; gap:6px; }
  .prio-chip{
    display:inline-flex; align-items:center; gap:6px;
    min-height:auto; padding:6px 11px 6px 9px; border-radius: 20px; font-size:0.72rem; font-weight:700;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
  }
  .prio-chip .prio-dot{ width:7px; height:7px; border-radius:50%; background: currentColor; flex-shrink:0; opacity:0.8; }
  .prio-chip.normal .prio-dot{ background: var(--text-dim); }
  .prio-chip.importante .prio-dot{ background: var(--info); }
  .prio-chip.urgente .prio-dot{ background: var(--warn); }
  .prio-chip.active{ border-color: currentColor; }
  .prio-chip.normal.active{ color: var(--text); background: var(--bg-panel); border-color: var(--text-dim); }
  .prio-chip.importante.active{ color: var(--info); background: var(--info-soft); }
  .prio-chip.urgente.active{ color: var(--warn); background: var(--warn-soft); }
  .prio-chip.active .prio-dot{ opacity:1; box-shadow: 0 0 0 3px color-mix(in srgb, currentColor 22%, transparent); }

  .notas-fecha-btn{
    display:inline-flex; align-items:center; gap:6px;
    width:auto; min-height:auto; padding:6px 12px 6px 10px; font-size:0.75rem; margin:0;
    border-radius:20px; background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    transition: color 0.15s ease, border-color 0.15s ease, background 0.15s ease;
  }
  .notas-fecha-btn svg{ width:14px; height:14px; stroke:currentColor; fill:none; stroke-width:1.8; flex-shrink:0; }
  .notas-fecha-btn.set{ color: var(--accent); background: var(--accent-soft); border-color: var(--accent); }

  .notas-filtros{ display:flex; gap:6px; margin-bottom:14px; background: var(--bg-panel-2); border:1px solid var(--line); border-radius:12px; padding:4px; }
  .filtro-chip{
    flex:1; min-height:auto; padding:8px 6px; border-radius:9px; font-size:0.75rem; font-weight:700;
    background: transparent; border:1px solid transparent; color: var(--text-dim);
    transition: background 0.15s ease, color 0.15s ease;
  }
  .filtro-chip.active{ background: var(--accent); border-color: transparent; color:#201400; }

  /* ---- Estadísticas: selector de pestañas (Balance/Ingresos/Gastos/Resumen
       general), reusa .notas-filtros/.filtro-chip. "Resumen general" es más
       largo que el resto de las etiquetas que usa ese patrón en otros lados
       de la app, así que acá el chip baja un poco el padding/tamaño de letra
       para que las 4 entren cómodas en una fila sin achicar el patrón base. ---- */
  .estad-tabs .filtro-chip{ padding:8px 4px; font-size:0.68rem; }

  .notas-list{ display:flex; flex-direction:column; gap:8px; flex:1; }

  /* ---- Franja de ancladas: notitas "prendidas" con un leve giro, como en un corcho ---- */
  .notas-pin-strip-wrap{ margin-bottom: 4px; }
  .notas-pin-strip-titulo{
    display:flex; align-items:center; gap:6px; font-size:0.7rem; font-weight:800;
    text-transform:uppercase; letter-spacing:0.5px; color: var(--accent); margin: 0 2px 10px;
  }
  .notas-pin-strip-titulo svg{ width:13px; height:13px; fill: var(--accent); stroke:none; }
  .notas-pin-strip{
    display:flex; gap:12px; overflow-x:auto; padding: 4px 4px 12px; margin: 0 -4px 6px;
    scroll-snap-type: x proximity; -webkit-overflow-scrolling:touch;
  }
  .notas-pin-strip::-webkit-scrollbar{ display:none; }
  .notas-pin-strip .nota-item{
    flex: 0 0 auto; width: 176px; scroll-snap-align:start;
    flex-direction:column; align-items:stretch; gap:8px; padding:12px 12px 10px;
    box-shadow: 0 6px 14px rgba(0,0,0,0.28);
  }
  .notas-pin-strip .nota-item:nth-child(3n+1){ transform: rotate(-1.6deg); }
  .notas-pin-strip .nota-item:nth-child(3n+2){ transform: rotate(1.3deg); }
  .notas-pin-strip .nota-item:nth-child(3n){ transform: rotate(-0.7deg); }
  .notas-pin-strip .nota-item:active{ transform: rotate(0deg) scale(0.97); }
  .notas-pin-strip .nota-check-wrap{ margin:-4px 0 0 -4px; padding:4px; }
  .notas-pin-strip .nota-texto{ -webkit-line-clamp:4; display:-webkit-box; -webkit-box-orient:vertical; overflow:hidden; }
  .notas-pin-strip .nota-acciones{ position:absolute; top:6px; right:6px; }

  /* ---- Secciones agrupadas (Vencidas / Hoy / Próximas / Sin fecha / Completadas) ---- */
  .notas-grupo{ display:flex; flex-direction:column; gap:8px; margin-bottom:16px; }
  .notas-grupo:last-child{ margin-bottom:0; }
  .notas-grupo-titulo{
    display:flex; align-items:center; gap:8px; font-size:0.7rem; font-weight:800;
    text-transform:uppercase; letter-spacing:0.5px; color: var(--text-dim); margin: 0 2px 2px;
  }
  .notas-grupo-titulo::after{ content:''; flex:1; height:1px; background: var(--line); }
  .notas-grupo-titulo .cant{ font-weight:700; opacity:0.7; }
  .notas-grupo.vencidas .notas-grupo-titulo{ color: var(--warn); }
  .notas-grupo.hoy .notas-grupo-titulo{ color: var(--accent); }
  .notas-grupo.completadas{ opacity:0.75; }
  .notas-grupo.completadas .notas-grupo-titulo{ color: var(--ok); }

  .nota-item{
    position:relative;
    display:flex; align-items:flex-start; gap:6px; background: var(--bg-panel);
    border:1px solid var(--line); border-left: 3px solid var(--line);
    border-radius:10px; padding:9px 10px 9px 12px;
    transition: background 0.15s ease, border-color 0.15s ease, opacity 0.2s ease, transform 0.15s ease;
  }
  .nota-item.prio-importante{ border-left-color: var(--info); }
  .nota-item.prio-urgente{ border-left-color: var(--warn); }
  .nota-item.hecho{ opacity:0.58; }
  .nota-item.seleccionada{ background: var(--accent-soft); border-color: var(--accent); }
  .nota-check-wrap{ display:flex; align-items:flex-start; padding:8px 6px 8px 0; margin:-8px 0 -8px -8px; flex-shrink:0; }

  /* Checkbox "de completar" a medida, en vez del tilde nativo del navegador.
     El tilde es un SVG centrado con background-position (antes era un truco de
     dos bordes rotados -45deg que, por tener ancho y alto distintos, nunca
     terminaba de quedar centrado dentro del círculo). */
  .nota-checkbox{
    appearance:none; -webkit-appearance:none; width:24px; height:24px; min-height:24px; flex-shrink:0; margin:0; padding:0;
    border-radius:50%; border:2px solid var(--line); background-color: var(--bg-panel-2);
    background-repeat:no-repeat; background-position:center; background-size:13px 13px;
    display:inline-block; position:relative; cursor:pointer;
    transition: background-color 0.15s ease, border-color 0.15s ease;
  }
  .nota-checkbox:checked{
    background-color: var(--ok); border-color: var(--ok);
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2316181c' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><path d='M4 12l6 6L20 6'/></svg>");
  }

  .nota-select-checkbox{
    display:none; width:24px; height:24px; margin: 2px 4px 0 -2px; flex-shrink:0; accent-color: var(--accent);
  }
  .nota-cuerpo{ flex:1; min-width:0; }
  .nota-texto{ font-size:0.9rem; line-height:1.35; word-break:break-word; }
  /* Evita el menú nativo de copiar/seleccionar del celular al mantener presionado el texto en la lista.
     Dentro de la nota "aumentada" (hoja de detalle) esto NO aplica: ahí se puede seleccionar y copiar normal. */
  .nota-texto{
    user-select:none; -webkit-user-select:none; -webkit-touch-callout:none;
  }
  .nota-item.hecho .nota-texto{ text-decoration: line-through; color: var(--text-dim); }
  .nota-meta{ display:flex; flex-wrap:wrap; gap:6px; margin-top:7px; }
  .nota-fecha-chip{
    display:inline-flex; align-items:center; gap:4px;
    font-size:0.66rem; font-weight:700; padding:2px 7px; border-radius:8px; background: var(--bg-panel-2); color: var(--text-dim);
  }
  .nota-fecha-chip.vencida{ background: var(--warn-soft); color: var(--warn); }
  .nota-prio-chip{ font-size:0.66rem; font-weight:800; padding:2px 7px; border-radius:8px; text-transform:uppercase; letter-spacing:0.3px; }
  .nota-prio-chip.importante{ background: var(--info-soft); color: var(--info); }
  .nota-prio-chip.urgente{ background: var(--warn-soft); color: var(--warn); }
  .nota-acciones{
    display:flex; flex-direction:column; align-items:center; gap:0; flex-shrink:0;
    user-select:none; -webkit-user-select:none; -webkit-touch-callout:none; touch-action:manipulation;
  }
  .nota-pin{
    background:none; border:none; color: var(--text-dim); font-size:1.3rem; line-height:1;
    padding:8px; flex-shrink:0; min-height:44px; min-width:44px;
    display:flex; align-items:center; justify-content:center;
    user-select:none; -webkit-user-select:none; -webkit-touch-callout:none; touch-action:manipulation;
    transition: color 0.15s ease, transform 0.15s ease;
  }
  .nota-pin{ font-size:1.5rem; }
  .nota-pin.pinned{ color: var(--accent); transform: rotate(0deg); }
  .nota-pin:active{ color: var(--accent); }

  .notas-empty{
    display:flex; flex-direction:column; align-items:center; gap:10px;
    text-align:center; color: var(--text-dim); font-size:0.85rem; padding:44px 20px;
  }
  .notas-empty svg{ width:34px; height:34px; stroke: var(--line); fill:none; stroke-width:1.4; }
  .notas-empty strong{ color: var(--text); font-size:0.9rem; font-weight:700; }

  /* ---- Selección múltiple estilo Gmail (mantener pulsado) ----
     En este modo se renderiza todo como lista plana (sin franja de ancladas
     ni secciones), así que estas reglas alcanzan con apuntar a .nota-item. */
  .notas-page.seleccionando .notas-add-form,
  .notas-page.seleccionando .notas-filtros{ display:none; }
  .notas-page.seleccionando .nota-check-wrap{ display:none; }
  .notas-page.seleccionando .nota-select-checkbox{ display:block; pointer-events:none; }
  .notas-page.seleccionando .nota-acciones{ display:none; }
  .notas-page.seleccionando .nota-item{
    cursor:pointer; user-select:none; -webkit-user-select:none; -webkit-tap-highlight-color:transparent;
    min-height:52px; padding:14px 12px 14px 12px; touch-action: pan-y;
    transform:none !important;
  }
  .notas-page.seleccionando .nota-item:active{ background: var(--bg-panel-2); }
  .notas-borrar-sel-btn{ color: var(--warn); border-color: var(--warn); }
  .notas-borrar-sel-btn:active{ background: var(--warn-soft); }
  .notas-seleccionar-todas-btn.activo{ color: var(--accent); border-color: var(--accent); }
  .notas-seleccionar-todas-btn:active{ background: var(--accent-soft); }

  /* ---- Vista completa de una nota (hoja) ---- */
  .nota-detalle-overlay{
    position: fixed; inset: 0; background: rgba(10,11,13,0.72);
    display:flex; align-items:flex-end; justify-content:center;
    z-index: 110; opacity:0; pointer-events:none; transition: opacity 0.2s ease;
  }
  .nota-detalle-overlay.show{ opacity:1; pointer-events:auto; }
  .nota-detalle-sheet{
    width:100%; max-width:520px; background: var(--bg-panel);
    border:1px solid var(--line); border-radius:18px 18px 0 0;
    padding: 8px 18px calc(20px + env(safe-area-inset-bottom));
    transform: translateY(24px); transition: transform 0.22s ease;
    max-height: 82vh; display:flex; flex-direction:column;
    box-shadow: 0 -8px 30px rgba(0,0,0,0.4);
  }
  .nota-detalle-overlay.show .nota-detalle-sheet{ transform: translateY(0); }
  .nota-detalle-sheet.dragging{ transition:none; }
  .nota-detalle-handle{
    width:36px; height:4px; border-radius:3px; background: var(--line); margin: 4px auto 14px;
    cursor:grab; touch-action:none;
  }
  .nota-detalle-top{
    display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:12px;
    touch-action:none; user-select:none; -webkit-user-select:none;
  }
  .nota-detalle-chip{
    display:inline-flex; align-items:center; gap:6px;
    font-size:0.68rem; font-weight:800; padding:4px 12px 4px 10px; border-radius:20px; min-height:auto;
    background: var(--bg-panel-2); color: var(--text-dim); text-transform:uppercase; letter-spacing:0.02em;
  }
  .nota-detalle-chip .dot{ width:7px; height:7px; border-radius:50%; background: currentColor; }
  .nota-detalle-chip:active{ filter: brightness(0.9); }
  .nota-detalle-chip.prio-importante{ background: var(--info-soft); color: var(--info); }
  .nota-detalle-chip.prio-urgente{ background: var(--warn-soft); color: var(--warn); }
  .nota-detalle-cerrar{
    width:34px; height:34px; min-height:auto; padding:0; border-radius:50%;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center; flex-shrink:0;
  }
  .nota-detalle-cerrar svg{ width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2; }
  .nota-detalle-cerrar:active{ color: var(--accent); border-color: var(--accent); }
  .nota-detalle-texto{
    font-size:1.02rem; line-height:1.55; color: var(--text); overflow-y:auto;
    padding-bottom:4px; word-break:break-word; white-space:pre-wrap;
  }
  .nota-detalle-texto.hecho{ text-decoration: line-through; color: var(--text-dim); }

  /* ---- Modo edición: reemplaza el texto por un textarea real con su propia
     barra de acciones (Cancelar / Guardar), en vez de editar in-place con
     contenteditable y mezclar "Guardar" como un botón más del grid de abajo. ---- */
  .nota-detalle-textarea{
    display:none; width:100%; box-sizing:border-box; font-family:inherit;
    font-size:1.02rem; line-height:1.55; color: var(--text);
    background: var(--bg-panel-2); border:1.5px solid var(--accent); border-radius:12px;
    padding:12px 14px; resize:vertical; min-height:120px; max-height:42vh;
  }
  .nota-detalle-textarea:focus{ outline:none; }
  .nota-detalle-sheet.editando .nota-detalle-texto{ display:none; }
  .nota-detalle-sheet.editando .nota-detalle-textarea{ display:block; }
  .nota-detalle-sheet.editando .nota-detalle-meta,
  .nota-detalle-sheet.editando .nota-detalle-acciones,
  .nota-detalle-sheet.editando .nota-detalle-borrar-full{ display:none; }
  .nota-detalle-edit-bar{ display:none; gap:10px; margin-top:16px; }
  .nota-detalle-sheet.editando .nota-detalle-edit-bar{ display:flex; }
  .nota-detalle-edit-cancelar, .nota-detalle-edit-guardar{
    flex:1; display:flex; align-items:center; justify-content:center; gap:6px;
    border-radius:12px; padding:14px 10px; font-size:0.92rem; font-weight:700;
    min-height:auto; transition: background 0.15s ease, filter 0.15s ease;
  }
  .nota-detalle-edit-cancelar{ background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim); }
  .nota-detalle-edit-cancelar:active{ background: var(--bg); }
  .nota-detalle-edit-guardar{ background: var(--accent); border:1px solid transparent; color:#201400; }
  .nota-detalle-edit-guardar:active{ filter: brightness(0.93); }
  .nota-detalle-edit-guardar svg{ width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2.4; }

  .nota-detalle-meta{ display:flex; flex-wrap:wrap; gap:8px; margin: 12px 0 2px; min-height:1px; }
  .nota-detalle-acciones{ display:grid; grid-template-columns: 1fr 1fr; gap:8px; margin-top: 18px; }
  .nota-detalle-accion{
    display:flex; align-items:center; justify-content:center; gap:8px;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text);
    border-radius:12px; padding:14px 10px; font-size:0.88rem; font-weight:700; min-height:auto;
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
  }
  .nota-detalle-accion:active{ background: var(--bg); }
  .nota-detalle-accion.on{ color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
  .nota-detalle-accion.warn{ color: var(--warn); }
  .nota-detalle-accion.warn:active{ background: var(--warn-soft); }
  .nota-detalle-accion-ico{ font-size:1.1rem; line-height:1; display:inline-flex; }
  .nota-detalle-accion-ico svg{ width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:1.8; }
  .nota-detalle-accion-ico .ico-on{ display:none; }
  .nota-detalle-accion.on .nota-detalle-accion-ico .ico-off{ display:none; }
  .nota-detalle-accion.on .nota-detalle-accion-ico .ico-on{ display:inline-flex; }
  .nota-detalle-accion.on .nota-detalle-accion-ico .ico-on[fill="currentColor"]{ color: var(--accent); }
  .nota-detalle-borrar-full{ width:100%; margin-top:8px; border-color: var(--warn-soft); }
  .nota-detalle-borrar-full .nota-detalle-accion-ico svg{ width:16px; height:16px; }

  @media (min-width: 480px){
    .nota-detalle-overlay{ align-items:center; }
    .nota-detalle-sheet{ border-radius: 18px; }
  }

  /* ---- Ventas / productos ---- */
  .categoria-grupo{ margin-bottom: 4px; }
  .categoria-header{
    display:flex; align-items:center; gap:8px; padding: 10px 4px 6px;
    width:100%; background:none; border:none; border-radius:8px; font-family:inherit; cursor:pointer;
    /* Antes era "manipulation" (solo sacaba el delay de doble-tap). Pasa a
       "none" fijo porque ahora este header se puede arrastrar para
       reordenar/anidar la categoría (mantener pulsado en celular, clic y
       arrastrar en computadora — ver el bloque de arrastre junto a
       renderVentas en app.js): el navegador decide qué gestos permite
       (touch-action) en el momento del toque inicial y no lo vuelve a
       evaluar durante ese mismo toque, así que hace falta que arranque en
       "none" desde el principio para que el pulsado largo tenga chance de
       cumplirse sin que el navegador se adelante y lo tome como scroll de
       la página por su cuenta. El scroll durante la espera del pulsado
       largo (antes de que se cumpla, o cuando se determina que fue scroll
       y no arrastre) lo hace a mano el JS de ese mismo bloque.
       user-select/-webkit-touch-callout: evitan que ese mismo pulsado
       largo dispare el menú de selección de texto/copiar del navegador. */
    touch-action: none; user-select:none; -webkit-user-select:none;
    -webkit-touch-callout: none;
    transition: background-color 0.12s ease;
  }
  /* Sin esto, el header se "aplastaba" (encogía un 4%) apenas se lo
     mantenía presionado — no por el arrastre en sí, sino por la regla
     genérica `button:active{ transform:scale(0.96) }` de más abajo en
     este archivo, que se le aplica a CUALQUIER <button> mientras está
     presionado (y .categoria-header es un <button>). Un simple tap corto
     ya se veía raro con eso, y quedaba peor todavía durante el pulsado
     largo previo a que arranque el arrastre. El feedback de "presionado"
     pasa a darlo el fondo en vez de un scale. */
  .categoria-header:active{ transform:none; background: var(--bg-panel-2); }
  .categoria-nombre{ flex:1; text-align:left; font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.6px; color: var(--accent); }
  .categoria-count{ font-size: 0.66rem; font-weight: 700; color: var(--accent); background: var(--accent-soft); border-radius: 20px; padding: 2px 8px; min-width: 20px; text-align:center; }
  .categoria-chevron{ color: var(--accent); font-size:1.15rem; font-weight:800; line-height:1; transition: transform 0.15s ease; flex-shrink:0; }
  .categoria-grupo.colapsado .categoria-chevron{ transform: rotate(-90deg); }
  .categoria-grupo.colapsado .categoria-items{ display:none; }
  /* Subcategorías (agrupamiento recursivo, Paso 4): cada nivel de
     `.categoria-subgrupos` va anidado dentro de `.categoria-items` del nivel
     padre, así que el padding-left y el margin-left se van sumando solos a
     medida que baja la profundidad — no hace falta que el JS calcule ni
     pase ningún número de nivel. El borde punteado marca visualmente la
     rama a la que pertenece cada subcategoría. */
  .categoria-subgrupos{
    padding-left: 14px; margin-left: 7px; margin-top: 2px;
    border-left: 1px dashed var(--line);
  }
  /* Encabezados de subcategorías un poco más chicos que el de su padre, para
     que la jerarquía también se note por tamaño y no solo por indentación. */
  .categoria-subgrupos .categoria-header{ padding: 7px 4px 5px; }
  .categoria-subgrupos .categoria-nombre{ font-size: 0.68rem; }
  .categoria-subgrupos .categoria-chevron{ font-size: 1rem; }

  /* ---- Arrastre de un header de categoría en Ventas (reordenar / anidar) ----
     Mismos tres estados que .categoria-arbol-row del selector en árbol (ver
     esa nota más abajo en este archivo): .arrastrando es el header que se
     está sujetando ahora mismo (se levanta con sombra + fondo propio y
     sigue al dedo/mouse con `transform` puesto desde JS). .drag-sobre-antes
     / -despues son la línea de inserción arriba/abajo del header que está
     debajo del dedo en este momento (reordena entre hermanos, adoptando el
     padre de ese header — ver moverCategoriaJuntoA). .drag-sobre-dentro
     resalta el header completo cuando soltar ahí anidaría la categoría
     arrastrada como su subcategoría. */
  .categoria-header.arrastrando{
    position:relative; z-index:5; background: var(--bg-panel-2);
    box-shadow: 0 8px 20px rgba(0,0,0,0.35); opacity:0.97;
  }
  .categoria-header.drag-sobre-antes{ box-shadow: inset 0 2px 0 0 var(--accent); }
  .categoria-header.drag-sobre-despues{ box-shadow: inset 0 -2px 0 0 var(--accent); }
  .categoria-header.drag-sobre-dentro{ background: var(--accent-soft); }
  /* Tarjeta única por producto: antes esta misma info vivía partida entre
     Catálogo (nombre/precio) y Stock (cantidades) en dos sub-pestañas
     separadas — ahora es una sola tarjeta con todo, borde sutil para que
     se distinga bien una de otra, y la acción de venta a la vista en vez
     de escondida en un menú. */
  .producto-card{
    background: linear-gradient(165deg, var(--bg-panel-2), var(--bg-panel));
    border: 1px solid var(--line); border-radius: 14px;
    padding: 14px; margin-bottom: 10px; display:flex; flex-direction: column; gap: 10px;
    transition: border-color 0.15s ease, transform 0.1s ease;
  }
  .producto-card:active{ transform: scale(0.994); }
  .producto-card .nombre{ font-weight:700; font-size:1rem; letter-spacing: 0.1px; }
  .producto-card .precio{ color: var(--accent); font-weight:800; font-size:0.92rem; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top: 2px; }
  .badge.vendido{ background: var(--ok-soft); color: var(--ok); }
  .badge.sin-stock{ background: var(--warn-soft); color: var(--warn); }
  .badge.stock-bajo{ background: var(--warn-soft); color: var(--warn); border:1px solid var(--warn); }
  .badge.ganancia{ background: var(--ok-soft); color: var(--ok); }
  .costo-inline{ color: var(--text-dim); font-weight:400; font-size:0.78rem; }

  /* ---- 4.4: fila compacta de producto (rediseño) — reemplaza el cuerpo
     denso de .producto-card (medidor de stock, reservas, badges, ganancia)
     por una sola fila: ícono cuadrado + nombre + precio + estado de stock,
     más el menú ⋮ de siempre. .producto-card se mantiene como wrapper (así
     no rompe el delegado de clicks en #ventasList, que busca .producto-card
     y [data-menu-trigger="producto"]), pero acá pisa su padding/dirección
     para acomodar la fila horizontal en vez de la columna vieja. */
  .producto-fila-compacta{ flex-direction: row; flex-wrap: wrap; align-items: center; padding: 0 4px 0 0; gap: 0; }
  /* Arreglo: la fila compacta (arriba) no mostraba ninguna reserva activa
     de forma clara — el aviso de seña vivía SUELTO arriba de la tarjeta
     (podía confundirse con la tarjeta de otro producto en una lista larga)
     y la lista de reservas por cliente directamente no se pintaba. Ahora
     ambas cosas van en este bloque, que ocupa el 100% del ancho del mismo
     contenedor flex de la fila (por eso el flex-wrap de arriba) para
     aparecer siempre como una segunda línea DENTRO de la tarjeta del
     producto al que pertenecen, nunca afuera. */
  .producto-fila-extra{
    width:100%; display:flex; flex-direction:column; gap:8px;
    padding: 0 10px 10px 14px; margin-top: -2px;
  }
  .producto-fila-extra .aviso-senas-activas{ margin-bottom:0; }
  .producto-fila-top{
    flex:1; min-width:0; display:flex; align-items:center; gap:10px;
    padding: 12px 10px 12px 14px;
  }
  .producto-fila-icono{
    width:72px; height:72px; border-radius:14px; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    font-size:1.1rem; font-weight:800; letter-spacing:0.2px;
    background: color-mix(in srgb, var(--tile-color, var(--accent)) 18%, transparent);
    color: var(--tile-color, var(--accent));
    overflow:hidden;
  }
  .producto-fila-icono img{ width:100%; height:100%; object-fit:cover; display:block; }

  /* ---- Selector de foto en el form de producto ----
   * Fila simple: miniatura cuadrada (placeholder con ícono si no hay foto
   * elegida todavía, o preview real una vez elegida/comprimida) + botones.
   * "Quitar" solo aparece si hay una foto puesta (nueva o ya guardada). */
  .producto-foto-picker{ display:flex; align-items:center; gap:12px; }
  .producto-foto-picker-preview{
    width:56px; height:56px; border-radius:12px; flex-shrink:0; overflow:hidden;
    display:flex; align-items:center; justify-content:center;
    background: color-mix(in srgb, var(--accent) 12%, transparent);
    color: var(--text-dim);
  }
  .producto-foto-picker-preview svg{ width:24px; height:24px; fill:none; stroke:currentColor; stroke-width:1.6; }
  .producto-foto-picker-preview img{ width:100%; height:100%; object-fit:cover; display:block; }
  .producto-foto-picker-botones{ display:flex; flex-direction:column; gap:6px; align-items:flex-start; }
  .producto-fila-body{ flex:1; min-width:0; }
  .producto-fila-nombre{ font-weight:700; font-size:0.92rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .producto-fila-precio{ font-size:0.78rem; color: var(--text-dim); margin-top:1px; display:flex; align-items:baseline; gap:6px; flex-wrap:wrap; }
  /* ---- Descuento de producto: precio tachado + final en el catálogo (ver
     precioProductoConDescuentoHtml) ---- */
  .producto-precio-final{ font-size:0.78rem; color: var(--text-dim); }
  .producto-precio-final.producto-precio-con-descuento{ color: var(--accent); font-weight:800; }
  .producto-precio-antes{ text-decoration:line-through; opacity:0.6; }
  .producto-descuento-badge{
    font-size:0.68rem; font-weight:800; color: var(--warn);
    background: var(--warn-soft); border-radius:6px; padding:1px 5px; line-height:1.4;
  }
  .producto-fila-stock{ font-size:0.86rem; font-weight:800; text-align:right; flex-shrink:0; white-space:nowrap; margin-left:8px; letter-spacing:0.1px; }
  .producto-fila-stock.stock-sin{ color: var(--danger); }
  .producto-fila-stock.stock-bajo-txt{ color: var(--warn); }
  .producto-fila-stock.stock-ok{ color: var(--text-dim); font-weight:700; }
  .producto-fila-stock-dospuntos{ font-weight:400; font-size:1.25em; margin:0 1px 0 1px; position:relative; top:-0.25px; }
  .producto-fila-stock-alerta{ font-size:1.15em; margin-right:2px; position:relative; top:1px; }
  .producto-fila-kebab{
    width:34px; height:34px; min-height:auto; padding:0; flex-shrink:0; border-radius:9px;
    background:transparent; border:none; color: var(--text-dim);
    display:flex; align-items:center; justify-content:center;
  }
  .producto-fila-kebab svg{ width:18px; height:18px; fill:currentColor; stroke:none; }
  .producto-fila-kebab:active{ color: var(--text); }

  /* ---- 4.5: pantalla "Nueva venta" (carrito multi-producto) ----
     .nueva-venta-page reusa .notas-page (mismo padding/scroll que Clientes).
     El buscador y el campo Cliente reusan .cliente-autocomplete-wrap/
     .cliente-sugerencias (mismo dropdown que ya usaba Cliente en Nuevo
     turno/Vender). */
  .nueva-venta-buscar-wrap{ margin-bottom:14px; }
  .nueva-venta-items{ display:flex; flex-direction:column; gap:8px; margin-bottom:16px; }
  .nueva-venta-empty{
    text-align:center; color: var(--text-dim); font-size:0.85rem;
    padding:22px 12px; border:1px dashed var(--line); border-radius:12px;
  }
  .nueva-venta-item{
    display:flex; align-items:center; gap:10px; background: var(--bg-panel);
    border:1px solid var(--line); border-radius:10px; padding:10px 12px; cursor:pointer;
  }
  .nueva-venta-item-info{ flex:1; min-width:0; }
  .nueva-venta-item-nombre{ font-weight:700; font-size:0.88rem; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .nueva-venta-item-detalle{ font-size:0.74rem; color: var(--text-dim); margin-top:1px; }
  .nueva-venta-item-precio-antes{ text-decoration:line-through; opacity:0.6; margin-right:2px; }
  .nueva-venta-item-subtotal{ font-weight:800; font-size:0.88rem; flex-shrink:0; white-space:nowrap; }
  .nueva-venta-item-quitar{
    width:26px; height:26px; min-height:auto; padding:0; flex-shrink:0; border-radius:50%;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim);
    display:flex; align-items:center; justify-content:center; font-size:1rem; line-height:1;
  }
  .nueva-venta-item-quitar:active{ color: var(--danger); border-color: var(--danger); }
  .nueva-venta-cliente-field{ margin-bottom:16px; }
  .nueva-venta-resumen{
    background: var(--bg-panel); border:1px solid var(--line); border-radius:12px;
    padding:12px 14px; margin-bottom:14px;
  }
  .nueva-venta-resumen-row{ display:flex; justify-content:space-between; align-items:center; font-size:0.85rem; color: var(--text-dim); padding:3px 0; }
  .nueva-venta-resumen-row.nueva-venta-total{
    color: var(--text); font-weight:800; font-size:1.08rem;
    border-top:1px solid var(--line); margin-top:4px; padding-top:9px;
  }
  .nueva-venta-metodo-pago{ display:grid; grid-template-columns:1fr 1fr; gap:8px; margin-bottom:8px; }
  .nueva-venta-metodo-btn{
    padding:11px; border-radius:10px; border:1px solid var(--line); background: var(--bg-panel-2);
    color: var(--text-dim); font-weight:700; font-size:0.86rem;
  }
  .nueva-venta-metodo-btn.active{ background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
  /* Botón de entrega SIN cobrar (fiado) — separado de los dos de método de
     pago de arriba (grid propio, ancho completo) y con su propio color
     (warn) para que no se confunda con una forma de pago más: no es
     "cómo se cobró" sino "todavía no se cobró". */
  .nueva-venta-fiado-pago{ display:grid; margin-bottom:14px; }
  .nueva-venta-fiado-btn{
    padding:11px; border-radius:10px; border:1px dashed var(--line); background: transparent;
    color: var(--text-dim); font-weight:700; font-size:0.86rem;
  }
  .nueva-venta-fiado-btn.active{ background: var(--warn-soft); border-color: var(--warn); border-style:solid; color: var(--warn); }
  .nueva-venta-cobrar-btn{ margin-top:0; margin-bottom:6px; }
  .nueva-venta-cobrar-btn:disabled{ opacity:0.5; }
  .nueva-venta-cobrar-btn.fiado-activo{ background: var(--warn); border-color: var(--warn); }

  /* ---- Fiados pendientes: tarjeta en Ventas con lo entregado sin cobrar
     todavía (ver marcarVentaFiadaPagada/cancelarVentaFiada en app.js).
     Arriba de la lista de productos, bien visible, para que no quede
     "perdido" sin verse — es plata que todavía falta cobrar. Oculta por
     completo (display:none) cuando no hay ninguno pendiente.
     Usa el dorado normal de la app (--accent, el mismo de categorías/
     botones principales) en vez de la paleta de warn/alerta: esto es un
     simple pendiente de cobro, no una alarma del sistema, así que no tiene
     que gritar tanto.
     El header ocupa TODO el ancho de la tarjeta (la tarjeta en sí no tiene
     padding horizontal propio, se lo da el header) — así el área para
     plegar/desplegar es de punta a punta, sin ninguna franja muerta en
     ningún extremo. ---- */
  .fiados-pendientes-card{
    background: var(--accent-soft); border:1px solid var(--line); border-radius:12px;
    margin-bottom:14px; overflow:hidden;
  }
  .fiados-pendientes-header{
    display:flex; align-items:center; gap:8px; width:100%; padding:11px 14px;
    background:none; border:none; font-family:inherit; cursor:pointer; touch-action:manipulation;
  }
  .fiados-pendientes-header:active{ background: rgba(0,0,0,0.05); }
  .fiados-pendientes-chevron{ color: var(--text-dim); font-size:0.85rem; font-weight:800; line-height:1; transition: transform 0.15s ease; flex-shrink:0; }
  .fiados-pendientes-card.colapsado .fiados-pendientes-chevron{ transform: rotate(-90deg); }
  .fiados-pendientes-card.colapsado #fiadosPendientesList{ display:none; }
  #fiadosPendientesList{ padding:0 14px 12px; }
  .fiados-pendientes-titulo{ font-weight:800; font-size:0.76rem; color: var(--text); flex:1; text-align:left; }
  .fiados-pendientes-count{ font-size:0.64rem; font-weight:700; color: var(--accent); background: var(--bg-panel); border-radius:20px; padding:1px 7px; min-width:16px; text-align:center; }
  .fiados-pendientes-total{ font-weight:800; font-size:0.82rem; color: var(--accent); }
  .fiados-pendientes-item{
    display:flex; flex-direction:column; gap:6px; padding:8px 0; border-top:1px solid var(--line);
  }
  .fiados-pendientes-item:first-child{ border-top:none; padding-top:0; }
  .fiados-pendientes-top{ display:flex; align-items:center; gap:8px; }
  .fiados-pendientes-info{ flex:1; min-width:0; }
  /* A quién se le fio es lo primero que se busca con la vista, así que va
     de línea principal; el producto queda de segunda línea pero con
     suficiente peso/contraste como para leerse sin entrecerrar los ojos
     (antes era demasiado tenue). */
  .fiados-pendientes-cliente{ font-weight:800; font-size:0.85rem; color: var(--text); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  /* Cliente y producto quedaban los dos en el mismo blanco: sin leer el
     tamaño de letra no se distinguía cuál era cuál. El producto pasa a
     usar el dorado de acento de la tarjeta (mismo tono que el contador y el
     total, ya asociado a "esta tarjeta" en la cabecera) — así el color
     también dice "esto es lo que se entregó", no hace falta leer el
     tamaño para darse cuenta de qué es cada línea. */
  .fiados-pendientes-sub{ margin-top:1px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .fiados-pendientes-producto{ font-size:0.77rem; font-weight:700; color: var(--accent); }
  .fiados-pendientes-fecha{ font-size:0.68rem; font-weight:500; color: var(--text-dim); }
  .fiados-pendientes-monto{ font-weight:800; font-size:0.78rem; color: var(--text); flex-shrink:0; }
  /* Las dos acciones ya NO pesan lo mismo: "Marcar pagado" es la acción
     principal (botón sólido, ocupa más lugar) porque es lo que se hace en
     la enorme mayoría de los casos — cobrar lo fiado. "Cancelar entrega" es
     la excepción, así que queda como link discreto al lado, sin fondo ni
     borde y en gris neutro (no rojo: cancelar una entrega no es "peligroso"
     en el mismo sentido que borrar algo, así que no necesita ese color). */
  .fiados-pendientes-acciones{ display:flex; align-items:center; gap:10px; }
  .fiados-pendientes-cobrar{
    flex:1; padding:7px 10px; border-radius:8px; border:1px solid var(--ok);
    background: var(--ok); color:#fff; font-weight:800; font-size:0.72rem;
  }
  .fiados-pendientes-cancelar{
    flex:0 0 auto; padding:6px 2px; border:none; background:none;
    color: var(--text-dim); font-weight:600; font-size:0.68rem;
    text-decoration:underline; text-underline-offset:2px;
  }

  /* Medidor de stock: reemplaza los badges de texto "Stock" + "Reservado"
     por una sola barra que muestra la proporción real de lo que hay hoy en
     mano (disponible vs reservado) — información que antes había que leer
     en dos números separados, ahora se ve de un vistazo. El segmento libre
     usa el celeste de "info" (mismo lenguaje que el resto de la app para
     "disponible"); el segmento reservado usa el dorado de acento, en línea
     con el resto de las señas/reservas de la app. */
  .stock-meter{ display:flex; flex-direction:column; gap:5px; }
  .stock-meter-track{
    display:flex; height:7px; border-radius:5px; overflow:hidden;
    background: var(--bg-panel); border: 1px solid var(--line);
  }
  .stock-meter-fill{ height:100%; transition: width 0.2s ease; }
  .stock-meter-fill.fill-libre{ background: var(--info); }
  .stock-meter-fill.fill-reservado{ background: var(--accent); }
  .stock-meter-caption{ display:flex; flex-wrap:wrap; gap: 4px 12px; font-size:0.72rem; color: var(--text-dim); }
  .stock-meter-caption span{ display:flex; align-items:center; gap:5px; }
  .stock-meter-caption span::before{ content:''; width:7px; height:7px; border-radius:50%; flex-shrink:0; }
  .stock-meter-caption .cap-libre::before{ background: var(--info); }
  .stock-meter-caption .cap-libre{ color: var(--text); font-weight:600; }
  .stock-meter-caption .cap-reservado::before{ background: var(--accent); }
  .stock-meter-caption .cap-reservado{ color: var(--accent); font-weight:600; }

  /* Lista de reservas activas de un producto: puede haber varias a la vez
     (una por cliente), cada una con su propio menú ⋮ para venderla, señarla,
     entregarla o cancelarla sin afectar a las demás. */
  .reservas-list{ display:flex; flex-direction:column; gap:6px; }
  .reserva-item{
    display:flex; align-items:center; justify-content:space-between; gap:8px;
    background: var(--bg-panel); border: 1px solid var(--line); border-radius: 10px;
    padding: 7px 8px 7px 12px;
  }
  .reserva-info{ font-size:0.76rem; color: var(--text-dim); font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .kebab-btn-sm{ width:26px; height:26px; border-radius:7px; }
  .kebab-btn-sm svg{ width:15px; height:15px; }

  /* Botón de acción principal (Vender / Cargar stock): a todo lo ancho de
     la tarjeta, siempre en el mismo lugar, para no tener que abrir el menú
     ⋮ en el caso de uso más común. El resto de las acciones (reservar,
     editar, deshacer, etc.) quedan en ese menú, ya que se usan mucho menos. */
  .card-actions{ display:flex; }
  .card-cta{ width:100%; min-height:40px; padding:8px 12px; font-size:0.86rem; display:flex; align-items:center; justify-content:center; gap:7px; font-weight:700; }
  .card-cta svg{ width:17px; height:17px; flex-shrink:0; }
  .card-cta.secundario{ border-style:dashed; }
  .aviso-senas-activas{
    background: var(--info-soft); color: var(--info); border:1px solid var(--info);
    border-radius:10px; padding:10px 12px; font-size:0.82rem; font-weight:600;
    margin-bottom:12px; line-height:1.4;
  }

  /* ---- Selector de fecha (estilo calendario) ---- */
  .date-trigger{
    width:100%; text-align:left; background: var(--bg-panel-2); border: 1px solid var(--line); color: var(--text);
    border-radius: 8px; padding: 12px 12px; font-size: 0.95rem; min-height: 46px; font-family: inherit; font-weight:400;
  }
  .date-trigger:active{ border-color: var(--accent); }
  .date-trigger:disabled{ opacity:0.5; }
  .calendar-box{ max-width: 380px; }
  .calendar-header{ display:flex; align-items:center; justify-content:space-between; margin-bottom: 14px; gap:8px; }
  .calendar-header .cal-title{ font-size: 1rem; font-weight:700; text-transform: capitalize; flex:1; text-align:center; }
  .calendar-nav-btn{
    width:34px; height:34px; min-height:auto; padding:0; border-radius:50%;
    background: var(--bg-panel-2); border: 1px solid var(--line); color: var(--text); font-size:1rem;
  }
  .calendar-weekdays{ display:grid; grid-template-columns: repeat(7,1fr); gap:2px; margin-bottom:4px; }
  .calendar-weekdays span{ text-align:center; font-size:0.66rem; color: var(--text-dim); text-transform: uppercase; font-weight:700; }
  .calendar-grid{ display:grid; grid-template-columns: repeat(7,1fr); gap:2px; }
  .calendar-day{
    aspect-ratio: 1; display:flex; align-items:center; justify-content:center; border-radius:50%;
    background:none; border:none; color:var(--text); font-size:0.9rem; font-weight:600; min-height:auto; padding:0;
  }
  .calendar-day.other-month{ color: var(--text-dim); opacity:0.32; }
  .calendar-day.today{ border: 2px solid var(--accent); color: var(--accent); }
  .calendar-day.selected{ background: var(--accent); color:#201400; }
  .calendar-footer{ display:flex; gap:10px; margin-top:16px; }
  .calendar-footer button{ flex:1; }

  /* ---- Atajos de fecha (próximos días, dentro del selector de fecha) ---- */
  .fecha-atajos-label{ font-size:0.68rem; color: var(--text-dim); text-transform:uppercase; letter-spacing:0.5px; font-weight:700; margin-bottom:8px; }
  .fecha-atajos{
    display:flex; gap:6px; overflow-x:auto; padding-bottom:12px; margin-bottom:12px;
    border-bottom:1px solid var(--line); scrollbar-width:none;
  }
  .fecha-atajos::-webkit-scrollbar{ display:none; }
  .fecha-atajo-chip{
    flex:0 0 auto; display:flex; flex-direction:column; align-items:center; gap:2px;
    min-width:56px; padding:8px 6px; border-radius:12px; background: var(--bg-panel-2);
    border:1px solid var(--line); color:var(--text); min-height:auto;
  }
  .fecha-atajo-chip .fa-dia{ font-size:0.62rem; text-transform:uppercase; font-weight:700; color:var(--text-dim); letter-spacing:0.3px; }
  .fecha-atajo-chip .fa-num{ font-size:0.86rem; font-weight:700; white-space:nowrap; }
  .fecha-atajo-chip.today{ border-color: var(--accent); }
  .fecha-atajo-chip.today .fa-dia{ color: var(--accent); }
  .fecha-atajo-chip.selected{ background: var(--accent); border-color: var(--accent); }
  .fecha-atajo-chip.selected .fa-dia, .fecha-atajo-chip.selected .fa-num{ color:#201400; }
  .fecha-atajo-chip.day-blocked{ opacity:0.45; }
  .fecha-atajo-chip.day-blocked .fa-num{ text-decoration: line-through; }
  .calendar-day.day-blocked{ opacity:0.4; text-decoration: line-through; }

  /* ---- Selector de hora (estilo rueda) ---- */
  .hora-wheel-wrap{
    position: relative; display:flex; align-items:center; justify-content:center;
    gap: 4px; margin: 6px 0 4px; user-select: none;
  }
  .hora-wheel-highlight{
    position:absolute; left:8px; right:8px; top:50%; transform:translateY(-50%);
    height:44px; border-top:1px solid var(--accent); border-bottom:1px solid var(--accent);
    background: var(--accent-soft); opacity:0.45; border-radius:10px; pointer-events:none;
  }
  .hora-wheel{
    height: 220px; width: 84px; overflow-y:auto; scroll-snap-type: y mandatory;
    -ms-overflow-style:none; scrollbar-width:none; position:relative;
  }
  .hora-wheel::-webkit-scrollbar{ display:none; }
  .hora-wheel-item{
    height:44px; display:flex; align-items:center; justify-content:center;
    font-size:1.05rem; color: var(--text-dim); font-weight:600; scroll-snap-align:center;
    transition: color 0.1s, font-size 0.1s; font-variant-numeric: tabular-nums;
  }
  .hora-wheel-item.active{ color: var(--text); font-size:1.4rem; font-weight:700; }
  .hora-wheel-sep{ font-size:1.5rem; font-weight:800; color: var(--accent); align-self:center; margin-top:-2px; }
  .hora-wheel-label{ text-align:center; font-size:0.7rem; color: var(--text-dim); text-transform:uppercase; letter-spacing:0.5px; font-weight:700; margin-top:2px; }
  .hora-wheel-cols{ display:flex; flex-direction:column; align-items:center; }
  .hora-atajos{ display:flex; flex-wrap:wrap; gap:6px; justify-content:center; margin-top:14px; min-height: 20px; }
  .hora-atajos .empty-msg{ text-align:center; width:100%; padding: 2px; font-size:0.78rem; }
  .hora-atajos button{
    min-height:auto; padding:7px 12px; font-size:0.78rem; border-radius:20px;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text-dim); font-weight:600;
  }
  .hora-atajos button:active{ border-color: var(--accent); color: var(--accent); }

  /* ---- Modal de cantidad / venta ---- */
  .modal-field{ margin-bottom: 16px; }
  .modal-field label{ margin-bottom: 6px; }
  .modal-field input{ text-align:center; font-size: 1.1rem; font-weight:700; }
  .modal-field input#modalCantidadCliente{ text-align:left; font-size: 0.95rem; font-weight:500; }

  /* Monto fijo (no editable) del modal de señas, ej. "cobrar el resto":
     se muestra como un número grande en vez de un input, para dejar claro
     que ese monto ya está calculado y no se puede tocar a mano. */
  .modal-monto-fijo{
    text-align:center; font-size:1.6rem; font-weight:800; color: var(--ok);
    background: var(--ok-soft); border-radius:10px; padding:14px; margin-bottom:16px;
  }

  /* ---- Selector de mes (estilo calendario, para filtro de turnos y stats) ---- */
  .meses-grid{ grid-template-columns: repeat(3,1fr); gap: 8px; margin-bottom: 4px; }
  .meses-grid .calendar-day{ aspect-ratio: auto; height: 46px; border-radius: 10px; background: var(--bg-panel-2); border: 1px solid var(--line); font-size: 0.85rem; text-transform: capitalize; font-weight:600; }
  .meses-grid .calendar-day.today{ border-color: var(--accent); color: var(--accent); }
  .meses-grid .calendar-day.selected{ background: var(--accent); color:#201400; border-color: var(--accent); }

  /* ---- Stats: ver mes anterior ---- */
  .mes-anterior-box{ margin-top:12px; padding-top:12px; border-top:1px solid var(--line); }
  .mes-anterior-head{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:10px; }
  .mes-anterior-titulo{ font-weight:700; font-size:0.92rem; text-transform:capitalize; }
  .mes-anterior-head button{ width:30px; height:30px; min-height:auto; padding:0; border-radius:50%; flex-shrink:0; }

  /* ---- Stats: gastos ---- */

  /* ---- Gastos: tarjeta grande "Gastos de [período]" (8.1), reusa
     .resumen-card-grande. El valor se pinta en tono de alerta (--warn) para
     distinguirlo a simple vista de las tarjetas de ingresos (que usan el
     dorado de --text/--accent). El selector reusa .gpc-periodo pero con los
     4 botones repartidos a lo ancho de la tarjeta. ---- */
  .gastos-resumen-card{ padding-bottom: 14px; }
  .gastos-resumen-card .resumen-card-valor{ color: var(--warn); }
  .gastos-total-periodo{ width:100%; margin-top:12px; }
  .gastos-total-periodo .gpc-periodo-btn{ flex:1; text-align:center; }

  /* ---- Ingresos: tarjeta grande "Ingresos de [período]" (8.2.1), mismo
     patrón que la de Gastos (8.1) pero con el valor en tono positivo (--ok)
     en vez de --warn, para distinguirla a simple vista. ---- */
  .ingresos-resumen-card{ padding-bottom: 14px; }
  .ingresos-resumen-card .resumen-card-valor{ color: var(--ok); }

  /* ---- Balance: tarjeta grande "Balance de [período]" (8.3), mismo patrón
     que Gastos (8.1) e Ingresos (8.2.1). A diferencia de esas dos, NO se le
     fija un color al valor acá: se pinta en verde o rojo según el balance
     sea positivo o negativo (mismo criterio que coloreaBalance() en JS,
     aplicado también al resumen histórico de abajo). "Balance histórico
     total" reusa .total-row tal cual, solo con margen para separarla del
     selector de período de arriba. ---- */
  .balance-resumen-card{ padding-bottom: 14px; }
  .balance-resumen-card .total-row{ margin-top: 12px; }

  /* ---- Gastos por categoría: envuelta en tarjeta propia (8.1) para que
     combine con el resto de la pantalla rediseñada, en vez de ser solo una
     sección separada por una línea dentro del panel. ---- */
  .gpc-card{
    margin-top: 14px;
    padding: 14px;
    background: var(--bg-panel-2);
    border: 1px solid var(--line);
    border-radius: var(--radius);
  }
  .gpc-block.gpc-card{ border-top:none; padding-top:0; }

  .income-entry.gasto-entry .tipo-dot{ background: var(--warn); }
  .gasto-row{ display:flex; align-items:center; gap:10px; background: var(--bg-panel-2); border-radius: 8px; padding: 10px 12px; margin-bottom:8px; }
  .gasto-row .nombre{ font-size:0.9rem; font-weight:600; }
  .gasto-row .fecha{ color: var(--text-dim); font-size:0.7rem; margin-top:2px; }
  .gasto-row .monto{ color: var(--warn); font-weight:700; font-size:0.85rem; white-space:nowrap; max-width:38%; overflow:hidden; text-overflow:ellipsis; flex-shrink:1; min-width:0; }
  .gasto-row button{ background: var(--warn-soft); border: 1px solid var(--warn); color: var(--warn); font-size: 0.95rem; padding: 0; min-height: 30px; width: 30px; border-radius: 50%; display:flex; align-items:center; justify-content:center; flex-shrink:0; }

  /* ---- Gastos: tarjetas con ícono según categoría + menú (⋮) con Editar/Borrar,
     en vez de una fila con un único botón "✕" para borrar. (.gasto-row de arriba
     sigue en pie: la siguen usando los ingresos manuales y los intercambios.) ---- */
  .gasto-card{ display:flex; align-items:center; gap:10px; background: var(--bg-panel-2); border-radius: 10px; padding: 10px 12px; margin-bottom:8px; }
  .gasto-card-icon{
    width:36px; height:36px; border-radius:10px; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    background: var(--warn-soft); color: var(--warn);
  }
  .gasto-card-icon svg{ width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .gasto-card-info{ flex:1; min-width:0; }
  .gasto-card-nombre{ font-size:0.9rem; font-weight:600; }
  .gasto-card-meta{ color: var(--text-dim); font-size:0.72rem; margin-top:2px; }
  .gasto-card-monto{ color: var(--warn); font-weight:700; font-size:0.85rem; white-space:nowrap; max-width:34%; overflow:hidden; text-overflow:ellipsis; flex-shrink:1; min-width:0; }

  /* ---- Gasto automático por costo de venta (ver registrarVenta en app.js):
     va ligado 1 a 1 a una venta de Ventas, así que en vez del menú (⋮) con
     Editar/Borrar muestra un candado fijo. El fondo levemente distinto (borde
     punteado) marca de un vistazo que esta tarjeta se comporta distinto al
     resto de los gastos, sin recurrir a texto extra permanente. ---- */
  .gasto-card-auto{ border: 1px dashed var(--line); background: transparent; }
  .gasto-card-lock{
    width:32px; height:32px; border-radius:50%; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    color: var(--text-dim); cursor: help;
  }
  .gasto-card-lock svg{ width:16px; height:16px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }

  /* Filas de formulario con muchos campos (gasto: monto + categoría + método;
     servicio: precio + duración + check "Indefinido"), además de los botones
     Cancelar/Guardar. A diferencia de las filas simples de .add-servicio-row2
     (2 campos, que sí entran fijas en columnas), acá hay demasiados elementos
     —y "Guardar cambios" es un botón largo— como para forzarlos siempre en una
     sola fila con grid-template-columns: en un modal angosto (o en cualquier
     pantalla no tan ancha) terminaban superpuestos/recortados en vez de pasar
     de renglón. Antes esto se parcheaba con un @media a los 380px fijos, pero
     esa medida no tiene en cuenta el ancho real disponible (el modal de edición
     recorta más todavía por su padding), así que seguía rompiéndose en pantallas
     más anchas que 380px. Por eso estas filas usan flex-wrap en vez de grid:
     cada campo pasa a la línea siguiente solo cuando hace falta, según el ancho
     real disponible, sin depender de un breakpoint fijo. Mismo criterio para
     cualquier fila de formulario nueva que junte varios campos + estos botones:
     usar flex-wrap acá, no un grid de columnas fijas. */
  .add-servicio-row2-gasto,
  .add-servicio-row2-servicio{ display:flex; flex-wrap:wrap; }
  .add-servicio-row2-gasto > input,
  .add-servicio-row2-gasto > select,
  .add-servicio-row2-gasto > .categoria-trigger,
  .add-servicio-row2-servicio > input{ flex: 1 1 92px; min-width:0; }
  .add-servicio-row2-gasto > button,
  .add-servicio-row2-servicio > button{ flex: 1 1 130px; }
  .add-servicio-row2-servicio .servicio-indefinido-check{ flex: 1 1 100%; }
  .ingreso-row .monto{ color: var(--ok); }
  .intercambio-row .monto{ color: var(--info); }

  /* ---- Stats: balance ---- */
  .stats-row.stats-row-3{ grid-template-columns: repeat(3,1fr); }

  /* ---- Intercambio Efectivo ⇄ Transferencia ---- */
  .dot.efectivo{ background: var(--ok); }
  .dot.transferencia{ background: var(--info); }

  .intercambio-swap-card{
    display:flex; align-items:stretch; gap:8px; margin-top:14px;
  }
  .intercambio-lado{
    flex:1; min-width:0;
    background: var(--bg-panel-2); border:1px solid var(--line); border-radius: 12px;
    padding: 12px; text-align:center;
    display:flex; flex-direction:column; align-items:center; gap:4px;
    color: var(--text);
  }
  .intercambio-lado .dot{ width:9px; height:9px; border-radius:50%; }
  .intercambio-lado .lado-label{ font-weight:700; font-size:0.86rem; margin-top:2px; }
  .intercambio-lado .lado-saldo{ font-size:0.68rem; color: var(--text-dim); }
  #intercambioDestino{ cursor: default; }

  /* ---- Estadísticas · Balance: bloque de saldo actual (paso 2 del handoff
       rediseño-estadisticas), reusa .intercambio-swap-card/.intercambio-lado
       pero acá el monto es el dato principal (no secundario como en el
       selector de más abajo), así que se invierte el énfasis: la etiqueta
       queda chica/tenue arriba y el monto grande y en negrita abajo. ---- */
  .saldo-actual .lado-label{ font-size:0.72rem; font-weight:600; color: var(--text-dim); margin-top:2px; }
  .saldo-actual .lado-saldo{ font-size:1.15rem; font-weight:800; color: var(--text); }

  /* (Paso 7.b.1 había agregado acá un resaltado ".active" sobre el desglose
     de Balance para marcar el origen del intercambio, porque en ese momento
     Intercambio era un panel fijo que se veía junto a Balance en la misma
     pantalla. Paso 8.b: Intercambio pasó a ser un modal — ver
     #modalIntercambioOverlay en index.html — así que ese resaltado sobre
     Balance ya no se ve mientras el modal está abierto, y volvió a
     mostrarse directo en el selector propio del modal
     (intercambioOrigen/intercambioDestino, mismas clases .intercambio-lado
     de más arriba). Esta regla se borró por quedar sin uso.) */

  /* ---- Estadísticas · Ingresos: desglose de lo cobrado por método (paso 3
       del handoff rediseño-estadisticas). Mismo patrón que .saldo-actual de
       Balance, pero sin el botón de intercambio en el medio (achica el
       bloque — de ahí lo de "compacta" en el handoff) y con menos énfasis
       tipográfico, porque acá el dato es secundario al gráfico de arriba,
       no el protagonista de la tarjeta como en Balance. ---- */
  .cobrado-metodo{ margin-top:12px; }
  .cobrado-metodo .lado-label{ font-size:0.7rem; font-weight:600; color: var(--text-dim); margin-top:2px; }
  .cobrado-metodo .lado-saldo{ font-size:0.95rem; font-weight:700; color: var(--text); }
  .intercambio-swap-btn{
    flex-shrink:0; width:40px; min-height:auto; padding:0; align-self:center;
    height:40px; border-radius:50%;
    background: var(--accent-soft); border:1px solid var(--accent); color: var(--accent);
    display:flex; align-items:center; justify-content:center;
  }
  .intercambio-swap-btn svg{ width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
  .intercambio-swap-btn:active{ transform: rotate(180deg); transition: transform 0.2s ease; }

  .intercambio-chips{ display:flex; gap:8px; margin-top:10px; }
  .chip-monto{
    flex:1; background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text);
    border-radius: 9px; padding: 9px 4px; font-size:0.8rem; font-weight:700; min-height:38px;
  }
  .chip-monto:active{ background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
  .chip-monto:disabled{ opacity:0.4; }

  .intercambio-row-icon{
    flex-shrink:0; display:flex; align-items:center; gap:4px; color: var(--text-dim);
  }
  .intercambio-row-icon .dot{ width:8px; height:8px; border-radius:50%; }
  .intercambio-row-icon svg{ width:15px; height:15px; stroke:currentColor; fill:none; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }

  /* ---- Vista de agenda (grilla horaria) ---- */
  .agenda-header{ display:flex; align-items:center; gap:8px; margin-bottom:10px; }
  .agenda-fecha-btn{
    flex:1; background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text);
    border-radius:8px; padding:10px 12px; font-size:0.88rem; font-weight:700;
    text-transform:capitalize; text-align:center; min-height:44px;
  }
  .agenda-nav-btn{
    width:38px; height:38px; min-height:auto; padding:0; border-radius:50%; flex-shrink:0;
    background: var(--bg-panel-2); border:1px solid var(--line); color: var(--text); font-size:1.15rem;
    display:flex; align-items:center; justify-content:center; line-height:1;
  }
  .agenda-hoy-btn{ width:100%; margin-bottom:14px; }
  .agenda-grid-scroll{ max-height:64vh; overflow-y:auto; border:1px solid var(--line); border-radius:12px; background: var(--bg-panel-2); cursor:pointer; }

  /* ---- Resaltado momentáneo al llegar a un turno puntual (ej: desde el
     historial de un cliente), para ubicarlo rápido entre los demás ---- */
  @keyframes turnoResaltadoPulso{
    0%, 100%{ box-shadow: 0 0 0 0 rgba(201,138,62,0); }
    25%, 75%{ box-shadow: 0 0 0 3px var(--accent); }
  }
  .turno-card.turno-resaltado,
  .agenda-block.turno-resaltado{
    animation: turnoResaltadoPulso 1.1s ease-in-out 2;
  }
  .agenda-grid{ position:relative; margin: 8px 0 12px; padding-left: 46px; }
  /* La línea de hora arranca donde arranca el track (misma referencia horizontal que los
     bloques), y la etiqueta de la hora vive en el margen fijo a la izquierda (padding-left
     de .agenda-grid), así nunca queda debajo de un turno. */
  .agenda-hora-line{ position:absolute; left:0; right:12px; border-top:1px solid var(--line); }
  .agenda-hora-label{
    position:absolute; left:0; top:-8px; width:40px; text-align:right; padding-right:6px;
    font-size:0.66rem; color: var(--text-dim); font-variant-numeric: tabular-nums; font-weight:700;
  }
  .agenda-ahora-line{ position:absolute; left:46px; right:12px; height:2px; background: var(--warn); z-index:6; border-radius:2px; }
  .agenda-ahora-line::before{
    content:''; position:absolute; left:-5px; top:-4px; width:10px; height:10px;
    border-radius:50%; background: var(--warn); box-shadow: 0 0 0 3px var(--warn-soft);
  }
  /* Área de referencia para las columnas: todo bloque se posiciona en % relativo a este track.
     OJO: para un hijo position:absolute, "left" se mide desde el borde del padding-box del
     ancestro posicionado (acá #agendaGrid) — es decir, ANTES del padding-left, no después.
     Por eso hay que sumar explícitamente esos 46px acá; poner left:0 hacía que el track
     arrancara pegado a los números y los tapara. Se deja además un pequeño margen a la
     derecha para que los turnos no toquen el borde. */
  .agenda-track{ position:absolute; left:46px; right:12px; top:0; bottom:0; }
  .agenda-block{
    position:absolute; box-sizing:border-box; overflow:hidden; cursor:pointer; z-index:2;
    background: var(--accent-soft); border-radius:8px;
    padding: 4px 10px; transition: filter 0.1s ease, transform 0.08s ease;
    box-shadow: inset 0 0 0 1.5px var(--danger);
  }
  .agenda-block:active{ filter: brightness(1.22); transform: scale(0.99); }
  .agenda-block.completado{ background: rgba(91,171,111,0.28); }
  .agenda-block.pagado{ box-shadow: inset 0 0 0 1.5px var(--ok); }
  .agenda-block-inner{ display:flex; flex-direction:column; justify-content:center; gap:1px; min-width:0; height:100%; }
  .agenda-block-cliente{
    font-size:0.82rem; font-weight:700; color: var(--text); line-height:1.25;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  }
  .agenda-block-hora{
    font-size:0.68rem; font-weight:700; color: var(--accent); line-height:1.2;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  }
  .agenda-block.completado .agenda-block-hora{ color: var(--ok); }
  .agenda-block-detalle{
    font-size:0.68rem; color: var(--text-dim); line-height:1.2;
    white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  }
  .agenda-block.compacto .agenda-block-cliente{ font-size:0.76rem; }
  .agenda-block.compacto{ padding: 3px 8px; }
  .agenda-empty{ padding: 52px 10px; text-align:center; }

  /* ---- Franjas y días no laborables, en rojo ---- */
  .agenda-bloqueo-band{
    position:absolute; left:0; right:0; box-sizing:border-box; z-index:1; overflow:hidden;
    background: repeating-linear-gradient(135deg, rgba(220,60,60,0.16), rgba(220,60,60,0.16) 8px, rgba(220,60,60,0.09) 8px, rgba(220,60,60,0.09) 16px);
    border-top:1px solid rgba(220,60,60,0.35); border-bottom:1px solid rgba(220,60,60,0.35);
    display:flex; align-items:center; justify-content:center; pointer-events:none;
  }
  .agenda-bloqueo-label{
    font-size:0.66rem; font-weight:700; color:#e07a7a; letter-spacing:0.02em;
    text-transform:uppercase; text-align:center; padding:0 6px;
  }
  .agenda-dia-bloqueado{
    position:absolute; top:0; left:-46px; right:0; bottom:0; display:flex; flex-direction:column;
    align-items:center; justify-content:center; gap:8px; border-radius:12px;
    background: repeating-linear-gradient(135deg, rgba(220,60,60,0.14), rgba(220,60,60,0.14) 10px, rgba(220,60,60,0.07) 10px, rgba(220,60,60,0.07) 20px);
  }
  .agenda-dia-bloqueado-icono{ font-size:1.6rem; opacity:0.85; }
  .agenda-dia-bloqueado-texto{ font-size:0.95rem; font-weight:800; color:#e07a7a; letter-spacing:0.01em; }

  /* ---- Vista de agenda: Semana (2.4) ----
     Mismo lenguaje visual que la grilla diaria de arriba (franjas horarias,
     bloqueos, línea de "ahora"), pero con los 7 días en columnas. El scroll
     es de los dos ejes en un solo contenedor (.semana-grid-scroll):
     position:sticky alcanza para fijar la columna de horas a la izquierda y
     la fila de nombres de día arriba, sin sincronizar scroll a mano por JS
     — no comparten eje entre sí (la columna de horas es sticky en x, las
     cabeceras de día son sticky en y), así que nunca se pisan.
     Reusa .agenda-header/.agenda-nav-btn/.agenda-fecha-btn/.agenda-hoy-btn
     (ya existían) para la barra de navegación de semana. */
  .semana-grid-scroll{
    max-height:64vh; overflow:auto; border:1px solid var(--line); border-radius:12px;
    background: var(--bg-panel-2); cursor:pointer;
  }
  .semana-grid{ display:flex; width:max-content; }
  .semana-hora-gutter{
    position:sticky; left:0; z-index:3; flex-shrink:0; width:40px;
    background: var(--bg-panel-2); border-right:1px solid var(--line);
  }
  .semana-hora-gutter-track{ position:relative; margin-top:40px; }
  .semana-hora-label{
    position:absolute; left:0; right:6px; top:-8px; text-align:right;
    font-size:0.62rem; color: var(--text-dim); font-variant-numeric: tabular-nums; font-weight:700;
  }
  .semana-dias-cont{ display:flex; }
  .semana-dia-col{ width:104px; flex-shrink:0; border-right:1px solid var(--line); }
  .semana-dia-col:last-child{ border-right:none; }
  .semana-dia-header-cell{
    position:sticky; top:0; z-index:2; height:40px; box-sizing:border-box;
    background: var(--bg-panel-2); border-bottom:1px solid var(--line);
    display:flex; flex-direction:column; align-items:center; justify-content:center; gap:1px;
  }
  .semana-dia-header-nombre{ font-size:0.64rem; color: var(--text-dim); text-transform:uppercase; font-weight:700; letter-spacing:0.02em; }
  .semana-dia-header-num{ font-size:0.85rem; font-weight:800; color: var(--text); }
  .semana-dia-header-cell.hoy .semana-dia-header-num{
    color:#201400; background: var(--accent); border-radius:50%;
    width:22px; height:22px; display:flex; align-items:center; justify-content:center;
  }
  .semana-dia-track{ position:relative; }
  .semana-hora-line{ position:absolute; left:0; right:0; border-top:1px solid var(--line); }
  .semana-ahora-line{ position:absolute; left:0; right:0; height:2px; background: var(--warn); z-index:1; border-radius:2px; }
  .semana-bloqueo-band{
    position:absolute; left:0; right:0; box-sizing:border-box; pointer-events:none;
    background: repeating-linear-gradient(135deg, rgba(220,60,60,0.16), rgba(220,60,60,0.16) 8px, rgba(220,60,60,0.09) 8px, rgba(220,60,60,0.09) 16px);
    border-top:1px solid rgba(220,60,60,0.35); border-bottom:1px solid rgba(220,60,60,0.35);
  }
  .semana-dia-bloqueado{
    display:flex; align-items:center; justify-content:center; padding:8px 2px;
    background: repeating-linear-gradient(135deg, rgba(220,60,60,0.14), rgba(220,60,60,0.14) 10px, rgba(220,60,60,0.07) 10px, rgba(220,60,60,0.07) 20px);
  }
  .semana-dia-bloqueado span{
    font-size:0.64rem; font-weight:800; color:#e07a7a; text-align:center;
    writing-mode:vertical-rl; text-orientation:mixed;
  }
  /* .semana-block ya no define color/fondo propio: el bloque semanal usa las
     clases reales de la agenda del día (agenda-block, agenda-block-cliente,
     agenda-block-hora), así que hereda exactamente ese color/estado. Acá solo
     se ajusta tamaño/posición para la columna angosta de la vista semanal
     (en la diaria .agenda-block se posiciona dentro de .agenda-track, que es
     mucho más ancho). */
  .agenda-block.semana-block{
    z-index:1; padding:2px 5px; border-radius:5px;
  }
  .semana-block .agenda-block-cliente{ font-size:0.66rem; line-height:1.2; }
  .semana-block .agenda-block-hora{ font-size:0.6rem; line-height:1.15; }
  .semana-block .agenda-block-inner{ gap:0; }

  /* ---- Turnos (agenda diaria y semanal): overlay de pantalla completa
     (2.4.B para semana; 2.4.C acá para el día) ----
     Mismo lenguaje visual que .menu-lateral-overlay (1.6): fondo oscurecido
     de pantalla completa y, arriba, un panel que no ocupa el 100% — el
     panel es grande (95vw / 88vh) porque el pedido era "verla más grande",
     pero deliberadamente no llega a cubrir el todo el viewport: lo que
     sobra alrededor queda oscuro, como en cualquier overlay de la app, en
     vez de estirar la grilla a un tamaño artificial que no aporta nada (en
     la semana en particular, más ancho no ayuda porque las columnas son
     fijas de 104px con scroll horizontal; más alto sí, y por eso adentro
     .semana-grid-scroll/.agenda-grid-scroll pierden el límite de 64vh que
     tienen en la vista normal). Clases genéricas ".agenda-expandida-*"
     (no ".semana-expandida-*"): son dos overlays distintos —
     #semanaExpandidaOverlay y #diaExpandidaOverlay, cada uno con su propio
     slot/contenido movible — pero comparten exactamente el mismo look, así
     que comparten las mismas reglas en vez de duplicarlas. z-index 100: por
     encima del menú lateral (95) pero por debajo del menú de acciones de un
     turno (120/121) — tocar un turno acá adentro tiene que poder seguir
     abriendo ese menú por encima de este overlay. */
  .agenda-expandida-overlay{
    position: fixed; inset: 0; z-index: 100;
    background: rgba(0,0,0,0.6);
    opacity:0; pointer-events:none;
    transition: opacity 0.2s ease;
    display:flex; align-items:center; justify-content:center;
    padding: calc(10px + env(safe-area-inset-top)) 10px calc(10px + env(safe-area-inset-bottom));
  }
  .agenda-expandida-overlay.show{ opacity:1; pointer-events:auto; }
  /* Mismo motivo que en .cliente-detalle-overlay/.modal-overlay (ver esas
     notas): en compu la sidebar tiene que quedar siempre clickeable. */
  @media (min-width: 860px){
    .agenda-expandida-overlay{ left: var(--sidebar-w); }
  }
  .agenda-expandida-panel{
    width:95vw; max-width:900px; height:88vh; max-height:88vh;
    background: var(--bg-panel); border:1px solid var(--line); border-radius:16px;
    display:flex; flex-direction:column; overflow:hidden;
    box-shadow: 0 8px 30px rgba(0,0,0,0.4);
    transform: scale(0.96); opacity:0;
    transition: transform 0.2s ease, opacity 0.2s ease;
  }
  .agenda-expandida-overlay.show .agenda-expandida-panel{ transform:scale(1); opacity:1; }
  .agenda-expandida-header{
    display:flex; align-items:center; justify-content:space-between;
    padding:14px 14px 10px; flex-shrink:0; border-bottom:1px solid var(--line);
  }
  .agenda-expandida-titulo{ font-size:0.95rem; font-weight:800; color: var(--text); }
  .agenda-expandida-slot{
    flex:1; min-height:0; padding:12px; display:flex; flex-direction:column;
  }
  /* Adentro del slot, el contenido movible (nav + grilla) pasa a ocupar
     todo el alto disponible: la grilla crece con flex en vez de quedar
     topeada a 64vh como en la vista normal (más chica, con menos lugar
     alrededor). El resto (nav de fecha/semana + "Ir a esta semana", si
     aplica) mantiene su tamaño normal arriba. */
  .agenda-expandida-slot #semanaContenidoMovible,
  .agenda-expandida-slot #turnosDiaMovible{ display:flex; flex-direction:column; height:100%; min-height:0; }
  .agenda-expandida-slot .semana-grid-scroll,
  .agenda-expandida-slot .agenda-grid-scroll{ max-height:none; flex:1; min-height:0; cursor:default; }

/* ---------------- Pantalla de login / registro ---------------- */
.oculto{ display:none !important; }

.app-loading-overlay{
  position: fixed; inset: 0; z-index: 500;
  background: var(--bg-panel);
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:16px;
}
.app-loading-spinner{
  width: 38px; height: 38px; border-radius: 50%;
  border: 3px solid var(--bg-panel-2); border-top-color: var(--accent);
  animation: app-loading-girar 0.75s linear infinite;
}
.app-loading-texto{ color: var(--text-dim); font-size: 0.86rem; font-weight:600; }
@keyframes app-loading-girar{ to{ transform: rotate(360deg); } }

.login-pantalla{
  position:relative;
  min-height:100vh;
  display:flex;
  align-items:center;
  justify-content:center;
  padding: 24px 16px;
  overflow:hidden;
  background:
    radial-gradient(680px 420px at 50% -8%, rgba(201,138,62,0.16), transparent 60%),
    var(--bg);
}

.login-glow{
  position:absolute;
  top:-140px; left:50%;
  width:520px; height:420px;
  transform: translateX(-50%);
  background: radial-gradient(closest-side, rgba(201,138,62,0.30), transparent 72%);
  filter: blur(10px);
  pointer-events:none;
}

.login-card{
  position:relative;
  width:100%;
  max-width: 400px;
  background: linear-gradient(180deg, var(--bg-panel-2), var(--bg-panel));
  border: 1px solid var(--line);
  border-radius: 22px;
  padding: 32px 26px 26px;
  box-shadow: 0 24px 60px -20px rgba(0,0,0,0.55), 0 1px 0 rgba(255,255,255,0.03) inset;
}

.login-brand{ text-align:center; margin-bottom: 26px; }
.login-brand-icon{
  width:64px; height:64px;
  border-radius: 18px;
  margin-bottom: 14px;
  box-shadow: 0 10px 24px -10px rgba(201,138,62,0.55);
}

.login-logo{
  font-size: 1.4rem;
  margin: 0;
  color: var(--text);
  font-weight: 800;
  letter-spacing: 0.2px;
}
.login-logo .accent-mark{ color: var(--accent); }
.login-tagline{
  margin: 6px 0 0;
  font-size: 0.82rem;
  color: var(--text-dim);
}

.login-switch-mode{
  text-align:center;
  margin: 18px 0 0;
  font-size: 0.85rem;
  color: var(--text-dim);
}
.login-switch-mode #loginSwitchBtn{
  background:transparent; border:none; padding:0; min-height:auto;
  color: var(--accent); font-weight:700; font-size: 0.85rem;
  text-decoration:underline; cursor:pointer; margin-left:4px;
}
.login-switch-mode #loginSwitchBtn:active{ opacity:0.75; }

.login-back-btn{
  display:flex; align-items:center; gap:6px;
  background:transparent; border:none; padding:0; min-height:auto;
  color: var(--text-dim); font-size:0.85rem; font-weight:600;
  cursor:pointer; margin-bottom: 18px;
}
.login-back-btn svg{ width:16px; height:16px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.login-back-btn:active{ color: var(--text); }
.login-olvido-titulo{ font-size: 1.1rem; margin: 0 0 6px; color: var(--text); font-weight:800; }
.login-olvido-desc{ font-size: 0.84rem; color: var(--text-dim); margin: 0 0 20px; line-height:1.5; }
#loginOlvidoSection .login-field{ margin-bottom: 18px; }
#loginOlvidoSection .login-msg{ margin-bottom: 14px; }

.login-form{ display:flex; flex-direction:column; gap:16px; }

.login-field label{
  display:block;
  font-size:0.82rem;
  color: var(--text-dim);
  margin-bottom:7px;
  font-weight:600;
}

.login-input-wrap{ position:relative; display:flex; align-items:center; }
.login-input-icon{
  position:absolute; left:13px;
  width:18px; height:18px;
  fill:none; stroke: var(--text-dim); stroke-width:1.8;
  stroke-linecap:round; stroke-linejoin:round;
  pointer-events:none;
}
.login-input-wrap input,
.login-input-wrap select{
  width:100%;
  background: var(--bg-panel-2);
  border: 1px solid var(--line);
  color: var(--text);
  border-radius: calc(var(--radius) - 2px);
  padding: 12px 12px 12px 42px;
  font-size: 1rem;
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.login-input-wrap input:focus,
.login-input-wrap select:focus{
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(201,138,62,0.16);
}
.login-input-wrap select{ appearance:none; -webkit-appearance:none; padding-right:34px; }
.login-select-wrap::after{
  content:'';
  position:absolute; right:14px; pointer-events:none;
  width:8px; height:8px;
  border-right:1.6px solid var(--text-dim); border-bottom:1.6px solid var(--text-dim);
  transform: rotate(45deg) translateY(-3px);
}

.login-toggle-pass{
  position:absolute; right:4px;
  width:46px; height:46px;
  display:flex; align-items:center; justify-content:center;
  background:transparent; border:none; color: var(--text-dim);
  border-radius: 9px; cursor:pointer;
  transition: background 0.15s ease, color 0.15s ease;
}
.login-toggle-pass:hover{ background: var(--bg-panel); color: var(--text); }
.login-toggle-pass:active{ background: var(--bg-panel); }
.login-toggle-pass.activo{ color: var(--accent); }
.login-toggle-pass svg{ width:28px; height:28px; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; }
.login-input-wrap input[type="password"],
.login-input-wrap input[id="loginPassword"]{ padding-right: 54px; }

.login-submit-btn{ margin-top: 6px; padding: 13px 12px; font-size: 1rem; border-radius: calc(var(--radius) - 2px); box-shadow: 0 10px 26px -12px rgba(201,138,62,0.65); }

.login-forgot-wrap{ text-align:right; margin-top:-8px; }
.login-forgot-btn{
  background:transparent; border:none; padding:2px 0; min-height:auto;
  color: var(--text-dim); font-size:0.78rem; font-weight:600; text-decoration:underline;
}
.login-forgot-btn:active{ color: var(--accent); }

.login-msg{
  font-size: 0.86rem;
  padding: 11px 13px;
  border-radius: calc(var(--radius) - 4px);
  line-height:1.4;
  border: 1px solid transparent;
}
.login-msg-error{ background: var(--warn-soft); color: var(--warn); border-color: rgba(201,87,62,0.3); }
.login-msg-info{ background: var(--info-soft); color: var(--info); border-color: rgba(91,143,171,0.3); }

.login-footer{
  text-align:center;
  margin: 20px 0 0;
  font-size: 0.72rem;
  color: var(--text-dim);
  opacity:0.8;
}
