'use client'; import { useState, useEffect } from 'react'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Download, Copy, Check, Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { exportAsCSS, exportAsSCSS, exportAsTailwind, exportAsJSON, exportAsJavaScript, downloadAsFile, type ExportColor, } from '@/lib/color/utils/export'; import { colorAPI } from '@/lib/color/api/client'; import { cn } from '@/lib/utils/cn'; interface ExportMenuProps { colors: string[]; className?: string; } type ExportFormat = 'css' | 'scss' | 'tailwind' | 'json' | 'javascript'; type ColorSpace = 'hex' | 'rgb' | 'hsl' | 'lab' | 'oklab' | 'lch' | 'oklch'; const actionBtn = 'flex items-center gap-1.5 px-3 py-1.5 text-xs glass rounded-md border border-border/30 text-muted-foreground hover:text-primary hover:border-primary/30 hover:bg-primary/10 transition-all disabled:opacity-40 disabled:cursor-not-allowed'; export function ExportMenu({ colors, className }: ExportMenuProps) { const [format, setFormat] = useState('css'); const [colorSpace, setColorSpace] = useState('hex'); const [convertedColors, setConvertedColors] = useState(colors); const [isConverting, setIsConverting] = useState(false); const [copied, setCopied] = useState(false); useEffect(() => { async function convertColors() { if (colorSpace === 'hex') { setConvertedColors(colors); return; } setIsConverting(true); try { const response = await colorAPI.convertFormat({ colors, format: colorSpace }); if (response.success) { setConvertedColors(response.data.conversions.map((c) => c.output)); } } catch { toast.error('Failed to convert colors'); } finally { setIsConverting(false); } } convertColors(); }, [colors, colorSpace]); const exportColors: ExportColor[] = convertedColors.map((value) => ({ value })); const getContent = (): string => { switch (format) { case 'css': return exportAsCSS(exportColors); case 'scss': return exportAsSCSS(exportColors); case 'tailwind': return exportAsTailwind(exportColors); case 'json': return exportAsJSON(exportColors); case 'javascript': return exportAsJavaScript(exportColors); } }; const getExt = () => ({ css: 'css', scss: 'scss', tailwind: 'js', json: 'json', javascript: 'js' }[format]); const handleCopy = () => { navigator.clipboard.writeText(getContent()); setCopied(true); toast.success('Copied!'); setTimeout(() => setCopied(false), 2000); }; const handleDownload = () => { downloadAsFile(getContent(), `palette.${getExt()}`, 'text/plain'); toast.success('Downloaded!'); }; if (colors.length === 0) return null; return (
Export {/* Selectors */}
{/* Code preview */}
{isConverting && (
)}
          {getContent()}
        
{/* Actions */}
); }