/* Sistema visual de la casa (tokens --rv-* y componentes rv-*).
   Sale de includes/estilos_nf.php (03/09/2026): estaba incrustado en cada pantalla que
   lo pinta. En fichero lo guarda el navegador y deja de viajar en cada
   página. NO editar el PHP para volver a incrustarlo. */
/* ==== Reservas — guía estética (misma que Servicios v2) ==== */
:root {
    --rv-primary: #2E86AB;
    --rv-primary-dark: #236B8E;
    --rv-primary-tint: #EAF4F8;
    --rv-bg: #F5F6F8;
    --rv-card: #FFFFFF;
    --rv-border: #E8EBEE;
    --rv-border-soft: #F0F2F4;
    --rv-text: #1C2634;
    --rv-secondary: #4A5866;
    --rv-muted: #5F6E7C;      /* atenuado con contraste AA (~4.8:1 sobre blanco) */
    --rv-ok: #227952;
    --rv-ok-tint: #EAF6F0;
    --rv-warn: #9A6B00;
    --rv-warn-tint: #FFF4DB;
    /* Ámbar para TEXTO PEQUEÑO sobre el tinte: --rv-warn da 4,29:1 sobre
       --rv-warn-tint y AA pide 4,5:1 — este da 5,17:1 (medido). Nació como
       literal en la rejilla de Asignación y se sube a token para que la
       siguiente pantalla no repita el dilema. */
    --rv-warn-strong: #8A5F00;
    --rv-danger: #C03A3A;
    --rv-danger-tint: #FDEDED;
    --rv-info: #0E6E8C;
    --rv-info-tint: #E0F3F8;
    --rv-radius: 14px;
    --rv-radius-sm: 8px;
    --rv-shadow: 0 10px 30px rgba(16, 30, 46, 0.08);
    --rv-font: 'Outfit', system-ui, -apple-system, sans-serif;
    --rv-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, monospace;

    /* Colores por TIPO de servicio (despacho: Sábana, Asignación, Historial).
       FUENTE ÚNICA: existían tres juegos casi iguales —bloques de la Sábana,
       filas de Asignación y pastillas del Historial, más una copia en JS— y
       ajustar un tono obligaba a acordarse de cuatro sitios. Dos niveles por
       tipo, deliberados: -bg (tinte FUERTE, para bloques y pastillas pequeñas)
       y -bg2 (tinte SUAVE, para el fondo de una fila entera, que a plena
       intensidad cansa). UN solo texto por tipo, medido AA sobre los dos
       fondos (4,6–10:1). */
    --rv-srv-lle-bg: #EEF4DB; --rv-srv-lle-bg2: #F5F9E7; --rv-srv-lle-tx: #4D6509;
    --rv-srv-sal-bg: #FBD9DF; --rv-srv-sal-bg2: #FDF0F2; --rv-srv-sal-tx: #7D0018;
    --rv-srv-exc-bg: #FEF5DA; --rv-srv-exc-bg2: #FEF9E8; --rv-srv-exc-tx: #8A6703;
    --rv-srv-dis-bg: #DEEFF2; --rv-srv-dis-bg2: #EDF6F8; --rv-srv-dis-tx: #13505C;
    --rv-srv-vip-bg: #E8E7F3; --rv-srv-vip-bg2: #F1F0F8; --rv-srv-vip-tx: #38355F;
    --rv-srv-otro-bg: #EEF1F4; --rv-srv-otro-bg2: #F4F6F8; --rv-srv-otro-tx: #5F6E7C;
}
/* Ancho de página: UNO SOLO para todo el programa (29/09/2026, petición del
   propietario: «cada pantalla tiene un ancho diferente»). Hasta ese día había
   tres —1600px centrados, ancho completo y 960px centrados— y al saltar de
   una pantalla a otra el título cambiaba de sitio. Ahora toda pantalla ocupa
   el ancho de la ventana con el mismo margen, y el título arranca siempre en
   el mismo punto.

   El width:100% NO es decorativo y no se puede quitar: el <body> es un
   contenedor flex en columna (includes/header.php, para anclar el pie abajo) y
   .rv-page es un hijo directo suyo. Sin un ancho definido la página se
   dimensiona a su contenido: el ancho pasaba a depender de lo ancha que fuera
   la tabla (en Pagos, la web se encogía a cada tecla del buscador). */
.rv-page { font-family: var(--rv-font); color: var(--rv-text); background: var(--rv-bg); min-height: 80vh; padding: 24px; width: 100%; max-width: none; margin-left: auto; margin-right: auto; }
/* rv-page-full ya es lo normal; se conserva la clase para no tocar las
   pantallas que la llevan. */
.rv-page.rv-page-full { max-width: none; }
/* rv-page-form: formulario de una columna. La PÁGINA mide lo mismo que las
   demás (el título no se mueve) y solo el contenido se queda en 960px,
   pegado a la izquierda: estirar las etiquetas a toda la ventana solo separa
   cada texto de su campo. Se hace con el relleno derecho y no con un tope en
   los hijos para no tocar las ventanas (position:fixed) que cuelgan de la
   página. */
.rv-page.rv-page-form { padding-right: max(24px, calc(100% - 984px)); }
@media (max-width: 768px) { .rv-page.rv-page-form { padding-right: 14px; } }
/* Formulario de una columna dentro de una página que no es rv-page-form. */
.rv-cuerpo-form { max-width: 960px; }
.rv-page h1, .rv-page h2, .rv-page h3, .rv-page h4, .rv-page h5 { font-family: var(--rv-font); }
.rv-page input, .rv-page select, .rv-page button, .rv-page textarea { font-family: inherit; }
.rv-mono { font-family: var(--rv-mono); }
.rv-muted { color: var(--rv-muted); }
/* Texto SOLO para lectores de pantalla: lo que un icono, una barra o una fila
   de estrellas dicen a la vista y a nadie más. No es display:none, que lo
   escondería también de ellos — se saca de la vista conservándolo en el árbol
   del documento. */
.rv-sr { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }

