/* ============================================
   LENS & LIGHT - Animations Stylesheet
   All animations, transitions & effects
   ============================================ */

/* ---- Reveal Animations ---- */
.reveal {
  opacity: 0;
  transform: translateY(40px);
  transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.reveal.active {
  opacity: 1;
  transform: translateY(0);
}

.reveal-left {
  opacity: 0;
  transform: translateX(-60px);
  transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.reveal-left.active {
  opacity: 1;
  transform: translateX(0);
}

.reveal-right {
  opacity: 0;
  transform: translateX(60px);
  transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.reveal-right.active {
  opacity: 1;
  transform: translateX(0);
}

.reveal-scale {
  opacity: 0;
  transform: scale(0.85);
  transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.reveal-scale.active {
  opacity: 1;
  transform: scale(1);
}

.reveal-rotate {
  opacity: 0;
  transform: rotate(-5deg) translateY(30px);
  transition: all 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.reveal-rotate.active {
  opacity: 1;
  transform: rotate(0) translateY(0);
}

/* Stagger delay for children */
.stagger-children > *:nth-child(1) { transition-delay: 0s; }
.stagger-children > *:nth-child(2) { transition-delay: 0.1s; }
.stagger-children > *:nth-child(3) { transition-delay: 0.2s; }
.stagger-children > *:nth-child(4) { transition-delay: 0.3s; }
.stagger-children > *:nth-child(5) { transition-delay: 0.4s; }
.stagger-children > *:nth-child(6) { transition-delay: 0.5s; }
.stagger-children > *:nth-child(7) { transition-delay: 0.6s; }
.stagger-children > *:nth-child(8) { transition-delay: 0.7s; }
.stagger-children > *:nth-child(9) { transition-delay: 0.8s; }

/* ---- Text Effects ---- */
.text-reveal {
  overflow: hidden;
  position: relative;
}

.text-reveal span {
  display: inline-block;
  transform: translateY(100%);
  transition: transform 0.6s cubic-bezier(0.77, 0, 0.175, 1);
}

.text-reveal.active span {
  transform: translateY(0);
}

/* Letter-by-letter animation */
.split-text .char {
  display: inline-block;
  opacity: 0;
  transform: translateY(20px) rotateX(-90deg);
  transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.split-text.active .char {
  opacity: 1;
  transform: translateY(0) rotateX(0);
}

/* Typewriter effect */
.typewriter {
  overflow: hidden;
  border-right: 2px solid var(--color-primary);
  white-space: nowrap;
  animation: typewriter 3s steps(30) 1s forwards, blinkCaret 0.75s step-end infinite;
  width: 0;
}

@keyframes typewriter {
  to { width: 100%; }
}

@keyframes blinkCaret {
  50% { border-color: transparent; }
}

/* Glitch text effect */
.glitch-text {
  position: relative;
}

.glitch-text::before,
.glitch-text::after {
  content: attr(data-text);
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
}

.glitch-text:hover::before {
  opacity: 0.8;
  color: #ff00ff;
  animation: glitch1 0.3s infinite;
}

.glitch-text:hover::after {
  opacity: 0.8;
  color: #00ffff;
  animation: glitch2 0.3s infinite;
}

@keyframes glitch1 {
  0% { clip-path: inset(20% 0 60% 0); transform: translate(-3px, 2px); }
  20% { clip-path: inset(60% 0 10% 0); transform: translate(3px, -2px); }
  40% { clip-path: inset(40% 0 40% 0); transform: translate(-2px, 3px); }
  60% { clip-path: inset(80% 0 5% 0); transform: translate(2px, -3px); }
  80% { clip-path: inset(10% 0 70% 0); transform: translate(3px, 2px); }
  100% { clip-path: inset(50% 0 30% 0); transform: translate(-3px, -2px); }
}

@keyframes glitch2 {
  0% { clip-path: inset(60% 0 20% 0); transform: translate(3px, -2px); }
  20% { clip-path: inset(10% 0 60% 0); transform: translate(-3px, 2px); }
  40% { clip-path: inset(40% 0 40% 0); transform: translate(2px, -3px); }
  60% { clip-path: inset(5% 0 80% 0); transform: translate(-2px, 3px); }
  80% { clip-path: inset(70% 0 10% 0); transform: translate(-3px, -2px); }
  100% { clip-path: inset(30% 0 50% 0); transform: translate(3px, 2px); }
}

/* ---- Image Effects ---- */
.img-grayscale {
  filter: grayscale(100%);
  transition: filter 0.6s ease;
}

.img-grayscale:hover {
  filter: grayscale(0%);
}

.img-sepia {
  filter: sepia(30%);
  transition: filter 0.6s ease;
}

.img-sepia:hover {
  filter: sepia(0%);
}

.img-zoom {
  overflow: hidden;
}

.img-zoom img {
  transition: transform 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.img-zoom:hover img {
  transform: scale(1.08);
}

.img-tilt {
  transition: transform 0.3s ease;
}

.img-tilt:hover {
  transform: perspective(1000px) rotateY(5deg) rotateX(3deg);
}

/* Ken Burns Effect */
.ken-burns {
  animation: kenBurns 20s infinite alternate;
}

@keyframes kenBurns {
  0% { transform: scale(1) translate(0, 0); }
  100% { transform: scale(1.15) translate(-2%, -2%); }
}

/* Image reveal with mask */
.img-reveal {
  position: relative;
  overflow: hidden;
}

.img-reveal::after {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: var(--color-dark);
  transform-origin: right;
  transform: scaleX(1);
  transition: transform 0.8s cubic-bezier(0.77, 0, 0.175, 1);
}

.img-reveal.active::after {
  transform: scaleX(0);
}

/* ---- Hover Card Effects ---- */
.hover-lift {
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.hover-lift:hover {
  transform: translateY(-10px);
  box-shadow: var(--shadow-lg);
}

.hover-glow {
  transition: box-shadow var(--transition-fast);
}

.hover-glow:hover {
  box-shadow: 0 0 30px rgba(201, 169, 110, 0.3);
}

.hover-border {
  position: relative;
  overflow: hidden;
}

.hover-border::before {
  content: '';
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 3px;
  background: var(--color-primary);
  transform: scaleX(0);
  transform-origin: right;
  transition: transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}

.hover-border:hover::before {
  transform: scaleX(1);
  transform-origin: left;
}

/* 3D Card Flip */
.card-3d {
  perspective: 1000px;
}

.card-3d-inner {
  transition: transform 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  transform-style: preserve-3d;
}

.card-3d:hover .card-3d-inner {
  transform: rotateY(180deg);
}

.card-3d-front,
.card-3d-back {
  backface-visibility: hidden;
}

.card-3d-back {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  transform: rotateY(180deg);
}

/* ---- Particle / Ambient Effects ---- */
.particle-canvas {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 1;
}

/* Floating particles animation */
.particle {
  position: absolute;
  width: 3px;
  height: 3px;
  background: var(--color-primary);
  border-radius: 50%;
  opacity: 0;
  animation: particleFloat 6s infinite;
}

@keyframes particleFloat {
  0% { opacity: 0; transform: translateY(0) translateX(0); }
  10% { opacity: 0.6; }
  90% { opacity: 0.6; }
  100% { opacity: 0; transform: translateY(-200px) translateX(50px); }
}

/* ---- Cursor Effects ---- */
.custom-cursor {
  position: fixed;
  width: 20px;
  height: 20px;
  border: 2px solid var(--color-primary);
  border-radius: 50%;
  pointer-events: none;
  z-index: 9999;
  transition: all 0.15s ease;
  transform: translate(-50%, -50%);
  opacity: 0;
}

.custom-cursor.visible {
  opacity: 1;
}

.custom-cursor.hover {
  width: 50px;
  height: 50px;
  border-color: var(--color-primary-light);
  background: rgba(201, 169, 110, 0.1);
}

/* ---- Magnetic Effect ---- */
.magnetic {
  transition: transform 0.3s ease;
}

/* ---- Parallax ---- */
.parallax-layer {
  will-change: transform;
  transition: transform 0.1s linear;
}

/* ---- Shimmer Effect ---- */
.shimmer {
  position: relative;
  overflow: hidden;
}

.shimmer::after {
  content: '';
  position: absolute;
  top: 0;
  left: -100%;
  width: 50%;
  height: 100%;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.05), transparent);
  animation: shimmer 3s infinite;
}

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

/* ---- Ripple Effect ---- */
.ripple {
  position: relative;
  overflow: hidden;
}

.ripple-effect {
  position: absolute;
  border-radius: 50%;
  background: rgba(201, 169, 110, 0.3);
  transform: scale(0);
  animation: rippleAnim 0.6s linear;
  pointer-events: none;
}

@keyframes rippleAnim {
  to { transform: scale(4); opacity: 0; }
}

/* ---- Counter Animation ---- */
.counter-animate {
  font-variant-numeric: tabular-nums;
}

/* ---- Marquee ---- */
.marquee-wrapper {
  overflow: hidden;
  white-space: nowrap;
}

.marquee-content {
  display: inline-block;
  animation: marquee 25s linear infinite;
}

@keyframes marquee {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}

/* ---- Pulse Ring ---- */
.pulse-ring {
  position: relative;
}

.pulse-ring::after {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  height: 100%;
  border: 2px solid var(--color-primary);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  animation: pulseRing 2s infinite;
}

@keyframes pulseRing {
  0% { transform: translate(-50%, -50%) scale(1); opacity: 1; }
  100% { transform: translate(-50%, -50%) scale(1.5); opacity: 0; }
}

/* ---- Gradient Animation ---- */
.gradient-animate {
  background: linear-gradient(270deg, var(--color-primary), var(--color-primary-dark), var(--color-primary-light));
  background-size: 600% 600%;
  animation: gradientShift 6s ease infinite;
}

@keyframes gradientShift {
  0% { background-position: 0% 50%; }
  50% { background-position: 100% 50%; }
  100% { background-position: 0% 50%; }
}

/* ---- Text Stroke Effect ---- */
.text-stroke {
  -webkit-text-stroke: 1px var(--color-primary);
  color: transparent;
  transition: color var(--transition-fast);
}

.text-stroke:hover {
  color: var(--color-primary);
}

/* ---- Rotating Border ---- */
.rotating-border {
  position: relative;
  overflow: hidden;
}

.rotating-border::before {
  content: '';
  position: absolute;
  top: -50%;
  left: -50%;
  width: 200%;
  height: 200%;
  background: conic-gradient(transparent, var(--color-primary), transparent 30%);
  animation: rotateBorder 4s linear infinite;
  opacity: 0;
  transition: opacity var(--transition-fast);
}

.rotating-border:hover::before {
  opacity: 1;
}

.rotating-border::after {
  content: '';
  position: absolute;
  inset: 2px;
  background: var(--color-dark-lighter);
  z-index: 0;
}

@keyframes rotateBorder {
  100% { transform: rotate(360deg); }
}

/* ---- Elastic Hover ---- */
.elastic:hover {
  animation: elastic 0.5s;
}

@keyframes elastic {
  0% { transform: scale(1); }
  30% { transform: scale(1.05); }
  60% { transform: scale(0.95); }
  100% { transform: scale(1); }
}

/* ---- Noise Texture Overlay ---- */
.noise-overlay::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0.03;
  pointer-events: none;
  z-index: 10;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
}
