From modern-web-design
Provides 2024-2025 web design trends, principles, and CSS patterns for bold minimalism, performance optimization, accessibility, micro-interactions, and design systems.
npx claudepluginhub freshtechbro/claudedesignskills --plugin modern-web-designThis skill uses the workspace's default tool permissions.
Modern web design in 2024-2025 emphasizes performance, accessibility, and meaningful interactions. This skill provides comprehensive guidance on current design trends, implementation patterns, and best practices for creating engaging, accessible, and performant web experiences.
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Modern web design in 2024-2025 emphasizes performance, accessibility, and meaningful interactions. This skill provides comprehensive guidance on current design trends, implementation patterns, and best practices for creating engaging, accessible, and performant web experiences.
This meta-skill synthesizes knowledge from all animation, interaction, and 3D skills in this repository to provide holistic design guidance.
Philosophy: Design decisions should prioritize Core Web Vitals and user experience on all devices.
Key Metrics:
Implementation Guidelines:
Related Skills: gsap-scrolltrigger, motion-framer, lottie-animations for optimized animations
Characteristics:
Typography Scale (Modern fluid system):
/* Fluid typography using clamp() */
--font-size-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem);
--font-size-sm: clamp(0.875rem, 0.8rem + 0.375vw, 1rem);
--font-size-base: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
--font-size-lg: clamp(1.25rem, 1.1rem + 0.75vw, 1.75rem);
--font-size-xl: clamp(1.75rem, 1.5rem + 1.25vw, 2.5rem);
--font-size-2xl: clamp(2.5rem, 2rem + 2.5vw, 4rem);
--font-size-3xl: clamp(3.5rem, 2.5rem + 5vw, 6rem);
Color System (Accessibility-first):
/* WCAG AAA compliant color system */
--color-primary: oklch(50% 0.2 250); /* Blue */
--color-accent: oklch(65% 0.25 30); /* Coral */
--color-neutral-50: oklch(98% 0 0);
--color-neutral-900: oklch(20% 0 0);
/* Contrast ratio: minimum 7:1 for text */
Related Skills: animated-component-libraries for UI components
Definition: Small, purposeful animations that provide feedback, guide users, and enhance perceived performance.
Categories:
a) Hover States (Desktop):
b) Loading States:
c) Interactive Feedback:
Implementation Example (Framer Motion):
// Button with micro-interaction
<motion.button
whileHover={{ scale: 1.05, y: -2 }}
whileTap={{ scale: 0.95 }}
transition={{ type: "spring", stiffness: 400, damping: 17 }}
>
Click me
</motion.button>
Related Skills: motion-framer, react-spring-physics, animejs for micro-interactions
Definition: Narrative-driven experiences where content reveals and transforms as the user scrolls.
Patterns:
a) Scroll-Triggered Reveals:
b) Scroll-Linked Animations:
c) Progress Indicators:
Implementation Example (GSAP ScrollTrigger):
// Scroll-linked 3D rotation
gsap.to(".cube", {
scrollTrigger: {
trigger: ".section",
start: "top top",
end: "bottom top",
scrub: 1, // Smooth scrubbing
},
rotationY: 360,
ease: "none"
});
Related Skills: gsap-scrolltrigger, locomotive-scroll, scroll-reveal-libraries, react-three-fiber for 3D scrollytelling
Evolution: Custom cursors that enhance interaction and provide contextual feedback.
Patterns:
a) Custom Cursor Shapes:
b) Contextual Transformations:
c) Performance Considerations:
prefers-reduced-motionImplementation Example:
// Simple smooth cursor follower
const cursor = document.querySelector('.cursor');
let mouseX = 0, mouseY = 0;
let cursorX = 0, cursorY = 0;
document.addEventListener('mousemove', (e) => {
mouseX = e.clientX;
mouseY = e.clientY;
});
function updateCursor() {
// Smooth easing
cursorX += (mouseX - cursorX) * 0.1;
cursorY += (mouseY - cursorY) * 0.1;
cursor.style.transform = `translate(${cursorX}px, ${cursorY}px)`;
requestAnimationFrame(updateCursor);
}
updateCursor();
Related Skills: gsap-scrolltrigger (for easing), motion-framer (for React cursor components)
Characteristics:
Modern Glassmorphism (2024):
.glass-card {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.2);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
border-radius: 16px;
}
Depth System (Layering):
/* Elevation scale */
--elevation-1: 0 1px 3px rgba(0,0,0,0.12);
--elevation-2: 0 4px 8px rgba(0,0,0,0.15);
--elevation-3: 0 8px 16px rgba(0,0,0,0.18);
--elevation-4: 0 16px 32px rgba(0,0,0,0.2);
Related Skills: animated-component-libraries for glassmorphic components
Patterns:
a) Adaptive Content:
b) Intelligent Interactions:
c) Performance + Privacy:
Implementation Considerations:
Use Case: Landing pages, product launches, portfolio sites
Characteristics:
Implementation (Combined approach):
HTML Structure:
<section class="hero">
<div id="bg-canvas"></div>
<div class="hero__content">
<h1 class="hero__title">Modern Design</h1>
<p class="hero__subtitle">Performance meets beauty</p>
<button class="hero__cta">Explore</button>
</div>
<div class="scroll-indicator">
<span>Scroll</span>
</div>
</section>
Technologies:
lightweight-3d-effects)gsap-scrolltrigger)motion-framer)Related Skills: lightweight-3d-effects, gsap-scrolltrigger, motion-framer
Use Case: Portfolio work, product showcases, case studies
Implementation (GSAP ScrollTrigger):
gsap.to(".gallery__track", {
x: () => -(document.querySelector(".gallery__track").scrollWidth - window.innerWidth),
ease: "none",
scrollTrigger: {
trigger: ".gallery",
pin: true,
scrub: 1,
end: () => "+=" + document.querySelector(".gallery__track").scrollWidth
}
});
Enhancements:
Related Skills: gsap-scrolltrigger, locomotive-scroll
Use Case: E-commerce, product marketing, showcases
Implementation (React Three Fiber):
import { Canvas } from '@react-three/fiber'
import { OrbitControls, useGLTF } from '@react-three/drei'
function ProductViewer() {
return (
<Canvas camera={{ position: [0, 0, 5], fov: 50 }}>
<ambientLight intensity={0.5} />
<spotLight position={[10, 10, 10]} angle={0.15} />
<Product />
<OrbitControls
enableZoom={false}
autoRotate
autoRotateSpeed={2}
/>
</Canvas>
)
}
Enhancements:
Related Skills: react-three-fiber, threejs-webgl, model-viewer-component
Use Case: Dashboards, analytics, infographics
Patterns:
Implementation (Framer Motion + IntersectionObserver):
function AnimatedStat({ end, label }) {
const [count, setCount] = useState(0);
const ref = useRef();
const isInView = useInView(ref, { once: true });
useEffect(() => {
if (isInView) {
// Count up animation
const duration = 2000;
const steps = 60;
const increment = end / steps;
let current = 0;
const timer = setInterval(() => {
current += increment;
if (current >= end) {
setCount(end);
clearInterval(timer);
} else {
setCount(Math.floor(current));
}
}, duration / steps);
}
}, [isInView, end]);
return (
<motion.div
ref={ref}
initial={{ opacity: 0, y: 20 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.6 }}
>
<h2>{count}+</h2>
<p>{label}</p>
</motion.div>
);
}
Related Skills: motion-framer, pixijs-2d for canvas-based visualizations
Use Case: Multi-page apps, portfolio sites, storytelling experiences
Implementation (Barba.js + GSAP):
barba.init({
transitions: [{
name: 'slide',
leave(data) {
return gsap.to(data.current.container, {
xPercent: -100,
duration: 0.5
});
},
enter(data) {
return gsap.from(data.next.container, {
xPercent: 100,
duration: 0.5
});
}
}]
});
Modern Alternatives:
Related Skills: barba-js, gsap-scrolltrigger, motion-framer
Use Case: Creative agencies, portfolios, interactive experiences
Patterns:
Implementation (Vanilla JS + GSAP):
const links = document.querySelectorAll('a');
const cursor = document.querySelector('.cursor');
links.forEach(link => {
link.addEventListener('mouseenter', () => {
gsap.to(cursor, {
scale: 2,
duration: 0.3,
ease: "power2.out"
});
});
link.addEventListener('mouseleave', () => {
gsap.to(cursor, {
scale: 1,
duration: 0.3,
ease: "power2.out"
});
});
});
Related Skills: gsap-scrolltrigger, motion-framer
Use Case: Feature sections, testimonials, team grids
Implementation (Framer Motion variants):
const container = {
hidden: { opacity: 0 },
show: {
opacity: 1,
transition: {
staggerChildren: 0.1
}
}
};
const item = {
hidden: { opacity: 0, y: 20 },
show: { opacity: 1, y: 0 }
};
function FeatureGrid() {
return (
<motion.div
variants={container}
initial="hidden"
whileInView="show"
viewport={{ once: true, amount: 0.3 }}
className="grid"
>
{features.map((feature, i) => (
<motion.div key={i} variants={item}>
{feature}
</motion.div>
))}
</motion.div>
);
}
Related Skills: motion-framer, gsap-scrolltrigger, scroll-reveal-libraries
GSAP ScrollTrigger (gsap-scrolltrigger):
Framer Motion (motion-framer):
React Spring (react-spring-physics):
Anime.js (animejs):
Lottie (lottie-animations):
Three.js (threejs-webgl):
React Three Fiber (react-three-fiber):
Babylon.js (babylonjs-engine):
Lightweight 3D (lightweight-3d-effects):
Animated Components (animated-component-libraries):
Scroll Reveals (scroll-reveal-libraries):
Respect User Preferences:
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
JavaScript Detection:
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (prefersReducedMotion) {
// Disable or simplify animations
gsap.config({ nullTargetWarn: false });
// Skip scroll animations, use instant reveals
}
WCAG AAA Standards:
Testing:
// Check contrast ratio
function getContrastRatio(color1, color2) {
const l1 = getLuminance(color1);
const l2 = getLuminance(color2);
const lighter = Math.max(l1, l2);
const darker = Math.min(l1, l2);
return (lighter + 0.05) / (darker + 0.05);
}
Requirements:
Focus Styles (Modern):
:focus-visible {
outline: 3px solid var(--color-accent);
outline-offset: 2px;
border-radius: 4px;
}
/* Remove focus ring for mouse users */
:focus:not(:focus-visible) {
outline: none;
}
Semantic HTML:
Animation Announcements:
<!-- Announce when content loads -->
<div role="status" aria-live="polite" aria-atomic="true">
Loading complete. 12 items displayed.
</div>
Minimum Size: 44x44px (iOS), 48x48px (Android)
Spacing: Minimum 8px between touch targets
Implementation:
.button {
min-height: 44px;
min-width: 44px;
padding: 12px 24px;
/* Tap target includes padding */
}
60 FPS Checklist:
will-change sparingly (memory cost)GSAP Performance:
// Force GPU acceleration
gsap.set(element, { force3D: true });
// Use will-change during animation only
gsap.to(element, {
x: 100,
onStart: () => element.style.willChange = 'transform',
onComplete: () => element.style.willChange = 'auto'
});
Critical Path:
Progressive Enhancement:
<!-- Load essential styles first -->
<style>
/* Critical CSS inlined */
</style>
<!-- Defer non-critical styles -->
<link rel="preload" href="animations.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="animations.css"></noscript>
Modern Formats:
<picture>
<source srcset="image.avif" type="image/avif">
<source srcset="image.webp" type="image/webp">
<img src="image.jpg" alt="Description" loading="lazy">
</picture>
Responsive Images:
<img
srcset="image-400.jpg 400w,
image-800.jpg 800w,
image-1200.jpg 1200w"
sizes="(max-width: 640px) 100vw,
(max-width: 1024px) 50vw,
33vw"
src="image-800.jpg"
alt="Description"
loading="lazy"
>
Loading Strategy:
Runtime Performance:
Related Skills: threejs-webgl, react-three-fiber, babylonjs-engine
Code Splitting:
// Dynamic imports
const AnimationModule = lazy(() => import('./animations'));
// Route-based splitting
const Gallery = lazy(() => import('./pages/Gallery'));
Tree Shaking:
Problem: Too many animations distract from content and hurt performance.
Solution:
Rule of Thumb: If you can't explain why an animation exists, remove it.
Problem: Animations work on desktop but lag on mobile devices.
Solution:
matchMedia for device-specific experiencesconst isLowEndDevice = () => {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent) &&
navigator.hardwareConcurrency < 4;
};
if (isLowEndDevice()) {
// Simplify or disable animations
}
Problem: Experience breaks without JavaScript or on older browsers.
Solution:
// Feature detection
if ('IntersectionObserver' in window) {
// Use scroll-triggered animations
} else {
// Show content immediately
}
Problem: Forgetting keyboard users, screen readers, or motion-sensitive users.
Solution:
prefers-reduced-motionChecklist:
Problem: Blank screen or layout shifts during content load.
Solution:
// Skeleton screen pattern
function ProductCard({ loading, data }) {
if (loading) {
return (
<div className="skeleton">
<div className="skeleton__image" />
<div className="skeleton__title" />
<div className="skeleton__price" />
</div>
);
}
return <ProductCardContent data={data} />;
}
Problem: Overriding native scroll behavior frustrates users.
Solution:
Good Practice: Enhance scroll, don't replace it.
Modern Design Tokens (CSS Custom Properties):
:root {
/* Colors - OKLCH for perceptual uniformity */
--color-primary: oklch(50% 0.2 250);
--color-accent: oklch(65% 0.25 30);
/* Spacing - Consistent scale */
--space-2xs: clamp(0.25rem, 0.2rem + 0.25vw, 0.375rem);
--space-xs: clamp(0.5rem, 0.4rem + 0.5vw, 0.75rem);
--space-sm: clamp(0.75rem, 0.6rem + 0.75vw, 1.125rem);
--space-md: clamp(1rem, 0.8rem + 1vw, 1.5rem);
--space-lg: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem);
--space-xl: clamp(2rem, 1.6rem + 2vw, 3rem);
--space-2xl: clamp(3rem, 2.4rem + 3vw, 4.5rem);
/* Typography - Fluid scale */
--font-size-base: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
/* Animation - Consistent timing */
--duration-fast: 150ms;
--duration-normal: 250ms;
--duration-slow: 400ms;
/* Easing - Natural motion */
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
--ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
}
Atomic Design (Brad Frost):
Related Skills: animated-component-libraries for component patterns
This skill references the following skills for implementation:
gsap-scrolltrigger - Scroll-driven animations, pinning, scrubbingmotion-framer - React animations, gestures, layout animationsreact-spring-physics - Physics-based animationsanimejs - SVG animations, stagger effectslottie-animations - Designer-created animationsscroll-reveal-libraries - Simple scroll reveals (AOS)threejs-webgl - Custom 3D scenes and effectsreact-three-fiber - 3D in React applicationsbabylonjs-engine - Physics-based 3D, VR/XRlightweight-3d-effects - Vanta.js backgrounds, Zdog illustrationsbarba-js - Page transitionslocomotive-scroll - Smooth scrollinganimated-component-libraries - Magic UI, React Bitspixijs-2d - Canvas-based 2D graphicsSee the references/ directory for in-depth documentation:
design_trends_2024.md - Current web design trends and forecastsinteraction_patterns.md - Comprehensive micro-interaction catalogaccessibility_guide.md - WCAG compliance patterns and testingperformance_checklist.md - Optimization strategies and metricsThe scripts/ directory includes tools for implementing design patterns:
pattern_generator.py - Generate design pattern boilerplatedesign_audit.py - Audit existing designs for complianceThe assets/ directory contains design system templates and starter files. See assets/README.md for details.