 
:root {
    --av-bg:            #F7FAFC;
    --av-surface:       #FFFFFF;
    --av-surface-soft:  #F4FBFC;
    --av-border:        #D9E8EC;
    --av-accent:        #319ABA;
    --av-accent-dark:   #287F99;
    --av-accent-light:  #4DB4D2;
    --av-accent-soft:   #E8F7FB;
    --av-success-bg:    #DCFCE7;
    --av-success-text:  #16A34A;
    --av-warning-bg:    #FEF3C7;
    --av-warning-text:  #D97706;
    --av-danger-bg:     #FEE2E2;
    --av-danger-text:   #DC2626;
    --av-purple-bg:     #F3E8FF;
    --av-purple-text:   #9333EA;
    --av-orange-bg:     #FFEDD5;
    --av-orange-text:   #EA580C;
    --av-text:          #1E293B;
    --av-text-muted:    #64748B;
    --av-text-inverse:  #FFFFFF;
    --av-radius-lg:     14px;
    --av-radius:        10px;
    --av-radius-sm:     8px;
    --av-shadow:        0 10px 28px rgba(15,23,42,.08);
    --av-shadow-soft:   0 2px 8px rgba(15,23,42,.05);
    --av-font:          Inter, "Segoe UI", Roboto, Arial, sans-serif;
    --av-font-size:     12.3px;
}

/* ---------------------------------------------------------------------
   2) BASE / TIPOGRAFIA (ZK core - best effort)
   --------------------------------------------------------------------- */
body, .z-body {
    background: var(--av-bg);
    font-family: var(--av-font);
    color: var(--av-text);
}

/* CONFIRMADO: .z-a es la clase real de ZK para <a>. Se pone ACA (cerca
   del inicio del archivo, como estilo base) a proposito: es una regla
   global que aplica a TODOS los <a> del sistema, incluyendo los que ya
   tienen su propia sclass mas especifica (.sidebar-nav-item,
   .veterinaria-option, .link-secundario, .veterinaria-volver, etc.).
   Si esta regla estuviera mas abajo en el archivo, con la misma
   especificidad (una sola clase) le ganaria a esas por orden de
   aparicion y las taparia. Puesta aca arriba, esas reglas mas
   especificas siguen ganando despues, como corresponde. */
.z-a {
    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    font-size: 16px;
    color: #287f99;
    padding: 10px;
}
.z-a:hover {
    color: var(--av-accent) !important;
}

/* ---------------------------------------------------------------------
   3) VENTANAS (windows normales, NO modales) - ZK core (best effort)
   --------------------------------------------------------------------- */
.z-window {
    border: 1px solid var(--av-border) !important;
    border-radius: var(--av-radius-lg) !important;
    background: var(--av-surface) !important;
    box-shadow: var(--av-shadow-soft) !important;
    padding: 14px;
}
.z-window-header, .z-window-caption {
    background: transparent !important;
    color: var(--av-text) !important;
    font-weight: 700 !important;
    border-bottom: 1px solid var(--av-border) !important;
    padding: 12px 16px !important;
}
.z-window-content {
    padding: 5px !important;
}

/* ---------------------------------------------------------------------
   4) BOTONES
   Clases propias de utilidad: usalas con sclass="btn-primary" etc.
   --------------------------------------------------------------------- */
.btn-primary, .btn-secondary, .btn-danger, .btn-ghost {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    border: none;
    border-radius: var(--av-radius-sm);
    padding: 9px 16px;
    font-size: 13px;
    font-weight: 600;
    font-family: var(--av-font);
    cursor: pointer;
    text-decoration: none;
    transition: background .15s ease;
    text-shadow:none !important;
}
.btn-primary {
    background: var(--av-accent);
    color: var(--av-text-inverse);
}
.btn-primary:hover {
    background: var(--av-accent-dark);
}

.btn-secondary {
    background: var(--av-surface-soft);
    color: var(--av-text-muted);
}
.btn-secondary:hover {
    background: var(--av-border);
}

.btn-danger {
    background: var(--av-danger-bg);
    color: var(--av-danger-text);
}
.btn-danger:hover {
    background: #fecaca;
}

.btn-ghost {
    background: transparent;
    color: var(--av-text-muted);
    border: 1px solid var(--av-border);
}
.btn-ghost:hover {
    background: var(--av-surface-soft);
}

/* Aplica automaticamente el look de btn-primary a TODO boton ZK que no
   tenga otra sclass (ZK core - best effort). Quita este bloque si
   prefieres decidir explicitamente el tipo de cada boton con sclass. */
.z-button {
    border-radius: var(--av-radius-sm) !important;
    font-weight: 600 !important;
    font-family: var(--av-font) !important;
}
.z-button:not(.btn-secondary):not(.btn-danger):not(.btn-ghost) {
    background: var(--av-accent) !important;
    color: var(--av-text-inverse) !important;
    border: none !important;
}

/* ---------------------------------------------------------------------
   5) DIVS / CONTENEDORES DE UTILIDAD
   --------------------------------------------------------------------- */
.card {
    background: var(--av-surface);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius-lg);
    padding: 16px;
    box-shadow: var(--av-shadow-soft);
}
.panel-titulo {
    font-size: 15px;
    font-weight: 700;
    color: var(--av-text);
    margin: 0 0 12px;
}
.toolbar {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 12px;
}
.toolbar-spacer {
    flex: 1;
}
.fila-item {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--av-surface);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius);
    padding: 9px 12px;
    margin-bottom: 8px;
}
.avatar-icono {
    width: 34px;
    height: 34px;
    border-radius: var(--av-radius-sm);
    background: var(--av-surface-soft);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--av-accent-dark);
    flex-shrink: 0;
    cursor: pointer;
    font-weight: 700;
}
.avatar-icono:hover {
    background: var(--av-accent);
    color: var(--av-text-inverse);
}

/* ---------------------------------------------------------------------
   6) BADGES / ETIQUETAS DE ESTADO
   --------------------------------------------------------------------- */
.badge {
    display: inline-block;
    font-size: 11px;
    font-weight: 600;
    padding: 3px 9px;
    border-radius: 20px;
}
.badge-success {
    background: var(--av-success-bg);
    color: var(--av-success-text);
}
.badge-danger  {
    background: var(--av-danger-bg);
    color: var(--av-danger-text);
}
.badge-accent  {
    background: var(--av-surface-soft);
    color: var(--av-accent-dark);
}

/* ---------------------------------------------------------------------
   7) FORMULARIOS - textbox/combobox/datebox (ZK core - best effort)
   --------------------------------------------------------------------- */
.form-label {
    font-size: var(--av-font-size);
    font-weight: 600;
    color: var(--av-text-muted);
    display: block;
    margin: 10px 0 4px;
}
.z-textbox, .z-combobox-input, .z-datebox-input, .z-intbox, .z-decimalbox {
    border: 1px solid var(--av-border) !important;
    border-radius: var(--av-radius-sm) !important;
    padding: 8px 10px !important;
    font-size: 13px !important;
    font-family: var(--av-font) !important;
    background: #fffdf8 !important;
    color: var(--av-text) !important;
    width: 100% !important;
    box-sizing: border-box !important;
}
.z-textbox:focus, .z-combobox-input:focus {
    border-color: var(--av-accent) !important;
    outline: none !important;
}

/* ---------------------------------------------------------------------
   8) LISTBOX / GRID
   --------------------------------------------------------------------- */
.z-listbox {
    border: 1px solid var(--av-border) !important;
    border-radius: var(--av-radius) !important;
    background: var(--av-surface) !important;
    width: 100% !important;
    max-width: 100% !important;
    box-sizing: border-box !important;
    overflow-x: hidden !important;
}

/* Evita que el texto largo (ej. "Canis lupus familiaris") empuje la
   tabla mas ancha que su contenedor y aparezca scroll horizontal. */
.z-listbox .z-listcell {
    white-space: normal !important;
    word-break: break-word !important;
    overflow-wrap: break-word !important;
}

