/* =====================================================================
   zv-icons.css  --  Kit UI PaskayMind, iconografia propia
   Migracion a Dinamica, fase F1. Guia: 04-guia-design-system-zolvia §7.5 (K6).
   ---------------------------------------------------------------------
   POR QUE EXISTE ESTE ARCHIVO. Font Awesome queda FUERA de PaskayMind en
   cualquiera de sus formas (decision K6 / ADR-0004). Retirar la hoja sin
   sustituir los usos deja el boton PRESENTE PERO VACIO, y eso no lo detecta
   ningun test funcional: el elemento existe y el clic sigue funcionando.
   Los mismos 10 Glyphicons heredados del canonico ya estaban en ese estado
   -- ningun @font-face los declaraba desde que se excluyo bootstrap.min_30.css.

   LOS 3 FRENTES DE K6 Y DONDE SE RESUELVE CADA UNO:
     Frente 1  markup de plantillas ..... <svg> inline, en el propio .htm
     Frente 2  pseudo-elementos CSS ..... ESTE ARCHIVO, data: URI
     Frente 3  inyeccion en runtime ..... NO EXISTE en este webapp. V13 leyo
               dinamica.js completo (2642 lineas): no inyecta ninguna clase
               fa-; su unica referencia a iconografia es un querySelectorAll
               que LEE iconos ya presentes en el markup.

   REGLA DE ENCODING DEL DATA-URI (K5): el SVG del data: URI se escribe SOLO
   EN ASCII y con `#` escapado como `%23`. Un `#` crudo dentro de un url()
   corta el data-URI en Firefox -- lo interpreta como fragmento -- y el icono
   desaparece sin error de consola.
   ===================================================================== */

/* ---------------------------------------------------------------------
   Utilidades de tamanio para los <svg> inline del frente 1.
   Sustituyen a los modificadores de tamanio de la libreria retirada, que no
   eran glifos sino escalas.
   --------------------------------------------------------------------- */
.zv-ico {
  width: 16px; height: 16px;
  flex: 0 0 auto;
  display: inline-block;
  vertical-align: -.14em;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.zv-ico--sm { width: 13px; height: 13px; }
.zv-ico--lg { width: 20px; height: 20px; }
.zv-ico--xl { width: 26px; height: 26px; }
/* Variante rellena para los iconos que se dibujan con `fill` (caret, etc). */
.zv-ico--fill { fill: currentColor; stroke: none; }

/* ---------------------------------------------------------------------
   El SPRITE. Cada documento lo lleva inline justo despues del <body>
   (fase B3): un <svg> oculto con un <symbol id="zv-ico-*"> por dibujo, y en
   el markup queda <svg class="zv-ico"><use href="#zv-ico-editar"/></svg>.

   POR QUE HAY QUE ESCONDERLO A MANO. Los <symbol> no se pintan solos, pero
   el <svg> que los contiene SI es un elemento en linea: sin sacarlo del
   flujo crea una caja de linea al principio del <body> y corre la pagina
   entera unos pixeles hacia abajo. Va absoluto y a cero -- y no
   `display:none` -- porque asi ninguna pantalla cambia de layout por llevar
   el sprite, y el propio markup repite width="0" height="0" como atributo
   por si esta hoja no cargo.

   Esta regla compite contra el reset de elemento, asi que tiene que vivir
   FUERA de @layer (puente §7.1). zv-icons.css entera lo esta.
   --------------------------------------------------------------------- */
.zv-sprite {
  position: absolute;
  width: 0; height: 0;
  overflow: hidden;
}

/* ---------------------------------------------------------------------
   FRENTE 2 -- pseudo-elementos.
   Bootstrap 5 ya dibuja .btn-close con un data-URI propio, en negro puro.
   Se re-colorea a tinta ciruela para que no desentone con la paleta.
   --------------------------------------------------------------------- */
.zv-app .btn-close {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23241F35'%3E%3Cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3E%3C/svg%3E");
  opacity: .65;
  transition: opacity var(--t);
}
.zv-app .btn-close:hover { opacity: 1; }
.zv-app .btn-close:focus-visible { box-shadow: var(--ring); opacity: 1; }

/* ---------------------------------------------------------------------
   Spinner de espera.
   Reemplaza a las dos animaciones locales del canonico que llevaban nombre
   prestado de librerias que ya no estan. Las dos estaban definidas dentro de
   bootstrap.helper.css, o sea que eran CSS propio: lo prestado era solo el
   nombre. Se renombran por dos motivos -- el candado assets-inventario
   audita TEXTO y una clase propia con prefijo ajeno lo pone rojo igual, y
   nombrar algo por una libreria ausente desorienta al siguiente lector.
   --------------------------------------------------------------------- */
.zv-spin-custom {
  display: inline-block;
  animation: zv-icon-rotate 1.1s linear infinite;
}
@keyframes zv-icon-rotate { to { transform: rotate(360deg) } }

@media (prefers-reduced-motion: reduce) {
  .zv-spin-custom { animation-duration: 3s; }
}

/* ---------------------------------------------------------------------
   Controles de paginacion e iconografia de grid.
   El markup lleva el <svg> inline (frente 1); aca solo el encuadre para
   que el boton no colapse cuando el svg es el unico hijo.
   --------------------------------------------------------------------- */
.zv-app .btn .zv-ico { pointer-events: none; }
.zv-app .btn-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-width: 34px;
}

