import { lazy, type ComponentType } from 'react'; import type { BackgroundType, BackgroundDefinition } from './types'; // Raw import functions for prefetching (doesn't create React components) const backgroundImports: Record, () => Promise> = { aurora: () => import('./aurora-background'), sparkles: () => import('./sparkles'), vortex: () => import('./vortex'), 'shooting-stars': () => import('./shooting-stars'), 'background-beams': () => import('./background-beams'), 'background-beams-collision': () => import('./background-beams-collision'), 'gradient-animation': () => import('./background-gradient-animation'), wavy: () => import('./wavy-background'), 'background-lines': () => import('./background-lines'), boxes: () => import('./background-boxes'), meteors: () => import('./meteors'), grid: () => import('./grid-background'), dots: () => import('./grid-background'), spotlight: () => import('./spotlight-bg'), ripple: () => import('./background-ripple'), }; /** Prefetch the JS chunk for a background type (call early to avoid lazy-load delay) */ export function prefetchBackground(type: BackgroundType): void { if (type !== 'none' && backgroundImports[type]) { backgroundImports[type](); } } // Lazy-loaded components — only the selected type is fetched export const backgroundComponents: Record< Exclude, ComponentType<{ settings: Record }> > = { aurora: lazy(() => import('./aurora-background')), sparkles: lazy(() => import('./sparkles')), vortex: lazy(() => import('./vortex')), 'shooting-stars': lazy(() => import('./shooting-stars')), 'background-beams': lazy(() => import('./background-beams')), 'background-beams-collision': lazy(() => import('./background-beams-collision')), 'gradient-animation': lazy(() => import('./background-gradient-animation')), wavy: lazy(() => import('./wavy-background')), 'background-lines': lazy(() => import('./background-lines')), boxes: lazy(() => import('./background-boxes')), meteors: lazy(() => import('./meteors')), grid: lazy(() => import('./grid-background')), dots: lazy(() => import('./grid-background')), spotlight: lazy(() => import('./spotlight-bg')), ripple: lazy(() => import('./background-ripple')), }; // Registry of all background definitions with settings for the editor // labelKey/descriptionKey are under "admin.backgrounds.*" // setting label keys are under "admin.backgrounds.*" export const backgroundRegistry: BackgroundDefinition[] = [ { type: 'aurora', labelKey: 'admin.backgrounds.aurora', descriptionKey: 'admin.backgrounds.auroraDesc', category: 'css', settings: [ { key: 'firstColor', label: 'admin.backgrounds.color1', type: 'color', default: '#3b82f6' }, { key: 'secondColor', label: 'admin.backgrounds.color2', type: 'color', default: '#a5b4fc' }, { key: 'thirdColor', label: 'admin.backgrounds.color3', type: 'color', default: '#93c5fd' }, { key: 'showRadialGradient', label: 'admin.backgrounds.radialGradient', type: 'boolean', default: true, }, { key: 'speed', label: 'admin.backgrounds.speed', type: 'select', default: 'normal', options: [ { label: 'admin.backgrounds.slow', value: 'slow' }, { label: 'admin.backgrounds.normal', value: 'normal' }, { label: 'admin.backgrounds.fast', value: 'fast' }, ], }, ], }, { type: 'sparkles', labelKey: 'admin.backgrounds.sparkles', descriptionKey: 'admin.backgrounds.sparklesDesc', category: 'canvas', settings: [ { key: 'particleDensity', label: 'admin.backgrounds.density', type: 'number', min: 10, max: 200, step: 10, default: 80, }, { key: 'particleColor', label: 'admin.backgrounds.particleColor', type: 'color', default: '#ffffff', }, { key: 'minSize', label: 'admin.backgrounds.minSize', type: 'number', min: 0.2, max: 3, step: 0.1, default: 0.4, }, { key: 'maxSize', label: 'admin.backgrounds.maxSize', type: 'number', min: 1, max: 5, step: 0.1, default: 1.4, }, { key: 'speed', label: 'admin.backgrounds.speed', type: 'number', min: 0.1, max: 3, step: 0.1, default: 0.6, }, ], }, { type: 'vortex', labelKey: 'admin.backgrounds.vortex', descriptionKey: 'admin.backgrounds.vortexDesc', category: 'canvas', settings: [ { key: 'particleCount', label: 'admin.backgrounds.particles', type: 'number', min: 50, max: 1000, step: 50, default: 300, }, { key: 'rangeY', label: 'admin.backgrounds.rangeY', type: 'number', min: 50, max: 300, step: 10, default: 100, }, { key: 'baseHue', label: 'admin.backgrounds.hue', type: 'number', min: 0, max: 360, step: 10, default: 220, }, { key: 'rangeSpeed', label: 'admin.backgrounds.speed', type: 'number', min: 0.5, max: 5, step: 0.5, default: 1.5, }, { key: 'backgroundColor', label: 'admin.backgrounds.bgColor', type: 'color', default: '#000000', }, ], }, { type: 'shooting-stars', labelKey: 'admin.backgrounds.shootingStars', descriptionKey: 'admin.backgrounds.shootingStarsDesc', category: 'canvas', settings: [ { key: 'starColor', label: 'admin.backgrounds.starColor', type: 'color', default: '#9E00FF' }, { key: 'trailColor', label: 'admin.backgrounds.trailColor', type: 'color', default: '#2EB9DF', }, { key: 'bgStarColor', label: 'admin.backgrounds.bgStarColor', type: 'color', default: '#ffffff', }, { key: 'starDensity', label: 'admin.backgrounds.density', type: 'number', min: 0.00005, max: 0.0005, step: 0.00005, default: 0.00015, }, { key: 'minSpeed', label: 'admin.backgrounds.minSpeed', type: 'number', min: 5, max: 30, step: 1, default: 10, }, { key: 'maxSpeed', label: 'admin.backgrounds.maxSpeed', type: 'number', min: 15, max: 60, step: 1, default: 30, }, ], }, { type: 'background-beams', labelKey: 'admin.backgrounds.beams', descriptionKey: 'admin.backgrounds.beamsDesc', category: 'svg', settings: [ { key: 'gradientStart', label: 'admin.backgrounds.color1', type: 'color', default: '#18CCFC', }, { key: 'gradientMid', label: 'admin.backgrounds.color2', type: 'color', default: '#6344F5' }, { key: 'gradientEnd', label: 'admin.backgrounds.color3', type: 'color', default: '#AE48FF' }, { key: 'staticColor', label: 'admin.backgrounds.fillColor', type: 'color', default: '#d4d4d4', }, ], }, { type: 'background-beams-collision', labelKey: 'admin.backgrounds.beamsCollision', descriptionKey: 'admin.backgrounds.beamsCollisionDesc', category: 'svg', settings: [ { key: 'beamColor', label: 'admin.backgrounds.beamColor', type: 'color', default: '#6366f1' }, { key: 'explosionColor', label: 'admin.backgrounds.explosionColor', type: 'color', default: '#a855f7', }, ], }, { type: 'gradient-animation', labelKey: 'admin.backgrounds.gradientAnimation', descriptionKey: 'admin.backgrounds.gradientAnimationDesc', category: 'css', settings: [ { key: 'firstColor', label: 'admin.backgrounds.color1', type: 'color', default: '#1271FF' }, { key: 'secondColor', label: 'admin.backgrounds.color2', type: 'color', default: '#DD4AFF' }, { key: 'thirdColor', label: 'admin.backgrounds.color3', type: 'color', default: '#64DCFF' }, { key: 'fourthColor', label: 'admin.backgrounds.color4', type: 'color', default: '#C83232' }, { key: 'fifthColor', label: 'admin.backgrounds.color5', type: 'color', default: '#B4B432' }, { key: 'pointerColor', label: 'admin.backgrounds.pointerColor', type: 'color', default: '#8C64FF', }, { key: 'interactive', label: 'admin.backgrounds.interactive', type: 'boolean', default: true, }, { key: 'size', label: 'admin.backgrounds.size', type: 'select', default: '80%', options: [ { label: '60%', value: '60%' }, { label: '80%', value: '80%' }, { label: '100%', value: '100%' }, ], }, ], }, { type: 'wavy', labelKey: 'admin.backgrounds.wavy', descriptionKey: 'admin.backgrounds.wavyDesc', category: 'canvas', settings: [ { key: 'speed', label: 'admin.backgrounds.speed', type: 'select', default: 'fast', options: [ { label: 'admin.backgrounds.slow', value: 'slow' }, { label: 'admin.backgrounds.fast', value: 'fast' }, ], }, { key: 'waveWidth', label: 'admin.backgrounds.waveWidth', type: 'number', min: 10, max: 100, step: 5, default: 50, }, { key: 'blur', label: 'admin.backgrounds.blurAmount', type: 'number', min: 0, max: 30, step: 1, default: 10, }, { key: 'waveOpacity', label: 'admin.backgrounds.waveOpacity', type: 'number', min: 0.1, max: 1, step: 0.05, default: 0.5, }, { key: 'backgroundFill', label: 'admin.backgrounds.bgColor', type: 'color', default: '#000000', }, { key: 'waveColor1', label: 'admin.backgrounds.color1', type: 'color', default: '#38bdf8' }, { key: 'waveColor2', label: 'admin.backgrounds.color2', type: 'color', default: '#818cf8' }, { key: 'waveColor3', label: 'admin.backgrounds.color3', type: 'color', default: '#c084fc' }, { key: 'waveColor4', label: 'admin.backgrounds.color4', type: 'color', default: '#e879f9' }, { key: 'waveColor5', label: 'admin.backgrounds.color5', type: 'color', default: '#22d3ee' }, ], }, { type: 'background-lines', labelKey: 'admin.backgrounds.lines', descriptionKey: 'admin.backgrounds.linesDesc', category: 'canvas', settings: [ { key: 'lineCount', label: 'admin.backgrounds.count', type: 'number', min: 10, max: 80, step: 5, default: 40, }, { key: 'lineColor', label: 'admin.backgrounds.particleColor', type: 'color', default: '#818cf8', }, { key: 'speed', label: 'admin.backgrounds.speed', type: 'number', min: 0.001, max: 0.01, step: 0.001, default: 0.002, }, { key: 'strokeWidth', label: 'admin.backgrounds.waveWidth', type: 'number', min: 0.5, max: 3, step: 0.5, default: 1, }, ], }, { type: 'boxes', labelKey: 'admin.backgrounds.boxes', descriptionKey: 'admin.backgrounds.boxesDesc', category: 'css', settings: [ { key: 'rows', label: 'admin.backgrounds.rows', type: 'number', min: 10, max: 40, step: 5, default: 20, }, { key: 'cols', label: 'admin.backgrounds.cols', type: 'number', min: 5, max: 25, step: 1, default: 12, }, { key: 'boxColor', label: 'admin.backgrounds.fillColor', type: 'color', default: '#818cf8' }, { key: 'multicolor', label: 'admin.backgrounds.multicolor', type: 'boolean', default: true, }, { key: 'lineColor', label: 'admin.backgrounds.lineColor', type: 'color', default: '#334155', }, ], }, { type: 'meteors', labelKey: 'admin.backgrounds.meteors', descriptionKey: 'admin.backgrounds.meteorsDesc', category: 'css', settings: [ { key: 'count', label: 'admin.backgrounds.count', type: 'number', min: 5, max: 50, step: 5, default: 20, }, { key: 'meteorColor', label: 'admin.backgrounds.particleColor', type: 'color', default: '#ffffff', }, ], }, { type: 'grid', labelKey: 'admin.backgrounds.grid', descriptionKey: 'admin.backgrounds.gridDesc', category: 'css', settings: [ { key: 'gridColor', label: 'admin.backgrounds.fillColor', type: 'color', default: 'rgba(255,255,255,0.05)', }, { key: 'gridSize', label: 'admin.backgrounds.gridSize', type: 'number', min: 10, max: 80, step: 5, default: 40, }, ], }, { type: 'dots', labelKey: 'admin.backgrounds.dots', descriptionKey: 'admin.backgrounds.dotsDesc', category: 'css', settings: [ { key: 'variant', label: 'admin.backgrounds.size', type: 'select', default: 'dots', options: [{ label: 'admin.backgrounds.dots', value: 'dots' }], }, { key: 'gridColor', label: 'admin.backgrounds.fillColor', type: 'color', default: 'rgba(255,255,255,0.1)', }, { key: 'gridSize', label: 'admin.backgrounds.gridSize', type: 'number', min: 10, max: 60, step: 5, default: 20, }, { key: 'dotSize', label: 'admin.backgrounds.size', type: 'number', min: 0.5, max: 4, step: 0.5, default: 1.5, }, ], }, { type: 'spotlight', labelKey: 'admin.backgrounds.spotlight', descriptionKey: 'admin.backgrounds.spotlightDesc', category: 'css', settings: [ { key: 'spotlightColor', label: 'admin.backgrounds.particleColor', type: 'color', default: '#818cf8', }, { key: 'spotlightSize', label: 'admin.backgrounds.size', type: 'number', min: 200, max: 800, step: 50, default: 400, }, ], }, { type: 'ripple', labelKey: 'admin.backgrounds.ripple', descriptionKey: 'admin.backgrounds.rippleDesc', category: 'canvas', settings: [ { key: 'rippleColor', label: 'admin.backgrounds.particleColor', type: 'color', default: '#818cf8', }, { key: 'rippleCount', label: 'admin.backgrounds.count', type: 'number', min: 3, max: 10, step: 1, default: 5, }, { key: 'speed', label: 'admin.backgrounds.speed', type: 'number', min: 0.1, max: 2, step: 0.1, default: 0.5, }, ], }, ];