96 lines
3.4 KiB
TypeScript
96 lines
3.4 KiB
TypeScript
|
|
'use client';
|
||
|
|
|
||
|
|
import { useState } from 'react';
|
||
|
|
import { ColorPicker } from '@/components/color/ColorPicker';
|
||
|
|
import { ColorDisplay } from '@/components/color/ColorDisplay';
|
||
|
|
import { ColorInfo } from '@/components/color/ColorInfo';
|
||
|
|
import { Button } from '@/components/ui/button';
|
||
|
|
import { useColorInfo } from '@/lib/api/queries';
|
||
|
|
import { Loader2 } from 'lucide-react';
|
||
|
|
|
||
|
|
export default function PlaygroundPage() {
|
||
|
|
const [color, setColor] = useState('#ff0099');
|
||
|
|
|
||
|
|
const { data, isLoading, isError, error } = useColorInfo({
|
||
|
|
colors: [color],
|
||
|
|
});
|
||
|
|
|
||
|
|
const colorInfo = data?.colors[0];
|
||
|
|
|
||
|
|
return (
|
||
|
|
<div className="min-h-screen p-8">
|
||
|
|
<div className="max-w-7xl mx-auto space-y-8">
|
||
|
|
<div>
|
||
|
|
<h1 className="text-4xl font-bold mb-2">Color Playground</h1>
|
||
|
|
<p className="text-muted-foreground">
|
||
|
|
Interactive color manipulation and analysis tool
|
||
|
|
</p>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
|
||
|
|
{/* Left Column: Color Picker and Display */}
|
||
|
|
<div className="space-y-6">
|
||
|
|
<div className="p-6 border rounded-lg bg-card">
|
||
|
|
<h2 className="text-xl font-semibold mb-4">Color Picker</h2>
|
||
|
|
<ColorPicker color={color} onChange={setColor} />
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div className="p-6 border rounded-lg bg-card">
|
||
|
|
<h2 className="text-xl font-semibold mb-4">Preview</h2>
|
||
|
|
<div className="flex justify-center">
|
||
|
|
<ColorDisplay color={color} size="xl" />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
{/* Right Column: Color Information */}
|
||
|
|
<div className="space-y-6">
|
||
|
|
<div className="p-6 border rounded-lg bg-card">
|
||
|
|
<h2 className="text-xl font-semibold mb-4">Color Information</h2>
|
||
|
|
|
||
|
|
{isLoading && (
|
||
|
|
<div className="flex items-center justify-center py-12">
|
||
|
|
<Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
|
||
|
|
</div>
|
||
|
|
)}
|
||
|
|
|
||
|
|
{isError && (
|
||
|
|
<div className="p-4 bg-destructive/10 text-destructive rounded-lg">
|
||
|
|
<p className="font-medium">Error loading color information</p>
|
||
|
|
<p className="text-sm mt-1">{error?.message || 'Unknown error'}</p>
|
||
|
|
</div>
|
||
|
|
)}
|
||
|
|
|
||
|
|
{colorInfo && <ColorInfo info={colorInfo} />}
|
||
|
|
</div>
|
||
|
|
|
||
|
|
<div className="p-6 border rounded-lg bg-card">
|
||
|
|
<h2 className="text-xl font-semibold mb-4">Quick Actions</h2>
|
||
|
|
<div className="grid grid-cols-2 gap-3">
|
||
|
|
<Button variant="outline" className="w-full">
|
||
|
|
Lighten
|
||
|
|
</Button>
|
||
|
|
<Button variant="outline" className="w-full">
|
||
|
|
Darken
|
||
|
|
</Button>
|
||
|
|
<Button variant="outline" className="w-full">
|
||
|
|
Saturate
|
||
|
|
</Button>
|
||
|
|
<Button variant="outline" className="w-full">
|
||
|
|
Desaturate
|
||
|
|
</Button>
|
||
|
|
<Button variant="outline" className="w-full">
|
||
|
|
Complement
|
||
|
|
</Button>
|
||
|
|
<Button variant="outline" className="w-full">
|
||
|
|
Grayscale
|
||
|
|
</Button>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|