/* ============================================================
   Nova 设计系统 — 用户端 UI 重构样式层
   基于 Tailwind 工具类之上，提供令牌、组件与动画能力
   动画仅使用 transform/opacity，保证 60fps 与低性能占用
   ============================================================ */

:root {
    /* 品牌色板（青紫渐变体系） */
    --nv-primary: #6366f1;
    --nv-primary-deep: #4f46e5;
    --nv-primary-soft: #eef2ff;
    --nv-violet: #8b5cf6;
    --nv-pink: #ec4899;
    --nv-cyan: #06b6d4;
    --nv-emerald: #10b981;
    --nv-amber: #f59e0b;
    --nv-rose: #f43f5e;

    /* 中性色 */
    --nv-ink: #0f172a;
    --nv-body: #334155;
    --nv-muted: #64748b;
    --nv-line: #e2e8f0;
    --nv-surface: #ffffff;
    --nv-canvas: #f6f7fb;

    /* 渐变 */
    --nv-grad-brand: linear-gradient(135deg, #6366f1 0%, #8b5cf6 55%, #a855f7 100%);
    --nv-grad-cool: linear-gradient(135deg, #06b6d4 0%, #3b82f6 100%);
    --nv-grad-warm: linear-gradient(135deg, #f59e0b 0%, #f43f5e 100%);
    --nv-grad-mint: linear-gradient(135deg, #10b981 0%, #059669 100%);
    --nv-grad-text: linear-gradient(90deg, #4f46e5, #8b5cf6 60%, #ec4899);

    /* 阴影 */
    --nv-shadow-sm: 0 1px 2px rgba(15, 23, 42, .05), 0 1px 3px rgba(15, 23, 42, .06);
    --nv-shadow-md: 0 4px 10px -2px rgba(15, 23, 42, .08), 0 2px 4px -2px rgba(15, 23, 42, .05);
    --nv-shadow-lg: 0 14px 34px -10px rgba(15, 23, 42, .16), 0 6px 12px -6px rgba(15, 23, 42, .08);
    --nv-shadow-glow: 0 10px 28px -8px rgba(99, 102, 241, .45);

    /* 圆角 */
    --nv-r-sm: 8px;
    --nv-r-md: 12px;
    --nv-r-lg: 16px;
    --nv-r-xl: 22px;

    /* 动效曲线 */
    --nv-ease: cubic-bezier(.22, 1, .36, 1);
    --nv-ease-in-out: cubic-bezier(.65, 0, .35, 1);
    --nv-dur: .28s;
}

/* ---------- 基础 ---------- */
html { -webkit-text-size-adjust: 100%; }
body {
    background: var(--nv-canvas);
    color: var(--nv-body);
    font-family: "HarmonyOS Sans SC", "PingFang SC", "Microsoft YaHei", system-ui, -apple-system, sans-serif;
    -webkit-font-smoothing: antialiased;
    text-rendering: optimizeLegibility;
}
::selection { background: rgba(99, 102, 241, .22); color: var(--nv-ink); }

/* 细腻滚动条 */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 8px; }
::-webkit-scrollbar-thumb:hover { background: #94a3b8; }
::-webkit-scrollbar-track { background: transparent; }

/* ---------- 页面过渡 ---------- */
.nv-page {
    animation: nvPageIn .5s var(--nv-ease) both;
}
@keyframes nvPageIn {
    from { opacity: 0; transform: translateY(14px) scale(.985); }
    to   { opacity: 1; transform: none; }
}

/* 路由切换遮罩（渐进式淡出，避免生硬） */
.nv-route-veil {
    position: fixed; inset: 0; z-index: 90;
    background: radial-gradient(120% 120% at 50% 0%, rgba(99,102,241,.10), rgba(246,247,251,.92) 55%);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    opacity: 0; pointer-events: none;
    transition: opacity .32s var(--nv-ease);
}
.nv-route-veil.is-active { opacity: 1; pointer-events: auto; }

/* ---------- 滚动显现 ---------- */
.nv-reveal {
    opacity: 0;
    transform: translateY(22px);
    transition: opacity .6s var(--nv-ease), transform .6s var(--nv-ease);
    transition-delay: var(--nv-delay, 0ms);
    will-change: opacity, transform;
}
.nv-reveal.nv-revealed { opacity: 1; transform: none; }
.nv-reveal-left { transform: translateX(-26px); }
.nv-reveal-right { transform: translateX(26px); }
.nv-reveal-scale { transform: scale(.92); }
.nv-reveal.nv-revealed.nv-reveal-left,
.nv-reveal.nv-revealed.nv-reveal-right,
.nv-reveal.nv-revealed.nv-reveal-scale { transform: none; }

/* ---------- 卡片 ---------- */
.nv-card {
    background: var(--nv-surface);
    border: 1px solid var(--nv-line);
    border-radius: var(--nv-r-lg);
    box-shadow: var(--nv-shadow-sm);
    transition: transform var(--nv-dur) var(--nv-ease), box-shadow var(--nv-dur) var(--nv-ease), border-color var(--nv-dur) var(--nv-ease);
    position: relative;
    overflow: hidden;
}
.nv-card:hover {
    transform: translateY(-3px);
    box-shadow: var(--nv-shadow-lg);
    border-color: rgba(99, 102, 241, .35);
}
/* 顶部渐变饰条（悬停展开） */
.nv-card-accent::before {
    content: '';
    position: absolute; top: 0; left: 0; right: 0; height: 3px;
    background: var(--nv-grad-brand);
    transform: scaleX(0);
    transform-origin: left;
    transition: transform .38s var(--nv-ease);
}
.nv-card-accent:hover::before { transform: scaleX(1); }

/* 玻璃卡 */
.nv-glass {
    background: rgba(255, 255, 255, .72);
    backdrop-filter: blur(16px) saturate(1.4);
    -webkit-backdrop-filter: blur(16px) saturate(1.4);
    border: 1px solid rgba(255, 255, 255, .65);
    box-shadow: var(--nv-shadow-md);
}

/* 渐变描边卡（悬停点亮） */
.nv-card-glow { position: relative; }
.nv-card-glow::after {
    content: '';
    position: absolute; inset: -1px;
    border-radius: inherit;
    padding: 1px;
    background: var(--nv-grad-brand);
    -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
    -webkit-mask-composite: xor;
    mask-composite: exclude;
    opacity: 0;
    transition: opacity var(--nv-dur) var(--nv-ease);
    pointer-events: none;
}
.nv-card-glow:hover::after { opacity: 1; }

/* ---------- 按钮 ---------- */
.nv-btn {
    display: inline-flex; align-items: center; justify-content: center; gap: .45em;
    padding: .58em 1.15em;
    font-size: .9rem; font-weight: 600; line-height: 1.35;
    border-radius: var(--nv-r-md);
    border: none; cursor: pointer; text-decoration: none;
    transition: transform .18s var(--nv-ease), box-shadow .18s var(--nv-ease), filter .18s var(--nv-ease), background-color .18s var(--nv-ease);
    position: relative; overflow: hidden;
    -webkit-tap-highlight-color: transparent;
}
.nv-btn:active { transform: scale(.97); }
.nv-btn:disabled, .nv-btn[disabled] { opacity: .55; cursor: not-allowed; transform: none !important; }
.nv-btn:focus-visible { outline: 2px solid var(--nv-primary); outline-offset: 2px; }

.nv-btn-primary { background: var(--nv-grad-brand); color: #fff; box-shadow: 0 6px 16px -6px rgba(99,102,241,.5); }
.nv-btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: var(--nv-shadow-glow); filter: saturate(1.12); }
.nv-btn-cool { background: var(--nv-grad-cool); color: #fff; box-shadow: 0 6px 16px -6px rgba(6,182,212,.45); }
.nv-btn-cool:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 10px 26px -8px rgba(6,182,212,.5); }
.nv-btn-mint { background: var(--nv-grad-mint); color: #fff; box-shadow: 0 6px 16px -6px rgba(16,185,129,.45); }
.nv-btn-mint:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 10px 26px -8px rgba(16,185,129,.5); }
.nv-btn-warm { background: var(--nv-grad-warm); color: #fff; box-shadow: 0 6px 16px -6px rgba(244,63,94,.4); }
.nv-btn-warm:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 10px 26px -8px rgba(244,63,94,.45); }
.nv-btn-ghost {
    background: #fff; color: var(--nv-primary-deep);
    border: 1px solid var(--nv-line); box-shadow: var(--nv-shadow-sm);
}
.nv-btn-ghost:hover:not(:disabled) { border-color: var(--nv-primary); color: var(--nv-primary); transform: translateY(-2px); box-shadow: var(--nv-shadow-md); }
.nv-btn-soft { background: var(--nv-primary-soft); color: var(--nv-primary-deep); }
.nv-btn-soft:hover:not(:disabled) { background: #e0e7ff; transform: translateY(-2px); }

/* 按钮微光扫过 */
.nv-btn-shine::after {
    content: '';
    position: absolute; top: 0; left: -80%;
    width: 45%; height: 100%;
    background: linear-gradient(105deg, transparent, rgba(255,255,255,.38), transparent);
    transform: skewX(-18deg);
    transition: left .55s var(--nv-ease);
    pointer-events: none;
}
.nv-btn-shine:hover::after { left: 135%; }

/* 加载态按钮 */
.nv-btn.is-loading { color: transparent !important; pointer-events: none; }
.nv-btn.is-loading::before {
    content: '';
    position: absolute; inset: 0; margin: auto;
    width: 1.15em; height: 1.15em;
    border: 2px solid rgba(255,255,255,.45);
    border-top-color: #fff;
    border-radius: 50%;
    animation: nvSpin .7s linear infinite;
}
.nv-btn-ghost.is-loading::before, .nv-btn-soft.is-loading::before {
    border-color: rgba(99,102,241,.3);
    border-top-color: var(--nv-primary);
}
@keyframes nvSpin { to { transform: rotate(360deg); } }

/* 波纹反馈 */
.nv-ripple {
    position: absolute; border-radius: 50%;
    background: rgba(255,255,255,.5);
    transform: scale(0);
    animation: nvRipple .55s var(--nv-ease-out, ease-out) forwards;
    pointer-events: none;
}
.nv-btn-ghost .nv-ripple, .nv-btn-soft .nv-ripple { background: rgba(99,102,241,.28); }
@keyframes nvRipple { to { transform: scale(2.6); opacity: 0; } }

/* ---------- 输入框 ---------- */
.nv-input {
    width: 100%;
    padding: .62em .9em;
    font-size: .92rem;
    color: var(--nv-ink);
    background: #fff;
    border: 1.5px solid var(--nv-line);
    border-radius: var(--nv-r-md);
    transition: border-color .2s var(--nv-ease), box-shadow .2s var(--nv-ease), background-color .2s var(--nv-ease);
    outline: none;
}
.nv-input::placeholder { color: #94a3b8; }
.nv-input:focus {
    border-color: var(--nv-primary);
    box-shadow: 0 0 0 4px rgba(99,102,241,.14);
}
.nv-input:disabled { background: #f1f5f9; cursor: not-allowed; }
.nv-field { position: relative; }
.nv-field .nv-field-icon {
    position: absolute; left: .85em; top: 50%; transform: translateY(-50%);
    color: #94a3b8; pointer-events: none; transition: color .2s;
}
.nv-field .nv-input:focus ~ .nv-field-icon,
.nv-field .nv-input:not(:placeholder-shown) ~ .nv-field-icon { color: var(--nv-primary); }
.nv-field-iconed .nv-input { padding-left: 2.5em; }

/* ---------- 徽章 / 标签 ---------- */
.nv-badge {
    display: inline-flex; align-items: center; gap: .3em;
    padding: .18em .62em;
    font-size: .72rem; font-weight: 600; line-height: 1.5;
    border-radius: 999px;
    background: var(--nv-primary-soft); color: var(--nv-primary-deep);
}
.nv-badge-mint { background: #ecfdf5; color: #047857; }
.nv-badge-warm { background: #fff7ed; color: #c2410c; }
.nv-badge-rose { background: #fff1f2; color: #be123c; }
.nv-badge-cyan { background: #ecfeff; color: #0e7490; }
.nv-badge-ink  { background: #f1f5f9; color: #475569; }

/* 呼吸点（在线状态） */
.nv-dot {
    width: .55em; height: .55em; border-radius: 50%;
    background: var(--nv-emerald);
    box-shadow: 0 0 0 0 rgba(16,185,129,.5);
    animation: nvPulse 1.8s infinite;
}
.nv-dot-off { background: #94a3b8; animation: none; box-shadow: none; }
@keyframes nvPulse {
    0%   { box-shadow: 0 0 0 0 rgba(16,185,129,.5); }
    70%  { box-shadow: 0 0 0 .5em rgba(16,185,129,0); }
    100% { box-shadow: 0 0 0 0 rgba(16,185,129,0); }
}

/* ---------- 导航 ---------- */
.nv-header {
    background: rgba(255,255,255,.86);
    backdrop-filter: blur(18px) saturate(1.5);
    -webkit-backdrop-filter: blur(18px) saturate(1.5);
    border-bottom: 1px solid rgba(226,232,240,.7);
    box-shadow: 0 1px 0 rgba(15,23,42,.02);
    transition: box-shadow .3s var(--nv-ease), background-color .3s var(--nv-ease);
}
.nv-header.is-scrolled { box-shadow: 0 8px 24px -12px rgba(15,23,42,.14); }

.nv-nav-link {
    position: relative;
    display: inline-flex; align-items: center; gap: .4em;
    padding: .45em .8em;
    font-size: .9rem; font-weight: 500;
    color: var(--nv-muted);
    border-radius: var(--nv-r-sm);
    transition: color .22s var(--nv-ease), background-color .22s var(--nv-ease);
    text-decoration: none;
}
.nv-nav-link:hover { color: var(--nv-primary-deep); background: var(--nv-primary-soft); }
.nv-nav-link.active { color: var(--nv-primary-deep); font-weight: 600; }
.nv-nav-link.active::after {
    content: '';
    position: absolute; left: .8em; right: .8em; bottom: -0.28em;
    height: 2.5px; border-radius: 3px;
    background: var(--nv-grad-brand);
    animation: nvNavIn .32s var(--nv-ease);
}
@keyframes nvNavIn { from { transform: scaleX(0); } to { transform: scaleX(1); } }
.nv-nav-link i { transition: transform .22s var(--nv-ease); }
.nv-nav-link:hover i { transform: translateY(-1.5px) scale(1.08); }

/* 移动端底部导航 */
.nv-tabbar {
    background: rgba(255,255,255,.92);
    backdrop-filter: blur(18px) saturate(1.5);
    -webkit-backdrop-filter: blur(18px) saturate(1.5);
    border-top: 1px solid rgba(226,232,240,.7);
    box-shadow: 0 -6px 22px -12px rgba(15,23,42,.16);
}
.nv-tab {
    position: relative;
    display: flex; flex-direction: column; align-items: center; gap: .12em;
    padding: .42em 0 .34em;
    font-size: .66rem; font-weight: 500;
    color: #94a3b8;
    transition: color .22s var(--nv-ease);
    text-decoration: none;
    -webkit-tap-highlight-color: transparent;
}
.nv-tab i { font-size: 1.12rem; transition: transform .26s var(--nv-ease); }
.nv-tab.active { color: var(--nv-primary-deep); font-weight: 600; }
.nv-tab.active i { transform: translateY(-2px) scale(1.12); }
.nv-tab.active::before {
    content: '';
    position: absolute; top: 0; left: 50%;
    width: 2.2em; height: 3px; border-radius: 0 0 4px 4px;
    background: var(--nv-grad-brand);
    transform: translateX(-50%);
    animation: nvTabIn .3s var(--nv-ease);
}
@keyframes nvTabIn { from { transform: translateX(-50%) scaleX(0); } to { transform: translateX(-50%) scaleX(1); } }
.nv-tab:active i { transform: scale(.88); }

/* ---------- 统计数字（滚动计数） ---------- */
.nv-stat-value {
    font-variant-numeric: tabular-nums;
    font-weight: 800;
    background: var(--nv-grad-text);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
}

/* ---------- 骨架屏 ---------- */
.nv-skeleton {
    position: relative;
    overflow: hidden;
    background: #e9edf4;
    border-radius: var(--nv-r-sm);
}
.nv-skeleton::after {
    content: '';
    position: absolute; inset: 0;
    background: linear-gradient(90deg, transparent, rgba(255,255,255,.65), transparent);
    transform: translateX(-100%);
    animation: nvShimmer 1.4s infinite;
}
@keyframes nvShimmer { to { transform: translateX(100%); } }

/* ---------- 旋转加载 ---------- */
.nv-spinner {
    width: 1.6em; height: 1.6em;
    border: 2.5px solid rgba(99,102,241,.18);
    border-top-color: var(--nv-primary);
    border-radius: 50%;
    animation: nvSpin .8s linear infinite;
}
.nv-spinner-sm { width: 1.1em; height: 1.1em; border-width: 2px; }
.nv-spinner-lg { width: 2.6em; height: 2.6em; border-width: 3px; }

/* 三点加载 */
.nv-dots { display: inline-flex; gap: .28em; }
.nv-dots span {
    width: .42em; height: .42em; border-radius: 50%;
    background: var(--nv-primary);
    animation: nvDotJump 1s infinite var(--nv-ease-in-out);
}
.nv-dots span:nth-child(2) { animation-delay: .14s; }
.nv-dots span:nth-child(3) { animation-delay: .28s; }
@keyframes nvDotJump {
    0%, 80%, 100% { transform: translateY(0); opacity: .45; }
    40% { transform: translateY(-.38em); opacity: 1; }
}

/* 全屏加载遮罩（契约：hidden 类切换可见性，兼容各页面自带实现） */
.nv-loading-veil {
    position: fixed; inset: 0; z-index: 95;
    display: flex; align-items: center; justify-content: center;
    background: rgba(246,247,251,.55);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    opacity: 0; pointer-events: none;
    transition: opacity .26s var(--nv-ease);
}
.nv-loading-veil:not(.hidden) { opacity: 1; pointer-events: auto; }
.nv-loading-veil.hidden { display: none; }

/* ---------- 弹窗 ---------- */
/* 遮罩层：仅负责样式，不携带定位与层级——由使用处（foot.php）以
   absolute inset-0 定位，并天然位于面板（DOM 顺序靠后）之下，
   避免毛玻璃遮罩盖住弹窗内容（如 QQ 登录滑块验证 iframe） */
.nv-modal-veil {
    background: rgba(15,23,42,.42);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
    opacity: 0;
    transition: opacity .26s var(--nv-ease);
}
.nv-modal-veil.is-open { opacity: 1; }
.nv-modal-panel {
    transform: translateY(18px) scale(.96);
    opacity: 0;
    transition: transform .34s var(--nv-ease), opacity .26s var(--nv-ease);
}
.nv-modal-veil.is-open .nv-modal-panel { transform: none; opacity: 1; }

/* ---------- Toast ---------- */
.nv-toast {
    display: flex; align-items: center; gap: .5em;
    padding: .62em 1em;
    font-size: .86rem; font-weight: 500;
    color: #fff;
    background: rgba(15,23,42,.88);
    backdrop-filter: blur(8px);
    border-radius: var(--nv-r-md);
    box-shadow: var(--nv-shadow-lg);
    transform: translateY(-14px) scale(.94);
    opacity: 0;
    transition: transform .34s var(--nv-ease), opacity .26s var(--nv-ease);
}
.nv-toast.nv-toast-in { transform: none; opacity: 1; }
.nv-toast-success { background: linear-gradient(135deg, #10b981, #059669); }
.nv-toast-error   { background: linear-gradient(135deg, #f43f5e, #e11d48); }
.nv-toast-warning { background: linear-gradient(135deg, #f59e0b, #d97706); }

/* ---------- 首页 Hero ---------- */
.nv-hero {
    position: relative;
    background:
        radial-gradient(60% 90% at 12% 0%, rgba(99,102,241,.16), transparent 60%),
        radial-gradient(55% 80% at 92% 12%, rgba(236,72,153,.12), transparent 60%),
        radial-gradient(40% 70% at 50% 110%, rgba(6,182,212,.12), transparent 62%),
        var(--nv-canvas);
    overflow: hidden;
}
/* 漂浮光斑 */
.nv-orb {
    position: absolute; border-radius: 50%;
    filter: blur(46px);
    opacity: .5;
    animation: nvFloat 9s ease-in-out infinite;
    pointer-events: none;
}
.nv-orb-a { width: 220px; height: 220px; background: rgba(99,102,241,.32); top: -60px; left: -40px; }
.nv-orb-b { width: 260px; height: 260px; background: rgba(236,72,153,.22); bottom: -90px; right: -60px; animation-delay: -3s; }
.nv-orb-c { width: 180px; height: 180px; background: rgba(6,182,212,.24); top: 42%; left: 58%; animation-delay: -6s; }
@keyframes nvFloat {
    0%, 100% { transform: translate(0, 0) scale(1); }
    33% { transform: translate(22px, -18px) scale(1.06); }
    66% { transform: translate(-16px, 14px) scale(.96); }
}

/* 渐变文字标题 */
.nv-gradient-text {
    background: var(--nv-grad-text);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
}

/* 渐显上浮（通用） */
.nv-anim-up { animation: nvUp .55s var(--nv-ease) both; }
.nv-anim-up-1 { animation-delay: .08s; }
.nv-anim-up-2 { animation-delay: .16s; }
.nv-anim-up-3 { animation-delay: .24s; }
.nv-anim-up-4 { animation-delay: .32s; }
@keyframes nvUp { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: none; } }

/* 弹入放大 */
.nv-anim-pop { animation: nvPop .45s var(--nv-ease) both; }
@keyframes nvPop { from { opacity: 0; transform: scale(.86); } to { opacity: 1; transform: scale(1); } }

/* 数字翻滚进场（配合计数 JS） */
.nv-count { display: inline-block; }

/* ---------- 功能图标磁贴 ---------- */
.nv-tile {
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: .5em;
    padding: 1em .6em;
    background: #fff;
    border: 1px solid var(--nv-line);
    border-radius: var(--nv-r-lg);
    text-decoration: none;
    transition: transform .24s var(--nv-ease), box-shadow .24s var(--nv-ease), border-color .24s var(--nv-ease), background-color .24s var(--nv-ease);
    position: relative; overflow: hidden;
}
.nv-tile:hover {
    transform: translateY(-4px);
    box-shadow: var(--nv-shadow-lg);
    border-color: rgba(99,102,241,.4);
}
.nv-tile:active { transform: translateY(-1px) scale(.98); }
.nv-tile-icon {
    display: flex; align-items: center; justify-content: center;
    width: 2.6em; height: 2.6em;
    border-radius: var(--nv-r-md);
    color: #fff;
    box-shadow: 0 6px 14px -6px rgba(15,23,42,.35);
    transition: transform .26s var(--nv-ease);
}
.nv-tile:hover .nv-tile-icon { transform: scale(1.1) rotate(-4deg); }
.nv-tile-label { font-size: .8rem; font-weight: 500; color: var(--nv-body); }
.nv-tile:hover .nv-tile-label { color: var(--nv-primary-deep); }

/* ---------- 列表行动画 ---------- */
.nv-list-item {
    transition: background-color .2s var(--nv-ease), transform .2s var(--nv-ease);
}
.nv-list-item:hover { background: var(--nv-primary-soft); }

/* 逐条进入 */
.nv-stagger > * {
    opacity: 0;
    animation: nvUp .5s var(--nv-ease) forwards;
}
.nv-stagger > *:nth-child(1) { animation-delay: .03s; }
.nv-stagger > *:nth-child(2) { animation-delay: .07s; }
.nv-stagger > *:nth-child(3) { animation-delay: .11s; }
.nv-stagger > *:nth-child(4) { animation-delay: .15s; }
.nv-stagger > *:nth-child(5) { animation-delay: .19s; }
.nv-stagger > *:nth-child(6) { animation-delay: .23s; }
.nv-stagger > *:nth-child(7) { animation-delay: .27s; }
.nv-stagger > *:nth-child(8) { animation-delay: .31s; }
.nv-stagger > *:nth-child(9) { animation-delay: .35s; }
.nv-stagger > *:nth-child(10) { animation-delay: .39s; }

/* ---------- 表格 ---------- */
.nv-table { width: 100%; border-collapse: separate; border-spacing: 0; }
.nv-table th {
    font-size: .76rem; font-weight: 600; text-align: left;
    color: var(--nv-muted);
    padding: .7em .9em;
    background: #f8fafc;
    border-bottom: 1px solid var(--nv-line);
    white-space: nowrap;
}
.nv-table td {
    padding: .72em .9em;
    font-size: .86rem;
    border-bottom: 1px solid #f1f5f9;
    transition: background-color .18s;
}
.nv-table tbody tr:hover td { background: var(--nv-primary-soft); }
.nv-table tbody tr:last-child td { border-bottom: none; }

/* ---------- 开关 ---------- */
.nv-switch {
    position: relative;
    width: 2.6em; height: 1.5em;
    background: #cbd5e1;
    border-radius: 999px;
    cursor: pointer;
    transition: background-color .26s var(--nv-ease);
    flex: none;
}
.nv-switch::after {
    content: '';
    position: absolute; top: .18em; left: .18em;
    width: 1.14em; height: 1.14em;
    background: #fff;
    border-radius: 50%;
    box-shadow: 0 2px 6px rgba(15,23,42,.25);
    transition: transform .26s var(--nv-ease);
}
.nv-switch.is-on { background: var(--nv-primary); }
.nv-switch.is-on::after { transform: translateX(1.1em); }

/* ---------- 分区标题 ---------- */
.nv-section-title {
    display: flex; align-items: center; gap: .55em;
    font-size: 1rem; font-weight: 700; color: var(--nv-ink);
}
.nv-section-title::before {
    content: '';
    width: 4px; height: 1.05em;
    border-radius: 4px;
    background: var(--nv-grad-brand);
}

/* ---------- 空状态 ---------- */
.nv-empty {
    display: flex; flex-direction: column; align-items: center; gap: .6em;
    padding: 3em 1em;
    color: var(--nv-muted);
    animation: nvUp .45s var(--nv-ease) both;
}
.nv-empty-icon {
    display: flex; align-items: center; justify-content: center;
    width: 3.4em; height: 3.4em;
    border-radius: 50%;
    background: var(--nv-primary-soft);
    color: var(--nv-primary);
    font-size: 1.3rem;
}

/* ---------- 价格 / 商品卡 ---------- */
.nv-price {
    font-weight: 800;
    color: var(--nv-rose);
    font-variant-numeric: tabular-nums;
}
.nv-price::before { content: '¥'; font-size: .68em; font-weight: 700; margin-right: .06em; }

/* 热门商品角标 */
.nv-ribbon {
    position: absolute; top: .8em; right: -2.6em;
    padding: .22em 2.6em;
    font-size: .68rem; font-weight: 700; color: #fff;
    background: var(--nv-grad-warm);
    transform: rotate(38deg);
    box-shadow: 0 4px 10px -4px rgba(244,63,94,.5);
}

/* ---------- 头像 ---------- */
.nv-avatar-ring {
    padding: 3px;
    border-radius: 50%;
    background: var(--nv-grad-brand);
    box-shadow: var(--nv-shadow-md);
}
.nv-avatar-ring img {
    display: block;
    border-radius: 50%;
    border: 2.5px solid #fff;
    background: #fff;
}
/* 头像光环旋转 */
.nv-avatar-halo { position: relative; }
.nv-avatar-halo::before {
    content: '';
    position: absolute; inset: -5px;
    border-radius: 50%;
    background: conic-gradient(from 0deg, var(--nv-primary), var(--nv-pink), var(--nv-cyan), var(--nv-primary));
    animation: nvSpin 4.5s linear infinite;
    z-index: -1;
    filter: blur(1px);
    opacity: .85;
}

/* ---------- 响应式工具 ---------- */
@media (max-width: 640px) {
    .nv-card:hover { transform: none; box-shadow: var(--nv-shadow-sm); }
    .nv-tile:hover { transform: none; }
    .nv-btn:hover { transform: none; }
    .nv-orb { display: none; }
}

/* ---------- 无障碍：减少动效 ---------- */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .01ms !important;
    }
    .nv-reveal { opacity: 1; transform: none; }
}

/* ---------- 打印 ---------- */
@media print {
    .nv-header, .nv-tabbar, .nv-loading-veil { display: none !important; }
}

/* ============================================================
   全局动态背景层：样式位于 assets/css/nv-fx.css（member 页由
   nova.js 自动注入层标记；独立页面手动放置标记）
   ============================================================ */

/* ============================================================
   按钮动态效果（渐变流动 / 悬停辉光 / 图标位移）
   ============================================================ */
/* 渐变主按钮：底色放大，悬停时流动换位 */
.nv-btn-primary, .nv-btn-cool, .nv-btn-mint, .nv-btn-warm {
    background-size: 160% 160%;
    background-position: 0% 50%;
    transition: transform .18s var(--nv-ease), box-shadow .25s var(--nv-ease),
                background-position .7s var(--nv-ease), filter .25s var(--nv-ease);
}
.nv-btn-primary:hover, .nv-btn-cool:hover, .nv-btn-mint:hover, .nv-btn-warm:hover {
    background-position: 100% 50%;
}
/* 悬停辉光脉冲（用于 Hero 主 CTA） */
.nv-btn-glow { animation: nvBtnGlow 2.6s ease-in-out infinite; }
@keyframes nvBtnGlow {
    0%, 100% { box-shadow: 0 8px 20px -8px rgba(20, 184, 166, .5); }
    50%      { box-shadow: 0 10px 32px -6px rgba(20, 184, 166, .78); }
}
.nv-btn-primary.nv-btn-glow {
    animation: nvBtnGlow 2.6s ease-in-out infinite;
}
/* 图标微位移反馈 */
.nv-btn i { transition: transform .22s var(--nv-ease); }
.nv-btn:hover i.fa-arrow-right, .nv-btn:hover i.fa-rocket,
.nv-btn:hover i.fa-right-to-bracket, .nv-btn:hover i.fa-user-plus {
    transform: translateX(3px);
}
.nv-btn:hover i.fa-download, .nv-btn:hover i.fa-wallet {
    transform: translateY(2px);
}
/* 幽灵/软按钮悬停时也获得渐变上浮 */
.nv-btn-ghost, .nv-btn-soft { transition: transform .18s var(--nv-ease), box-shadow .2s var(--nv-ease), border-color .2s var(--nv-ease), background-color .2s var(--nv-ease); }
.nv-btn-ghost:hover, .nv-btn-soft:hover { transform: translateY(-2px); }

/* 旧页面渐变按钮同步获得流动效果 */
main .bg-gradient-to-r, main .bg-gradient-to-br {
    background-size: 160% 160%;
    background-position: 0% 50%;
    transition: transform .18s var(--nv-ease), box-shadow .18s var(--nv-ease),
                filter .18s var(--nv-ease), background-position .7s var(--nv-ease);
}
main .bg-gradient-to-r:hover, main .bg-gradient-to-br:hover {
    background-position: 100% 50%;
}

/* ============================================================
   存量页面适配层：让尚未逐一重写的页面自动获得 Nova 交互反馈
   ============================================================ */
/* 渐变主按钮：悬停微抬升 + 饱和提亮 + 按压回弹 */
main .bg-gradient-to-r {
    transition: transform .18s var(--nv-ease), box-shadow .18s var(--nv-ease), filter .18s var(--nv-ease);
}
main .bg-gradient-to-r:hover { transform: translateY(-1px); filter: saturate(1.1); }
main .bg-gradient-to-r:active { transform: scale(.98); }
/* 表单控件：聚焦光环 */
main input.border, main select.border, main textarea.border {
    border-radius: 10px;
    transition: border-color .2s var(--nv-ease), box-shadow .2s var(--nv-ease);
}
main input.border:focus, main select.border:focus, main textarea.border:focus {
    border-color: var(--nv-primary);
    box-shadow: 0 0 0 4px rgba(99, 102, 241, .14);
    outline: none;
}
/* 表格行悬停高亮 */
main tbody tr, main .divide-y > * { transition: background-color .18s var(--nv-ease); }
main tbody tr:hover { background: var(--nv-primary-soft); }
/* 通用链接悬停 */
main a.text-indigo-600:hover, main a.hover\:text-indigo-600:hover { color: var(--nv-pink); }
/* 卡片进场（动画始终播放，不依赖观察器） */
main .nv-anim-up { animation: nvUp .5s var(--nv-ease) both; }
/* 旧版弹窗面板圆角统一 */
main ~ .fixed .bg-white { border-radius: var(--nv-r-xl); }

