'use client'; import * as React from 'react'; import { X, Search } from 'lucide-react'; import { Button } from '@/components/ui/Button'; import { cn } from '@/lib/utils/cn'; import type { EffectType } from '@/lib/audio/effects/chain'; import { EFFECT_NAMES } from '@/lib/audio/effects/chain'; export interface EffectBrowserProps { open: boolean; onClose: () => void; onSelectEffect: (effectType: EffectType) => void; } const EFFECT_CATEGORIES = { 'Dynamics': ['compressor', 'limiter', 'gate'] as EffectType[], 'Filters': ['lowpass', 'highpass', 'bandpass', 'notch', 'lowshelf', 'highshelf', 'peaking'] as EffectType[], 'Time-Based': ['delay', 'reverb', 'chorus', 'flanger', 'phaser'] as EffectType[], 'Distortion': ['distortion', 'bitcrusher'] as EffectType[], 'Pitch & Time': ['pitch', 'timestretch'] as EffectType[], }; export function EffectBrowser({ open, onClose, onSelectEffect }: EffectBrowserProps) { const [search, setSearch] = React.useState(''); const [selectedCategory, setSelectedCategory] = React.useState(null); const handleSelectEffect = (effectType: EffectType) => { onSelectEffect(effectType); onClose(); setSearch(''); setSelectedCategory(null); }; const filteredCategories = React.useMemo(() => { if (!search) return EFFECT_CATEGORIES; const searchLower = search.toLowerCase(); const filtered: Record = {}; Object.entries(EFFECT_CATEGORIES).forEach(([category, effects]) => { const matchingEffects = effects.filter((effect) => EFFECT_NAMES[effect].toLowerCase().includes(searchLower) ); if (matchingEffects.length > 0) { filtered[category] = matchingEffects; } }); return filtered; }, [search]); if (!open) return null; return (
e.stopPropagation()} > {/* Header */}

Add Effect

{/* Search */}
setSearch(e.target.value)} className="w-full pl-10 pr-4 py-2 bg-background border border-border rounded-md text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary" autoFocus />
{/* Content */}
{Object.entries(filteredCategories).map(([category, effects]) => (

{category}

{effects.map((effect) => ( ))}
))}
{Object.keys(filteredCategories).length === 0 && (
No effects found matching "{search}"
)}
); }