.fade-in-up {
  opacity: 0;
  transform: translateY(30px);
  animation: fadeInUp 0.8s cubic-bezier(0.25, 0.1, 0.25, 1) forwards;
}

@keyframes fadeInUp {
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.fade-in {
  opacity: 0;
  animation: fadeIn 0.6s ease forwards;
}

@keyframes fadeIn {
  to {
    opacity: 1;
  }
}

.scale-in {
  opacity: 0;
  transform: scale(0.96);
  animation: scaleIn 0.7s cubic-bezier(0.25, 0.1, 0.25, 1) forwards;
}

@keyframes scaleIn {
  to {
    opacity: 1;
    transform: scale(1);
  }
}

.slide-in-left {
  opacity: 0;
  transform: translateX(-40px);
  animation: slideInLeft 0.8s cubic-bezier(0.25, 0.1, 0.25, 1) forwards;
}

@keyframes slideInLeft {
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

.slide-in-right {
  opacity: 0;
  transform: translateX(40px);
  animation: slideInRight 0.8s cubic-bezier(0.25, 0.1, 0.25, 1) forwards;
}

@keyframes slideInRight {
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

.animate-on-scroll {
  opacity: 0;
  transform: translateY(30px);
  transition: opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);
}

.animate-on-scroll.animated {
  opacity: 1;
  transform: translateY(0);
}

.product-card-large.animate-on-scroll:nth-child(1) { transition-delay: 0s; }
.product-card-large.animate-on-scroll:nth-child(2) { transition-delay: 0.1s; }
.product-card-large.animate-on-scroll:nth-child(3) { transition-delay: 0.2s; }
.product-card-large.animate-on-scroll:nth-child(4) { transition-delay: 0.3s; }
.product-card-large.animate-on-scroll:nth-child(5) { transition-delay: 0.4s; }
.product-card-large.animate-on-scroll:nth-child(6) { transition-delay: 0.5s; }

.stat-card.animate-on-scroll:nth-child(1) { transition-delay: 0s; }
.stat-card.animate-on-scroll:nth-child(2) { transition-delay: 0.1s; }
.stat-card.animate-on-scroll:nth-child(3) { transition-delay: 0.2s; }
.stat-card.animate-on-scroll:nth-child(4) { transition-delay: 0.3s; }

.feature-block.animate-on-scroll .feature-media {
  opacity: 0;
  transform: translateX(-30px);
  transition: opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);
}

.feature-block.animate-on-scroll .feature-content {
  opacity: 0;
  transform: translateX(30px);
  transition: opacity 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.12s,
              transform 0.9s cubic-bezier(0.16, 1, 0.3, 1) 0.12s;
}

.feature-block.animate-on-scroll.animated .feature-media,
.feature-block.animate-on-scroll.animated .feature-content {
  opacity: 1;
  transform: translateX(0);
}

.feature-reverse.animate-on-scroll .feature-media {
  transform: translateX(40px);
}

.feature-reverse.animate-on-scroll .feature-content {
  transform: translateX(-40px);
}

.hero-headline .headline-line {
  opacity: 0;
  transform: translateY(100%);
  animation: headlineReveal 1.2s cubic-bezier(0.16, 1, 0.3, 1) forwards;
}

.hero-headline .headline-line:nth-child(1) {
  animation-delay: 0.3s;
}

.hero-headline .headline-line:nth-child(2) {
  animation-delay: 0.5s;
}

@keyframes headlineReveal {
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.hero-eyebrow {
  opacity: 0;
  transform: translateY(16px);
  animation: fadeInUp 0.8s cubic-bezier(0.16, 1, 0.3, 1) 0.1s forwards;
}

.hero-subheadline {
  opacity: 0;
  animation: fadeInUp 1s cubic-bezier(0.16, 1, 0.3, 1) 0.7s forwards;
}

.hero-cta-group {
  opacity: 0;
  animation: fadeInUp 1s cubic-bezier(0.16, 1, 0.3, 1) 0.9s forwards;
}

.hero-metrics {
  opacity: 0;
  animation: fadeInUp 1s cubic-bezier(0.16, 1, 0.3, 1) 1.2s forwards;
}

.btn-primary-large::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(135deg, rgba(255,255,255,0.15), transparent);
  opacity: 0;
  transition: opacity 0.3s ease;
  border-radius: inherit;
}

.btn-primary-large:hover::before {
  opacity: 1;
}

.feature-image-container::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.02), transparent 40%);
  opacity: 0;
  transition: opacity 0.4s ease;
  z-index: 1;
}

.feature-block:hover .feature-image-container::before {
  opacity: 1;
}