/* Scrollbar propio del listado (el celeste/azul por defecto del
   navegador no pega con el tema). Funciona en Chrome/Edge/Safari via
   ::-webkit-scrollbar y en Firefox via scrollbar-color. */
.z-listbox ::-webkit-scrollbar {
    width: 9px;
    height: 9px;
}
.z-listbox ::-webkit-scrollbar-track {
    background: var(--av-surface-soft);
    border-radius: 10px;
}
.z-listbox ::-webkit-scrollbar-thumb {
    background: var(--av-border);
    border-radius: 10px;
}
.z-listbox ::-webkit-scrollbar-thumb:hover {
    background: var(--av-accent);
}
.z-listbox, .z-listbox * {
    scrollbar-width: thin;
    scrollbar-color: var(--av-border) var(--av-surface-soft);
}

/* Header: usa la clase propia .listado-header (agregala con
   sclass="listado-header" en cada <listheader> del .zul). Es la forma
   GARANTIZADA de que tome el estilo, sin depender de adivinar el nombre
   de clase interno que usa tu build/skin de ZK para el header.

   IMPORTANTE: el fondo si tomo la clase, pero el texto seguia blanco
   porque el label vive en un elemento hijo (span/div interno) con SU
   PROPIO color heredado del skin oscuro por defecto. Por eso forzamos
   el color tambien en "*" (todos los descendientes), no solo en el
   contenedor .listado-header. */
.listado-header,
.listado-header * {
    color: var(--av-text) !important;
}
.listado-header {
    background: var(--av-surface-soft) !important;
    font-weight: 700 !important;
    font-size: 12px !important;
}

/* CONFIRMADO: tu build de ZK usa .z-listheader (nos pasaste la regla
   real, gracias). Ademas del fondo azul (#0093F9) y el texto blanco, esa
   regla tambien trae bordes azules (border-left/border-bottom: #0064ED)
   que no estabamos pisando -- por eso seguia sin armonizar aunque el
   fondo ya estuviera bien. Los pisamos explicitamente aca. */
.z-listbox-header, .z-listbox .z-listheader, .z-listbox thead, .z-listheader {
    background: var(--av-surface-soft) !important;
    color: var(--av-text) !important;
    font-weight: 700 !important;
    border-left: 1px solid var(--av-border) !important;
    border-bottom: 1px solid var(--av-border) !important;
}
.z-listbox-header *, .z-listbox .z-listheader *, .z-listheader * {
    color: var(--av-text) !important;
}

/* Hover y seleccion.
   ZK usa por convencion el sufijo "-over" para el estado de mouseover
   en la mayoria de sus componentes (ej. z-button-over), no "-hover".
   La regla [class*="over"] de abajo matchea CUALQUIER clase que
   contenga la palabra "over" en cualquier parte (z-listitem-over,
   z-row-over, z-listbox-row-over, etc.) -- no necesitamos adivinar el
   nombre completo, solo que ZK use esa convencion, lo cual es casi
   seguro. Esta es la forma mas a prueba de balas sin ver el HTML real. */
.z-listbox .z-listbox-body [class*="over"] {
    background: var(--av-surface-soft) !important;
    color: var(--av-text) !important;
}
.z-listbox .z-listbox-body [class*="over"] .z-listcell {
    color: var(--av-text) !important;
}

/* Respaldo adicional con nombres puntuales y :hover nativo, por si el
   wildcard de arriba no alcanza a cubrir algun caso. */
.z-listbox .z-listbox-body .z-listitem-over,
.z-listbox .z-listbox-body tr.z-listitem-over,
.z-listbox .z-listbox-body .z-listitem:hover,
.z-listbox .z-listbox-body tr.z-listitem:hover {
    background: var(--av-surface-soft) !important;
}
.z-listbox .z-listbox-body .z-listitem-over .z-listcell,
.z-listbox .z-listbox-body .z-listitem:hover .z-listcell {
    color: var(--av-text) !important;
}

.z-listbox .z-listbox-body .z-listitem-selected,
.z-listbox .z-listbox-body tr.z-listitem-selected,
.z-listbox .z-listbox-body .z-listitem.z-listitem-selected,
.z-listbox .z-listbox-body .z-listitem[aria-selected="true"] {
    background: var(--av-accent-soft) !important;
    color: var(--av-text) !important;
}
.z-listbox .z-listbox-body .z-listitem-selected .z-listcell,
.z-listbox .z-listbox-body .z-listitem.z-listitem-selected .z-listcell {
    color: var(--av-text) !important;
}

/* Mismo patron que el de la fila seleccionada: es probable que el hover
   tambien pinte el fondo en el .z-listcell hijo, no en el .z-listitem.
   Lo cubrimos de una vez con el mismo enfoque. */
.z-listitem.z-listitem-over > .z-listcell,
.z-listitem[class*="over"] > .z-listcell {
    background: var(--av-surface-soft) !important;
    color: var(--av-text) !important;
}

/* CONFIRMADO: la fila seleccionada pinta el fondo celeste (#7ac8ff) en
   CADA .z-listcell hijo directo, no en el .z-listitem contenedor -- por
   eso las reglas de arriba (que apuntaban al listitem) no alcanzaban a
   pisar esta. Mismo selector exacto, con !important. */
.z-listitem.z-listitem-selected > .z-listcell {
    background: var(--av-accent-soft) !important;
    color: var(--av-text) !important;
}

/* ---------------------------------------------------------------------
   9) MODAL (centrado, ancho automatico, responsive)
   --------------------------------------------------------------------
   Uso: un <div sclass="modal-overlay"> que envuelve todo el fondo oscuro
   y centra su contenido, y dentro un <div sclass="modal-sheet"> con la
   tarjeta en si (encabezado, campos, botones).

   Ventaja de este enfoque vs. Window mode="modal": el div NO tiene
   posicionamiento propio inyectado por JavaScript, asi que el CSS manda
   siempre.

   El composer solo necesita togglear la visibilidad de divModalOverlay
   (setVisible(true/false)); no hace falta doModal().
   --------------------------------------------------------------------- */
.modal-overlay {
    position: fixed !important;
    inset: 0 !important;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: color-mix(in srgb, var(--av-surface-soft) 50%, transparent);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    box-sizing: border-box;
    z-index: 1000;
}

.modal-sheet {
    /* "auto-ajustable": el ancho se adapta al contenido dentro de un
       rango razonable, en vez de un valor fijo. */
    width: auto;
    min-width: 320px;
    max-width: 440px;
    max-height: 90vh;
    overflow-y: auto;
    background: var(--av-surface);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius-lg);
    box-shadow: var(--av-shadow);
    padding: 20px 22px;
    box-sizing: border-box;
}

.modal-sheet-titulo {
    font-size: 14px;
    font-weight: 700;
    color: var(--av-text);
    margin: 0 0 12px;
}

/* La "manija" ya no aplica con el modal centrado (era propia del
   bottom sheet). La dejamos oculta por si algun .zul todavia la incluye,
   para no tener que tocar cada archivo de golpe. */
.modal-sheet-handle {
    display: none;
    height: 4px;
    background: var(--av-border);
    border-radius: 3px;
    margin: 0 auto 10px;
}

/* ---------------------------------------------------------------------
   10) RESPONSIVE
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   11) LAYOUT PRINCIPAL (dashboard): sidebar, topbar, tarjetas de metricas
   --------------------------------------------------------------------
   Implementado con <div> (mismo criterio que el modal): control total
   por CSS, sin depender de borderlayout ni de nombres de clase internos
   de ZK.
   --------------------------------------------------------------------- */
.app-shell {
    display: flex;
    gap: 14px;
    align-items: flex-start;
    min-height: 100vh;
    box-sizing: border-box;
    padding: 14px;
}

