glow-shadow

افزودن سایه، درخشش نئونی و جلوه‌های نور برای عمق بیشتر رابط کاربری.

این Skill برای طراحی و پیاده‌سازی glow، shadow، انعکاس، light sweep و جلوه‌های نئونی در رابط‌های کاربری و موشن‌هاست. از الگوهای CSS، GSAP و Framer Motion برای ایجاد عمق، برجستگی و تأکید بصری استفاده می‌کند.

با تکیه بر توکن‌های W3C DTCG و سطوح elevation در Material Design 3، می‌توانید افکت‌ها را منسجم و قابل‌تنظیم بسازید و برای prefers-reduced-motion نیز جایگزین مناسب داشته باشید.

چه چیزی می‌گیرید

  • توکن‌های آماده برای glow radius و سطوح shadow از `level-1` تا `level-5`
  • الگوهای CSS، GSAP و Framer Motion برای glow، neon، light sweep و reflection
  • پیاده‌سازی سایه‌های elevation، inner shadow، long shadow و چندلایه
  • حالت‌های تعاملی مانند glow on hover و تغییر ارتفاع کارت
  • راهنمای سازگاری با `prefers-reduced-motion` برای تجربه دسترس‌پذیرتر

برای چه کاری خوب است

  • طراحان و توسعه‌دهندگان رابط کاربری که به کارت‌ها، دکمه‌ها و مودال‌ها عمق بصری می‌دهند
  • ساخت داشبوردها، صفحات محصول و رابط‌های مدرن با جلوه‌های نئونی یا نورپردازی تعاملی
  • پروژه‌هایی که به سیستم منسجم shadow و elevation بر پایه Material Design 3 نیاز دارند

برای چه کاری نیست

  • پروژه‌هایی که به افکت‌های کاملاً سه‌بعدی، particle simulation یا نورپردازی WebGL نیاز دارند
  • رابط‌های بسیار ساده که در آن‌ها سایه و درخشش اضافی باعث شلوغی بصری می‌شود

دربارهٔ این اسکیل

Glow & Shadow

Light effects, shadows, and reflections for depth and emphasis.

Standards Reference

StandardDocumentation
W3C DTCGdesigntokens.org
Material Design 3m3.material.io/styles/elevation
CSS Box Shadowdeveloper.mozilla.org/CSS/box-shadow

Quick Reference

Load from: tokens/glow-shadow.tokens.json

Glow Radius

TokenValueUse
tight4pxClose glow
medium16pxStandard glow
large32pxWide glow
bloom80pxBloom effect

Shadow Elevation (M3)

TokenShadowUse
level-11px/2pxCards at rest
level-22px/4pxRaised cards
level-34px/8pxDialogs
level-48px/16pxModals
level-516px/32pxFloating

Selection Guide

What effect?
│
├── GLOW → Light emanation
│   ├── Subtle → intensity 0.3, radius 8px
│   ├── Strong → intensity 1, radius 16px
│   ├── Neon → inner + outer glow, color
│   └── Bloom → intensity 1.5+, radius 48px+
│
├── SHADOW → Depth indication
│   ├── Contact → offset 0, small blur
│   ├── Elevation 1-5 → M3 scale
│   ├── Long → large offset for drama
│   └── Inner → inset shadow
│
├── LIGHT SWEEP → Shine animation
│   ├── Fast → 500ms
│   ├── Normal → 1000ms
│   └── Angle typically -45deg
│
└── REFLECTION → Mirror effect
    ├── Subtle → 10% opacity
    ├── Strong → 50% opacity
    └── Gradient fade required

Patterns

Animated Glow

Pulsing glow effect.

CSS:

.glow {
  box-shadow:
    0 0 8px rgba(59, 130, 246, 0.5),  /* {motion.glow.radius.small} */
    0 0 16px rgba(59, 130, 246, 0.3); /* {motion.glow.radius.medium} */
  animation: glow-pulse 2s ease-in-out infinite;
}

