
:root{
  --bg:#09090c;--panel:#121218;--panel2:#191921;--text:#f7f7f9;--muted:#92929f;
  --accent:#8b5cf6;--accent2:#6d3df0;--green:#4fda92;--red:#ff6b72;--yellow:#f5c84b;
  --border:#282832;--shadow:0 16px 46px rgba(0,0,0,.28)
}
*{box-sizing:border-box}
html,body{margin:0;min-height:100%;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
button,input,select,textarea{font:inherit}button{cursor:pointer}.hidden{display:none!important}
.auth-screen{min-height:100vh;display:grid;place-items:center;padding:28px 18px;background:
radial-gradient(circle at 20% 0%,rgba(139,92,246,.19),transparent 30%),var(--bg)}
.auth-wrap{width:min(430px,100%);text-align:center}.logo-mark{width:72px;height:72px;margin:0 auto 18px;border-radius:24px;
display:grid;place-items:center;font-size:24px;font-weight:1000;background:linear-gradient(145deg,var(--accent),#5323d8);box-shadow:0 18px 55px rgba(139,92,246,.35)}
.auth-wrap h1{margin:0;font-size:30px;letter-spacing:-.045em}.auth-wrap h1 span,.brand span{color:#a786ff}
.auth-card,.card,.hero{background:linear-gradient(145deg,var(--panel),#101015);border:1px solid var(--border);box-shadow:var(--shadow)}
.auth-card{margin-top:24px;border-radius:26px;padding:18px;text-align:left}.notice{margin:18px 0;padding:12px 14px;border-radius:14px;font-size:13px}
.notice.warning{background:rgba(245,200,75,.11);border:1px solid rgba(245,200,75,.22);color:#ffe28a}
.app-shell{max-width:760px;margin:0 auto;min-height:100vh;padding-bottom:102px}.topbar{position:sticky;top:0;z-index:20;padding:18px 18px 14px;
display:flex;align-items:center;justify-content:space-between;background:linear-gradient(to bottom,var(--bg) 78%,transparent)}
.brand{font-weight:950;font-size:20px;letter-spacing:-.035em}.top-actions{display:flex;gap:8px}.view{padding:0 16px 30px}
.hero{padding:21px;border-radius:27px;background:radial-gradient(circle at 100% 0%,rgba(139,92,246,.16),transparent 40%),linear-gradient(145deg,var(--panel),#101015)}
.hero h1{font-size:35px;line-height:1;margin:7px 0}.muted{color:var(--muted)}.tiny{font-size:11px}.center{text-align:center}
.grid{display:grid;gap:11px}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr))}
.card{border-radius:21px;padding:15px}.label{font-size:11px;color:var(--muted);margin-bottom:7px}.metric{font-size:23px;font-weight:900;letter-spacing:-.03em}
.section-head{display:flex;justify-content:space-between;align-items:center;margin:21px 2px 10px}.section-head h2{font-size:17px;margin:0}
.btn{border:0;border-radius:14px;padding:12px 14px;background:linear-gradient(145deg,var(--accent),var(--accent2));color:#fff;font-weight:850}
.btn.secondary{background:var(--panel2);border:1px solid var(--border);color:var(--text)}.btn.danger{background:var(--red)}.wide{width:100%;margin-top:8px}
.icon-btn{width:42px;height:42px;border:1px solid var(--border);background:var(--panel);color:var(--text);border-radius:14px}
.field{display:flex;flex-direction:column;gap:7px;margin-bottom:12px}.field label{font-size:11px;color:var(--muted)}
.field input,.field select,.field textarea,.search input{width:100%;border:1px solid var(--border);background:var(--panel2);color:var(--text);border-radius:14px;padding:12px 13px;outline:none}
.field textarea{min-height:80px;resize:vertical}.inline{display:flex;gap:10px}.inline>*{flex:1;min-width:0}
.list{display:flex;flex-direction:column;gap:9px}.row{display:flex;justify-content:space-between;align-items:center;gap:11px;background:var(--panel);border:1px solid var(--border);border-radius:18px;padding:12px}
.row-main{min-width:0}.row-title{font-weight:850}.row-sub{font-size:11px;color:var(--muted);margin-top:4px}.money-green{color:var(--green)}.money-red{color:var(--red)}
.badge{display:inline-flex;padding:6px 9px;border-radius:999px;font-size:10px;font-weight:850;background:var(--panel2);border:1px solid var(--border)}
.badge.green{color:var(--green);background:rgba(79,218,146,.1);border-color:rgba(79,218,146,.25)}.badge.red{color:var(--red);background:rgba(255,107,114,.1);border-color:rgba(255,107,114,.25)}
.badge.yellow{color:var(--yellow);background:rgba(245,200,75,.1);border-color:rgba(245,200,75,.25)}.badge.purple{color:#bba5ff;background:rgba(139,92,246,.12);border-color:rgba(139,92,246,.25)}
.product-card{display:grid;grid-template-columns:54px 1fr auto;gap:11px;align-items:center}.thumb{width:54px;height:54px;border-radius:15px;background:#1b1b23;border:1px solid var(--border);overflow:hidden;display:grid;place-items:center;font-size:27px}
.thumb img{width:100%;height:100%;object-fit:cover}.search{margin:7px 0 13px}.pill-tabs{display:flex;gap:7px;overflow:auto;padding-bottom:3px}
.pill-tabs button{white-space:nowrap;border:1px solid var(--border);background:var(--panel);color:var(--muted);padding:9px 12px;border-radius:999px;font-weight:750;font-size:12px}
.pill-tabs button.active{background:var(--accent);border-color:transparent;color:white}
.bottom-nav{position:fixed;z-index:30;left:50%;transform:translateX(-50%);bottom:10px;width:min(calc(100% - 22px),738px);display:grid;grid-template-columns:repeat(5,1fr);
padding:8px;border-radius:25px;background:rgba(18,18,24,.92);backdrop-filter:blur(20px);border:1px solid var(--border);box-shadow:0 18px 55px rgba(0,0,0,.42)}
.nav-item{border:0;background:transparent;color:var(--muted);padding:8px 3px;border-radius:16px;display:flex;flex-direction:column;align-items:center;gap:3px}.nav-item span{font-size:20px}.nav-item small{font-size:9px}
.nav-item.active{background:linear-gradient(145deg,var(--accent),var(--accent2));color:white}
.modal-backdrop{position:fixed;inset:0;z-index:100;background:rgba(0,0,0,.7);display:flex;justify-content:center;align-items:flex-end;padding:12px}
.modal-card{width:min(760px,100%);max-height:92vh;overflow:auto;background:var(--bg);border:1px solid var(--border);border-radius:27px 27px 17px 17px;padding:16px}.modal-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}.modal-head h3{margin:0}
.empty{text-align:center;padding:26px 18px;color:var(--muted)}.loader{padding:45px;text-align:center;color:var(--muted)}hr{border:0;border-top:1px solid var(--border);margin:14px 0}
.file-preview{width:86px;height:86px;border-radius:18px;object-fit:cover;border:1px solid var(--border);background:var(--panel2)}
@media(max-width:540px){.grid-3{grid-template-columns:1fr 1fr}.hero h1{font-size:30px}}

.chart-card{padding:16px;border-radius:22px;background:linear-gradient(145deg,var(--panel),#101015);border:1px solid var(--border);box-shadow:var(--shadow)}
.chart-head{display:flex;justify-content:space-between;align-items:flex-end;gap:10px;margin-bottom:12px}.chart-head h3{margin:0;font-size:15px}.chart-head .tiny{line-height:1.35}
.line-chart{width:100%;height:170px;display:block}.line-grid line{stroke:rgba(255,255,255,.08);stroke-width:1}.line-fill{fill:rgba(139,92,246,.12)}.line-path{fill:none;stroke:var(--accent);stroke-width:3;stroke-linecap:round;stroke-linejoin:round}.line-dot{fill:#c3aaff;stroke:var(--bg);stroke-width:2}
.chart-labels{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;margin-top:6px}.chart-labels span{font-size:10px;color:var(--muted);text-align:center}
.bar-chart{display:flex;align-items:flex-end;gap:10px;height:170px;padding-top:8px}.bar-wrap{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;min-width:0}.bar{width:100%;max-width:36px;border-radius:12px 12px 6px 6px;background:linear-gradient(180deg,#b899ff,var(--accent2));box-shadow:0 10px 24px rgba(139,92,246,.26)}
.bar-sub{font-size:10px;color:var(--muted);margin-top:7px}.bar-value{font-size:10px;color:var(--text);margin-bottom:6px;white-space:nowrap}
.mini-legend{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.legend-pill{padding:6px 10px;border:1px solid var(--border);border-radius:999px;background:var(--panel2);font-size:10px;color:var(--muted)}
.h-bars{display:flex;flex-direction:column;gap:12px}.h-item{display:grid;grid-template-columns:1fr auto;gap:10px}.h-meta{display:flex;justify-content:space-between;gap:12px;font-size:11px;margin-bottom:6px}.h-track{height:10px;background:var(--panel2);border:1px solid var(--border);border-radius:999px;overflow:hidden}.h-fill{height:100%;background:linear-gradient(90deg,#b899ff,var(--accent2));border-radius:999px}
.grid-stack{display:grid;gap:12px}.actions-inline{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.btn.tinybtn,.btn.secondary.tinybtn{padding:8px 11px;border-radius:11px;font-size:11px;font-weight:800}
.variant-row{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:center;padding:8px 0;border-bottom:1px solid var(--border)}.variant-actions{display:flex;gap:6px;flex-wrap:wrap}.ghost-btn{border:1px solid var(--border);background:var(--panel2);color:var(--text);padding:7px 10px;border-radius:10px;font-size:11px;font-weight:750}
.stat-grid-4{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
@media(max-width:540px){.stat-grid-4{grid-template-columns:repeat(2,minmax(0,1fr))}}

.field input:disabled{opacity:1;color:var(--text);-webkit-text-fill-color:var(--text)}

.aging-key{display:flex;gap:7px;flex-wrap:wrap;margin:-2px 0 12px}.stale-card{border-color:rgba(245,200,75,.25)}

.switch-tabs{display:grid;grid-template-columns:1fr 1fr;gap:7px;padding:6px;background:var(--panel);border:1px solid var(--border);border-radius:17px}.switch-tabs button{border:0;border-radius:12px;padding:10px;background:transparent;color:var(--muted);font-weight:850}.switch-tabs button.active{background:var(--accent);color:white}.info-note{background:rgba(139,92,246,.10);border:1px solid rgba(139,92,246,.22);color:#cdbdff}.shipment-card{padding:14px}.shipment-top{display:grid;grid-template-columns:42px 1fr auto;align-items:center;gap:10px}.shipment-icon{width:42px;height:42px;border-radius:14px;display:grid;place-items:center;background:rgba(139,92,246,.14);border:1px solid rgba(139,92,246,.24);font-size:20px;font-weight:900;color:#bda8ff}.tracking-event{font-size:12px;line-height:1.45;margin:12px 0 7px;padding:10px 12px;background:var(--panel2);border:1px solid var(--border);border-radius:13px}.shipment-actions{display:flex;gap:7px;justify-content:flex-end;margin-top:10px;flex-wrap:wrap}.listingOpen{cursor:pointer}.variant-actions{max-width:280px;justify-content:flex-end}.tinybtn{padding:8px 10px!important;font-size:11px!important}

.route-explainer{margin:12px 0;padding:14px;border-radius:17px;background:linear-gradient(145deg,rgba(139,92,246,.14),rgba(139,92,246,.05));border:1px solid rgba(139,92,246,.22);font-size:12px;line-height:1.65}.route-explainer span{color:var(--accent);font-weight:900;margin:0 4px}.route-explainer i{color:var(--muted)}
.journey-card{cursor:pointer}.journey-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}.journey-head .badge{max-width:48%;text-align:right;justify-content:center}.journey-mini{display:flex;align-items:center;margin:15px 0 10px}.mini-step{width:38px;height:38px;flex:0 0 38px;border-radius:13px;background:var(--panel2);border:1px solid var(--border);display:flex;align-items:center;justify-content:center;position:relative;font-size:17px;opacity:.55}.mini-step small{position:absolute;right:-3px;bottom:-5px;width:17px;height:17px;display:grid;place-items:center;border-radius:999px;background:var(--panel);border:1px solid var(--border);font-size:8px;color:var(--muted)}.mini-step.done{opacity:1;border-color:rgba(79,218,146,.45);background:rgba(79,218,146,.11)}.mini-step.active{opacity:1;border-color:rgba(139,92,246,.5);box-shadow:0 0 0 3px rgba(139,92,246,.08)}.mini-line{height:2px;flex:1;background:var(--border);min-width:8px}
.route-timeline{margin:14px 0}.route-leg{display:grid;grid-template-columns:44px 1fr;gap:11px;position:relative;padding-bottom:16px}.route-leg:not(:last-child):before{content:"";position:absolute;left:21px;top:44px;bottom:0;width:2px;background:var(--border)}.route-leg.done:not(:last-child):before{background:rgba(79,218,146,.4)}.route-node{width:44px;height:44px;border-radius:15px;display:grid;place-items:center;background:var(--panel2);border:1px solid var(--border);font-size:20px;z-index:1}.route-leg.done .route-node{background:rgba(79,218,146,.11);border-color:rgba(79,218,146,.35)}.route-body{padding:4px 0 5px}.route-title{display:flex;justify-content:space-between;align-items:center;gap:8px}.tracking-number{margin-top:8px;padding:9px 10px;border:1px solid var(--border);background:var(--panel2);border-radius:11px;font-size:11px;font-weight:750}.journey-form-step{margin:12px 0;padding:13px;border-radius:16px;border:1px solid var(--border);background:var(--panel)}.journey-form-step b{display:block;font-size:12px;margin-bottom:9px}.journey-form-step input,.journey-form-step select{width:100%;border:1px solid var(--border);background:var(--panel2);color:var(--text);border-radius:12px;padding:11px}.route-chip{display:inline-flex;margin-top:12px;padding:7px 10px;border-radius:999px;background:rgba(139,92,246,.11);border:1px solid rgba(139,92,246,.22);color:#cdbdff;font-size:10px;font-weight:800}

/* V2.6.3 — visual logistics */
.tracking-toolbar{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 12px}.tracking-toolbar .btn{flex:0 1 auto}
.journey-map{position:relative;margin:18px 0 14px;padding:4px 5px 0}.journey-map.compact{margin:14px 0 11px}
.map-track{position:absolute;left:10%;right:10%;top:21px;height:5px;border-radius:999px;background:var(--border);overflow:visible}
.map-track-fill{height:100%;border-radius:999px;background:linear-gradient(90deg,var(--green),var(--accent));transition:width .45s ease}
.moving-vehicle{position:absolute;top:50%;transform:translate(-50%,-50%);font-size:25px;z-index:5;filter:drop-shadow(0 5px 8px rgba(0,0,0,.35));animation:vehicleBob 1.5s ease-in-out infinite;transition:left .55s ease}
.moving-vehicle.arrived{animation:none}
@keyframes vehicleBob{0%,100%{transform:translate(-50%,-50%) translateY(0)}50%{transform:translate(-50%,-50%) translateY(-4px)}}
.map-nodes{position:relative;z-index:3;display:grid;grid-template-columns:repeat(5,1fr);align-items:start}
.map-node{display:flex;flex-direction:column;align-items:center;gap:7px;opacity:.42}.map-node span{width:39px;height:39px;display:grid;place-items:center;border-radius:50%;background:var(--panel2);border:2px solid var(--border);font-size:18px}.map-node small{font-size:9px;color:var(--muted);text-align:center}.map-node.reached{opacity:1}.map-node.reached span{border-color:rgba(79,218,146,.5);background:rgba(79,218,146,.12)}
.vehicle-caption{text-align:center;margin-top:10px;font-size:11px;font-weight:800;color:#cdbdff}
.journey-map.compact .map-node small{display:none}.journey-map.compact .map-node span{width:34px;height:34px;font-size:15px}.journey-map.compact .map-track{top:18px}.journey-map.compact .moving-vehicle{font-size:21px}.journey-map.compact .vehicle-caption{font-size:10px;margin-top:7px}
.route-leg.active:not(:last-child):before{background:linear-gradient(var(--accent),var(--border));background-size:100% 200%;animation:routePulse 1.5s linear infinite}.route-leg.active .route-node{border-color:rgba(139,92,246,.55);box-shadow:0 0 0 4px rgba(139,92,246,.08)}
.route-node.transport-air,.route-node.transport-road{font-size:22px}.route-leg.active .route-node.transport-air,.route-leg.active .route-node.transport-road{animation:vehicleNodePulse 1.4s ease-in-out infinite}
@keyframes routePulse{0%{background-position:0 0}100%{background-position:0 100%}}@keyframes vehicleNodePulse{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}
@media(max-width:420px){.map-node small{font-size:8px}.map-node span{width:34px;height:34px}.map-track{top:18px}.moving-vehicle{font-size:21px}}

/* V2.7 — UI POLISH */
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{padding-top:env(safe-area-inset-top);padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right);-webkit-tap-highlight-color:transparent}
button{touch-action:manipulation}.btn,.ghost-btn,.nav-btn,.switch-tab{transition:transform .12s ease,opacity .16s ease,background .2s ease,border-color .2s ease}
button:active{transform:scale(.985)}.btn{min-height:48px;border-radius:15px}
input,select,textarea{min-height:48px;border-radius:14px!important;transition:border-color .18s ease,box-shadow .18s ease}textarea{min-height:88px}
input:focus,select:focus,textarea:focus{outline:none;border-color:rgba(184,153,255,.7)!important;box-shadow:0 0 0 4px rgba(139,92,246,.11)}
.card,.chart-card,.hero{border-radius:21px;transition:transform .18s ease,border-color .2s ease}.hero{position:relative;overflow:hidden}
.hero:after{content:"";position:absolute;width:150px;height:150px;right:-55px;top:-70px;border-radius:50%;background:radial-gradient(circle,rgba(184,153,255,.18),transparent 68%);pointer-events:none}
#content{animation:viewIn .22s ease both}@keyframes viewIn{from{opacity:.2;transform:translateY(5px)}to{opacity:1;transform:none}}
.bottom-nav{padding-bottom:max(8px,env(safe-area-inset-bottom));backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);background:rgba(11,11,15,.9)!important}
.nav-btn{min-height:54px;border-radius:15px!important}.nav-btn.active{background:rgba(139,92,246,.13)!important}
.modal-backdrop{backdrop-filter:blur(9px);-webkit-backdrop-filter:blur(9px);animation:fadeIn .18s ease both}@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.modal{animation:sheetIn .22s cubic-bezier(.2,.8,.2,1) both}@keyframes sheetIn{from{opacity:.5;transform:translateY(22px)}to{opacity:1;transform:none}}
.search input{background:rgba(22,22,29,.95)!important}.tracking-toolbar{padding:10px;border:1px solid var(--border);border-radius:17px;background:var(--panel)}
.empty{padding:28px 18px!important;border-style:dashed!important}
.app-loader{position:fixed;inset:0;z-index:99999;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:15px;background:radial-gradient(circle at 50% 40%,rgba(139,92,246,.17),transparent 28%),#09090c;animation:loaderGone .35s ease 1.15s forwards}
.loader-mark{width:66px;height:66px;border-radius:22px;display:grid;place-items:center;font-size:21px;font-weight:950;color:#fff;background:linear-gradient(145deg,#b89cff,#7c4dff);box-shadow:0 18px 45px rgba(124,77,255,.3);animation:loaderFloat 1.1s ease-in-out infinite}
.loader-copy{display:flex;flex-direction:column;align-items:center;gap:4px}.loader-copy span{font-size:11px;color:var(--muted)}
@keyframes loaderFloat{50%{transform:translateY(-5px)}}@keyframes loaderGone{to{opacity:0;visibility:hidden;pointer-events:none}}
@media(max-width:620px){main{padding-bottom:calc(92px + env(safe-area-inset-bottom))!important}.modal-backdrop{align-items:flex-end!important;padding:0!important}.modal{width:100%!important;max-width:none!important;max-height:91dvh!important;border-radius:28px 28px 0 0!important;padding-bottom:max(18px,env(safe-area-inset-bottom))}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}


/* ============================================================
   FleeceVault V2.8 — MOTION SYSTEM
   Todo visual tiene feedback/animación sin tocar la lógica.
   ============================================================ */

:root{
  --motion-fast:.14s;
  --motion-med:.28s;
  --motion-slow:.55s;
  --ease-pop:cubic-bezier(.2,.85,.25,1.12);
  --ease-soft:cubic-bezier(.22,.72,.24,1);
}

/* Fondo vivo */
body:before,
body:after{
  content:"";
  position:fixed;
  pointer-events:none;
  z-index:-1;
  border-radius:50%;
  filter:blur(70px);
  opacity:.13;
}
body:before{
  width:280px;height:280px;
  top:-90px;left:-120px;
  background:var(--accent);
  animation:bgFloatA 12s ease-in-out infinite alternate;
}
body:after{
  width:240px;height:240px;
  right:-110px;bottom:10%;
  background:#5b38d1;
  animation:bgFloatB 15s ease-in-out infinite alternate;
}
@keyframes bgFloatA{
  from{transform:translate3d(0,0,0) scale(.95)}
  to{transform:translate3d(55px,90px,0) scale(1.15)}
}
@keyframes bgFloatB{
  from{transform:translate3d(0,0,0) scale(1)}
  to{transform:translate3d(-45px,-65px,0) scale(1.18)}
}

/* Vistas y secciones */
#content > *,
.view > *{
  animation:motionRise var(--motion-med) var(--ease-soft) both;
}
#content > *:nth-child(2),.view > *:nth-child(2){animation-delay:.035s}
#content > *:nth-child(3),.view > *:nth-child(3){animation-delay:.07s}
#content > *:nth-child(4),.view > *:nth-child(4){animation-delay:.105s}
#content > *:nth-child(5),.view > *:nth-child(5){animation-delay:.14s}
@keyframes motionRise{
  from{opacity:0;transform:translateY(10px) scale(.992)}
  to{opacity:1;transform:none}
}

.section-head{
  animation:sectionSlide .34s var(--ease-soft) both;
}
@keyframes sectionSlide{
  from{opacity:0;transform:translateX(-8px)}
  to{opacity:1;transform:none}
}

/* Hero respira */
.hero{
  animation:heroIn .45s var(--ease-pop) both, heroGlow 5s ease-in-out infinite 1s;
}
@keyframes heroIn{
  from{opacity:0;transform:translateY(-7px) scale(.98)}
  to{opacity:1;transform:none}
}
@keyframes heroGlow{
  0%,100%{box-shadow:0 12px 34px rgba(0,0,0,.2)}
  50%{box-shadow:0 18px 46px rgba(139,92,246,.12)}
}
.hero h1,.hero .metric{
  animation:numberPop .48s var(--ease-pop) both .08s;
}
@keyframes numberPop{
  from{opacity:0;transform:translateY(7px) scale(.92)}
  to{opacity:1;transform:none}
}

/* Cards */
.card,.chart-card{
  animation:cardIn .32s var(--ease-soft) both;
}
.card:hover,.chart-card:hover{
  border-color:rgba(184,153,255,.26);
}
@keyframes cardIn{
  from{opacity:0;transform:translateY(8px) scale(.985)}
  to{opacity:1;transform:none}
}
.card:active,.chart-card:active{
  transform:scale(.992);
}

/* Filas y productos entran en cascada */
.list > *{
  animation:listItemIn .3s var(--ease-soft) both;
}
.list > *:nth-child(1){animation-delay:.02s}
.list > *:nth-child(2){animation-delay:.055s}
.list > *:nth-child(3){animation-delay:.09s}
.list > *:nth-child(4){animation-delay:.125s}
.list > *:nth-child(5){animation-delay:.16s}
.list > *:nth-child(n+6){animation-delay:.19s}
@keyframes listItemIn{
  from{opacity:0;transform:translateX(-9px)}
  to{opacity:1;transform:none}
}
.row:hover{
  background:color-mix(in srgb,var(--panel) 88%,var(--accent) 12%);
}

/* Thumbnails */
.thumb{
  transition:transform .24s var(--ease-pop),box-shadow .24s ease;
}
.row:hover .thumb,.product-card:hover .thumb{
  transform:rotate(-1.5deg) scale(1.055);
  box-shadow:0 9px 25px rgba(0,0,0,.22);
}
.thumb img{
  animation:imageIn .38s ease both;
}
@keyframes imageIn{
  from{opacity:0;transform:scale(1.08)}
  to{opacity:1;transform:scale(1)}
}

/* Botones: ripple-ish glow + press */
.btn,.ghost-btn,.icon-btn,.nav-btn,.switch-tab,.pill-tabs button{
  position:relative;
  overflow:hidden;
  transition:
    transform var(--motion-fast) ease,
    box-shadow var(--motion-med) ease,
    background var(--motion-med) ease,
    border-color var(--motion-med) ease,
    color var(--motion-med) ease,
    opacity var(--motion-fast) ease;
}
.btn:before,.ghost-btn:before,.icon-btn:before,.switch-tab:before,.pill-tabs button:before{
  content:"";
  position:absolute;
  inset:-1px;
  background:linear-gradient(110deg,transparent 20%,rgba(255,255,255,.13) 46%,transparent 72%);
  transform:translateX(-125%);
  transition:transform .48s ease;
  pointer-events:none;
}
.btn:hover:before,.ghost-btn:hover:before,.icon-btn:hover:before,.switch-tab:hover:before,.pill-tabs button:hover:before{
  transform:translateX(125%);
}
.btn:hover{
  transform:translateY(-1px);
  box-shadow:0 12px 28px rgba(139,92,246,.22);
}
.btn:active,.ghost-btn:active,.icon-btn:active,.switch-tab:active,.pill-tabs button:active{
  transform:scale(.96);
}
.btn:disabled{
  animation:busyPulse 1s ease-in-out infinite;
  opacity:.65;
}
@keyframes busyPulse{
  0%,100%{filter:brightness(1)}
  50%{filter:brightness(1.22)}
}

/* Navegación inferior */
.bottom-nav{
  animation:navDockIn .5s var(--ease-pop) both;
}
@keyframes navDockIn{
  from{opacity:0;transform:translateY(18px)}
  to{opacity:1;transform:none}
}
.nav-btn span:first-child{
  display:inline-block;
  transition:transform .24s var(--ease-pop);
}
.nav-btn:hover span:first-child{
  transform:translateY(-3px) scale(1.12);
}
.nav-btn.active span:first-child{
  animation:navIconPop .35s var(--ease-pop);
}
@keyframes navIconPop{
  0%{transform:scale(.75)}
  60%{transform:scale(1.2) translateY(-2px)}
  100%{transform:scale(1.06) translateY(-1px)}
}
.nav-btn.active:after{
  animation:navDot .28s var(--ease-pop) both;
}
@keyframes navDot{
  from{transform:scaleX(0);opacity:0}
  to{transform:scaleX(1);opacity:1}
}

/* Inputs */
.field{
  animation:fieldIn .3s var(--ease-soft) both;
}
@keyframes fieldIn{
  from{opacity:0;transform:translateY(5px)}
  to{opacity:1;transform:none}
}
.field label{
  transition:color .18s ease,transform .18s ease;
}
.field:focus-within label{
  color:#cbb8ff;
  transform:translateX(2px);
}
input,select,textarea{
  transition:
    border-color .18s ease,
    box-shadow .18s ease,
    background .18s ease,
    transform .16s ease;
}
input:focus,select:focus,textarea:focus{
  transform:translateY(-1px);
}

/* Buscador */
.search{
  animation:searchDrop .32s var(--ease-soft) both;
}
@keyframes searchDrop{
  from{opacity:0;transform:translateY(-5px)}
  to{opacity:1;transform:none}
}
.search input:focus{
  box-shadow:0 0 0 4px rgba(139,92,246,.11),0 10px 30px rgba(0,0,0,.16);
}

/* Tabs y pills */
.switch-tabs,.pill-tabs{
  animation:tabsIn .3s var(--ease-soft) both;
}
@keyframes tabsIn{
  from{opacity:0;transform:translateY(6px)}
  to{opacity:1;transform:none}
}
.switch-tab.active,.pill-tabs button.active{
  animation:tabPop .3s var(--ease-pop) both;
}
@keyframes tabPop{
  from{transform:scale(.92)}
  to{transform:scale(1)}
}

/* Badges */
.badge{
  animation:badgeIn .28s var(--ease-pop) both;
  transition:transform .18s ease,filter .18s ease;
}
.badge:hover{transform:translateY(-1px) scale(1.04)}
@keyframes badgeIn{
  from{opacity:0;transform:scale(.82)}
  to{opacity:1;transform:scale(1)}
}
.badge.yellow,.badge.red{
  animation:badgeIn .28s var(--ease-pop) both, statusPulse 2.4s ease-in-out infinite .4s;
}
@keyframes statusPulse{
  0%,100%{box-shadow:0 0 0 0 rgba(245,200,75,0)}
  50%{box-shadow:0 0 0 5px rgba(245,200,75,.05)}
}

/* Modales */
.modal{
  transform-origin:50% 100%;
}
.modal-head h2,.modal-head h3{
  animation:modalTitle .34s var(--ease-pop) both;
}
@keyframes modalTitle{
  from{opacity:0;transform:translateY(5px) scale(.98)}
  to{opacity:1;transform:none}
}
.modal .field:nth-of-type(1){animation-delay:.04s}
.modal .field:nth-of-type(2){animation-delay:.08s}
.modal .field:nth-of-type(3){animation-delay:.12s}
.modal .field:nth-of-type(4){animation-delay:.16s}

/* Gráficos */
.line-path{
  stroke-dasharray:900;
  stroke-dashoffset:900;
  animation:drawLine 1.05s var(--ease-soft) forwards .12s;
}
@keyframes drawLine{to{stroke-dashoffset:0}}
.line-fill{
  opacity:0;
  animation:fadeChart .65s ease forwards .45s;
}
.line-dot{
  transform-box:fill-box;
  transform-origin:center;
  animation:dotPop .35s var(--ease-pop) both .7s;
}
@keyframes dotPop{
  from{transform:scale(0)}
  to{transform:scale(1)}
}
@keyframes fadeChart{to{opacity:1}}
.bar{
  transform-origin:bottom;
  animation:barGrow .68s var(--ease-pop) both;
}
.bar-wrap:nth-child(1) .bar{animation-delay:.04s}
.bar-wrap:nth-child(2) .bar{animation-delay:.08s}
.bar-wrap:nth-child(3) .bar{animation-delay:.12s}
.bar-wrap:nth-child(4) .bar{animation-delay:.16s}
.bar-wrap:nth-child(5) .bar{animation-delay:.20s}
.bar-wrap:nth-child(6) .bar{animation-delay:.24s}
.bar-wrap:nth-child(7) .bar{animation-delay:.28s}
@keyframes barGrow{
  from{transform:scaleY(.05);opacity:.25}
  to{transform:scaleY(1);opacity:1}
}
.h-fill{
  transform-origin:left;
  animation:hBarGrow .72s var(--ease-soft) both;
}
@keyframes hBarGrow{
  from{transform:scaleX(0)}
  to{transform:scaleX(1)}
}
.chart-labels span,.bar-sub,.bar-value{
  animation:fadeUp .4s ease both .45s;
}
@keyframes fadeUp{
  from{opacity:0;transform:translateY(4px)}
  to{opacity:1;transform:none}
}

/* Tracking / logística */
.journey-card{
  animation:journeyEnter .42s var(--ease-soft) both;
}
@keyframes journeyEnter{
  from{opacity:0;transform:translateY(10px) scale(.985)}
  to{opacity:1;transform:none}
}
.map-track-fill{
  animation:trackGlow 2.3s ease-in-out infinite;
}
@keyframes trackGlow{
  0%,100%{filter:brightness(1)}
  50%{filter:brightness(1.35)}
}
.map-node{
  transition:opacity .25s ease,transform .25s var(--ease-pop);
}
.map-node.reached{
  animation:nodePop .34s var(--ease-pop) both;
}
@keyframes nodePop{
  from{transform:scale(.82)}
  to{transform:scale(1)}
}
.map-node.reached span{
  animation:nodeGlow 2.5s ease-in-out infinite;
}
@keyframes nodeGlow{
  0%,100%{box-shadow:0 0 0 0 rgba(79,218,146,0)}
  50%{box-shadow:0 0 0 5px rgba(79,218,146,.07)}
}
.moving-vehicle{
  animation:
    vehicleBob 1.4s ease-in-out infinite,
    vehicleGlow 2s ease-in-out infinite;
}
@keyframes vehicleGlow{
  0%,100%{filter:drop-shadow(0 5px 8px rgba(0,0,0,.35))}
  50%{filter:drop-shadow(0 8px 13px rgba(139,92,246,.35))}
}
.route-leg{
  animation:routeLegIn .35s var(--ease-soft) both;
}
.route-leg:nth-child(1){animation-delay:.02s}
.route-leg:nth-child(2){animation-delay:.07s}
.route-leg:nth-child(3){animation-delay:.12s}
.route-leg:nth-child(4){animation-delay:.17s}
@keyframes routeLegIn{
  from{opacity:0;transform:translateX(-8px)}
  to{opacity:1;transform:none}
}
.route-leg.done .route-node{
  animation:deliveryDone .5s var(--ease-pop) both;
}
@keyframes deliveryDone{
  0%{transform:scale(.82) rotate(-5deg)}
  70%{transform:scale(1.12) rotate(2deg)}
  100%{transform:scale(1)}
}
.tracking-event{
  animation:eventSlide .32s ease both;
}
@keyframes eventSlide{
  from{opacity:0;transform:translateY(4px)}
  to{opacity:1;transform:none}
}

/* Financiero */
.money-green{
  animation:moneyPositive .42s var(--ease-pop) both;
}
.money-red{
  animation:moneyNegative .42s var(--ease-pop) both;
}
@keyframes moneyPositive{
  from{opacity:0;transform:scale(.94);filter:brightness(1.5)}
  to{opacity:1;transform:scale(1);filter:none}
}
@keyframes moneyNegative{
  from{opacity:0;transform:translateX(-3px)}
  50%{transform:translateX(2px)}
  to{opacity:1;transform:none}
}

/* Alertas de stock / estancado */
.badge.red,.money-red{
  will-change:transform;
}
.badge.red:hover{
  animation:tinyShake .35s ease;
}
@keyframes tinyShake{
  25%{transform:translateX(-2px)}
  50%{transform:translateX(2px)}
  75%{transform:translateX(-1px)}
}

/* Empty states también tienen vida */
.empty:before{
  content:"✦";
  display:block;
  font-size:20px;
  margin-bottom:7px;
  opacity:.45;
  animation:emptyFloat 2.4s ease-in-out infinite;
}
@keyframes emptyFloat{
  50%{transform:translateY(-4px) rotate(8deg);opacity:.7}
}

/* Loading / sync buttons */
#syncBtn{
  animation:syncIdle 4s linear infinite;
}
@keyframes syncIdle{
  0%,90%,100%{transform:rotate(0)}
  95%{transform:rotate(180deg)}
}
#syncBtn:active{
  animation:syncSpin .55s linear;
}
@keyframes syncSpin{to{transform:rotate(360deg)}}

/* Topbar */
.topbar{
  animation:topbarIn .42s var(--ease-soft) both;
}
@keyframes topbarIn{
  from{opacity:0;transform:translateY(-7px)}
  to{opacity:1;transform:none}
}
.brand{
  animation:brandIn .5s var(--ease-pop) both;
}
@keyframes brandIn{
  from{opacity:0;letter-spacing:.02em;transform:translateX(-5px)}
  to{opacity:1;letter-spacing:normal;transform:none}
}

/* Loader más vivo */
.loader-mark{
  animation:
    loaderFloat 1.1s ease-in-out infinite,
    loaderGlow 1.8s ease-in-out infinite;
}
@keyframes loaderGlow{
  0%,100%{box-shadow:0 18px 45px rgba(124,77,255,.24)}
  50%{box-shadow:0 22px 65px rgba(124,77,255,.5)}
}
.loader-copy span{
  animation:loadingDots 1.4s ease-in-out infinite;
}
@keyframes loadingDots{
  50%{opacity:.45}
}

/* Toasts */
.fv-toast.show{
  animation:toastPop .25s var(--ease-pop) both;
}
@keyframes toastPop{
  from{opacity:0;transform:translate(-50%,12px) scale(.96)}
  to{opacity:1;transform:translate(-50%,0) scale(1)}
}

/* Respeto accesibilidad */
@media(prefers-reduced-motion:reduce){
  *,*:before,*:after{
    animation:none!important;
    transition:none!important;
    scroll-behavior:auto!important;
  }
}

/* V2.8.1 — motion visibility upgrade */

/* KPI cards gently breathe independently */
.grid-3 .card:nth-child(1),.stat-grid-4 .card:nth-child(1){animation:cardIn .32s var(--ease-soft) both,kpiBreath 4.1s ease-in-out infinite 1s}
.grid-3 .card:nth-child(2),.stat-grid-4 .card:nth-child(2){animation:cardIn .32s var(--ease-soft) both,kpiBreath 4.6s ease-in-out infinite 1.4s}
.grid-3 .card:nth-child(3),.stat-grid-4 .card:nth-child(3){animation:cardIn .32s var(--ease-soft) both,kpiBreath 5s ease-in-out infinite 1.8s}
@keyframes kpiBreath{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}

/* Quick actions subtly float to make interaction obvious */
.grid-2 > .btn:nth-child(odd){animation:actionFloatA 4.2s ease-in-out infinite 1.1s}
.grid-2 > .btn:nth-child(even){animation:actionFloatB 4.7s ease-in-out infinite 1.6s}
@keyframes actionFloatA{0%,100%{transform:translateY(0)}50%{transform:translateY(-2px)}}
@keyframes actionFloatB{0%,100%{transform:translateY(0)}50%{transform:translateY(2px)}}

/* Active badges have a tiny breathing dot */
.badge.green:after,.badge.yellow:after,.badge.red:after,.badge.purple:after{
  content:"";width:5px;height:5px;border-radius:50%;display:inline-block;margin-left:5px;background:currentColor;
  animation:badgeDot 1.8s ease-in-out infinite;
}
@keyframes badgeDot{0%,100%{opacity:.35;transform:scale(.7)}50%{opacity:1;transform:scale(1.15)}}

/* Product image/card hover/touch life */
.product-card .thumb,.stockBlock .thumb{animation:thumbBreath 4.4s ease-in-out infinite}
@keyframes thumbBreath{0%,100%{transform:rotate(0) scale(1)}50%{transform:rotate(.6deg) scale(1.02)}}

/* Empty states shimmer */
.empty{position:relative;overflow:hidden}
.empty:after{
  content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.035) 50%,transparent 70%);
  transform:translateX(-120%);animation:emptyShimmer 4s ease-in-out infinite 1s;pointer-events:none
}
@keyframes emptyShimmer{0%,55%{transform:translateX(-120%)}80%,100%{transform:translateX(120%)}}

/* Tracking toolbar update button has a subtle sync cue */
#refreshAllTracking:not(:disabled){animation:refreshCue 3.5s ease-in-out infinite}
@keyframes refreshCue{0%,85%,100%{box-shadow:none}92%{box-shadow:0 0 0 5px rgba(139,92,246,.08)}}

/* Timeline connector pulses when active */
.route-leg.active:before{animation:routeConnectorPulse 1.5s ease-in-out infinite}
@keyframes routeConnectorPulse{0%,100%{opacity:.45}50%{opacity:1}}

/* Tabs get a sliding glow */
.switch-tabs,.pill-tabs{position:relative}
.switch-tab.active,.pill-tabs button.active{box-shadow:0 7px 18px rgba(139,92,246,.13)}

/* Header icon buttons idle movement, offset timing */
.top-actions .icon-btn:nth-child(1){animation:headerIconA 5s ease-in-out infinite 1s}
.top-actions .icon-btn:nth-child(2){animation:headerIconB 5.5s ease-in-out infinite 1.4s}
@keyframes headerIconA{0%,92%,100%{transform:none}96%{transform:translateY(-2px) rotate(5deg)}}
@keyframes headerIconB{0%,93%,100%{transform:none}96%{transform:translateY(-2px)}}

/* Chart cards tiny ambient glow */
.chart-card{animation:cardIn .32s var(--ease-soft) both,chartAmbient 5.5s ease-in-out infinite 1.5s}
@keyframes chartAmbient{0%,100%{box-shadow:0 10px 30px rgba(0,0,0,.16)}50%{box-shadow:0 14px 38px rgba(139,92,246,.07)}}


/* V2.8.2 — Bottom nav centering hotfix */
.bottom-nav{
  left:50%!important;
  transform:translateX(-50%)!important;
  animation:navDockInFixed .5s var(--ease-pop) both!important;
}
@keyframes navDockInFixed{
  from{
    opacity:0;
    transform:translateX(-50%) translateY(18px);
  }
  to{
    opacity:1;
    transform:translateX(-50%) translateY(0);
  }
}

/* V2.8.3 — ventas anulables */
.sale-history-card{display:flex;flex-direction:column;gap:10px}
.sale-history-head{display:flex;justify-content:space-between;align-items:flex-start;gap:12px}
.sale-history-meta{display:flex;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--muted)}
.sale-history-meta span{padding:6px 9px;background:var(--panel2);border:1px solid var(--border);border-radius:999px}
.sale-void{opacity:.62;filter:saturate(.65)}
.sale-void .row-title{text-decoration:line-through;text-decoration-thickness:1px}
.void-reason{font-size:11px;color:var(--muted);padding:9px 10px;border-radius:12px;background:rgba(255,107,114,.06);border:1px solid rgba(255,107,114,.13)}
.btn.danger{background:linear-gradient(145deg,#ff6574,#dc3e52)!important;color:white!important}
