:root{--ink:#202522;--muted:#78807a;--subtle:#9ca39b;--paper:#f4f1e9;--card:#fffefa;--line:#e5e4dc;--lime:#cbe85b;--lime-dark:#849f24;--coral:#ef8b79;--sky:#9dd7e0;--gold:#f1b85d;--shadow:0 8px 26px rgba(40,45,35,.05);--tab-accent:#e8752e}*{box-sizing:border-box}body{margin:0;background:var(--as-bg-app);color:var(--as-text-primary);font-family:var(--as-font-sans);font-size:var(--as-font-size-sm);line-height:var(--as-line-height-normal)}.app-shell{display:flex;min-height:100vh}[hidden]{display:none!important}.sidebar{width:var(--as-sidebar-width);background:var(--as-surface);border-right:1px solid var(--as-border-subtle);display:flex;flex-direction:column;padding:29px 15px 18px;flex-shrink:0}.brand{display:flex;align-items:center;gap:10px;padding:0 12px 0}.brand-mark-img{width:44px;height:44px;object-fit:contain;display:block;flex-shrink:0}
.brand-col{display:flex;flex-direction:column;gap:4px;min-width:0}.brand-word-img{height:18px;width:auto;display:block}.brand-tagline{display:block;color:#8b948b;font:8.5px var(--as-font-sans);letter-spacing:.1px;line-height:1}.sidebar-heading{display:block;color:var(--as-text-muted);font:12px var(--as-font-sans);letter-spacing:1px;padding:0 13px 10px}.nav-list{display:grid;gap:4px;margin-bottom:30px}.nav-item{display:flex;align-items:center;gap:12px;width:100%;height:43px;padding:0 13px;background:transparent;border:1px solid transparent;border-radius:var(--as-radius-sm);color:var(--as-text-secondary);text-align:left;font-weight:bold;cursor:pointer;transition:background-color var(--as-duration-fast) var(--as-ease-standard),color var(--as-duration-fast) var(--as-ease-standard)}.nav-item:hover{background:var(--as-surface-hover);color:var(--as-ink-primary)}.nav-item.active{border-color:var(--as-brand-600);background:var(--as-brand-gradient);color:var(--as-text-inverse);box-shadow:var(--as-shadow-brand)}
.nav-item.active:hover,
.nav-item.active:focus-visible{background:var(--as-brand-gradient);box-shadow:var(--as-shadow-brand)}.nav-glyph{width:17px;text-align:center;font-size:17px;font-weight:normal}.nav-badge{margin-left:auto;background:var(--as-danger-500);color:var(--as-text-inverse);border-radius:5px;padding:3px 7px;font:12px var(--as-font-sans);font-variant-numeric:tabular-nums}.sidebar-note{margin-top:auto;display:flex;gap:9px;padding:14px 10px;background:#dfe5dc;border:1px solid #d9e0d7;border-radius:9px}.note-mark{background:var(--lime);width:24px;height:24px;border-radius:6px;display:grid;place-items:center;font-size:13px}.sidebar-note strong,.sidebar-note p{display:block;margin:0}.sidebar-note strong{font-size:13px}.sidebar-note p{color:var(--muted);font-size:13px;margin-top:3px}.sidebar-footer{display:flex;align-items:center;gap:9px;border-top:1px solid var(--as-border-subtle);margin-top:18px;padding:17px 7px 0}.sidebar-footer strong,.sidebar-footer span{display:block}.sidebar-footer strong{font-size:13px;color:var(--as-ink-primary)}.sidebar-footer span{color:var(--as-text-muted);font-size:13px;margin-top:2px}.user-avatar,.mini-avatar{display:grid;place-items:center;border-radius:50%;font-weight:bold;overflow:hidden;flex-shrink:0}.user-avatar img,.mini-avatar img,.user-panel-avatar img{width:100%;height:100%;object-fit:cover}.user-avatar{width:31px;height:31px;background:var(--as-brand-100);color:var(--as-ink-primary);font-size:13px;box-shadow:0 0 0 2px var(--as-surface)}.more-button{margin-left:auto;background:transparent;color:var(--muted);letter-spacing:2px}.main-content{flex:1;min-width:0}.topbar{height:73px;border-bottom:1px solid var(--as-border-subtle);display:flex;align-items:center;justify-content:space-between;padding:0 42px;background:var(--as-surface)}.crumb{display:flex;gap:12px;color:var(--as-text-muted);font-size:13px}.crumb b{font-weight:normal;color:var(--as-text-placeholder)}.crumb strong{color:var(--as-ink-primary)}.topbar-right{display:flex;align-items:center;gap:18px;position:relative}.notif-panel{position:absolute;top:40px;right:0;min-width:270px;background:var(--card);border:1px solid var(--line);border-radius:11px;box-shadow:0 16px 40px rgba(30,35,30,.14);padding:6px;z-index:15;overflow:hidden}.notif-panel[hidden]{display:none}.notif-header{padding:10px 12px 8px;font:11px var(--as-font-sans);letter-spacing:.7px;text-transform:uppercase;color:var(--subtle);border-bottom:1px solid var(--line);margin-bottom:4px}.notif-row{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:0;background:transparent;padding:10px 12px;border-radius:6px;font-size:13px;font-weight:bold;color:var(--ink);cursor:pointer;transition:background-color .12s ease,opacity .16s ease,transform .16s ease,max-height .16s ease,padding .16s ease,margin .16s ease}.notif-row:hover{background:#f2f3ee}.notif-row:active{transform:scale(.98)}.notif-row.removing{opacity:0;transform:translateX(10px)}.notif-dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}.notif-dot.expired,.notif-dot.pending{background:#d0685e}.notif-dot.expiring{background:#c08023}.notif-dot.credit{background:#78931c}.notif-chevron{margin-left:auto;color:var(--subtle);flex-shrink:0}.notif-empty{padding:14px 12px;color:var(--muted);font-size:13px}.insight-card{display:flex;align-items:flex-start;gap:12px;padding:16px 18px;border-radius:10px;margin-bottom:14px;border:1px solid transparent}.insight-card .insight-icon{flex-shrink:0;margin-top:1px}.insight-card strong{display:block;font-size:13px;margin-bottom:3px}.insight-card p{margin:0;font-size:13px;line-height:1.5;color:inherit;opacity:.92}.insight-card.good{background:#eef8d0;border-color:#d9ecab;color:#5f7616}.insight-card.warning{background:#fff0d8;border-color:#f2ddb0;color:#8a5f13}.insight-card.danger{background:#ffebe8;border-color:#f5c9c2;color:#a1382c}.insight-card.info{background:#e5f4f5;border-color:#c7e3e6;color:#2c6b73}.today-label{font:12px var(--as-font-sans);letter-spacing:.7px;color:var(--subtle)}.round-button,.mobile-menu{border:0;background:transparent;color:var(--as-text-muted);font-size:20px;position:relative;cursor:pointer;border-radius:50%;width:38px;height:38px;display:grid;place-items:center;transition:background-color var(--as-duration-fast) var(--as-ease-standard),color var(--as-duration-fast) var(--as-ease-standard)}.round-button:hover,.mobile-menu:hover{background:var(--as-surface-hover);color:var(--as-ink-primary);box-shadow:var(--as-shadow-xs)}.round-button:active,.mobile-menu:active{background:var(--as-border-subtle)}.round-button i{position:absolute;width:5px;height:5px;border-radius:50%;background:var(--as-danger-500);right:1px;top:1px}.mobile-menu{display:none}.content{max-width:var(--as-content-max-width);margin:auto;padding:var(--as-page-padding-desktop) var(--as-page-padding-desktop)}.page-heading{display:flex;justify-content:space-between;align-items:end;margin-bottom:28px}.page-heading-actions{display:flex;gap:8px}.eyebrow{margin:0 0 9px;color:var(--as-text-muted);font-family:var(--as-font-sans);font-size:var(--as-font-size-xs);font-weight:var(--as-font-weight-medium);letter-spacing:1px;text-transform:uppercase}.page-heading h1{font-family:var(--as-font-sans);font-weight:var(--as-font-weight-bold);font-size:var(--as-font-size-3xl);line-height:var(--as-line-height-tight);letter-spacing:-.5px;margin:0 0 var(--as-space-2)}.greeting-icon{display:inline-block;width:1em;height:1em;vertical-align:-.12em;flex-shrink:0;margin-left:2px}.page-subtitle{margin:0;color:var(--as-text-secondary)}.btn,
.btn-primary,
.btn-secondary,
.btn-tertiary,
.btn-warning,
.btn-danger,
.btn-danger-solid,
.btn-danger-text,
.btn-specialized-whatsapp,
.primary-button,
.secondary-button,
.danger-button,
.btn-payment,
.small-button{display:inline-flex;align-items:center;justify-content:center;border:1px solid transparent;font-family:inherit;font-weight:bold;line-height:1;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,background-color .12s ease,border-color .12s ease,color .12s ease,filter .12s ease}
.btn-md,
.primary-button,
.secondary-button,
.danger-button{height:var(--as-button-md);padding:0 19px;border-radius:7px;font-size:13px}
.btn-sm,
.small-button{height:var(--as-button-sm);padding:0 12px;border-radius:6px;font-size:13px}
.btn-lg{height:var(--as-button-lg);padding:0 26px;border-radius:7px;font-size:14px}
.btn-table-action{padding-left:10px;padding-right:10px}
.btn-icon{width:var(--as-icon-container-sm);height:var(--as-icon-container-sm);padding:0;border-radius:50%}
.btn-icon.btn-md{width:var(--as-icon-container-md);height:var(--as-icon-container-md)}
/* BLOQUE K1 — icono SVG de línea reutilizable (ver js/icons.js). Tamaño y
   grosor por token para que todos los iconos migrados a este sistema
   compartan el mismo lenguaje visual (auditoría Bloque K, punto 5). No fija
   márgenes propios: la separación respecto al texto la resuelve quien lo
   use (gap del contenedor, o una clase específica si hace falta), para no
   imponer un espaciado fijo a futuros consumidores de este mismo icono. */
.as-icon{display:block;flex:0 0 auto;width:var(--as-icon-sm);height:var(--as-icon-sm);fill:none;stroke:currentColor;stroke-width:var(--as-icon-stroke-width);stroke-linecap:round;stroke-linejoin:round}
/* BLOQUE K2 — contenedor tonal pequeño y reutilizable para .as-icon: círculo
   con fondo suave + icono en el color del tono (estilo duotono, ver
   docs/design/DESIGN.md §5). data-tone="brand" = acento de marca/acción;
   data-tone="warning" = pendiente que requiere atención (ej. recordatorios);
   data-tone="neutral" = información sin carga semántica (ej. hora
   calculada). Mismo token de tamaño que .btn-icon. */
.as-icon-tonal{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:var(--as-icon-container-sm);height:var(--as-icon-container-sm);border-radius:50%}
.as-icon-tonal[data-tone="brand"]{background:var(--as-brand-100);color:var(--as-brand-600)}
.as-icon-tonal[data-tone="warning"]{background:var(--as-warning-50);color:var(--as-warning-600)}
.as-icon-tonal[data-tone="neutral"]{background:var(--as-gray-100);color:var(--as-ink-secondary)}
/* BLOQUE K1 — separación entre .as-icon y el texto en los enlaces de
   contacto de la ficha de Proveedores (Llamar/Correo). No se agrega a
   .secondary-button porque esa clase es compartida por toda la app. */
.sup-contact-link{gap:6px}
.btn-primary,
.primary-button{background:var(--as-brand-gradient);border-color:transparent;color:var(--as-text-inverse);box-shadow:var(--as-shadow-brand)}
.btn-primary:hover,
.primary-button:hover{transform:translateY(-1px);box-shadow:var(--as-shadow-md)}
.btn-primary:active,
.primary-button:active{transform:translateY(0);box-shadow:var(--as-shadow-xs)}
.primary-button span{display:inline-flex;color:currentColor;margin-right:5px}.primary-button span .as-icon{width:14px;height:14px}.primary-button .qn-icon,.secondary-button .qn-icon{margin-right:5px}
.btn-secondary,
.secondary-button,
.btn-tertiary,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):not(.btn-payment){background:linear-gradient(180deg,var(--as-gray-50) 0%,var(--as-gray-100) 100%);border-color:var(--as-border-default);color:var(--as-ink-secondary)}
.btn-secondary,
.secondary-button{box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-sm)}
.btn-tertiary,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):not(.btn-payment){box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-xs)}
.btn-secondary:hover,
.secondary-button:hover,
.btn-tertiary:hover,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):not(.btn-payment):hover{background:linear-gradient(180deg,var(--as-gray-100) 0%,var(--as-gray-200) 100%);border-color:var(--as-border-strong);color:var(--as-ink-primary);transform:translateY(-1px)}
.btn-secondary:hover,
.secondary-button:hover{box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-md)}
.btn-tertiary:hover,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):not(.btn-payment):hover{box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-sm)}
.btn-secondary:active,
.secondary-button:active,
.btn-tertiary:active,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):not(.btn-payment):active{background:var(--as-gray-200);border-color:var(--as-border-strong);color:var(--as-ink-primary);box-shadow:inset 0 1px 2px var(--as-gray-300);transform:translateY(1px)}
.btn-payment{background:linear-gradient(180deg,var(--as-success-50) 0%,var(--as-success-100) 100%);border-color:var(--as-success-100);color:var(--as-success-700);box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-xs)}
.btn-payment:hover{background:var(--as-success-100);border-color:var(--as-success-500);color:var(--as-success-700);box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-sm);transform:translateY(-1px)}
.btn-payment:active{background:var(--as-success-100);border-color:var(--as-success-500);color:var(--as-success-700);box-shadow:inset 0 1px 2px var(--as-success-100);transform:translateY(1px)}
.btn-warning{background:var(--as-warning-50);border-color:var(--as-warning-100);color:var(--as-warning-600)}
.btn-warning:hover{background:var(--as-warning-100)}
.btn-warning:active{background:var(--as-warning-100);filter:brightness(.96)}
.btn-danger,
.danger-button,
.small-button.danger{background:var(--as-danger-50);border-color:var(--as-danger-100);color:var(--as-danger-600)}
.btn-danger:hover,
.danger-button:hover,
.small-button.danger:hover{background:var(--as-danger-100);color:var(--as-danger-700)}
.btn-danger:active,
.danger-button:active,
.small-button.danger:active{background:var(--as-danger-100);filter:brightness(.96)}
.btn-danger-solid{background:var(--as-danger-600);border-color:var(--as-danger-700);color:var(--as-text-inverse)}
.btn-danger-solid:hover{background:var(--as-danger-700)}
.btn-danger-solid:active{background:var(--as-danger-700);filter:brightness(.92)}
.btn-danger-text{background:transparent;border-color:transparent;color:var(--as-danger-600);padding-left:4px;padding-right:4px}
.btn-danger-text:hover{color:var(--as-danger-700);text-decoration:underline}
.btn-specialized-whatsapp{background:#25d366;border-color:#25d366;color:#fff}
.btn-specialized-whatsapp:hover{background:#20bd5a;border-color:#20bd5a}
.btn:focus-visible,
.btn-primary:focus-visible,
.btn-secondary:focus-visible,
.btn-tertiary:focus-visible,
.btn-warning:focus-visible,
.btn-danger:focus-visible,
.btn-danger-solid:focus-visible,
.btn-danger-text:focus-visible,
.btn-specialized-whatsapp:focus-visible,
.primary-button:focus-visible,
.secondary-button:focus-visible,
.danger-button:focus-visible,
.small-button:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px;box-shadow:var(--as-focus-ring)}
.btn-secondary:focus-visible,
.secondary-button:focus-visible{box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-sm),var(--as-focus-ring)}
.btn-tertiary:focus-visible,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):focus-visible{box-shadow:inset 0 1px 0 var(--as-surface),var(--as-shadow-xs),var(--as-focus-ring)}
.btn:disabled,
.btn-primary:disabled,
.btn-secondary:disabled,
.btn-tertiary:disabled,
.btn-warning:disabled,
.btn-danger:disabled,
.btn-danger-solid:disabled,
.btn-danger-text:disabled,
.primary-button:disabled,
.secondary-button:disabled,
.danger-button:disabled,
.small-button:disabled,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):disabled{opacity:.5;cursor:not-allowed;box-shadow:none;transform:none;filter:none}
.btn:disabled:hover,
.btn-primary:disabled:hover,
.btn-secondary:disabled:hover,
.btn-tertiary:disabled:hover,
.btn-warning:disabled:hover,
.btn-danger:disabled:hover,
.btn-danger-solid:disabled:hover,
.btn-danger-text:disabled:hover,
.primary-button:disabled:hover,
.secondary-button:disabled:hover,
.danger-button:disabled:hover,
.small-button:disabled:hover,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):disabled:hover{box-shadow:none;transform:none}
.btn-secondary:disabled,
.secondary-button:disabled,
.btn-tertiary:disabled,
.btn-payment:disabled,
.small-button:not(.danger):not(.debts-whatsapp):not(.receipt-whatsapp):disabled{background:var(--as-gray-100);border-color:var(--as-border-subtle);color:var(--as-text-muted);box-shadow:none}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:13px;margin-bottom:14px}.stats-grid-3col{grid-template-columns:repeat(3,1fr)}.stat-card{background:var(--card);border:1px solid var(--line);border-radius:9px;box-shadow:var(--shadow)}
.panel{background:var(--as-surface);border:1px solid var(--as-border-subtle);border-radius:var(--as-radius-lg);box-shadow:var(--as-shadow-sm)}.stat-card{padding:17px 18px;min-height:128px;display:block;width:100%;text-align:left;font:inherit;color:inherit;cursor:pointer;transition:transform .15s ease,box-shadow .15s ease}.stat-card:hover{box-shadow:0 12px 30px rgba(40,45,35,.1);transform:translateY(-2px)}.stat-card:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}.stat-card header{display:flex;justify-content:space-between;color:var(--muted);font-size:13px}.stat-icon{width:23px;height:23px;border-radius:50%;display:grid;place-items:center;font-weight:bold}.stat-icon.lime{background:#eef8ce;color:var(--lime-dark)}.stat-icon.coral{background:#ffebe7;color:#d46b60}.stat-icon.sky{background:#e4f4f6;color:#559baa}.stat-icon.gold{background:#fff0dc;color:#c68228}.stat-card>strong{display:block;margin:12px 0 10px;font:bold 25px var(--as-font-sans);font-variant-numeric:tabular-nums}.stat-danger>strong{color:#d0685e}.stat-warning>strong{color:#c68228}.stat-positive>strong{color:#78931c}.stat-foot{color:var(--muted);font-size:13px}.positive{color:#809b20;font:12px Consolas,monospace;margin-right:5px}.negative{color:#d46d61;font:12px Consolas,monospace;margin-right:5px}.grid-two{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(360px,.85fr);gap:14px;margin-bottom:14px}.panel{padding:20px 21px}.panel-heading{display:flex;justify-content:space-between;align-items:start}.panel-heading h2{color:var(--as-ink-primary);font-size:var(--as-font-size-sm);margin:0 0 5px}.panel-heading p{color:var(--as-text-secondary);font-size:var(--as-font-size-sm);margin:0}.simple-link{background:none;border:0;color:var(--as-ink-secondary);font-size:13px;font-weight:bold;cursor:pointer;transition:color .12s ease}.simple-link:hover{color:var(--as-brand-700);text-decoration:underline}.simple-link:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}.simple-link:disabled{color:var(--as-text-muted);cursor:not-allowed}.bars{height:205px;display:flex;align-items:end;justify-content:space-around;gap:10px;padding:25px 8px 0;border-bottom:1px solid var(--line);background:repeating-linear-gradient(to bottom,transparent 0,transparent 49px,#edf0e9 50px)}.bar-column{height:100%;display:flex;flex-direction:column;justify-content:end;align-items:center;gap:9px;flex:1}.bar-value{font:11px Consolas,monospace;color:var(--muted)}.bar{width:100%;max-width:39px;border-radius:5px 5px 0 0;background:var(--lime);min-height:8px}.bar.today{background:var(--ink)}.bar-label{font:11px Consolas,monospace;color:var(--subtle);transform:translateY(27px)}.activity-list{margin-top:17px}.activity{display:flex;align-items:center;gap:10px;padding:11px 0;border-top:1px solid #eff0eb}.activity:first-child{border-top:0}.mini-avatar{width:32px;height:32px;font-size:13px;background:var(--sky)}.mini-avatar.alt{background:var(--gold)}.mini-avatar.alt2{background:#d7b7d4}.activity-copy{flex:1}.activity-copy strong,.activity-copy small{display:block}.activity-copy strong{font-size:13px}.activity-copy small{color:var(--muted);font-size:13px;margin-top:2px}.activity-amount{font:bold 13px var(--as-font-sans);font-variant-numeric:tabular-nums}.activity-amount.paid{color:#78951d}.table-panel{margin-bottom:14px}.table-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start;gap:12px;margin:20px 0 14px}.search-box{position:relative;flex:1}.search-box input{width:100%;padding-left:32px}.search-box span{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--as-text-muted);line-height:1;transition:color var(--as-duration-fast) var(--as-ease-standard)}.search-box span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.search-box:focus-within span{color:var(--as-brand-600)}
.table-toolbar .search-box{flex:1 1 320px;min-width:320px}
.table-toolbar .filter-select,
.agenda-filters .filter-select{width:auto;flex:0 0 auto}
input:not([type]),
input[type="text"],
input[type="search"],
input[type="tel"],
input[type="email"],
input[type="password"],
input[type="url"],
input[type="number"],
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"],
input[type="week"],
select,
textarea,
.form-control{
  background:var(--as-surface);
  border:1px solid var(--as-border-default);
  border-radius:var(--as-radius-xs);
  min-height:var(--as-control-md);
  padding:10px;
  color:var(--as-ink-primary);
  outline:none;
  width:100%;
  font-family:var(--as-font-sans);
  font-size:var(--as-font-size-sm);
  transition:border-color var(--as-duration-fast) var(--as-ease-standard),box-shadow var(--as-duration-fast) var(--as-ease-standard);
}
input:not([type])::placeholder,
input[type="text"]::placeholder,
input[type="search"]::placeholder,
input[type="tel"]::placeholder,
input[type="email"]::placeholder,
input[type="password"]::placeholder,
input[type="url"]::placeholder,
input[type="number"]::placeholder,
input[type="date"]::placeholder,
input[type="time"]::placeholder,
input[type="datetime-local"]::placeholder,
input[type="month"]::placeholder,
input[type="week"]::placeholder,
select::placeholder,
textarea::placeholder,
.form-control::placeholder{
  color:var(--as-text-muted);
}
input:not([type]):focus,
input[type="text"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="email"]:focus,
input[type="password"]:focus,
input[type="url"]:focus,
input[type="number"]:focus,
input[type="date"]:focus,
input[type="time"]:focus,
input[type="datetime-local"]:focus,
input[type="month"]:focus,
input[type="week"]:focus,
select:focus,
textarea:focus,
.form-control:focus{
  border-color:var(--as-focus-border);
  box-shadow:var(--as-focus-ring);
}
input:not([type]):disabled,
input[type="text"]:disabled,
input[type="search"]:disabled,
input[type="tel"]:disabled,
input[type="email"]:disabled,
input[type="password"]:disabled,
input[type="url"]:disabled,
input[type="number"]:disabled,
input[type="date"]:disabled,
input[type="time"]:disabled,
input[type="datetime-local"]:disabled,
input[type="month"]:disabled,
input[type="week"]:disabled,
select:disabled,
textarea:disabled,
.form-control:disabled{
  background:var(--as-gray-100);
  border-color:var(--as-border-subtle);
  color:var(--as-text-muted);
  cursor:not-allowed;
  box-shadow:none;
  opacity:1;
}
input:not([type])[readonly],
input[type="text"][readonly],
input[type="search"][readonly],
input[type="tel"][readonly],
input[type="email"][readonly],
input[type="password"][readonly],
input[type="url"][readonly],
input[type="number"][readonly],
input[type="date"][readonly],
input[type="time"][readonly],
input[type="datetime-local"][readonly],
input[type="month"][readonly],
input[type="week"][readonly],
textarea[readonly],
.form-control[readonly]{
  background:var(--as-surface-secondary);
  border-color:var(--as-border-default);
  color:var(--as-ink-secondary);
}
input:not([type])[readonly],
input[type="text"][readonly],
input[type="search"][readonly],
input[type="tel"][readonly],
input[type="email"][readonly],
input[type="password"][readonly],
input[type="url"][readonly],
textarea[readonly],
.form-control[readonly]{
  cursor:text;
}
input:not([type])[readonly]:focus,
input[type="text"][readonly]:focus,
input[type="search"][readonly]:focus,
input[type="tel"][readonly]:focus,
input[type="email"][readonly]:focus,
input[type="password"][readonly]:focus,
input[type="url"][readonly]:focus,
input[type="number"][readonly]:focus,
input[type="date"][readonly]:focus,
input[type="time"][readonly]:focus,
input[type="datetime-local"][readonly]:focus,
input[type="month"][readonly]:focus,
input[type="week"][readonly]:focus,
textarea[readonly]:focus,
.form-control[readonly]:focus{
  border-color:var(--as-focus-border);
  box-shadow:var(--as-focus-ring);
}
.form-check{display:flex;align-items:center;gap:var(--as-space-2)}
.form-check-input{width:16px;height:16px;margin:0;flex:0 0 auto;accent-color:var(--as-brand-600);cursor:pointer}
.form-check-input:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.form-check-input:disabled{cursor:not-allowed;opacity:.6}
input:not([type]).form-control-sm,
input[type="text"].form-control-sm,
input[type="search"].form-control-sm,
input[type="tel"].form-control-sm,
input[type="email"].form-control-sm,
input[type="password"].form-control-sm,
input[type="url"].form-control-sm,
input[type="number"].form-control-sm,
input[type="date"].form-control-sm,
input[type="time"].form-control-sm,
input[type="datetime-local"].form-control-sm,
input[type="month"].form-control-sm,
input[type="week"].form-control-sm,
select.form-control-sm,
textarea.form-control-sm,
.form-control.form-control-sm{
  min-height:var(--as-control-sm);
  padding:var(--as-space-2);
  font-size:var(--as-font-size-xs);
}
input:not([type]).form-control-md,
input[type="text"].form-control-md,
input[type="search"].form-control-md,
input[type="tel"].form-control-md,
input[type="email"].form-control-md,
input[type="password"].form-control-md,
input[type="url"].form-control-md,
input[type="number"].form-control-md,
input[type="date"].form-control-md,
input[type="time"].form-control-md,
input[type="datetime-local"].form-control-md,
input[type="month"].form-control-md,
input[type="week"].form-control-md,
select.form-control-md,
textarea.form-control-md,
.form-control.form-control-md{
  min-height:var(--as-control-md);
  padding:10px;
  font-size:var(--as-font-size-sm);
}
input:not([type]).form-control-lg,
input[type="text"].form-control-lg,
input[type="search"].form-control-lg,
input[type="tel"].form-control-lg,
input[type="email"].form-control-lg,
input[type="password"].form-control-lg,
input[type="url"].form-control-lg,
input[type="number"].form-control-lg,
input[type="date"].form-control-lg,
input[type="time"].form-control-lg,
input[type="datetime-local"].form-control-lg,
input[type="month"].form-control-lg,
input[type="week"].form-control-lg,
select.form-control-lg,
textarea.form-control-lg,
.form-control.form-control-lg{
  min-height:var(--as-control-lg);
  padding:var(--as-space-3);
  font-size:var(--as-font-size-base);
}
.table-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%;min-width:690px;text-align:left}th{padding:0 10px 10px;color:#9ca49c;font:11px var(--as-font-sans);letter-spacing:.5px;font-weight:normal}td{padding:11px 10px;border-top:1px solid #eff0eb;color:#69736b;font-size:13px}.client-cell{display:flex;align-items:center;gap:9px}.client-cell strong{color:var(--ink);font-size:13px}.mini-avatar.coral{background:#f2b4a4}.status{display:inline-flex;align-items:center;gap:5px;padding:5px 9px;border-radius:5px;font-size:13px;font-weight:bold;white-space:nowrap}.status:before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor}.status.active{background:#eef8d0;color:#78931c}.status.expiring{background:#fff0d8;color:#c08023}.status.expired{background:#ffebe8;color:#d0685e}.status.paid{background:#e5f4f5;color:#4d8f99}.status.pending{background:#fff0d8;color:#bd7924}.row-actions{display:flex;gap:5px}
.detail-header{display:flex;justify-content:space-between;align-items:start;margin-bottom:18px}.detail-title{display:flex;align-items:center;gap:12px}.detail-title .mini-avatar{width:120px;height:120px;font-size:30px}.detail-title h1{margin:0 0 3px;font:25px var(--as-font-sans);font-weight:var(--as-font-weight-bold)}.detail-title p{margin:0;color:var(--muted);font-size:13px}.detail-actions{display:flex;gap:8px}.detail-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:14px}.info-card{background:var(--as-surface-secondary);border:1px solid var(--as-border-subtle);border-radius:var(--as-radius-md);padding:15px}.info-card span,.info-card strong{display:block}.info-card span{color:var(--as-text-muted);font-size:var(--as-font-size-sm);margin-bottom:7px}.info-card strong{font-family:var(--as-font-sans);font-weight:var(--as-font-weight-bold);font-size:var(--as-font-size-md)}.info-card small{display:block;color:var(--muted);font-size:13px;margin-top:4px}.modal-layer{position:fixed;inset:0;background:rgba(32,37,34,.38);display:grid;place-items:center;padding:18px;z-index:10}.modal-layer[hidden]{display:none}.modal{background:var(--card);width:min(100%,530px);max-height:90vh;overflow-y:auto;overflow-x:hidden;border-radius:10px;padding:25px;position:relative;box-shadow:0 24px 70px rgba(30,35,30,.24)}
/* Alto real disponible en móvil (barra de direcciones que aparece/desaparece):
   90vh puede ser más alto que lo que en verdad se ve, dejando contenido o los
   botones del final cortados. 100dvh sigue el viewport visual real; los 36px
   son el padding (18px arriba + 18px abajo) que .modal-layer ya reserva. */