@keyframes glow-pulse {
  0%, 100% {
    box-shadow:
      0 0 8px rgba(59, 130, 246, 0.5),
      0 0 16px rgba(59, 130, 246, 0.3);
  }
  50% {
    box-shadow:
      0 0 12px rgba(59, 130, 246, 0.8),
      0 0 24px rgba(59, 130, 246, 0.5);
  }
}

Framer Motion:

<motion.div
  animate={{
    boxShadow: [
      '0 0 8px rgba(59, 130, 246, 0.5)',
      '0 0 16px rgba(59, 130, 246, 0.8)',
      '0 0 8px rgba(59, 130, 246, 0.5)'
    ]
  }}
  transition={{
    duration: 2,
    repeat: Infinity,
    ease: "easeInOut"
  }}
/>

Neon Glow

Neon sign effect with flicker.

CSS:

.neon {
  color: #fff;
  text-shadow:
    0 0 2px #fff,                    /* Inner white */
    0 0 4px #fff,
    0 0 8px #ff00de,                 /* Inner color */
    0 0 16px #ff00de,
    0 0 32px #ff00de,                /* Outer color */
    0 0 48px #ff00de;
  animation: neon-flicker 3s infinite;
}

@keyframes neon-flicker {
  0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% {
    text-shadow:
      0 0 2px #fff,
      0 0 4px #fff,
      0 0 8px #ff00de,
      0 0 16px #ff00de,
      0 0 32px #ff00de,
      0 0 48px #ff00de;
  }
  20%, 24%, 55% {
    text-shadow: none;
  }
}

GSAP:

gsap.to('.neon', {
  textShadow: `
    0 0 2px #fff,
    0 0 4px #fff,
    0 0 8px #ff00de,
    0 0 24px #ff00de,
    0 0 48px #ff00de
  `,
  duration: 0.1,
  repeat: -1,
  yoyo: true,
  ease: "rough({ strength: 1, points: 20, clamp: true })"
});

Elevation Shadow (M3)

Material Design elevation levels.

CSS:

/* Level 1 - Cards at rest */
.elevation-1 {
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
  /* {motion.shadow.elevation.level-1} */
}

/* Level 2 - Raised cards */
.elevation-2 {
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
}

/* Level 3 - Dialogs */
.elevation-3 {
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
}

/* Level 4 - Modals */
.elevation-4 {
  box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
}

/* Level 5 - Floating */
.elevation-5 {
  box-shadow: 0 16px 32px rgba(0, 0, 0, 0.15);
}

/* Animated elevation change */
.card {
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.15);
  transition: box-shadow 200ms ease-out;
}

.card:hover {
  box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15);
}

Framer Motion:

const cardVariants = {
  rest: {
    boxShadow: '0 1px 2px rgba(0, 0, 0, 0.15)'
  },
  hover: {
    boxShadow: '0 8px 16px rgba(0, 0, 0, 0.15)',
    transition: { duration: 0.2 }
  }
};

<motion.div
  variants={cardVariants}
  initial="rest"
  whileHover="hover"
/>

Light Sweep / Shine

Moving light highlight effect.

CSS:

.light-sweep {
  position: relative;
  overflow: hidden;
}

.light-sweep::after {
  content: '';
  position: absolute;
  top: -50%;
  left: -100%;
  width: 60px;    /* {motion.glow.light-sweep.width-medium} */
  height: 200%;
  background: linear-gradient(
    to right,
    transparent,
    rgba(255, 255, 255, 0.3),
    transparent
  );
  transform: rotate(-45deg);
  animation: sweep 3s ease-in-out infinite;
}

@keyframes sweep {
  0% { left: -100%; }
  50%, 100% { left: 200%; }
}

GSAP:

gsap.fromTo('.shine-element::after',
  { left: '-100%' },
  {
    left: '200%',
    duration: 1,         // {motion.glow.light-sweep.duration-normal}
    ease: 'power2.inOut',
    repeat: -1,
    repeatDelay: 2
  }
);

Inner Shadow

Inset shadow for pressed/recessed look.

CSS:

