/* ============ 动效 / 过渡 / 微交互 ============ */
@keyframes fadeUp{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
@keyframes pop{from{opacity:.5;transform:translateY(8px) scale(.985)}to{opacity:1;transform:none}}
@keyframes slideInRight{from{opacity:0;transform:translateX(16px)}to{opacity:1;transform:none}}
@keyframes shimmer{0%{background-position:-400px 0}100%{background-position:400px 0}}
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes barGrow{from{width:0}}
@keyframes pulseRing{0%{box-shadow:0 0 0 0 rgba(31,94,255,.35)}70%{box-shadow:0 0 0 8px rgba(31,94,255,0)}100%{box-shadow:0 0 0 0 rgba(31,94,255,0)}}
@keyframes floatY{0%,100%{transform:translateY(0)}50%{transform:translateY(-8px)}}

/* 页面进入 */
.auth-box{animation:fadeUp .32s cubic-bezier(.22,.61,.36,1) both}
.content > *{animation:fadeUp .3s cubic-bezier(.22,.61,.36,1) both}
.content > *:nth-child(2){animation-delay:.04s}
.content > *:nth-child(3){animation-delay:.08s}
.a-body > *{animation:fadeUp .3s cubic-bezier(.22,.61,.36,1) both}
.a-body > *:nth-child(2){animation-delay:.05s}
.a-body > *:nth-child(3){animation-delay:.1s}
.stat-grid .stat{animation:fadeUp .34s cubic-bezier(.22,.61,.36,1) both}
.stat-grid .stat:nth-child(2){animation-delay:.05s}
.stat-grid .stat:nth-child(3){animation-delay:.1s}
.stat-grid .stat:nth-child(4){animation-delay:.15s}

/* 文件行渐显 */
#rows .row-file{animation:fadeIn .26s ease both}
#rows .row-file:nth-child(1){animation-delay:.01s}
#rows .row-file:nth-child(2){animation-delay:.02s}
#rows .row-file:nth-child(3){animation-delay:.03s}
#rows .row-file:nth-child(4){animation-delay:.04s}
#rows .row-file:nth-child(5){animation-delay:.05s}
#rows .row-file:nth-child(6){animation-delay:.06s}
#rows .row-file:nth-child(7){animation-delay:.07s}
#rows .row-file:nth-child(8){animation-delay:.08s}

/* 表格行悬停抬升 */
.table tbody tr{transition:background .14s}
.table tbody tr:hover td{background:#f8fafc}

/* 按钮按压 */
.btn{transition:border-color .15s,background .15s,color .15s,box-shadow .18s,transform .08s}
.btn-primary{box-shadow:0 1px 2px rgba(31,94,255,.18)}
.btn-primary:hover{box-shadow:0 3px 10px rgba(31,94,255,.22);transform:translateY(-1px)}
.btn-primary:active{transform:translateY(0);box-shadow:0 1px 2px rgba(31,94,255,.18)}
.btn:not(.btn-primary):hover{transform:translateY(-1px)}
.btn:not(.btn-primary):active{transform:translateY(0)}

/* 卡片浮起 */
.card{transition:box-shadow .2s,border-color .2s}
.stat{transition:transform .2s,box-shadow .2s,border-color .2s}
.stat:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(16,24,40,.08);border-color:#dfe3ea}

/* 文件行 hover */
.row-file{transition:background .14s}
.row-file::after{content:"";position:absolute;left:0;top:0;bottom:0;width:2px;background:var(--brand);opacity:0;transition:opacity .15s}
.row-file.sel::after{opacity:1}
.row-file .ico,.row-file .fico{transition:transform .16s}
.row-file:hover .fico{transform:scale(1.06)}

/* 图标按钮 */
.icon-btn{transition:background .14s,color .14s,transform .12s}
.icon-btn:hover{transform:scale(1.08)}
.icon-btn:active{transform:scale(.94)}

/* 侧栏导航 */
.side-nav a,.aside-nav a{transition:background .15s,color .15s,padding-left .15s}
.side-nav a:hover{padding-left:13px}
.side-nav a svg,.aside-nav a svg{transition:transform .16s}
.side-nav a:hover svg{transform:translateX(1px) scale(1.05)}

/* 进度条动画 */
.bar>i{transition:width .5s cubic-bezier(.22,.61,.36,1)}
.side-storage .bar>i,.stat .bar>i{animation:barGrow .8s cubic-bezier(.22,.61,.36,1) both}

/* 骨架屏 */
.skeleton{background:linear-gradient(90deg,#f0f2f5 25%,#f8f9fb 37%,#f0f2f5 63%);background-size:800px 100%;animation:shimmer 1.4s linear infinite;border-radius:6px}

/* 弹窗 */
.modal-mask{animation:fadeIn .18s ease both}
.modal{animation:pop .2s cubic-bezier(.22,.61,.36,1) both}
.menu.open{animation:pop .14s cubic-bezier(.22,.61,.36,1) both}

/* 提示消息 */
#toasts .flash,.flash{animation:fadeUp .22s cubic-bezier(.22,.61,.36,1) both}

/* 加载旋转 */
.spin{animation:spin .8s linear infinite;display:inline-block}
.loading-btn{position:relative;color:transparent!important;pointer-events:none}
.loading-btn::after{content:"";position:absolute;width:15px;height:15px;border:2px solid rgba(255,255,255,.4);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite}
.btn:not(.btn-primary).loading-btn::after{border:2px solid rgba(0,0,0,.15);border-top-color:var(--ink-2)}

/* 上传行 */
.up-item{animation:slideInRight .2s ease both}

/* 上传面板出现 */
.up-panel.on{animation:fadeUp .22s cubic-bezier(.22,.61,.36,1) both}

/* 预览层 */
.viewer.open{animation:fadeIn .2s ease both}
.viewer.open .v-body>*{animation:pop .24s cubic-bezier(.22,.61,.36,1) both}

/* 拖拽提示 */
.drop-hint.on{animation:fadeIn .15s ease both}
.drop-hint.on span{animation:pop .2s cubic-bezier(.22,.61,.36,1) both}

/* 搜索框聚焦展开 */
.search input{transition:background .18s,border-color .18s,box-shadow .18s,width .2s}
.search:focus-within{max-width:520px}
.search{transition:max-width .24s cubic-bezier(.22,.61,.36,1)}

/* 徽标 */
.tag{transition:background .15s,color .15s}

/* 状态点脉冲（在线/进行中） */
.dot-ok.pulse{animation:pulseRing 2s ease-out infinite}

/* 骨架列表（文件加载中） */
.filelist.loading #rows{opacity:.5;transition:opacity .2s}
.filelist.loading .row-file:hover{background:transparent}

/* 首页 hero 浮动 */
.hero-panel{animation:fadeUp .5s cubic-bezier(.22,.61,.36,1) both,floatY 6s ease-in-out 1s infinite}
.land-hero h1{animation:fadeUp .45s cubic-bezier(.22,.61,.36,1) both}
.land-hero .lead{animation:fadeUp .45s cubic-bezier(.22,.61,.36,1) .06s both}
.land-hero .cta{animation:fadeUp .45s cubic-bezier(.22,.61,.36,1) .12s both}
.land-stats{animation:fadeUp .45s cubic-bezier(.22,.61,.36,1) .18s both}
.feat{transition:transform .22s,box-shadow .22s,border-color .22s;animation:fadeUp .4s cubic-bezier(.22,.61,.36,1) both}
.feat:hover{transform:translateY(-3px);box-shadow:0 10px 24px rgba(16,24,40,.08);border-color:#dfe3ea}
.land-features .feat:nth-child(2){animation-delay:.05s}
.land-features .feat:nth-child(3){animation-delay:.1s}
.land-features .feat:nth-child(4){animation-delay:.15s}
.land-features .feat:nth-child(5){animation-delay:.2s}
.land-features .feat:nth-child(6){animation-delay:.25s}

/* 认证页侧栏背景流动 */
.auth-aside::before{content:"";position:absolute;inset:-50%;background:conic-gradient(from 0deg,transparent,rgba(31,94,255,.12),transparent 40%);animation:spin 18s linear infinite;z-index:0}

/* 分享页 */
.share-item{transition:background .14s}
.share-item .btn{transition:transform .12s,background .14s}
.share-item .btn:hover{transform:translateX(2px)}

/* 分页 */
.pager a{transition:background .14s,border-color .14s,transform .1s,color .14s}
.pager a:hover{background:#f6f8fc;color:var(--ink);transform:translateY(-1px)}

/* 开关 */
.switch .track{transition:background .2s ease}
.switch .track::after{transition:transform .22s cubic-bezier(.34,1.56,.64,1)}

/* 输入框 */
.input,.select,.textarea{transition:border-color .16s,box-shadow .16s,background .16s}
.input:focus,.select:focus,.textarea:focus{animation:none}

/* 图表淡入 */
.chart-box{animation:fadeIn .5s ease both}
.chart-box polyline{animation:fadeIn .6s ease both}

/* 可访问性：减少动效 */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}
}