.map-node {
  animation: nodeAppear 0.5s cubic-bezier(0.25, 0.1, 0.25, 1) forwards;
  opacity: 0;
}

.map-node:nth-child(2) { animation-delay: 0.08s; }
.map-node:nth-child(3) { animation-delay: 0.16s; }
.map-node:nth-child(4) { animation-delay: 0.24s; }
.map-node:nth-child(5) { animation-delay: 0.32s; }
.map-node:nth-child(6) { animation-delay: 0.4s; }
.map-node:nth-child(7) { animation-delay: 0.48s; }

@keyframes nodeAppear {
  to {
    opacity: 1;
  }
}

.cta-headline {
  background: linear-gradient(180deg, #FFFFFF 0%, rgba(255,255,255,0.88) 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}

.cta-pattern {
  opacity: 0.3;
}

.metric-value {
  transition: all 0.3s ease;
}

@keyframes float {
  0%, 100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-12px);
  }
}

.float-animation {
  animation: float 6s ease-in-out infinite;
}

@keyframes shimmer {
  0% {
    background-position: -200% 0;
  }
  100% {
    background-position: 200% 0;
  }
}

.shimmer {
  background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.06) 50%, transparent 100%);
  background-size: 200% 100%;
  animation: shimmer 4s infinite;
}

.nav-link .iconify {
  transition: transform 0.2s ease;
}

.nav-dropdown:hover .nav-link .iconify {
  transform: rotate(180deg);
}

.footer-links a {
  transition: all 0.2s ease;
}

.social-link {
  transition: all 0.25s cubic-bezier(0.25, 0.1, 0.25, 1);
}

/* ===== 非线性动画（弹簧/弹性/回弹/视差） ===== */

/* 弹簧回弹入场：带过冲的非线性曲线 */
.bounce-in-up {
  opacity: 0;
  transform: translateY(40px) scale(0.92);
  animation: bounceInUp 0.9s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}

@keyframes bounceInUp {
  60% {
    opacity: 1;
    transform: translateY(-8px) scale(1.02);
  }
  100% {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}

/* 弹性缩放入场 */
.elastic-scale-in {
  opacity: 0;
  transform: scale(0.6);
  animation: elasticScaleIn 1s cubic-bezier(0.68, -0.55, 0.27, 1.55) forwards;
}

@keyframes elasticScaleIn {
  50% {
    opacity: 1;
    transform: scale(1.08);
  }
  70% {
    transform: scale(0.96);
  }
  100% {
    opacity: 1;
    transform: scale(1);
  }
}

/* 回弹式侧向滑入 */
.back-in-left {
  opacity: 0;
  transform: translateX(-60px) scale(0.9);
  animation: backInLeft 0.9s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}

.back-in-right {
  opacity: 0;
  transform: translateX(60px) scale(0.9);
  animation: backInRight 0.9s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}

@keyframes backInLeft {
  100% {
    opacity: 1;
    transform: translateX(0) scale(1);
  }
}

@keyframes backInRight {
  100% {
    opacity: 1;
    transform: translateX(0) scale(1);
  }
}

/* 非线性滚动入场：弹簧过冲 */
.spring-on-scroll {
  opacity: 0;
  transform: translateY(30px) scale(0.98);
  transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.8s cubic-bezier(0.22, 1.2, 0.36, 1);
}

.spring-on-scroll.animated {
  opacity: 1;
  transform: translateY(0) scale(1);
}

/* 错落式弹簧入场延迟 */
.spring-on-scroll:nth-child(1) { transition-delay: 0s; }
.spring-on-scroll:nth-child(2) { transition-delay: 0.12s; }
.spring-on-scroll:nth-child(3) { transition-delay: 0.24s; }
.spring-on-scroll:nth-child(4) { transition-delay: 0.36s; }
.spring-on-scroll:nth-child(5) { transition-delay: 0.48s; }
.spring-on-scroll:nth-child(6) { transition-delay: 0.6s; }

/* 弹性悬停：产品卡片 */
.product-card-large {
  transition: transform 0.45s cubic-bezier(0.16, 1, 0.3, 1),
              box-shadow 0.45s cubic-bezier(0.16, 1, 0.3, 1),
              border-color 0.3s ease,
              background-color 0.4s ease;
}

.product-card-large:hover {
  transform: translateY(-6px);
}

/* 主按钮弹簧悬停 + 光泽流动 */
.btn-primary-large {
  transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1),
              box-shadow 0.35s cubic-bezier(0.16, 1, 0.3, 1),
              background 0.25s ease;
}

.btn-primary-large:hover {
  transform: scale(1.02);
}

.btn-primary-large:active {
  transform: scale(0.99);
  transition: transform 0.12s cubic-bezier(0.4, 0, 0.2, 1);
}

