'use client'; import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Select } from '@/components/ui/select'; import { Input } from '@/components/ui/input'; import { PaletteGrid } from '@/components/color/PaletteGrid'; import { ExportMenu } from '@/components/tools/ExportMenu'; import { useLighten, useDarken, useSaturate, useDesaturate, useRotate } from '@/lib/api/queries'; import { Loader2, Upload, Download } from 'lucide-react'; import { toast } from 'sonner'; type Operation = 'lighten' | 'darken' | 'saturate' | 'desaturate' | 'rotate'; export default function BatchPage() { const [inputColors, setInputColors] = useState(''); const [operation, setOperation] = useState('lighten'); const [amount, setAmount] = useState(0.2); const [outputColors, setOutputColors] = useState([]); const lightenMutation = useLighten(); const darkenMutation = useDarken(); const saturateMutation = useSaturate(); const desaturateMutation = useDesaturate(); const rotateMutation = useRotate(); const parseColors = (text: string): string[] => { // Parse colors from text (one per line, or comma-separated) return text .split(/[\n,]/) .map((c) => c.trim()) .filter((c) => c.length > 0 && c.match(/^#?[0-9a-fA-F]{3,8}$/)); }; const handleProcess = async () => { const colors = parseColors(inputColors); if (colors.length === 0) { toast.error('No valid colors found'); return; } if (colors.length > 100) { toast.error('Maximum 100 colors allowed'); return; } try { let result; switch (operation) { case 'lighten': result = await lightenMutation.mutateAsync({ colors, amount }); break; case 'darken': result = await darkenMutation.mutateAsync({ colors, amount }); break; case 'saturate': result = await saturateMutation.mutateAsync({ colors, amount }); break; case 'desaturate': result = await desaturateMutation.mutateAsync({ colors, amount }); break; case 'rotate': result = await rotateMutation.mutateAsync({ colors, amount: amount * 360 }); break; } // Extract output colors from the result const processed = result.colors.map((c) => c.output); setOutputColors(processed); toast.success(`Processed ${processed.length} colors`); } catch (error) { toast.error('Failed to process colors'); console.error(error); } }; const isPending = lightenMutation.isPending || darkenMutation.isPending || saturateMutation.isPending || desaturateMutation.isPending || rotateMutation.isPending; return (

Batch Operations

Process multiple colors at once with manipulation operations

{/* Input */}

Input Colors

Enter colors (one per line or comma-separated). Supports hex format.