import React, { useState, useEffect } from 'react'; import { useParams, Link } from 'react-router-dom'; import type { Theme } from '../../types/theme'; import { getTheme } from '../../themes'; import { LayoutPreview } from './LayoutPreview'; import './ThemeDetailPage.css'; export const ThemeDetailPage: React.FC = () => { const { themeId } = useParams<{ themeId: string }>(); const [theme, setTheme] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const loadTheme = async () => { if (!themeId) { setError('No theme ID provided'); setLoading(false); return; } try { setLoading(true); const themeData = await getTheme(themeId); if (!themeData) { setError(`Theme "${themeId}" not found`); return; } setTheme(themeData); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load theme'); } finally { setLoading(false); } }; loadTheme(); }, [themeId]); if (loading) { return (
Loading theme...
); } if (error) { return (

Error

{error}

← Back to Themes
); } if (!theme) { return (

Theme Not Found

The requested theme could not be found.

← Back to Themes
); } return (
← Back to Themes

{theme.name}

{theme.description}

{theme.author && by {theme.author}} {theme.version && v{theme.version}}
{theme.variables && Object.keys(theme.variables).length > 0 && (

Color Palette

{Object.entries(theme.variables) .filter(([_, value]) => value.startsWith('#') || value.includes('rgb') || value.includes('hsl')) .map(([key, value]) => (
--{key}
{value}
))}
)}

Available Layouts ({theme.layouts.length})

{theme.layouts.map((layout) => (

{layout.name}

{layout.slots.length} slots View Details →
))}
{theme.variables && (

CSS Variables

{Object.entries(theme.variables).map(([key, value]) => (
--{key} {value}
))}
)}

Technical Details

Path: {theme.basePath}
CSS File: {theme.cssFile}
Master Slide: {theme.masterSlideTemplate ? 'Yes' : 'No'}
); };