@media(max-width:680px){.modal{max-height:calc(100dvh - 36px)}}.modal h2{font:25px var(--as-font-sans);font-weight:var(--as-font-weight-bold);margin:0 0 5px}.modal-intro{color:var(--muted);margin:0 0 20px;font-size:13px}.close-button{position:absolute;right:16px;top:12px;border:0;background:transparent;color:var(--muted);font-size:0;cursor:pointer;border-radius:50%;width:32px;height:32px;display:grid;place-items:center;transition:background-color .12s ease,color .12s ease}.close-button::before{content:'';display:block;width:16px;height:16px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 6l12 12M18 6L6 18'/%3E%3C/svg%3E") center/contain no-repeat}.close-button:hover{background:#eef0e9;color:var(--ink)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:13px}.form-field{display:grid;gap:6px}.form-field.full{grid-column:1/-1}.form-field label{font-size:13px;font-weight:bold;color:var(--as-ink-secondary)}.form-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:20px}.calc-display{background:var(--ink);color:#fff;border-radius:8px;padding:18px 16px;text-align:right;font:bold 30px var(--as-font-sans);font-variant-numeric:tabular-nums;margin:16px 0;overflow-x:auto;white-space:nowrap}.calc-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.calc-btn{border:0;border-radius:8px;padding:16px 0;font:bold 16px var(--as-font-sans);background:#eef0e9;color:var(--ink);cursor:pointer;transition:transform .1s ease,box-shadow .1s ease,background-color .1s ease}.calc-btn:hover{background:#e2e5dc;transform:translateY(-1px);box-shadow:0 4px 10px rgba(40,45,35,.12)}.calc-btn:active{transform:translateY(0) scale(.96);box-shadow:none}.calc-op{background:#fbead0;color:#c68228}.calc-op:hover{background:#f6ddb2}.calc-equals{background:var(--ink);color:#fff}.calc-equals:hover{background:#39413b}.history-table{min-width:0}.history-table td{vertical-align:top}.history-table td:first-child{color:var(--muted);font:12px var(--as-font-sans)}.amount{font:bold 13px var(--as-font-sans);font-variant-numeric:tabular-nums;color:#78951d}.mora{font:bold 13px var(--as-font-sans);font-variant-numeric:tabular-nums;color:#d0685e}.credit-amount{font:bold 13px var(--as-font-sans);font-variant-numeric:tabular-nums;color:#78931c}.balance{font:12px var(--as-font-sans);font-variant-numeric:tabular-nums;color:var(--muted)}.empty{padding:32px;text-align:center;color:var(--as-text-muted);font-size:var(--as-font-size-sm)}.toast{position:fixed;bottom:22px;right:22px;background:var(--ink);color:white;padding:12px 16px;border-radius:7px;box-shadow:var(--shadow);font-size:13px;transform:translateY(20px);opacity:0;pointer-events:none;transition:.25s;z-index:20}.toast.show{transform:none;opacity:1}@media(max-width:1100px){.sidebar{width:210px}.content,.topbar{padding-left:var(--as-page-padding-tablet);padding-right:var(--as-page-padding-tablet)}.stats-grid{grid-template-columns:repeat(2,1fr)}.grid-two{grid-template-columns:1fr}.sidebar .brand-tagline{font-size:6.5px;letter-spacing:.1px}}@media(max-width:680px){.sidebar{position:fixed;left:-240px;top:0;bottom:0;z-index:12;transition:left .22s}.sidebar.open{left:0}.topbar{height:var(--as-topbar-height);padding:0 var(--as-page-padding-mobile)}.mobile-menu{display:block;margin-right:11px}.crumb span,.today-label{display:none}.topbar-right{margin-left:auto}.content{padding:var(--as-page-padding-mobile) var(--as-page-padding-mobile)}.page-heading{display:block}.page-heading h1{font-size:27px}.page-heading-actions{width:100%;flex-direction:column;margin-top:18px}.page-heading .primary-button,.page-heading .secondary-button{width:100%;margin-top:0}.page-heading>.primary-button{width:100%;margin-top:18px}.stats-grid{gap:9px}.stat-card{padding:14px;min-height:120px}.stat-card>strong{font-size:21px}.stat-foot{line-height:1.7}.grid-two{gap:10px}.panel{padding:17px 15px}.table-toolbar{display:block}.table-toolbar .search-box{width:100%}.filter-select{margin-top:9px}.detail-header{display:block}.detail-title .mini-avatar{width:88px;height:88px;font-size:22px}.detail-actions{margin-top:15px}.detail-grid{grid-template-columns:1fr 1fr}.form-grid{grid-template-columns:1fr}.form-field.full{grid-column:auto}.form-actions{flex-direction:column-reverse}.form-actions button{width:100%}.toast{left:15px;right:15px;bottom:15px;text-align:center}}.receipt-list{margin-top:16px;display:grid;gap:8px}.receipt-row{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#f8f8f3;border:1px solid var(--line);border-radius:7px}.receipt-icon{display:inline-flex;flex-shrink:0;color:var(--as-text-muted)}.receipt-icon .as-icon{width:18px;height:18px}.receipt-info{flex:1;min-width:0}.receipt-info strong{display:block;font-size:13px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.receipt-info small{display:block;color:var(--muted);font-size:13px;margin-top:2px}.row-num{width:1%;white-space:nowrap;color:var(--subtle);font:12px var(--as-font-sans);font-variant-numeric:tabular-nums;text-align:center}.ficha-cell{width:1%;white-space:nowrap;text-align:center}.row-num-badge{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:#eef0e9;color:var(--muted);font:bold 11px var(--as-font-sans);font-variant-numeric:tabular-nums;display:grid;place-items:center}.voided-row{opacity:.6}.voided-amount{text-decoration:line-through}.method-breakdown{margin-top:16px;display:grid;gap:8px}.method-row{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#f8f8f3;border:1px solid var(--line);border-radius:7px;width:100%;font:inherit;text-align:left;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,background-color .12s ease,border-color .12s ease}.method-row:hover{background:#eef0e9;transform:translateY(-1px);box-shadow:0 4px 10px rgba(40,45,35,.1)}.method-row:active{transform:translateY(0);box-shadow:none}.method-row.active{border-color:var(--lime-dark);background:#eef8ce}.user-panel{min-width:262px;padding:0;overflow:hidden}.user-panel-header{display:flex;align-items:center;gap:11px;padding:16px 14px;background:#f8f8f3;border-bottom:1px solid var(--line)}.user-panel-avatar{width:38px;height:38px;border-radius:50%;background:var(--lime);color:var(--ink);display:grid;place-items:center;font:bold 14px var(--as-font-sans);flex-shrink:0;overflow:hidden;box-shadow:0 0 0 2px #fff}.user-panel-header strong{display:block;font-size:13px;color:var(--ink)}.user-panel-header span{display:block;color:var(--muted);font-size:11px;margin-top:1px}.user-panel-role{display:inline-flex;align-items:center;gap:3px;margin-top:5px;padding:2px 7px;border-radius:4px;background:#eef8ce;color:var(--lime-dark);font:bold 9px var(--as-font-sans);letter-spacing:.4px;text-transform:uppercase}.user-panel-role .as-icon{width:10px;height:10px;fill:currentColor;stroke:none}.user-panel-role.owner{background:linear-gradient(135deg,#fff0dc,#f8ddb0);color:#a8761a}.receipt-row.needs-price{border-color:#f1cf94;background:#fff8ec}.needs-price-tag{color:#c68228;font-weight:bold}.fee-warning{display:block;color:#c68228;font-size:11px;margin-top:6px}.user-panel-group{padding:6px}.user-panel-row{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:0;background:transparent;padding:9px 10px;border-radius:6px;font-size:12px;font-weight:bold;color:var(--ink);cursor:pointer;transition:background-color .12s ease}.user-panel-row:hover{background:#f2f3ee}.user-panel-row svg{flex-shrink:0;color:var(--subtle)}.user-panel-row.danger{color:#cf645b}.user-panel-row.danger svg{color:#cf645b}.user-panel-row.danger:hover{background:#ffebe8}.user-panel-divider{height:1px;background:var(--line);margin:2px 6px}.method-name{font-weight:bold;font-size:13px;color:var(--ink)}.method-count{color:var(--muted);font-size:13px}.method-amount{margin-left:auto;font:bold 13px var(--as-font-sans);font-variant-numeric:tabular-nums;color:#78951d}
.password-field{position:relative;display:block;width:100%}.password-field input{padding-right:38px}.password-toggle{position:absolute;top:50%;right:6px;transform:translateY(-50%);width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:var(--muted);cursor:pointer;border-radius:6px}.password-toggle:hover{color:var(--ink);background:#eef1e6}.password-toggle:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}.password-toggle .eye-off-path{display:none}.password-toggle[aria-pressed="true"] .eye-open-path{display:none}.password-toggle[aria-pressed="true"] .eye-off-path{display:inline}.sidebar-backdrop{display:none}
/* Sistema visual oficial de ASISTIDA — capa estructural (sidebar/topbar). */@media(max-width:680px){.sidebar-backdrop{position:fixed;inset:0;background:var(--as-overlay);z-index:11;opacity:0;pointer-events:none;transition:opacity .2s;display:block}.sidebar.open+.sidebar-backdrop{opacity:1;pointer-events:auto}.responsive-table thead{display:none}.responsive-table,.responsive-table tbody,.responsive-table tr{display:block;width:100%}.responsive-table{border:none;min-width:0;width:100%}.responsive-table tr{background:#fff;border:1px solid var(--line);border-radius:10px;margin-bottom:12px;padding:2px 14px}.table-wrap .responsive-table tr:last-child{margin-bottom:0}.responsive-table td{display:block;padding:9px 0;border-bottom:1px solid #eceee6;text-align:left}.responsive-table td:last-child{border-bottom:none}.responsive-table td[data-label]::before{content:attr(data-label);display:block;font:700 10px/1.3 var(--as-font-sans);letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:3px}.responsive-table td.row-num{display:none}.responsive-table td.actions-cell{padding-top:12px}.responsive-table .row-actions{flex-wrap:wrap}.responsive-table .row-actions .small-button{flex:1 1 auto}.responsive-table td.actions-cell,.responsive-table td.ficha-cell{display:inline-flex;vertical-align:middle;width:auto;border-bottom:0}.responsive-table td.actions-cell{padding-right:8px}}.receipt-row{flex-wrap:wrap}.receipt-info{flex:1 1 160px;min-width:0}.receipt-row .small-button{flex:0 0 auto}
.pagination{display:flex;align-items:center;justify-content:center;gap:14px;padding:16px 0 4px}.pagination-label{color:var(--muted);font-size:12px}.pagination .small-button[disabled]{opacity:.45;cursor:default}
.field-note{display:block;color:#9aa29a;font-size:10.5px;margin-top:4px}

/* Ajuste visual de la marca en la barra lateral. */
.sidebar .brand-word-img{height:19.5px}
.sidebar .brand-tagline{font-size:9.5px;line-height:1.1}
@media(max-width:1100px){.sidebar .brand-tagline{font-size:8.5px}}

/* Iconos de navegación: SVG de línea (mismo estilo que calculadora/notificaciones/usuario), escalan con el font-size ya definido en .nav-glyph. */
.nav-glyph{display:inline-flex;align-items:center;justify-content:center}
.nav-glyph svg{width:1em;height:1em;display:block;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}

/* Módulo independiente de Inventario y ventas */
.sidebar{overflow-y:auto}
/* Separación de módulos: cada bloque del menú solo aparece si el negocio lo tiene activo. */
body[data-no-inventory] .inventory-heading,body[data-no-inventory] .inventory-nav,body[data-no-inventory] .as-mnav__set[data-core="comercial"]{display:none!important}
body[data-no-services] .gestion-heading,body[data-no-services] .gestion-nav,body[data-no-services] .as-mnav__set[data-core="gestion"]{display:none!important}
.inventory-heading{padding-top:2px;border-top:1px solid var(--as-border-subtle);margin-top:-12px;padding-top:18px}
.inventory-nav{gap:3px;margin-bottom:20px}.inventory-nav .nav-item{height:39px}
.inventory-nav .inventory-live-button{height:43px;margin:4px 0 5px;background:transparent;color:var(--as-text-secondary);border:1px solid transparent;box-shadow:none;font-size:13px}.inventory-nav .inventory-live-button:hover{background:var(--as-surface-hover);color:var(--as-ink-primary);transform:none;box-shadow:none}.inventory-nav .inventory-live-button.active{border-color:var(--as-brand-600);background:var(--as-brand-gradient);color:var(--as-text-inverse);transform:translateY(-1px);box-shadow:var(--as-shadow-brand)}
.inventory-nav .inventory-live-button.active:hover,
.inventory-nav .inventory-live-button.active:focus-visible{background:var(--as-brand-gradient);box-shadow:var(--as-shadow-brand)}.inventory-live-cart svg{display:block;width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.inventory-live-dot{width:9px;height:9px;margin-left:auto;border-radius:50%;background:var(--as-danger-500);box-shadow:0 0 0 3px rgba(244,63,94,.1)}.inventory-live-button.active .inventory-live-dot{background:var(--as-success-500);box-shadow:0 0 0 3px rgba(16,185,129,.18)}
.inventory-page-heading{align-items:center}.inventory-loading,.inventory-state{text-align:center;padding:44px 24px}
.inventory-loading span{display:inline-block;width:26px;height:26px;border:3px solid #dfe5dc;border-top-color:var(--lime-dark);border-radius:50%;animation:inventory-spin .8s linear infinite}
.inventory-loading p,.inventory-state p{color:var(--muted)}.inventory-state-icon{display:grid;place-items:center;width:38px;height:38px;margin:0 auto 12px;border-radius:50%;background:#ffebe8;color:#d0685e;font-weight:bold;font-size:0}.inventory-state-icon::before{content:'';display:block;width:19px;height:19px;background:currentColor;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cpath d='M12 9v4'/%3E%3Cpath d='M12 17h.01'/%3E%3C/svg%3E") center/contain no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z'/%3E%3Cpath d='M12 9v4'/%3E%3Cpath d='M12 17h.01'/%3E%3C/svg%3E") center/contain no-repeat}
@keyframes inventory-spin{to{transform:rotate(360deg)}}
.inventory-family-grid{display:grid;gap:14px}.inventory-family-card{overflow:hidden}.inventory-family-card .panel-heading{margin-bottom:14px}.inventory-family-card h2{font:22px Georgia,serif;margin:0}
.inventory-count{padding:5px 9px;border-radius:999px;background:#eef0e9;color:var(--muted);font-size:11px}.inventory-table strong{color:var(--ink)}.inventory-table small,.code-value{display:block}.code-value{font:11px Consolas,monospace;color:#5f6861}.inventory-table small{font:10px Consolas,monospace;color:var(--subtle);margin-top:3px}.inventory-code-action{display:block;margin-top:5px;font-size:11px;text-align:left}
.inventory-alert-list{display:grid;margin-top:14px}.inventory-alert-list button{display:flex;justify-content:space-between;gap:12px;border:0;border-top:1px solid #eff0eb;background:transparent;padding:11px 0;text-align:left;cursor:pointer;color:var(--ink)}.inventory-alert-list button:first-child{border-top:0}.inventory-alert-list strong{color:#c68228;white-space:nowrap}
/* Resumen de Inventario (centro de control operativo) — franja compacta de
   4 indicadores. A propósito NO reutiliza .stat-card (esa es la cuadrícula
   de tarjetas grandes que este rediseño reemplaza): una sola fila dividida
   por bordes internos, cifras alineadas con tabular-nums, sin sombra propia
   por celda ni icono decorativo. */
.kpi-strip{display:grid;grid-template-columns:repeat(4,1fr);margin-bottom:6px;border:1px solid var(--line);border-radius:9px;background:var(--card);box-shadow:var(--shadow);overflow:hidden}
.kpi{padding:13px 16px;border-left:1px solid var(--line);border-top:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;transition:background-color .12s ease,transform .1s ease}
.kpi:first-child{border-left:0}
.kpi:hover{background:#f6f7f2}
.kpi:active{transform:scale(.98)}
.kpi:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:-2px}
.kpi-label{display:block;margin:0 0 6px;color:var(--muted);font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.3px}
.kpi-value{display:block;font:700 21px/1.15 Georgia,serif;color:var(--ink);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kpi-context{display:block;margin-top:4px;color:var(--subtle);font-size:11px}
/* Mensaje único y compacto cuando "Requiere atención" no tiene nada que
   mostrar — mismo formato de caja que .commercial-credit-alert pero en tono
   positivo (paleta lima ya usada en .stat-positive/.stat-icon.lime), nunca
   solo por color: el texto ya dice "en orden". */
.inventory-alert-ok{display:flex;gap:10px;align-items:center;padding:13px 16px;border:1px solid #d7e8a8;border-radius:10px;background:#eef8ce;color:#5b7318}
.inventory-alert-ok strong{color:#4b6014}
/* Estados obligatorios de cada indicador del Resumen: cargando (subestilo
   discreto, mismo layout) y error (color de aviso + acción Reintentar) —
   nunca un valor vacío ni un "$ 0" que parezca un resultado real. */
.kpi-value-loading{color:var(--muted);font-style:italic;font-weight:400}
.kpi-value-error{color:#d0685e}
.dashboard-loading-note{margin:0;padding:26px 0;text-align:center;color:var(--muted);font-size:13px;font-style:italic}
.dashboard-error-note{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;padding:14px 16px;border:1px solid #f5c9c2;border-radius:10px;background:#ffebe8;color:#a1382c;font-size:13px}
@media(max-width:680px){
  .kpi-strip{grid-template-columns:repeat(2,1fr)}
  .kpi:nth-child(3){border-left:0}
  .kpi:nth-child(3),.kpi:nth-child(4){border-top:1px solid var(--line)}
  .kpi-value{font-size:17px}
}
/* .bar-label se desplaza 27px por debajo de .bars a propósito (mismo truco
   que ya usa el gráfico de Gestión) — en ese panel no hay nada después, así
   que nunca chocaba con otro texto. Aquí sí sigue un resumen textual: le
   damos el espacio de sobra que ese desplazamiento necesita, sin tocar
   .history-summary-caption en los demás lugares donde ya se usa. */
.bars+.history-summary-caption{margin-top:38px}
/* Tabla reducida de "Ventas recientes" (dashboardRecentSalesTable en
   inventory-module.js): solo 4 columnas, pensada para caber en la mitad del
   grid-two sin heredar el min-width:690px de las tablas completas — así no
   necesita desplazamiento horizontal en ese panel angosto. */
.dashboard-sales-table{min-width:0}
.dashboard-sales-table td:nth-child(3){white-space:nowrap}
.inventory-modal{width:min(100%,680px)}.inventory-modal h3{margin:20px 0 8px}.inventory-sale-builder{display:grid;gap:12px}.inventory-scan-row{display:grid;grid-template-columns:1fr auto;gap:8px}.inventory-product-matches{display:grid;max-height:210px;overflow:auto;border-radius:8px}.inventory-product-matches button{display:grid;grid-template-columns:1fr auto;gap:3px 12px;border:1px solid var(--line);border-bottom:0;background:#fbfcf8;padding:10px 12px;text-align:left;cursor:pointer}.inventory-product-matches button:first-child{border-radius:8px 8px 0 0}.inventory-product-matches button:last-child{border-bottom:1px solid var(--line);border-radius:0 0 8px 8px}.inventory-product-matches span{font-weight:bold}.inventory-product-matches small{grid-column:1;color:var(--muted)}.inventory-product-matches strong{grid-column:2;grid-row:1/3;align-self:center;color:var(--lime-dark)}.inventory-product-matches p{color:var(--muted);text-align:center}
.inventory-cart{display:grid;border:1px solid var(--line);border-radius:8px;overflow:hidden}.inventory-cart>div{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:12px;padding:10px 12px;border-top:1px solid var(--line)}.inventory-cart>div:first-child{border-top:0}.inventory-cart label{display:flex;align-items:center;gap:9px}.inventory-cart label button{width:27px;height:27px;border:0;border-radius:5px;background:#eef0e9;cursor:pointer;font-size:16px}.inventory-cart b{min-width:90px;text-align:right}
.inventory-cart-line>span{display:grid;gap:2px}.inventory-cart-line>span small{color:var(--muted)}.inventory-weight-controls{display:grid;grid-template-columns:auto 112px;gap:5px 8px;align-items:center}.inventory-weight-controls select,.inventory-weight-controls input{min-height:36px;border:1px solid var(--line);border-radius:6px;background:#fff;padding:6px 8px;color:var(--ink)}.inventory-weight-controls small{grid-column:1/-1;color:var(--muted);text-align:right}
.inventory-sale-total{display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--line);padding:14px 2px 2px;margin-top:4px}.inventory-sale-total span{color:var(--muted)}.inventory-sale-total strong{font:24px Georgia,serif}.inventory-receipt-lines{display:grid;margin:14px 0}.inventory-receipt-lines>div{display:flex;justify-content:space-between;gap:12px;padding:9px 0;border-top:1px solid var(--line)}.inventory-receipt-lines>div:first-child{border-top:0}.inventory-scanner-video{display:block;width:100%;min-height:240px;max-height:380px;background:#111;border-radius:9px;object-fit:cover}.inventory-scanner-frame{position:relative;min-height:240px;max-height:380px;background:#111;border-radius:9px;display:flex;align-items:center;justify-content:center;overflow:hidden}.inventory-scanner-frame .inventory-scanner-video{position:absolute;inset:0;width:100%;height:100%;min-height:0;max-height:none;border-radius:0}.inventory-scanner-feedback{margin:10px 0 0;padding:8px 12px;border-radius:8px;font-size:12.5px;font-weight:bold}.inventory-scanner-feedback.ok{background:#e8f5e0;color:#4f7a1c}.inventory-scanner-feedback.warn{background:#fdeeea;color:#a94430}.pos-unregistered{padding:16px;text-align:center;border:1px dashed var(--line);border-radius:8px}.pos-unregistered p{margin:0 0 4px;font-weight:bold}.pos-unregistered small{display:block;color:var(--muted);margin-bottom:10px}.inventory-code-actions{display:flex;flex-direction:column;align-items:flex-start;gap:2px;margin-top:2px}.mp-scan-field{display:flex;align-items:flex-end;padding-bottom:1px}.mp-link-search{border:1px dashed var(--line);border-radius:10px;padding:14px;margin:10px 0}.mp-link-search .form-grid{margin-top:8px}.mp-link-divider{text-align:center;color:var(--muted);font-size:12.5px;margin:14px 0}
@media(max-width:1100px){.inventory-nav .nav-item{font-size:12px;gap:8px}.inventory-nav .nav-glyph{font-size:15px}.inventory-page-heading .page-heading-actions{flex-wrap:wrap;justify-content:flex-end}}
@media(max-width:680px){.inventory-heading{margin-top:0}.inventory-page-heading{display:block}.inventory-family-card{padding:15px 13px}.inventory-scan-row{grid-template-columns:1fr}.inventory-cart>div{grid-template-columns:1fr auto}.inventory-weight-controls{grid-column:1/-1;grid-template-columns:1fr 1fr}.inventory-cart b{grid-column:1/-1;text-align:right}.inventory-scanner-video{min-height:210px}.inventory-scanner-frame{min-height:210px}.inventory-modal{padding:21px 17px}}

/* Punto de venta permanente */
.pos-shortcuts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin:-10px 0 14px}.pos-shortcuts button{display:flex;align-items:center;gap:9px;border:1px solid var(--line);border-radius:8px;background:#eeefe9;color:#5f6861;padding:9px 11px;text-align:left;font:600 11px Arial,sans-serif;cursor:pointer;transition:.12s}.pos-shortcuts button:hover{background:#e3e6dd;color:var(--ink);transform:translateY(-1px)}.pos-shortcuts kbd,.pos-summary kbd,.pos-cart-empty kbd{display:inline-grid;place-items:center;min-width:27px;height:22px;padding:0 6px;border:1px solid #d1d5cc;border-bottom-width:2px;border-radius:5px;background:#fff;color:#59635b;font:700 10px Consolas,monospace;box-shadow:0 1px 0 rgba(30,35,30,.05)}
.pos-layout{display:grid;grid-template-columns:minmax(0,1fr) 355px;gap:14px;align-items:start}.pos-workspace{display:grid;gap:14px;min-width:0}.pos-search-card,.pos-cart-card,.pos-summary{padding:18px}.pos-section-heading,.pos-summary-title{display:flex;align-items:center;justify-content:space-between;gap:14px}.pos-section-heading>div,.pos-summary-title>div{display:flex;align-items:center;gap:10px}.pos-section-heading strong,.pos-summary-title strong{display:block;font-size:13px}.pos-section-heading small,.pos-summary-title small{display:block;color:var(--muted);font-size:11px;margin-top:2px}.pos-step{width:27px;height:27px;display:grid;place-items:center;flex-shrink:0;border-radius:7px;background:var(--ink);color:var(--lime);font:bold 12px Consolas,monospace}.pos-ready{display:flex;align-items:center;gap:7px;color:#78931c;font:700 10px Consolas,monospace;white-space:nowrap}.pos-ready i{width:8px;height:8px;border-radius:50%;background:#9ed51e;box-shadow:0 0 0 4px rgba(158,213,30,.12)}
.pos-search-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;margin-top:15px}.pos-search-box{position:relative}.pos-search-box>span{position:absolute;left:14px;top:50%;transform:translateY(-50%);line-height:1;color:var(--as-text-muted);pointer-events:none;transition:color var(--as-duration-fast) var(--as-ease-standard)}.pos-search-box>span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.pos-search-box:focus-within>span{color:var(--as-brand-600)}.pos-search-box input{height:46px;padding-left:42px;background:#fff;font-size:14px;border-color:#d9ddd5}.pos-search-box input:focus{border-color:#9db540;box-shadow:0 0 0 3px rgba(157,181,64,.1)}.pos-search-row .secondary-button{padding:0 16px}.pos-matches{margin-top:8px;box-shadow:0 10px 24px rgba(35,40,34,.08)}.pos-matches:empty{display:none}
.pos-scan-tools{position:relative}.pos-scan-tools>.secondary-button{width:218px;height:46px;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:0 13px 0 16px;white-space:nowrap;border-color:#aeb4ac;background:#fff}.pos-scan-tools>.secondary-button:hover,.pos-scan-tools>.secondary-button[aria-expanded="true"]{border-color:var(--ink);background:#f7f8f3}.pos-scan-button-label{color:var(--ink);font-size:12px;font-weight:700}.pos-scan-chevron{width:20px;height:20px;flex:0 0 auto;fill:none;stroke:#566159;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;transition:transform .16s ease}.pos-scan-tools>.secondary-button[aria-expanded="true"] .pos-scan-chevron{transform:rotate(180deg)}.pos-scan-menu{position:absolute;right:0;top:calc(100% + 7px);z-index:30;width:265px;padding:7px;border:1px solid #dcded7;border-radius:9px;background:#fff;box-shadow:0 14px 32px rgba(30,36,31,.16)}.pos-scan-menu[hidden]{display:none}.pos-scan-menu-title{padding:8px 10px 6px;color:#858d86;font:9px Consolas,monospace;letter-spacing:.65px}.pos-scan-menu button{width:100%;min-height:44px;display:grid;align-content:center;gap:3px;padding:11px 10px;border:0;border-radius:7px;background:#fff;color:var(--ink);text-align:left;cursor:pointer}.pos-scan-menu button:hover,.pos-scan-menu button:focus{outline:0;background:#f0f3e9}.pos-scan-menu strong{font-size:11px}.pos-scan-menu small{color:var(--muted);font-size:9.5px}
.pos-scan-menu button.active{position:relative;padding-right:36px;background:#f1f5e8}.pos-scan-menu button.active::after{content:'✓';position:absolute;right:12px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:18px;height:18px;border-radius:50%;background:#9ed51e;color:#26301e;font:bold 11px Arial,sans-serif}
.pos-search-row .pos-scan-tools>.secondary-button{border:1.5px solid #b9c0b7;border-radius:9px;background:#eef0e9;box-shadow:0 2px 5px rgba(35,42,36,.1);color:var(--ink);cursor:pointer;transition:background .15s,border-color .15s,box-shadow .15s,transform .15s}.pos-search-row .pos-scan-tools>.secondary-button:hover{border-color:#838e85;background:#e7eae2;box-shadow:0 4px 9px rgba(35,42,36,.14);transform:translateY(-1px)}.pos-search-row .pos-scan-tools>.secondary-button[aria-expanded="true"]{border-color:#29322c;background:#e3e7dc;box-shadow:0 0 0 3px rgba(41,50,44,.08)}
.pos-payment-choice{min-height:101px;gap:6px;border-color:#d9ddd6;box-shadow:0 1px 2px rgba(36,42,36,.03)}.pos-payment-choice .pos-svg{box-sizing:content-box;width:19px;height:19px;padding:6px;border-radius:50%;background:#f0f2ed;color:#7d887f;stroke-width:2}.pos-payment-choice strong{color:#3e4740;font-size:10.5px}.pos-payment-choice small{color:#89918a}.pos-payment-choice.active{border-color:#9bbd2f;background:#f3f9df;box-shadow:0 0 0 1px rgba(155,189,47,.08) inset,0 3px 9px rgba(112,145,20,.08)}.pos-payment-choice.active .pos-svg{background:#dff0a6;color:#668d08}.pos-payment-choice.active strong{color:#587b08}.pos-payment-choice.active small{color:#719312;font-weight:700}.pos-payment-choice:hover:not(.active){border-color:#afb7ae;background:#fafbf8}.pos-payment-choice:hover:not(.active) .pos-svg{background:#e8ebe5;color:#59655c}
.pos-sale-actions button:first-child{border-color:#efb6b0;background:#fff2f0;color:#c94d45}.pos-sale-actions button:first-child .pos-svg{color:#dc5d55}.pos-sale-actions button:first-child:hover:not(:disabled){border-color:#df6d64;background:#ffe5e1;color:#ae3029;box-shadow:0 3px 9px rgba(201,77,69,.12)}.pos-sale-actions button:first-child:active:not(:disabled){background:#dc5d55;color:#fff;transform:translateY(0)}.pos-sale-actions button:first-child:active:not(:disabled) .pos-svg{color:#fff}.pos-sale-actions button:last-child{border-color:#e2c98b;background:#fff8e8;color:#946815}.pos-sale-actions button:last-child .pos-svg{color:#aa791c}.pos-sale-actions button:last-child:hover:not(:disabled){border-color:#cda84d;background:#fff1c9;color:#78510a;box-shadow:0 3px 9px rgba(170,121,28,.12)}.pos-sale-actions button:last-child:active:not(:disabled){background:#b6811d;color:#fff;transform:translateY(0)}.pos-sale-actions button:last-child:active:not(:disabled) .pos-svg{color:#fff}.pos-sale-actions button.has-suspended{border-color:#a9c65a;background:#f2f8dc;color:#5e7e0d}.pos-sale-actions button.has-suspended .pos-svg{color:#709710}.pos-sale-actions button.has-suspended:hover:not(:disabled){border-color:#8eae32;background:#e8f4bd;color:#4d6c04}
.pos-print-toggle{display:flex;align-items:center;gap:6px;padding:6px 7px;border:1px solid #d7dbd4;border-radius:8px;background:#fafbf8;color:#747e76;cursor:pointer;transition:.15s}.pos-summary-top .pos-print-toggle span{color:inherit;font:700 9px Arial,sans-serif;letter-spacing:0}.pos-print-toggle .pos-svg{width:15px;height:15px}.pos-print-toggle>.as-switch{pointer-events:none}.pos-print-toggle:hover{border-color:#aeb6ad;background:#f1f3ee}.pos-print-toggle:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}.pos-print-toggle:disabled{opacity:.6;cursor:default}.pos-print-toggle:disabled:hover{border-color:#d7dbd4;background:#fafbf8}.pos-print-toggle.active{border-color:#a4c34b;background:#f1f8d9;color:#668908}.pos-print-toggle.active .pos-svg{color:#668908}.pos-print-toggle.active>.as-switch{background:var(--as-success-500)}.pos-print-toggle.active>.as-switch .as-switch-knob{transform:translateX(calc(var(--as-switch-w) - var(--as-switch-knob) - (var(--as-switch-pad) * 2)))}
.pos-cash-calculator{display:grid;gap:11px;padding:13px;border:1px solid #dce2d4;border-radius:11px;background:linear-gradient(145deg,#fbfdf5,#f3f6ec);box-shadow:0 4px 13px rgba(50,61,48,.06)}.pos-cash-calculator[hidden]{display:none}.pos-cash-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.pos-cash-heading>div{display:grid;gap:3px}.pos-cash-heading span{color:#687268;font:700 9px Consolas,monospace;letter-spacing:.65px}.pos-cash-heading small{color:#929990;font-size:9px}.pos-cash-heading>button{padding:6px 8px;border:1px solid #b9cb7a;border-radius:6px;background:#f2f8dc;color:#668709;font:700 9px Arial,sans-serif;cursor:pointer}.pos-cash-heading>button:hover,.pos-cash-heading>button.active{border-color:#8eaa30;background:#e5f2b9;color:#4f7000}.pos-cash-heading>button:disabled{opacity:.45;cursor:not-allowed}.pos-cash-input{display:grid;gap:6px}.pos-cash-input>span{color:#667067;font-size:9px;font-weight:700}.pos-cash-input>div{position:relative}.pos-cash-input b{position:absolute;left:13px;top:50%;transform:translateY(-50%);color:#7b951b;font:700 16px Georgia,serif}.pos-cash-input input{width:100%;height:45px;padding:0 12px 0 31px;border:1px solid #cfd6ca;border-radius:8px;background:#fff;color:#202722;font:700 18px Georgia,serif}.pos-cash-input input:focus{outline:0;border-color:#97b637;box-shadow:0 0 0 3px rgba(151,182,55,.11)}.pos-cash-quick{display:grid;grid-template-columns:repeat(4,1fr);gap:5px}.pos-cash-quick button{min-height:31px;padding:5px 2px;border:1px solid #d5dad1;border-radius:6px;background:#fff;color:#687169;font:700 8.5px Arial,sans-serif;cursor:pointer}.pos-cash-quick button:hover,.pos-cash-quick button.active{border-color:#9db73e;background:#eef6d3;color:#587800}.pos-change-display{width:100%;display:grid;gap:3px;padding:12px;border:1px solid #343e38;border-radius:9px;background:linear-gradient(145deg,#202722,#151b17);color:#fff;text-align:left;cursor:pointer;box-shadow:0 7px 16px rgba(27,34,29,.15);transition:.15s}.pos-change-display>span{color:#b8c0b8;font:700 8.5px Consolas,monospace;letter-spacing:.7px}.pos-change-display>strong{color:#d1ec62;font:bold 25px Georgia,serif}.pos-change-display>small{color:#9fa8a1;font-size:8.5px}.pos-change-display:hover{transform:translateY(-1px);box-shadow:0 9px 19px rgba(27,34,29,.19)}.pos-change-display.ready{border-color:#7fa016;background:linear-gradient(145deg,#263616,#1b2810)}.pos-change-display.ready>strong{color:#d7f36b}.pos-change-display.insufficient{border-color:#df7770;background:linear-gradient(145deg,#4a2926,#321b19)}.pos-change-display.insufficient>strong{color:#ffafa8}.pos-change-display.insufficient>span,.pos-change-display.insufficient>small{color:#f0bbb7}
.pos-cart-card{min-height:430px}.pos-clear:disabled{opacity:.35;cursor:default;text-decoration:none}.pos-cart-head,.pos-cart-line{display:grid;grid-template-columns:minmax(220px,1fr) minmax(220px,270px) 105px 30px;gap:12px;align-items:center}.pos-cart-head{padding:18px 8px 8px;color:var(--subtle);font:10px Consolas,monospace;letter-spacing:.45px}.pos-cart-head span:nth-child(3){text-align:right}.pos-cart-body{border-top:1px solid var(--line)}.pos-cart-line{padding:13px 8px;border-bottom:1px solid #eff0eb}.pos-item-identity{display:flex;align-items:center;gap:10px;min-width:0}.pos-item-identity>span{display:grid;place-items:center;width:25px;height:25px;flex-shrink:0;border-radius:50%;background:#eef0e9;color:var(--muted);font:bold 10px Consolas,monospace}.pos-item-identity>div{min-width:0}.pos-item-identity strong,.pos-item-identity small{display:block}.pos-item-identity strong{color:var(--ink);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pos-item-identity small{color:var(--muted);font:10px Consolas,monospace;margin-top:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pos-unit-control{display:grid;grid-template-columns:32px 64px 32px;gap:5px;justify-content:center}.pos-unit-control button,.pos-remove{border:0;border-radius:6px;background:#eef0e9;color:var(--ink);cursor:pointer;font-size:17px}.pos-unit-control input{padding:7px 5px;text-align:center;height:34px}.pos-weight-control{display:grid;grid-template-columns:105px 1fr;gap:5px 7px}.pos-weight-control select,.pos-weight-control input{height:34px;padding:6px 8px;font-size:11px;background:#fff}.pos-weight-control>div{position:relative}.pos-weight-control>div span{position:absolute;right:8px;top:50%;transform:translateY(-50%);color:var(--subtle);font:9px Consolas,monospace;pointer-events:none}.pos-weight-control>div input{padding-right:34px}.pos-weight-control small{grid-column:1/-1;text-align:right;color:var(--muted);font-size:9px}.pos-line-total{text-align:right;color:var(--ink);font:bold 12px Consolas,monospace}.pos-remove{width:28px;height:28px;color:#cf645b;background:#ffebe8}.pos-remove:hover{background:#ffd9d3}.pos-cart-empty{min-height:310px;display:grid;place-items:center;align-content:center;gap:8px;text-align:center;color:var(--muted)}.pos-cart-empty>span{display:grid;place-items:center;width:48px;height:48px;border-radius:50%;background:#eef0e9;color:#869087}.pos-cart-empty>span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.pos-cart-empty strong{color:var(--ink);font:20px Georgia,serif}.pos-cart-empty p{margin:0;max-width:330px}
.pos-summary{position:sticky;top:88px}.pos-sale-number{padding:5px 8px;border-radius:5px;background:#eef8d0;color:#78931c;font:700 9px Consolas,monospace}.pos-summary form{display:grid;gap:13px;margin-top:18px}.pos-field{display:grid;gap:5px}.pos-field label{display:flex;align-items:center;justify-content:space-between;color:#5f6861;font-size:11px;font-weight:bold}.pos-field label kbd{height:19px;min-width:25px}.pos-field input,.pos-field select{height:39px;background:#fff}.pos-field>small{color:var(--muted);font-size:9.5px;line-height:1.35}.pos-total-block{padding:17px;border-radius:9px;background:linear-gradient(145deg,#202522,#151a17);color:#fff;box-shadow:0 8px 20px rgba(30,35,30,.16)}.pos-total-block span,.pos-total-block small{display:block;color:#aeb6ae;font:10px Consolas,monospace;letter-spacing:.5px}.pos-total-block strong{display:block;margin:7px 0 5px;color:#d2ef5d;font:bold 29px Georgia,serif}.pos-balance-row{display:flex;align-items:center;justify-content:space-between;padding:10px 2px;border-top:1px solid var(--line);color:var(--muted)}.pos-balance-row strong{font:bold 14px Consolas,monospace;color:var(--ink)}.pos-balance-row strong.pos-due{color:#c68228}.pos-balance-row strong.pos-change{color:#78931c}.pos-charge-button{display:flex;align-items:center;justify-content:center;gap:12px;width:100%;min-height:49px;border:0;border-radius:8px;background:var(--ink);color:#fff;font:bold 13px Arial,sans-serif;cursor:pointer;box-shadow:0 7px 17px rgba(25,30,26,.18)}.pos-charge-button:hover{background:#343c37;transform:translateY(-1px)}.pos-charge-button:disabled{opacity:.55;cursor:wait}.pos-charge-button kbd{background:#d2ef5d;color:#273019;border-color:#b5d247}.pos-safe-note{margin:0;text-align:center;color:var(--muted);font-size:9.5px}
.pos-summary{background:#fffefb;border-color:#e2e1da;box-shadow:0 12px 28px rgba(39,42,35,.08)}.pos-summary form{gap:20px;margin-top:0}.pos-summary-top{display:flex;align-items:flex-start;justify-content:space-between}.pos-summary-top>div{display:grid;gap:7px}.pos-summary-top span,.pos-total-display>span,.pos-choice-group legend{color:#788078;font:10px Consolas,monospace;letter-spacing:.75px}.pos-summary-top strong{color:#7e9b18;font:700 11px Consolas,monospace}.pos-summary-code{display:grid;place-items:center;width:33px;height:33px;border:1px solid #d8d9d4;border-radius:8px;background:#fafaf7;color:#8b938b}.pos-svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto}.pos-brand-svg{width:19px;height:19px;stroke:none}.pos-summary-code .pos-svg{width:18px;height:18px}.pos-total-display{display:grid;gap:4px;padding:3px 0 2px}.pos-total-display strong{color:#18201c;font:bold 43px Georgia,serif;line-height:1.05;letter-spacing:.3px}.pos-total-display small{color:#939991;font-size:10px}.pos-choice-group{min-width:0;margin:0;padding:0;border:0}.pos-choice-group legend{margin-bottom:9px}.pos-method-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.pos-choice{min-height:39px;display:flex;align-items:center;justify-content:center;gap:7px;border:1px solid #dedfd9;border-radius:8px;background:#fff;color:#313732;font:700 10px Arial,sans-serif;cursor:pointer;transition:.12s}.pos-choice:hover{border-color:#a9bd59;background:#fbfdf3}.pos-choice.active{border-color:#9db841;background:#f9fceb;box-shadow:0 0 0 1px rgba(157,184,65,.08) inset}.pos-choice[data-pos-method="Efectivo"] .pos-svg{color:#7fa213}.pos-choice[data-pos-method="Transferencia"] .pos-svg{color:#48524b}.pos-method-wide{grid-column:1/-1}.pos-payment-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.pos-payment-choice{min-height:91px;display:grid;place-items:center;align-content:center;gap:5px;padding:9px 6px;border:1px solid #dedfd9;border-radius:9px;background:#fff;color:#424943;text-align:center;cursor:pointer;transition:.12s}.pos-payment-choice:hover{border-color:#a9bd59;background:#fbfdf3}.pos-payment-choice.active{border-color:#9db841;background:#f9fceb;box-shadow:0 0 0 1px rgba(157,184,65,.08) inset}.pos-payment-choice .pos-svg{width:18px;height:18px;color:#818981}.pos-payment-choice.active .pos-svg{color:#7ea016}.pos-payment-choice strong{font-size:10px}.pos-payment-choice small{color:#8d948d;font-size:9px;line-height:1.25}.pos-credit-fields{display:grid;gap:12px;padding-top:1px}.pos-credit-fields[hidden],.pos-credit-fields>*[hidden],.pos-balance-row[hidden]{display:none}.pos-balance-row{margin-top:-5px}.pos-charge-button{min-height:57px;justify-content:space-between;padding:0 14px}.pos-charge-button>i{display:grid;place-items:center;color:#9dd31c;font-style:normal}.pos-charge-button>i .pos-svg{width:20px;height:20px}.pos-charge-button>span{display:flex;align-items:baseline;gap:7px}.pos-charge-button b{font:700 13px Consolas,monospace}.pos-charge-button kbd{background:#262d29;color:#fff;border-color:#525a54;box-shadow:none}.pos-safe-note{margin-top:-9px}
.pos-method-select{display:grid;gap:9px}.pos-method-select label{color:#788078;font:10px Consolas,monospace;letter-spacing:.75px}.pos-method-select select{width:100%;height:44px;padding:0 40px 0 13px;border:1px solid #d9dcd5;border-radius:8px;background:#fff;color:#303731;font:600 11px Arial,sans-serif;cursor:pointer}.pos-method-select select:focus{outline:0;border-color:#9db841;box-shadow:0 0 0 3px rgba(157,184,65,.11)}.pos-method-select optgroup{font-weight:700;color:#5f6861}.pos-method-select option{font-weight:400;color:#303731}
.pos-payment-method-picker{position:relative}.pos-payment-method-picker>button{width:100%;height:44px;display:flex;align-items:center;justify-content:space-between;padding:0 13px;border:1.5px solid #cbd0c8;border-radius:8px;background:#fff;color:#303731;font:700 11px Arial,sans-serif;cursor:pointer;box-shadow:0 1px 3px rgba(36,42,36,.05)}.pos-payment-method-picker>button:hover,.pos-payment-method-picker>button[aria-expanded="true"]{border-color:#94aa44;background:#f8faef}.pos-payment-method-picker>button>svg{width:19px;height:19px;fill:none;stroke:#69736b;stroke-width:2.3;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s}.pos-payment-method-picker>button[aria-expanded="true"]>svg{transform:rotate(180deg)}.pos-payment-method-menu{position:absolute;left:0;right:0;top:calc(100% + 7px);z-index:40;display:grid;grid-template-columns:1fr 1fr;gap:5px;padding:7px;border:1px solid #d8dcd5;border-radius:9px;background:#fff;box-shadow:0 14px 30px rgba(29,35,30,.17)}.pos-payment-method-menu[hidden]{display:none}.pos-payment-method-menu button{position:relative;min-height:44px;display:flex;align-items:center;padding:8px 10px;border:0;border-radius:6px;background:#f6f7f3;color:#3f4841;font:600 10px Arial,sans-serif;text-align:left;cursor:pointer}.pos-payment-method-menu button:hover,.pos-payment-method-menu button:focus{outline:0;background:#ebf1dc;color:#5c790e}.pos-payment-method-menu button.active{padding-right:28px;background:#edf6cf;color:#5d7e08}.pos-payment-method-menu button.active::after{content:'✓';position:absolute;right:9px;color:#6f970a;font-weight:800}.pos-payment-method-menu .custom-method-option{grid-column:1/-1;border-top:1px solid #e3e5df;background:#fff;color:#647066}.pos-custom-method{display:grid;gap:6px;padding:10px;border:1px solid #dce0d8;border-radius:8px;background:#f8f9f5}.pos-custom-method[hidden]{display:none}.pos-custom-method label{font-size:9px}.pos-custom-method input{height:39px;background:#fff}
.pos-sale-actions{display:grid;grid-template-columns:1fr 1fr;gap:9px}.pos-sale-actions button{min-height:42px;display:flex;align-items:center;justify-content:center;gap:8px;border:1px solid #dedfd9;border-radius:8px;background:#fff;color:#4c554e;font:700 10px Arial,sans-serif;cursor:pointer;transition:.12s}.pos-sale-actions button:hover:not(:disabled){border-color:#a9b0a8;background:#f7f8f4;transform:translateY(-1px)}.pos-sale-actions button:first-child .pos-svg{color:#e46861}.pos-sale-actions button:last-child .pos-svg{color:#59625b}.pos-sale-actions button:disabled{opacity:.42;cursor:not-allowed}.pos-sale-actions .pos-svg{width:16px;height:16px}
@media(max-width:1180px){.pos-layout{grid-template-columns:minmax(0,1fr) 315px}.pos-cart-head,.pos-cart-line{grid-template-columns:minmax(180px,1fr) minmax(190px,230px) 90px 28px}.pos-shortcuts button span{font-size:10px}}
@media(max-width:930px){.pos-shortcuts{grid-template-columns:repeat(2,1fr)}.pos-layout{grid-template-columns:1fr}.pos-summary{position:static}.pos-cart-card{min-height:360px}}
@media(max-width:680px){.pos-shortcuts{display:none}.pos-search-row{grid-template-columns:1fr}.pos-search-row .secondary-button{height:42px}.pos-section-heading{align-items:flex-start}.pos-ready{display:none}.pos-cart-head{display:none}.pos-cart-line{grid-template-columns:1fr 32px;padding:14px 2px}.pos-item-identity{grid-column:1/2}.pos-unit-control,.pos-weight-control{grid-column:1/2;margin-top:5px;justify-content:start}.pos-line-total{grid-column:1/2;text-align:left;font-size:14px}.pos-remove{grid-column:2;grid-row:1;align-self:start}.pos-summary{padding:16px}.pos-total-block strong{font-size:26px}}
@media(max-width:680px){.pos-scan-tools>.secondary-button{width:100%}.pos-scan-menu{left:0;right:auto;width:min(100%,300px)}}

/* Venta en vivo: espacio de caja ajustado al alto de la ventana. */
@media (min-width:931px){
  /* Sin esto, la barra lateral (overflow-y:auto pero sin altura propia
     acotada aquí) puede necesitar más alto que el viewport en pantallas
     bajas y estira .app-shell/body/html enteros — la página completa
     terminaba con scroll detrás de Venta en vivo aunque .content.pos-view ya
     estuviera clippeado. Mismo patrón que .app-shell.pos-expanded (abajo). */
  .app-shell.pos-view{height:100dvh;min-height:0;overflow:hidden}
  .app-shell.pos-view .sidebar{height:100dvh;min-height:0}
  .content.pos-view{width:100%;max-width:none;height:calc(100dvh - 73px);padding:14px 28px;overflow:hidden}
  .pos-screen{height:100%;min-height:0;display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px}
  .pos-screen>.page-heading{min-height:45px;margin:0;align-items:center}
  .pos-screen>.page-heading .eyebrow{display:none}
  .pos-screen>.page-heading h1{margin:0 0 2px;font-size:25px}
  .pos-screen>.page-heading .page-subtitle{font-size:11px}
  .pos-screen>.page-heading .secondary-button{padding:9px 14px}
  /* El indicador de caja (cash-status-strip) va SIEMPRE al final, como
     última fila del grid, debajo de .pos-layout — nunca arriba, nunca
     flotante. Solo existe en el HTML cuando el modo no es simple —
     .pos-screen-with-cash-strip es el gancho que añade JS ese mismo
     momento, así que la fila extra solo se reserva cuando de verdad hay
     algo que mostrar (sin eso dejaría un hueco vacío en modo simple). Como
     .pos-summary ahora se desplaza internamente (overflow-y:auto) si le
     falta alto, esta fila de abajo nunca tapa ni recorta el botón COBRAR. */
  .pos-screen.pos-screen-with-cash-strip{grid-template-rows:auto auto minmax(0,1fr) auto}
  .pos-screen>.cash-status-strip{margin:0}
  .pos-screen .pos-shortcuts{min-height:36px;margin:0;gap:7px}
  .pos-screen .pos-shortcuts button{min-height:36px;padding:6px 10px}
  .pos-screen>.pos-layout{height:100%;min-height:0;gap:10px;align-items:stretch}
  .pos-screen .pos-workspace{min-height:0;grid-template-rows:auto minmax(0,1fr);gap:10px}
  .pos-screen .pos-search-card{position:relative;z-index:3;padding:11px 14px}
  .pos-screen .pos-search-row{margin-top:9px}
  .pos-screen .pos-matches{position:absolute;z-index:8;left:14px;right:14px;top:calc(100% - 5px);max-height:min(260px,38vh);margin:0;background:#fffefa;border:1px solid var(--line)}
  .pos-screen .pos-cart-card{height:100%;min-height:0;padding:13px 16px;display:grid;grid-template-rows:auto auto minmax(0,1fr);overflow:hidden}
  .pos-screen .pos-cart-head{padding:12px 8px 7px}
  .pos-screen .pos-cart-body{min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable}
  .pos-screen .pos-cart-empty{height:100%;min-height:220px}
  /* overflow-y:auto (no "hidden"): si el formulario de cobro no cabe en la
     altura disponible — pantalla baja, o el indicador de caja de abajo le
     resta espacio — se desplaza solo este panel, nunca la página completa,
     y así el botón COBRAR y la nota de abajo siempre quedan alcanzables en
     vez de recortados. */
  .pos-screen .pos-summary{position:static;height:100%;min-height:0;padding:13px;overflow-y:auto;overflow-x:hidden}
  .pos-screen .pos-summary form{height:100%;min-height:0;gap:8px}
  .pos-screen .pos-summary-top>div{gap:3px}
  .pos-screen .pos-total-display{gap:2px;padding:0}
  .pos-screen .pos-total-display strong{font-size:35px;line-height:1}
  .pos-screen .pos-method-select{gap:5px}
  .pos-screen .pos-payment-method-picker>button{height:39px}
  .pos-screen .pos-choice-group legend{margin-bottom:5px}
  .pos-screen .pos-payment-choice{min-height:70px;gap:3px;padding:5px 4px}
  .pos-screen .pos-payment-choice .pos-svg{width:17px;height:17px;padding:5px}
  .pos-screen .pos-cash-calculator{gap:7px;padding:9px 10px}
  .pos-screen .pos-cash-heading small{display:none}
  .pos-screen .pos-cash-heading>button{padding:5px 7px}
  .pos-screen .pos-cash-input{gap:3px}
  .pos-screen .pos-cash-input input{height:38px;font-size:16px}
  .pos-screen .pos-cash-quick button{min-height:27px}
  .pos-screen .pos-change-display{gap:1px;padding:8px 10px}
  .pos-screen .pos-change-display>strong{font-size:21px}
  .pos-screen .pos-sale-actions button{min-height:38px}
  .pos-screen .pos-charge-button{min-height:49px}
  .pos-screen .pos-safe-note{margin-top:-4px}
}

@media (min-width:931px) and (max-height:760px){
  .content.pos-view{padding-top:9px;padding-bottom:9px}
  .pos-screen{grid-template-rows:auto minmax(0,1fr);gap:7px}
  .pos-screen>.page-heading{min-height:39px}
  .pos-screen>.page-heading .page-subtitle{display:none}
  .pos-screen>.pos-shortcuts{position:absolute;left:-9999px}
  .pos-screen>.pos-layout{grid-row:2}
  .pos-screen.pos-screen-with-cash-strip{grid-template-rows:auto minmax(0,1fr) auto}
  .pos-screen.pos-screen-with-cash-strip>.cash-status-strip{margin:0;padding:8px 12px}
  .pos-screen .pos-summary form{gap:6px}
  .pos-screen .pos-payment-choice{min-height:63px}
  .pos-screen .pos-cash-calculator{gap:5px;padding:7px 9px}
  .pos-screen .pos-cash-quick button{min-height:24px}
  .pos-screen .pos-change-display{padding:6px 9px}
}

/* Barra lateral retráctil con navegación flotante. */
.sidebar{position:relative;z-index:6;overflow:visible;transition:width .24s ease,padding .24s ease,box-shadow .24s ease}
.sidebar-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;-ms-overflow-style:none}
.sidebar-scroll::-webkit-scrollbar{display:none;width:0;height:0}
.sidebar-toggle{position:absolute;z-index:9;top:82px;right:-14px;width:29px;height:29px;display:grid;place-items:center;padding:0;border:1px solid var(--as-border-default);border-radius:50%;background:var(--as-surface);color:var(--as-ink-secondary);box-shadow:var(--as-shadow-sm);cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,background .18s ease}
.sidebar-toggle:hover{transform:scale(1.08);background:var(--as-brand-50);color:var(--as-brand-hover);box-shadow:var(--as-shadow-md)}
.sidebar-toggle svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .24s ease}
.nav-label{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

@media (min-width:681px){
  .sidebar.collapsed{width:var(--as-sidebar-collapsed-width);padding-left:10px;padding-right:10px;box-shadow:5px 0 20px rgba(31,38,32,.06)}
  .sidebar.collapsed .sidebar-toggle svg{transform:rotate(180deg)}
  .sidebar.collapsed .brand{justify-content:center;padding:0 0 37px!important}
  .sidebar.collapsed .brand-mark-img{width:42px;height:42px}
  .sidebar.collapsed .brand-col{display:none}
  .sidebar.collapsed .sidebar-heading{width:34px;height:1px;margin:4px auto 12px;padding:0;background:#d3d9d1;color:transparent;font-size:0;overflow:hidden}
  .sidebar.collapsed .nav-list{gap:7px;margin-bottom:20px;overflow:visible}
  .sidebar.collapsed .nav-item,
  .sidebar.collapsed .inventory-nav .inventory-live-button{position:relative;width:46px;height:46px;margin:0 auto;padding:0;justify-content:center;gap:0;border:1px solid rgba(211,217,209,.9);border-radius:12px;background:rgba(255,255,252,.48);color:#667168;box-shadow:0 3px 9px rgba(37,45,39,.045);overflow:visible;transition:transform .16s ease,box-shadow .16s ease,background .16s ease,color .16s ease,border-color .16s ease}
  .sidebar.collapsed .nav-item .nav-glyph{width:20px;font-size:19px;line-height:1;text-align:center}
  .sidebar.collapsed .nav-item .nav-label{position:absolute;width:1px;height:1px;clip-path:inset(50%);overflow:hidden;white-space:nowrap}
  .sidebar.collapsed .nav-item:hover,
  .sidebar.collapsed .nav-item:focus-visible{z-index:12;transform:translateX(5px) translateY(-2px) scale(1.06);border-color:#c1c9bf;background:#fffefa;color:#202522;box-shadow:0 11px 24px rgba(31,39,33,.18)}
  .sidebar.collapsed .nav-item.active{border-color:var(--as-brand-600);background:var(--as-brand-gradient);color:var(--as-text-inverse);box-shadow:var(--as-shadow-brand)}
  .sidebar.collapsed .nav-item.active:hover,
  .sidebar.collapsed .nav-item.active:focus-visible{background:var(--as-brand-gradient);box-shadow:var(--as-shadow-brand)}
  .sidebar.collapsed .nav-item::after{display:none}
  .sidebar.collapsed .nav-badge{position:absolute;top:3px;right:3px;width:8px;height:8px;min-width:0;margin:0;padding:0;border:2px solid #e9ece5;border-radius:50%;font-size:0;box-shadow:0 0 0 2px rgba(239,139,121,.1)}
  .sidebar.collapsed .inventory-live-dot{position:absolute;top:3px;right:3px;width:8px;height:8px;margin:0;border:2px solid #e9ece5;box-sizing:content-box}
  .sidebar.collapsed .sidebar-note,
  .sidebar.collapsed .sidebar-footer{display:none}
}

.sidebar-floating-tooltip{position:fixed;z-index:40;width:max-content;max-width:230px;padding:9px 12px;border:1px solid rgba(255,255,255,.08);border-radius:8px;background:#202622;color:#fff;font:700 12px var(--as-font-sans);white-space:nowrap;box-shadow:0 10px 25px rgba(23,30,25,.24);opacity:0;visibility:hidden;transform:translate(-7px,-50%);pointer-events:none;transition:opacity .14s ease,transform .14s ease,visibility .14s ease}
.sidebar-floating-tooltip.visible{opacity:1;visibility:visible;transform:translate(0,-50%)}

@media (max-width:680px){.sidebar-toggle{display:none}}

/* Modo caja ampliado: ocupa el viewport del navegador sin activar F11. */
.pos-expand-button{display:inline-flex;align-items:center;gap:7px}
.pos-expand-button svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.pos-expand-button[aria-pressed="true"]{border-color:var(--as-success-500);background:var(--as-success-50);color:var(--as-success-700)}
.pos-expand-button[aria-pressed="true"]:hover{border-color:var(--as-success-500);background:var(--as-success-100)}
.pos-expanded-hint{display:none}

@media (min-width:931px){
  .app-shell.pos-expanded{height:100dvh;min-height:0;overflow:hidden}
  .app-shell.pos-expanded .sidebar{height:100dvh;min-height:0}
  .app-shell.pos-expanded .sidebar-toggle{display:none}
  .app-shell.pos-expanded .main-content{height:100dvh;overflow:hidden}
  .app-shell.pos-expanded .topbar{display:none}
  .app-shell.pos-expanded .content.pos-view{height:100dvh;padding:10px 12px}
  .app-shell.pos-expanded .pos-screen{position:relative;grid-template-rows:minmax(0,1fr);gap:0}
  .app-shell.pos-expanded .pos-screen>.page-heading,
  .app-shell.pos-expanded .pos-screen>.pos-shortcuts,
  .app-shell.pos-expanded .pos-screen>.cash-status-strip{display:none}
  .app-shell.pos-expanded .pos-screen>.pos-layout{grid-row:1;height:100%;min-height:0}
  /* En modo ampliado el indicador de caja sigue siendo obligatorio (a
     diferencia del encabezado y los atajos): forma parte de la misma
     cuadrícula, como una fila fija ABAJO — nunca flotante, nunca superpuesta
     al resumen de cobro. */
  .app-shell.pos-expanded .pos-screen.pos-screen-with-cash-strip{grid-template-rows:minmax(0,1fr) auto;gap:8px}
  .app-shell.pos-expanded .pos-screen.pos-screen-with-cash-strip>.pos-layout{grid-row:1;height:100%;min-height:0}
  .app-shell.pos-expanded .pos-screen.pos-screen-with-cash-strip>.cash-status-strip{display:flex;grid-row:2;margin:0}
  .app-shell.pos-expanded .pos-screen>.pos-expanded-hint{position:fixed;z-index:25;left:88px;bottom:12px;display:flex;align-items:center;gap:7px;padding:7px 10px;border:1px solid rgba(255,255,255,.1);border-radius:8px;background:rgba(29,35,31,.92);color:#eef1ed;font:700 10px Arial,sans-serif;box-shadow:0 8px 22px rgba(24,31,26,.22);cursor:pointer;backdrop-filter:blur(7px)}
  .app-shell.pos-expanded .pos-expanded-hint kbd{display:grid;place-items:center;min-width:31px;height:22px;padding:0 6px;border:1px solid #69736c;border-radius:5px;background:#313a34;color:#d3ee67;font:700 9px Consolas,monospace}
  .app-shell.pos-expanded .cash-status-strip .pos-expanded-hint{position:static;display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;padding:7px 10px;border:1px solid #d8ddd5;border-radius:7px;background:#eef0e9;color:var(--ink);font:700 11px Arial,sans-serif;cursor:pointer}
  .app-shell.pos-expanded .cash-status-strip .pos-expanded-hint:hover{background:#e2e5dc}
}

@media (max-width:930px){.pos-expand-button{display:none}}

/* Escala tipográfica legible para el punto de venta. */
.pos-screen .pos-section-heading strong{font-size:15px}
.pos-screen .pos-section-heading small{font-size:12px;line-height:1.4}
.pos-screen .pos-ready{font-size:11.5px}
.pos-screen .pos-search-box input{font-size:15px}
.pos-screen .pos-scan-button-label{font-size:13px}
.pos-screen .pos-scan-menu-title{font-size:11px}
.pos-screen .pos-scan-menu strong{font-size:13px}
.pos-screen .pos-scan-menu small{font-size:11.5px}
.pos-screen .pos-cart-head{font-size:11.5px}
.pos-screen .pos-item-identity strong{font-size:13.5px}
.pos-screen .pos-item-identity small{font-size:11.5px;line-height:1.35}
.pos-screen .pos-unit-control input,
.pos-screen .pos-weight-control select,
.pos-screen .pos-weight-control input{font-size:12.5px}
.pos-screen .pos-weight-control small{font-size:10.5px}
.pos-screen .pos-line-total{font-size:13.5px}
.pos-screen .pos-cart-empty strong{font-size:23px}
.pos-screen .pos-cart-empty p{font-size:14px;line-height:1.55}
.pos-screen .pos-summary-top span,
.pos-screen .pos-total-display>span,
.pos-screen .pos-choice-group legend,
.pos-screen .pos-method-select>label{font-size:11.5px}
.pos-screen .pos-summary-top strong{font-size:12px}
.pos-screen .pos-total-display small{font-size:11.5px}
.pos-screen .pos-payment-method-picker>button{font-size:13px}
.pos-screen .pos-payment-method-menu button{font-size:12.5px}
.pos-screen .pos-custom-method label,
.pos-screen .pos-custom-method input{font-size:12px}
.pos-screen .pos-payment-choice strong{font-size:12px}
.pos-screen .pos-payment-choice small{font-size:10.5px}
.pos-screen .pos-cash-heading span{font-size:10.5px}
.pos-screen .pos-cash-heading small,
.pos-screen .pos-cash-input>span{font-size:10.5px}
.pos-screen .pos-cash-heading>button{font-size:10.5px}
.pos-screen .pos-cash-input input{font-size:18px}
.pos-screen .pos-cash-quick button{font-size:10.5px}
.pos-screen .pos-change-display>span{font-size:10px}
.pos-screen .pos-change-display>small{font-size:10.5px}
.pos-screen .pos-sale-actions button{font-size:12px}
.pos-screen .pos-charge-button{font-size:14px}
.pos-screen .pos-charge-button b{font-size:15px}
.pos-screen .pos-safe-note{font-size:11px}
.pos-screen .inventory-product-matches button,
.pos-screen .inventory-product-matches p{font-size:12.5px}
.sidebar.collapsed .nav-item::after{font-size:12px}

@media (min-width:931px){
  .pos-screen>.page-heading .page-subtitle{font-size:12.5px}
  .pos-screen .pos-shortcuts button{font-size:12px}
  .app-shell.pos-expanded .pos-layout{grid-template-columns:minmax(0,1fr) clamp(375px,27vw,435px)}
  .app-shell.pos-expanded .pos-summary form{gap:7px}
  .app-shell.pos-expanded .pos-total-display{grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;align-items:end;column-gap:10px}
  .app-shell.pos-expanded .pos-total-display>span{grid-column:1/-1}
  .app-shell.pos-expanded .pos-total-display strong{grid-column:1;grid-row:2;font-size:42px}
  .app-shell.pos-expanded .pos-total-display small{grid-column:2;grid-row:2;padding-bottom:4px;white-space:nowrap}
  .app-shell.pos-expanded .pos-payment-choice{min-height:74px}
  .app-shell.pos-expanded .pos-cash-calculator{grid-template-columns:minmax(0,1fr) minmax(0,1fr);grid-template-areas:'heading heading' 'received change' 'quick quick';gap:7px 9px;padding:9px 10px}
  .app-shell.pos-expanded .pos-cash-heading{grid-area:heading}
  .app-shell.pos-expanded .pos-cash-input{grid-area:received}
  .app-shell.pos-expanded .pos-cash-quick{grid-area:quick}
  .app-shell.pos-expanded .pos-change-display{grid-area:change;min-height:59px;align-content:center;padding:7px 10px}
  .app-shell.pos-expanded .pos-change-display>strong{font-size:23px}
}

/* Tipo de pago compacto: selector desplegable equivalente al método de pago. */
.pos-payment-type-select{display:grid;gap:5px;min-width:0}
.pos-payment-type-select>label{color:#788078;font:11.5px Consolas,monospace;letter-spacing:.75px}
.pos-payment-type-picker{position:relative}
.pos-payment-type-picker>button{width:100%;height:43px;display:flex;align-items:center;justify-content:space-between;padding:0 13px;border:1.5px solid #cbd0c8;border-radius:8px;background:#fff;color:#303731;font:700 13px Arial,sans-serif;cursor:pointer;box-shadow:0 1px 3px rgba(36,42,36,.05)}
.pos-payment-type-picker>button:hover,.pos-payment-type-picker>button[aria-expanded="true"]{border-color:#94aa44;background:#f8faef}
.pos-payment-type-picker>button>svg{width:19px;height:19px;fill:none;stroke:#69736b;stroke-width:2.3;stroke-linecap:round;stroke-linejoin:round;transition:transform .15s}
.pos-payment-type-picker>button[aria-expanded="true"]>svg{transform:rotate(180deg)}
.pos-payment-type-menu{position:absolute;left:0;right:0;top:calc(100% + 7px);z-index:42;display:grid;gap:5px;padding:7px;border:1px solid #d8dcd5;border-radius:9px;background:#fff;box-shadow:0 14px 30px rgba(29,35,30,.17)}
.pos-payment-type-menu[hidden]{display:none}
.pos-payment-type-menu>button{position:relative;min-height:48px;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 10px;border:0;border-radius:7px;background:#f6f7f3;color:#3f4841;text-align:left;cursor:pointer;transition:background .13s ease,color .13s ease}
.pos-payment-type-menu>button:hover,.pos-payment-type-menu>button:focus{outline:0;background:#ebf1dc;color:#567409}
.pos-payment-type-menu>button.active{background:#edf6cf;color:#587800}
.pos-payment-type-menu>button>span{display:flex;align-items:center;gap:9px}
.pos-payment-type-menu>button strong{font-size:12.5px}
.pos-payment-type-menu>button small{color:#7f8880;font-size:11px}
.pos-payment-type-menu .pos-svg{box-sizing:content-box;width:17px;height:17px;padding:5px;border-radius:50%;background:#e9ece6;color:#7c867e}
.pos-payment-type-menu>button.active .pos-svg{background:#dff0a6;color:#668d08}
.pos-screen .pos-cash-input input{height:48px;font-size:21px}
.pos-screen .pos-cash-quick button{min-height:32px;font-size:11px}

/* BLOQUE J — API visual reutilizable para grupos de botones donde solo
   puede seleccionarse una opción dentro de la misma vista (filtro o modo;
   no cambia de panel — eso sigue usando tablist/tab, sin tocar). Cada
   contenedor conserva su propia clase para layout (grid, tarjeta, chip);
   .as-choice solo resuelve color y estados (base/hover/focus/seleccionado/
   disabled) con los tokens oficiales, para no repetir esa lógica en cada
   control. Las propiedades de layout que cada control ya tenía (grid,
   padding, min-height, border-radius, tamaños de texto) se conservan en
   su selector original y siguen ganando por especificidad. */
.as-choice-group{display:flex;flex-wrap:wrap;gap:var(--as-space-2)}
.as-choice{border:1px solid var(--as-border-default);background:var(--as-surface);color:var(--as-text-secondary);font-weight:var(--as-font-weight-medium);transition:border-color var(--as-duration-fast) var(--as-ease-standard),background var(--as-duration-fast) var(--as-ease-standard),color var(--as-duration-fast) var(--as-ease-standard)}
.as-choice:hover:not(:disabled):not(.active):not([aria-pressed="true"]){border-color:var(--as-border-strong);background:var(--as-surface-hover)}
.as-choice:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px;box-shadow:var(--as-focus-ring)}
.as-choice.active,.as-choice[aria-pressed="true"]{border-color:var(--as-brand-primary);background:var(--as-brand-50);color:var(--as-brand-700);font-weight:var(--as-font-weight-semibold)}
.as-choice.active strong,.as-choice[aria-pressed="true"] strong{color:var(--as-brand-700)}
.as-choice.active small,.as-choice[aria-pressed="true"] small{color:var(--as-brand-600)}
.as-choice:disabled{opacity:.6;cursor:not-allowed}

/* Tipos de pago en la cabecera: visibles, explicativos y fuera del cobro. */
.pos-screen .page-heading-actions{align-items:center;justify-content:flex-end;flex-wrap:wrap}
.pos-payment-type-toolbar{display:grid;grid-template-columns:repeat(3,minmax(118px,1fr));gap:6px}
.pos-payment-type-toolbar>button{min-height:52px;display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:9px;text-align:left;cursor:pointer}
.pos-payment-type-toolbar .pos-svg{box-sizing:content-box;width:17px;height:17px;flex:0 0 auto;padding:5px;border-radius:50%;background:var(--as-gray-100);color:var(--as-text-muted)}
.pos-payment-type-toolbar>button.active .pos-svg,.pos-payment-type-toolbar>button[aria-pressed="true"] .pos-svg{background:var(--as-brand-100);color:var(--as-brand-600)}
.pos-payment-type-toolbar>button>span{min-width:0;display:grid;gap:2px}
.pos-payment-type-toolbar strong{font-size:11.5px;white-space:nowrap}
.pos-payment-type-toolbar small{max-width:150px;color:var(--as-text-muted);font-size:9.5px;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pos-credit-modal-divider{display:flex;align-items:center;gap:10px;margin:17px 0;color:#939b94;font:10px Consolas,monospace;letter-spacing:.65px}
.pos-credit-modal-divider::before,.pos-credit-modal-divider::after{content:'';height:1px;flex:1;background:#e1e4de}
.pos-credit-modal-note{margin:11px 0 0;padding:10px 12px;border-radius:7px;background:#f3f7e8;color:#687852;font-size:11.5px}
.pos-credit-modal-error{margin:9px 0 0;padding:9px 11px;border:1px solid #f0c1bb;border-radius:7px;background:#fff0ee;color:#b34238;font-size:11.5px}

@media (min-width:931px){
  .app-shell.pos-expanded .pos-screen>.page-heading{position:fixed;z-index:24;top:10px;right:calc(clamp(375px,27vw,435px) + 24px);display:block;min-height:0;margin:0;pointer-events:none}
  .app-shell.pos-expanded .pos-screen>.page-heading>div:first-child,
  .app-shell.pos-expanded .page-heading-actions>.secondary-button{display:none}
  .app-shell.pos-expanded .pos-screen>.page-heading .page-heading-actions{display:block;margin:0}
  .app-shell.pos-expanded .pos-payment-type-toolbar{pointer-events:auto}
  .app-shell.pos-expanded .pos-ready{display:none}
  /* El selector de tipo de pago queda flotando (position:fixed) sobre la
     columna izquierda del punto de venta — sin este margen, su fila de
     botones (top:10px + 52px de alto) se superpone con el encabezado de
     "1 Agregar productos". Reserva su propia fila para que no se toquen. */
  .app-shell.pos-expanded .pos-workspace{margin-top:66px}
}

@media (min-width:931px) and (max-width:1180px){
  .pos-payment-type-toolbar{grid-template-columns:repeat(3,minmax(78px,1fr))}
  .pos-payment-type-toolbar>button{min-height:44px;justify-content:center;padding:6px}
  .pos-payment-type-toolbar small{display:none}
  .pos-payment-type-toolbar strong{font-size:10.5px}
  /* Antes este right usaba un clamp distinto (315–375px) al que de verdad
     tiene la columna .pos-summary en este mismo rango (clamp(375–435px),
     definido arriba y no reescrito aquí) — el desfase de ~40px hacía que
     "Fiado" terminara tapando "RESUMEN DE COBRO" a 1024px. Se retira la
     regla para que herede el right correcto (clamp(375px,27vw,435px)+24px),
     igual que en el resto del rango ≥931px. */
  .app-shell.pos-expanded .pos-workspace{margin-top:58px}
}

@media (max-width:930px){
  .pos-payment-type-toolbar{width:100%;grid-template-columns:repeat(3,minmax(78px,1fr))}
  .pos-payment-type-toolbar>button{min-height:44px;justify-content:center;padding:6px}
  .pos-payment-type-toolbar small{display:none}
  .pos-payment-type-toolbar strong{font-size:10.5px}
}

/* Créditos comerciales: registro manual separado y ficha unificada. */
.credit-mode-picker{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:18px 0}
.credit-mode-picker button{display:grid;gap:4px;min-height:76px;padding:13px 15px;border-width:1.5px;border-radius:10px;text-align:left;cursor:pointer}
.credit-mode-picker strong{font-size:14px}
.credit-mode-picker small{color:var(--as-text-muted);font-size:11.5px;line-height:1.35}
.credit-new-client{grid-column:1/-1;margin:0;padding:13px;border:1px solid #dfe3dc;border-radius:9px;background:#f7f8f4}
.credit-new-client[hidden],.product-credit-message[hidden],#manualCreditFields[hidden]{display:none}
.manual-credit-warning{display:flex;align-items:flex-start;gap:11px;margin-top:14px;padding:13px 14px;border:1px solid #efcd8e;border-radius:9px;background:#fff6e5;color:#7b5b20;line-height:1.45;cursor:pointer}
.manual-credit-warning input{margin-top:2px}
.manual-credit-warning span{font-size:12px}.manual-credit-warning strong{display:block;margin-bottom:2px;color:#684a13}
.product-credit-message{display:grid;gap:6px;margin:15px 0;padding:16px;border:1px solid #b9cb7a;border-radius:10px;background:#f3f9df;color:#536a18;line-height:1.45}
.product-credit-message span{font-size:12px;color:#66735f}
/* Ficha del cliente comercial: enlace "Volver" discreto, arriba a la izquierda. */
.detail-back{margin:0 0 12px}
.detail-back .simple-link{padding:0;font-size:12.5px}
/* Mensaje de error persistente dentro de un modal (role="alert"). */
.modal-alert{margin:0 0 16px;padding:11px 13px;border:1px solid #f2c4bc;border-radius:8px;background:#ffece9;color:#a5382c;font-size:12.5px;line-height:1.45}
.modal-alert[hidden]{display:none}
.as-confirm-dialog{width:min(100%,500px)}
.as-confirm-dialog .modal-intro{white-space:pre-line}
.as-confirm-warning{font-weight:600}
.as-confirm-error{display:block;margin-top:3px;color:var(--as-danger-600);font-size:var(--as-font-size-xs)}
.as-confirm-error[hidden]{display:none}
.as-danger-button{display:inline-flex;align-items:center;justify-content:center;min-height:var(--as-control-md);padding:0 var(--as-space-5);border:1px solid var(--as-danger-600);border-radius:var(--as-radius-sm);background:var(--as-danger-600);color:var(--as-text-inverse);font:var(--as-font-weight-semibold) var(--as-font-size-sm) var(--as-font-sans);cursor:pointer}
.as-danger-button:hover{background:var(--as-danger-700);border-color:var(--as-danger-700)}
.as-danger-button:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px;box-shadow:var(--as-focus-ring)}
.as-danger-button:disabled{cursor:not-allowed;opacity:.6}
/* GEF-1: ciclo de vida del cliente (Activo / Pausado / Archivado). */
.lifecycle-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:5px;font:bold 11px var(--as-font-sans);letter-spacing:.3px;text-transform:uppercase;vertical-align:middle;white-space:nowrap}
.lifecycle-badge:before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor}
.lifecycle-badge.paused{background:#fff0d8;color:#a86a15}
.lifecycle-badge.archived{background:#ececec;color:#666}
.detail-title h1 .lifecycle-badge{font-size:11px}
.lifecycle-note{margin:6px 0 0;color:var(--muted);font-size:12px;line-height:1.45;max-width:520px}
.detail-actions-wrap{display:flex;flex-direction:column;gap:8px;align-items:flex-end}
.detail-actions-secondary{display:flex;flex-direction:column;gap:2px;align-items:flex-end;text-align:right}
.detail-actions-secondary small{color:var(--muted);font-size:11px}
.text-button{border:0;background:transparent;padding:4px 2px;font-size:12px;font-weight:bold;cursor:pointer;color:var(--muted);text-decoration:underline;text-underline-offset:2px}
.text-button:hover{color:var(--ink)}
.text-button.danger{color:#c07268}
.text-button.danger:hover{color:#a5382c}
.modal-hint{margin:0;padding:10px 12px;border:1px solid #d9e0d7;border-radius:8px;background:#f4f6f0;color:#5f6861;font-size:12px;line-height:1.45}
@media(max-width:680px){.detail-actions-wrap{align-items:stretch;margin-top:15px}.detail-actions-secondary{align-items:stretch;text-align:left}.lifecycle-note{max-width:none}}
.commercial-profile-identity{display:flex;align-items:center;gap:14px;margin:-8px 0 18px}
.commercial-profile-identity>span{display:grid;place-items:center;width:56px;height:56px;border-radius:50%;background:#9edce7;color:#183d43;font-weight:800;font-size:16px}
.commercial-profile-identity>div{display:grid;gap:4px}.commercial-profile-identity strong{font:28px Georgia,serif;color:var(--ink)}.commercial-profile-identity small{color:var(--muted);font-size:12px}
.commercial-credit-stats{margin-bottom:15px}.commercial-credit-alert{display:flex;gap:12px;align-items:center;margin:0 0 16px;padding:13px 16px;border:1px solid #efcf98;border-radius:10px;background:#fff2d9;color:#875e1e}
.commercial-credit-alert strong{white-space:nowrap}.commercial-credit-alert span{font-size:12px;line-height:1.45}.commercial-credit-alert.is-clear{border-color:#cfe09d;background:#f2f8df;color:#587613}
.commercial-history-panel{margin-top:14px}.commercial-history-panel .panel-heading h2{margin:0 0 4px}.commercial-history-panel td small{display:block;margin-top:4px;color:var(--muted);font-size:10.5px}.commercial-history-panel .manual-credit-note{color:#b06e24}
.credit-obligation-list{display:grid;gap:8px;margin:17px 0;max-height:360px;overflow:auto}
.credit-obligation-list>button{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:13px;border:1px solid #dce0da;border-radius:9px;background:#fbfcf8;color:var(--ink);text-align:left;cursor:pointer}
.credit-obligation-list>button:hover{border-color:#9cb648;background:#f3f8df}.credit-obligation-list span{display:grid;gap:4px}.credit-obligation-list small{color:var(--muted)}.credit-obligation-list b{color:#bd7425;white-space:nowrap}
/* Créditos y deudas → "¿A qué crédito…?": bloque para saldar toda la deuda. */
.total-payment-cta{margin:14px 0 4px}
.total-payment-cta p{margin:0 0 10px;font-size:13px;color:var(--muted)}
.total-payment-cta p strong{color:var(--ink);font:bold 15px Georgia,serif}
.total-payment-cta .primary-button{display:flex;align-items:center;justify-content:center;width:100%}
.total-payment-divider{display:flex;align-items:center;gap:10px;margin:16px 0 4px;color:var(--muted);font-size:11.5px}
.total-payment-divider::before,.total-payment-divider::after{content:"";flex:1;height:1px;background:var(--line)}

/* Créditos con varios productos (Venta en vivo): botón "Ver N productos"
   dentro de la celda de detalle, y la fila de desglose que abre justo
   debajo — nunca un menú flotante, así que nunca tapa otras filas. */
.credit-products-toggle{display:inline-flex;align-items:center;gap:6px;border:1px solid #d8ddd5;border-radius:7px;padding:8px 11px;background:#f8f9f5;color:var(--ink);font:inherit;font-weight:bold;font-size:12.5px;cursor:pointer;transition:background-color .12s ease,border-color .12s ease}
.credit-products-toggle:hover{background:#eef0e9;border-color:#c7cec2}
.credit-products-chevron{width:13px;height:13px;flex-shrink:0;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .18s ease}
.credit-products-toggle[aria-expanded="true"] .credit-products-chevron{transform:rotate(180deg)}
.credit-products-detail-row>td{padding:0 10px 14px;border-top:0}
.credit-products-list{display:grid;gap:6px;padding:12px 14px;border:1px solid var(--line);border-radius:9px;background:#f8f8f3}
.credit-product-line{display:grid;grid-template-columns:1fr 1fr auto;gap:10px;align-items:baseline;font-size:12.5px}
.credit-product-name{font-weight:bold;color:var(--ink)}
.credit-product-variant{color:var(--muted)}
.credit-product-qty{color:var(--muted);font:12px Consolas,monospace;text-align:right;white-space:nowrap}

@media(max-width:760px){.credit-mode-picker{grid-template-columns:1fr}.commercial-credit-alert{align-items:flex-start;flex-direction:column}.commercial-profile-identity strong{font-size:23px}
  .credit-products-detail-row>td{padding:0 0 12px}
  .credit-product-line{grid-template-columns:1fr;gap:1px}
  .credit-product-qty{text-align:left}
}
/* .responsive-table convierte cada <tr> en una tarjeta propia por debajo de
   680px — sin esto, la fila de detalle quedaría con su propia tarjeta
   blanca duplicando el borde de .credit-products-list de adentro. */
@media(max-width:680px){
  .responsive-table tr.credit-products-detail-row{background:transparent;border:0;padding:0;margin-top:-8px}
}

/* Buscador editable de clientes comerciales: nombre, documento o teléfono. */
.commercial-client-picker{position:relative;display:grid;gap:6px;margin-top:6px}
.commercial-client-picker[hidden]{display:none}
.commercial-client-picker-input{position:relative;display:block;min-height:48px;border:1.5px solid #cbd2c8;border-radius:9px;background:#fff;box-shadow:0 2px 5px rgba(35,42,36,.04);overflow:hidden;transition:border-color .15s,box-shadow .15s}
.commercial-client-picker:focus-within .commercial-client-picker-input{border-color:#8fac29;box-shadow:0 0 0 3px rgba(143,172,41,.11)}
.commercial-client-picker-input>span{position:absolute;z-index:2;left:14px;top:50%;width:16px;height:16px;color:var(--as-text-muted);transform:translateY(-50%);pointer-events:none;transition:color var(--as-duration-fast) var(--as-ease-standard)}
.commercial-client-picker:focus-within .commercial-client-picker-input>span{color:var(--as-brand-600)}
.commercial-client-picker-input>span svg,.commercial-client-picker-input button svg{display:block;width:100%;height:100%;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.commercial-client-picker-input input{display:block;width:100%;min-width:0;height:46px;border:0!important;outline:0!important;background:transparent!important;padding:0 58px 0 44px!important;box-shadow:none!important;color:var(--ink);font-size:14px}
.commercial-client-picker-input button{position:absolute;z-index:3;top:0;right:0;width:48px;height:46px;border:0;border-left:1px solid #e1e4df;background:#f8faf5;color:#667168;cursor:pointer}
.commercial-client-picker-input button svg{width:19px;height:19px;margin:auto;transition:transform .15s ease}
.commercial-client-picker-input button:focus-visible{outline:2px solid #8fac29;outline-offset:-3px}
.commercial-client-picker-input button:hover{background:#f1f4eb;color:#668508}
.commercial-client-picker-results{position:absolute;z-index:80;top:calc(100% + 5px);left:0;right:0;display:grid;max-height:285px;overflow:auto;padding:6px;border:1px solid #d6dbd3;border-radius:10px;background:#fff;box-shadow:0 16px 34px rgba(30,37,31,.18)}
.commercial-client-picker-results[hidden]{display:none}
.commercial-client-picker-results>button{display:flex;align-items:center;justify-content:space-between;gap:14px;min-height:52px;padding:9px 11px;border:0;border-radius:7px;background:transparent;color:var(--ink);text-align:left;cursor:pointer}
.commercial-client-picker-results>button:hover,.commercial-client-picker-results>button:focus{outline:0;background:#f0f6dc;color:#547400}
.commercial-client-picker-results>button span{display:grid;gap:3px}.commercial-client-picker-results>button strong{font-size:13px}.commercial-client-picker-results>button small{color:#7d867f;font-size:11px}.commercial-client-picker-results>button b{color:#bd7425;font-size:11px;white-space:nowrap}
.commercial-client-picker-results>p{margin:0;padding:15px;text-align:center;color:var(--muted);font-size:12px}
.commercial-client-new-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;justify-self:start;min-height:39px;margin:7px 0 3px;padding:0 14px;border:1px solid #9db84a;border-radius:8px;background:#f1f8d9;color:#587700;font-weight:800;font-size:12.5px;cursor:pointer;box-shadow:0 2px 6px rgba(86,115,13,.07)}
.commercial-client-new-button span{display:grid;place-items:center;width:20px;height:20px;border-radius:50%;background:#d9ef8d;color:#4f7000;font-size:16px;line-height:1}
.commercial-client-new-button:hover{border-color:#78991b;background:#eaf5c3;transform:translateY(-1px)}
.commercial-client-new-button.active{border-color:#e4b1aa;background:#fff0ee;color:#b54b42}.commercial-client-new-button.active span{background:#ffd7d2;color:#a53c34}
.commercial-client-picker-status{margin-top:2px;padding:8px 10px;border-left:3px solid #e0ad57;background:#fff8ea;color:#7a6544;font-size:11.5px;line-height:1.4}
.commercial-client-picker-status[hidden]{display:none}.commercial-client-picker-status strong{color:#765116}
/* Autocompletado de Categoría en "Agregar producto": el input sigue siendo
   un campo de texto normal (mismo estilo que el resto del formulario, sin
   icono ni botón de alternar) — solo se reutilizan .commercial-client-
   picker-results/-status para la lista de sugerencias y el mensaje de
   estado, ancladas aquí mediante position:relative. .active marca la
   opción resaltada por teclado (aria-activedescendant), ya que el foco real
   permanece en el input, no se mueve a los botones. */
.category-autocomplete{position:relative}
.commercial-client-picker-results>button.active{outline:0;background:#f0f6dc;color:#547400}
/* PC-2 — "Registrar consumo": total del consumo y campo de cantidad por línea. */
.consumption-total{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:12px 0 4px;padding:10px 13px;border-radius:8px;background:#f4f6f2;font-size:12.5px;color:var(--muted)}
.consumption-total strong{font-size:16px;color:var(--ink)}
.consumption-line-table input[data-line-qty]{width:64px;max-width:100%}
/* PC-3A — abonos y pago total de consumos: acción de deuda total, historial de
   abonos por consumo y resumen en la ventana de abono. */
.consumption-debt-actions{margin:0 0 16px}
.consumption-payment-toggle{margin-top:6px;font-size:11.5px}
.consumption-payment-toggle summary{cursor:pointer;color:var(--muted)}
.consumption-payment-log{margin:6px 0 0;padding-left:16px;display:grid;gap:3px}
.consumption-pay-summary{display:grid;gap:8px;margin:0 0 16px;padding:12px 13px;border-radius:8px;background:#f4f6f2}
.consumption-pay-summary>div{display:flex;justify-content:space-between;gap:12px;font-size:12.5px}
.consumption-pay-summary dt{color:var(--muted)}
.consumption-pay-summary dd{margin:0;text-align:right;color:var(--ink)}
.client-directory-search{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:10px;margin:0 0 16px;padding:0 13px;border:1px solid #d8ddd5;border-radius:9px;background:#fff;transition:border-color .15s,box-shadow .15s}
.client-directory-search>span{color:#778178;font-size:19px}.client-directory-search input{height:48px;border:0;outline:0;background:transparent;font-size:14px}.client-directory-search small{color:#7c857e;white-space:nowrap}
/* Mismo anillo de foco que .commercial-client-picker: el input interno no
   tiene borde propio (outline:0), así que la señal de foco vive en el
   contenedor mediante :focus-within — antes no había ninguna. */
.client-directory-search:focus-within{border-color:#8fac29;box-shadow:0 0 0 3px rgba(143,172,41,.11)}
@media(max-width:600px){.commercial-client-picker-results>button b{display:none}.client-directory-search{grid-template-columns:auto minmax(0,1fr)}.client-directory-search small{display:none}}

/* Historial de inventario: consulta, auditoría, cierres y devoluciones. */
/* Pestañas "Ventas" / "Turnos de caja": cambian el panel visible con un
   simple repintado desde cache (ver setHistoryTab) — no hay navegación ni
   consulta nueva detrás de este control. */
.history-tabs{display:flex;gap:6px;margin-bottom:16px;border-bottom:1px solid var(--line)}
.history-tabs button{min-height:44px;padding:10px 18px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--as-text-secondary);font-weight:bold;font-size:13px;cursor:pointer;transition:color var(--as-duration-fast) var(--as-ease-standard),border-color var(--as-duration-fast) var(--as-ease-standard)}
.history-tabs button:hover:not(.active){color:var(--as-ink-primary)}
.history-tabs button.active{color:var(--as-brand-primary);border-color:var(--as-brand-primary)}
.history-tabs button:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.history-summary-caption{margin:0 0 10px;color:var(--muted);font-size:12px}
.history-summary-caption strong{color:var(--ink)}
.history-summary-grid{display:grid;grid-template-columns:repeat(5,minmax(145px,1fr));gap:11px;margin-bottom:14px}
.history-summary-grid article{position:relative;display:grid;gap:7px;padding:15px 16px;border:1px solid var(--border);border-radius:11px;background:var(--surface);box-shadow:0 8px 22px rgba(29,35,30,.045)}
.history-summary-grid span{color:var(--muted);font-size:11.5px}.history-summary-grid strong{font:700 22px Georgia,serif;color:var(--ink)}
/* Explicación emergente de cada tarjeta — ver bindHistorySummaryHelp en
   inventory-module.js. El icono es el disparador accesible (teclado y
   táctil); el hover de 1,5s sobre la tarjeta completa es un atajo extra
   solo para mouse. El popover se posiciona con JS (position/left/right/
   top/bottom vía style.cssText) para no salirse de la pantalla ni tapar
   la cifra de su propia tarjeta — por eso nace pegado a top:100%. */
.history-summary-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.history-summary-help-trigger{flex-shrink:0;width:20px;height:20px;display:grid;place-items:center;border:0;border-radius:50%;padding:0;background:transparent;color:#9aa29a;cursor:pointer;transition:background-color .12s ease,color .12s ease}
.history-summary-help-trigger:hover,.history-summary-help-trigger:focus-visible{background:#eef0e9;color:#567700}
.history-summary-help-trigger:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px}
.history-summary-help-icon{width:15px;height:15px;stroke:currentColor;fill:none;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.history-summary-tooltip{position:absolute;z-index:30;width:230px;max-width:calc(100vw - 32px);padding:11px 13px;border:1px solid var(--line);border-radius:9px;background:var(--card);box-shadow:0 14px 32px rgba(30,35,30,.16);color:#4b524c;font-size:12px;line-height:1.5}
.history-summary-tooltip[hidden]{display:none}
@media(max-width:700px){.history-summary-tooltip{width:200px}}
.history-filter-panel{margin-bottom:14px;padding:14px}.history-filters{display:grid;grid-template-columns:minmax(220px,2fr) repeat(2,minmax(120px,1fr)) auto auto;align-items:end;gap:9px}
.history-filters>label{display:grid;gap:5px;color:#687169;font-size:10px;font-weight:700;letter-spacing:.55px;text-transform:uppercase}
.history-filters input{width:100%;height:43px;border:1px solid #d5dad3;border-radius:8px;background:#fff;padding:0 11px;color:var(--ink);font-size:12.5px;outline:0}
.history-filters input:focus{border-color:#91ad2c;box-shadow:0 0 0 3px rgba(145,173,44,.1)}
.history-search{position:relative}.history-search>span{position:absolute;left:13px;top:50%;transform:translateY(-50%);color:var(--as-text-muted);line-height:1;transition:color var(--as-duration-fast) var(--as-ease-standard)}.history-search>span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.history-search:focus-within>span{color:var(--as-brand-600)}.history-search input{padding-left:39px}
/* "Más filtros": mismo lenguaje visual que .credit-products-toggle (botón +
   chevron que rota). El panel (Estado/Método) ya está en el DOM oculto con
   [hidden]; toggleHistoryMoreFilters() solo cambia ese atributo, sin
   repintar ni volver a consultar Supabase. */
.history-more-filters-toggle{height:43px;display:inline-flex;align-items:center;gap:6px;white-space:nowrap;border:1px solid #d8ddd5;border-radius:8px;padding:0 14px;background:#f8f9f5;color:var(--ink);font:inherit;font-size:12.5px;font-weight:bold;cursor:pointer;transition:background-color .12s ease,border-color .12s ease}
.history-more-filters-toggle:hover{background:#eef0e9;border-color:#c7cec2}
.history-more-filters-toggle[aria-expanded="true"]{border-color:#91ad2c;background:#f0f8d5;color:#567700}
.history-more-filters-toggle .credit-products-chevron{width:13px;height:13px}
.history-more-filters-toggle[aria-expanded="true"] .credit-products-chevron{transform:rotate(180deg)}
.history-more-filters{display:grid;grid-template-columns:repeat(2,minmax(140px,1fr));gap:9px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.history-more-filters[hidden]{display:none}
.history-more-filters label{display:grid;gap:5px;color:#687169;font-size:10px;font-weight:700;letter-spacing:.55px;text-transform:uppercase}
.history-more-filters select{width:100%}
.history-result-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}.history-result-heading span{color:var(--muted);font-size:11.5px}
.history-date-group{margin-bottom:20px}.history-date-group:last-child{margin-bottom:0}
.history-date-group-label{display:flex;align-items:baseline;gap:8px;margin:0 0 8px 2px}
.history-date-group-label strong{font:700 14px Georgia,serif;color:var(--ink)}
.history-date-group-label .history-date-group-count{color:var(--muted);font-size:11.5px}
.sale-detail-title{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;padding-right:34px}.sale-detail-title h2{margin:3px 0}.sale-detail-title .status{white-space:nowrap}
.sale-detail-line{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 14px;padding:11px 0;border-bottom:1px solid #e5e7e2}.sale-detail-line>span{display:grid;gap:3px}.sale-detail-line small{color:var(--muted);font-size:10.5px}.sale-detail-line>small{grid-column:1/-1;color:#6e7d4e}
.sale-detail-totals{display:grid;gap:7px;margin:15px 0;padding:13px 15px;border-radius:10px;background:#f5f7f1}.sale-detail-totals>div{display:flex;justify-content:space-between;gap:15px;color:#687168}.sale-detail-totals .grand{margin:3px -5px;padding:9px 5px;border-top:1px solid #dfe5d4;border-bottom:1px solid #dfe5d4;color:var(--ink);font-size:15px}
.return-item-list{display:grid;gap:8px;margin:16px 0}.return-item-list label{display:grid;grid-template-columns:minmax(0,1fr) 110px;align-items:center;gap:12px;padding:11px 13px;border:1px solid #dce1d8;border-radius:9px;background:#fafbf8}.return-item-list label>span{display:grid;gap:3px}.return-item-list small{color:var(--muted);font-size:10.5px}.return-item-list input{height:42px;border:1px solid #cfd6cc;border-radius:7px;padding:0 10px;font-weight:700}
.return-preview{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:5px 14px;margin:12px 0;padding:13px 15px;border:1px solid #cbdc95;border-radius:9px;background:#f3f8df;color:#5b721a}.return-preview strong{font-size:18px}.return-preview small{flex-basis:100%;color:#758260}
.daily-close-content{margin-top:12px}.daily-close-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:9px}.daily-close-grid article{display:grid;gap:6px;padding:12px;border:1px solid #dfe3dc;border-radius:9px;background:#fafbf8}.daily-close-grid span{color:var(--muted);font-size:10.5px}.daily-close-grid strong{font-size:16px}
.daily-method-list{display:grid;gap:2px;margin:8px 0 13px}.daily-method-list>div{display:flex;justify-content:space-between;gap:15px;padding:9px 4px;border-bottom:1px solid #e5e8e2}.daily-difference{display:grid;grid-template-columns:1fr auto;gap:5px 14px;padding:13px;border:1px solid #cddd9b;border-radius:9px;background:#f3f8df;color:#557018}.daily-difference small{grid-column:1/-1}.daily-difference.warning{border-color:#e8be79;background:#fff5e3;color:#865d1e}
@media(max-width:1200px){.history-summary-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.history-filters{grid-template-columns:repeat(3,minmax(0,1fr))}.history-search{grid-column:1/-1}}
@media(max-width:700px){.history-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.history-filters{grid-template-columns:repeat(2,minmax(0,1fr))}.history-search{grid-column:1/-1}.history-more-filters{grid-template-columns:1fr}.history-result-heading{align-items:flex-start;flex-direction:column}.daily-close-grid{grid-template-columns:1fr 1fr}.history-tabs{gap:4px}.history-tabs button{flex:1;min-width:0;padding:10px 8px;font-size:12px}}

.history-quick-filters{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 10px}
.history-quick-filters button{min-height:var(--as-control-lg);padding:7px 13px;border-radius:var(--as-radius-pill);font-size:12px;font-weight:700;cursor:pointer}
.history-pagination{display:flex;align-items:center;justify-content:center;gap:13px;padding:18px 0 2px;border-top:1px solid var(--line);margin-top:13px}
.history-pagination span{color:var(--muted);font-size:12px;font-weight:700}
.history-pagination .small-button[disabled]{opacity:.42;cursor:not-allowed;transform:none;box-shadow:none}

/* La regla global de la barra retráctil se declara después del CSS móvil.
   Esta corrección final restablece el comportamiento fuera de pantalla en
   teléfonos sin afectar el modo reducido de escritorio. */
@media(max-width:680px){
  .sidebar{position:fixed;left:-240px;top:0;bottom:0;width:240px;z-index:12;overflow:visible;transition:left .22s}
  .sidebar.open{left:0}
  .sidebar-scroll{overflow-y:auto;overflow-x:hidden}
}

/* --- Configuración y Control de caja ------------------------------------- */
.settings-nav{margin-top:auto;padding-top:6px}
.cash-settings-panel .panel-heading{margin-bottom:4px}
.cash-mode-picker{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:16px 0}
.cash-mode-picker button{display:grid;gap:5px;min-height:82px;padding:14px 15px;border-width:1.5px;border-radius:10px;text-align:left;cursor:pointer}
.cash-mode-picker strong{font-size:14px}
.cash-mode-picker small{color:var(--as-text-muted);font-size:11.5px;line-height:1.35}
@media(max-width:760px){.cash-mode-picker{grid-template-columns:1fr}}

.cash-status-strip{display:flex;align-items:center;flex-wrap:wrap;gap:10px 14px;margin:0 0 16px;padding:11px 15px;border:1px solid #dfe3dc;border-radius:10px;background:#fafbf8}
.cash-status-strip>span:not(.status){flex:1;min-width:180px;color:#586158;font-size:12px}
.cash-status-strip strong{color:var(--ink)}
.cash-status-strip-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* "Tiempo abierto" — hereda el estilo base de .cash-status-strip>span
   (flex/min-width/color/tamaño); solo se ajustan los dígitos para que no
   salten de ancho cada segundo (tabular-nums) y se lean con más peso. */
.cash-status-strip-timer{white-space:nowrap}
.cash-status-strip-timer b{color:var(--ink);font-weight:700;font-variant-numeric:tabular-nums}
/* Historial de turnos: duración de un turno todavía abierto (foto del último
   refresh, no cuenta en vivo — ver cashSessionDurationLabel). */
.cash-duration-open{color:#78931c;font-weight:600;white-space:nowrap}

.cash-open-panel{max-width:560px}
.cash-open-panel .form-actions{justify-content:flex-start}

.cash-movement-type-picker{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:4px 0 16px}
.cash-movement-type-picker button{min-height:46px;padding:10px 14px;border-width:1.5px;border-radius:9px;font-weight:600;cursor:pointer}

.daily-close-highlight{background:#f0f8d5!important;border-color:#c9dc8f!important}
.daily-close-highlight strong{font-size:19px!important}

.cash-close-diff{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:14px 0;padding:14px 16px;border-radius:10px;border:1px solid #dfe3dc;background:#fafbf8;color:#586158;font-weight:600}
.cash-close-diff strong{font-size:19px;color:inherit}
.cash-close-diff.exact{border-color:#cddd9b;background:#f3f8df;color:#557018}
.cash-close-diff.over{border-color:#f0cf94;background:#fff3dc;color:#a06d17}
.cash-close-diff.under{border-color:#f0b8b0;background:#ffece9;color:#b8493c}

@media(max-width:700px){.cash-status-strip{flex-direction:column;align-items:flex-start}.cash-status-strip-actions{width:100%}.cash-status-strip-actions button{flex:1}}

/* Agenda (Gestión de clientes) — agosto 2026 */
.agenda-controls{display:grid;gap:16px}
.agenda-toolbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px}
.agenda-toolbar-nav{display:flex;align-items:center;gap:9px}
.agenda-range-label{font-size:14px;min-width:170px}
/* Segmentado Día/Semana/Mes: la pestaña activa se distingue por relleno
   sólido (fondo oscuro + texto blanco), no solo por color — igual convención
   que .mp-seg-btn en Productos y consumos. */
.agenda-view-switch{display:inline-flex;gap:4px;background:#eef0e9;border-radius:9px;padding:4px}
.agenda-view-switch button{border:1px solid transparent;background:transparent;padding:8px 16px;border-radius:7px;font-size:12px;font-weight:bold;color:var(--muted);cursor:pointer;transition:background-color .14s ease,color .14s ease}
.agenda-view-switch button:hover:not(.active){background:#e2e5dc;color:var(--ink)}
.agenda-view-switch button.active{background:var(--ink);color:#fff;border-color:var(--ink);box-shadow:0 2px 6px rgba(40,45,35,.16)}
.agenda-view-switch button:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
/* Resumen del periodo visible (AGENDA-2C-C1): misma franja compacta que
   .kpi-strip, pero cada tarjeta es ahora un <button> real que filtra la
   agenda por estado (ver summaryStrip() en agenda-module.js). El estado
   activo se distingue con más de un recurso: fondo/borde propios (no solo
   color), la marca ✓ (.agenda-summary-check) y aria-pressed — nunca depende
   solo del color. Las tarjetas inactivas conservan el mismo contraste que
   antes (no se ven "deshabilitadas"). */
.agenda-summary{border-top:1px solid var(--line);padding-top:14px}
.agenda-summary-legend{margin:0 0 9px;color:#9aa29a;font:12px var(--as-font-sans);letter-spacing:.5px;text-transform:uppercase}
.agenda-summary-grid{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px}
.agenda-summary-item{position:relative;min-width:0;min-height:44px;padding:10px 8px;border:1px solid var(--line);border-radius:8px;background:#f8f8f3;text-align:center;font:inherit;color:inherit;cursor:pointer;transition:background-color .14s ease,border-color .14s ease,box-shadow .14s ease}
.agenda-summary-item:hover:not(.agenda-summary-active){background:#eef0e9}
.agenda-summary-item:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.agenda-summary-value{display:block;font:700 19px/1.1 var(--as-font-sans);color:var(--ink);font-variant-numeric:tabular-nums}
.agenda-summary-label{display:block;margin-top:4px;color:var(--muted);font-size:11px;font-weight:bold}
.agenda-summary-item.agenda-pending .agenda-summary-value{color:#bd7924}
.agenda-summary-item.agenda-confirmed .agenda-summary-value{color:#4d8f99}
.agenda-summary-item.agenda-active .agenda-summary-value{color:#78931c}
.agenda-summary-item.agenda-done .agenda-summary-value{color:#47661f}
.agenda-summary-item.agenda-cancelled .agenda-summary-value{color:#d0685e}
/* Tarjeta activa: mismo lenguaje visual que .agenda-view-switch button.active
   (fondo oscuro sólido) — nunca un color saturado nuevo. Los valores por
   estado (arriba) quedarían ilegibles sobre ese fondo, así que aquí se
   fuerzan a blanco. */
.agenda-summary-item.agenda-summary-active{background:var(--ink);border-color:var(--ink);box-shadow:0 2px 8px rgba(40,45,35,.18)}
.agenda-summary-item.agenda-summary-active .agenda-summary-value,
.agenda-summary-item.agenda-summary-active .agenda-summary-label{color:#fff}
.agenda-summary-check{position:absolute;top:6px;right:8px;font-size:11px;font-weight:bold;color:#fff;line-height:1}
.agenda-summary-results{margin:10px 0 0;color:var(--muted);font-size:12.5px;font-weight:bold}
.agenda-edit-schedule-summary{padding:12px 14px;border:1px solid var(--line);border-radius:8px;background:#f8f8f3}
.agenda-edit-schedule-summary span,.agenda-edit-schedule-summary small{display:block;color:var(--muted);font-size:11px}
.agenda-edit-schedule-summary strong{display:block;margin:4px 0;font-size:13px}
.agenda-filters-zone{border-top:1px solid var(--line);padding-top:14px;display:grid;gap:10px}
.agenda-filters-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;min-height:22px}
.agenda-filters-title{font-size:12px;font-weight:bold;color:var(--muted);text-transform:uppercase;letter-spacing:.4px;display:inline-flex;align-items:center;gap:7px}
.agenda-filters-badge{display:inline-flex;align-items:center;justify-content:center;min-width:17px;height:17px;padding:0 4px;border-radius:999px;background:var(--lime-dark);color:#fff;font:bold 10px var(--as-font-sans);font-variant-numeric:tabular-nums}
.agenda-filters{display:flex;flex-wrap:wrap;gap:10px;align-items:center}
.agenda-client-search{flex:1 1 320px;min-width:320px}
.agenda-client-search span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
@media(max-width:1100px){.table-toolbar .search-box,
.agenda-client-search{flex-basis:100%;min-width:0}}
.agenda-search-results{position:absolute;z-index:5;top:calc(100% + 4px);left:0;right:0;background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:0 14px 34px rgba(30,35,30,.16);max-height:230px;overflow:auto}
.agenda-search-results button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:9px 12px;cursor:pointer;font:inherit;color:var(--ink);border-top:1px solid #f1f2ec}
.agenda-search-results button:first-child{border-top:0}
.agenda-search-results button:hover{background:#f4f5f0}
.agenda-search-results button small{display:block;color:var(--muted);font-size:11px;margin-top:2px}
.agenda-active-client-chip{display:inline-flex;align-items:center;gap:7px;background:#eef8ce;color:#5f7616;border-radius:999px;padding:6px 8px 6px 13px;font-size:12px;font-weight:bold}
.agenda-active-client-chip button{border:0;background:rgba(95,118,22,.14);color:inherit;width:18px;height:18px;border-radius:50%;cursor:pointer;font-size:13px;line-height:1}
.agenda-layout{display:grid;grid-template-columns:280px 1fr;gap:14px;align-items:start}
.agenda-side{background:var(--card);border:1px solid var(--line);border-radius:9px;box-shadow:var(--shadow);padding:15px}
.agenda-main{min-width:0}
.agenda-mini-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.agenda-mini-head strong{font:bold 15px var(--as-font-sans)}
.agenda-mini-head .round-button{width:28px;height:28px;font-size:15px}
.agenda-mini-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px;text-align:center}
.agenda-mini-weekdays{margin-bottom:4px;color:var(--subtle);font:11px var(--as-font-sans)}
.agenda-mini-cell{position:relative;border:0;background:transparent;border-radius:7px;padding:6px 0;font-size:12px;font-weight:bold;color:var(--ink);cursor:pointer}
.agenda-mini-cell:hover{background:#eef0e9}
.agenda-mini-cell:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px}
.agenda-mini-blank{cursor:default}
.agenda-mini-today{box-shadow:inset 0 0 0 1.5px var(--lime-dark)}
.agenda-mini-selected{background:var(--ink);color:#fff}
.agenda-mini-selected:hover{background:#39413b}
/* Punto de "tiene eventos" — solo se calcula en vista Mes (ver miniCalendar en
   agenda-module.js), así que nunca afirma nada sobre una fecha no cargada. */
.agenda-mini-has-events::after{content:'';position:absolute;left:50%;bottom:3px;transform:translateX(-50%);width:4px;height:4px;border-radius:50%;background:var(--lime-dark)}
.agenda-mini-selected.agenda-mini-has-events::after{background:#fff}
.agenda-day-pane h3{font:22px var(--as-font-sans);font-weight:var(--as-font-weight-bold);margin:0 0 12px}
/* Gatillo contextual "+ Agregar cita para este día" — visible siempre en la
   cabecera de la vista Día (no solo cuando está vacía), envuelve en móvil sin
   generar scroll horizontal. */
.agenda-day-pane-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.agenda-day-pane-head h3{margin:0}
.agenda-day-list{display:grid;gap:9px}
/* Tarjeta de cita — AGENDA-2B (mejora visual): bloque horario con "Inicio"/
   "Fin" etiquetados en una sola zona, información sin separadores ambiguos e
   insignia de estado reforzada con una barra estructural lateral (no solo
   color). Reutilizada en Día (density "full"), Semana ("compact") y Mes
   ("minimal") — ver eventCard()/agendaTimeBlockHtml() en agenda-module.js. */
.agenda-card{display:flex;align-items:center;gap:16px;width:100%;text-align:left;border:1px solid var(--line);border-left:4px solid var(--line);background:var(--card);border-radius:9px;padding:12px 14px;cursor:pointer;font:inherit;color:inherit;transition:transform .12s ease,box-shadow .12s ease}
.agenda-card:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(40,45,35,.1)}
.agenda-card:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.agenda-card-time{flex-shrink:0;display:flex;flex-direction:column;gap:3px;min-width:130px}
.agenda-card-time-row{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.agenda-card-time-slot{display:flex;flex-direction:column;gap:0;min-width:0}
.agenda-card-time-label{font:10.5px var(--as-font-sans);letter-spacing:.4px;text-transform:uppercase;color:var(--subtle)}
.agenda-card-time-start{font:bold 15px var(--as-font-sans);font-variant-numeric:tabular-nums;color:var(--ink)}
.agenda-card-time-end{font:bold 12.5px var(--as-font-sans);font-variant-numeric:tabular-nums;color:var(--muted)}
.agenda-card-time-arrow{color:var(--subtle);font-size:12px}
.agenda-card-duration{font:11px var(--as-font-sans);color:var(--muted)}
.agenda-card-nextday{display:inline-block;margin-left:5px;padding:1px 5px;border-radius:4px;background:#fff0d8;color:#a06d17;font:10px var(--as-font-sans);font-weight:bold;white-space:nowrap;vertical-align:middle}
.agenda-card-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.agenda-card-title{display:block;font-size:13px;font-weight:bold;color:var(--ink);overflow-wrap:break-word;white-space:normal}
.agenda-card-type{display:block;font:11px var(--as-font-sans);font-weight:bold;color:var(--lime-dark)}
.agenda-card-meta{display:flex;flex-direction:column;gap:2px;margin-top:1px;font-size:11.5px;color:var(--muted)}
.agenda-card-line{overflow-wrap:break-word}
.agenda-status.agenda-pending{background:#fff0d8;color:#bd7924}
.agenda-status.agenda-confirmed{background:#e5f4f5;color:#4d8f99}
.agenda-status.agenda-active{background:#eef8d0;color:#78931c}
.agenda-status.agenda-done{background:#e4ede0;color:#47661f}
.agenda-status.agenda-cancelled{background:#ffebe8;color:#d0685e}
/* Señal estructural de estado además de la insignia de texto — nunca depende
   solo del color: los estados terminales negativos usan además borde
   punteado, distinguible sin percibir el color. */
.agenda-card.agenda-pending{border-left-color:#e0a545}
.agenda-card.agenda-confirmed{border-left-color:#4d8f99}
.agenda-card.agenda-active{border-left-color:#78931c}
.agenda-card.agenda-done{border-left-color:#5f8a3a}
.agenda-card.agenda-cancelled{border-left-style:dashed;border-left-color:#d0685e;opacity:.72}
/* Semana: rango de hora entendible sin etiquetas "Inicio"/"Fin" y sin
   responsable/ubicación — misma jerarquía que Día, con menos densidad. En
   columna (no en fila): las columnas de semana son angostas por diseño
   (minmax 230px) y una fila horizontal con hora + estado no deja suficiente
   ancho al título sin recortar nombres largos. */
.agenda-card-compact{flex-direction:column;align-items:stretch;padding:10px 12px;gap:6px}
.agenda-card-compact .agenda-card-time{min-width:0}
.agenda-card-compact .status{align-self:flex-start}
/* Mes: resumen mínimo — hora inicial, título y estado; nunca satura la celda. */
.agenda-card-minimal{padding:8px 11px;gap:11px}
.agenda-card-minimal .agenda-card-time{min-width:0}
.agenda-card-minimal .agenda-card-time-start{font-size:12.5px}
.agenda-card-minimal .agenda-card-title{flex:1;min-width:0;font-size:12.5px}
.agenda-card-minimal .status{padding:3px 7px;font-size:11px}
.agenda-week-pane{display:grid;gap:14px}
@media(min-width:900px){.agenda-week-pane{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}}
.agenda-week-day{background:var(--card);border:1px solid var(--line);border-radius:9px;box-shadow:var(--shadow);padding:14px;min-width:0}
.agenda-week-day-selected{border-color:var(--lime-dark)}
.agenda-week-day-head{display:flex;align-items:center;gap:9px;border:0;background:transparent;padding:0 0 10px;cursor:pointer;font:inherit;color:var(--ink)}
.agenda-week-day-head strong{font:20px var(--as-font-sans);font-weight:var(--as-font-weight-bold)}
.agenda-week-day-head:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
/* Con varias citas en un mismo día, la columna crece dentro de un límite y
   sigue siendo legible en vez de estirar toda la fila de la semana. */
.agenda-week-day .agenda-day-list{max-height:380px;overflow-y:auto;padding-right:2px}
.agenda-month-pane{display:grid;gap:16px}
.agenda-month-group-head{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:0;background:transparent;padding:0 0 9px;border-bottom:1px solid var(--line);margin-bottom:9px;font:bold 13px var(--as-font-sans);color:var(--ink);cursor:pointer}
.agenda-month-group-head:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.agenda-month-group-today .agenda-month-group-head{color:var(--lime-dark);border-bottom-color:var(--lime-dark)}
.agenda-today-tag{padding:2px 7px;border-radius:999px;background:#eef8ce;color:#5f7616;font:bold 10px var(--as-font-sans);text-transform:uppercase;letter-spacing:.3px}
.agenda-modal{width:min(100%,640px)}
.agenda-client-picker{position:relative}
.agenda-reminder-banner{margin-bottom:14px;border-color:#f0cf94;background:#fff8ea;display:grid;gap:9px}
.agenda-reminder-heading{display:flex;align-items:center;gap:8px;font-weight:bold;font-size:13px;color:#a06d17}
.agenda-reminder-item{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;background:var(--card);border:1px solid var(--line);border-radius:8px;padding:9px 12px}
.agenda-reminder-info{display:flex;flex-direction:column;gap:2px;min-width:0}
.agenda-reminder-info strong{font-size:13px}
.agenda-reminder-info small{color:var(--muted);font-size:11px}
.agenda-more-options{margin-top:4px;border:1px solid var(--line);border-radius:9px;padding:2px 14px}
.agenda-more-options[open]{padding-bottom:14px}
.agenda-more-options summary{cursor:pointer;padding:11px 0;font-size:13px;font-weight:bold;color:var(--ink);list-style:none}
.agenda-more-options summary::-webkit-details-marker{display:none}
.agenda-more-options summary::before{content:'▸';display:inline-block;margin-right:7px;transition:transform .12s ease}
.agenda-more-options[open] summary::before{transform:rotate(90deg)}
.agenda-more-options .form-grid{margin-top:2px}
.agenda-updating-note{margin:0 0 10px;color:var(--muted);font-size:12px;font-style:italic}
.agenda-error-note{margin-bottom:12px}
.agenda-first-load-error{padding:10px 0}
/* Selector de hora propio (AGENDA-2B) — reemplaza <input type="time">:
   genérico y reutilizable (no depende de nada de Agenda), vive aquí porque
   hoy solo lo usa este módulo. Una sola caja compacta con borde — campo de
   texto de hora + ":" + campo de texto de minutos + interruptor segmentado
   a. m./p. m. — se lee como un único control, no como controles sueltos. El
   valor real vive en el <input type="hidden"> que arma js/agenda-module.js
   (ver timeFieldHtml/timeFieldDisplayHtml). Áreas táctiles de 44px móvil. */
.form-field-caption{display:block;font-size:13px;font-weight:bold;color:var(--as-ink-secondary)}
.time-field{min-width:0}
.time-field-box{display:inline-flex;align-items:stretch;gap:2px;border:1px solid var(--as-border-default);border-radius:8px;background:var(--as-surface);padding:2px;min-height:44px;max-width:100%}
.time-field-box input{border:0;background:transparent;min-height:40px;width:34px;padding:0 2px;color:var(--as-ink-primary);font-weight:700;font-size:14px;font-family:var(--as-font-sans);text-align:center;border-radius:5px}
.time-field-box input:hover:not(:disabled){background:#eef0e9}
.time-field-box input:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px}
.time-field-box input:focus{box-shadow:none}
.time-field-colon{align-self:center;font-weight:700;color:var(--as-text-muted);padding:0 1px}
.time-field-meridiem{display:flex;align-self:center;margin-left:4px;border:1px solid var(--as-border-default);border-radius:6px;overflow:hidden;flex-shrink:0}
.time-field-meridiem-btn{border:0;background:var(--as-surface);color:var(--as-ink-secondary);font-weight:700;font-size:11px;font-family:var(--as-font-sans);padding:0 9px;min-height:40px;min-width:38px;cursor:pointer;transition:background-color .12s ease,color .12s ease}
.time-field-meridiem-btn+.time-field-meridiem-btn{border-left:1px solid var(--as-border-default)}
.time-field-meridiem-btn:hover:not(.active):not(:disabled){background:var(--as-surface-secondary);color:var(--as-ink-primary)}
.time-field-meridiem-btn.active{background:var(--ink);color:#fff}
.time-field-meridiem-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px;z-index:1;position:relative}
.time-field-meridiem-btn:disabled{cursor:default;opacity:.65}
.time-field-box-locked{background:var(--as-surface-secondary)}
.time-field-box-locked .time-field-meridiem-btn.active{background:#c7cbc2}
.time-field-error{margin:4px 0 0;color:var(--as-danger-600);font-size:11px}
/* Hora final calculada (duración preestablecida): tarjeta de resumen de solo
   lectura, no controles deshabilitados repetidos. */
.time-summary{display:flex;align-items:center;gap:9px;min-height:44px;padding:6px 12px;border:1px solid var(--line);border-radius:8px;background:#f8f8f3}
.time-summary-icon{flex-shrink:0}
.time-summary-text{display:flex;flex-direction:column;gap:1px;min-width:0}
.time-summary-value{font:700 14px var(--as-font-sans);font-variant-numeric:tabular-nums;color:var(--ink)}
.time-summary-caption{font-size:11px;color:var(--muted)}
/* Ventana de "Nueva cita/Editar": cabecera y acciones fijas, una sola zona de
   desplazamiento en el cuerpo — mismo patrón que .list-manager/
   .mp-consumption-flow, para que los botones nunca queden cortados aunque el
   formulario crezca (cliente, horario, "Más opciones"). */
.modal.agenda-form-modal{display:flex;flex-direction:column;overflow:hidden;padding:0;max-height:min(90vh,760px)}
.agenda-form-modal .agenda-form-head{flex:0 0 auto;padding:25px 26px 14px;border-bottom:1px solid var(--line)}
.agenda-form-modal .agenda-form-head h2{margin:2px 0 0}
.agenda-form-modal form{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.agenda-form-modal .agenda-form-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:14px 26px}
.agenda-form-modal .agenda-form-foot{flex:0 0 auto;padding:12px 26px 14px;border-top:1px solid var(--line);background:var(--card)}
.agenda-form-modal .agenda-form-foot .form-actions{margin:0}
/* AGENDA-2C-A — Horarios y disponibilidad: mismo esqueleto de arriba, algo
   más ancho porque el contenido (interruptor, pestañas, tarjetas por día) lo
   necesita. */
.modal.availability-modal{width:min(100%,640px)}
.availability-toggle-row{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:13px 15px;border:1px solid var(--line);border-radius:9px;background:#f8f8f3;margin-bottom:16px}
.availability-toggle-row strong{display:block;font-size:13px}
.availability-toggle-row .field-note{margin-top:3px}
.availability-toggle-error{margin:-10px 0 16px;color:#cf645b;font-size:11px}
.availability-switch{flex-shrink:0}
.availability-tabs{display:flex;gap:6px;border-bottom:1px solid var(--line);margin-bottom:16px}
.availability-tab{border:0;background:transparent;padding:9px 4px 11px;margin-bottom:-1px;font:bold 13px var(--as-font-sans);color:var(--muted);cursor:pointer;border-bottom:2px solid transparent}
.availability-tab:hover{color:var(--ink)}
.availability-tab.active{color:var(--ink);border-bottom-color:var(--lime-dark)}
.availability-tab:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
/* BLOQUE J2 — Horario general/Excepciones (tablist real, ver
   agenda-module.js). Reglas específicas por clase (.availability-tabs--schedule)
   para no afectar el otro tablist que reutiliza .availability-tabs/
   .availability-tab: el selector de alcance Todo el negocio/Un responsable
   (.availability-scope-switch), que queda igual que antes. */
.availability-tabs--schedule .availability-tab{min-height:44px;display:inline-flex;align-items:center;justify-content:center}
.availability-tabs--schedule .availability-tab.active{color:var(--as-brand-primary);border-bottom-color:var(--as-brand-primary)}
.availability-days{display:grid;gap:10px;margin-top:14px}
.availability-day{border:1px solid var(--line);border-radius:9px;padding:12px 14px;background:var(--card)}
.availability-day-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.availability-day-head strong{font-size:13px}
.availability-day-slots{display:grid;gap:8px}
.availability-slot{display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.availability-slot-sep{color:var(--subtle);font-size:13px}
.availability-remove-slot{flex-shrink:0;border:0;background:#ffebe8;color:#cf645b;width:26px;height:26px;border-radius:50%;font-size:15px;line-height:1;cursor:pointer;display:grid;place-items:center}
.availability-remove-slot:hover{background:#ffd9d3}
.availability-add-slot{margin-top:9px;padding:8px 13px;font-size:12px}
.availability-copy-picker{margin-top:9px;padding:11px 12px;border:1px dashed var(--line);border-radius:8px;background:#f8f8f3}
.availability-copy-options{display:grid;grid-template-columns:repeat(3,1fr);gap:6px 10px;margin:8px 0}
.availability-copy-option{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink)}
.availability-copy-actions{display:flex;justify-content:flex-end;gap:8px}
.availability-exception-form{border:1px solid var(--line);border-radius:9px;padding:14px;margin:12px 0;background:#f8f8f3}
.availability-exception-form .availability-days{margin-top:10px}
@media(max-width:680px){
  .availability-copy-options{grid-template-columns:1fr 1fr}
}
@media(max-width:680px){
  .modal.agenda-form-modal{max-height:calc(100dvh - 20px);width:100%}
  .agenda-form-modal .agenda-form-head{padding:18px 16px 12px}
  .agenda-form-modal .agenda-form-scroll,.agenda-form-modal .agenda-form-foot{padding-left:16px;padding-right:16px}
}
/* Interruptor "Registrar existencias iniciales" — Productos (Agregar
   producto / Agregar otra presentación). Reutiliza .form-grid/.agenda-more-
   options para el resto del formulario; esta es la única regla nueva. */
.inventory-toggle-field{display:flex;align-items:center;gap:10px;font-size:13px;font-weight:bold;color:#5f6861;cursor:pointer}
@media(max-width:1100px){.agenda-summary-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:900px){.agenda-layout{grid-template-columns:1fr}.agenda-side{order:2}}
@media(max-width:680px){.agenda-toolbar{flex-direction:column;align-items:stretch}.agenda-toolbar-nav{justify-content:center}.agenda-range-label{text-align:center;min-width:0}.agenda-view-switch{justify-content:center}.agenda-filters .filter-select{flex:1 1 140px}
  /* Tarjeta en columna, no en fila: horario arriba, información al centro y
     estado debajo, con el ancho completo — nunca corta nombres largos ni
     genera scroll horizontal (antes, hora + título + estado lado a lado no
     alcanzaba el ancho y el título quedaba cortado). */
  .agenda-card{flex-direction:column;align-items:stretch;gap:8px}
  .agenda-card-time{width:auto;min-width:0}
  .agenda-status{align-self:flex-start;margin-left:0}
  .agenda-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .agenda-filters-head{justify-content:flex-start}}

/* Encabezado compacto: conserva navegación y acciones, recuperando espacio
   vertical para el contenido sin reducir las áreas táctiles de los botones.
   isolation:isolate aísla el degradado naranja (::after, z-index:0) de sus
   hijos (z-index:1) — pero sin un z-index PROPIO en .topbar, ese aislamiento
   deja a TODO el topbar (incluidos #notifPanel/#userPanel, que solo tienen
   ventaja de z-index DENTRO de ese aislamiento) compitiendo como una sola
   unidad de nivel "auto" contra el resto de la página; como esa unidad
   aparece antes en el DOM que #appContent, cualquier botón/tarjeta posterior
   ganaba el empate y tapaba el panel abierto (bug real: "Nueva nota" sobre
   Notificaciones en 390×844). z-index:7 saca a todo el topbar (paneles
   incluidos) por encima de cualquier botón/tarjeta/menú de la página
   (z-index automático), sin pasar por encima de lo que sí debe seguir
   ganando: modal-layer (10), sidebar-backdrop (11) y el sidebar móvil
   abierto (12). */
.topbar{height:var(--as-topbar-height);min-height:var(--as-topbar-height);position:relative;isolation:isolate;z-index:7;border-bottom:1px solid var(--as-border-subtle);background:var(--as-surface);box-shadow:var(--as-shadow-xs)}

.topbar>*{position:relative;z-index:1}
.topbar .crumb{color:var(--muted)}
.topbar .crumb b{color:#c0c5bc}
.topbar .crumb strong,.topbar .round-button,.topbar .mobile-menu{color:#17242d}
.topbar .today-label{color:var(--subtle)}
.topbar .round-button:hover,.topbar .mobile-menu:hover{background:#e8e9e2;color:#101a21}
.main-content{position:relative}
/* Soporte: botón dentro de .topbar-right, junto a calculadora y campana.
   En celular queda solo el icono (el texto se oculta abajo). */
.topbar-support-btn{display:inline-flex;align-items:center;gap:7px;height:34px;padding:0 13px;border:1px solid var(--as-border-default);border-radius:999px;background:var(--as-surface);color:#17242d;font:600 12.5px/1 var(--as-font-sans);white-space:nowrap;text-decoration:none;transition:background .14s ease,border-color .14s ease}
.topbar-support-btn svg{display:block;flex:none}
.topbar-support-btn:hover{background:#e8e9e2;border-color:#c9c9c0;color:#101a21}
.topbar-support-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.pos-summary{top:67px}
@media (min-width:931px){.content.pos-view{height:calc(100dvh - 52px)}}
@media (max-width:680px){.topbar{height:var(--as-topbar-height);min-height:var(--as-topbar-height)}.topbar-right{gap:5px}.topbar-support-btn{width:38px;height:38px;padding:0;justify-content:center}.topbar-support-label{display:none}.topbar .crumb{display:none}}

/* Productos y consumos (Gestión, Bloque PC-1) — franja de conteos y detalles
   de existencias. Reutiliza el lenguaje visual de ASISTIDA (paneles, tablas
   responsive, .status) y solo añade lo mínimo propio. */
.mp-stat-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin-bottom:16px}
.mp-stat{padding:13px 16px;border:1px solid var(--line);border-radius:10px;background:#fbfaf5}
.mp-stat span{display:block;margin-bottom:4px;color:var(--muted);font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.3px}
.mp-stat strong{font:700 20px/1.15 var(--as-font-sans);color:var(--ink);font-variant-numeric:tabular-nums}
.mp-stat-error{grid-column:1/-1;margin:0}
/* PC-5 — soporte de costos: ganancia bruta negativa (venta ≤ costo). */
.mp-stat-danger strong{color:#d0685e}
/* PC-4 — selector segmentado "Productos / Consumos": botones visibles, no solo
   color ni línea inferior. Activo = fondo oscuro ASISTIDA + texto blanco;
   inactivo = fondo claro + borde visible + texto oscuro. */
.mp-segmented{display:inline-flex;gap:4px;margin:2px 0 16px;padding:4px;border:1px solid var(--line);border-radius:11px;background:#eef0e9}
.mp-seg-btn{min-height:40px;padding:9px 22px;border:1px solid #d3d8cf;border-radius:8px;background:#fff;color:var(--ink);font-weight:bold;font-size:13px;cursor:pointer;transition:background-color .14s ease,color .14s ease,border-color .14s ease}
.mp-seg-btn:hover:not(.is-active){background:#e7ebe0;border-color:#c4cbbc;color:#3a423b}
.mp-seg-btn.is-active{background:var(--ink);color:#fff;border-color:var(--ink)}
.mp-seg-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
@media(max-width:700px){.mp-segmented{display:flex;width:100%}.mp-seg-btn{flex:1 1 0;min-width:0;padding:9px 10px}}

/* Navegación interna ASISTIDA: una base común compacta y una pestaña activa
   limpia, sin brillos ni adornos que puedan recortarse en el desplazamiento
   horizontal. El fondo de la activa y su puente inferior son el mismo del
   panel, eliminando la línea entre la selección y el contenido. El naranja
   se reserva para comunicar el estado seleccionado. Reutilizable solo para cambiar entre VISTAS; nunca
   para acciones (Guardar/Añadir/Abonar/Anular/Exportar…).
   Aplicado en: Control de asistencia (barra principal de 5 vistas y el
   selector interno Buscar cliente/Escanear QR de Registrar asistencia, ver
   attendance-module.js) y Productos y consumos (selector Productos/
   Consumos, ver management-products-module.js, en reemplazo puntual de
   .mp-segmented/.mp-seg-btn — esas reglas quedan sin uso, no se borran por
   si el dueño prefiere conservarlas). Los ".availability-tab*" propios de
   Agenda y ".history-tabs" de Inventario tienen sus propias reglas de color/
   foco/touch-target más abajo (BLOQUE J2) — no comparten esta clase. */
.at-tabs{position:relative;display:flex;align-items:flex-end;gap:2px;background:linear-gradient(180deg,#f2f4ef 0%,#e9ece5 100%);border:1px solid #e2e5dd;border-bottom:0;border-radius:13px 13px 0 0;padding:5px 8px 0;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none;box-shadow:inset 0 1px 0 rgba(255,255,255,.82)}
.at-tabs::-webkit-scrollbar{display:none}
.at-tabs::after{content:'';position:absolute;z-index:0;left:0;right:0;bottom:0;height:1px;background:#dfe3dc;pointer-events:none}
.at-tab{position:relative;z-index:1;isolation:isolate;flex:0 0 auto;white-space:nowrap;border:0;background:transparent;color:#707a73;font:bold 12.5px var(--as-font-sans);padding:9px 20px 10px;margin:0;cursor:pointer;transition:color .18s ease,transform .18s ease,text-shadow .18s ease}
.at-tab:hover:not(.is-active){color:#bd571f;transform:translateY(-1px)}
.at-tab:active:not(.is-active){transform:translateY(0);background:rgba(232,117,46,.09)}
.at-tab:focus-visible{outline:2px solid var(--tab-accent);outline-offset:2px;z-index:4}
.at-tab::before{content:'';position:absolute;z-index:-1;inset:0;opacity:0;border:1px solid #dfe3dc;border-bottom:0;border-radius:10px 10px 0 0;background:var(--card);transition:opacity .18s ease}
.at-tab.is-active{z-index:3;color:#d85814;transform:none}
.at-tab.is-active::before{opacity:1}
.at-tab.is-active::after{content:'';position:absolute;z-index:2;left:0;right:0;bottom:0;height:2px;background:var(--card);pointer-events:none}
.at-tabs+.panel{position:relative;z-index:1;border-top-color:transparent;border-radius:0 0 9px 9px}
@media(max-width:680px){.at-tabs{padding:4px 6px 0;gap:1px}.at-tab{padding:8px 15px 9px}}

/* BLOQUE J2 — barra de 5 pestañas de Control de asistencia: naranja ASISTIDA
   y foco con tokens oficiales, y touch target mínimo de 44px. Acotado por
   clase (.at-tabs--attendance) a esta barra para no tocar Productos/Consumos,
   que comparte .at-tabs/.at-tab pero debe quedar exactamente igual que antes.
   El scroll horizontal en móvil ya lo da .at-tabs (overflow-x:auto, arriba);
   mantener visible la pestaña activa lo resuelve el propio JS (scrollIntoView
   tras cada repintado, ver attendance-module.js). */
.at-tabs--attendance .at-tab{min-height:44px;display:inline-flex;align-items:center}
.at-tabs--attendance .at-tab.is-active{color:var(--as-brand-primary)}
.at-tabs--attendance .at-tab:focus-visible{outline-color:var(--as-focus-border)}

/* Productos / Consumos: mismo criterio de aislamiento por clase que arriba
   (.at-tabs--attendance) — .at-tabs--segmented solo cambia la apariencia a
   selector segmentado (lenguaje visual de .as-segmented, filtro de Clientes).
   role="tablist"/"tab", aria-selected, aria-controls y la navegación por
   flechas de management-products-module.js quedan intactos: solo es CSS. */
.at-tabs--segmented{position:static;align-items:center;background:var(--as-surface-hover,#f3eee8);border:0;border-radius:12px;padding:4px;box-shadow:none;gap:4px}
.at-tabs--segmented::after{content:none}
.at-tabs--segmented .at-tab{position:static;height:32px;display:inline-flex;align-items:center;justify-content:center;padding:0 16px;margin:0;border-radius:9px;font:500 13px var(--as-font-sans);color:var(--as-text-secondary,#5b524a);transform:none;transition:background .15s ease,color .15s ease}
.at-tabs--segmented .at-tab::before,
.at-tabs--segmented .at-tab::after{content:none}
.at-tabs--segmented .at-tab:hover:not(.is-active){color:var(--as-text-primary,#1c1612);background:var(--as-surface-secondary,#f7f3ee);transform:none}
.at-tabs--segmented .at-tab:active:not(.is-active){background:var(--as-surface-secondary,#f7f3ee)}
.at-tabs--segmented .at-tab.is-active{background:var(--as-surface,#fff);color:var(--as-text-primary,#1c1612);font-weight:600;box-shadow:0 1px 2px rgba(28,22,18,.08)}
.at-tabs--segmented .at-tab:focus-visible{outline:none;box-shadow:var(--as-ring,0 0 0 4px rgba(249,115,22,.16))}
@media(max-width:680px){.at-tabs--segmented{padding:4px;gap:4px}.at-tabs--segmented .at-tab{padding:0 14px}}

/* PC-4 — pestaña "Consumos": barra de filtros (cliente, estado, rango, limpiar). */
.mp-consumptions-toolbar .debts-sort select,
.mp-consumptions-toolbar .debts-sort input[type="date"]{width:auto;min-width:140px;flex:0 0 auto}
/* PC-4 — ventana única "Registrar consumo": un solo flujo, tres secciones
   (1 Cliente · 2 Productos · 3 Pago). El CLIENTE vive en el encabezado fijo y el
   TOTAL + acciones en el pie fijo, así que ambos quedan SIEMPRE visibles; solo la
   zona central (productos + pago) se desplaza — sin barras dobles, sin contenido
   cortado. Centrada con márgenes en PC; ocupa el alto disponible en móvil. */
.modal.mp-consumption-flow{display:flex;flex-direction:column;overflow:hidden;padding:0;max-height:min(92vh,880px);width:min(100%,560px)}
.mp-consumption-flow .mpc-head{flex:0 0 auto;padding:20px 26px 14px;border-bottom:1px solid var(--line)}
.mp-consumption-flow .mpc-head h2{margin:2px 0 0}
.mp-consumption-flow #consumptionForm{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}
.mp-consumption-flow .mpc-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:14px 26px}
.mp-consumption-flow .mpc-foot{flex:0 0 auto;padding:12px 26px 14px;border-top:1px solid var(--line);background:var(--card)}
.mp-consumption-flow .mpc-foot .consumption-total{margin:0 0 10px}
.mp-consumption-flow .mpc-foot .form-actions{margin:0}
.mp-consumption-flow .modal-alert{margin:4px 0 12px}
.mpc-step{margin:14px 0 8px;font:600 11px var(--as-font-sans);letter-spacing:.7px;text-transform:uppercase;color:var(--subtle)}
.mp-consumption-flow .mpc-head .mpc-step{margin:14px 0 7px}
.mpc-section{padding:14px 0;border-top:1px solid #eef0eb}
.mpc-section:first-of-type{border-top:0;padding-top:2px}
.mpc-section>h3.mpc-step{margin-top:0}
.mpc-section>h4{margin:14px 0 8px;font-size:12.5px;color:var(--ink)}
/* Buscador de cliente: desplegable flotante (no empuja el encabezado fijo). */
.mp-consumption-flow #mpcClientResults{max-height:240px}
/* Resultados de producto: en línea dentro de la zona desplazable. */
.mp-consumption-flow #consumptionResults{position:static;max-height:220px;margin-top:6px;box-shadow:none;overflow:hidden auto}
.mp-consumption-flow .commercial-client-picker-results>button{white-space:normal;overflow-wrap:break-word;line-height:1.35}
.mpc-selected-client{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:11px 13px;border:1px solid #cfe0a8;border-radius:9px;background:#f4f8e6}
.mpc-selected-client strong{display:block;font-size:14px;color:var(--ink)}
.mpc-selected-client span{display:block;color:var(--muted);font-size:12px;margin-top:2px}
.mpc-selected-client button{flex:0 0 auto}
.mpc-client-hint{margin-top:6px}
.mpc-product-panel{margin:10px 0 6px;padding:12px;border:1px solid var(--line);border-radius:9px;background:#fbfcf8}
.mpc-product-panel .category-autocomplete{position:relative}
.mpc-link-button{margin-top:8px;border:0;background:none;color:var(--lime-dark);font-size:12px;font-weight:bold;cursor:pointer;padding:0}
.mpc-link-button:hover{text-decoration:underline}
.mpc-empty-lines{margin:6px 0;padding:14px;border:1px dashed var(--line);border-radius:8px;text-align:center;color:var(--muted);font-size:12.5px}
/* La tabla de líneas se ajusta al ancho de la ventana — sin scroll horizontal. */
.mp-consumption-flow .table-wrap{overflow-x:visible}
.mp-consumption-flow .consumption-line-table{min-width:0}
.mp-consumption-flow .consumption-line-table th,.mp-consumption-flow .consumption-line-table td{padding-left:5px;padding-right:5px;overflow-wrap:anywhere}
.mp-consumption-flow .consumption-line-table th:first-child,.mp-consumption-flow .consumption-line-table td:first-child{padding-left:0}
.mp-consumption-flow .consumption-line-table th:last-child,.mp-consumption-flow .consumption-line-table td:last-child{padding-right:0}
.mp-consumption-flow .consumption-line-table input[data-line-qty]{width:56px}
.mp-consumption-flow .consumption-line-table .small-button.danger{padding:7px 9px}
.mp-consumption-flow .consumption-line-table td .field-note{margin-top:2px}
@media(max-width:680px){
  .modal.mp-consumption-flow{max-height:calc(100dvh - 20px);width:100%}
  .mp-consumption-flow .mpc-head{padding:16px 16px 12px}
  .mp-consumption-flow .mpc-scroll,.mp-consumption-flow .mpc-foot{padding-left:16px;padding-right:16px}
  .mpc-selected-client{flex-direction:column;align-items:stretch}
  .mpc-selected-client button{width:100%}
}
/* GEF-1C: "Gestionar clientes" (Agenda / Productos y consumos) — MISMO patrón
   que .mp-consumption-flow: cabecera y pie fijos, una sola zona de scroll
   (la lista), sin barras dobles. Reutilizable por cualquier ventana de
   buscador + filtros + lista con acción por fila. */
.modal.list-manager{display:flex;flex-direction:column;overflow:hidden;padding:0;max-height:min(88vh,760px);width:min(100%,560px)}
.list-manager .lm-head{flex:0 0 auto;padding:20px 26px 14px;border-bottom:1px solid var(--line)}
.list-manager .lm-head h2{margin:2px 0 0}
.list-manager .lm-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:14px 26px}
.list-manager .lm-foot{flex:0 0 auto;padding:12px 26px 14px;border-top:1px solid var(--line);background:var(--card)}
.list-manager .lm-foot .form-actions{margin:0}
.list-manager .modal-alert{margin:4px 0 12px}
.list-manager .lm-toolbar{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}
.list-manager .lm-toolbar .search-box{flex:1 1 220px}
.list-manager .lm-toolbar .filter-select{max-width:180px}
.list-manager .lm-row{display:flex;align-items:center;gap:12px;padding:11px 13px;border:1px solid var(--line);border-radius:8px;background:#f8f8f3;margin-bottom:8px}
.list-manager .lm-row:last-child{margin-bottom:0}
.list-manager .lm-row-info{flex:1;min-width:0}
.list-manager .lm-row-info strong{display:block;font-size:13px;color:var(--ink);overflow-wrap:break-word}
.list-manager .lm-row-info small{display:block;color:var(--muted);font-size:12px;margin-top:2px;overflow-wrap:break-word}
.list-manager .lm-switch{display:inline-flex;align-items:center;gap:9px;flex:0 0 auto;border:0;background:transparent;padding:6px 4px;border-radius:var(--as-radius-sm);font:inherit;cursor:pointer}
.list-manager .lm-switch-label{font-weight:bold;font-size:12.5px;color:#9aa29a}
.list-manager .lm-switch[aria-checked="true"] .lm-switch-label{color:#78931c}
.list-manager .lm-switch>.as-switch{pointer-events:none}
.list-manager .lm-switch:hover>.as-switch{background:var(--as-gray-400)}
.list-manager .lm-switch[aria-checked="true"]>.as-switch{background:var(--as-success-500)}
.list-manager .lm-switch[aria-checked="true"]:hover>.as-switch{background:var(--as-success-600)}
.list-manager .lm-switch[aria-checked="true"]>.as-switch .as-switch-knob{transform:translateX(calc(var(--as-switch-w) - var(--as-switch-knob) - (var(--as-switch-pad) * 2)))}
.list-manager .lm-switch:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.list-manager .lm-switch:disabled{opacity:.6;cursor:default}
@media(max-width:680px){
  .modal.list-manager{max-height:calc(100dvh - 20px);width:100%}
  .list-manager .lm-head{padding:16px 16px 12px}
  .list-manager .lm-scroll,.list-manager .lm-foot{padding-left:16px;padding-right:16px}
  .list-manager .lm-toolbar .filter-select{max-width:none}
  .list-manager .lm-row{flex-direction:column;align-items:stretch}
  .list-manager .lm-row button{width:100%}
  .list-manager .lm-switch{justify-content:space-between}
}
.mp-stock{font-variant-numeric:tabular-nums}
.mp-stock-low{color:#a9791f}
.mp-stock-out{color:#c0554b}
.mp-stock-actions{margin:16px 0}
@media(max-width:680px){.mp-stat-strip{grid-template-columns:1fr 1fr}.mp-stat strong{font-size:17px}}
/* PC-3B — devoluciones y anulaciones en la ficha del cliente. */
.status.void{background:#eceae6;color:#7c7c74}
.consumption-breakdown{display:grid;gap:6px;margin:8px 0;padding:10px 12px;border-radius:8px;background:#f4f6f2}
.consumption-breakdown>div{display:flex;justify-content:space-between;gap:12px;font-size:12px}
.consumption-breakdown dt{color:var(--muted)}
.consumption-breakdown dd{margin:0;text-align:right;color:var(--ink)}
.consumption-row-actions{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}
.consumption-returns{margin-top:8px}

/* Créditos / Deudas — pantalla propia de "cuentas por cobrar", con lenguaje
   visual de tarjetas (no la tabla que usa Clientes comerciales) para que se
   distinga a simple vista aunque comparta la misma ficha de cliente. */
.debts-summary-grid .stat-card{min-height:104px}
.debts-toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:14px 16px;margin-bottom:16px}
.debts-search,
.form-search{border:1px solid var(--as-border-default);border-radius:var(--as-radius-xs);background:var(--as-surface);transition:border-color var(--as-duration-fast) var(--as-ease-standard),box-shadow var(--as-duration-fast) var(--as-ease-standard)}
.debts-search{flex:1 1 260px;display:flex;align-items:center;gap:9px;padding:0 13px;height:46px}
.debts-search span{color:var(--as-text-muted);line-height:1;transition:color var(--as-duration-fast) var(--as-ease-standard)}.debts-search span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.debts-search:focus-within span{color:var(--as-brand-600)}
.debts-search input,
.form-search input{border:0;outline:0;background:transparent;color:var(--as-ink-primary);font-family:var(--as-font-sans);font-size:var(--as-font-size-sm)}
.debts-search input{height:100%}
.debts-search input::placeholder,
.form-search input::placeholder{color:var(--as-text-muted)}
.debts-search input:focus,
.form-search input:focus{box-shadow:none}
.debts-search:focus-within,
.form-search:focus-within{border-color:var(--as-focus-border);box-shadow:var(--as-focus-ring)}
/* .debts-search también combinado con .search-box (Gastos, Productos y
   Consumos): anula la caja propia del contenedor para que el único campo
   visible sea el input (.as-input ya trae fondo blanco, borde, radio y
   altura estándar) y la lupa quede superpuesta dentro de él, no en una caja
   aparte. No se toca .debts-search a solas: Inventario y Proveedores siguen
   igual. */
.debts-search.search-box{display:block;border:0;background:transparent;padding:0;gap:0;height:auto}
.debts-search.search-box:focus-within{border-color:transparent;box-shadow:none}
.form-search span{color:var(--as-text-muted);line-height:1;transition:color var(--as-duration-fast) var(--as-ease-standard)}.form-search span svg{display:block;width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.form-search:focus-within span{color:var(--as-brand-600)}
.debts-sort{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:bold;color:#5f6861;white-space:nowrap}
.debts-sort select{width:auto}
.debts-updating{display:inline-flex;align-items:center;gap:7px;font-size:12px;font-weight:700;color:var(--muted)}
.debts-updating::before{content:'';width:12px;height:12px;border:2px solid #dfe5dc;border-top-color:var(--lime-dark);border-radius:50%;animation:inventory-spin .8s linear infinite}
.debts-table-panel{margin-bottom:16px}
.debts-table th:nth-child(3),.debts-table th:nth-child(4),.debts-table td:nth-child(3),.debts-table td:nth-child(4){white-space:nowrap}
.debts-table td[data-label="Antigüedad de la deuda"] small{display:block;color:var(--muted);font-size:11px;margin-top:1px}
.debts-whatsapp,.receipt-whatsapp{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:34px;height:34px;padding:0;border-radius:var(--as-radius-pill);background:#25d366;color:#fff;box-shadow:var(--as-shadow-xs);transition:transform .12s ease,box-shadow .12s ease,background-color .12s ease}
.debts-whatsapp:hover,.receipt-whatsapp:hover{background:#20bd5a;color:#fff;transform:translateY(-1px);box-shadow:var(--as-shadow-sm)}
.debts-whatsapp:active,.receipt-whatsapp:active{transform:translateY(0);box-shadow:var(--as-shadow-xs)}
.debts-whatsapp:focus-visible,.receipt-whatsapp:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.debts-whatsapp svg,.receipt-whatsapp svg{width:16px;height:16px;fill:currentColor;stroke:none}
.debts-pagination{display:flex;align-items:center;justify-content:center;gap:13px;padding:6px 0 2px}
.debts-pagination span{color:var(--muted);font-size:12px;font-weight:700}
.debts-pagination .small-button[disabled]{opacity:.42;cursor:not-allowed;transform:none;box-shadow:none}
/* Comprobante + WhatsApp se agrupan visualmente como un solo control (gap
   más chico que .row-actions) — Anular queda separado, con el espaciado
   normal, porque es una acción destructiva aparte. */
.button-pair{display:inline-flex;gap:3px}
@media(max-width:680px){.debts-toolbar{flex-direction:column;align-items:stretch}.debts-search{flex:0 0 auto}.debts-sort{flex:0 0 auto;justify-content:space-between}.debts-sort select{flex:1}.responsive-table.debts-table .row-actions .small-button.debts-whatsapp{flex:0 0 auto;width:34px}.responsive-table .row-actions .small-button.receipt-whatsapp{flex:0 0 auto;width:34px}}

/* Movimientos — presentación simplificada: lista con menos columnas y
   etiquetas de color suave por tipo, y modal de detalle en secciones de
   texto normal (no la cuadrícula de tarjetas con letras grandes). No
   cambia datos ni cálculos, solo cómo se presentan. */
.status.returned{background:#ede7fb;color:#7a5fc4}
.movements-groups .history-date-group-label strong{font-size:15px}
.movements-groups .history-date-group-label .history-date-group-count{font-size:12.5px}
.movements-table th{font-size:11.5px}
.movements-table td{font-size:13.5px}
.movements-table td[data-label]::before{font-size:10.5px}
.movement-summary{background:#f8f8f3;border:1px solid var(--line);border-radius:9px;padding:16px 18px;margin-bottom:16px}
.movement-summary-product{margin:0 0 8px;font:600 16px/1.3 Arial,sans-serif;color:var(--ink)}
.movement-summary-meta{display:flex;flex-wrap:wrap;align-items:center;gap:12px;font-size:13px;color:var(--muted)}
.movement-summary-qty{font:700 19px Consolas,monospace}
.movement-summary-qty.credit-amount{color:#78931c}
/* Vencido pero sin saldo pendiente: no es mora, así que no usa el color de
   alarma de .mora — mismo tono neutro que .balance. */
.mora-none{font:12px var(--as-font-sans);color:var(--muted)}
/* Estado de cuenta / envío por WhatsApp de la ficha: acción independiente del
   comprobante por pago, alineada a la derecha justo antes de las tarjetas
   financieras (Estado del plan / Deuda total / Saldo pendiente). */
.finance-actions{display:flex;justify-content:flex-end;margin-bottom:10px}
.movement-summary-qty.mora{color:#d0685e}
.movement-detail-section{margin-bottom:16px}
.movement-detail-section h3{margin:0 0 8px;font-size:11.5px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;color:var(--muted)}
.movement-detail-rows{display:grid;gap:0}
.movement-detail-row{display:flex;justify-content:space-between;align-items:baseline;gap:14px;padding:9px 0;border-bottom:1px solid #eceee6;font-size:13.5px}
.movement-detail-row:last-child{border-bottom:0}
.movement-detail-row span{color:var(--muted);flex-shrink:0}
.movement-detail-row strong{color:var(--ink);font-weight:600;text-align:right}
.movement-tech{margin-top:4px;border:1px solid var(--line);border-radius:8px;padding:0 14px;background:#fbfcf8}
.movement-tech summary{cursor:pointer;padding:11px 0;font-size:12.5px;font-weight:700;color:var(--muted);list-style:none}
.movement-tech summary::-webkit-details-marker{display:none}
.movement-tech-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px solid #eceee6;font-size:12px}
.movement-tech-row span{flex-shrink:0;color:var(--muted)}
.movement-tech-row code{flex:1;min-width:0;overflow-wrap:anywhere;font:11.5px Consolas,monospace;color:var(--ink)}
.movement-tech-copy{flex-shrink:0;border:0;background:#eef0e9;border-radius:5px;padding:4px 9px;font-size:11.5px;font-weight:700;color:var(--muted);cursor:pointer}
.movement-tech-copy:hover{background:#e2e5dc;color:var(--ink)}
@media(max-width:480px){.movement-detail-row{flex-direction:column;align-items:flex-start;gap:2px}.movement-detail-row strong{text-align:left}}

/* Alineación monetaria en tablas de Inventario (Productos, Movimientos de
   lotes, Historial de ventas y turnos, Créditos/Deudas, Clientes
   comerciales…) — .inv-money-table es un marcador nuevo, sin ningún otro
   estilo asociado, para no heredar accidentalmente colores de otras clases
   ya usadas en esas mismas tablas (p. ej. .inventory-table strong o
   .mora/.credit-amount en la celda de Saldo). Solo toca alineación y el
   conteo de dígitos; nunca colores, tamaños ni el cálculo mostrado. Se
   limita a la vista de tabla real (≥681px) — en tarjetas (móvil) cada valor
   ya va debajo de su etiqueta y alinearlo a la derecha no aporta claridad
   ahí, así que se deja como está. Nunca toca las tablas de Gestión
   (Clientes, Pagos/Abonos), que solo usan .responsive-table sin este
   marcador. */
@media(min-width:681px){
  .inv-money-table td[data-label="Precio"],
  .inv-money-table td[data-label="Costo"],
  .inv-money-table td[data-label="Total"],
  .inv-money-table td[data-label="Pagado"],
  .inv-money-table td[data-label="Saldo"],
  .inv-money-table td[data-label="Total neto"],
  .inv-money-table td[data-label="Recibido"],
  .inv-money-table td[data-label="Fondo inicial"],
  .inv-money-table td[data-label="Efectivo esperado"],
  .inv-money-table td[data-label="Efectivo contado"],
  .inv-money-table td[data-label="Diferencia"],
  .inv-money-table td[data-label="Saldo pendiente"],
  .inv-money-table td[data-label="Valor"]{
    text-align:right;
    font-variant-numeric:tabular-nums;
  }
}

/* Historial de turnos: FECHA y RESPONSABLE quedaban tan angostas (varias
   columnas más compitiendo por el mismo ancho) que el texto se partía en
   3 líneas. Ancho mínimo modesto para que quepan en 1-2 líneas; el
   .table-wrap ya existente sigue absorbiendo cualquier desborde real con
   scroll horizontal, así que esto no crea uno nuevo. */
@media(min-width:681px){
  .shifts-table th:nth-child(1),.shifts-table td:nth-child(1){min-width:100px}
  .shifts-table th:nth-child(2),.shifts-table td:nth-child(2){min-width:140px}
}

/* Movimiento reducido: apaga transiciones y animaciones decorativas para
   quien lo pida en su sistema — casi todas las duraciones del archivo son
   transition/animation cortas (hover, colapso de sidebar, tooltips, etc.),
   así que en vez de tocar cada regla una por una se neutraliza la duración
   de forma global. Se usa 0.01ms en vez de 0s/"none" para que el motor
   siga disparando transitionend donde el JS lo espera, y !important porque
   la meta es anular cualquier transition/animation ya declarada, sin
   reescribirlas todas. El spinner de carga (.inventory-loading) no se
   oculta — solo deja de girar y queda visible, como indicador estático. */
@media (prefers-reduced-motion: reduce) {
  *,*::before,*::after{
    animation-duration:0.01ms!important;
    animation-iteration-count:1!important;
    transition-duration:0.01ms!important;
    scroll-behavior:auto!important;
  }
}

/* GESTIÓN-2A: Notas rápidas — libreta de notas adhesivas (pantalla propia +
   sección compacta en la ficha del cliente). Reutiliza .panel/.panel-heading/
   .small-button/.secondary-button/.primary-button/.round-button/.notif-panel/
   .notif-row/.empty/.field-note/.modal/.form-* ya existentes; solo lo
   específico de las tarjetas de notas es nuevo. La cabecera principal solo
   contiene título + selector Tarjetas/Lista + menú secundario (Archivadas/
   Eliminadas) + Nueva nota — sin buscador general en este MVP (la única
   búsqueda del módulo es la de cliente, dentro del menú de cada nota). */
.qn-screen{display:flex;flex-direction:column;gap:14px}
.qn-title{margin:0;font-size:20px}
.qn-toolbar{display:flex;flex-direction:column;gap:10px}
.qn-toolbar-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.qn-toolbar-main{justify-content:space-between}
.qn-toolbar-actions{display:flex;align-items:center;gap:8px;position:relative;margin-left:auto}
.qn-toolbar-contextual{display:flex;align-items:center;gap:10px}
/* Selector Tarjetas/Lista — icónico y compacto, integrado con .round-button. */
.qn-view-toggle{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--line);border-radius:11px;background:#eef0e9}
.qn-view-btn{width:32px;height:32px;display:grid;place-items:center;border:0;border-radius:8px;background:transparent;color:var(--muted);cursor:pointer;transition:background-color .12s ease,color .12s ease}
.qn-view-btn:hover{background:#e2e5dc;color:var(--ink)}
.qn-view-btn.active{background:var(--ink);color:#fff}
.qn-view-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
/* Menú "⋯" de cabecera (Notas archivadas / Notas eliminadas) — mismo look que el panel de notificaciones. */
.qn-header-menu{position:absolute;top:44px;right:0;min-width:190px}
.qn-header-menu .qn-icon{color:var(--muted)}
.qn-error-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:12px 14px;border-radius:9px;background:#fff3f2;border:1px solid #f3cfc9;color:#7a1f14;font-size:13px}
.qn-status-line{padding:22px 0;text-align:center;color:var(--muted);font-size:13px}
.qn-empty-state{display:flex;flex-direction:column;align-items:center;gap:12px;padding:36px 20px;text-align:center}
.qn-empty-state p{margin:0;color:var(--muted)}

/* Cuadrícula de tarjetas — flexbox (no CSS grid): cada tarjeta declara su
   propio ancho/alto (por nota, ver .qn-card más abajo) y la cuadrícula
   simplemente reordena el flujo alrededor — así una nota más grande NUNCA
   rompe la fila de las demás ni se sale del contenedor. 1 columna en
   390px (ver media query), varias en escritorio. */
.qn-grid{display:flex;flex-wrap:wrap;gap:14px;align-items:flex-start}
.qn-mini-grid{gap:10px}

/* AJUSTE VISUAL FINAL: la tarjeta es una superficie de escritura, no un
   formulario — sin caja interior, el editor hereda el color de la nota.
   El foco se indica en el borde EXTERIOR de la tarjeta (:focus-within),
   nunca dentro del editor (ver .qn-rich-editor más abajo). Ancho y alto son
   fijos (no auto): el tamaño "normal" es el predeterminado de toda nota sin
   preferencia guardada; una nota con más texto se desplaza dentro de su
   editor (scroll nativo) en vez de estirar la tarjeta — así el tamaño
   configurado (a mano o por preajuste) es siempre el tamaño real. */
.qn-card{position:relative;display:flex;flex-direction:column;gap:6px;padding:10px;border-radius:10px;border:1px solid rgba(0,0,0,.08);box-shadow:0 1px 3px rgba(0,0,0,.05);transition:box-shadow .12s ease}
.qn-card:not(.qn-compact){flex:0 0 auto;width:240px;height:220px}
.qn-card.qn-compact{width:190px;padding:8px;gap:6px}
.qn-card:focus-within{box-shadow:0 0 0 2px var(--as-focus-border),0 1px 3px rgba(0,0,0,.05)}
.qn-card.qn-dragging{opacity:.45}
.qn-card.qn-drop-target,.qn-list-row.qn-drop-target{outline:2px dashed var(--ink);outline-offset:2px}

/* AJUSTE VISUAL Y FUNCIONAL: cabecera UNIFICADA de la nota — una sola fila
   (herramientas de formato + zona de arrastre flexible + menú), pegada al
   borde superior de la tarjeta (el padding de .qn-card ya da los 8-12px);
   .qn-body arranca justo debajo con el mismo margen — ya no hay una fila
   vacía de por medio. */
.qn-note-head{display:flex;align-items:center;gap:0;min-height:36px;margin-bottom:6px}
.qn-note-head-minimal{min-height:24px;margin-bottom:6px}
.qn-icon{display:inline-flex}
.qn-icon svg{width:15px;height:15px;display:block}
.qn-pin-mark{width:24px;height:24px;display:grid;place-items:center;opacity:.8;flex-shrink:0}
.qn-pin-mark svg{width:14px;height:14px}
/* Zona de arrastre — el espacio libre ENTRE el formato y el menú, franja
   transparente sin icono (B): cursor grab en reposo, grabbing mientras se
   sostiene. Nunca dispara arrastre al escribir/seleccionar texto (vive fuera
   de .qn-body) ni al pulsar los botones (son hermanos, no ancestros). */
.qn-drag-zone{flex:1;align-self:stretch;min-width:8px;cursor:grab}
.qn-drag-zone:active{cursor:grabbing}
/* Variante para la fila de Lista sin editar: franja angosta y fija (no
   flexible) al inicio de la fila — mismo lugar que ocupaba el grip antes,
   pero transparente y sin icono. */
.qn-drag-zone-inline{flex:0 0 20px;align-self:stretch;min-width:0}
/* Menú de tres puntos DE LA NOTA — más prominente que los controles
   secundarios: área táctil generosa, fondo redondeado sutil siempre visible
   (no solo al pasar el mouse), contraste alto, estado activo claro mientras
   el popover está abierto. */
.qn-menu-trigger{width:34px;height:34px;display:grid;place-items:center;border:none;background:rgba(0,0,0,.045);color:var(--ink);border-radius:9px;cursor:pointer;opacity:.85;flex-shrink:0;transition:background-color .12s ease,opacity .12s ease}
.qn-menu-trigger .qn-icon svg{width:19px;height:19px}
.qn-menu-trigger:hover{opacity:1;background:rgba(0,0,0,.1)}
.qn-menu-trigger:focus-visible,.qn-drag-zone:focus-visible,.qn-list-title:focus-visible,.qn-cancel-link:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.qn-menu-trigger[aria-expanded="true"]{opacity:1;background:rgba(0,0,0,.16)}

/* Paleta cerrada de 7 colores — fondo + texto con contraste AA en cada uno,
   solo en la tarjeta (en Lista el color es una marca lateral, ver abajo). */
.qn-card.qn-color-amarillo{background:#fdf1a8;color:#4a3f05}
.qn-card.qn-color-rosa{background:#f9cddb;color:#5c1530}
.qn-card.qn-color-azul{background:#c8e0f7;color:#0d3357}
.qn-card.qn-color-verde{background:#cdeccb;color:#123a17}
.qn-card.qn-color-morado{background:#ddd0f5;color:#331a5c}
.qn-card.qn-color-gris{background:#e2e2e2;color:#2a2a2a}
.qn-card.qn-color-blanco{background:#ffffff;color:#1c1c1c;border-color:rgba(0,0,0,.14)}
.qn-swatch-amarillo{background:#fdf1a8}
.qn-swatch-rosa{background:#f9cddb}
.qn-swatch-azul{background:#c8e0f7}
.qn-swatch-verde{background:#cdeccb}
.qn-swatch-morado{background:#ddd0f5}
.qn-swatch-gris{background:#e2e2e2}
.qn-swatch-blanco{background:#ffffff;border:1px solid rgba(0,0,0,.18)}

/* Superficie de escritura: sin borde, sin fondo propio, sin sombra interior,
   sin esquina de redimensionamiento NATIVA del navegador (resize:none —
   el redimensionamiento de la NOTA es el tirador propio .qn-resize-handle
   de la tarjeta, no el del textarea), sin recuadro de foco — el texto queda
   directamente sobre el color de la nota. Clic en cualquier parte del
   cuerpo (.qn-body) enfoca el textarea. El tamaño de la tarjeta es fijo
   (ver .qn-card): si el texto no cabe, el textarea desplaza internamente,
   nunca estira la tarjeta ni sale del contenedor. */
.qn-body{flex:1;display:flex;cursor:text;min-height:0;overflow:hidden}
.qn-rich-editor{position:relative;flex:1;width:100%;padding:0;border:0;background:transparent;outline:0;box-shadow:none;font:inherit;font-size:13px;line-height:1.55;color:inherit;overflow:auto}
.qn-rich-editor.is-blank::before{content:"Toma una nota…";position:absolute;top:0;left:0;color:currentColor;opacity:.5;font-style:italic;pointer-events:none}
.qn-rich-editor p{margin:0 0 6px}
.qn-rich-editor p:last-child{margin-bottom:0}
.qn-rich-editor ul,.qn-rich-editor ol{margin:0 0 6px;padding-left:20px}
.qn-rich-editor li{margin:0 0 2px}
.qn-text-sm{font-size:11.5px}
.qn-text-md{font-size:13px}
.qn-text-lg{font-size:16px}
.qn-c-rojo{color:#8c2c20}
.qn-c-azul{color:#1c4f7c}
.qn-c-verde{color:#1f6b3d}
.qn-c-morado{color:#5b3a8a}
.qn-readonly-text{flex:1;font-size:13px;line-height:1.55;cursor:default;overflow:auto}
.qn-readonly-text p{margin:0 0 6px}
.qn-readonly-text ul,.qn-readonly-text ol{margin:0 0 6px;padding-left:20px}
.qn-empty-text{opacity:.6;font-style:italic}

/* Barra de formato — grupo de herramientas de texto DENTRO de la cabecera
   unificada (.qn-note-head), a su izquierda; el espacio libre que sigue
   (.qn-drag-zone) es lo que sirve de asa de arrastre. Área interactiva
   36×36 en escritorio (44×44 en móvil, ver media query), iconos 18-20px,
   contraste suficiente en reposo (nunca opacidad muy baja). Nunca una
   segunda fila desordenada: si no cabe todo en tarjetas angostas, esta
   franja se desplaza internamente (overflow-x:auto), sin salirse de la
   tarjeta ni empujar su ancho. */
/* CORRECCIÓN BLOQUEANTE: overflow-x:auto sin overflow-y explícito hace que
   el navegador trate también el eje vertical como "auto" (regla CSS: si un
   eje no es visible, el otro deja de serlo) — eso recortaba con su propia
   scrollbar/flechas verticales cualquier cosa más alta que la barra (36px),
   incluido el antiguo popover "Tt" anclado dentro de ella. overflow-y:hidden
   explícito cierra esa puerta para siempre, y el popover "Tt" ahora es un
   portal a document.body (ver openFormatPopover en quick-notes-module.js) —
   nunca vuelve a vivir dentro de este contenedor. Scrollbar horizontal
   siempre invisible en escritorio (nunca aparece, ni al pasar el mouse):
   la barra sigue siendo desplazable con rueda/trackpad si no caben los 7
   íconos, solo que sin una pista de scroll visible. */
.qn-toolbar-fmt{position:relative;display:flex;align-items:center;gap:0;flex-wrap:nowrap;flex-shrink:1;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
.qn-toolbar-fmt::-webkit-scrollbar{display:none;height:0;background:transparent}
.qn-fmt-btn{width:31px;height:31px;flex-shrink:0;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--ink);opacity:.78;cursor:pointer}
.qn-fmt-btn:hover{opacity:1;background:rgba(0,0,0,.08)}
.qn-fmt-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px;opacity:1}
.qn-fmt-btn:active{background:rgba(0,0,0,.12)}
.qn-fmt-btn .qn-icon svg{width:17px;height:17px}
.qn-fmt-btn[aria-expanded="true"]{opacity:1;background:rgba(0,0,0,.12)}
/* Formato activo en la selección/cursor actual (negrita, cursiva, …) — varios
   a la vez, cada uno marcado de forma independiente (ver
   updateFormatButtonStates en quick-notes-module.js). Nunca solo el color:
   fondo + aria-pressed="true" (lector de pantalla) juntos. */
.qn-fmt-btn.is-active{opacity:1;background:rgba(120,147,28,.22);color:var(--lime-dark)}

/* Popover "Tt" (tamaño + color de texto) — CORRECCIÓN BLOQUEANTE: ya no es
   un desplegable anclado dentro de la barra (eso lo dejaba recortado por su
   overflow, ver .qn-toolbar-fmt); ahora es un portal a document.body,
   idéntico en criterio visual/de capas a .qn-popover (fondo sólido, borde y
   sombra de ASISTIDA, mismo radio) pero con su propio z-index porque son
   mutuamente excluyentes (nunca los dos abiertos a la vez) — top/left los
   fija positionFormatPopover() en JS, reposicionándolo si queda cerca de un
   borde del viewport. Cierre exterior/Escape: ver
   ensureHeaderMenuGlobalListeners y onFormatPopoverKeydown. */
.qn-fmt-pop{position:fixed;z-index:45;min-width:210px;max-width:calc(100vw - 24px);background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 16px 40px rgba(30,35,30,.18);padding:6px;color:var(--ink)}
.qn-fmt-pop[hidden]{display:none}
.qn-fmt-pop-section{padding:4px 2px}
.qn-fmt-pop-section+.qn-fmt-pop-section{border-top:1px solid var(--line);margin-top:2px}
.qn-fmt-pop-label{margin:0 0 4px;font-size:10.5px;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.02em}
.qn-fmt-pop-item{display:flex;align-items:center;justify-content:space-between;width:100%;text-align:left;border:0;background:transparent;color:var(--ink);font:inherit;font-size:13px;padding:6px 8px;border-radius:6px;cursor:pointer}
.qn-fmt-pop-item:hover{background:#f1f2ec}
.qn-fmt-pop-item.is-active{font-weight:700}
.qn-fmt-pop-item .qn-icon svg{width:14px;height:14px}
.qn-fmt-pop-swatches{display:flex;gap:8px;padding:2px}
.qn-fmt-color-swatch{width:22px;height:22px;border-radius:50%;border:2px solid #fff;box-shadow:0 0 0 1px var(--line);cursor:pointer}
.qn-fmt-color-swatch:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
/* Color actualmente aplicado en el cursor/selección (ver currentSpanFormat) —
   mismo criterio visual que .qn-color-swatch.is-active (menú de color de la
   nota): anillo alrededor, nunca solo un cambio sutil de fondo. */
.qn-fmt-color-swatch.is-active{box-shadow:0 0 0 1px var(--line),0 0 0 3px var(--ink)}
.qn-c-swatch-default{background:var(--ink)}
.qn-c-swatch-rojo{background:#8c2c20}
.qn-c-swatch-azul{background:#1c4f7c}
.qn-c-swatch-verde{background:#1f6b3d}
.qn-c-swatch-morado{background:#5b3a8a}

/* Imágenes dentro de la nota — bloque no editable (contenteditable=false)
   embebido en el flujo del texto; placeholder discreto mientras se resuelve
   la URL firmada (hydrateNoteImages) o se está subiendo. */
.qn-img-block{position:relative;display:block;margin:4px 0;max-width:100%}
.qn-img-block img{display:block;max-width:100%;border-radius:8px}
.qn-img-placeholder{display:flex;align-items:center;justify-content:center;min-height:60px;border-radius:8px;background:rgba(0,0,0,.06);font-size:11px;color:inherit;opacity:.7}
.qn-img-remove{position:absolute;top:4px;right:4px;width:22px;height:22px;display:grid;place-items:center;border:0;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;cursor:pointer;opacity:0;transition:opacity .12s ease}
.qn-img-block:hover .qn-img-remove,.qn-img-remove:focus-visible{opacity:1}
.qn-img-remove .qn-icon svg{width:12px;height:12px}

/* Tirador de redimensionamiento — discreto, solo escritorio, en la esquina
   inferior derecha de la tarjeta. Elemento propio, nunca el textarea. */
.qn-resize-handle{position:absolute;right:2px;bottom:2px;width:16px;height:16px;cursor:nwse-resize;opacity:.3;color:inherit}
.qn-resize-handle::after{content:'';position:absolute;right:3px;bottom:3px;width:8px;height:8px;border-right:2px solid currentColor;border-bottom:2px solid currentColor}
.qn-resize-handle:hover{opacity:.6}

.qn-client-tag{align-self:flex-start;padding:2px 9px;border-radius:20px;background:rgba(0,0,0,.09);font-size:11px;font-weight:700;color:inherit}
.qn-reminder{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:700;opacity:.75}
.qn-reminder svg{width:12px;height:12px;flex-shrink:0}
.qn-reminder-due{color:#7a1f14;opacity:1}

.qn-footer{display:flex;align-items:center;gap:8px;margin-top:2px;font-size:10.5px;opacity:.6}
.qn-footer-date{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.qn-save-status{min-height:12px}
.qn-save-status.is-error{opacity:1;color:#7a1f14;display:inline-flex;align-items:center;gap:5px}
.qn-retry-btn{border:1px solid currentColor;background:transparent;color:inherit;border-radius:5px;padding:1px 7px;font-size:10.5px;cursor:pointer}
.qn-cancel-link{margin-left:auto;flex-shrink:0;border:0;background:transparent;color:inherit;text-decoration:underline;font-size:10.5px;cursor:pointer;padding:0;opacity:.8}

.qn-actions{display:flex;gap:6px;flex-wrap:wrap;margin-top:2px}
.qn-actions .small-button{white-space:nowrap}
/* Botón del modal de confirmación de "eliminar definitivamente" (no window.confirm). */
.qn-danger-confirm-btn{min-height:44px;padding:11px 20px;border:none;border-radius:9px;background:#a5382c;color:#fff;font-weight:bold;font-size:13px;cursor:pointer}
.qn-danger-confirm-btn:hover{background:#7a1f14}
.qn-danger-confirm-btn:disabled{opacity:.6;cursor:default}

/* Modal de recordatorio — Agregar/Cambiar/"Recordar más tarde" comparten el
   mismo formulario (accesos rápidos editables + Fecha/Hora propias, nunca
   datetime-local nativo). Fecha y Hora en dos columnas en escritorio,
   apiladas en 390×844 (ver media query). */
.qn-reminder-modal{width:min(100%,480px)}
.qn-reminder-quick{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}
.qn-quick-chip{border:1px solid var(--line);background:#fbfcf8;color:var(--ink);border-radius:20px;padding:8px 14px;font-size:12.5px;font-weight:700;cursor:pointer;min-height:36px}
.qn-quick-chip:hover{background:#eef0e9}
.qn-quick-chip:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px}
.qn-reminder-fields{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:4px}
.qn-reminder-field label{display:block;margin-bottom:6px;font-size:12px;font-weight:700;color:var(--muted)}

/* Campo de fecha — tres casillas (orden según el idioma del navegador) +
   botón de calendario + accesos Hoy/Mañana/En una semana. Mismo lenguaje
   visual que .time-field-box (Agenda), para que ambos campos luzcan como un
   mismo componente. */
.date-field{min-width:0}
.date-field-box{display:flex;align-items:stretch;gap:2px;border:1px solid var(--as-border-default);border-radius:8px;background:var(--as-surface);padding:2px;min-height:44px}
.date-field-box input{border:0;background:transparent;min-height:40px;width:30px;padding:0 2px;color:var(--as-ink-primary);font-weight:700;font-size:13px;font-family:var(--as-font-sans);text-align:center;border-radius:5px}
.date-field-year{width:46px!important}
.date-field-box input::placeholder{color:var(--as-text-muted);font-weight:400;opacity:.7}
.date-field-box input:hover:not(:disabled){background:#eef0e9}
.date-field-box input:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px}
.date-field-box input:focus{box-shadow:none}
.search-box input{padding-left:32px}
input.qn-popover-search-input{border:0;background:transparent;padding:0}
.date-field-sep{align-self:center;font-weight:700;color:var(--as-text-muted);padding:0 1px}
.date-field-cal-btn{align-self:center;margin-left:auto;width:36px;height:36px;flex-shrink:0;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--as-ink-primary);opacity:.75;cursor:pointer}
.date-field-cal-btn:hover{opacity:1;background:var(--as-surface-secondary)}
.date-field-cal-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:1px;opacity:1}
.date-field-cal-btn .qn-icon svg{width:18px;height:18px}
.date-field-error{margin:4px 0 0;color:var(--as-danger-600);font-size:11px}
.date-field-quick{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.date-field-quick .qn-quick-chip{padding:5px 10px;font-size:11.5px;min-height:30px}

/* Calendario contextual compacto — desplegable propio del campo, nunca sale
   del modal (position:absolute dentro de .date-field, que ya es
   position:relative por heredar el contenedor del formulario). */
.date-field{position:relative}
.date-cal-pop{position:absolute;z-index:70;top:100%;left:0;margin-top:6px;width:264px;max-width:calc(100vw - 48px);background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 28px rgba(0,0,0,.18);padding:10px;color:var(--ink)}
.date-cal-nav{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.date-cal-label{font-size:12.5px}
.date-cal-nav-btn{width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--ink);cursor:pointer}
.date-cal-nav-btn:hover{background:#eef0e9}
.date-cal-nav-btn .qn-icon svg{width:15px;height:15px}
.date-cal-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-size:10px;font-weight:700;color:var(--muted);margin-bottom:2px}
.date-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.date-cal-cell{aspect-ratio:1;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:var(--ink);font-size:12px;cursor:pointer;min-height:30px}
.date-cal-cell.is-empty{cursor:default}
.date-cal-cell:not(.is-empty):hover{background:#eef0e9}
.date-cal-cell.is-today{font-weight:700;color:var(--lime-dark)}
.date-cal-cell.is-selected{background:var(--ink);color:#fff}

/* "Expandir para leer/escribir" — panel amplio, mismo criterio de superficie
   sin caja que la tarjeta (sin borde/fondo/sombra propios), autoguardado
   con su propio indicador. */
.qn-expand-modal{width:min(100%,720px);display:flex;flex-direction:column}
.qn-expand-modal .qn-toolbar-fmt{margin-top:8px}
.qn-expand-textarea{width:100%;min-height:52vh;color:var(--ink);font-size:14px;line-height:1.65}
.qn-expand-textarea.is-blank::before{color:var(--muted)}
.qn-expand-footer{margin-top:8px;font-size:11px;color:var(--muted)}

/* ============================================================================
   MENÚ EMERGENTE (popover) — anclado al botón "⋯", superpuesto sobre la
   interfaz, nunca expandido dentro de la tarjeta. Un único elemento global,
   position:fixed, reposicionado por JS para no salir de la pantalla. En
   móvil se convierte en menú inferior (ver media query).
   ============================================================================ */
.qn-popover{position:fixed;z-index:40;width:264px;max-width:calc(100vw - 16px);max-height:calc(100vh - 16px);overflow:auto;background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 16px 40px rgba(30,35,30,.18);padding:6px}
.qn-popover[hidden]{display:none}
.qn-popover-item{display:flex;align-items:center;gap:10px;width:100%;text-align:left;border:0;background:transparent;padding:9px 10px;border-radius:8px;font-size:13px;font-weight:600;color:var(--ink);cursor:pointer}
.qn-popover-item .qn-icon svg{width:16px;height:16px;color:var(--muted)}
.qn-popover-item span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.qn-popover-item:hover,.qn-popover-item:focus-visible{background:#f2f3ee;outline:none}
.qn-popover-item.is-danger{color:#a5382c}
.qn-popover-item.is-danger .qn-icon svg{color:#a5382c}
.qn-popover-item.is-danger:hover,.qn-popover-item.is-danger:focus-visible{background:#ffebe8}
.qn-popover-item-check{margin-left:auto;display:inline-flex;flex-shrink:0;color:var(--lime-dark)}
.qn-popover-item-check svg{width:14px;height:14px}
.qn-popover-divider{height:1px;background:var(--line);margin:5px 4px}
.qn-popover-header{display:flex;align-items:center;gap:6px;padding:4px 4px 8px;font-size:11px;font-weight:bold;text-transform:uppercase;letter-spacing:.04em;color:var(--subtle)}
.qn-popover-back{border:0;background:transparent;color:var(--muted);width:24px;height:24px;display:grid;place-items:center;border-radius:6px;cursor:pointer;flex-shrink:0}
.qn-popover-back svg{width:14px;height:14px}
.qn-popover-back:hover,.qn-popover-back:focus-visible{background:#eef0e9;color:var(--ink);outline:none}
.qn-popover-swatchgrid{display:flex;flex-wrap:wrap;gap:9px;padding:4px 8px 8px}
.qn-color-swatch{width:27px;height:27px;border-radius:50%;border:1px solid rgba(0,0,0,.15);cursor:pointer;padding:0}
.qn-color-swatch.is-active{outline:2px solid var(--ink);outline-offset:2px}
.qn-color-swatch:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.qn-popover-search{display:flex;align-items:center;gap:7px;margin:2px 6px 6px;padding:7px 9px;border:1px solid var(--line);border-radius:8px;background:#fbfcf8}
.qn-popover-search .qn-icon svg{width:16px;height:16px;color:var(--as-text-muted);transition:color var(--as-duration-fast) var(--as-ease-standard)}
.qn-popover-search:focus-within .qn-icon svg{color:var(--as-brand-600)}
.qn-popover-search-input{border:0;background:transparent;outline:0;flex:1;font-size:13px;padding:0;color:var(--ink)}
.qn-popover-list{max-height:230px;overflow:auto}
.qn-popover-empty{padding:16px 10px;color:var(--muted);font-size:12px;text-align:center}
.qn-popover-info p{margin:0;padding:6px 10px;font-size:12px;color:var(--muted)}

/* Vista de lista — filas compactas; el color es una marca lateral discreta,
   nunca un fondo. Título derivado de la primera línea (clic para escribir). */
.qn-list{display:flex;flex-direction:column;gap:8px}
.qn-list-row{border-radius:9px;border:1px solid var(--line);border-left-width:4px;border-left-style:solid;background:var(--card);padding:8px 10px}
.qn-list-row.qn-color-amarillo{border-left-color:#e8c93a}
.qn-list-row.qn-color-rosa{border-left-color:#e8879f}
.qn-list-row.qn-color-azul{border-left-color:#7fb2de}
.qn-list-row.qn-color-verde{border-left-color:#8fcf8a}
.qn-list-row.qn-color-morado{border-left-color:#b79bdb}
.qn-list-row.qn-color-gris{border-left-color:#adadad}
.qn-list-row.qn-color-blanco{border-left-color:#d8d8d8}
.qn-list-row:focus-within{box-shadow:0 0 0 2px var(--as-focus-border)}
.qn-list-row-main{display:flex;align-items:flex-start;gap:8px}
.qn-list-body{flex:1;min-width:0}
.qn-list-title{display:block;width:100%;text-align:left;border:0;background:transparent;color:var(--ink);font:inherit;font-size:13px;padding:4px 2px;cursor:text;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:5px}
.qn-list-body .qn-rich-editor{min-height:46px;padding:4px 2px;font-size:13px}
.qn-list-title-ro{padding:4px 2px}
.qn-list-tags{display:flex;align-items:center;gap:8px;padding:0 2px;flex-wrap:wrap}
.qn-list-tags .qn-client-tag{background:#eef0e9;color:var(--ink)}
.qn-list-tags .qn-reminder{color:var(--muted)}
.qn-list-tags .qn-reminder.qn-reminder-due{color:#a5382c}
.qn-list-meta{flex-shrink:0;align-self:center;max-width:150px;text-align:right;display:flex;flex-direction:column;gap:2px;opacity:.65;font-size:10.5px}

@media(max-width:680px){
  /* Tamaño en móvil (sección "TAMAÑO DE LAS NOTAS"): nunca arrastre manual
     (tirador oculto) y nunca ancho por nota — siempre 100%, para que una
     nota jamás cause desbordamiento horizontal. El alto sí seguye el
     preajuste elegido (Compacta/Normal/Grande vía el menú), como la única
     vía de tamaño disponible aquí. */
  .qn-card:not(.qn-compact){width:100%!important;height:200px}
  .qn-card.qn-compact{width:100%}
  .qn-card.qn-size-compact{height:150px}
  .qn-card.qn-size-large{height:320px}
  .qn-resize-handle{display:none}
  .qn-grip{display:none}
  .qn-toolbar-main{flex-wrap:wrap}
  .qn-toolbar-actions{width:100%;justify-content:space-between}
  .qn-toolbar-actions .primary-button{flex:1 1 auto;white-space:nowrap}
  .qn-header-menu{right:0;left:auto}
  .qn-list-row-main{flex-wrap:wrap}
  .qn-list-meta{max-width:none;text-align:left;flex-direction:row}
  /* Menú emergente → menú inferior: más fácil de alcanzar con el pulgar y
     nunca se recorta contra un borde de pantalla. */
  .qn-popover{left:0;right:0;bottom:0;top:auto;width:100%;max-width:100%;border-radius:16px 16px 0 0;max-height:75vh;padding-bottom:14px}
  .qn-popover-item{padding:11px 12px}
  .qn-expand-textarea{min-height:40vh!important}
  /* Barra de formato: nunca desbordamiento horizontal — se desplaza dentro
     de sí misma (overflow-x:auto ya definido) en vez de romper el ancho de
     la tarjeta/fila. Popover "Tt" → panel inferior de ancho completo, mismo
     criterio que .qn-popover: más fácil de alcanzar con el pulgar y nunca
     se recorta contra un borde de pantalla en vez de flotar cerca de un
     botón que puede estar pegado al borde superior de la tarjeta. */
  .qn-fmt-pop{left:0!important;right:0;bottom:0;top:auto!important;width:100%;max-width:100%;min-width:0;border-radius:16px 16px 0 0;max-height:75vh;overflow:auto;padding-bottom:14px}
  /* Área táctil mínima 44×44 en móvil (D) para todos los controles de la
     cabecera de la nota y del formulario de recordatorio. */
  .qn-fmt-btn{width:44px;height:44px}
  .qn-menu-trigger{width:44px;height:44px}
  .qn-note-head{min-height:44px}
  /* BLOQUE J3 — misma área táctil mínima para los ítems de los menús
     (menuitem/menuitemradio) de "Tamaño"/"Cambiar color"/"Tamaño y color de
     texto". Los círculos de color mantienen su diámetro visual compacto
     (igual que en escritorio) — el área táctil se amplía con un
     pseudo-elemento invisible superpuesto, y el espacio entre círculos
     crece lo justo para que las áreas ampliadas de vecinos no se toquen.
     El inset descuenta el borde propio de cada círculo (box-sizing:
     border-box resta el borde del ancho declarado antes de calcular el
     contenedor de posicionamiento del pseudo-elemento): .qn-color-swatch
     mide 27px con borde de 1px (25px reales) → inset -9.5px da 44px;
     .qn-fmt-color-swatch mide 22px con borde de 2px (18px reales) → inset
     -13px da 44px. */
  .qn-popover-item{min-height:44px}
  .qn-fmt-pop-item{min-height:44px}
  .qn-popover-swatchgrid{gap:19px}
  .qn-color-swatch{position:relative}
  .qn-color-swatch::before{content:'';position:absolute;inset:-9.5px}
  .qn-fmt-pop-swatches{gap:26px}
  .qn-fmt-color-swatch{position:relative}
  .qn-fmt-color-swatch::before{content:'';position:absolute;inset:-13px}
  .qn-drag-zone-inline{flex-basis:16px}
  .qn-quick-chip{min-height:44px}
  .date-field-cal-btn{width:44px;height:44px}
  .date-cal-cell{min-height:38px}
  /* Fecha y Hora del recordatorio apiladas (F), nunca en dos columnas. */
  .qn-reminder-fields{grid-template-columns:1fr}
  .date-cal-pop{left:50%;transform:translateX(-50%);max-width:calc(100vw - 32px)}
}

/* Compactación visual del Resumen de Gestión de clientes (Dashboard).
   Todo cuelga de .dashboard-view, un wrapper nuevo y EXCLUSIVO de
   renderDashboard() en app.js: no se toca ninguna regla compartida
   (.page-heading/.stats-grid/.stat-card/.panel/.grid-two/.bars/
   .bar-label/.activity-list), así que Clientes, Pagos, Agenda, Productos
   y consumos, Notas rápidas e Inventario (que reutilizan esas mismas
   clases) quedan exactamente igual. Solo cambia espaciado visual —
   ninguna cifra, cálculo ni estructura de datos.
   Causas del espacio excesivo:
   - Cabecera: .page-heading (margin-bottom:28px) + .eyebrow (9px) + h1
     (8px) sumaban ~45px antes de llegar a las tarjetas.
   - Tarjetas: .stat-card usaba min-height:128px con 17/18px de padding y
     12px/10px de margen alrededor de la cifra — más alto de lo que pide
     un número + un renglón de descripción.
   - "Actividad de pagos": .bars tenía height fijo 205px y padding-top
     25px (mucho aire sobre las barras), más el truco
     .bar-label{transform:translateY(27px)} que saca la etiqueta del
     flujo normal para que "flote" bajo la línea — eso obliga a reservar
     relleno de sobra debajo, que sumado al padding inferior genérico de
     .panel (20px) dejaba una franja vacía tras los días. Aquí se anula
     ese translateY solo en el Dashboard: la etiqueta vuelve al flujo
     normal, así el padding inferior deja de compensar un desplazamiento
     invisible para el layout (superado por el rediseño de abajo: ver
     "Gráfica 'Actividad de pagos'"). */
.dashboard-view{margin-top:-14px}
.dashboard-view .page-heading{margin-bottom:14px}
.dashboard-view .eyebrow{margin-bottom:3px}
.dashboard-view .page-heading h1{margin-bottom:3px}
.dashboard-view .stats-grid{margin-bottom:10px}
.dashboard-view .stat-card{padding:13px 16px;min-height:98px}
.dashboard-view .stat-card>strong{margin:7px 0 5px;font-size:22px}
.dashboard-view .grid-two{margin-bottom:10px}
.dashboard-view .activity-list{margin-top:10px}

/* Gráfica "Actividad de pagos" (aclaración de diseño posterior a la
   compactación de arriba): las dos tarjetas de .grid-two deben terminar a
   la MISMA altura — se quita el align-items:start que se había puesto
   (.grid-two ya usa el stretch por defecto de CSS grid: sin overrides,
   ambas tarjetas igualan la altura de la más alta) y la gráfica pasa de
   .bars (altura fija) a .pay-chart, que crece con flex:1 dentro de
   .dashboard-activity-panel (flex column) para ocupar exactamente el
   espacio que "Últimos movimientos" ya necesitaba — sin inventar padding
   de relleno. .bars/.bar-label ya no se usan en este panel (siguen
   intactos para Inventario, que los usa aparte — ver comentario original
   junto a .bars+.history-summary-caption).
   Estructura: grid de 2 columnas (eje Y | área de barras) × 2 filas (barras
   | etiquetas de día) — la fila de etiquetas comparte la misma columna 2
   que el área de barras, así quedan alineadas bajo cada barra sin medir
   nada por JS. Las líneas de referencia (.pay-chart-gridlines, 5 líneas =
   4 tramos: 0/25/50/75/100%) y las 5 cifras del eje (.pay-chart-scale)
   son hermanas en la fila 1: mismo alto de fila en un grid → mismo
   espaciado vertical entre sí.
   Color: degradado MONOCROMÁTICO de la paleta verde de ASISTIDA (nunca
   rojo→verde por monto — el rojo queda reservado para valores realmente
   negativos o para cuando exista una meta de recaudo con la que comparar,
   ninguna de las dos aplica aún). 4 niveles de intensidad según qué tan
   cerca está el día del máximo de la semana (25/50/75/100%), más un gris
   neutro (var(--muted)) para días en $0. El color SIEMPRE es el que
   corresponde al monto del día, "hoy" incluido — nunca se fuerza a un
   verde distinto solo por ser hoy, para que la escala de color siga
   siendo comparable entre los 7 días. "Hoy" se identifica aparte, sin
   tocar el color: borde en la barra (.pay-bar-col-today) + fondo sutil en
   el nombre del día (.pay-chart-day-label-today). */
.dashboard-view .dashboard-activity-panel{display:flex;flex-direction:column;min-height:0}
.dashboard-view .pay-chart{display:grid;grid-template-columns:auto 1fr;grid-template-rows:minmax(0,1fr) auto;column-gap:10px;flex:1;min-height:0}
.dashboard-view .pay-chart-scale{grid-column:1;grid-row:1;display:flex;flex-direction:column;justify-content:space-between;text-align:right;font:11px var(--as-font-sans);font-variant-numeric:tabular-nums;color:var(--muted)}
.dashboard-view .pay-chart-plot{grid-column:2;grid-row:1;position:relative;min-width:0}
.dashboard-view .pay-chart-gridlines{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:space-between;pointer-events:none}
.dashboard-view .pay-chart-gridlines span{border-top:1px solid var(--line)}
.dashboard-view .pay-chart-bars{position:absolute;inset:0;display:flex;justify-content:space-around;gap:8px;padding:0 4px}
.dashboard-view .pay-bar-col{flex:1;display:flex;align-items:flex-end;justify-content:center;border:0;background:none;padding:0;cursor:pointer;position:relative;border-radius:5px}
.dashboard-view .pay-bar-col:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.dashboard-view .pay-bar{position:relative;width:100%;max-width:39px;border-radius:5px 5px 0 0;min-height:3px;background:#d5e9a6;filter:brightness(1)}
.dashboard-view .pay-bar-col:hover .pay-bar,.dashboard-view .pay-bar-col:focus-visible .pay-bar{filter:brightness(.92)}
.dashboard-view .pay-bar.pay-bar-lvl2{background:#c3dd6e}
.dashboard-view .pay-bar.pay-bar-lvl3{background:#a3c94a}
.dashboard-view .pay-bar.pay-bar-lvl4{background:var(--lime-dark)}
.dashboard-view .pay-bar.pay-bar-zero{background:var(--muted)}
/* "Hoy" NUNCA cambia el color de la barra (ese color solo debe leerse como
   monto). Se marca con un borde en la barra + una etiqueta con fondo sutil
   en el nombre del día — dos señales redundantes (no dependen solo del
   color), ambas dentro de la misma barra que ya lleva el tooltip. */
.dashboard-view .pay-bar-col-today .pay-bar{border:2px solid var(--ink)}
.dashboard-view .pay-chart-labels{grid-column:2;grid-row:2;display:flex;justify-content:space-around;gap:8px;padding:0 4px;margin-top:7px;font:11px var(--as-font-sans);color:var(--subtle)}
.dashboard-view .pay-chart-day-label-today{background:var(--lime);color:var(--ink);font-weight:bold;border-radius:4px;padding:1px 6px}
.dashboard-view .pay-bar-tip{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translateX(-50%);background:var(--ink);color:#fff;font:11px var(--as-font-sans);font-variant-numeric:tabular-nums;line-height:1.5;padding:6px 9px;border-radius:6px;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s ease;z-index:3;box-shadow:0 6px 16px rgba(0,0,0,.18)}
.dashboard-view .pay-bar-col:hover .pay-bar-tip,.dashboard-view .pay-bar-col:focus-visible .pay-bar-tip{opacity:1}
/* El tooltip centrado (left:50%;translateX(-50%)) desborda el viewport en
   la primera/última barra a 390px de ancho — aunque esté en opacity:0,
   sigue contando para el scroll horizontal de la página (solo display:none
   lo excluiría, y eso rompería la transición). Se ancla al borde de esas
   dos columnas en vez de centrarlo, así nunca sale de los límites del
   propio gráfico (que ya no se desborda). */
.dashboard-view .pay-bar-col:nth-child(-n+2) .pay-bar-tip{left:0;transform:none}
.dashboard-view .pay-bar-col:nth-last-child(-n+2) .pay-bar-tip{left:auto;right:0;transform:none}
.dashboard-view .pay-chart-empty{flex:1;min-height:120px;display:flex;align-items:center;justify-content:center;color:var(--muted);font-size:13px;text-align:center}
@media(prefers-reduced-motion:no-preference){
  .dashboard-view .pay-bar{transform-origin:bottom;animation:pay-bar-grow .5s cubic-bezier(.16,1,.3,1) both}
}
@keyframes pay-bar-grow{from{transform:scaleY(0)}to{transform:scaleY(1)}}
@media(max-width:680px){
  /* A 2 columnas angostas, "Vencen en 7 días o menos"/"Requieren atención
     hoy" envuelven a 2 líneas y esas 2 tarjetas quedaban más altas que las
     otras 4 (min-height:98px de la regla de arriba ya no era el límite
     real: el propio contenido lo superaba). Debe ir DESPUÉS del bloque de
     arriba en el archivo — misma especificidad, así que el orden de
     aparición decide, y solo así gana sobre min-height:98px en móvil. Se
     reserva aquí la altura que pide el peor caso (2 líneas) para que las
     6 vuelvan a verse uniformes. */
  .dashboard-view .stat-card{min-height:133px}
}

/* "Cartera y recaudo" (GESTIÓN-2B + ampliación de conciliación + los dos
   niveles de lectura: resumen sencillo siempre visible, detalle contable
   plegado en <details>). Franjas de resumen y filas de estado financiero en
   vez de tarjetas grandes tipo .stats-grid/.stat-card. Mismo criterio visual
   que .movement-detail-row (Inventario), con su propio prefijo porque este
   módulo es independiente. Usado tanto por "Nuevo cierre de cartera"
   (página completa) como por el detalle de un cierre ya confirmado — mismo
   bloque compartido, ver closureBreakdownHtml() en gestion-closures-module.js. */

/* Franja de métricas: UN solo bloque con divisores internos (no N tarjetas
   sueltas). En escritorio, todas en fila; en móvil, apiladas en filas
   completas — nunca una cuadrícula de 2 columnas, así ningún ítem impar
   queda solo ocupando media fila. */
/* nowrap a propósito: con flex-wrap:wrap y flex-basis:150px, una franja de 5
   indicadores (resumenSimpleHtml) cabía 4 en la primera línea y dejaba el 5.º
   solo en una segunda línea (visto en escritorio con el panel más angosto
   que 5×150px) — nowrap + flex:1 1 0 reparte el ancho disponible en partes
   iguales entre los que haya (3 o 5), siempre en una sola fila. */
.gc-metrics{display:flex;flex-wrap:nowrap;margin:0 0 12px;border:1px solid var(--line);border-radius:9px;background:var(--card);overflow:hidden}
.gc-metric{flex:1 1 0;min-width:0;padding:12px 16px;border-left:1px solid var(--line)}
.gc-metric:first-child{border-left:0}
.gc-metric span{display:block;color:var(--muted);font-size:12px;margin-bottom:5px}
.gc-metric strong{display:block;font:bold 19px var(--as-font-sans);line-height:1.15;font-variant-numeric:tabular-nums}
.gc-metric.is-warning strong{color:#c68228}
.gc-metric.is-danger strong{color:#d0685e}
.gc-metric.is-positive strong{color:#78931c}
.gc-sentence{margin:0 0 10px;font-size:13.5px;line-height:1.5}
.gc-sentence strong{color:var(--ink)}
/* Texto explicativo (fechas, aclaraciones) — más grande y con más contraste
   que .field-note (10.5px/#9aa29a), pensado para leerse sin esfuerzo. */
.gc-field-hint{margin:8px 0 0;color:var(--muted);font-size:12.5px;line-height:1.5}

.gc-statement-rows{display:grid;gap:0;margin-bottom:10px}
.gc-statement-row{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:8px 0;border-bottom:1px solid #eceee6;font-size:13.5px}
.gc-statement-row .gc-label{display:inline-flex;align-items:baseline;gap:6px;color:var(--muted);min-width:0;flex:1 1 auto}
.gc-statement-row .gc-op{flex-shrink:0;width:14px;color:var(--subtle);font:bold 12px var(--as-font-sans)}
.gc-statement-row strong{flex-shrink:0;color:var(--ink);font:bold 13.5px var(--as-font-sans);font-variant-numeric:tabular-nums;text-align:right}
.gc-statement-row.is-subtotal{border-top:2px solid var(--ink);border-bottom:2px solid var(--ink);margin-top:2px}
.gc-statement-row.is-subtotal .gc-label,.gc-statement-row.is-subtotal strong{color:var(--ink);font-weight:bold}
.gc-statement-row.is-final{background:#f8f8f3;padding:11px 13px;border:1px solid var(--line);border-radius:8px;margin-top:2px}
.gc-statement-row.is-final strong{font-size:15px}

.gc-secondary-panel{margin:12px 0 14px;padding:12px 15px;border:1px solid var(--line);border-radius:8px;background:#f8f8f3}
.gc-secondary-panel h4{margin:0 0 8px;color:#9aa29a;font:11px var(--as-font-sans);letter-spacing:1px;text-transform:uppercase;font-weight:normal}
.gc-secondary-row{display:flex;justify-content:space-between;gap:10px;padding:4px 0;font-size:12.5px;color:var(--muted)}
.gc-secondary-row span{min-width:0}
.gc-secondary-row strong{flex-shrink:0;color:var(--ink);font:bold 12.5px var(--as-font-sans);font-variant-numeric:tabular-nums}
.gc-secondary-note{color:var(--muted);font-weight:normal;font-size:12px}

/* Nivel 2 (detalle contable) plegado por defecto — mismo patrón ya usado en
   .movement-tech (Inventario): sin marcador nativo, con flecha propia. */
.gc-toggle{margin:10px 0 4px}
.gc-toggle summary{cursor:pointer;padding:9px 0;font-size:12.5px;font-weight:700;color:var(--lime-dark);list-style:none}
.gc-toggle summary::-webkit-details-marker{display:none}
.gc-toggle summary::before{content:'▸ ';display:inline-block}
.gc-toggle[open] summary::before{content:'▾ '}
.gc-toggle-body{margin-top:8px}

.gc-subheading{margin:16px 0 8px;font-size:13px}

/* Franja compacta de metadatos del detalle (fecha de cierre / zona horaria /
   responsable) — UNA sola línea que envuelve, nunca 3 tarjetas que puedan
   dejar la última sola en su fila en móvil. */
.gc-meta-strip{display:flex;flex-wrap:wrap;gap:6px 18px;margin:0 0 18px;padding:12px 16px;background:#f8f8f3;border:1px solid var(--line);border-radius:8px;font-size:13px;color:var(--muted)}
.gc-meta-strip strong{color:var(--ink)}

/* Historial: celda compacta de clientes (texto simple, no 3 píldoras
   apiladas) y diferencia integrada bajo "Cartera al finalizar" — menos
   columnas y menos ancho total, para no forzar scroll horizontal. */
.gc-clients-mini{font-size:12.5px;color:var(--muted);white-space:nowrap}
.gc-clients-mini strong{color:var(--ink)}
.gc-clients-mini strong.mora{color:#d0685e}
.gc-diff-inline{display:block;margin-top:3px;font-size:11.5px}
.gc-diff-inline.ok{color:#78931c}
.gc-diff-inline.warn{color:#d0685e;font-weight:bold}

/* Tabla de medios de pago: sin el min-width:690px que trae `table` por
   defecto (pensado para tablas anchas de muchas columnas) — con solo 3
   columnas angostas, ese mínimo forzaba scroll horizontal innecesario. */
.gc-method-table{min-width:0}
/* Historial de cierres: mismo motivo — 6 columnas compactas (ya reducidas,
   ver comentario de .gc-clients-mini arriba) no necesitan el min-width:690px
   genérico, que en una ventana de escritorio angosta forzaba scroll
   horizontal y dejaba "Ver detalle"/fechas pegados al borde. */
.gc-history-table{min-width:0}

/* "Resultados de Gestión": costo incompleto nunca se muestra como $0 — texto
   corto en el mismo tono de advertencia que .gc-metric.is-warning, en vez de
   una cifra. Reutiliza el resto de clases .gc-* (metric/statement-row/
   toggle/secondary-panel) tal cual: son componentes genéricos de resultado
   financiero, no exclusivos de Cartera y recaudo. */
.gr-incomplete{color:#c68228;font-weight:bold;font-size:12.5px}

@media(max-width:680px){
  /* flex-basis:150px es un ancho en fila — al pasar a columna es EL EJE
     PRINCIPAL, así que sin este reset cada fila queda con ~150px de alto
     vacío (bug real, visto al verificar en 390×844). flex:none la vuelve a
     su alto natural de contenido. */
  .gc-metrics{flex-direction:column}
  .gc-metric{flex:none;border-left:0;border-top:1px solid var(--line)}
  .gc-metric:first-child{border-top:0}
  .gc-statement-row{font-size:12.5px}
  .gc-meta-strip{gap:4px 14px;font-size:12.5px}
}

/* Gastos (Resultados de Gestión de clientes): 8 columnas con una descripción
   que puede ser larga — a diferencia de gc-method-table/gc-history-table
   (les bastaba con quitar el min-width:690px genérico), acá ningún ancho
   mínimo evita el scroll horizontal en anchos intermedios (probado en
   946px) sin recortar contenido real o cortar el botón "Anular". Por eso
   pasa a tarjetas (mismo patrón que .responsive-table en
   @media(max-width:680px)) antes de llegar a ese punto, reusando el
   breakpoint de sidebar/contenido ya establecido en @media(max-width:1100px)
   más arriba, en vez de esperar al tamaño móvil. */
@media(max-width:1100px){
  .ge-expenses-table thead{display:none}
  .ge-expenses-table,.ge-expenses-table tbody,.ge-expenses-table tr{display:block;width:100%}
  .ge-expenses-table{border:none;min-width:0;width:100%}
  .ge-expenses-table tr{background:#fff;border:1px solid var(--line);border-radius:10px;margin-bottom:12px;padding:2px 14px}
  .ge-expenses-table tr:last-child{margin-bottom:0}
  .ge-expenses-table td{display:block;padding:9px 0;border-bottom:1px solid #eceee6;text-align:left}
  .ge-expenses-table td:last-child{border-bottom:none}
  .ge-expenses-table td[data-label]::before{content:attr(data-label);display:block;font:700 10px/1.3 var(--as-font-sans);letter-spacing:.04em;text-transform:uppercase;color:var(--muted);margin-bottom:3px}
  .ge-expenses-table td.actions-cell{padding-top:12px}
}

/* Leyenda "* Obligatorio" del formulario "Registrar gasto": .field-note
   (10.5px, gris muy claro #9aa29a) está pensada para una aclaración
   secundaria bajo UN campo, no para una leyenda que aplica a todo el
   formulario — a ese tamaño/contraste quedaba casi ilegible. Reutiliza el
   mismo color que las etiquetas de campo (.form-field label, #5f6861) para
   conectarla visualmente con los asteriscos que explica, sin salirse de la
   paleta ya establecida. */
.ge-required-note{font:700 12.5px var(--as-font-sans);color:#5f6861;margin:0 0 14px}

/* Control de asistencia (Gestión de clientes —
   20260914212231_attendance_control_base.sql). Reutiliza al máximo lo que ya
   existe: .at-tabs/.at-tab (componente compartido, ver arriba) para las 5
   vistas internas; el selector Buscar cliente/Escanear QR usa su propio
   interruptor .ca-method-switch. .commercial-client-picker* resuelve la búsqueda de
   cliente (ya usado por Productos y consumos para el MISMO universo de
   Clientes de Gestión, ver management-products-module.js), .cash-mode-picker
   para la tarjeta de modalidad (solo se agrega .ca-modality-picker para
   bajar de 3 a 2 columnas) y .commercial-credit-alert para los avisos de
   "falta configurar". Prefijo ca- (Control de Asistencia), mismo criterio
   que gc-/ge-/gr-/mp- de los demás módulos. */
.ca-modality-picker{grid-template-columns:repeat(2,1fr)}
@media(max-width:600px){.ca-modality-picker{grid-template-columns:1fr}}

/* Interruptor de método de identificación. Buscar y escanear no son dos
   vistas: son dos entradas al mismo flujo de asistencia. Por eso este control
   tiene una sola base y un selector que se desplaza, en lugar de reutilizar
   las pestañas de navegación .at-tabs/.at-tab. */
.ca-method-control{margin-top:16px}
.ca-method-label{display:block;margin:0 0 8px;font:700 10.5px/1.2 var(--as-font-sans);letter-spacing:.08em;text-transform:uppercase;color:var(--subtle)}
.ca-method-switch{--ca-switch-gap:5px;position:relative;isolation:isolate;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--ca-switch-gap);width:min(100%,570px);padding:5px;border:1px solid rgba(37,44,39,.12);border-radius:18px;background:linear-gradient(145deg,#e6e9e1,#f5f6f1);box-shadow:inset 0 1px 2px rgba(29,35,31,.12),0 8px 22px rgba(39,46,41,.08)}
.ca-method-slider{position:absolute;z-index:-1;top:5px;bottom:5px;left:5px;width:calc((100% - 15px)/2);border:1px solid rgba(232,117,46,.4);border-radius:13px;background:linear-gradient(145deg,#fffdf8 0%,#fff 52%,#fff4e9 100%);box-shadow:0 7px 16px rgba(57,42,29,.16),0 0 0 1px rgba(255,255,255,.9) inset,0 0 18px rgba(232,117,46,.12);transition:transform .24s cubic-bezier(.22,.8,.3,1),box-shadow .2s ease}
.ca-method-switch.is-scan .ca-method-slider{transform:translateX(calc(100% + var(--ca-switch-gap)))}
.ca-method-option{position:relative;display:flex;align-items:center;justify-content:flex-start;gap:11px;min-width:0;min-height:58px;padding:9px 14px;border:0;border-radius:13px;background:transparent;color:#68716b;text-align:left;cursor:pointer;transition:color .18s ease,transform .16s ease}
.ca-method-option:hover:not(.is-active){color:var(--ink);background:rgba(255,255,255,.36)}
.ca-method-option:active{transform:translateY(1px)}
.ca-method-option:focus-visible{outline:2px solid var(--tab-accent);outline-offset:3px}
.ca-method-option.is-active{color:var(--ink)}
.ca-method-icon{display:grid;place-items:center;flex:0 0 36px;width:36px;height:36px;border-radius:11px;background:rgba(96,105,98,.09);color:#737d76;transition:background .18s ease,color .18s ease,box-shadow .18s ease}
.ca-method-icon svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.ca-method-option.is-active .ca-method-icon{background:linear-gradient(145deg,#ff8a32,#eb641d);color:#fff;box-shadow:0 5px 12px rgba(224,91,25,.3),inset 0 1px 0 rgba(255,255,255,.45)}
.ca-method-copy{display:flex;flex-direction:column;min-width:0;gap:2px}
.ca-method-copy strong{font:700 13.5px/1.2 var(--as-font-sans);white-space:nowrap}
.ca-method-copy small{font:400 11px/1.25 var(--as-font-sans);color:#8a928c;white-space:nowrap}
.ca-method-option.is-active .ca-method-copy small{color:#6f7771}
@media(max-width:480px){
  .ca-method-switch{width:100%;border-radius:16px}
  .ca-method-option{justify-content:center;gap:8px;min-height:54px;padding:8px}
  .ca-method-icon{flex-basis:32px;width:32px;height:32px;border-radius:10px}
  .ca-method-icon svg{width:18px;height:18px}
  .ca-method-copy strong{font-size:12.5px}
  .ca-method-copy small{display:none}
}

/* Checkboxes de Configuración/Historial: el tamaño/color ya vienen de la
   clase compartida .form-check-input (Bloque H); aquí solo queda el
   espaciado respecto al texto de la etiqueta, que sigue siendo propio de
   este contexto. */
.ca-checkbox{margin:0 6px 0 0;vertical-align:middle}

/* Insignias de tipo de movimiento — mismos tonos que .status.active (verde,
   entrada) y .status.paid (azul, salida) para no introducir una tercera
   paleta de color en la misma pantalla. */
.status.entry{background:#eef8d0;color:#78931c}
.status.exit{background:#e5f4f5;color:#4d8f99}

/* Tira de alertas del Historial: conteos informativos derivados de datos que
   la pantalla ya cargó (nunca un cálculo nuevo del lado del servidor) — solo
   presentación, sin filtrado interactivo en esta primera fase. */
.ca-alerts{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 18px}
.ca-alert-chip{display:inline-flex;align-items:center;gap:6px;padding:7px 12px;border-radius:999px;background:#f8f8f3;border:1px solid var(--line);color:var(--muted);font-size:12px}
.ca-alert-chip strong{color:var(--ink)}
.ca-alert-chip.warn{background:#fff0d8;border-color:#f2ddb0;color:#8a5f13}
.ca-alert-chip.warn strong{color:#8a5f13}

/* Lector QR por cámara: un solo recuadro 4:3, sin una segunda mira interior.
   Ninguna captura ni imagen se guarda; el <video> solo muestra el flujo en
   vivo mientras el usuario mantenga la cámara activada. */
.ca-scanner{position:relative;width:100%;max-width:420px;aspect-ratio:4/3;margin:14px 0;border-radius:10px;overflow:hidden;background:#12140f}
.ca-scanner video{width:100%;height:100%;object-fit:cover;display:block}
.ca-scanner.is-off video{visibility:hidden}
.ca-scanner-status{position:absolute;left:0;right:0;bottom:0;padding:8px 12px;background:rgba(18,20,15,.72);color:#fff;font-size:12px;text-align:center}
.ca-scanner.is-off .ca-scanner-status{top:0;display:grid;place-items:center;background:linear-gradient(145deg,#20251f,#11140f);font-weight:bold;color:#d7ddd5}
.ca-scanner-actions{display:flex;max-width:420px;margin:-4px 0 10px}
.ca-scanner-actions button{width:100%}

/* Franja de actividad en vivo: reemplaza tres tarjetas grandes por un flujo
   semántico Entradas → Dentro ahora → Salidas. Los arcos son incompletos
   a propósito: decoran la magnitud sin simular un porcentaje inexistente. */
.ca-activity-flow{position:relative;isolation:isolate;display:grid;grid-template-columns:repeat(3,minmax(92px,1fr));align-items:center;gap:24px;margin:18px 0 20px;padding:18px 22px 16px;overflow:hidden;border-top:1px solid #e1e5dc;border-bottom:1px solid #e1e5dc;background:linear-gradient(90deg,rgba(232,117,46,.035),rgba(255,255,255,.5) 35%,rgba(122,149,28,.045) 50%,rgba(255,255,255,.5) 65%,rgba(77,143,153,.035))}
.ca-activity-flow::before{content:'';position:absolute;z-index:-1;inset:0;background:repeating-linear-gradient(90deg,transparent 0,transparent 39px,rgba(83,94,86,.025) 40px),linear-gradient(180deg,rgba(255,255,255,.68),transparent);pointer-events:none}
.ca-flow-metric{display:grid;justify-items:center;min-width:0;text-align:center}
.ca-flow-orbit{position:relative;display:grid;place-items:center;width:72px;height:72px;margin-bottom:7px;border-radius:50%}
.ca-flow-orbit::before,.ca-flow-orbit::after{content:'';position:absolute;inset:0;border-radius:50%;pointer-events:none}
.ca-flow-orbit::before{border:1px solid rgba(112,123,115,.18);border-left-color:transparent}
.ca-flow-orbit::after{inset:5px;border:2px solid transparent;border-top-color:currentColor;border-right-color:currentColor;transform:rotate(17deg);opacity:.78}
.ca-flow-orbit strong{font:bold 27px/1 var(--as-font-sans);font-variant-numeric:tabular-nums;color:var(--ink)}
.ca-flow-icon{display:inline-grid;place-items:center;flex:0 0 18px;width:18px;height:18px;border-radius:50%;background:var(--card);box-shadow:0 2px 7px rgba(32,37,34,.1)}
.ca-flow-icon svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.ca-flow-metric.is-entry{color:#dc681f}
.ca-flow-metric.is-exit{color:#4d8f99}
.ca-flow-metric.is-live{color:#7b951b}
.ca-flow-metric.is-live .ca-flow-orbit{width:82px;height:82px;background:radial-gradient(circle,rgba(203,232,91,.16),transparent 66%)}
.ca-flow-label{display:inline-flex;align-items:center;justify-content:center;gap:5px;color:var(--ink);font-size:12.5px;font-weight:bold;line-height:1.2}
.ca-flow-metric small{margin-top:3px;color:var(--muted);font-size:10.5px;white-space:nowrap}
.ca-live-dot{position:absolute;top:8px;right:8px;width:8px;height:8px;border-radius:50%;background:#84a120;box-shadow:0 0 0 0 rgba(132,161,32,.38);animation:ca-live-pulse 2.2s ease-out infinite}
.ca-live-inline{display:inline-block;width:5px;height:5px;margin-right:5px;border-radius:50%;background:#84a120;vertical-align:1px}
.ca-activity-flow.is-entry-only{grid-template-columns:repeat(2,minmax(100px,1fr))}
@keyframes ca-live-pulse{0%{box-shadow:0 0 0 0 rgba(132,161,32,.38)}65%,100%{box-shadow:0 0 0 9px rgba(132,161,32,0)}}
@media(prefers-reduced-motion:reduce){.ca-live-dot{animation:none}}
@media(max-width:520px){
  .ca-activity-flow{grid-template-columns:repeat(3,minmax(72px,1fr));gap:4px;margin:15px 0 17px;padding:15px 6px 13px}
  .ca-flow-orbit{width:58px;height:58px;margin-bottom:6px}
  .ca-flow-metric.is-live .ca-flow-orbit{width:66px;height:66px}
  .ca-flow-orbit strong{font-size:23px}
  .ca-flow-icon{flex-basis:16px;width:16px;height:16px}
  .ca-flow-label{font-size:11px}
  .ca-flow-metric small{font-size:9px}
  .ca-activity-flow.is-entry-only{grid-template-columns:repeat(2,minmax(90px,1fr));padding-left:20px;padding-right:20px}
}

/* Visitas de hoy: timeline compacto sin tarjetas por movimiento. Una visita
   agrupa entrada y salida; los eventos incompletos permanecen visibles como
   anomalías y cada anulación sigue apuntando al evento exacto. */
.ca-visits{position:relative;margin-top:4px;padding-left:21px}
.ca-visits::before{content:'';position:absolute;left:6px;top:17px;bottom:17px;width:1px;background:linear-gradient(#e27029,#a7b1a9 48%,#6b9ea5)}
.ca-visit{position:relative;display:grid;grid-template-columns:minmax(180px,40fr) minmax(250px,40fr) minmax(120px,20fr) 34px;align-items:center;column-gap:clamp(14px,2vw,28px);min-height:72px;padding:12px 4px 12px 0;border-bottom:1px solid #e8ebe5}
.ca-visit:last-child{border-bottom:0}
.ca-visit-node{position:absolute;left:-19px;top:50%;width:9px;height:9px;border:2px solid var(--card);border-radius:50%;background:#dd6a25;box-shadow:0 0 0 1px rgba(221,106,37,.28);transform:translateY(-50%)}
.ca-visit-person{min-width:0}
.ca-visit-person strong,.ca-visit-person small{display:block}
.ca-visit-person strong{overflow:hidden;color:var(--ink);font-size:13px;text-overflow:ellipsis;white-space:nowrap}
.ca-visit-person small{margin-top:3px;color:var(--muted);font-size:11.5px}
.ca-visit-path{display:flex;align-items:center;justify-content:flex-start;min-width:0;gap:12px}
.ca-visit-event{display:grid;gap:1px;flex:0 0 auto}
.ca-visit-event b{font-size:10px;letter-spacing:.05em;text-transform:uppercase}
.ca-visit-event time{color:var(--ink);font:700 12px var(--as-font-sans);font-variant-numeric:tabular-nums;white-space:nowrap}
.ca-visit-event.is-entry b{color:#d76520}.ca-visit-event.is-exit b{color:#4d8f99}
.ca-visit-separator{color:#9ba49c;font-size:15px;line-height:1}
.ca-visit-state{display:flex;align-items:center;min-width:0}
.ca-visit-live,.ca-visit-warning{flex:0 0 auto;font-size:11.5px;font-weight:bold;white-space:nowrap}
.ca-visit-live{color:#78931c}.ca-visit-live i{display:inline-block;width:7px;height:7px;margin-right:6px;border-radius:50%;background:#84a120;box-shadow:0 0 0 4px rgba(132,161,32,.12)}
.ca-visit-warning{color:#b9771f}
.ca-visit-duration{flex:0 0 auto;padding-left:2px;color:var(--muted);font:700 11px var(--as-font-sans);font-variant-numeric:tabular-nums;white-space:nowrap}
.ca-visit-menu{position:relative;justify-self:end}
.ca-visit-menu summary{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;color:#707970;font-size:20px;line-height:1;cursor:pointer;list-style:none;transition:background .15s,color .15s}
.ca-visit-menu summary::-webkit-details-marker{display:none}
.ca-visit-menu summary:hover,.ca-visit-menu[open] summary{background:#eef0e9;color:var(--ink)}
.ca-visit-menu-popover{position:absolute;z-index:6;right:0;top:38px;display:grid;min-width:145px;padding:5px;border:1px solid var(--line);border-radius:9px;background:var(--card);box-shadow:0 12px 30px rgba(32,37,34,.16)}
.ca-visit-menu-popover button{border:0;border-radius:6px;background:transparent;padding:9px 10px;color:#c7564d;font-size:12px;font-weight:bold;text-align:left;white-space:nowrap;cursor:pointer}
.ca-visit-menu-popover button:hover{background:#ffebe8}
.ca-visit.is-voided{opacity:.55}
.ca-visit.is-voided .ca-visit-node{background:#9aa29a}
@media(max-width:720px){
  .ca-visits{padding-left:18px}
  .ca-visits::before{left:5px}
  .ca-visit{grid-template-columns:minmax(0,1fr) 34px;gap:8px 10px;padding:12px 2px 13px 0}
  .ca-visit-node{left:-17px;top:22px;transform:none}
  .ca-visit-person{grid-column:1;grid-row:1}
  .ca-visit-path{grid-column:1/-1;grid-row:2;gap:8px;flex-wrap:wrap}
  .ca-visit-state{grid-column:1;grid-row:3;min-height:16px}
  .ca-visit-menu{grid-column:2;grid-row:1;align-self:start}
  .ca-visit-duration{font-size:10px}
}

/* Tarjeta de código QR (Códigos QR): el SVG lo genera qrcode-generator.js EN
   EL NAVEGADOR a partir del token que ya devolvió la RPC — nunca se guarda
   como imagen en ninguna parte, ni siquiera aquí (solo vive en el DOM
   mientras la tarjeta está abierta). */
.ca-qr-card{display:grid;justify-items:center;gap:10px;padding:22px;background:#fff;border:1px solid var(--line);border-radius:10px;text-align:center}
.ca-qr-card svg{width:200px;height:200px}
.ca-qr-card strong{font-size:14px}

/* Sistema visual de botones — Gestión de clientes únicamente. La clase de
   alcance la activa render() para que los componentes compartidos y modales
   de Operación comercial conserven intacta su apariencia. */
:root{
  --asistida-orange-light:#ffb629;
  --asistida-orange:#ff8208;
  --asistida-orange-deep:#ed4b00;
  --asistida-button-highlight:rgba(255,255,255,.58);
  --asistida-button-border:rgba(255,190,87,.8);
  --asistida-button-shadow:rgba(220,85,0,.25);
}
body.gestion-client-buttons .primary-button{
  border:1px solid var(--as-brand-600);
  background:var(--as-brand-gradient);
  color:var(--as-text-inverse);
  box-shadow:var(--as-shadow-brand);
  transition:transform .14s ease,filter .14s ease,box-shadow .14s ease;
}
body.gestion-client-buttons .primary-button span{color:var(--as-text-inverse)}
body.gestion-client-buttons .primary-button:hover{
  filter:saturate(1.05);
  transform:translateY(-2px);
  box-shadow:var(--as-shadow-brand);
}
body.gestion-client-buttons .primary-button:active{
  transform:translateY(1px);
  filter:saturate(.95);
  box-shadow:var(--as-shadow-xs);
}
body.gestion-client-buttons .primary-button:disabled,
body.gestion-client-buttons .secondary-button:disabled,
body.gestion-client-buttons .small-button:disabled,
body.gestion-client-buttons .danger-button:disabled{
  opacity:.5;
  cursor:not-allowed;
  filter:saturate(.55);
  transform:none;
  box-shadow:none;
}
body.gestion-client-buttons .danger-button,
body.gestion-client-buttons #lifecycleForm .primary-button{
  border:1px solid var(--as-danger-100);
  background:var(--as-danger-50);
  color:var(--as-danger-600);
  box-shadow:none;
}
body.gestion-client-buttons .danger-button:hover,
body.gestion-client-buttons #lifecycleForm .primary-button:hover{
  background:var(--as-danger-100);
  color:var(--as-danger-700);
}
body.gestion-client-buttons .danger-button:active,
body.gestion-client-buttons #lifecycleForm .primary-button:active{
  transform:translateY(1px);
  filter:brightness(.96);
}

/* Solo el primer bloque del sidebar pertenece a Gestión de clientes. */
.sidebar .nav-list:not(.inventory-nav):not(.settings-nav)>.nav-item.active{
  border-color:var(--as-brand-600);
  background:var(--as-brand-gradient);
  color:var(--as-text-inverse);
  box-shadow:var(--as-shadow-brand);
}
.sidebar .nav-list:not(.inventory-nav):not(.settings-nav)>.nav-item.active:hover,
.sidebar .nav-list:not(.inventory-nav):not(.settings-nav)>.nav-item.active:focus-visible{
  background:var(--as-brand-gradient);
  box-shadow:var(--as-shadow-brand);
}
@media (min-width:681px){
  .sidebar.collapsed .nav-list:not(.inventory-nav):not(.settings-nav)>.nav-item.active,
  .sidebar.collapsed .nav-list:not(.inventory-nav):not(.settings-nav)>.nav-item.active:hover,
  .sidebar.collapsed .nav-list:not(.inventory-nav):not(.settings-nav)>.nav-item.active:focus-visible{
    border-color:var(--as-brand-600);
    background:var(--as-brand-gradient);
    color:var(--as-text-inverse);
    box-shadow:var(--as-shadow-brand);
  }
}

/* Controles seleccionados que todavía conservaban el negro anterior. */
body.gestion-client-buttons .sidebar-floating-tooltip{
  border-color:rgba(255,190,87,.72);
  background:
    linear-gradient(180deg,rgba(255,255,255,.28),transparent 38%),
    linear-gradient(145deg,#ffa71b,#ff7905 58%,#e94800);
  color:#fff;
  text-shadow:0 1px 1px rgba(132,45,0,.3);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.48),0 9px 20px rgba(214,82,0,.24);
}
body.gestion-client-buttons .agenda-view-switch button.active,
body.gestion-client-buttons .qn-view-btn.active{
  border-color:rgba(255,184,67,.78);
  background:
    linear-gradient(180deg,rgba(255,255,255,.38),transparent 36%),
    linear-gradient(145deg,#ffa71b,#ff7905 58%,#e94800);
  color:#fff;
  text-shadow:0 1px 1px rgba(132,45,0,.28);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.52),inset 0 -2px 3px rgba(143,45,0,.12),0 4px 10px rgba(214,82,0,.2);
}
body.gestion-client-buttons .agenda-view-switch button.active:hover,
body.gestion-client-buttons .qn-view-btn.active:hover{
  background:
    linear-gradient(180deg,rgba(255,255,255,.46),transparent 38%),
    linear-gradient(145deg,#ffb32a,#ff8208 58%,#ee5000);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 6px 13px rgba(214,82,0,.25);
}
body.gestion-client-buttons .agenda-view-switch button.active:active,
body.gestion-client-buttons .qn-view-btn.active:active{
  transform:translateY(1px);
  box-shadow:inset 0 2px 4px rgba(143,45,0,.18),0 1px 3px rgba(214,82,0,.16);
}

/* Resumen 2026: composición exclusiva de Gestión de clientes. */
.dashboard-v2{margin-top:-14px}
.dashboard-v2 .db-heading{margin-bottom:16px;align-items:center}
.dashboard-v2 .db-heading h1{font-size:34px}
.dashboard-v2 .kpi-grid{margin-bottom:14px}
.db-panel-icon{display:grid;place-items:center;flex-shrink:0}
.db-panel-icon{border:1px solid currentColor;border-radius:50%}
.db-panel-icon svg{width:27px;height:27px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.db-lower-grid{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(340px,1fr);gap:14px;margin-bottom:14px}
.dashboard-v2 .db-chart-panel,.dashboard-v2 .db-movements-panel{padding:20px 22px}
.db-panel-head{display:flex;align-items:center;gap:12px}
.db-panel-head>div{min-width:0;flex:1}
.db-panel-head h2{margin:0;font-size:16px}
.db-panel-head p{margin:2px 0 0;color:var(--muted);font-size:12px}
.db-panel-head .simple-link{color:#e8640a;white-space:nowrap}
.db-panel-icon{width:42px;height:42px}
.db-panel-icon.orange{color:#dc6b0f;background:#fff4df;border-color:#f4d6a5}
.db-panel-icon.green{color:#5d991f;background:#eff8df;border-color:#d4e9b7}
.db-activity-total{display:block;margin:16px 0 14px;font:bold 27px var(--as-font-sans);font-variant-numeric:tabular-nums}
.dashboard-v2 .pay-chart{height:245px;flex:none}
.dashboard-v2 .pay-bar{background:linear-gradient(180deg,#ffc867,#ff9d16)}
.dashboard-v2 .pay-bar.pay-bar-lvl2{background:linear-gradient(180deg,#ffc15a,#ffa11c)}
.dashboard-v2 .pay-bar.pay-bar-lvl3{background:linear-gradient(180deg,#ffb23c,#ff8d08)}
.dashboard-v2 .pay-bar.pay-bar-lvl4{background:linear-gradient(180deg,#ff9f18,#f25a00)}
.dashboard-v2 .pay-bar-col-today .pay-bar{border-color:#e8640a}
.dashboard-v2 .pay-chart-day-label-today{background:#fff0db;color:#c85b0d}
.db-movement-list{margin-top:13px}
.db-movement{display:grid;grid-template-columns:38px minmax(0,1fr) auto;align-items:center;gap:11px;padding:11px 0;border-top:1px solid #eceee8}
.db-movement:first-child{border-top:0}
.db-movement .mini-avatar{width:36px;height:36px}
.db-movement span strong,.db-movement span small{display:block}
.db-movement span strong{font-size:12.5px}
.db-movement span small{margin-top:2px;color:var(--muted);font-size:11.5px}
.db-movement>b{color:#4f921c;font:bold 12.5px var(--as-font-sans);font-variant-numeric:tabular-nums;white-space:nowrap}
.db-empty{padding:28px 8px;color:var(--muted);text-align:center}
@media(max-width:1100px){
  .db-lower-grid{grid-template-columns:1fr}
}
@media(max-width:680px){
  .dashboard-v2{margin-top:0}
  .dashboard-v2 .db-heading h1{font-size:29px}
  .dashboard-v2 .db-chart-panel,.dashboard-v2 .db-movements-panel{padding:17px 14px}
  .db-panel-head{align-items:flex-start}.db-panel-head .simple-link{font-size:11px}
  .dashboard-v2 .pay-chart{height:210px}
  .db-movement{grid-template-columns:34px minmax(0,1fr);gap:9px}
  .db-movement>b{grid-column:2;margin-top:-5px}
}
.ca-qr-card small{color:var(--muted);font-size:12px}

/* Impresión del código QR (botón "Imprimir"): oculta el resto de la página y
   deja visible solo la tarjeta marcada, sin abrir una ventana aparte.
   .ca-qr-print vive siempre en el DOM (dentro del panel de detalle del
   cliente en Códigos QR) pero display:none fuera de @media print.
   TODO el bloque va condicionado a :has(.ca-qr-modal) — el modal de detalle
   de un código QR se marca con esa clase (ver openQrModal en
   attendance-module.js) — para que imprimir mientras cualquier OTRO modal
   de la aplicación está abierto (pago, cierre, etc.) siga imprimiendo la
   página tal cual, sin verse afectado por estas reglas. Si el navegador no
   soporta :has() (muy poco frecuente hoy), todo este bloque simplemente no
   aplica y imprimir se comporta como antes de este cambio — nunca una
   página en blanco. */
.ca-qr-print{display:none}
@media print{
  body:has(.ca-qr-modal)>*:not(#modalLayer){display:none!important}
  #modalLayer:has(.ca-qr-modal){position:static!important;background:none!important;padding:0!important;display:block!important}
  #modalLayer .ca-qr-modal{box-shadow:none!important;max-height:none!important}
  #modalLayer .ca-qr-modal>*:not(.ca-qr-print){display:none!important}
  .ca-qr-modal .ca-qr-print{display:grid!important;justify-items:center;gap:8px;padding:20px}
  .ca-qr-modal .ca-qr-print svg{width:220px;height:220px}
}
.settings-menu{display:grid;gap:8px}
.settings-menu-row{display:flex;align-items:center;gap:12px;width:100%;padding:14px 16px;border:1px solid var(--line);border-radius:9px;background:var(--card);text-align:left;cursor:pointer;transition:transform .12s ease,box-shadow .12s ease,background-color .12s ease}
.settings-menu-row:hover{background:#f2f3ee;transform:translateY(-1px);box-shadow:0 6px 16px rgba(40,45,35,.1)}
.settings-menu-icon{display:grid;place-items:center;flex:0 0 34px;width:34px;height:34px;border-radius:9px;background:#eef0e9;color:var(--lime-dark)}
.settings-menu-copy{flex:1;min-width:0;display:grid;gap:2px}
.settings-menu-copy strong{font-size:13px;color:var(--ink)}
.settings-menu-copy small{color:var(--muted);font-size:12.5px}
.settings-menu-chevron{color:var(--subtle);font-size:18px;flex-shrink:0}
.field-checkbox{display:flex;align-items:center;margin-top:6px;color:var(--muted);font-size:12px;font-weight:normal}
.gym-header-preview{display:flex;align-items:center;gap:14px;padding:16px 18px;border:1px solid var(--line);border-radius:10px;background:#fff}
.gym-header-preview-logo{width:44px;height:44px;flex-shrink:0;display:grid;place-items:center;overflow:hidden}
.gym-header-preview-logo img{width:100%;height:100%;object-fit:contain}
.gym-header-preview-copy{display:grid;gap:2px;min-width:0}
.gym-header-preview-copy strong{font:bold 16px var(--as-font-sans);color:var(--ink)}
.gym-header-preview-copy small,.gym-header-preview-copy span{color:var(--muted);font-size:11.5px}

/* Planes y membresías: catálogo de configuración con jerarquía propia. El
   orden lo resuelve la capa de datos; las tarjetas no exponen controles
   manuales y reservan el naranja para el precio y el plan predeterminado. */
.gp-layout{grid-template-columns:minmax(0,1.4fr) minmax(320px,.6fr);align-items:start;gap:var(--as-space-4)}
.gp-catalog-panel{padding:var(--as-space-6)}
.gp-catalog-panel .panel-heading{flex-wrap:wrap;gap:var(--as-space-3)}
.gp-summary-row{display:flex;flex-wrap:wrap;gap:var(--as-space-2);flex:0 0 auto}
.gp-summary-card{display:flex;align-items:center;gap:var(--as-space-2);min-width:0;padding:var(--as-space-2) var(--as-space-3);border:1px solid var(--as-border-subtle);border-radius:var(--as-radius-sm);background:var(--as-surface);box-shadow:var(--as-shadow-xs)}
.gp-summary-icon{display:grid;place-items:center;width:28px;height:28px;flex:0 0 auto;border-radius:var(--as-radius-xs)}
.gp-summary-icon-usage{background:var(--as-success-50);color:var(--as-success-600)}
.gp-summary-icon-order{background:var(--as-gray-100);color:var(--as-text-muted)}
.gp-summary-copy{display:grid;gap:1px;min-width:0}
.gp-summary-copy strong{color:var(--as-ink-primary);font-size:var(--as-font-size-xs);font-weight:var(--as-font-weight-semibold);overflow-wrap:anywhere}
.gp-summary-copy small{color:var(--as-text-muted);font-size:var(--as-font-size-xs)}
.gp-plan-groups{display:grid;gap:var(--as-space-6);margin-top:var(--as-space-5)}
.gp-plan-group{display:grid;gap:var(--as-space-3)}
.gp-plan-group-heading{display:flex;align-items:center;gap:var(--as-space-2);padding:0 var(--as-space-1)}
.gp-plan-group-heading h3{margin:0;color:var(--as-ink-primary);font-size:var(--as-font-size-xs);font-weight:var(--as-font-weight-semibold);letter-spacing:.06em;text-transform:uppercase}
.gp-plan-group-heading span{display:inline-grid;place-items:center;min-width:22px;height:22px;padding:0 var(--as-space-1);border-radius:var(--as-radius-pill);background:var(--as-gray-100);color:var(--as-text-muted);font-size:var(--as-font-size-xs);font-weight:var(--as-font-weight-semibold)}
.gp-plan-list{display:grid;gap:var(--as-space-3)}
.gp-plan-card{position:relative;z-index:0;display:flex;align-items:flex-start;gap:var(--as-space-3);padding:var(--as-space-3);border:1px solid var(--as-border-subtle);border-radius:var(--as-radius-md);background:var(--as-surface);box-shadow:var(--as-shadow-xs);transition:border-color var(--as-duration-fast) var(--as-ease-standard),box-shadow var(--as-duration-fast) var(--as-ease-standard),transform var(--as-duration-fast) var(--as-ease-standard)}
.gp-plan-body,.gp-plan-tone-icon{position:relative;z-index:1}
.gp-plan-body{display:flex;flex-direction:column;gap:var(--as-space-1);min-width:0;flex:1}
.gp-plan-decor{position:absolute;inset:0;z-index:0;overflow:hidden;border-radius:inherit;pointer-events:none;color:var(--as-text-muted)}
.gp-plan-decor svg{position:absolute;right:-1px;bottom:-1px;width:clamp(300px,42%,460px);height:78%;max-height:150px;display:block;overflow:visible;transition:transform var(--as-duration-slow) var(--as-ease-standard),opacity var(--as-duration-normal) var(--as-ease-standard)}
.gp-plan-decor-layer,.gp-plan-decor-haze{fill:currentColor}
.gp-plan-decor-haze{opacity:.08;filter:blur(12px);transform:translate(-8px,-5px)}
.gp-plan-decor-layer-back{opacity:.055}
.gp-plan-decor-layer-middle{opacity:.075}
.gp-plan-decor-layer-front{opacity:.105}
.gp-plan-card:hover .gp-plan-decor svg{transform:translate(3px,-1px);opacity:.92}
.gp-plan-card.gp-tone-yellow .gp-plan-decor{color:hsl(45 72% 48%)}
.gp-plan-card.gp-tone-sky .gp-plan-decor{color:hsl(200 78% 50%)}
.gp-plan-card.gp-tone-lavender .gp-plan-decor{color:hsl(255 70% 60%)}
.gp-plan-card.gp-tone-mint .gp-plan-decor{color:hsl(160 62% 40%)}
.gp-plan-card.gp-tone-lime .gp-plan-decor{color:hsl(85 58% 40%)}
.gp-plan-card.gp-tone-peach .gp-plan-decor{color:hsl(28 76% 52%)}
.gp-plan-card.gp-tone-coral .gp-plan-decor{color:hsl(8 72% 56%)}
.gp-plan-card.gp-tone-pink .gp-plan-decor{color:hsl(335 68% 58%)}
.gp-plan-card.gp-tone-violet .gp-plan-decor{color:hsl(280 58% 58%)}
.gp-plan-card.gp-tone-turquoise .gp-plan-decor{color:hsl(178 62% 38%)}
.gp-plan-card.is-archived .gp-plan-decor{color:var(--as-gray-400)}
.gp-plan-card:hover{border-color:var(--as-border-default);box-shadow:var(--as-shadow-sm);transform:translateY(-1px)}
.gp-plan-card.is-archived{background:var(--as-gray-25)}
.gp-plan-card[class*="gp-tone-"]{border-width:2px}
.gp-plan-card.gp-tone-yellow{background:hsl(48 75% 95%);border-color:hsl(48 60% 72%)}
.gp-plan-card.gp-tone-sky{background:hsl(200 75% 95%);border-color:hsl(200 60% 72%)}
.gp-plan-card.gp-tone-lavender{background:hsl(255 70% 96%);border-color:hsl(255 55% 78%)}
.gp-plan-card.gp-tone-mint{background:hsl(160 70% 95%);border-color:hsl(160 55% 72%)}
.gp-plan-card.gp-tone-lime{background:hsl(85 65% 94%);border-color:hsl(85 50% 70%)}
.gp-plan-card.gp-tone-peach{background:hsl(28 85% 95%);border-color:hsl(28 65% 74%)}
.gp-plan-card.gp-tone-coral{background:hsl(8 80% 95%);border-color:hsl(8 62% 74%)}
.gp-plan-card.gp-tone-pink{background:hsl(335 75% 96%);border-color:hsl(335 60% 78%)}
.gp-plan-card.gp-tone-violet{background:hsl(280 65% 96%);border-color:hsl(280 50% 80%)}
.gp-plan-card.gp-tone-turquoise{background:hsl(178 65% 94%);border-color:hsl(178 50% 68%)}
.gp-plan-card.gp-tone-yellow:hover{border-color:hsl(48 60% 60%)}
.gp-plan-card.gp-tone-sky:hover{border-color:hsl(200 60% 60%)}
.gp-plan-card.gp-tone-lavender:hover{border-color:hsl(255 55% 66%)}
.gp-plan-card.gp-tone-mint:hover{border-color:hsl(160 55% 60%)}
.gp-plan-card.gp-tone-lime:hover{border-color:hsl(85 50% 58%)}
.gp-plan-card.gp-tone-peach:hover{border-color:hsl(28 65% 62%)}
.gp-plan-card.gp-tone-coral:hover{border-color:hsl(8 62% 62%)}
.gp-plan-card.gp-tone-pink:hover{border-color:hsl(335 60% 66%)}
.gp-plan-card.gp-tone-violet:hover{border-color:hsl(280 50% 68%)}
.gp-plan-card.gp-tone-turquoise:hover{border-color:hsl(178 50% 56%)}
.gp-plan-card.needs-price{border-color:var(--as-warning-500)}
.gp-plan-card.needs-price:hover{border-color:var(--as-warning-500)}
.gp-plan-top{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--as-space-4);flex-wrap:wrap}
.gp-plan-tone-icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:var(--as-radius-pill);flex:0 0 auto}
.gp-tone-icon-svg{display:block;width:20px;height:20px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.gp-tone-icon-yellow{background:hsl(48 70% 88%);color:hsl(48 60% 38%)}
.gp-tone-icon-sky{background:hsl(200 70% 88%);color:hsl(200 60% 36%)}
.gp-tone-icon-lavender{background:hsl(255 65% 90%);color:hsl(255 50% 42%)}
.gp-tone-icon-mint{background:hsl(160 65% 88%);color:hsl(160 55% 30%)}
.gp-tone-icon-lime{background:hsl(85 60% 86%);color:hsl(85 45% 30%)}
.gp-tone-icon-peach{background:hsl(28 75% 88%);color:hsl(28 60% 38%)}
.gp-tone-icon-coral{background:hsl(8 72% 89%);color:hsl(8 55% 42%)}
.gp-tone-icon-pink{background:hsl(335 68% 90%);color:hsl(335 55% 42%)}
.gp-tone-icon-violet{background:hsl(280 60% 90%);color:hsl(280 45% 42%)}
.gp-tone-icon-turquoise{background:hsl(178 60% 86%);color:hsl(178 50% 28%)}
.gp-tone-icon-neutral{background:var(--as-gray-100);color:var(--as-text-muted)}
.gp-plan-identity{min-width:0;flex:1}
.gp-plan-name-row{display:flex;align-items:center;flex-wrap:wrap;gap:var(--as-space-2)}
.gp-plan-identity h3{margin:0;color:var(--as-ink-primary);font-size:var(--as-font-size-lg);font-weight:var(--as-font-weight-bold);line-height:var(--as-line-height-heading);overflow-wrap:anywhere}
.gp-plan-price{margin:var(--as-space-1) 0 0;color:var(--as-brand-primary);font-size:var(--as-font-size-2xl);font-weight:800}
.gp-plan-description{margin:var(--as-space-1) 0 0;color:var(--as-text-secondary);font-size:var(--as-font-size-sm);font-weight:var(--as-font-weight-bold);line-height:var(--as-line-height-normal);overflow-wrap:anywhere}
.gp-plan-statuses{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--as-space-2);flex:0 0 auto}
.gp-default-badge{display:inline-flex;align-items:center;gap:4px;padding:5px 9px;border-radius:var(--as-radius-xs);background:var(--as-brand-gradient);color:var(--as-text-inverse);font-size:var(--as-font-size-xs);line-height:1;font-weight:var(--as-font-weight-semibold);white-space:nowrap;box-shadow:var(--as-shadow-xs)}
.gp-plan-footer{display:flex;justify-content:flex-end}
.gp-plan-menu{position:relative}
.gp-plan-menu-trigger{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;border-radius:var(--as-radius-sm);background:var(--as-brand-primary);color:var(--as-text-inverse);cursor:pointer;transition:background var(--as-duration-fast) var(--as-ease-standard)}
.gp-plan-menu-trigger:hover{background:var(--as-brand-hover)}
.gp-plan-menu-trigger:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.gp-plan-menu-dots{display:block;width:16px;height:16px;flex:0 0 auto;fill:currentColor;stroke:none}
.gp-plan-menu-list{position:absolute;top:calc(100% + 6px);right:0;z-index:5;min-width:200px;padding:6px;border:1px solid var(--as-border-default);border-radius:var(--as-radius-md);background:var(--as-surface);box-shadow:var(--as-shadow-md)}
.gp-plan-menu-list[hidden]{display:none}
.gp-plan-menu-item{display:flex;align-items:center;width:100%;padding:8px 10px;border:0;border-radius:var(--as-radius-sm);background:transparent;color:var(--as-ink-primary);font-size:var(--as-font-size-sm);font-weight:var(--as-font-weight-medium);text-align:left;cursor:pointer;transition:background var(--as-duration-fast) var(--as-ease-standard)}
.gp-plan-menu-item:hover,.gp-plan-menu-item:focus-visible{background:var(--as-surface-hover);outline:none}
.gp-plan-menu-item-danger{color:var(--as-danger-600)}
.gp-plan-menu-item-danger:hover,.gp-plan-menu-item-danger:focus-visible{background:var(--as-danger-50)}
.gp-plan-menu-item-positive{color:var(--as-success-600)}
.gp-plan-menu-item-positive:hover,.gp-plan-menu-item-positive:focus-visible{background:var(--as-success-50)}
.gp-plan-menu-divider{height:1px;margin:4px 2px;background:var(--as-border-subtle)}
.gp-popular-badge{display:inline-flex;align-items:center;gap:4px;padding:5px 9px;border-radius:var(--as-radius-xs);background:var(--as-brand-gradient);color:var(--as-text-inverse);font-size:var(--as-font-size-xs);line-height:1;font-weight:var(--as-font-weight-semibold);white-space:nowrap;box-shadow:var(--as-shadow-xs)}
.gp-badge-icon{display:block;width:12px;height:12px;flex:0 0 auto;fill:currentColor;stroke:none}
.gp-check-badge-icon{display:block;width:12px;height:12px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round}
.gp-plan-metrics{display:flex;flex-wrap:wrap;gap:var(--as-space-3) var(--as-space-6)}
.gp-plan-metric{display:flex;align-items:center;gap:var(--as-space-2);min-width:110px}
.gp-plan-metric-copy{display:grid;gap:1px}
.gp-plan-metric-copy small{color:var(--as-text-muted);font-size:var(--as-font-size-xs)}
.gp-plan-metric-copy strong{color:var(--as-ink-secondary);font-size:var(--as-font-size-sm);font-weight:var(--as-font-weight-semibold)}
.gp-btn-icon,.gp-metric-icon,.gp-summary-svg{display:block;width:16px;height:16px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.gp-btn-icon{margin-right:6px}
.gp-metric-icon{color:var(--as-text-muted)}
.gp-plan-card.gp-tone-yellow .gp-metric-icon{color:hsl(48 60% 38%)}
.gp-plan-card.gp-tone-sky .gp-metric-icon{color:hsl(200 60% 36%)}
.gp-plan-card.gp-tone-lavender .gp-metric-icon{color:hsl(255 50% 42%)}
.gp-plan-card.gp-tone-mint .gp-metric-icon{color:hsl(160 55% 30%)}
.gp-plan-card.gp-tone-lime .gp-metric-icon{color:hsl(85 45% 30%)}
.gp-plan-card.gp-tone-peach .gp-metric-icon{color:hsl(28 60% 38%)}
.gp-plan-card.gp-tone-coral .gp-metric-icon{color:hsl(8 55% 42%)}
.gp-plan-card.gp-tone-pink .gp-metric-icon{color:hsl(335 55% 42%)}
.gp-plan-card.gp-tone-violet .gp-metric-icon{color:hsl(280 45% 42%)}
.gp-plan-card.gp-tone-turquoise .gp-metric-icon{color:hsl(178 50% 28%)}
.gp-form-panel{position:sticky;top:88px}

/* Burbuja contextual: reemplaza las dos franjas estáticas anteriores por un
   único mensaje analizado a partir de currentPlans (ver buildPlanNoticeQueue
   en gestion-plans-module.js). Icono tonal a la izquierda (avatar) alineado
   verticalmente con una burbuja tipo buscador global: interior siempre
   blanco con borde naranja de marca, radio igual al de input[type=search]
   (--as-radius-xs) y sombra muy suave — el color semántico de cada
   categoría vive solo en el icono y el encabezado, nunca en la superficie.
   La punta continúa el borde naranja con el mismo truco clásico de burbuja
   de chat (cuadrado rotado con dos bordes visibles + relleno blanco). */
.gp-notice-slot{margin-bottom:var(--as-space-5)}
.gp-notice-panel{display:flex;align-items:center;gap:10px}
.gp-notice-icon{display:flex;align-items:center;justify-content:center;width:42px;height:42px;border-radius:var(--as-radius-pill);flex:0 0 auto}
.gp-notice-panel-svg{display:block;width:22px;height:22px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
.gp-notice-bubble{position:relative;flex:1;min-width:0;display:flex;align-items:center;gap:var(--as-space-3);padding:10px var(--as-space-4);background:var(--as-surface);border:1.5px solid var(--as-brand-primary);border-radius:var(--as-radius-xs);box-shadow:var(--as-shadow-xs);cursor:default}
.gp-notice-tail{position:absolute;left:-6px;top:50%;width:12px;height:12px;background:var(--as-surface);border-left:1.5px solid var(--as-brand-primary);border-bottom:1.5px solid var(--as-brand-primary);transform:translateY(-50%) rotate(45deg)}
.gp-notice-content{flex:1;min-width:0;display:grid;gap:2px}
.gp-notice-heading{font-size:var(--as-font-size-xs);font-weight:var(--as-font-weight-semibold)}
.gp-notice-message{margin:0;font-size:var(--as-font-size-sm);color:var(--as-ink-secondary);line-height:var(--as-line-height-normal);overflow-wrap:anywhere}
.gp-notice-nav{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.gp-notice-nav-btn{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;border:0;border-radius:var(--as-radius-sm);background:var(--as-surface-hover);color:var(--as-ink-secondary);cursor:pointer;transition:background var(--as-duration-fast) var(--as-ease-standard)}
.gp-notice-nav-btn:hover{background:var(--as-gray-200)}
.gp-notice-nav-btn:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.gp-notice-nav-icon{display:block;width:13px;height:13px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.gp-notice-counter{font-size:var(--as-font-size-xs);color:var(--as-ink-secondary);white-space:nowrap;min-width:46px;text-align:center}
.gp-notice-cat-advertencia .gp-notice-icon{background:var(--as-warning-100);color:var(--as-warning-600)}
.gp-notice-cat-advertencia .gp-notice-heading{color:var(--as-warning-600)}
.gp-notice-cat-informacion .gp-notice-icon{background:var(--as-info-100);color:var(--as-info-600)}
.gp-notice-cat-informacion .gp-notice-heading{color:var(--as-info-600)}
.gp-notice-cat-consejo .gp-notice-icon{background:var(--as-brand-100);color:var(--as-brand-700)}
.gp-notice-cat-consejo .gp-notice-heading{color:var(--as-brand-700)}
.gp-notice-cat-correcto .gp-notice-icon{background:var(--as-success-100);color:var(--as-success-600)}
.gp-notice-cat-correcto .gp-notice-heading{color:var(--as-success-600)}
@media(prefers-reduced-motion:no-preference){.gp-notice-panel{animation:gpNoticeFade var(--as-duration-normal) var(--as-ease-standard)}}
@keyframes gpNoticeFade{from{opacity:0;transform:translateY(2px)}to{opacity:1;transform:translateY(0)}}

@media(max-width:1100px){.gp-layout{grid-template-columns:1fr}.gp-form-panel{position:static}.gp-plan-metric{min-width:125px}}
@media(max-width:680px){.gp-catalog-panel{padding:var(--as-space-4)}.gp-summary-row{flex-direction:column;align-items:stretch}.gp-plan-groups{gap:var(--as-space-5)}.gp-plan-card{padding:var(--as-space-3)}.gp-plan-top{flex-direction:column;align-items:stretch;gap:var(--as-space-2)}.gp-plan-statuses{justify-content:flex-start;order:-1}.gp-plan-metrics{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--as-space-3)}.gp-plan-metric{min-width:0}.gp-notice-bubble{flex-wrap:wrap;padding:var(--as-space-3)}.gp-notice-nav{width:100%;justify-content:flex-end}.gp-notice-nav-btn{width:40px;height:40px}}

/* ============================================================================
   Bloque I — API visual global de switches (interruptores binarios reales).
   Contrato: cualquier elemento con esta clase adopta el look & feel oficial
   sin que su JS cambie — el estado ON se detecta por CUALQUIERA de los
   atributos/clases que el control ya usaba (aria-checked, aria-pressed u
   .on), así que availability-switch (aria-checked en el propio <button
   role="switch">), pos-print-toggle (aria-pressed en el <button> exterior,
   con .as-switch como pista decorativa anidada dentro) y lm-switch
   (aria-checked en el propio <button role="switch">) comparten una sola
   hoja de reglas — .as-switch no siempre ES el control interactivo, a veces
   es solo la pista visual dentro de uno. Tamaño normal 44×24, variante
   .as-switch-compact 32×18. Movimiento de la perilla por transform (no
   left/right, que se rompe fácil con RTL o reflow), sin forzar prioridad de
   cascada, respeta prefers-reduced-motion. Ver docs/design y auditoría del
   Bloque I para el detalle de cada control migrado.
   ============================================================================ */
.as-switch{
  --as-switch-w: 44px;
  --as-switch-h: 24px;
  --as-switch-knob: 18px;
  --as-switch-pad: 3px;
  position:relative;
  display:inline-flex;
  align-items:center;
  flex:0 0 auto;
  width:var(--as-switch-w);
  height:var(--as-switch-h);
  padding:0;
  border:0;
  border-radius:var(--as-radius-pill);
  background:var(--as-gray-300);
  cursor:pointer;
}
.as-switch-knob{
  position:absolute;
  top:var(--as-switch-pad);
  left:var(--as-switch-pad);
  width:var(--as-switch-knob);
  height:var(--as-switch-knob);
  border-radius:50%;
  background:#fff;
  box-shadow:var(--as-shadow-xs);
  transform:translateX(0);
  pointer-events:none;
}
@media(prefers-reduced-motion:no-preference){
  .as-switch{transition:background-color var(--as-duration-fast) var(--as-ease-standard)}
  .as-switch-knob{transition:transform var(--as-duration-fast) var(--as-ease-standard)}
}
.as-switch:hover{background:var(--as-gray-400)}
.as-switch:focus-visible{outline:2px solid var(--as-focus-border);outline-offset:2px}
.as-switch:disabled{opacity:.6;cursor:default}
.as-switch:disabled:hover{background:var(--as-gray-300)}
.as-switch[aria-checked="true"],
.as-switch[aria-pressed="true"],
.as-switch.on{
  background:var(--as-success-500);
}
.as-switch[aria-checked="true"]:hover,
.as-switch[aria-pressed="true"]:hover,
.as-switch.on:hover{
  background:var(--as-success-600);
}
.as-switch[aria-checked="true"]:disabled:hover,
.as-switch[aria-pressed="true"]:disabled:hover,
.as-switch.on:disabled:hover{
  background:var(--as-success-500);
}
.as-switch[aria-checked="true"] .as-switch-knob,
.as-switch[aria-pressed="true"] .as-switch-knob,
.as-switch.on .as-switch-knob{
  transform:translateX(calc(var(--as-switch-w) - var(--as-switch-knob) - (var(--as-switch-pad) * 2)));
}
.as-switch-compact{
  --as-switch-w: 32px;
  --as-switch-h: 18px;
  --as-switch-knob: 14px;
  --as-switch-pad: 2px;
}
