'use client'; import { Button } from '@/components/ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { useState, useEffect } from 'react'; 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'; interface ExportMenuProps { colors: string[]; className?: string; } type ExportFormat = 'css' | 'scss' | 'tailwind' | 'json' | 'javascript'; type ColorSpace = 'hex' | 'rgb' | 'hsl' | 'lab' | 'oklab' | 'lch' | 'oklch'; 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 (error) { console.error('Failed to convert colors:', error); toast.error('Failed to convert colors to selected space'); } finally { setIsConverting(false); } } convertColors(); }, [colors, colorSpace]); const exportColors: ExportColor[] = convertedColors.map((value) => ({ value })); const getExportContent = (): 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 getFileExtension = (): string => { switch (format) { case 'css': return 'css'; case 'scss': return 'scss'; case 'tailwind': return 'js'; case 'json': return 'json'; case 'javascript': return 'js'; } }; const handleCopy = () => { const content = getExportContent(); navigator.clipboard.writeText(content); setCopied(true); toast.success('Copied to clipboard!'); setTimeout(() => setCopied(false), 2000); }; const handleDownload = () => { const content = getExportContent(); const extension = getFileExtension(); downloadAsFile(content, `palette.${extension}`, 'text/plain'); toast.success('Downloaded!'); }; if (colors.length === 0) { return null; } return (

Export Format

Color Space

{isConverting ? (
) : null}
            {getExportContent()}
          
); }