diff --git a/app/(app)/figlet/page.tsx b/app/(app)/figlet/page.tsx index 443ec15..7254552 100644 --- a/app/(app)/figlet/page.tsx +++ b/app/(app)/figlet/page.tsx @@ -1,17 +1,13 @@ import { FigletConverter } from '@/components/figlet/FigletConverter'; +import { AppPage } from '@/components/layout/AppPage'; export default function FigletPage() { return ( -
-
-
-

Figlet ASCII

-

- ASCII Art Text Generator with 373 Fonts -

-
- -
-
+ + + ); } diff --git a/app/(app)/media/page.tsx b/app/(app)/media/page.tsx index 067f529..4ae347a 100644 --- a/app/(app)/media/page.tsx +++ b/app/(app)/media/page.tsx @@ -1,17 +1,13 @@ import { FileConverter } from '@/components/media/FileConverter'; +import { AppPage } from '@/components/layout/AppPage'; export default function MediaPage() { return ( -
-
-
-

Media Converter

-

- Professional browser-based media conversion for video, audio, and images -

-
- -
-
+ + + ); } diff --git a/app/(app)/pastel/batch/page.tsx b/app/(app)/pastel/batch/page.tsx index 01789fd..4700df9 100644 --- a/app/(app)/pastel/batch/page.tsx +++ b/app/(app)/pastel/batch/page.tsx @@ -14,6 +14,7 @@ import { Textarea } from '@/components/ui/textarea'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { PaletteGrid } from '@/components/pastel/PaletteGrid'; import { ExportMenu } from '@/components/pastel/ExportMenu'; +import { AppPage } from '@/components/layout/AppPage'; import { useLighten, useDarken, useSaturate, useDesaturate, useRotate } from '@/lib/pastel/api/queries'; import { Loader2, Upload, Download } from 'lucide-react'; import { toast } from 'sonner'; @@ -92,16 +93,11 @@ export default function BatchPage() { rotateMutation.isPending; return ( -
-
-
-

Batch Operations

-

- Process multiple colors at once with manipulation operations -

-
- -
+ +
{/* Input */}
@@ -213,7 +209,6 @@ export default function BatchPage() { )}
-
-
+ ); } diff --git a/app/(app)/pastel/colorblind/page.tsx b/app/(app)/pastel/colorblind/page.tsx index 7b81703..1aed475 100644 --- a/app/(app)/pastel/colorblind/page.tsx +++ b/app/(app)/pastel/colorblind/page.tsx @@ -12,6 +12,7 @@ import { SelectValue, } from '@/components/ui/select'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useSimulateColorBlindness } from '@/lib/pastel/api/queries'; import { Loader2, Eye, Plus, X } from 'lucide-react'; import { toast } from 'sonner'; @@ -66,16 +67,11 @@ export default function ColorBlindPage() { }; return ( -
-
-
-

Color Blindness Simulator

-

- Simulate how colors appear with different types of color blindness -

-
- -
+ +
{/* Controls */}
@@ -229,7 +225,6 @@ export default function ColorBlindPage() { )}
-
-
+ ); } diff --git a/app/(app)/pastel/contrast/page.tsx b/app/(app)/pastel/contrast/page.tsx index a74f34c..f51c343 100644 --- a/app/(app)/pastel/contrast/page.tsx +++ b/app/(app)/pastel/contrast/page.tsx @@ -5,6 +5,7 @@ import { ColorPicker } from '@/components/pastel/ColorPicker'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { getContrastRatio, hexToRgb, checkWCAGCompliance } from '@/lib/pastel/utils/color'; import { ArrowLeftRight, Check, X } from 'lucide-react'; @@ -57,16 +58,11 @@ export default function ContrastPage() { ); return ( -
-
-
-

Contrast Checker

-

- Test color combinations for WCAG 2.1 compliance -

-
- -
+ +
{/* Color Pickers */}
@@ -183,7 +179,6 @@ export default function ContrastPage() { )}
-
-
+ ); } diff --git a/app/(app)/pastel/distinct/page.tsx b/app/(app)/pastel/distinct/page.tsx index 3c37efa..dc22575 100644 --- a/app/(app)/pastel/distinct/page.tsx +++ b/app/(app)/pastel/distinct/page.tsx @@ -13,6 +13,7 @@ import { SelectValue, } from '@/components/ui/select'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useGenerateDistinct } from '@/lib/pastel/api/queries'; import { Loader2 } from 'lucide-react'; import { toast } from 'sonner'; @@ -38,16 +39,11 @@ export default function DistinctPage() { }; return ( -
-
-
-

Distinct Colors Generator

-

- Generate visually distinct colors using simulated annealing -

-
- -
+ +
{/* Controls */}
@@ -137,7 +133,6 @@ export default function DistinctPage() { )}
-
-
+ ); } diff --git a/app/(app)/pastel/gradient/page.tsx b/app/(app)/pastel/gradient/page.tsx index 7a428e6..c9f536d 100644 --- a/app/(app)/pastel/gradient/page.tsx +++ b/app/(app)/pastel/gradient/page.tsx @@ -7,6 +7,7 @@ import { ExportMenu } from '@/components/pastel/ExportMenu'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useGenerateGradient } from '@/lib/pastel/api/queries'; import { Loader2, Plus, X } from 'lucide-react'; import { toast } from 'sonner'; @@ -48,16 +49,11 @@ export default function GradientPage() { }; return ( -
-
-
-

Gradient Creator

-

- Create smooth color gradients with multiple stops -

-
- -
+ +
{/* Controls */}
@@ -169,7 +165,6 @@ export default function GradientPage() { )}
-
-
+ ); } diff --git a/app/(app)/pastel/harmony/page.tsx b/app/(app)/pastel/harmony/page.tsx index ecbffb9..65428d6 100644 --- a/app/(app)/pastel/harmony/page.tsx +++ b/app/(app)/pastel/harmony/page.tsx @@ -13,6 +13,7 @@ import { SelectValue, } from '@/components/ui/select'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useGeneratePalette } from '@/lib/pastel/api/queries'; import { Loader2, Palette } from 'lucide-react'; import { toast } from 'sonner'; @@ -59,16 +60,11 @@ export default function HarmonyPage() { }; return ( -
-
-
-

Harmony Palette Generator

-

- Create color harmonies based on color theory principles -

-
- -
+ +
{/* Controls */}
@@ -160,7 +156,6 @@ export default function HarmonyPage() { )}
-
-
+ ); } diff --git a/app/(app)/pastel/names/page.tsx b/app/(app)/pastel/names/page.tsx index 1e44305..160bacd 100644 --- a/app/(app)/pastel/names/page.tsx +++ b/app/(app)/pastel/names/page.tsx @@ -11,6 +11,7 @@ import { SelectValue, } from '@/components/ui/select'; import { Card, CardContent } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useNamedColors } from '@/lib/pastel/api/queries'; import { Loader2 } from 'lucide-react'; import { parse_color } from '@valknarthing/pastel-wasm'; @@ -44,15 +45,11 @@ export default function NamedColorsPage() { }, [data, search, sortBy]); return ( -
-
-
-

Named Colors

-

- Explore 148 CSS/X11 named colors -

-
- + +
{/* Search and Filters */}
@@ -120,6 +117,6 @@ export default function NamedColorsPage() {
-
+ ); } diff --git a/app/(app)/pastel/page.tsx b/app/(app)/pastel/page.tsx index 54fba93..233a8da 100644 --- a/app/(app)/pastel/page.tsx +++ b/app/(app)/pastel/page.tsx @@ -7,6 +7,7 @@ import { ColorDisplay } from '@/components/pastel/ColorDisplay'; import { ColorInfo } from '@/components/pastel/ColorInfo'; import { ManipulationPanel } from '@/components/pastel/ManipulationPanel'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useColorInfo } from '@/lib/pastel/api/queries'; import { useColorHistory } from '@/lib/pastel/stores/historyStore'; import { Loader2, Share2, History, X } from 'lucide-react'; @@ -73,16 +74,11 @@ function PlaygroundContent() { }; return ( -
-
-
-

Pastel

-

- Interactive color manipulation and analysis tool -

-
- -
+ +
{/* Left Column: Color Picker and Display */}
@@ -197,8 +193,7 @@ function PlaygroundContent() {
-
-
+ ); } diff --git a/app/(app)/pastel/textcolor/page.tsx b/app/(app)/pastel/textcolor/page.tsx index fe9a983..3519eaf 100644 --- a/app/(app)/pastel/textcolor/page.tsx +++ b/app/(app)/pastel/textcolor/page.tsx @@ -5,6 +5,7 @@ import { ColorPicker } from '@/components/pastel/ColorPicker'; import { ColorDisplay } from '@/components/pastel/ColorDisplay'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { AppPage } from '@/components/layout/AppPage'; import { useTextColor } from '@/lib/pastel/api/queries'; import { Loader2, Palette, Plus, X, CheckCircle2, XCircle } from 'lucide-react'; import { toast } from 'sonner'; @@ -55,16 +56,11 @@ export default function TextColorPage() { }; return ( -
-
-
-

Text Color Optimizer

-

- Automatically find the best text color (black or white) for any background color -

-
- -
+ +
{/* Input */}
@@ -226,7 +222,6 @@ export default function TextColorPage() { )}
-
-
+ ); } diff --git a/app/(app)/units/page.tsx b/app/(app)/units/page.tsx index 1b83e88..87bddc6 100644 --- a/app/(app)/units/page.tsx +++ b/app/(app)/units/page.tsx @@ -1,17 +1,13 @@ import MainConverter from '@/components/units/MainConverter'; +import { AppPage } from '@/components/layout/AppPage'; export default function UnitsPage() { return ( -
-
-
-

Units Converter

-

- Smart unit converter with 187 units across 23 categories -

-
- -
-
+ + + ); } diff --git a/components/layout/AppPage.tsx b/components/layout/AppPage.tsx new file mode 100644 index 0000000..fe8e621 --- /dev/null +++ b/components/layout/AppPage.tsx @@ -0,0 +1,29 @@ +'use client'; + +import * as React from 'react'; +import { cn } from '@/lib/utils'; + +interface AppPageProps { + title: string; + description?: string; + children: React.ReactNode; + className?: string; +} + +export function AppPage({ title, description, children, className }: AppPageProps) { + return ( +
+
+
+

{title}

+ {description && ( +

+ {description} +

+ )} +
+ {children} +
+
+ ); +}