skills/web-wave-designer/SKILL.md
Creates realistic ocean and water wave effects for web using SVG filters (feTurbulence, feDisplacementMap), CSS animations, and layering techniques. Use for ocean backgrounds, underwater distortion, beach scenes, ripple effects, liquid glass, and water-themed UI. Activate on "ocean wave", "water effect", "SVG water", "ripple animation", "underwater distortion", "liquid glass", "wave animation", "feTurbulence water", "beach waves", "sea foam". NOT for 3D ocean simulation (use WebGL/Three.js), video water effects (use video editing), physics-based fluid simulation (use canvas/WebGL), or simple gradient backgrounds without wave motion.
npx skillsauth add curiositech/windags-skills web-wave-designerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert in creating realistic, performant ocean and water wave effects for web applications using SVG filters, CSS animations, and layering techniques.
IF request mentions "background ocean", "seascape", "horizon"
→ Use multi-layer ocean with 3-4 wave layers, parallax movement
→ baseFrequency: [0.005, 0.05] to [0.01, 0.1] across layers
→ Scale: 15-25, Animation: 35-90s drift speeds
ELSE IF request mentions "looking through water", "underwater", "aquarium"
→ Use displacement-only filter on content
→ baseFrequency: [0.015, 0.08], Scale: 18-22
→ Add blue tint: feColorMatrix with boosted blue channel
ELSE IF request mentions "ripples", "pond", "pool"
→ Use equal baseFrequency values for circular patterns
→ baseFrequency: [0.02, 0.02], Scale: 8-15
→ Lower octaves (2-3) for cleaner shapes
ELSE IF request mentions "glass", "modern UI", "subtle"
→ Use low-scale displacement with blur
→ baseFrequency: [0.01, 0.05], Scale: 5-10
→ Add feGaussianBlur stdDeviation="0.5-1"
ELSE IF request mentions "beach", "shore", "foam"
→ Use high Y-frequency for breaking wave motion
→ baseFrequency: [0.008, 0.12], Add foam layer
→ Include fractalNoise for foam texture
IF performance is critical OR mobile target
→ Use CSS transform animations only
→ Move wave layers, not filter parameters
→ will-change: transform on animated elements
ELSE IF smooth parameter changes needed
→ Use requestAnimationFrame for baseFrequency
→ Limit to 1-2 parameters changing simultaneously
→ Include performance monitoring
ELSE IF simple declarative animation acceptable
→ Use SVG animate on seed attribute
→ Avoid baseFrequency animation (expensive)
→ Use for background effects only
IF simple single effect
→ One SVG filter applied directly
→ Single feTurbulence → feDisplacementMap chain
ELSE IF depth/realism needed
→ 3-layer system: back (slow), mid, front (fast)
→ Different opacity: 0.3, 0.5, 0.7
→ Staggered animation speeds: 80s, 55s, 35s
ELSE IF includes foam/whitecaps
→ Add 4th layer using fractalNoise for foam
→ High baseFrequency [0.02-0.03]
→ White/transparent gradient, screen blend mode
IF realistic ocean
→ Use linear gradient: deep blue (#0c4a6e) to surface (#0ea5e9)
→ Apply feComponentTransfer to boost blue channel
ELSE IF stylized/cartoon
→ Use flat colors, no gradients
→ Lower numOctaves (1-2) for bold shapes
→ High contrast, saturated palette
ELSE IF underwater tint needed
→ Apply feColorMatrix to entire effect
→ Reduce red (0.85), boost blue (1.1)
→ Add slight green tint for depth
IF >768px viewport AND GPU available
→ Full multi-layer setup with all effects
→ numOctaves: 3-4, all animation types
ELSE IF mobile OR integrated graphics detected
→ Reduce to 2 layers maximum
→ numOctaves: 2-3, CSS-only animation
→ Add prefers-reduced-motion query
ELSE IF critical performance path
→ CSS gradient waves only, no SVG filters
→ Use radial gradients with transform animation
→ Fallback for low-end devices
Symptoms: Water looks like a blue texture, lacks life and motion Detection Rule: If no animation properties present AND no transform changes Fix:
animation: wave-drift 60s linear infinite<animate attributeName="seed" dur="20s">Symptoms: Boxy, grid-like patterns instead of flowing water
Detection Rule: If type="fractalNoise" used for water effects
Fix:
type="turbulence" immediately"0.01 0.1"Symptoms: Choppy, low FPS animation especially on mobile Detection Rule: If animating baseFrequency OR multiple filter attributes simultaneously Fix:
Symptoms: Sharp cutoffs, rectangular boundaries visible around water effects Detection Rule: If filter region at default 0% 0% 100% 100% Fix:
x="-10%" y="-10%" width="120%" height="120%"x="-20%" y="-20%" width="140%" height="140%"Symptoms: Browser lag, high CPU usage, frame drops below 30fps Detection Rule: If numOctaves > 4 OR scale > 40 OR multiple complex filters Fix:
Scenario: Create a responsive ocean background that performs well on mobile devices while maintaining visual appeal.
Initial Requirements Analysis:
Step 1: Performance Detection
const detectPerformanceTier = () => {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
if (!gl) return 'minimal';
// Mobile user agent check
if (/Mobile|Android|iPhone/i.test(navigator.userAgent)) return 'mobile';
return 'desktop';
};
Step 2: Tier-Appropriate Filter Design For mobile tier, expert chooses:
<svg style="position:absolute;width:0;height:0">
<defs>
<filter id="mobileWave1" x="-10%" y="-10%" width="120%" height="120%">
<feTurbulence type="turbulence" baseFrequency="0.006 0.06"
numOctaves="2" seed="1"/>
<feDisplacementMap in="SourceGraphic" scale="15"/>
</filter>
<filter id="mobileWave2" x="-10%" y="-10%" width="120%" height="120%">
<feTurbulence type="turbulence" baseFrequency="0.01 0.08"
numOctaves="2" seed="2"/>
<feDisplacementMap in="SourceGraphic" scale="18"/>
</filter>
</defs>
</svg>
Step 3: Decision Point Navigation - Animation Strategy Expert recognizes mobile constraint → CSS transform only:
.wave-mobile {
width: 200%;
height: 60%;
position: absolute;
bottom: 0;
will-change: transform;
}
.wave-1 {
filter: url(#mobileWave1);
animation: wave-drift 70s linear infinite;
opacity: 0.4;
}
.wave-2 {
filter: url(#mobileWave2);
animation: wave-drift 45s linear infinite;
animation-delay: -15s;
opacity: 0.6;
}
@keyframes wave-drift {
from { transform: translateX(0); }
to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
.wave-1, .wave-2 {
animation: none;
}
}
Step 4: What Novice Misses vs Expert Catches
Novice approach:
Expert catches:
Result: Smooth 60fps ocean animation on mobile devices vs stuttering 20-30fps novice implementation.
Motion Smoothness:
Color Accuracy:
Performance Budget:
Visual Realism:
Integration Ready:
3D Ocean Rendering: Volumetric water, realistic wave physics, underwater caustics with accurate light rays → Use WebGL libraries (Three.js Ocean, react-three-fiber water)
Video Water Effects: Compositing water onto video, motion tracking liquid → Use After Effects, Blender, or video editing software
Physics Simulation: Interactive water that responds to mouse/touch, splash dynamics, fluid collision → Use canvas with matter.js or Box2D physics engines
High-Frequency Details: Spray droplets, micro-foam bubbles, realistic surface tension → Use particle systems or WebGL shaders
3D Integration: Water that interacts with 3D models, accurate reflection/refraction of 3D scenes → Use WebGL/Three.js with proper lighting models
tools
Building resilient distributed systems with circuit breakers, retries with full-jitter exponential backoff, retry budgets (per-request 3-attempt + per-client 10% ratio per Google SRE), deadline propagation, and the cascading-failure math (4 layers × 3 retries = 64x amplification). Grounded in Resilience4j, Microsoft Cloud Patterns, AWS Architecture Blog (Marc Brooker), and Google SRE Book.
testing
Designing HTTP cache headers that work correctly across browsers, CDNs, and shared proxies — `Cache-Control` directives per RFC 9111, `stale-while-revalidate` and `stale-if-error` per RFC 5861, the Vary header for varying responses, and surrogate keys for tag-based purging. Grounded in IETF RFCs and Cloudflare/Fastly docs.
development
Use when designing or fixing a Content Security Policy on a real site, choosing between nonce-based and hash-based CSP, adding strict-dynamic, debugging "Refused to execute inline script" errors, deploying CSP in report-only mode first, configuring report-to / report-uri, or auditing an existing policy for unsafe-inline / unsafe-eval / wildcards. Triggers: "CSP blocks legitimate inline script", strict-dynamic, nonce-{RANDOM}, sha256-{HASH}, object-src none, base-uri none, frame-ancestors, Trusted Types, X-Content-Security-Policy obsolete, report-only vs enforced. NOT for general HTTP security headers (HSTS, COOP/COEP), Trusted Types deep dive, CORS configuration, or building a WAF.
tools
Choosing and operating an HTTP API versioning strategy that doesn't break clients — Stripe's date-based pinned versions, the Deprecation/Sunset header pair (RFC 9745 + RFC 8594), URI vs header vs media-type approaches, and the version-transformer pattern. Grounded in Stripe's published architecture and IETF RFCs.