/* 副按钮弹性反馈 */
.btn-secondary-large,
.btn-ghost-large {
  transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1),
              background 0.25s ease,
              border-color 0.25s ease;
}

.btn-secondary-large:hover,
.btn-ghost-large:hover {
  transform: scale(1.02);
}

.btn-secondary-large:active,
.btn-ghost-large:active {
  transform: scale(0.98);
  transition: transform 0.1s cubic-bezier(0.4, 0, 0.2, 1);
}

/* 3D 倾斜卡片：非线性透视（transition 由 product-card-large 提供，避免 shorthand 覆盖） */
.tilt-card {
  transform-style: preserve-3d;
  will-change: transform;
}

.tilt-card .tilt-inner {
  transform: translateZ(40px);
  transform-style: preserve-3d;
}

/* 非线性呼吸光晕 */
@keyframes breatheGlow {
  0%, 100% {
    opacity: 0.35;
    transform: scale(1);
  }
  45% {
    opacity: 0.6;
    transform: scale(1.12);
  }
  70% {
    opacity: 0.45;
    transform: scale(1.05);
  }
}

.product-glow {
  animation: breatheGlow 5s cubic-bezier(0.45, 0, 0.55, 1) infinite;
}

/* 非线性脉冲：地图节点 */
@keyframes nodePulseNonLinear {
  0% {
    transform: scale(0.8);
    opacity: 0.8;
  }
  40% {
    transform: scale(2.2);
    opacity: 0.2;
  }
  100% {
    transform: scale(3);
    opacity: 0;
  }
}

.node-pulse {
  animation: nodePulseNonLinear 2.5s cubic-bezier(0.16, 1, 0.3, 1) infinite;
}

/* 视差元素：由 JS 设置非线性的 translateY */
.parallax-element {
  will-change: transform;
  transition: transform 0.15s cubic-bezier(0.22, 1, 0.36, 1);
}

/* 标题渐变流光：非线性位移 */
@keyframes gradientSlide {
  0% {
    background-position: 0% 50%;
  }
  50% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}

.headline-gradient {
  background-size: 200% 200%;
  animation: gradientSlide 6s cubic-bezier(0.45, 0, 0.55, 1) infinite;
}

/* 滚动指示线：非线性下降 */
@keyframes scrollLineDrop {
  0% {
    transform: translateY(-100%);
    opacity: 0;
  }
  30% {
    opacity: 1;
  }
  70% {
    transform: translateY(100%);
    opacity: 0.4;
  }
  100% {
    transform: translateY(100%);
    opacity: 0;
  }
}

.scroll-line {
  animation: scrollLineDrop 2.2s cubic-bezier(0.16, 1, 0.3, 1) infinite;
}

/* 徽章脉冲点：非线性 */
@keyframes badgeDotPulse {
  0%, 100% {
    transform: scale(1);
    opacity: 1;
  }
  50% {
    transform: scale(1.4);
    opacity: 0.6;
  }
}

.badge-dot {
  animation: badgeDotPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}

/* 磁吸按钮容器（transition 由 btn-primary-large 提供，避免 shorthand 覆盖） */
.magnetic-btn {
  will-change: transform;
}

/* 指标卡片弹性悬停 */
.metric-card {
  transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1),
              background 0.3s ease,
              border-color 0.3s ease,
              box-shadow 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}

.metric-card:hover {
  transform: translateY(-4px) scale(1.02);
}

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }

  .animate-on-scroll {
    opacity: 1;
    transform: none;
  }

  .hero-headline .headline-line {
    opacity: 1;
    transform: none;
  }

  .hero-subheadline,
  .hero-cta-group,
  .hero-metrics {
    opacity: 1;
  }

  .hero-badge {
    animation: none;
  }

  .badge-dot {
    animation: none;
  }

  .badge-pulse {
    display: none;
  }

  .decoration-blur-circle,
  .decoration-ring {
    animation: none;
  }

  .hero-grid-lines {
    animation: none;
  }

  .scroll-line {
    animation: none;
    opacity: 0.6;
  }

  .product-glow {
    animation: none;
  }

  .feature-floating-icon {
    animation: none;
  }

  .node-pulse {
    animation: none;
  }

  .map-node {
    opacity: 1;
  }

  .headline-gradient {
    animation: none;
  }

  .bounce-in-up,
  .elastic-scale-in,
  .back-in-left,
  .back-in-right {
    opacity: 1;
    transform: none;
  }

  .spring-on-scroll {
    opacity: 1;
    transform: none;
  }

  .tilt-card,
  .parallax-element,
  .magnetic-btn {
    transform: none !important;
  }
}
