/* ============================================================================
   WE FLY · Extensions CSS (Phase 1)
   Estilos para mejoras post-rediseño. NO toca el dashboard base.
   Todas las clases tienen prefix .wfx- para evitar colisiones.
   Para rollback: quitar el <link rel="stylesheet" href="wefly-extensions.css">.
   ============================================================================ */

:root{
  --wfx-text-scale:1;
  --wfx-ease:cubic-bezier(.22,1,.36,1);
}

body{font-size:calc(16px * var(--wfx-text-scale))}

/* Modo alto contraste (#32) */
body.wfx-high-contrast{
  --bg-0:#000 !important;--bg-1:#000 !important;--bg-2:#0a0a14 !important;
  --surface:#0a0e1a !important;--surface-2:#15192a !important;
  --ink:#fff !important;--ink-2:#fff !important;--ink-3:#e0e6f8 !important;
  --muted:#c0c8e0 !important;
  --hairline:rgba(255,255,255,.25) !important;
  --hairline-2:rgba(255,255,255,.4) !important;
  --hairline-strong:rgba(255,255,255,.55) !important;
}

/* ============================================================================
   FAB / Botones flotantes
   ============================================================================ */
.wfx-fab{
  position:fixed;z-index:9500;
  width:52px;height:52px;border-radius:50%;
  background:linear-gradient(135deg,#1e9fe8,#0d6cb0);
  color:#fff;border:none;cursor:pointer;
  box-shadow:0 14px 30px rgba(30,159,232,.45), 0 0 0 1px rgba(255,255,255,.10) inset;
  display:flex;align-items:center;justify-content:center;
  font-size:22px;line-height:1;
  transition:transform .2s var(--wfx-ease), box-shadow .2s var(--wfx-ease);
}
.wfx-fab:hover{transform:scale(1.08);box-shadow:0 18px 40px rgba(30,159,232,.6)}
.wfx-fab:active{transform:scale(.95)}
.wfx-fab-settings{bottom:24px;right:24px}
.wfx-fab-undo{
  bottom:24px;right:88px;
  background:linear-gradient(135deg,#a855f7,#7c3aed);
  box-shadow:0 14px 30px rgba(168,85,247,.45);
  display:none;
}
.wfx-fab-undo.wfx-visible{display:flex}
.wfx-fab-search{
  bottom:88px;right:24px;
  background:linear-gradient(135deg,#ffe070,#ffb020);color:#1a1408;
  box-shadow:0 14px 30px rgba(255,183,32,.4);
}
@media (max-width:540px){
  .wfx-fab-settings{bottom:80px;right:14px;width:48px;height:48px;font-size:20px}
  .wfx-fab-undo{bottom:80px;right:70px;width:48px;height:48px;font-size:18px}
  .wfx-fab-search{bottom:138px;right:14px;width:48px;height:48px;font-size:18px}
}

/* ============================================================================
   PANEL DE CONFIGURACIÓN — drawer derecha
   ============================================================================ */
.wfx-panel{
  position:fixed;top:0;right:0;bottom:0;z-index:9700;
  width:400px;max-width:92vw;
  background:linear-gradient(180deg, #0c1322 0%, #07101e 100%);
  border-left:1px solid rgba(150,170,210,.20);
  box-shadow:-30px 0 80px rgba(0,0,0,.6);
  transform:translateX(100%);
  transition:transform .35s var(--wfx-ease);
  overflow-y:auto;color:#f3f6ff;
  display:flex;flex-direction:column;
}
.wfx-panel.wfx-open{transform:translateX(0)}
.wfx-panel-backdrop{
  position:fixed;inset:0;z-index:9650;background:rgba(4,7,15,.7);
  backdrop-filter:blur(6px);
  opacity:0;pointer-events:none;transition:opacity .3s var(--wfx-ease);
}
.wfx-panel-backdrop.wfx-open{opacity:1;pointer-events:auto}
.wfx-panel-header{
  padding:20px 22px 16px;border-bottom:1px solid rgba(150,170,210,.15);
  display:flex;align-items:center;gap:12px;flex-shrink:0;
  background:linear-gradient(180deg, rgba(30,159,232,.08), transparent);
}
.wfx-panel-title{font-family:'Space Grotesk',sans-serif;font-size:18px;font-weight:800;letter-spacing:-.02em;flex:1}
.wfx-panel-close{
  width:32px;height:32px;border:none;background:rgba(150,170,210,.10);
  border-radius:8px;color:#fff;cursor:pointer;font-size:18px;
}
.wfx-panel-close:hover{background:rgba(150,170,210,.22)}
.wfx-panel-body{padding:16px 18px 32px;flex:1}
.wfx-section{margin-bottom:22px}
.wfx-section-title{
  font-size:10px;font-weight:800;letter-spacing:.18em;text-transform:uppercase;
  color:#7a85ad;margin-bottom:10px;display:flex;align-items:center;gap:8px;
}
.wfx-section-title::after{content:'';flex:1;height:1px;background:rgba(150,170,210,.12)}
.wfx-row{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:11px 13px;border-radius:10px;
  background:rgba(150,170,210,.04);border:1px solid rgba(150,170,210,.08);
  margin-bottom:6px;
  transition:background .15s, border-color .15s;
}
.wfx-row:hover{background:rgba(30,159,232,.08);border-color:rgba(30,159,232,.20)}
.wfx-row-main{flex:1;min-width:0}
.wfx-row-label{font-size:13px;font-weight:600;line-height:1.35}
.wfx-row-hint{font-size:11px;color:#7a85ad;margin-top:3px;font-weight:400;line-height:1.4}

.wfx-toggle{
  position:relative;width:38px;height:22px;flex-shrink:0;
  background:rgba(150,170,210,.18);border-radius:99px;cursor:pointer;
  transition:background .2s var(--wfx-ease);border:none;padding:0;
}
.wfx-toggle::after{
  content:'';position:absolute;top:2px;left:2px;width:18px;height:18px;
  background:#fff;border-radius:50%;transition:transform .2s var(--wfx-ease);
  box-shadow:0 2px 4px rgba(0,0,0,.3);
}
.wfx-toggle.wfx-on{background:linear-gradient(135deg,#1e9fe8,#0d6cb0)}
.wfx-toggle.wfx-on::after{transform:translateX(16px)}

.wfx-slider-wrap{display:flex;align-items:center;gap:10px;flex:1}
.wfx-slider{
  flex:1;-webkit-appearance:none;appearance:none;
  height:6px;background:rgba(150,170,210,.18);border-radius:3px;outline:none;
}
.wfx-slider::-webkit-slider-thumb{
  -webkit-appearance:none;width:18px;height:18px;border-radius:50%;
  background:linear-gradient(135deg,#1e9fe8,#0d6cb0);cursor:pointer;
}
.wfx-slider-val{font-family:'Space Grotesk',sans-serif;font-size:13px;font-weight:700;color:#42b4f5;min-width:40px;text-align:right}

.wfx-panel-btn{
  display:flex;align-items:center;gap:10px;
  width:100%;padding:10px 14px;border-radius:10px;
  background:rgba(150,170,210,.04);border:1px solid rgba(150,170,210,.10);
  color:#dde4f5;font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;
  margin-bottom:6px;text-decoration:none;text-align:left;
}
.wfx-panel-btn:hover{background:rgba(30,159,232,.10);border-color:rgba(30,159,232,.25);color:#fff}
.wfx-panel-btn-danger{color:#ff8aa0;border-color:rgba(255,84,112,.25)}
.wfx-panel-btn-danger:hover{background:rgba(255,84,112,.10);border-color:rgba(255,84,112,.4);color:#ffabbe}

/* ============================================================================
   COUNTDOWN AL ÁNGEL (#2)
   ============================================================================ */
.wfx-countdown{
  position:fixed;top:14px;right:14px;z-index:9000;
  background:linear-gradient(135deg, rgba(15,24,52,.92), rgba(8,16,38,.92));
  border:1.5px solid rgba(30,159,232,.4);
  border-radius:14px;padding:10px 14px;
  font-family:'Space Grotesk',sans-serif;
  display:none;align-items:center;gap:10px;
  box-shadow:0 14px 36px rgba(0,0,0,.5);
  backdrop-filter:blur(12px);transition:all .3s var(--wfx-ease);
  min-width:180px;
}
.wfx-countdown.wfx-visible{display:flex}
.wfx-countdown-icon{font-size:18px;line-height:1}
.wfx-countdown-body{flex:1;line-height:1.15}
.wfx-countdown-label{font-size:9px;color:#7a85ad;text-transform:uppercase;letter-spacing:.16em;font-weight:700;margin-bottom:2px}
.wfx-countdown-time{font-size:18px;font-weight:800;color:#42b4f5;letter-spacing:-.02em}
.wfx-countdown.wfx-warning{border-color:rgba(255,167,38,.55);box-shadow:0 14px 36px rgba(255,167,38,.25)}
.wfx-countdown.wfx-warning .wfx-countdown-time{color:#ffa726}
.wfx-countdown.wfx-critical{
  border-color:rgba(255,84,112,.65);
  box-shadow:0 14px 36px rgba(255,84,112,.35);
  animation:wfx-pulse-critical 1.2s infinite;
}
.wfx-countdown.wfx-critical .wfx-countdown-time{color:#ff5470}
.wfx-countdown.wfx-passed{border-color:rgba(16,220,139,.45)}
.wfx-countdown.wfx-passed .wfx-countdown-time{color:#10dc8b}
@keyframes wfx-pulse-critical{
  0%,100%{box-shadow:0 14px 36px rgba(255,84,112,.35), 0 0 0 0 rgba(255,84,112,.5)}
  50%{box-shadow:0 14px 36px rgba(255,84,112,.5), 0 0 0 10px rgba(255,84,112,0)}
}
@media (max-width:768px){
  .wfx-countdown{top:8px;left:12px;right:auto;min-width:auto;padding:8px 12px}
  .wfx-countdown-time{font-size:15px}
  .wfx-countdown-label{font-size:8px}
}

/* ============================================================================
   QUICK ACTION BAR MÓVIL (#26)
   ============================================================================ */
.wfx-quickbar{
  position:fixed;bottom:0;left:0;right:0;z-index:9100;
  background:linear-gradient(180deg, rgba(11,19,38,.92), rgba(4,7,15,.96));
  border-top:1px solid rgba(30,159,232,.20);
  backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
  padding:8px 6px;padding-bottom:max(8px, env(safe-area-inset-bottom));
  display:none;
}
@media (max-width:768px){.wfx-quickbar.wfx-enabled{display:flex}}
.wfx-quickbar-btn{
  flex:1;min-height:50px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:2px;padding:6px 4px;
  background:transparent;border:none;color:#a8b3d4;cursor:pointer;
  font:600 9.5px/1 'Inter',sans-serif;letter-spacing:.06em;text-transform:uppercase;
  border-radius:8px;
}
.wfx-quickbar-btn:active{background:rgba(30,159,232,.12);color:#fff}
.wfx-quickbar-btn-icon{font-size:20px;line-height:1}

/* ============================================================================
   DIFF HIGHLIGHTING (#3)
   ============================================================================ */
.wfx-diff-new{animation:wfx-flash-new 3s var(--wfx-ease);position:relative}
.wfx-diff-new::before{
  content:'NUEVO';position:absolute;top:8px;right:8px;z-index:5;
  background:linear-gradient(135deg,#34e5a5,#10dc8b);color:#022614;
  padding:3px 9px;border-radius:99px;font:900 9px/1 'Inter',sans-serif;
  letter-spacing:.12em;box-shadow:0 4px 12px rgba(16,220,139,.5);
}
.wfx-diff-changed{animation:wfx-flash-changed 3s var(--wfx-ease);position:relative}
.wfx-diff-changed::before{
  content:'ACTUALIZADO';position:absolute;top:8px;right:8px;z-index:5;
  background:linear-gradient(135deg,#ffe070,#ffb020);color:#1a1408;
  padding:3px 9px;border-radius:99px;font:900 9px/1 'Inter',sans-serif;
  letter-spacing:.12em;box-shadow:0 4px 12px rgba(255,183,32,.5);
}
@keyframes wfx-flash-new{
  0%{box-shadow:inset 0 0 0 2px rgba(16,220,139,0)}
  15%{box-shadow:inset 0 0 0 3px rgba(16,220,139,.8), 0 0 30px rgba(16,220,139,.4)}
  100%{box-shadow:inset 0 0 0 2px rgba(16,220,139,0)}
}
@keyframes wfx-flash-changed{
  0%{box-shadow:inset 0 0 0 2px rgba(255,183,32,0)}
  15%{box-shadow:inset 0 0 0 3px rgba(255,183,32,.8), 0 0 30px rgba(255,183,32,.4)}
  100%{box-shadow:inset 0 0 0 2px rgba(255,183,32,0)}
}

.wfx-diff-banner{
  background:linear-gradient(135deg, rgba(255,183,32,.18), rgba(255,215,71,.06));
  border:1px solid rgba(255,215,71,.40);
  border-radius:14px;padding:14px 18px;margin-bottom:14px;
  display:flex;align-items:center;gap:14px;
  font-size:13px;color:#ffd747;font-weight:600;
  animation:wfx-slidein .4s var(--wfx-ease);
}
.wfx-diff-banner-icon{font-size:22px;line-height:1}
.wfx-diff-banner-body{flex:1;line-height:1.45}
.wfx-diff-banner-body strong{color:#fff;font-weight:800}
@keyframes wfx-slidein{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}

/* ============================================================================
   LOADING SKELETON (#30) — globo + horizonte
   ============================================================================ */
.wfx-skeleton{
  padding:60px 20px;text-align:center;position:relative;overflow:hidden;
  background:linear-gradient(180deg, rgba(28,38,82,.4), rgba(15,24,52,.4));
  border:1px solid rgba(150,170,210,.10);border-radius:18px;
}
.wfx-skeleton-balloon{
  font-size:54px;line-height:1;margin-bottom:20px;display:inline-block;
  animation:wfx-balloon-rise 3s var(--wfx-ease) infinite;
  filter:drop-shadow(0 8px 18px rgba(30,159,232,.5));position:relative;z-index:2;
}
@keyframes wfx-balloon-rise{0%,100%{transform:translateY(0) rotate(-2deg)}50%{transform:translateY(-16px) rotate(2deg)}}
.wfx-skeleton-horizon{
  position:absolute;left:0;right:0;bottom:35%;height:1px;
  background:linear-gradient(90deg, transparent, rgba(30,159,232,.5) 30%, rgba(255,183,32,.4) 70%, transparent);
}
.wfx-skeleton-clouds{
  position:absolute;left:-100%;top:38%;width:300%;height:30px;opacity:.4;
  background:radial-gradient(50px 16px at 100px 50%, rgba(255,255,255,.08), transparent),
             radial-gradient(80px 22px at 350px 50%, rgba(255,255,255,.06), transparent),
             radial-gradient(60px 18px at 600px 50%, rgba(255,255,255,.08), transparent);
  animation:wfx-clouds 22s linear infinite;
}
@keyframes wfx-clouds{from{transform:translateX(0)}to{transform:translateX(33%)}}
.wfx-skeleton-text{
  position:relative;z-index:2;
  font-family:'Space Grotesk',sans-serif;font-size:17px;font-weight:800;
  color:#dde4f5;letter-spacing:-.02em;margin-bottom:6px;
}
.wfx-skeleton-sub{
  position:relative;z-index:2;
  font-size:11px;color:#7a85ad;letter-spacing:.1em;
  text-transform:uppercase;font-weight:700;
}
.wfx-skeleton-bars{margin-top:24px;display:flex;flex-direction:column;gap:8px;align-items:center;position:relative;z-index:2}
.wfx-skeleton-bar{
  height:12px;border-radius:7px;
  background:linear-gradient(90deg, rgba(150,170,210,.06) 0%, rgba(150,170,210,.20) 50%, rgba(150,170,210,.06) 100%);
  background-size:200% 100%;animation:wfx-shimmer 1.6s linear infinite;
}
@keyframes wfx-shimmer{from{background-position:200% 0}to{background-position:-200% 0}}

/* ============================================================================
   EMPTY STATES (#31)
   ============================================================================ */
.wfx-empty{
  text-align:center;padding:34px 20px;
  background:linear-gradient(180deg, rgba(15,24,52,.4), rgba(11,19,38,.4));
  border:1.5px dashed rgba(150,170,210,.18);border-radius:18px;
}
.wfx-empty-icon{
  font-size:48px;line-height:1;margin-bottom:14px;display:block;
  filter:drop-shadow(0 8px 18px rgba(30,159,232,.30));
  animation:wfx-empty-float 4s ease-in-out infinite;
}
@keyframes wfx-empty-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}
.wfx-empty-title{
  font-family:'Space Grotesk',sans-serif;font-size:17px;font-weight:800;
  color:#dde4f5;letter-spacing:-.01em;margin-bottom:6px;
}
.wfx-empty-sub{font-size:12px;color:#7a85ad;line-height:1.5;max-width:340px;margin:0 auto}

/* ============================================================================
   MODO OPERACIÓN (#1)
   ============================================================================ */
body.wfx-op-mode .kpi-meta,
body.wfx-op-mode .row-acciones,
body.wfx-op-mode .pax-service,
body.wfx-op-mode #banners,
body.wfx-op-mode .driver-assign label,
body.wfx-op-mode .footer{display:none !important}
body.wfx-op-mode .brand-hero{padding:10px 16px;margin-bottom:10px}
body.wfx-op-mode .brand-name{font-size:24px}
body.wfx-op-mode .brand-logo-wrap{width:48px;height:48px}
body.wfx-op-mode .brand-tagline{display:none}
body.wfx-op-mode .kpi-hero{padding:14px 16px;gap:14px}
body.wfx-op-mode .kpi-hero-num{font-size:44px}
body.wfx-op-mode .kpi-hero-bar{display:none}
body.wfx-op-mode .section-hero{padding:12px 14px;margin:18px 0 10px}
body.wfx-op-mode .section-hero .hero-title{font-size:17px}
body.wfx-op-mode .section-hero .hero-icon{font-size:24px}
body.wfx-op-mode .card{padding:14px}
body.wfx-op-mode .van-interactive-map{height:280px}

.wfx-op-badge{
  position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:9050;
  background:linear-gradient(135deg, #ff5470, #b27cff);
  color:#fff;padding:8px 18px;border-radius:99px;
  font:800 11px/1 'Inter',sans-serif;letter-spacing:.18em;text-transform:uppercase;
  box-shadow:0 8px 22px rgba(255,84,112,.5);
  display:none;align-items:center;gap:10px;cursor:pointer;border:none;
}
body.wfx-op-mode .wfx-op-badge{display:inline-flex}
.wfx-op-badge::before{
  content:'';width:8px;height:8px;border-radius:50%;background:#fff;
  animation:wfx-pulse-dot 1.2s infinite;
}
@keyframes wfx-pulse-dot{0%,100%{opacity:1}50%{opacity:.3}}

/* ============================================================================
   AVATARES (#27)
   ============================================================================ */
.wfx-avatar{
  display:inline-flex;align-items:center;justify-content:center;
  width:36px;height:36px;border-radius:50%;
  background:linear-gradient(135deg, var(--wfx-av-1, #1e9fe8), var(--wfx-av-2, #0d6cb0));
  color:#fff;font-family:'Space Grotesk',sans-serif;
  font-size:13px;font-weight:800;letter-spacing:-.02em;
  flex-shrink:0;margin-right:10px;vertical-align:middle;
  box-shadow:0 4px 12px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.15);
  position:relative;
}
.wfx-avatar-flag{
  position:absolute;bottom:-3px;right:-3px;
  font-size:12px;line-height:1;
  background:#0a0e1a;border-radius:50%;width:16px;height:16px;
  display:inline-flex;align-items:center;justify-content:center;
  border:1.5px solid #0a0e1a;
  box-shadow:0 2px 4px rgba(0,0,0,.5);
}
.wfx-pax-row{display:flex;align-items:center;gap:0;margin-bottom:4px}

/* ============================================================================
   TAGS PERSONALIZADOS / OUTLIERS (#13, #20)
   ============================================================================ */
.wfx-flag-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.wfx-flag{
  display:inline-flex;align-items:center;gap:4px;
  padding:3px 9px;border-radius:99px;
  font:800 10px/1 'Inter',sans-serif;letter-spacing:.06em;
  text-transform:uppercase;border:1px solid transparent;
}
.wfx-flag-vip{background:rgba(255,183,32,.16);color:#ffd747;border-color:rgba(255,215,71,.4)}
.wfx-flag-birthday{background:rgba(236,72,153,.16);color:#fbcfe8;border-color:rgba(236,72,153,.4)}
.wfx-flag-anniversary{background:rgba(236,72,153,.16);color:#fbcfe8;border-color:rgba(236,72,153,.4)}
.wfx-flag-heavy{background:rgba(255,84,112,.16);color:#ff9eb0;border-color:rgba(255,84,112,.4)}
.wfx-flag-big-group{background:rgba(168,85,247,.16);color:#d8b4fe;border-color:rgba(168,85,247,.4)}
.wfx-flag-warning{background:rgba(255,167,38,.16);color:#ffc873;border-color:rgba(255,167,38,.4)}
.wfx-flag-assist{background:rgba(96,165,250,.16);color:#bfdbfe;border-color:rgba(96,165,250,.4)}
.wfx-flag-custom{background:rgba(34,229,216,.16);color:#a7f3d0;border-color:rgba(34,229,216,.4)}

/* ============================================================================
   NOTAS INTERNAS (#19)
   ============================================================================ */
.wfx-notes{
  margin-top:10px;padding:10px 12px;
  background:rgba(168,85,247,.06);
  border:1px solid rgba(168,85,247,.25);border-radius:10px;
  font-size:12px;color:#dde4f5;line-height:1.5;
  position:relative;
}
.wfx-notes-label{
  font:800 9px/1 'Inter',sans-serif;letter-spacing:.14em;
  text-transform:uppercase;color:#b27cff;margin-bottom:6px;
  display:flex;align-items:center;gap:5px;
}
.wfx-notes-text{font-weight:500;white-space:pre-wrap;word-break:break-word}
.wfx-notes-edit{
  margin-top:8px;display:flex;gap:6px;
}
.wfx-notes-input{
  flex:1;padding:6px 10px;
  background:rgba(150,170,210,.04);border:1px solid rgba(168,85,247,.3);
  border-radius:8px;color:#fff;font:500 12px/1.4 inherit;
  resize:vertical;min-height:32px;max-height:140px;
}
.wfx-notes-input:focus{outline:none;border-color:#b27cff;box-shadow:0 0 0 2px rgba(168,85,247,.2)}
.wfx-notes-btn{
  padding:6px 10px;border-radius:8px;background:rgba(168,85,247,.18);
  border:1px solid rgba(168,85,247,.4);color:#d8b4fe;
  font:700 11px/1 inherit;cursor:pointer;flex-shrink:0;
}
.wfx-notes-btn:hover{background:rgba(168,85,247,.28);color:#fff}

/* ============================================================================
   AUDIT FEED — toast lateral
   ============================================================================ */
.wfx-audit-feed{
  position:fixed;bottom:24px;left:24px;z-index:9300;
  max-width:340px;display:flex;flex-direction:column-reverse;gap:8px;
  pointer-events:none;
}
.wfx-audit-item{
  background:linear-gradient(135deg, rgba(15,24,52,.95), rgba(8,16,38,.95));
  border:1px solid rgba(30,159,232,.25);border-radius:12px;
  padding:9px 13px;font-size:12px;color:#dde4f5;line-height:1.4;
  box-shadow:0 12px 30px rgba(0,0,0,.5);backdrop-filter:blur(10px);
  animation:wfx-audit-in .35s var(--wfx-ease);pointer-events:auto;
}
@keyframes wfx-audit-in{from{opacity:0;transform:translateX(-20px)}to{opacity:1;transform:translateX(0)}}
.wfx-audit-time{font-family:'JetBrains Mono',monospace;font-size:10px;color:#7a85ad;margin-right:6px}
@media (max-width:540px){.wfx-audit-feed{display:none}}

/* ============================================================================
   SEARCH MODAL (#18)
   ============================================================================ */
.wfx-search-modal{
  position:fixed;inset:0;z-index:9800;display:none;align-items:flex-start;justify-content:center;
  padding:80px 20px 20px;background:rgba(4,7,15,.85);backdrop-filter:blur(10px);
}
.wfx-search-modal.wfx-open{display:flex;animation:wfx-fade-in .2s var(--wfx-ease)}
@keyframes wfx-fade-in{from{opacity:0}to{opacity:1}}
.wfx-search-box{
  width:100%;max-width:640px;
  background:linear-gradient(180deg, #15203f, #0c1322);
  border:1px solid rgba(30,159,232,.30);border-radius:18px;
  box-shadow:0 40px 100px rgba(0,0,0,.7);
  overflow:hidden;animation:wfx-search-pop .25s var(--wfx-ease);
}
@keyframes wfx-search-pop{from{opacity:0;transform:translateY(-20px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}
.wfx-search-input{
  width:100%;padding:18px 22px;
  background:transparent;border:none;outline:none;
  font:600 18px/1 'Space Grotesk',sans-serif;color:#fff;
  border-bottom:1px solid rgba(150,170,210,.15);
}
.wfx-search-input::placeholder{color:#7a85ad}
.wfx-search-results{max-height:60vh;overflow-y:auto;padding:8px}
.wfx-search-result{
  display:block;padding:11px 14px;border-radius:10px;
  color:#dde4f5;text-decoration:none;cursor:pointer;font-size:13px;line-height:1.45;
}
.wfx-search-result:hover,.wfx-search-result.wfx-active{
  background:rgba(30,159,232,.12);color:#fff;
}
.wfx-search-result-name{font-weight:800;font-family:'Space Grotesk',sans-serif;letter-spacing:-.01em;font-size:14px}
.wfx-search-result-meta{font-size:11px;color:#7a85ad;margin-top:2px}
.wfx-search-empty{padding:30px;text-align:center;color:#7a85ad;font-size:13px}
.wfx-search-hint{
  padding:10px 22px;font-size:11px;color:#7a85ad;letter-spacing:.06em;
  background:rgba(150,170,210,.03);border-top:1px solid rgba(150,170,210,.1);
}
.wfx-kbd{
  display:inline-block;padding:2px 6px;margin:0 3px;
  background:rgba(150,170,210,.12);border:1px solid rgba(150,170,210,.2);
  border-radius:4px;font-family:'JetBrains Mono',monospace;font-size:10px;color:#dde4f5;
}

/* ============================================================================
   WEATHER ESCALONADO (#16)
   ============================================================================ */
.wfx-weather-timeline{
  display:flex;gap:6px;margin-top:12px;padding:8px;
  background:rgba(150,170,210,.04);border:1px solid rgba(150,170,210,.10);
  border-radius:12px;overflow-x:auto;
}
.wfx-wt-slot{
  flex:1;min-width:62px;
  display:flex;flex-direction:column;align-items:center;
  padding:8px 6px;border-radius:8px;
  background:rgba(150,170,210,.03);border:1px solid transparent;
}
.wfx-wt-slot-time{font:800 10px/1 'Space Grotesk',sans-serif;letter-spacing:.06em;color:#7a85ad;margin-bottom:5px}
.wfx-wt-slot-icon{font-size:18px;line-height:1;margin-bottom:5px}
.wfx-wt-slot-val{font:800 13px/1 'Space Grotesk',sans-serif;color:#dde4f5;letter-spacing:-.01em}
.wfx-wt-slot.wfx-warn{background:rgba(255,167,38,.10);border-color:rgba(255,167,38,.30)}
.wfx-wt-slot.wfx-warn .wfx-wt-slot-val{color:#ffc873}
.wfx-wt-slot.wfx-danger{background:rgba(255,84,112,.10);border-color:rgba(255,84,112,.30)}
.wfx-wt-slot.wfx-danger .wfx-wt-slot-val{color:#ff9eb0}

/* ============================================================================
   CELEBRACIÓN (#34)
   ============================================================================ */
.wfx-celebrate{
  position:fixed;inset:0;z-index:9999;display:flex;align-items:center;justify-content:center;
  background:radial-gradient(circle at center, rgba(30,159,232,.18), transparent 70%);
  pointer-events:none;animation:wfx-celebrate 3.5s ease-out forwards;
}
@keyframes wfx-celebrate{
  0%{opacity:0}10%{opacity:1}90%{opacity:1}100%{opacity:0;visibility:hidden}
}
.wfx-celebrate-text{
  font-family:'Space Grotesk',sans-serif;font-size:48px;font-weight:800;
  background:linear-gradient(135deg,#ffe070,#ffb020,#ff8a1f);
  -webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;
  letter-spacing:-.03em;text-align:center;
  filter:drop-shadow(0 8px 24px rgba(255,183,32,.5));
  animation:wfx-celebrate-bounce .8s var(--wfx-ease);
}
@keyframes wfx-celebrate-bounce{
  0%{transform:scale(.5);opacity:0}
  50%{transform:scale(1.1);opacity:1}
  100%{transform:scale(1);opacity:1}
}

/* ============================================================================
   TIMELINE VIEW (#5)
   ============================================================================ */
.wfx-timeline{
  margin:14px 0;padding:18px;
  background:linear-gradient(180deg, rgba(28,38,82,.5), rgba(15,24,52,.5));
  border:1px solid rgba(150,170,210,.12);border-radius:18px;
  overflow-x:auto;
}
.wfx-timeline-row{display:flex;align-items:center;gap:14px;margin-bottom:16px;min-width:680px}
.wfx-timeline-row:last-child{margin-bottom:0}
.wfx-timeline-label{
  width:88px;flex-shrink:0;font:800 12px/1.2 'Space Grotesk',sans-serif;
  color:#dde4f5;letter-spacing:-.01em;
}
.wfx-timeline-track{
  flex:1;position:relative;height:38px;
  background:linear-gradient(180deg,rgba(150,170,210,.04),rgba(150,170,210,.08));
  border-radius:8px;
  border:1px solid rgba(150,170,210,.08);
}
.wfx-timeline-tick{
  position:absolute;top:0;bottom:0;width:1px;background:rgba(150,170,210,.18);
}
.wfx-timeline-tick-label{
  position:absolute;top:-15px;font:700 10px/1 'JetBrains Mono',monospace;color:#9ed8ff;
  letter-spacing:.04em;transform:translateX(-50%);white-space:nowrap;
}
.wfx-timeline-block{
  /* top y height vienen inline desde JS (lane-stacking).
     NO declarar bottom aquí: rompería el posicionamiento por lanes. */
  position:absolute;border-radius:5px;
  display:flex;align-items:center;justify-content:center;
  font:800 10px/1 'Inter',sans-serif;color:#0a0e1a;
  padding:0 7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  cursor:pointer;transition:transform .15s,box-shadow .15s;
  min-width:50px;
  box-shadow:0 2px 5px rgba(0,0,0,.28);
  transform:translateX(-50%); /* centra horizontalmente en su .left% */
}
/* Hover conserva el translateX(-50%) del centrado para no "saltar" */
.wfx-timeline-block:hover{transform:translateX(-50%) translateY(-2px) scale(1.04);z-index:10;box-shadow:0 6px 14px rgba(0,0,0,.4)}
.wfx-timeline-block-pickup{
  background:linear-gradient(135deg, #ffe070, #ffb020);
  border:1px solid rgba(255,255,255,.25);
}
.wfx-timeline-block-angel{
  background:linear-gradient(135deg, #ff7a90, #b91c3c);color:#fff;
  border:1.5px solid rgba(255,255,255,.4);
  font-size:10px;
}
.wfx-timeline-block-depart{
  background:linear-gradient(135deg, #86efac, #16a34a);color:#fff;
  border:1.5px solid rgba(255,255,255,.4);
  font:800 10px/1 'JetBrains Mono',monospace;
}
.wfx-timeline-block-overlap{background:linear-gradient(135deg, #ff5470, #ff7a90);color:#fff;animation:wfx-pulse-overlap 1.5s infinite}
@keyframes wfx-pulse-overlap{0%,100%{opacity:.85}50%{opacity:1}}

/* ============================================================================
   MINI-MAPA STICKY (#4)
   ============================================================================ */
.wfx-mini-map{
  position:fixed;bottom:24px;right:24px;z-index:8900;
  width:180px;height:140px;border-radius:14px;overflow:hidden;
  border:1.5px solid rgba(30,159,232,.4);
  box-shadow:0 18px 40px rgba(0,0,0,.5);
  background:#0a1224;cursor:pointer;
  transition:transform .25s var(--wfx-ease);
  display:none;
}
.wfx-mini-map.wfx-enabled{display:block}
.wfx-mini-map:hover{transform:scale(1.05)}
.wfx-mini-map-label{
  position:absolute;top:6px;left:8px;z-index:2;
  background:rgba(4,7,15,.75);color:#42b4f5;
  padding:3px 9px;border-radius:6px;
  font:800 9px/1 'Inter',sans-serif;letter-spacing:.12em;text-transform:uppercase;
}
.wfx-mini-map iframe{width:100%;height:100%;border:0;pointer-events:none}
@media (max-width:768px){.wfx-mini-map{display:none !important}}

/* ============================================================================
   ROLLBACK BANNER
   ============================================================================ */
.wfx-rollback-banner{
  position:fixed;bottom:0;left:0;right:0;z-index:10000;
  background:linear-gradient(135deg, #ffe070, #ffb020);color:#1a1408;
  padding:8px 16px;font:700 11px/1.4 'Inter',sans-serif;
  text-align:center;letter-spacing:.04em;
  display:flex;align-items:center;justify-content:center;gap:14px;
  box-shadow:0 -8px 22px rgba(255,183,32,.4);
}
.wfx-rollback-banner a{
  color:#1a1408;text-decoration:underline;font-weight:800;
}

/* ============================================================================
   QR MODAL (#10)
   ============================================================================ */
.wfx-qr-modal{
  position:fixed;inset:0;z-index:9800;display:none;
  align-items:center;justify-content:center;
  background:rgba(4,7,15,.92);backdrop-filter:blur(12px);
}
.wfx-qr-modal.wfx-open{display:flex;animation:wfx-fade-in .25s var(--wfx-ease)}
.wfx-qr-content{
  background:#fff;color:#000;border-radius:18px;padding:24px;
  text-align:center;max-width:90vw;
  box-shadow:0 30px 80px rgba(0,0,0,.6);
}
.wfx-qr-title{font:800 16px/1.2 'Space Grotesk',sans-serif;color:#1a1408;margin-bottom:14px;letter-spacing:-.01em}
.wfx-qr-img{display:block;margin:0 auto 14px;border-radius:8px}
.wfx-qr-sub{font:500 12px/1.5 'Inter',sans-serif;color:#555;margin-bottom:14px;max-width:280px;margin-left:auto;margin-right:auto}
.wfx-qr-close{
  padding:10px 22px;background:#1a1f2e;color:#fff;border:none;
  border-radius:10px;font:700 13px/1 inherit;cursor:pointer;
}

/* ============================================================================
   SPARKLINE en métricas (#21)
   ============================================================================ */
.wfx-sparkline{display:inline-block;vertical-align:middle;margin-left:8px}

/* ============================================================================
   #8 DRIVER VIEW BANNER
   ============================================================================ */
.wfx-driver-banner{
  position:sticky;top:0;z-index:9400;
  display:flex;align-items:center;gap:12px;
  padding:12px 18px;
  background:linear-gradient(135deg, #ffe070, #ffb020);
  color:#1a1408;font-weight:700;font-size:13px;
  box-shadow:0 8px 22px rgba(255,183,32,.35);
  border-bottom:2px solid rgba(0,0,0,.15);
}
.wfx-driver-banner-exit{
  margin-left:auto;padding:7px 14px;border-radius:99px;
  background:rgba(0,0,0,.15);color:#1a1408;text-decoration:none;
  font:800 11px/1 'Inter',sans-serif;letter-spacing:.08em;text-transform:uppercase;
}
.wfx-driver-banner-exit:hover{background:rgba(0,0,0,.25);color:#1a1408}
body.wfx-driver-view .wfx-fab-settings{display:none}
body.wfx-driver-view .row-acciones{display:none !important}

/* ============================================================================
   #9 CONFIRMACIÓN DE LECTURA
   ============================================================================ */
.wfx-confirm-box{
  margin-top:12px;padding:10px 14px;
  background:linear-gradient(135deg, rgba(150,170,210,.05), rgba(150,170,210,.02));
  border:1.5px dashed rgba(150,170,210,.25);border-radius:10px;
  font-size:12px;display:flex;align-items:center;justify-content:center;
  transition:all .25s var(--wfx-ease);
}
.wfx-confirm-box.wfx-confirmed{
  background:linear-gradient(135deg, rgba(16,220,139,.10), rgba(16,220,139,.04));
  border:1.5px solid rgba(16,220,139,.4);
  color:#10dc8b;font-weight:700;
}
.wfx-confirm-btn{
  background:none;border:none;color:#dde4f5;cursor:pointer;
  font:600 12px/1.3 inherit;padding:4px 8px;border-radius:6px;
}
.wfx-confirm-btn:hover{background:rgba(30,159,232,.10);color:#fff}

/* ============================================================================
   #14 DRIVER SUGGESTIONS
   ============================================================================ */
.wfx-driver-sugg{
  margin-top:8px;padding:8px 12px;
  background:linear-gradient(135deg, rgba(96,165,250,.08), rgba(96,165,250,.02));
  border:1px solid rgba(96,165,250,.25);border-radius:10px;
  font-size:12px;color:#bfdbfe;line-height:1.4;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
}
.wfx-driver-sugg strong{color:#fff;font-weight:800;text-transform:capitalize}
.wfx-sugg-pill{
  display:inline-flex;align-items:center;
  padding:3px 10px;border-radius:99px;
  background:rgba(96,165,250,.18);border:1px solid rgba(96,165,250,.35);
  color:#dbeafe;font:800 11px/1 'Inter',sans-serif;letter-spacing:.04em;
  text-transform:capitalize;
}

/* ============================================================================
   #16 WEATHER TIMELINE ESCALONADO
   ============================================================================ */
.wfx-weather-timeline-wrap{margin-top:14px;padding-top:12px;border-top:1px solid rgba(150,170,210,.10)}
.wfx-wt-title{
  font:800 11px/1 'Space Grotesk',sans-serif;letter-spacing:.12em;
  text-transform:uppercase;color:#7a85ad;margin-bottom:10px;
}
.wfx-weather-timeline{
  display:flex;gap:6px;padding:8px;
  background:rgba(150,170,210,.04);border:1px solid rgba(150,170,210,.10);
  border-radius:12px;overflow-x:auto;
}
.wfx-wt-slot{
  flex:1;min-width:64px;
  display:flex;flex-direction:column;align-items:center;
  padding:9px 6px;border-radius:8px;
  background:rgba(150,170,210,.03);border:1px solid transparent;
  transition:all .2s var(--wfx-ease);
}
.wfx-wt-slot:hover{transform:translateY(-2px);background:rgba(30,159,232,.08)}
.wfx-wt-slot-time{font:800 10px/1 'Space Grotesk',sans-serif;letter-spacing:.04em;color:#7a85ad;margin-bottom:5px}
.wfx-wt-slot-icon{font-size:20px;line-height:1;margin-bottom:5px}
.wfx-wt-slot-val{font:800 13px/1 'Space Grotesk',sans-serif;color:#dde4f5;letter-spacing:-.01em}
.wfx-wt-slot.wfx-warn{background:rgba(255,167,38,.10);border-color:rgba(255,167,38,.35)}
.wfx-wt-slot.wfx-warn .wfx-wt-slot-val{color:#ffc873}
.wfx-wt-slot.wfx-danger{background:rgba(255,84,112,.10);border-color:rgba(255,84,112,.35);animation:wfx-pulse-slot 2s infinite}
.wfx-wt-slot.wfx-danger .wfx-wt-slot-val{color:#ff9eb0}
@keyframes wfx-pulse-slot{0%,100%{opacity:.95}50%{opacity:1}}
.wfx-wt-hint{font-size:10px;color:#7a85ad;margin-top:8px;letter-spacing:.04em;text-align:center}

/* ============================================================================
   #37 BOOKEO LINK
   ============================================================================ */
.wfx-bookeo-link{
  display:inline-flex;align-items:center;gap:4px;
  margin-top:8px;padding:5px 10px;
  background:rgba(60,179,113,.08);
  border:1px solid rgba(60,179,113,.30);border-radius:99px;
  color:#86efac;font:700 11px/1 'Inter',sans-serif;letter-spacing:.04em;
  text-decoration:none;transition:all .15s var(--wfx-ease);
}
.wfx-bookeo-link:hover{background:rgba(60,179,113,.18);color:#bbf7d0;transform:translateY(-1px)}


/* ============================================================================
   #8 VISTA CHOFER-ONLY (refinamiento)
   Cuando body.wfx-driver-view está activo, compactamos el chrome para que
   el chofer vea solo lo esencial: su van + el banner sticky de identidad.
   ============================================================================ */
body.wfx-driver-view .brand-hero{padding:14px 18px}
body.wfx-driver-view .kpi-hero,
body.wfx-driver-view .row-info,
body.wfx-driver-view .wfx-fab,
body.wfx-driver-view .wfx-search-fab,
body.wfx-driver-view .wfx-quickbar{display:none !important}
body.wfx-driver-view .section-block{padding-top:8px}
.wfx-share-driver-btn:hover{background:rgba(30,159,232,.30) !important;transform:translateY(-1px)}

/* ============================================================================
   SILENT BACKGROUND REFRESH
   Cuando autoRefresh o el botón manual disparan loadDispatchData(), el
   dashboard internamente oculta #main-content y muestra #loading-state.
   Estas reglas REVIERTEN ese comportamiento: el contenido sigue visible
   con un suave 85% de opacidad como señal de "actualizando", y un badge
   discreto arriba a la derecha. Cuando el refresh termina, body pierde
   la clase y todo vuelve a opacidad 100%.
   ============================================================================ */
body.wfx-bg-refresh #loading-state{display:none !important}
body.wfx-bg-refresh #main-content{
  display:block !important;
  opacity:.85;
  transition:opacity .3s var(--wfx-ease, ease);
  pointer-events:none; /* evita clicks accidentales mientras se actualiza */
}
.wfx-bg-refresh-badge{
  position:fixed;top:18px;right:18px;
  background:linear-gradient(135deg,rgba(30,159,232,.22),rgba(30,159,232,.12));
  color:#9ed8ff;border:1px solid rgba(30,159,232,.45);
  padding:8px 14px 8px 11px;border-radius:99px;
  font:700 11px/1 'Inter',sans-serif;letter-spacing:.04em;
  display:flex;align-items:center;gap:7px;
  box-shadow:0 6px 20px rgba(0,0,0,.35),0 0 0 1px rgba(255,255,255,.05) inset;
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
  opacity:0;transform:translateY(-6px);pointer-events:none;
  transition:opacity .25s ease,transform .25s ease;
  z-index:10000;
}
.wfx-bg-refresh-badge.wfx-visible{opacity:1;transform:translateY(0)}
.wfx-bg-spin{display:inline-block;animation:wfx-bg-spin 1.1s linear infinite;font-size:13px}
@keyframes wfx-bg-spin{from{transform:rotate(0)}to{transform:rotate(360deg)}}

/* Si la vista chofer está activa, no mostramos el badge — el chofer no
   debería ver eventos técnicos del dispatcher */
body.wfx-driver-view .wfx-bg-refresh-badge{display:none !important}

/* ============================================================================
   PILLS DE DIAGNÓSTICO DE RUTA (cercanía a pensión + overflow)
   ============================================================================ */
@keyframes wfx-pulse-alert{
  0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.4)}
  50%{box-shadow:0 0 0 8px rgba(239,68,68,0)}
}
.wfx-route-pill span[title]{cursor:help}