.rv-header { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; margin-bottom: 20px; }
.rv-header h1 { font-size: 1.45rem; font-weight: 700; margin: 0; letter-spacing: -0.01em; }
.rv-header .rv-subtitle { color: var(--rv-muted); font-size: 0.85rem; margin-top: 2px; }
/* Volver: icono a la derecha de la cabecera. De texto competía con el título,
   que es lo que hay que leer. Área de 38px para el dedo y el nombre dentro en
   .rv-sr — un title no lo anuncia ningún lector de pantalla. */
/* Vale también en un <button> (imprimir, junto a la vuelta): de ahí el
   cursor y el font, que un botón no hereda. */
.rv-volver { display: inline-flex; align-items: center; justify-content: center; width: 38px; height: 38px; flex: none;
             border: 1px solid var(--rv-border); border-radius: 10px; background: #fff; color: var(--rv-muted); text-decoration: none;
             font: inherit; cursor: pointer; }
.rv-volver:hover { background: var(--rv-primary-tint); border-color: var(--rv-primary); color: var(--rv-primary-dark); }
.rv-volver:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 2px; }

/* CABECERA COMÚN (29/09/2026): la de todas las pantallas —título con el icono
   en una pastilla del color de la casa, explicación con medida de lectura,
   acciones a la derecha—. Nació para las pantallas de una SECCIÓN (RRHH,
   Portal del empleado, Candidaturas, Variables) y se extendió al resto del
   menú. Cubre también la cabecera heredada .chf-header de las pantallas de
   personal (assets/css/personal.css). Los !important del icono son a
   propósito: muchas cabeceras traen el icono con un color y un margen en
   línea (style="color:…", me-2) de cuando cada pantalla lo decidía sola. */
:is(.rv-page, .chf-page) :is(.rv-header, .chf-header) { align-items: flex-end; gap: 12px 24px; margin-bottom: 22px; }
:is(.rv-page, .chf-page) :is(.rv-header, .chf-header) > div:first-child { flex: 1 1 520px; min-width: 0; }
:is(.rv-page, .chf-page) :is(.rv-header, .chf-header) h1 { display: flex; align-items: center; gap: 10px; font-size: 1.5rem; font-weight: 700; letter-spacing: -.015em; line-height: 1.2; margin: 0; overflow-wrap: anywhere; }
:is(.rv-page, .chf-page) :is(.rv-header, .chf-header) h1 > i:first-child { display: inline-grid; place-items: center; width: 36px; height: 36px; flex: none; border-radius: 10px; background: var(--rv-primary-tint); color: var(--rv-primary-dark) !important; font-size: 1rem; margin: 0 !important; }
:is(.rv-page, .chf-page) :is(.rv-header, .chf-header) :is(.rv-subtitle, .chf-subtitle) { max-width: 92ch; margin: 6px 0 0; color: var(--rv-muted); font-size: .86rem; line-height: 1.5; text-wrap: pretty; }
:is(.rv-page, .chf-page) :is(.rv-header, .chf-header) > div:last-child:not(:first-child) { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }
@media (max-width: 640px) { :is(.rv-page, .chf-page) :is(.rv-header, .chf-header) { flex-direction: column; align-items: stretch; } :is(.rv-page, .chf-page) :is(.rv-header, .chf-header) > div:first-child { flex: none; } :is(.rv-page, .chf-page) :is(.rv-header, .chf-header) h1 { font-size: 1.3rem; } }

/* Barra de la SECCIÓN (primer nivel). Una caja blanca con las pestañas; la
   activa en tinte. Si no caben, primero se quitan los iconos (el texto ya dice
   qué es cada una) y después bajan de línea: nunca desplazamiento lateral. */