.inset {
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);
  /* {motion.shadow.inner.medium} */
}

/* Button pressed state */
.button:active {
  box-shadow:
    inset 0 2px 4px rgba(0, 0, 0, 0.2),
    0 1px 0 rgba(255, 255, 255, 0.1);
}

Long Shadow

Flat design long shadow.

CSS:

.long-shadow {
  text-shadow:
    1px 1px 0 #333,
    2px 2px 0 #333,
    3px 3px 0 #333,
    4px 4px 0 #333,
    5px 5px 0 #333,
    6px 6px 0 #333,
    7px 7px 0 #333,
    8px 8px 0 #333;
}

/* Generated programmatically */
.long-shadow-generated {
  --shadow-color: rgba(0, 0, 0, 0.2);
  text-shadow: var(--long-shadow);
}

JavaScript (Generate long shadow):

function generateLongShadow(length, color) {
  const shadows = [];
  for (let i = 1; i <= length; i++) {
    shadows.push(`${i}px ${i}px 0 ${color}`);
  }
  return shadows.join(', ');
}

element.style.textShadow = generateLongShadow(20, 'rgba(0,0,0,0.2)');

Reflection Effect

Floor reflection.

CSS:

.reflection-container {
  position: relative;
}

.reflection {
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  transform: scaleY(-1);
  opacity: 0.3;                      /* {motion.reflection.opacity.medium} */
  mask-image: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 0.5) 0%,
    transparent 50%                  /* {motion.reflection.gradient-fade.medium} */
  );
  -webkit-mask-image: linear-gradient(
    to bottom,
    rgba(0, 0, 0, 0.5) 0%,
    transparent 50%
  );
}

Multiple Shadow Layers

Realistic multi-layer shadow.

CSS:

.realistic-shadow {
  box-shadow:
    /* Ambient */
    0 1px 1px rgba(0, 0, 0, 0.04),
    /* Key light */
    0 2px 2px rgba(0, 0, 0, 0.04),
    0 4px 4px rgba(0, 0, 0, 0.04),
    0 8px 8px rgba(0, 0, 0, 0.04),
    /* Main shadow */
    0 16px 16px rgba(0, 0, 0, 0.04);
}

/* Hover: lift effect */
.realistic-shadow:hover {
  box-shadow:
    0 2px 2px rgba(0, 0, 0, 0.04),
    0 4px 4px rgba(0, 0, 0, 0.04),
    0 8px 8px rgba(0, 0, 0, 0.04),
    0 16px 16px rgba(0, 0, 0, 0.04),
    0 32px 32px rgba(0, 0, 0, 0.04);
  transform: translateY(-4px);
  transition: all 0.3s ease;
}

Glow on Hover

Interactive glow effect.

CSS:

.glow-hover {
  transition: box-shadow 300ms ease-out;
}

.glow-hover:hover {
  box-shadow:
    0 0 8px rgba(59, 130, 246, 0.4),
    0 0 16px rgba(59, 130, 246, 0.2),
    0 0 32px rgba(59, 130, 246, 0.1);
}

Framer Motion:

<motion.button
  whileHover={{
    boxShadow: '0 0 20px rgba(59, 130, 246, 0.5)'
  }}
  transition={{ duration: 0.3 }}
>
  Hover me
</motion.button>

Reduced Motion

For prefers-reduced-motion: reduce:

Full MotionReduced Alternative
Pulsing glowStatic glow
Light sweepNo animation or instant
Neon flickerConstant glow
Shadow transitionsInstant change

Implementation:

@media (prefers-reduced-motion: reduce) {
  .glow {
    animation: none;
  }

  .light-sweep::after {
    animation: none;
    display: none;
  }

  .neon {
    animation: none;
  }

  .card {
    transition-duration: 0.01ms;
  }
}

Cross-References

  • See opacity/ for fade + shadow combinations
  • See scale/ for elevation with scale changes
  • See blur/ for soft focus effects with glow
  • See particles/ for glowing particles

References

  • No additional references needed for this skill

دانلود ZIP