import { useState, useCallback, useRef } from 'react'; import UploadPanel from './components/UploadPanel'; import SettingsPanel from './components/SettingsPanel'; import PreviewPanel from './components/PreviewPanel'; import ErrorBanner, { Banner } from './components/ErrorBanner'; import { defaultSettings, TilesetSettings, generateTileableTexture, exportAsWebP, } from './lib/imageProcessor'; let bannerCounter = 0; export default function App() { const [sourceFile, setSourceFile] = useState(null); const [settings, setSettings] = useState(defaultSettings); const [resultCanvas, setResultCanvas] = useState(null); const [isProcessing, setIsProcessing] = useState(false); const [processingStep, setProcessingStep] = useState(''); const [banners, setBanners] = useState([]); const processingRef = useRef(false); const addBanner = (type: Banner['type'], message: string) => { const id = String(++bannerCounter); setBanners((prev) => [...prev, { id, type, message }]); }; const dismissBanner = (id: string) => setBanners((prev) => prev.filter((b) => b.id !== id)); const handleFileSelect = useCallback((file: File) => { setSourceFile(file); setResultCanvas(null); // Clear old result when new image loaded }, []); const handleGenerate = async () => { if (!sourceFile || processingRef.current) return; processingRef.current = true; setIsProcessing(true); setResultCanvas(null); try { const canvas = await generateTileableTexture( sourceFile, settings, (step) => setProcessingStep(step), ); setResultCanvas(canvas); } catch (err) { const msg = err instanceof Error ? err.message : 'An unknown error occurred.'; addBanner('error', `Processing failed: ${msg}`); } finally { setIsProcessing(false); processingRef.current = false; setProcessingStep(''); } }; const handleExport = async () => { if (!resultCanvas) return; try { await exportAsWebP( resultCanvas, settings.webpQuality, settings.outputWidth, settings.outputHeight, ); } catch (err) { addBanner('error', 'Export failed. Your browser may not support WebP export.'); } }; return (
{/* Header */}

Tileset Generator

Upload image → Generate tileable WebP texture
V1 · Client-Side
{/* Body */}
{/* Sidebar */} {/* Preview */}
); }