# πŸš€ Marketing Shader Implementation Guide **Doel:** Praktische implementatie van dot-shader component voor marketing website hero section. --- ## πŸ“ Design Specificaties ### Hero Section Layout ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ [Shader Background - zeer subtiel] β”‚ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Hero Content Overlay β”‚ β”‚ β”‚ β”‚ - Headline (wit/donker) β”‚ β”‚ β”‚ β”‚ - Subheadline β”‚ β”‚ β”‚ β”‚ - CTA Buttons β”‚ β”‚ β”‚ β”‚ - Live Metrics Counter β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### Visuele HiΓ«rarchie 1. **Shader:** Opacity 0.02-0.03 (bijna onzichtbaar, maar aanwezig) 2. **Content Overlay:** Semi-transparant of solid (afhankelijk van contrast) 3. **Tekst:** Hoog contrast (wit op donker, of donker op licht) --- ## πŸ”§ Technische Implementatie ### Stap 1: Aangepaste Marketing Variant ```typescript // components/ui/marketing-shader-background.tsx 'use client' import { DotScreenShader } from './dot-shader-background' import { useTheme } from 'next-themes' import { useEffect, useState } from 'react' interface MarketingShaderProps { variant?: 'hero' | 'section' className?: string } export function MarketingShader({ variant = 'hero', className }: MarketingShaderProps) { const { theme } = useTheme() const [mounted, setMounted] = useState(false) const [reducedMotion, setReducedMotion] = useState(false) useEffect(() => { setMounted(true) // Check for reduced motion preference const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)') setReducedMotion(mediaQuery.matches) const handleChange = (e: MediaQueryListEvent) => setReducedMotion(e.matches) mediaQuery.addEventListener('change', handleChange) return () => mediaQuery.removeEventListener('change', handleChange) }, []) // Fallback voor mobile of reduced motion if (!mounted || reducedMotion) { return (