.app-sidebar {
    width: 200px;
    flex-shrink: 0;
    background: var(--av-surface);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius-lg);
    padding: 12px 8px;
    display: flex;
    flex-direction: column;
    gap: 2px;
    box-sizing: border-box;
    /* Con varios grupos del acordeon abiertos a la vez, el contenido
       puede crecer mas alto que la ventana. Sin esto, lo que se pasa
       del alto disponible queda recortado (no se puede llegar a
       "Cerrar sesion" ni a los ultimos items). Con max-height +
       overflow-y, el sidebar scrollea SOLO EL, independiente del resto
       de la pantalla -- el "position: sticky" ademas lo mantiene en
       pantalla mientras se scrollea el contenido principal. */
    max-height: calc(100vh - 28px);
    overflow-y: auto;
    position: sticky;
    top: 14px;
}

/* Boton hamburguesa: oculto en escritorio, solo aparece en el
   breakpoint movil (ver seccion 10, RESPONSIVE). Se ubica a la
   izquierda de la topbar. */
.mobile-menu-toggle {
    display: none;
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 4px !important;
    color: var(--av-text-muted) !important;
    cursor: pointer;
    margin-right: 4px;
}
.mobile-menu-toggle i {
    font-size: 20px !important;
    margin: 0 !important;
}
.mobile-menu-toggle:hover {
    color: var(--av-accent) !important;
}

/* Fondo oscuro detras del menu flotante en movil. Oculto por defecto;
   la clase "visible" la agrega/quita el toggle (ver Dashboard.zul). */
.sidebar-backdrop {
    display: none;
}

.sidebar-brand-row {
    display: contents;
    align-items: center;
    gap: 8px;
    padding: 6px 10px 12px;
}

.brand-logo {
    width: 100px;
    height: 100px;
    align-self: center;
    flex-shrink: 0;
    object-fit: contain;
}

.sidebar-brand {
    font-size: 15px;
    font-weight: 700;
    color: var(--av-accent-dark);
}

.sidebar-nav-item {
    display: block;
    padding: 9px 12px;
    border-radius: var(--av-radius-sm);
    color: var(--av-text-muted);
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}
.sidebar-nav-item:hover {
    background: var(--av-surface-soft);
}
.sidebar-nav-item.active {
    background: var(--av-accent);
    color: var(--av-text-inverse);
}

/* Grupos desplegables (acordeon) del sidebar. El toggle es puro cliente
   (w:onClick + jq('$id').toggleClass('open')), sin ir al servidor -- ver
   Dashboard.zul. */
.sidebar-group {
    margin: 2px 0;
}
.sidebar-group-header {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 12px;
    border-radius: var(--av-radius-sm);
    color: var(--av-text-muted);
    font-size: 13px;
    font-weight: 600;
    cursor: pointer;
}
/* Icono + texto del grupo, generados por iconSclass en un <label> (ZK
   no tiene una etiqueta <i>/<span> propia -- ver Dashboard.zul). */
.sidebar-group-label {
    flex: 1;
    display: flex;
    align-items: center;
    padding: 0;
    margin: 0;
    color: inherit;
    font: inherit;
    text-decoration: none;
}
.sidebar-group-label i {
    font-size: 16px !important;
    margin-right: 8px;
}
.sidebar-group-header:hover {
    background: var(--av-surface-soft);
}
.sidebar-chev {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 0 !important;
    margin: 0 !important;
    font-size: 14px;
    color: inherit;
    transition: transform .15s ease;
}
.sidebar-chev i {
    font-size: 14px !important;
    margin: 0 !important;
}
.sidebar-group.open .sidebar-chev {
    transform: rotate(180deg);
}
.sidebar-group-body {
    display: none;
    flex-direction: column;
    padding-left: 14px;
    margin-top: 2px;
}
.sidebar-group.open .sidebar-group-body {
    display: flex;
}
.sidebar-subitem {
    display: block;
    padding: 7px 12px 7px 24px;
    border-left: 2px solid var(--av-border);
    font-size: 12.5px;
    color: var(--av-text-muted);
    text-decoration: none;
    cursor: pointer;
}
.sidebar-subitem:hover {
    color: var(--av-accent-dark);
    border-left-color: var(--av-accent);
}
.sidebar-subitem.active {
    color: var(--av-accent-dark);
    font-weight: 700;
    border-left-color: var(--av-accent);
    background: var(--av-surface-soft);
}

.app-main {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 12px;
    /* Mismo motivo que .app-sidebar (ver ese comentario mas abajo): sin
       esto, el contenido mas alto que la ventana no se podia scrollear
       -- dependia de que la PAGINA entera scrolleara, y eso no estaba
       pasando de forma confiable con el <window height="100%">. Con
       max-height + overflow-y, esta zona scrollea sola, garantizado,
       sin depender de como ZK maneje el overflow del resto de la pagina. */
    max-height: calc(100dvh - 48px);
    overflow-y: auto;
}

.app-topbar {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--av-surface);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius-lg);
    padding: 12px 16px;
    box-sizing: border-box;
}
.topbar-clinic-group {
    display: flex;
    flex-direction: column;
    min-width: 0;
    gap: 2px;
}
.topbar-titulo {
    font-size: 15px;
    font-weight: 700;
    color: var(--av-text);
    margin: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}
.topbar-clinica {
    font-size: var(--av-font-size);
    color: var(--av-text-muted);
    margin: 0;
}
.topbar-spacer {
    flex: 1;
}

.metric-grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 10px;
    cursor:pointer;
}
.metric-card {
    display: flex;
    align-items: center;
    gap: 12px;
    background: var(--av-surface-soft);
    border-radius: var(--av-radius);
    padding: 12px;
    box-sizing: border-box;
}