/* Envoltorio de un icono que ES el control (lleva el onclick y el title).
   Sustituye al <span class="glyphicon ..."> del canonico, que era a la vez
   caja del glifo y boton. Se conserva la forma para no tocar el JS que los
   busca por id. */
.zv-ico-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: inherit;
  line-height: 1;
}
.zv-ico-btn[onclick] { cursor: pointer; }
.zv-ico-btn[onclick]:hover { color: var(--primary, #3A4199); }

/* Cuando el control ES un boton de verdad (<button class="zv-ico-btn">) hay
   que apagarle el cromo que el navegador le pinta por defecto -- borde, fondo
   y padding -- o deja de verse como un icono. Se pasaron a <button> los
   controles solo-icono del pager y de las cabeceras: un <span> con onclick no
   recibe foco de teclado, asi que ni se podia tabular hasta el ni tenia foco
   visible. El :focus-visible es la otra mitad de eso. */
button.zv-ico-btn {
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  color: inherit;
}
button.zv-ico-btn:focus-visible {
  outline: 2px solid var(--primary, #3A4199);
  outline-offset: 2px;
  border-radius: 4px;
}

/* Acciones de una ficha separadas por CONSECUENCIA y no por orden de lectura:
   lo habitual a la izquierda, lo que no se deshace detras de una linea. Nace
   del detalle de cita, donde "Cancelar cita" quedaba pegado a "Registrar
   cobro" -- dos botones contiguos con efectos opuestos. */
.zv-acciones-cita {
  display: flex; flex-wrap: wrap; align-items: center;
  justify-content: space-between; gap: var(--sp-4, 16px);
  margin-top: var(--sp-4, 16px);
}
.zv-acciones-cita-ppal,
.zv-acciones-cita-riesgo { display: flex; flex-wrap: wrap; gap: var(--sp-2, 8px); }
.zv-acciones-cita-riesgo {
  padding-left: var(--sp-4, 16px);
  border-left: 1px solid var(--border, #E1E2EE);
}
@media (max-width: 640px) {
  /* En angosto una linea vertical no separa nada: pasa a horizontal y el grupo
     de riesgo baja completo. */
  .zv-acciones-cita-riesgo {
    width: 100%; padding-left: 0; padding-top: var(--sp-3, 12px);
    border-left: 0; border-top: 1px solid var(--border, #E1E2EE);
  }
}

/* =====================================================================
   FRENTE 2 -- iconos que llegan como DATO, no como markup.
   El menu del framework renderiza <i class="${fld:icon}">: el nombre de la
   clase viaja desde el SQL (o desde security.s_menu_item.icon). Ahi no se
   puede inyectar un <svg>, asi que el icono se dibuja de fondo sobre la
   caja del <i>. Es el unico caso del webapp que necesita esta via.
   ===================================================================== */
.zv-ico-menu,
.zv-ico-caret {
  display: inline-block;
  width: 16px; height: 16px;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
  vertical-align: -.16em;
}

/* Flecha por defecto de un item de menu sin icono propio. */
.zv-ico-menu {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23625A78' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3Cpath d='M12 5l7 7-7 7'/%3E%3C/svg%3E");
}
/* Sobre el sidebar oscuro el trazo ciruela no se ve: se aclara. */
.zv-sidebar .zv-ico-menu,
.menuBody .zv-ico-menu {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23A79FBF' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12h14'/%3E%3Cpath d='M12 5l7 7-7 7'/%3E%3C/svg%3E");
}

/* Caret de grupo colapsable del menu. */
.zv-ico-caret {
  width: 14px; height: 14px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23625A78'%3E%3Cpath d='M12 16l-5-8h10z'/%3E%3C/svg%3E");
  transition: transform .25s;
}
.active > .zv-ico-caret,
.menuTitle.active::after { transform: rotate(180deg); }

/* La flecha indicadora del menu alternativo se dibuja por ::after: la caja
   la declara la propia plantilla, el dibujo sale de aca. */
.menuTitle::after {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23625A78'%3E%3Cpath d='M12 16l-5-8h10z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
}