.rv-secnav { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; margin: 0 0 18px; padding: 6px; background: #fff; border: 1px solid var(--rv-border); border-radius: 12px; }
.rv-secnav a { display: inline-flex; align-items: center; gap: 7px; padding: 8px 11px; border-radius: 8px; font-weight: 600; font-size: .86rem; color: var(--rv-muted); text-decoration: none; white-space: nowrap; }
.rv-secnav a i { font-size: .85rem; }
.rv-secnav a.on { background: var(--rv-primary-tint); color: var(--rv-primary-dark); }
.rv-secnav a:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 1px; }
@media (hover: hover) and (pointer: fine) { .rv-secnav a:not(.on):hover { background: #F3F5F8; color: var(--rv-text); } }
@media (max-width: 1180px) { .rv-secnav a { padding: 7px 10px; font-size: .84rem; } .rv-secnav a i { display: none; } }

/* TABLAS APILADAS (29/09/2026, a todo el programa el mismo día): una tabla
   nunca obliga a desplazarse de lado. Por debajo de 640px —y a cualquier
   ancho en cuanto no cabe— cada fila pasa a ser una ficha, con cada dato en
   su renglón y el nombre de su columna delante. Bajar es mejor que ir de
   lado (regla del propietario): de lado se pierde de vista de quién es cada
   dato.
   Lo decide assets/js/nf-tabla-movil.js, que marca el envoltorio de cada
   tabla de pantalla (.rv-table-wrap, .chf-table-wrap, .table-responsive o
   .rv-tabla-apila) con .rv-apila (se apila en el móvil) y, si además no cabe,
   con .rv-apilada (se apila ya); y pone a cada celda el nombre de su columna
   en data-label. Una rejilla de TRABAJO que tiene que seguir siendo rejilla
   (se escribe en ella con el teclado, se arrastra…) se excluye con
   data-nf-apilar="no" en su envoltorio. Las tablas de las ventanas (modales)
   no se tocan. */
@media (max-width: 640px) {
  .rv-apila { overflow-x: visible !important; max-height: none !important; border: 0; background: transparent; box-shadow: none; }
  .rv-apila > table { display: block; width: 100% !important; min-width: 0 !important; table-layout: auto !important; border: 0; margin: 0; }
  .rv-apila > table > thead { display: none; }
  .rv-apila > table > tbody { display: grid; gap: 8px; }
  .rv-apila > table > tfoot { display: block; }
  .rv-apila > table > tbody > tr { display: block; padding: 10px 12px; background: #fff !important; border: 1px solid var(--rv-border, #E4E8ED); border-radius: 10px; }
  .rv-apila > table > tbody > tr > td { display: grid; grid-template-columns: auto 1fr; column-gap: 12px; align-items: baseline; width: auto !important; max-width: none !important; padding: 3px 0 !important; border: 0 !important; text-align: right; white-space: normal !important; overflow-wrap: anywhere; background: transparent !important; position: static !important; }
  .rv-apila > table > tbody > tr > td::before { content: attr(data-label); grid-column: 1; grid-row: 1 / span 9; max-width: 42vw; text-align: left; font-size: .7rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--rv-muted, #5F6E7C); }
  .rv-apila > table > tbody > tr > td:is([data-rv-titulo], [data-label=""], :not([data-label])) { display: block; text-align: left; }
  .rv-apila > table > tbody > tr > td:is([data-rv-titulo], [data-label=""], :not([data-label])) > * { text-align: left; justify-self: start; }
  .rv-apila > table > tbody > tr > td:is([data-rv-titulo], [data-label=""], :not([data-label]))::before { display: none; }
  .rv-apila > table > tbody > tr > td[data-rv-titulo] { font-weight: 600; color: var(--rv-text, #1C2634); padding-bottom: 6px !important; }
  .rv-apila > table > tbody > tr > td[colspan] { display: block; text-align: center; }
  .rv-apila > table > tbody > tr > td > * { grid-column: 2; justify-self: end; text-align: right; max-width: 100%; }
  .rv-apila > table > tbody > tr > td:empty { display: none; }
}
.rv-apilada { overflow-x: visible !important; max-height: none !important; border: 0; background: transparent; box-shadow: none; }
.rv-apilada > table { display: block; width: 100% !important; min-width: 0 !important; table-layout: auto !important; border: 0; margin: 0; }
.rv-apilada > table > thead { display: none; }
.rv-apilada > table > tbody { display: grid; gap: 8px; }
.rv-apilada > table > tfoot { display: block; }
.rv-apilada > table > tbody > tr { display: block; padding: 10px 12px; background: #fff !important; border: 1px solid var(--rv-border, #E4E8ED); border-radius: 10px; }
.rv-apilada > table > tbody > tr > td { display: grid; grid-template-columns: auto 1fr; column-gap: 12px; align-items: baseline; width: auto !important; max-width: none !important; padding: 3px 0 !important; border: 0 !important; text-align: right; white-space: normal !important; overflow-wrap: anywhere; background: transparent !important; position: static !important; }
.rv-apilada > table > tbody > tr > td::before { content: attr(data-label); grid-column: 1; grid-row: 1 / span 9; max-width: 42vw; text-align: left; font-size: .7rem; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--rv-muted, #5F6E7C); }
.rv-apilada > table > tbody > tr > td:is([data-rv-titulo], [data-label=""], :not([data-label])) { display: block; text-align: left; }
.rv-apilada > table > tbody > tr > td:is([data-rv-titulo], [data-label=""], :not([data-label])) > * { text-align: left; justify-self: start; }
.rv-apilada > table > tbody > tr > td:is([data-rv-titulo], [data-label=""], :not([data-label]))::before { display: none; }
.rv-apilada > table > tbody > tr > td[data-rv-titulo] { font-weight: 600; color: var(--rv-text, #1C2634); padding-bottom: 6px !important; }
.rv-apilada > table > tbody > tr > td[colspan] { display: block; text-align: center; }
.rv-apilada > table > tbody > tr > td > * { grid-column: 2; justify-self: end; text-align: right; max-width: 100%; }
.rv-apilada > table > tbody > tr > td:empty { display: none; }
/* Un bloque de código o de texto preformateado tampoco empuja de lado: parte
   las líneas largas. */
:is(.rv-page, .chf-page) pre { white-space: pre-wrap; overflow-wrap: anywhere; }

/* Pestañas de SEGUNDO nivel dentro de una pantalla (Diario/Mensual,
   Pendientes/Resueltas, Nóminas/Distribuir…). Subrayado fino, sin caja: la
   caja la lleva el primer nivel (la barra de la sección) y dos cajas
   apiladas se leen como ruido. Si no caben, bajan de línea: nunca obligan a
   desplazarse de lado. Vale en <a> (aria-current / .on) y en <button role=tab>
   (aria-selected). El recuento va en .n, en mono. */
.rv-subtabs { display: flex; flex-wrap: wrap; gap: 2px 6px; border-bottom: 1px solid var(--rv-border); margin: 0 0 20px; }
.rv-subtabs > a, .rv-subtabs > button { display: inline-flex; align-items: center; gap: 8px; min-height: 42px; padding: 0 14px; margin-bottom: -1px; font: inherit; font-size: .88rem; font-weight: 600; color: var(--rv-muted); text-decoration: none; background: none; border: 0; border-bottom: 2px solid transparent; border-radius: 6px 6px 0 0; cursor: pointer; white-space: nowrap; transition: color .15s, border-color .15s, background-color .15s; }
.rv-subtabs > a i, .rv-subtabs > button i { font-size: .85em; opacity: .8; }
.rv-subtabs > a.on, .rv-subtabs > a[aria-current="page"], .rv-subtabs > button[aria-selected="true"] { color: var(--rv-primary-dark); border-bottom-color: var(--rv-primary); }
.rv-subtabs > a.on i, .rv-subtabs > a[aria-current="page"] i, .rv-subtabs > button[aria-selected="true"] i { opacity: 1; }
.rv-subtabs .n { font-family: var(--rv-mono); font-size: .72rem; font-weight: 600; line-height: 1; padding: 3px 7px; border-radius: 99px; background: #EEF1F4; color: var(--rv-muted); }
.rv-subtabs .n:empty { display: none; }
.rv-subtabs > .on .n, .rv-subtabs > [aria-current="page"] .n, .rv-subtabs > [aria-selected="true"] .n { background: var(--rv-primary-tint); color: var(--rv-primary-dark); }
.rv-subtabs > a:focus-visible, .rv-subtabs > button:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: -2px; }
@media (hover: hover) and (pointer: fine) { .rv-subtabs > a:hover, .rv-subtabs > button:hover { color: var(--rv-text); background: #F6F8FA; } }
.rv-breadcrumb { font-size: 0.78rem; color: var(--rv-muted); margin-bottom: 10px; }
.rv-breadcrumb a { color: var(--rv-primary); text-decoration: none; }
.rv-breadcrumb a:hover { text-decoration: underline; }

/* Stats */
.rv-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 20px; }
.rv-stat-card { background: var(--rv-card); border-radius: var(--rv-radius); padding: 14px 18px; box-shadow: var(--rv-shadow); border: 1px solid var(--rv-border); display: flex; align-items: center; gap: 12px; }
.rv-stat-ico { width: 38px; height: 38px; border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 0.95rem; flex-shrink: 0; }
.rv-stat-card .stat-label { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--rv-muted); font-weight: 600; }
.rv-stat-card .stat-value { font-size: 1.35rem; font-weight: 700; line-height: 1.1; font-family: var(--rv-mono); color: var(--rv-text); }
.rv-stat-card .stat-sub { font-size: 0.7rem; color: var(--rv-muted); }
/* Stats que FILTRAN al clicarlas (enlaces con estado activo) */
a.rv-stat-card { text-decoration: none; transition: border-color 0.15s, transform 0.1s, box-shadow 0.15s; }
a.rv-stat-card:hover { border-color: #c8ced4; }
a.rv-stat-card:active { transform: scale(0.98); }
a.rv-stat-card:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 2px; }
a.rv-stat-card.filtro-on { border-color: var(--rv-primary); box-shadow: 0 0 0 3px rgba(46,134,171,0.15), var(--rv-shadow); }

.rv-card { background: var(--rv-card); border-radius: var(--rv-radius); box-shadow: var(--rv-shadow); border: 1px solid var(--rv-border); overflow: hidden; }
.rv-card-head { padding: 12px 20px; border-bottom: 1px solid var(--rv-border); font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--rv-muted); font-weight: 700; display: flex; align-items: center; gap: 7px; }
/* Un encabezado DENTRO de la cabecera de tarjeta (lo semanticamente correcto
   cuando la tarjeta tiene titulo) no debe traerse el tamano por defecto del
   navegador: manda la pastilla discreta de .rv-card-head. Sin esto, un
   <h2> ahi sale a 2rem y en mayusculas, como un titular de pagina. */
.rv-card-head h1, .rv-card-head h2, .rv-card-head h3, .rv-card-head h4 {
    font-size: inherit; font-weight: inherit; letter-spacing: inherit; color: inherit;
    line-height: 1.3; margin: 0; display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
}
.rv-card-body { padding: 16px 20px; }

/* Avisos (paro de ventas, etc.) */
.rv-alert { display: flex; align-items: center; gap: 14px; border-radius: var(--rv-radius); border: 1px solid; padding: 13px 18px; margin-bottom: 16px; font-size: 0.88rem; }
.rv-alert .grow { flex: 1; min-width: 0; }
.rv-alert-danger { background: var(--rv-danger-tint); border-color: #F5C6C6; color: var(--rv-danger); }
.rv-alert-warn { background: var(--rv-warn-tint); border-color: #F3DFA8; color: var(--rv-warn); }
.rv-alert-ok { background: var(--rv-ok-tint); border-color: #BFE3CF; color: var(--rv-ok); }
.rv-alert-info { background: var(--rv-info-tint); border-color: #BFE3EF; color: var(--rv-info); }

/* Secciones dentro de un formulario largo (pdv_form): los h6 separadores
   toman el estilo de cabecera de tarjeta de la guía */
.rv-card .card-body h6 { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--rv-secondary); font-weight: 700; margin-bottom: 2px; }
.rv-card .card-body hr { border-color: var(--rv-border); opacity: 1; margin: 14px 0 10px; }

/* Filtros.

   El estilo del control cuelga de .rv-filter (el campo) Y de .rv-filters (la
   fila), no solo de la fila: una pantalla que agrupe sus campos en otro
   contenedor —Candidaturas lo hace en .cnd-avanzados— se quedaba con los
   desplegables y las casillas NATIVOS del sistema operativo en mitad de una
   pantalla de la casa, y nada en el marcado decía por qué. Un campo marcado
   como tal no se puede quedar sin vestir por olvidar el envoltorio. */
.rv-filters { display: flex; gap: 12px; flex-wrap: wrap; align-items: end; padding: 16px 20px; border-bottom: 1px solid var(--rv-border); }
.rv-filter { display: flex; flex-direction: column; gap: 4px; position: relative; }
.rv-filter label { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--rv-muted); font-weight: 600; }
.rv-filters input, .rv-filters select, .rv-filter input, .rv-filter select { font-size: 0.85rem; padding: 7px 10px; border: 1px solid var(--rv-border); border-radius: var(--rv-radius-sm); background: var(--rv-card); color: var(--rv-text); font-family: inherit; outline: none; transition: border-color 0.15s, box-shadow 0.15s; }
.rv-filters input:hover, .rv-filters select:hover, .rv-filter input:hover, .rv-filter select:hover { border-color: #C9D3DB; }
.rv-filters input:focus, .rv-filters select:focus, .rv-filter input:focus, .rv-filter select:focus { border-color: var(--rv-primary); box-shadow: 0 0 0 3px rgba(46,134,171,0.12); }
/* El DESPLEGABLE lleva su propia flecha: la del sistema es la que delata que
   el control no es nuestro. Fuera en los múltiples y en los que abren lista
   (size), donde una flecha sobra y estorba. */
.rv-filters select:not([multiple]):not([size]), .rv-filter select:not([multiple]):not([size]) {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    padding-right: 30px; cursor: pointer;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%235F6E7C' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 11px center;
}
/* La FECHA: el icono de calendario del navegador se tiñe del primario en vez
   de quedarse en el gris del sistema (Chromium; en los que no lo admiten se
   queda como estaba, que sigue siendo legible). */
.rv-filters input[type="date"], .rv-filter input[type="date"] { cursor: pointer; }
.rv-filters input[type="date"]::-webkit-calendar-picker-indicator,
.rv-filter input[type="date"]::-webkit-calendar-picker-indicator { cursor: pointer; opacity: 0.55; filter: invert(43%) sepia(62%) saturate(431%) hue-rotate(155deg) brightness(92%) contrast(88%); }
.rv-filters input[type="date"]:hover::-webkit-calendar-picker-indicator,
.rv-filter input[type="date"]:hover::-webkit-calendar-picker-indicator { opacity: 1; }
/* La CASILLA es lo que más canta: la del sistema no se parece a nada de la
   casa. Caja propia con la marca en SVG (un pseudo-elemento sobre un <input>
   no es de fiar en todos los navegadores). Sin `appearance` no hay nada que
   hacer, así que donde no exista se deja la nativa con el color de la casa. */
.rv-filters input[type="checkbox"], .rv-filter input[type="checkbox"], .rv-check input[type="checkbox"] {
    appearance: none; -webkit-appearance: none; -moz-appearance: none;
    width: 17px; height: 17px; flex: none; padding: 0; margin: 0; cursor: pointer;
    border: 1.5px solid #C2CCD6; border-radius: 5px; background: var(--rv-card);
    transition: background-color 0.12s, border-color 0.12s;
}
.rv-filters input[type="checkbox"]:hover, .rv-filter input[type="checkbox"]:hover, .rv-check input[type="checkbox"]:hover { border-color: var(--rv-primary); }
.rv-filters input[type="checkbox"]:checked, .rv-filter input[type="checkbox"]:checked, .rv-check input[type="checkbox"]:checked {
    background-color: var(--rv-primary); border-color: var(--rv-primary);
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='9' viewBox='0 0 11 9'%3E%3Cpath d='M1 4.6 4 7.6 10 1.4' fill='none' stroke='%23fff' stroke-width='1.9' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: center;
}
.rv-filters input[type="checkbox"]:focus-visible, .rv-filter input[type="checkbox"]:focus-visible, .rv-check input[type="checkbox"]:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 2px; }
/* Etiqueta de una casilla suelta en una fila de filtros: se pulsa entera. */
.rv-check { display: inline-flex; align-items: center; gap: 7px; font-size: 0.84rem; color: var(--rv-secondary); cursor: pointer; user-select: none; }
.rv-check:hover { color: var(--rv-text); }
.rv-filter-note { font-size: 0.72rem; color: var(--rv-warn); margin-top: 3px; }

/* Buscador de fichas de cliente (assets/js/nf-buscador-cliente.js): campo de
   texto que pide la lista al servidor según se teclea. La lista va en
   position:fixed —colocada por el JS y colgada del <body>— por lo mismo que
   la de rv-combo: estos campos viven dentro de una .rv-card con
   overflow:hidden, que recortaría un desplegable absolute a la altura de la
   tarjeta (se veía cortado por la mitad y no se podía ni pulsar). */
.nfcli-lista { position: fixed; z-index: 1060; max-width: 460px; max-height: 280px; overflow-y: auto;
               background: #fff; border: 1px solid var(--rv-border); border-radius: var(--rv-radius-sm);
               box-shadow: var(--rv-shadow); padding: 4px; }
.nfcli-lista[hidden] { display: none; }
.nfcli-lista button { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left; border: 0;
                      background: none; font-family: inherit; font-size: 0.85rem; color: var(--rv-text);
                      padding: 7px 10px; border-radius: 6px; cursor: pointer; }
.nfcli-lista button:hover, .nfcli-lista button:focus-visible { background: var(--rv-primary-tint); color: var(--rv-primary-dark); outline: none; }
.nfcli-lista button .cod { font-family: var(--rv-mono); font-size: 0.74rem; color: var(--rv-muted); margin-left: auto; }
.nfcli-lista button .nif { font-family: var(--rv-mono); font-size: 0.72rem; color: var(--rv-muted); }
.nfcli-lista button .baja { font-size: 0.7rem; font-weight: 600; color: var(--rv-danger); background: var(--rv-danger-tint); border-radius: 20px; padding: 1px 7px; }
.nfcli-vacio { padding: 10px; font-size: 0.8rem; color: var(--rv-muted); }

/* Desplegable buscable (assets/js/rv-combo.js): sustituye a un <select> con
   muchas opciones. Se ve como los demás campos de la barra de filtros, pero al
   teclear filtra la lista en vez de depender del salto por letra del navegador.
   La lista va en position:fixed (con las coordenadas puestas por el JS) porque
   la barra de filtros vive dentro de una .rv-card con overflow:hidden, que
   recortaría un desplegable absolute a la altura de la tarjeta. */
.rv-combo { position: relative; min-width: 210px; }
.rv-combo .rv-combo-input { width: 100%; font-size: 0.85rem; padding: 7px 28px 7px 10px; border: 1px solid var(--rv-border); border-radius: var(--rv-radius-sm); background: #fff; color: var(--rv-text); outline: none; text-overflow: ellipsis; transition: border 0.15s, box-shadow 0.15s; }
.rv-combo .rv-combo-input:focus { border-color: var(--rv-primary); box-shadow: 0 0 0 3px rgba(46,134,171,0.12); }
.rv-combo .rv-combo-input::placeholder { color: var(--rv-muted); }
.rv-combo-caret { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); color: var(--rv-muted); font-size: 0.7rem; pointer-events: none; }
.rv-combo-list { position: fixed; z-index: 1060; top: 0; left: 0; width: max-content; max-width: 420px; max-height: 280px; overflow-y: auto; margin: 0; padding: 4px; list-style: none; background: #fff; border: 1px solid var(--rv-border); border-radius: var(--rv-radius-sm); box-shadow: var(--rv-shadow); }
.rv-combo-list[hidden] { display: none; }
.rv-combo-opt { padding: 7px 10px; border-radius: 6px; font-size: 0.85rem; color: var(--rv-text); cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rv-combo-opt[aria-selected="true"] { font-weight: 600; }
.rv-combo-opt.activa { background: var(--rv-primary-tint); color: var(--rv-primary-dark); }
.rv-combo-opt mark { background: transparent; color: var(--rv-primary-dark); font-weight: 700; padding: 0; }  /* -dark: AA 5.9:1 también sobre el tinte de la fila marcada */
.rv-combo-opt .cod { font-family: var(--rv-mono); font-size: 0.76rem; color: var(--rv-muted); margin-right: 6px; }
.rv-combo-vacio { padding: 10px; font-size: 0.8rem; color: var(--rv-muted); }

/* Buscador (caja redondeada con icono) */
.rv-search-box { position: relative; }
.rv-search-box .ico { position: absolute; left: 11px; top: 50%; transform: translateY(-50%); color: var(--rv-muted); font-size: 0.8rem; pointer-events: none; }
.rv-search-box input { width: 100%; font-size: 0.88rem; padding: 8px 12px 8px 32px; border: 1px solid var(--rv-border); border-radius: 20px; background: #fff; color: var(--rv-text); outline: none; transition: border 0.15s, box-shadow 0.15s; }
.rv-search-box input:focus { border-color: var(--rv-primary); box-shadow: 0 0 0 3px rgba(46,134,171,0.12); }

/* Botones */
.rv-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 14px; border-radius: var(--rv-radius-sm); font-size: 0.83rem; font-weight: 600; border: 1px solid transparent; cursor: pointer; transition: all 0.15s; text-decoration: none; }
.rv-btn:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 2px; }
.rv-btn-primary { background: var(--rv-primary); color: #fff; border-color: var(--rv-primary); }
.rv-btn-primary:hover { background: var(--rv-primary-dark); color: #fff; }
.rv-btn-outline { background: #fff; color: var(--rv-secondary); border-color: var(--rv-border); }
.rv-btn-outline:hover { background: #F4F5F7; border-color: #d5dade; color: var(--rv-text); }
.rv-btn-ghost { background: none; border-color: transparent; color: var(--rv-muted); }
.rv-btn-ghost:hover { background: #F4F5F7; color: var(--rv-text); }
/* Destructiva: tinte suave + texto del color, nunca el relleno rojo saturado
   de Bootstrap. Nació dentro de modal_confirmar.php y sube aquí al pedirla la
   primera pantalla (borrar un objeto del inventario). 4,74:1 sobre su tinte. */
.rv-btn-danger { background: var(--rv-danger-tint, #FDEDED); color: var(--rv-danger, #C03A3A); border-color: #F5C6C6; }
.rv-btn-danger:hover, .rv-btn-danger:focus-visible { background: #FBDFDF; color: #9E2F2F; border-color: var(--rv-danger, #C03A3A); }
.rv-btn-icon { padding: 5px; width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--rv-radius-sm); border: 1px solid var(--rv-border); background: #fff; color: var(--rv-muted); transition: all 0.15s; text-decoration: none; font-size: 0.8rem; cursor: pointer; }
.rv-btn-icon:hover { background: var(--rv-primary-tint); color: var(--rv-primary-dark); border-color: var(--rv-primary); }
.rv-btn-icon:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 1px; }
/* Variante destructiva: neutra en reposo, roja al pasar/enfocar */
.rv-btn-icon.danger:hover, .rv-btn-icon.danger:focus-visible { background: var(--rv-danger-tint); color: var(--rv-danger); border-color: var(--rv-danger); }

/* Barra de guardado pegajosa para formularios largos: las acciones quedan
   siempre a la vista sin hacer scroll hasta el final */
.rv-savebar { position: sticky; bottom: 0; z-index: 5; display: flex; gap: 8px; align-items: center; padding: 12px 0; background: linear-gradient(to top, var(--rv-bg) 75%, transparent); }
/* En escritorio las acciones de fila aparecen al pasar por encima (patrón
   Linear); en táctil (sin hover) quedan siempre visibles. focus-within las
   muestra también al tabular con el teclado. */
@media (hover: hover) {
  .rv-table tbody td .rv-btn-icon { opacity: 0; transition: opacity 0.12s, background 0.15s, color 0.15s, border-color 0.15s; }
  .rv-table tbody tr:hover .rv-btn-icon,
  .rv-table tbody tr:focus-within .rv-btn-icon { opacity: 1; }
}

/* Atajos de fecha / periodo */
.rv-periods { display: flex; gap: 6px; flex-wrap: wrap; }
.rv-period { padding: 6px 12px; border-radius: 20px; font-size: 0.75rem; font-weight: 600; border: 1px solid var(--rv-border); background: #fff; cursor: pointer; color: var(--rv-muted); transition: all 0.15s; font-family: inherit; text-decoration: none; display: inline-flex; align-items: center; gap: 5px; }
.rv-period:hover { background: var(--rv-primary); color: #fff; border-color: var(--rv-primary); }
.rv-period.active { background: var(--rv-primary); color: #fff; border-color: var(--rv-primary); }
.rv-period:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 2px; }

/* Tabla */
/* position: relative a propósito: lo que dentro de la tabla va en posición
   absoluta (los .rv-sr de cada fila) se coloca respecto a la caja con scroll y
   no respecto a la página. Sin ello, un .rv-sr por fila en un listado largo
   escapaba al recorte del scroll y estiraba el documento muy por debajo del
   pie (bandeja de Candidaturas, 13/09/2026). */
.rv-table-wrap { overflow: auto; max-height: 68vh; position: relative; }
.rv-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; }
.rv-table thead th { position: sticky; top: 0; z-index: 2; background: #F8F9FB; padding: 10px 14px; text-align: left; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--rv-muted); font-weight: 600; border-bottom: 2px solid var(--rv-border); white-space: nowrap; }
.rv-table tbody td { padding: 10px 14px; border-bottom: 1px solid var(--rv-border-soft); vertical-align: middle; }
/* Variante compacta: menos padding horizontal para que quepan todas las
   columnas (incl. acciones) sin scroll lateral en listados anchos */
.rv-table.rv-table-sm thead th { padding: 9px 8px; }
.rv-table.rv-table-sm tbody td { padding: 9px 8px; }
.rv-table .rv-btn-icon { width: 28px; height: 28px; font-size: 0.72rem; }
.rv-table tbody tr.rv-row { cursor: pointer; transition: background 0.1s; }
/* Zebra: por CSS en tablas estáticas; las tablas con orden/filtro en vivo
   (clase rv-zebra-js) la aplican por JS sobre las filas VISIBLES para que
   el rayado no se descompense al reordenar u ocultar filas */
.rv-table:not(.rv-zebra-js) tbody tr.rv-row:nth-child(even) { background: #FBFCFD; }
.rv-table tbody tr.rv-row.zebra { background: #FBFCFD; }
/* Cabeceras ordenables (flechas ▲/▼, mismo patrón que Servicios) */
.rv-table thead th.sortable { cursor: pointer; user-select: none; transition: color 0.15s; }
.rv-table thead th.sortable:hover, .rv-table thead th.sortable:focus-visible { color: var(--rv-primary); outline: none; }
.rv-sort { display: inline-block; margin-left: 5px; font-size: 0.72rem; color: #C3CBD2; transition: color 0.15s; }
.rv-table thead th.sorted .rv-sort { color: var(--rv-primary); }
.rv-table tbody tr.rv-row:hover { background: var(--rv-primary-tint); }
.rv-table tbody tr.rv-row:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: -2px; background: var(--rv-primary-tint); }
/* Barra izquierda: estado de la reserva de un vistazo (refuerza el badge) */
.rv-table tbody tr.rv-row td:first-child { box-shadow: inset 3px 0 0 transparent; }
.rv-table tbody tr.st-pend td:first-child { box-shadow: inset 3px 0 0 #E8A400; }
.rv-table tbody tr.st-conf td:first-child { box-shadow: inset 3px 0 0 var(--rv-primary); }
.rv-table tbody tr.st-pag  td:first-child { box-shadow: inset 3px 0 0 var(--rv-ok); }
.rv-table tbody tr.st-cred td:first-child { box-shadow: inset 3px 0 0 var(--rv-info); }
.rv-table tbody tr.st-canc td:first-child { box-shadow: inset 3px 0 0 var(--rv-danger); }
.rv-table tbody tr.st-otro td:first-child { box-shadow: inset 3px 0 0 #C9D0D6; }
/* Tramo de vuelta de una I+V: ligera sangría + conector para leerlo como
   continuación de la ida sin repetir peso visual */
.rv-table tbody tr.tramo-vta td { color: var(--rv-secondary); }
.rv-table tbody tr.tramo-vta .loc-link { opacity: 0.65; }
/* Separadores de sección (Hoy / Próximas) */
.rv-table tr.rv-seccion td { background: var(--rv-primary-tint); color: var(--rv-primary-dark); font-weight: 700; font-size: 0.76rem; text-transform: uppercase; letter-spacing: 0.05em; padding: 8px 14px; border-bottom: 1px solid var(--rv-border); position: sticky; z-index: 1; }
.rv-table tr.rv-seccion.futuras td { background: #F1F3F6; color: var(--rv-secondary); }

/* Badges de estado/pago: tinte suave + texto del color (patrón Linear).
   El relleno saturado de Bootstrap convertía el metadato en lo más
   llamativo de la tabla. */
.rv-badge { display: inline-flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 20px; font-size: 0.7rem; font-weight: 600; white-space: nowrap; }
.rv-badge-pend { background: var(--rv-warn-tint); color: var(--rv-warn); }
.rv-badge-conf { background: var(--rv-primary-tint); color: var(--rv-primary-dark); }
.rv-badge-pag  { background: var(--rv-ok-tint); color: #177A46; }
.rv-badge-cred { background: var(--rv-info-tint); color: var(--rv-info); }
.rv-badge-canc { background: var(--rv-danger-tint); color: #B52D46; }
.rv-badge-otro { background: #EEF1F4; color: var(--rv-muted); }
/* Pastilla de recuento (pasajeros, bultos...): va pegada al dato al que
   acompaña, no en una columna propia. Una columna entera para un número de
   una cifra gasta más ancho en la cabecera que en el dato. */
.rv-pax { padding: 2px 7px; gap: 3px; font-family: var(--rv-mono); flex: none; }

.rv-truncate { max-width: 170px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---- Que la tabla quepa: recorte de celda y prioridad de columna ----
   El scroll horizontal es la peor salida para una tabla que no cabe: esconde
   columnas sin avisar, y al desplazarte a la derecha pierdes de vista el
   localizador, que es lo que te dice qué fila estás leyendo. Encima se suma al
   scroll vertical y te deja navegando en dos ejes. Estas dos herramientas
   hacen que la tabla quepa por diseño, en vez de dejar que desborde.

   rv-truncate (+ tamaños): para celdas de texto libre (nombres de vehículo, de
   punto de venta, direcciones). Sin un techo, una celda con "Cualquier
   Vehiculo Disponible" reclama ~200px y arrastra a toda la tabla; encima parte
   el texto en tres líneas y triplica el alto de la fila.

   OJO, esto se comprobó midiendo: el techo va SIEMPRE en un elemento de
   bloque DENTRO de la celda, nunca en el <td>. Con table-layout:auto el
   navegador trata el max-width de una celda como una sugerencia y lo ignora
   cuando anda justo de sitio; si además le has puesto nowrap, el texto ya no
   puede partirse y la celda acaba exigiendo MÁS ancho que antes. Poniéndolo en
   un <span> interno el recorte se respeta siempre. Acompáñalo de title= para
   poder leer el valor completo por encima. */
.rv-truncate-xs, .rv-truncate-sm, .rv-truncate-lg {
    display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rv-truncate-xs { max-width: 96px; }
.rv-truncate-sm { max-width: 130px; }
.rv-truncate-lg { max-width: 230px; }

/* rv-col-2 / rv-col-3: prioridad de columna. Se pone en el <th> Y en el <td>.
   Cuando la pantalla no da para todas, se retiran primero las accesorias
   (rv-col-3: metadatos de auditoría tipo "creada el"), luego las de consulta
   ocasional (rv-col-2). Nunca se etiqueta así lo que identifica la fila ni lo
   que se necesita para operar. Lo que se oculta sigue estando en el detalle de
   la fila, así que no se pierde nada: se prioriza.
   Es preferible a que decida el scroll, porque el recorte es predecible —
   siempre ves las mismas columnas— y no depende de dónde tengas la barra. */
@media (max-width: 1400px) { .rv-table .rv-col-3 { display: none; } }
@media (max-width: 1200px) { .rv-table .rv-col-2 { display: none; } }
.loc-link { font-family: var(--rv-mono); font-weight: 600; color: var(--rv-primary); text-decoration: none; font-size: 0.8rem; }
.loc-link:hover { text-decoration: underline; color: var(--rv-primary-dark); }

/* Estado vacío */
.rv-empty { text-align: center; padding: 48px 20px; color: var(--rv-muted); }
.rv-empty i { font-size: 2rem; opacity: 0.45; display: block; margin-bottom: 10px; }

/* Paginación */
.rv-pagination { display: flex; justify-content: space-between; align-items: center; gap: 10px; flex-wrap: wrap; padding: 12px 20px; border-top: 1px solid var(--rv-border); background: #FAFBFC; font-size: 0.8rem; color: var(--rv-muted); }
.rv-pages { display: flex; gap: 4px; }
.rv-pages a, .rv-pages span { min-width: 30px; height: 30px; display: inline-flex; align-items: center; justify-content: center; border-radius: var(--rv-radius-sm); border: 1px solid var(--rv-border); background: #fff; color: var(--rv-secondary); text-decoration: none; font-size: 0.78rem; font-weight: 600; font-family: var(--rv-mono); transition: all 0.15s; padding: 0 8px; }
.rv-pages a:hover { background: var(--rv-primary-tint); border-color: var(--rv-primary); color: var(--rv-primary-dark); }
.rv-pages a:focus-visible { outline: 2px solid var(--rv-primary); outline-offset: 1px; }
.rv-pages .current { background: var(--rv-primary); border-color: var(--rv-primary); color: #fff; }

/* Barras del gráfico de estadísticas */
.rv-chart { display: flex; align-items: flex-end; gap: 4px; height: 200px; overflow-x: auto; padding-top: 6px; }
.rv-chart .col { flex: 1; min-width: 26px; text-align: center; }
.rv-chart .col .n { font-size: 10px; color: var(--rv-muted); font-family: var(--rv-mono); }
.rv-chart .col .bar { background: var(--rv-primary); border-radius: 3px 3px 0 0; min-height: 4px; transition: background 0.15s; }
.rv-chart .col:hover .bar { background: var(--rv-primary-dark); }
.rv-chart .col .d { font-size: 9px; color: var(--rv-muted); margin-top: 4px; white-space: nowrap; font-family: var(--rv-mono); }

/* Listas clave-valor de los paneles de estadísticas */
.rv-kv { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 7px 0; border-bottom: 1px dashed var(--rv-border-soft); font-size: 0.85rem; }
.rv-kv:last-child { border-bottom: none; }
.rv-kv .k { color: var(--rv-text); }
.rv-kv .v { color: var(--rv-muted); font-family: var(--rv-mono); font-size: 0.78rem; white-space: nowrap; }
.rv-kv .cnt { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; padding: 1px 8px; border-radius: 10px; background: var(--rv-primary-tint); color: var(--rv-primary-dark); font-weight: 700; font-size: 0.72rem; font-family: var(--rv-mono); margin-right: 6px; }

/* Grid de datos etiqueta + valor (ficha de detalle, mismo patrón que el
   modal de Servicios: cajitas con label uppercase y valor en negrita) */
.rv-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; }
.rv-item { background: #F8F9FB; border: 1px solid var(--rv-border); border-radius: var(--rv-radius-sm); padding: 10px 12px; }
.rv-item .lbl { display: block; font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--rv-muted); font-weight: 600; margin-bottom: 2px; }
.rv-item .val { font-size: 0.88rem; font-weight: 600; color: var(--rv-text); word-break: break-word; }
.rv-item .val small { font-weight: 400; color: var(--rv-muted); }
.rv-item .val a { color: var(--rv-primary); text-decoration: none; }
.rv-item .val a:hover { text-decoration: underline; }
.rv-item.wide { grid-column: 1 / -1; }
/* Observaciones del cliente: caja ámbar como las obs. del modal de Servicios */
.rv-obs { background: #FFFBEB; border: 1px solid #FDE68A; border-radius: var(--rv-radius-sm); padding: 10px 12px; font-size: 0.85rem; white-space: pre-wrap; }
/* Fila de total del resumen económico */
.rv-total { display: flex; justify-content: space-between; align-items: center; padding-top: 10px; margin-top: 6px; border-top: 2px solid var(--rv-border); font-weight: 700; }
.rv-total .imp { font-family: var(--rv-mono); font-size: 1.2rem; color: var(--rv-primary-dark); }

/* ==== Modal de vista rápida (rvm-*): vive en assets/css/newfox-ui.css ====
   El bloque completo del modal (backdrop, cabecera por estado, franjas
   compactas, ficha de conductor, mapa GPS y skeleton) se sirve desde la
   hoja compartida que carga este mismo archivo — no redefinir aquí. */

/* Cuadrícula de puntos de venta (modal "Crear Reserva"): solo logo, sin
   color de fondo; si no hay logo, se escribe el nombre del PdV */
.rv-pdv-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); gap: 10px; }
.rv-pdv-tile {
  display: flex; align-items: center; justify-content: center; text-align: center;
  aspect-ratio: 4 / 3; padding: 10px; border-radius: var(--rv-radius);
  border: 1px solid var(--rv-border); background: var(--rv-card);
  text-decoration: none; transition: border-color .15s ease, box-shadow .15s ease;
}
.rv-pdv-tile:hover, .rv-pdv-tile:focus-visible { border-color: var(--rv-primary); box-shadow: var(--rv-shadow); }
.rv-pdv-tile img { max-width: 100%; max-height: 100%; object-fit: contain; }
.rv-pdv-tile-nom {
  font-size: 0.86rem; font-weight: 600; color: var(--rv-secondary); line-height: 1.25;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}

/* Respetar la preferencia de movimiento reducido del sistema */
@media (prefers-reduced-motion: reduce) {
  .rv-btn, .rv-period, .rv-btn-icon, .rv-table tbody tr, a.rv-stat-card, .rv-pages a { transition: none !important; }
  .rvm-backdrop.visible, .rvm-card, .rvm-fade, .rvm-skel .sk { animation: none !important; }
  .rvm-map { transition: none !important; }
}
@media (max-width: 768px) {
  .rv-page { padding: 14px; }
}