/* Quiebre intermedio (tablet): a este ancho el sidebar ya no colapsa
   (eso solo pasa en 
/* ===== Panel de cuenta suspendida (SaaS) ===== */
.cuenta-suspendida {
    text-align: center;
    padding: 12px 8px;
}
.cuenta-suspendida-icono {
    font-size: 46px;
    color: var(--av-danger-text, #dc2626);
    display: block;
    margin-bottom: 10px;
}
.cuenta-suspendida-titulo {
    display: block;
    font-size: 18px;
    font-weight: 700;
    color: var(--av-text, #1e293b);
    margin-bottom: 8px;
}
.cuenta-suspendida-motivo {
    display: block;
    font-size: 14px;
    color: var(--av-text-muted, #64748b);
    line-height: 1.5;
    margin-bottom: 16px;
}


/* Opcion "Crear cliente y mascota" en el buscador de cliente */
.combo-crear-cliente {
    color: var(--av-accent-dark, #287f99);
    font-weight: 600;
}

/* Opcion "Crear producto" en el buscador de producto de la factura */
.combo-crear-producto {
    color: var(--av-accent-dark, #287f99);
    font-weight: 600;
}

.crear-seccion-mascota {
    margin-top: 14px;
    padding-top: 14px;
    border-top: 1px solid var(--av-border);
}


/* ===== Aviso de conexion perdida (offline) ===== */
.av-offline-banner {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 99999;
    background: var(--av-warning-bg, #FEF3C7);
    color: var(--av-warning-text, #D97706);
    border-bottom: 1px solid var(--av-warning-text, #D97706);
    padding: 10px 16px;
    font-family: var(--av-font);
    font-size: 13.5px;
    font-weight: 600;
    text-align: center;
    display: none;
    align-items: center;
    justify-content: center;
    gap: 10px;
}
.av-offline-banner.visible {
    display: flex;
}
.av-offline-banner .av-offline-reload {
    background: var(--av-warning-text, #D97706);
    color: #fff;
    border: none;
    border-radius: var(--av-radius-sm, 8px);
    padding: 5px 14px;
    font-size: 12.5px;
    font-weight: 600;
    cursor: pointer;
    text-decoration: none;
}

/*@media max-width:640px, mas abajo), pero 4 columnas
   ya no alcanzan para que las etiquetas largas ("Hospitalizadas") no se
   vean apretadas. Pasa a 2 columnas antes de llegar al quiebre movil. */
@media (max-width: 900px) {
    .metric-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

/* Icono de cada tarjeta de metrica, implementado con <toolbarbutton
   iconSclass="..."> (zul no tiene una etiqueta <i> propia). Circulo con
   el color de acento del tema, para que las tarjetas no se vean vacias
   con solo numeros. */
.metric-icon {
    background: var(--av-accent-soft) !important;
    border: none !important;
    box-shadow: none !important;
    border-radius: 50% !important;
    width: 36px;
    height: 36px;
    min-width: 36px;
    padding: 0 !important;
    display: flex !important;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.metric-icon i {
    font-size: 18px !important;
    margin: 0 !important;
    color: var(--av-accent-dark) !important;
}

.metric-text-col {
    min-width: 0;
    flex: 1;
}

.metric-label {
    display: block;
    font-size: var(--av-font-size);
    color: var(--av-text-muted);
    margin: 0 0 4px;
    overflow-wrap: break-word;
    word-break: break-word;
}
.metric-value {
    display: block;
    font-size: 22px;
    font-weight: 700;
    color: var(--av-text);
    margin: 0;
}

.agenda-nombre {
    font-size: 13px;
    color: var(--av-text);
    display: block;
}
.agenda-detalle {
    font-size: var(--av-font-size);
    color: var(--av-text-muted);
    display: block;
}
.agenda-detalle-col {
    flex: 1;
    min-width: 0;
}
.agenda-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 0;
    border-bottom: 1px solid var(--av-border);
}
.agenda-time {
    font-size: var(--av-font-size);
    color: var(--av-text-muted);
    width: 40px;
    flex-shrink: 0;
}
.agenda-vacio {
    font-size: 13px;
    color: var(--av-text-muted);
    padding: 12px 0;
}

/* ---------------------------------------------------------------------
   12) ICONOS (Tabler Icons via iconSclass)
   --------------------------------------------------------------------- */
.sidebar-nav-item i {
    margin-right: 9px;
    font-size: 16px;
    vertical-align: middle;
}

/* Iconos sueltos en la topbar (busqueda, notificaciones), implementados
   con <toolbarbutton iconSclass="..."> ya que zul no tiene una etiqueta
   <i> propia -- hay que quitarles el aspecto de boton por defecto. */
.topbar-icon {
 
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius-sm);
    color: var(--av-text-muted);
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}
.topbar-icon i {
    font-size: 18px !important;
    margin: 0 !important;
}
.topbar-icon:hover {
    color: var(--av-accent) !important;
    background: var(--av-surface-soft) !important;
    border-radius: var(--av-radius-sm) !important;
}

/* ---------------------------------------------------------------------
   13) LOGIN (index.zul)
   --------------------------------------------------------------------- */
.login-page {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    box-sizing: border-box;
    padding: 20px;
    /* Permitir scroll cuando el contenido (ej. el registro, que es
       largo) supera la altura de la pantalla. Sin esto, align-items
       center empuja los extremos fuera del viewport y no se pueden
       ver -- se veia cortado en movil. */
    overflow-y: auto;
    background-color: var(--av-bg);
    /* Huellas de fondo (marca de agua, tenidas de teal) en las esquinas.
       El archivo ya viene con la opacidad reducida (16%) y recoloreado
       desde el original -- ver LEEME_IMAGENES_LOGIN.txt.
       RUTA RELATIVA a proposito (../images/..., no /images/...): un
       url() dentro de un .css es texto plano que el NAVEGADOR resuelve
       directamente, sin pasar por ZK -- a diferencia del <?link?> del
       .zul, que ZK si ajusta al contexto de la app. Si la app no esta
       desplegada en la raiz del dominio, una ruta absoluta como
       /images/... no incluye el contexto y no encuentra el archivo;
       la ruta relativa, calculada desde donde vive este mismo .css
       (amigoVet-war/web/styles/), siempre funciona. */
    background-image:
        url('../images/patitas-watermark.png'),
        url('../images/patitas-watermark.png');
    background-repeat: no-repeat, no-repeat;
    background-position: top right, bottom left;
    background-size: 220px auto, 160px auto;
}

.login-card {
    width: 100%;
    max-width: 360px;
    box-sizing: border-box;
}

.login-logo {
    display: block;
    width: 110px;
    height: 110px;
    margin: 0 auto 12px;
    object-fit: contain;
}

/* Campo de contrasena con boton de mostrar/ocultar (ojo) superpuesto
   a la derecha, dentro del mismo recuadro del textbox. */
.password-wrapper {
    position: relative;
    width: 100%;
}

.password-wrapper .z-textbox {
    width: 100%;
    padding-right: 38px;
    box-sizing: border-box;
}

.password-toggle {
    position: absolute;
    top: 50%;
    right: 10px;
    transform: translateY(-50%);
    color: var(--av-text-muted);
    cursor: pointer;
    font-size: 17px;
    text-decoration: none;
    line-height: 1;
    z-index: 2;
}

.password-toggle:hover {
    color: var(--av-accent);
}

.login-brand {
    display: block;
    font-size: 20px;
    font-weight: 700;
    color: var(--av-accent-dark);
    text-align: center;
    margin: 0 0 4px;
}

.login-subtitle {
    display: block;
    font-size: 13px;
    color: var(--av-text-muted);
    text-align: center;
    margin: 0 0 20px;
}

/* Checkbox "recordarme" (mold=switch). Solo espaciado -- el switch en
   si lo dibuja el skin propio de ZK; si mas adelante quieres que el
   "encendido" use el teal del tema en vez del color por defecto de ZK,
   hay que inspeccionar la clase real del switch en el navegador (mismo
   proceso que hicimos con .z-listheader/.z-a) y la agregamos. */
.login-recordarme {
    display: block;
    margin: 14px 0 4px;
    font-size: 13px;
    color: var(--av-text-muted);
}

/* Checkbox personalizado (mold="switch"). Clases CONFIRMADAS del skin
   de ZK -- reemplaza el color por defecto del switch por el teal del
   tema, usado por ahora en .login-recordarme (index.zul). */
.z-checkbox-switch-off > .z-checkbox-mold {
    background-color: var(--av-surface-soft);
    margin: auto;
}
.z-checkbox-switch-on > .z-checkbox-mold {
    background-color: var(--av-accent);
    margin: auto;
}
.z-checkbox-switch-off > .z-checkbox-mold:before {
    background-color: white;
}
.z-checkbox-switch-on > .z-checkbox-mold:before {
    background-color: white;
}
.z-checkbox-switch-on > .z-checkbox-mold:after {
    color: white !important;
    font-size: 9px !important;
    display: block !important;
    font-weight: normal !important;
    vertical-align: middle !important;
    text-align: left !important;
    padding-left: 5px !important;
}
.z-checkbox-switch-off > .z-checkbox-mold:after {
    color: #000;
    font-size: 9px;
    display: block;
    font-weight: normal;
    vertical-align: middle !important;
    text-align: right;
    padding-right: 4px;
}
.z-checkbox-mold:active {
    border: 0.5px solid var(--av-accent);
    outline: none;
}
.z-checkbox-mold:focus {
    border: 0.5px solid var(--av-accent);
    outline: none;
}

.login-error {
    display: block;
    background: var(--av-danger-bg);
    color: var(--av-danger-text);
    font-size: var(--av-font-size);
    padding: 8px 10px;
    border-radius: var(--av-radius-sm);
    margin: 0 0 14px;
}

/* Mensaje de exito en formularios (ej. "Perfil actualizado"). Mismas
   dimensiones que .login-error, para poder reusar el mismo <label>
   cambiando solo la sclass segun el resultado. */
.form-success {
    display: block;
    background: var(--av-success-bg);
    color: var(--av-success-text);
    font-size: var(--av-font-size);
    padding: 8px 10px;
    border-radius: var(--av-radius-sm);
    margin: 0 0 14px;
}

/* Subtitulo para separar secciones dentro de un mismo formulario (ej.
   separar los datos de perfil del bloque de cambio de contrasena). */
.form-section-titulo {
    display: block;
    font-size: var(--av-font-size);
    font-weight: 700;
    color: var(--av-text);
    margin: 18px 0 2px;
    padding-top: 12px;
    border-top: 1px solid var(--av-border);
}

/* Selector de veterinaria (login con multiples clinicas, y el switcher
   del dashboard). Cada opcion es un <a> generado dinamicamente por el
   composer, uno por veterinaria a la que el usuario tiene acceso. */
.veterinaria-option {
    display: flex;
    align-items: center;
    padding: 12px 14px;
    margin-bottom: 8px;
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius);
    color: var(--av-text);
    font-size: 14px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}
.veterinaria-option:hover {
    background: var(--av-surface-soft);
    border-color: var(--av-accent);
}

.veterinaria-volver {
    display: block;
    text-align: center;
    margin-top: 8px;
    font-size: 13px;
    color: var(--av-text-muted);
    text-decoration: underline;
    cursor: pointer;
}

/* Enlaces secundarios del login (olvidaste tu contrasena, registrate). */
.link-secundario {
    display: block;
    text-align: center;
    margin-top: 12px;
    font-size: 13px;
    color: var(--av-accent-dark);
    text-decoration: none;
    cursor: pointer;
}
.link-secundario:hover {
    color: var(--av-accent);
}
.veterinaria-volver:hover {
    color: var(--av-accent);
}

/* ---------------------------------------------------------------------
   14) AGENDA (paginas/Agenda.zul)
   --------------------------------------------------------------------- */
.agenda-toolbar {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
}
.agenda-fecha-nav {
    display: flex;
    align-items: center;
    gap: 4px;
    background: var(--av-surface-soft);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius);
    padding: 4px;
}
.agenda-fecha-label {
    font-size: 13px;
    font-weight: 600;
    color: var(--av-text);
    padding: 0 6px;
    white-space: nowrap;
}

.agenda-vacio-pagina {
    padding: 40px 20px;
    text-align: center;
    color: var(--av-text-muted);
    font-size: 13px;
}

/* Fila de una cita en la lista del dia. */
.cita-row {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 12px 16px;
    border-bottom: 1px solid var(--av-surface-soft);
}
.cita-row:last-child {
    border-bottom: none;
}
.cita-hora {
    display: block;
    width: 52px;
    flex-shrink: 0;
    font-size: 13px;
    font-weight: 600;
    color: var(--av-text-muted);
}
.cita-icono {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: var(--av-surface-soft);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}
.cita-icono-boton {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
    padding: 0 !important;
    color: var(--av-accent-dark) !important;
}
.cita-icono-boton i {
    font-size: 18px !important;
    margin: 0 !important;
}
.cita-info {
    flex: 1;
    min-width: 0;
}
.cita-nombre {
    display: block;
    font-size: 14px;
    font-weight: 600;
    color: var(--av-text);
    overflow-wrap: break-word;
}
.cita-detalle {
    display: block;
    font-size: 12.5px;
    color: var(--av-text-muted);
    overflow-wrap: break-word;
}
.cita-contacto {
    display: block;
    font-size: 11.5px;
    color: var(--av-text-muted);
    opacity: .8;
    overflow-wrap: break-word;
    margin-top: 1px;
}
.cita-acciones {
    display: flex;
    align-items: center;
    gap: 4px;
    flex-shrink: 0;
}
.cita-accion-icono {
    width: 30px;
    height: 30px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius-sm);
    cursor: pointer;
    padding: 0;
    text-decoration: none;
}
.cita-accion-icono i {
    font-size: 16px !important;
    margin: 0 !important;
}
.cita-accion-confirmar {
    color: var(--av-success-text);
}
.cita-accion-confirmar:hover {
    background: var(--av-success-bg);
}
.cita-accion-cancelar {
    color: var(--av-danger-text);
}
.cita-accion-cancelar:hover {
    background: var(--av-danger-bg);
}
.cita-accion-atender {
    height: 30px;
    padding: 0 12px !important;
    font-size: 12.5px;
    display: flex;
    align-items: center;
    white-space: nowrap;
}
.cita-sin-resultados {
    display: block;
    font-size: 12.5px;
    color: var(--av-text-muted);
    padding: 8px 0;
}

/* ---------------------------------------------------------------------
   RESPONSIVE MOVIL: se pone AL FINAL del archivo A PROPOSITO. Con la
   misma especificidad, en CSS gana la regla que aparece MAS ABAJO en el
   archivo cuando ambas podrian aplicar. Si este bloque quedara antes de
   alguna regla base (.app-sidebar, .metric-grid, etc.), esa regla base
   le ganaria en pantallas angostas y rompería el diseno movil -- eso
   fue exactamente lo que paso cuando .app-sidebar (con position:sticky)
   quedo despues de este bloque. Dejandolo al final, SIEMPRE gana sobre
   cualquier regla base sin importar en que orden se hayan ido agregando.
   --------------------------------------------------------------------- */
/* ---------------------------------------------------------------------
   15) PACIENTES (paginas/Pacientes.zul): listado + ficha con tabs
   --------------------------------------------------------------------- */
.paciente-row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 16px;
    border-bottom: 1px solid var(--av-surface-soft);
    cursor: pointer;
}
.paciente-row:last-child {
    border-bottom: none;
}
.paciente-row:hover {
    background: var(--av-bg);
}
.paciente-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background: var(--av-surface-soft);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--av-accent-dark);
    font-size: 13px;
    font-weight: 700;
    flex-shrink: 0;
}
.paciente-info {
    flex: 1;
    min-width: 0;
}
.paciente-chevron {
    color: var(--av-text-muted);
    padding: 0 !important;
    background: transparent !important;
    border: none !important;
}
.badge-mascotas {
    display: flex;
    align-items: center;
    gap: 5px;
    font-size: var(--av-font-size);
    font-weight: 500;
    padding: 4px 10px;
    border-radius: 999px;
    background: var(--av-surface-soft);
    color: var(--av-accent-dark);
    white-space: nowrap;
}

.ficha-cliente-nombre {
    display: block;
    font-size: 15px;
    font-weight: 700;
    color: var(--av-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.ficha-mascota-chips {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin: 6px 0 16px;
}
.mascota-chip {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    border: 1px solid var(--av-border);
    border-radius: 999px;
    color: var(--av-text-muted);
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}
.mascota-chip.active {
    background: var(--av-accent);
    border-color: var(--av-accent);
    color: var(--av-text-inverse);
}
.mascota-chip-add {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 12px;
    border: 1px dashed var(--av-border);
    border-radius: 999px;
    color: var(--av-accent-dark);
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}

.ficha-tabs {
    display: flex;
    gap: 2px;
    flex-wrap: wrap;
    border-bottom: 1px solid var(--av-border);
    margin-bottom: 14px;
}
.ficha-tab {
    padding: 8px 10px;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--av-text-muted);
    text-decoration: none;
    cursor: pointer;
    border-bottom: 2px solid transparent;
    white-space: nowrap;
}
.ficha-tab.active {
    color: var(--av-accent-dark);
    border-bottom-color: var(--av-accent);
}

.ficha-datos-grilla {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
    flex: 1;
    min-width: 220px;
}
.ficha-dato-etiqueta {
    display: block;
    font-size: var(--av-font-size);
    color: var(--av-text-muted);
}
.ficha-dato-valor {
    display: block;
    font-size: 13px;
    font-weight: 600;
    color: var(--av-text);
    margin-top: 2px;
}

.fila-registro {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 0;
    border-bottom: 1px solid var(--av-surface-soft);
}
.fila-registro:last-child {
    border-bottom: none;
}
.fila-registro-fecha {
    display: block;
    width: 90px;
    flex-shrink: 0;
    font-size: 12.5px;
    color: var(--av-text-muted);
}
.fila-registro-detalle {
    display: block;
    flex: 1;
    min-width: 0;
    font-size: 13px;
    color: var(--av-text);
    overflow-wrap: break-word;
}
.badge-mini {
    font-size: 11px;
    font-weight: 500;
    padding: 2px 8px;
    border-radius: 999px;
    background: var(--av-surface-soft);
    color: var(--av-accent-dark);
    white-space: nowrap;
}
.badge-mini-exito {
    background: var(--av-success-bg);
    color: var(--av-success-text);
}

/* Foto de mascota: preview en el modal "Agregar mascota", y la
   propia foto mostrada en la pestana "Datos" de la ficha. */
.ficha-foto-preview {
    width: 64px;
    height: 64px;
    border-radius: 10px;
    object-fit: cover;
    border: 1px solid var(--av-border);
}
.ficha-foto-mascota {
    display: block;
    max-width: 160px;
    max-height: 160px;
    border-radius: 10px;
    object-fit: cover;
    border: 1px solid var(--av-border);
}

/* Fila que pone la foto a un lado y los datos al otro (pestana "Datos"
   de la ficha del paciente). flex-wrap para que en pantallas angostas
   la grilla de datos baje debajo de la foto en vez de aplastarse. */
.ficha-datos-fila {
    display: flex;
    align-items: flex-start;
    gap: 20px;
    flex-wrap: wrap;
}
.ficha-datos-columna-foto {
    flex-shrink: 0;
}

/* Campos dentro de una barra flexible (.agenda-toolbar) que antes
   tenian un ancho fijo en pixeles (width="320px"/"220px") -- eso
   desbordaba la pagina horizontalmente en pantallas angostas (el
   sidebar es "sticky", no "fixed", asi que un scroll horizontal de la
   pagina se lo lleva puesto visualmente, pareciendo que "desaparece").
   Con flex + max-width, el campo respeta el mismo ancho maximo en
   pantallas grandes pero puede achicarse en las angostas en vez de
   forzar el desborde. */
.buscador-flexible {
    flex: 1 1 auto;
    min-width: 0;
    max-width: 320px;
}

/* ---------------------------------------------------------------------
   16) CONSULTAS: secciones repetibles de diagnosticos, tratamientos,
   examenes de laboratorio y medicamentos de receta. Usadas dentro de
   PacientesComposer/Pacientes.zul (el modulo standalone de Consultas
   se elimino para no duplicar el mismo formulario en dos lugares).
   --------------------------------------------------------------------- */
.consulta-fila-repetible {
    background: var(--av-surface-soft);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius);
    padding: 10px;
    margin-bottom: 8px;
}
.consulta-fila-repetible-superior {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 6px;
}
.consulta-fila-repetible .z-textbox {
    margin-bottom: 6px;
}
.consulta-fila-repetible .z-textbox:last-child {
    margin-bottom: 0;
}
.consulta-fila-medicamento-datos {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 6px;
}

/* Placeholder clickeable para cuando la mascota no tiene foto todavia
   (pestana "Datos" de la ficha, y version chica en el modal de
   agregar/editar mascota). */
.foto-placeholder {
    width: 160px;
    height: 160px;
    flex-shrink: 0;
    border: 2px dashed var(--av-border);
    border-radius: 10px;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    background: var(--av-surface-soft);
    cursor: pointer;
}
.foto-placeholder:hover {
    background: var(--av-accent-soft);
    border-color: var(--av-accent);
}
.foto-placeholder-chico {
    width: 64px;
    height: 64px;
    border-radius: 8px;
    gap: 0;
}
.foto-placeholder-icono {
    color: var(--av-accent-dark);
    text-decoration: none;
}
.foto-placeholder-icono i {
    font-size: 26px !important;
    margin: 0 !important;
}
.foto-placeholder-chico .foto-placeholder-icono i {
    font-size: 20px !important;
}
.foto-placeholder-texto {
    display: block;
    font-size: var(--av-font-size);
    font-weight: 500;
    color: var(--av-accent-dark);
}

/* ---------------------------------------------------------------------
   17) LABORATORIO, CIRUGIAS, HOSPITALIZACION (modulos standalone)
   --------------------------------------------------------------------- */
.lab-icono-completado {
    background: var(--av-success-bg) !important;
}
.lab-icono-completado .cita-icono-boton {
    color: var(--av-success-text) !important;
}
.lab-icono-proceso {
    background: #faeeda !important;
}
.lab-icono-proceso .cita-icono-boton {
    color: #854f0b !important;
}
.lab-icono-cancelado {
    background: var(--av-surface-soft) !important;
}
.lab-icono-cancelado .cita-icono-boton {
    color: #64748b !important;
}
.lab-icono-solicitado {
    background: var(--av-danger-bg) !important;
}
.lab-icono-solicitado .cita-icono-boton {
    color: var(--av-danger-text) !important;
}

/* Fila de un parametro en el formulario de resultados de laboratorio */
.lab-fila-parametro {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 8px 10px;
}
/* Orden real en que Java arma los hijos: nombre, valor, ref.min,
   ref.max, indicador-auto, checkbox-manual, boton-eliminar. Se
   reacomodan en 3 filas claras en vez de una sola fila apretada. */
.lab-fila-parametro > *:nth-child(1) {
    grid-column: 1 / -1;
    grid-row: 1;
}
.lab-fila-parametro > *:nth-child(2) {
    grid-column: 1;
    grid-row: 2;
}
.lab-fila-parametro > *:nth-child(3) {
    grid-column: 2;
    grid-row: 2;
}
.lab-fila-parametro > *:nth-child(4) {
    grid-column: 3;
    grid-row: 2;
}
.lab-fila-parametro > *:nth-child(5) {
    grid-column: 1 / 3;
    grid-row: 3;
    align-self: center;
}
.lab-fila-parametro > *:nth-child(6) {
    grid-column: 2;
    grid-row: 3;
    justify-self: start;
    align-self: center;
}
.lab-fila-parametro > *:nth-child(7) {
    grid-column: 3;
    grid-row: 3;
    justify-self: end;
    align-self: center;
}
.lab-fila-parametro .z-textbox {
    height: 34px;
    width: 100% !important;
}
.lab-valor-fuera-rango {
    border-color: var(--av-danger-text) !important;
    background: var(--av-danger-bg);
}
.lab-indicador-auto {
    font-size: var(--av-font-size);
    font-weight: 500;
    color: var(--av-text-muted);
}
.lab-indicador-auto:empty::before {
    content: "Calculo automatico segun rango";
    font-size: 11px;
    font-style: italic;
    color: var(--av-text-muted);
    opacity: .6;
}

/* ---------------------------------------------------------------------
   18) CATALOGOS (paginas/Catalogos.zul): navegacion lateral + pills
   de especie para las categorias que dependen de ella (razas, tipos
   de sangre, vacunas)
   --------------------------------------------------------------------- */
.catalogo-grupo-titulo {
    display: block;
    padding: 0 16px 8px;
    font-size: 11px;
    font-weight: 600;
    color: var(--av-text-muted);
    text-transform: uppercase;
    letter-spacing: .03em;
}
.catalogo-titulo {
    display: block;
    font-size: 15px;
    font-weight: 600;
    color: var(--av-text);
}
.catalogo-subtitulo {
    display: block;
    font-size: var(--av-font-size);
    color: var(--av-text-muted);
    margin-top: 2px;
}
.catalogo-pill {
    display: inline-block;
    padding: 6px 14px;
    border-radius: 999px;
    background: var(--av-surface-soft);
    border: 1px solid var(--av-border);
    color: var(--av-text);
    font-size: 12.5px;
    cursor: pointer;
    text-decoration: none;
}
.catalogo-pill.active {
    background: var(--av-accent);
    border-color: var(--av-accent);
    color: #fff;
    font-weight: 500;
}

/* Selector de categoria para movil -- oculto en escritorio, donde se
   usa el sidebar normal. Ver bloque @media mas abajo para cuando se
   muestra y se resalta. */
.catalogo-selector-movil {
    display: none;
}
.catalogo-selector-movil-etiqueta {
    display: block;
    font-size: 11px;
    font-weight: 600;
    color: var(--av-accent-dark);
    text-transform: uppercase;
    letter-spacing: .03em;
    margin-bottom: 4px;
}

/* ===== Dashboard: metricas de negocio, grafico y paneles ===== */
.metric-value-warning {
    color: var(--av-warning-text, #d97706);
}

.metric-value-danger {
    color: var(--av-danger-text, #dc2626);
}

.grafico-barras {
    display: flex;
    align-items: flex-end;
    gap: 10px;
    height: 130px;
    padding-top: 8px;
}

.grafico-col {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    justify-content: flex-end;
}

.grafico-barra {
    width: 100%;
    background: color-mix(in srgb, var(--av-accent) 20%, transparent);
    border-radius: 4px 4px 0 0;
    min-height: 4px;
    transition: height .2s ease;
}

.grafico-barra-hoy {
    background: var(--av-accent, #319aba);
}

.grafico-etiqueta {
    font-size: 11px;
    color: var(--av-text-muted);
}

.dashboard-paneles {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 12px;
}

.dashboard-panel-fila {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 6px 0;
    border-bottom: .5px solid var(--av-border);
    font-size: 13px;
}

.dashboard-panel-fila:last-child {
    border-bottom: none;
}

.dashboard-panel-texto {
    color: var(--av-text);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    padding-right: 8px;
}

.dashboard-panel-monto {
    font-weight: 600;
    white-space: nowrap;
}

.dashboard-panel-monto-danger {
    font-weight: 600;
    color: var(--av-danger-text, #dc2626);
    white-space: nowrap;
}

.dashboard-panel-vacio {
    font-size: 12.5px;
    color: var(--av-text-muted);
    padding: 8px 0;
}

@media (max-width: 640px) {

    /* En movil, alinear el login/registro ARRIBA en vez de al centro:
       un formulario largo como el registro no cabe centrado y sus
       extremos quedaban fuera de pantalla. Con flex-start + el
       overflow-y:auto de .login-page, se puede scrollear completo. */
    .login-page {
        align-items: flex-start;
        padding: 16px;
    }

    .dashboard-paneles {
        grid-template-columns: 1fr;
    }

    .modal-overlay {
        align-items: flex-end;
        padding: 0;
    }
    .modal-sheet {
        width: 100% !important;
        max-width: 100% !important;
        min-width: 0 !important;
        border-radius: 18px 18px 0 0 !important;
        max-height: 85vh;
    }
    .z-window {
        padding: 0px;
    }
    .z-window-content {
        padding: 10px !important;
    }
    .toolbar {
        flex-wrap: wrap;
    }
    .listado-header,
    .z-listbox-header, .z-listbox .z-listheader, .z-listheader {
        font-size: 11px !important;
        padding: 6px 8px !important;
    }
    .z-listbox .z-listcell {
        font-size: 12px !important;
        padding: 6px 8px !important;
    }
    .app-topbar {
        padding: 10px 12px;
        gap: 8px;
    }
    .topbar-clinic-group {
        flex: 1;
        min-width: 0;
    }
    .topbar-titulo {
        font-size: 13px;
    }
    .topbar-icon {
        font-size: 11px;
    }
    .topbar-icon i {
        font-size: 13px !important;
    }
    .avatar-icono {
        width: 28px;
        height: 28px;
        font-size: 11px;
        flex-shrink: 0;
    }
    .app-shell {
        padding: 1px;
    }
    .app-sidebar {
        position: fixed;
        top: 0;
        left: 0;
        bottom: 0;
        z-index: 1100;
        width: 240px;
        height: 100vh;
        border-radius: 0;
        transform: translateX(-100%);
        transition: transform .2s ease;
        box-shadow: var(--av-shadow);
        overflow-y: auto;
    }
    .app-sidebar.mobile-open {
        transform: translateX(0);
    }
    .mobile-menu-toggle {
        display: inline-flex !important;
    }
    .sidebar-backdrop {
        display: none;
        position: fixed;
        inset: 0;
        background: rgba(17, 24, 39, .35);
        z-index: 1050;
    }
    .sidebar-backdrop.visible {
        display: block;
    }
    .metric-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    }

    /* ---------------------------------------------------------------
       OPCION A: filas de listado apiladas verticalmente en movil.
       Afecta a los 8 modulos por igual porque todos comparten estas
       mismas clases (.cita-row, .agenda-toolbar) -- un solo arreglo
       aca corrige Agenda, Pacientes, Vacunas, Desparasitaciones,
       Consultas (dentro de la ficha), Laboratorio, Cirugias e
       Hospitalizacion a la vez, sin tocar ningun composer Java.

       Regla general: el icono + la info (nombre/detalle) se quedan
       juntos en la primera linea; CUALQUIER OTRA cosa (hora, badge,
       botones de accion, .cita-acciones) pasa a ocupar su propia
       linea completa debajo, en vez de competir por el mismo ancho
       horizontal y forzar el texto a envolverse en 3-4 lineas.
       --------------------------------------------------------------- */
    .agenda-toolbar {
        flex-direction: column;
        align-items: stretch;
    }
    .agenda-toolbar > * {
        width: 100% !important;
        max-width: none !important;
    }
    .agenda-toolbar .buscador-flexible {
        flex: none !important;
    }
    .topbar-spacer {
        display: none;
    }

    .cita-row {
        flex-wrap: wrap;
        row-gap: 8px;
        padding: 12px;
    }
    .cita-row > .cita-hora {
        order: -1;
        width: auto;
        flex: 1 1 100%;
    }
    .cita-row > .cita-icono {
        flex: 0 0 auto;
    }
    .cita-row > .cita-info {
        flex: 1 1 auto;
        min-width: 0;
    }
    .cita-nombre, .cita-detalle, .cita-contacto {
        white-space: normal;
    }
    .cita-row > .badge,
    .cita-row > .cita-acciones,
    .cita-row > a.btn-primary,
    .cita-row > a.btn-secondary {
        flex: 1 1 100%;
        margin-top: 2px;
    }
    .cita-row > a.btn-primary,
    .cita-row > a.btn-secondary {
        text-align: center;
        display: block;
        box-sizing: border-box;
    }
    .cita-row > .cita-acciones {
        gap: 8px;
    }
    .cita-row > .cita-acciones > a {
        flex: 1;
        text-align: center;
    }
    /* La flechita de "ver detalle" (Consultas/Recetas) no necesita
       linea propia -- se queda compacta al final de donde caiga. */
    .cita-row > .paciente-chevron {
        flex: 0 0 auto;
        margin-left: auto;
    }

    /* Catalogos en movil: el sidebar de dos columnas no cabe, se
       reemplaza por el combobox resaltado de arriba. */
    .catalogo-sidebar-escritorio {
        display: none;
    }
    .catalogo-selector-movil {
        display: block;
        margin-bottom: 12px;
    }
    .catalogo-selector-movil-combo .z-combobox-input {
        border: 2px solid var(--av-accent) !important;
        background: var(--av-surface-soft) !important;
        color: var(--av-accent-dark) !important;
        font-weight: 600 !important;
        height: 42px !important;
    }

    /* Ficha de paciente (Pacientes.zul): en movil "Editar cliente" baja
       a su propia linea completa, para dejarle todo el ancho al nombre
       del cliente. En escritorio se queda inline junto al nombre, como
       siempre -- este bloque solo aplica bajo el breakpoint movil. */
    .ficha-cliente-header {
        flex-wrap: wrap;
        row-gap: 8px;
    }
    .ficha-cliente-header > .ficha-btn-editar {
        flex: 1 1 100%;
        margin-top: 4px;
        text-align: center;
        box-sizing: border-box;
    }
}

/* ---------------------------------------------------------------------
   19) RECETA IMPRIMIBLE (paginas/Recetas.zul): oculta en pantalla,
   se muestra sola bajo @media print. El boton "Imprimir" llama a
   window.print() -- el navegador hace el trabajo, no se genera un
   PDF en el servidor.
   --------------------------------------------------------------------- */
.receta-imprimible {
    display: none;
}
.receta-imprimible-encabezado {
    text-align: center;
    margin-bottom: 16px;
    padding-bottom: 12px;
    border-bottom: 2px solid #111;
}
.receta-imprimible-clinica {
    display: block;
    font-size: 18px;
    font-weight: 600;
    color: #111;
}
.receta-imprimible-direccion {
    display: block;
    font-size: var(--av-font-size);
    color: #444;
    margin-top: 2px;
}
.receta-imprimible-titulo {
    display: block;
    text-align: center;
    font-size: 15px;
    font-weight: 600;
    color: #111;
    text-transform: uppercase;
    letter-spacing: .05em;
    margin-bottom: 14px;
}
.receta-imprimible-linea {
    display: flex;
    gap: 6px;
    font-size: 13px;
    color: #111;
    padding: 3px 0;
}
.receta-imprimible-etiqueta {
    font-weight: 600;
    min-width: 140px;
}
.receta-imprimible-subtitulo {
    display: block;
    font-size: 13px;
    font-weight: 600;
    color: #111;
    text-transform: uppercase;
    letter-spacing: .03em;
    margin-top: 16px;
    margin-bottom: 8px;
    border-top: 1px solid #999;
    padding-top: 10px;
}
.receta-imprimible-medicamento {
    padding: 6px 0;
    border-bottom: 1px dashed #ccc;
}
.receta-imprimible-medicamento-nombre {
    display: block;
    font-size: 13.5px;
    font-weight: 600;
    color: #111;
}
.receta-imprimible-medicamento-detalle {
    display: block;
    font-size: 12.5px;
    color: #333;
    margin-top: 2px;
}
.receta-imprimible-firma {
    margin-top: 48px;
    text-align: center;
    font-size: 13px;
    color: #111;
}

@media print {
    body * {
        visibility: hidden;
    }
    .receta-imprimible, .receta-imprimible * {
        visibility: visible;
    }
    .receta-imprimible {
        display: block !important;
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        padding: 20px;
        box-sizing: border-box;
    }
}

/* ---------------------------------------------------------------------
   20) MATRIZ DE PERMISOS (paginas/Usuarios.zul, pestana "Roles y
   permisos"): una fila por permiso, una columna por rol.
   --------------------------------------------------------------------- */
.permiso-fila {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 10px 4px;
    border-bottom: 1px solid var(--av-border);
}
.permiso-fila:last-child {
    border-bottom: none;
}
.permiso-fila-nombre {
    font-size: 13px;
    color: var(--av-text);
    flex: 1;
    min-width: 0;
}
.permiso-fila-roles {
    display: flex;
    gap: 20px;
    flex-shrink: 0;
}
.permiso-fila-columna {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 4px;
    min-width: 64px;
}
.permiso-fila-columna-etiqueta {
    font-size: 10px;
    color: var(--av-text-muted);
    text-align: center;
}

/* ---------------------------------------------------------------------
   21) LINEAS DE PRODUCTO/SERVICIO (paginas/Facturas.zul): una fila
   por linea de factura -- producto, cantidad, precio, descuento,
   total calculado, boton eliminar.
   --------------------------------------------------------------------- */
.factura-linea-fila {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 10px;
    background: var(--av-surface-soft);
    border: 1px solid var(--av-border);
    border-radius: var(--av-radius);
    margin-bottom: 8px;
}
.factura-linea-fila > .z-combobox {
    width: 100%;
}
.factura-linea-campos-numericos {
    display: flex;
    align-items: flex-end;
    gap: 6px;
}
.factura-linea-campo {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1;
    min-width: 0;
}
.factura-linea-campo-etiqueta {
    font-size: 9.5px;
    font-weight: 600;
    color: var(--av-text-muted);
    text-transform: uppercase;
    letter-spacing: .02em;
}
.factura-linea-campo > .z-textbox {
    width: 100%;
}
.factura-linea-campo-valor-total {
    font-size: 12.5px;
    font-weight: 600;
    color: var(--av-text);
    height: 30px;
    display: flex;
    align-items: center;
}
.factura-linea-campos-numericos > a {
    flex: 0 0 auto;
    align-self: flex-end;
}


/* ---------------------------------------------------------------------
   22) LISTADO DE FACTURAS (paginas/Facturas.zul): mismo patron
   .cita-row que el resto del proyecto (icono con iniciales, 2 lineas,
   monto total + saldo, badge de estado, acciones) -- ya es
   responsive de por si, no necesita un bloque @media aparte.
   --------------------------------------------------------------------- */
.factura-fila-montos {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    flex-shrink: 0;
    margin-right: 8px;
}
.factura-fila-total {
    font-size: 14px;
    font-weight: 600;
    color: var(--av-text);
}
.factura-fila-saldo {
    font-size: 11.5px;
    color: var(--av-text-muted);
    margin-top: 2px;
}

/* ===== Indicador de carga de ZK (z-loading) personalizado ===== */
.z-loading {
    background: #ffffff !important;
    border: 1px solid #cccccc !important;
    border-radius: 4px;
    box-shadow: 0px 2px 8px rgba(0, 0, 0, 0.15);
    padding: 10px 20px !important;
}
.z-loading-icon {
    background-size: contain;
    width: 32px;
    height: 32px;
    background-image: url(../images/patitas.gif) !important;
    width: 55px !important;
    height: 55px !important;
}
.z-loading {
    font-family: Arial,Sans-serif;
    font-size: 18px;
    font-weight: normal;padding: 0px !important;
}
.z-loading, .z-apply-loading {
    border: 1px solid #FFF;
    padding: 3px;
    background: #FFF;
    position: absolute;
    cursor: wait;
    white-space: nowrap;
}
.z-loading-indicator {
    padding: 16px;
}
.z-loading-indicator, .z-apply-loading-indicator {
    display: grid;
    color: #e9e2e2;
    border: 0px solid #e9E9E9;
    background: #FFF;
    white-space: nowrap;
    border-radius: 0.5rem;
    place-items: center;
    font-size:12px;
    padding: 10px !important;
    /* padding: 35px; */
}
.z-loading, .z-apply-loading {
    border: 1px solid #FFF;
    padding: 3px;
    background: #Fff;
    position: absolute;
    cursor: wait;
    white-space: nowrap;
    border-radius: 0.5rem;
}
.z-a:visited{
    color: var(--av-text) !important;
}

/* ===== Modal de aviso de suscripcion por vencer / vencida ===== */
.aviso-suscripcion-sheet {
    width: 420px;
    max-width: 92vw;
    text-align: center;
    padding: 32px 28px;
}
.aviso-suscripcion-icono {
    font-size: 44px;
    color: var(--av-warning-text, #D97706);
    display: block;
    margin-bottom: 12px;
}
.aviso-suscripcion-icono-critico {
    color: var(--av-danger-text, #DC2626);
}
.aviso-suscripcion-titulo {
    display: block;
    font-size: 19px;
    font-weight: 700;
    color: var(--av-text);
    margin-bottom: 10px;
}
.aviso-suscripcion-mensaje {
    display: block;
    font-size: 14.5px;
    color: var(--av-text-muted);
    line-height: 1.6;
    margin-bottom: 22px;
}
.aviso-suscripcion-boton {
    display: inline-block;
    padding: 10px 28px;
}

/* ===== Pantallas de POCA ALTURA (no de ancho) =====
   Mismo problema que el flex-start de arriba, pero disparado por
   ALTO en vez de ancho: en una ventana ancha pero baja (ej. laptop
   con poca resolucion vertical, navegador achicado, modo landscape),
   align-items:center puede dejar el boton de guardar/crear cuenta
   fuera de la vista incluso con overflow-y:auto -- centrar contenido
   que desborda tiene un comportamiento inconsistente en varios
   navegadores. Alineando arriba en pantallas bajas, el formulario
   completo (incluido el boton final) siempre queda alcanzable con
   scroll normal. Independiente de la media query de ancho de arriba:
   una pantalla puede ser ancha Y baja a la vez. */
@media (max-height: 700px) {
    .login-page {
        align-items: flex-start;
        padding-top: 14px;
    }
}
