:root{--color-primary-500:#1E5DD8;--color-primary-400:#3B82F6;--color-primary-300:#93C5FD;--color-primary-100:#DBEAFE;--color-primary-bg-hover:#F7FAFF;--color-success-500:#16A34A;--color-success-bg:#F0FFF4;--color-success-border:#BBF7D0;--color-warning-500:#D97706;--color-warning-bg:#FFFBEB;--color-warning-border:#FDE68A;--color-error-500:#DC2626;--color-error-bg:#FEF2F2;--color-error-border:#FECACA;--text-primary:#1f1f1f;--text-secondary:#262626;--text-body:#374151;--text-muted:#595959;--text-tertiary:#8c8c8c;--text-disabled:#bfbfbf;--text-placeholder:#bfbfbf;--border-lightest:#F5F5F5;--border-light:#F0F0F0;--border-default:#E8E8E8;--border-medium:#E5E7EB;--bg-page:#FFFFFF;--bg-card:#FFFFFF;--bg-card-head:#FAFAFA;--bg-icon-container:#FAFAFA;--bg-hover:#F7FAFF;--bg-sidebar:#111D3A;--bg-sidebar-logo-gradient:linear-gradient(135deg,#1E5DD8,#3B82F6);--sidebar-text-primary:#FFFFFF;--sidebar-text-secondary:rgba(255,255,255,0.65);--sidebar-text-muted:rgba(255,255,255,0.3);--sidebar-text-user:rgba(255,255,255,0.45);--sidebar-hover:rgba(255,255,255,0.05);--sidebar-border:rgba(255,255,255,0.06);--space-xs:4px;--space-sm:8px;--space-md:12px;--space-lg:16px;--space-xl:20px;--space-2xl:28px;--radius-card:6px;--radius-button:4px;--radius-nav-item:4px;--radius-tag:10px;--radius-icon:4px;--radius-sidebar-logo:6px;--shadow-nav-active:0 2px 10px rgba(30,93,216,0.4);--shadow-sidebar-logo:0 2px 6px rgba(30,93,216,0.35);--main-px:28px}*,:after,:before{box-sizing:border-box}body,html{margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,PingFang SC,Microsoft YaHei,Helvetica Neue,sans-serif;font-size:13px;color:var(--text-secondary);background:var(--bg-page);-webkit-font-smoothing:antialiased;line-height:1.5}.font-mono,code,pre{font-family:JetBrains Mono,SF Mono,Consolas,Liberation Mono,monospace}body,html{height:100%;overflow:hidden}.app-layout{display:flex;height:100vh}.app-main{flex:1 1;min-width:0;display:flex;flex-direction:column;background:var(--bg-page);overflow:hidden}.app-content{flex:1 1;overflow-y:auto;padding:20px var(--main-px) 28px}@keyframes appCardPulse{0%,to{opacity:1}50%{opacity:.4}}@keyframes kpiValueIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.kpi-value-animate{animation:kpiValueIn .42s cubic-bezier(.4,0,.2,1) both}@keyframes chartLineDraw{0%{stroke-dashoffset:2000}to{stroke-dashoffset:0}}.chart-line-animate{stroke-dasharray:2000;stroke-dashoffset:2000;animation:chartLineDraw 1.1s cubic-bezier(.4,0,.2,1) forwards}@keyframes skeletonShimmer{0%{background-position:-400px 0}to{background-position:400px 0}}.skeleton-block{background:linear-gradient(90deg,#f0f0f0 25%,#e8e8e8 50%,#f0f0f0 75%);background-size:800px 100%;animation:skeletonShimmer 1.6s infinite;border-radius:4px}@keyframes cardBounceIn{0%{opacity:0;transform:translateY(28px) scale(.88)}65%{opacity:1;transform:translateY(-5px) scale(1.02)}80%{transform:translateY(2px) scale(.99)}to{opacity:1;transform:translateY(0) scale(1)}}.card-bounce-in{animation:cardBounceIn .52s cubic-bezier(.4,0,.2,1) both}@keyframes odometerScroll{0%{transform:translateY(0)}85%{transform:translateY(calc((var(--target, 0) + .25) * -1.1em))}to{transform:translateY(calc(var(--target, 0) * -1.1em))}}.odometer-slot{display:inline-block;overflow:hidden;height:1.1em;vertical-align:text-bottom;line-height:1.1}.odometer-reel{display:block;animation:odometerScroll .72s cubic-bezier(.4,0,.2,1) both}.odometer-digit{display:block;line-height:1.1}@keyframes loginOrbPulse{0%{box-shadow:0 0 0 0 rgba(30,93,216,.55),0 0 0 0 rgba(30,93,216,.25)}50%{box-shadow:0 0 0 10px rgba(30,93,216,0),0 0 0 22px rgba(30,93,216,0)}to{box-shadow:0 0 0 0 rgba(30,93,216,.55),0 0 0 0 rgba(30,93,216,.25)}}.login-orb{animation:loginOrbPulse 1.1s ease-out infinite}@keyframes loginOrbShake{0%,to{transform:translateX(0)}20%{transform:translateX(-8px)}40%{transform:translateX(8px)}60%{transform:translateX(-5px)}80%{transform:translateX(5px)}}.login-orb-shake{animation:loginOrbShake .45s ease-in-out both}@keyframes loginNodePop{0%{transform:scale(0);opacity:0}70%{transform:scale(1.3);opacity:1}to{transform:scale(1);opacity:1}}@keyframes loginCheckDraw{0%{stroke-dashoffset:60}to{stroke-dashoffset:0}}@keyframes loginCardExit{0%{opacity:1;transform:scale(1)}40%{opacity:1;transform:scale(1.04)}to{opacity:0;transform:scale(.96)}}@keyframes rowGrowIn{0%{max-height:0;opacity:0;transform:scaleY(.5);transform-origin:top}to{max-height:80px;opacity:1;transform:scaleY(1);transform-origin:top}}.row-grow-in{overflow:hidden;animation:rowGrowIn .32s cubic-bezier(.4,0,.2,1) both}