"use client"; import { useEffect, useState } from "react"; import { useTheme } from "next-themes"; import { StyleData } from "@/lib/types"; import { generatePreviewStyle, generateBackgroundGradient, } from "@/lib/cssGenerator"; import { PhoneMockup } from "./PhoneMockup"; import { UIControlsShowcase } from "./UIControlsShowcase"; import { ColorPalette } from "./ColorPalette"; import { MetadataBadges } from "./MetadataBadges"; import { ExpandableSection } from "./ExpandableSection"; import { CodeSnippet } from "./CodeSnippet"; import { InteractiveChecklist } from "./InteractiveChecklist"; interface StyleDetailModalProps { style: StyleData; onClose: () => void; } export function StyleDetailModal({ style, onClose }: StyleDetailModalProps) { const { theme } = useTheme(); const [mounted, setMounted] = useState(false); useEffect(() => setMounted(true), []); // ESC to close useEffect(() => { function handleKeyDown(e: KeyboardEvent) { if (e.key === "Escape") onClose(); } document.addEventListener("keydown", handleKeyDown); return () => document.removeEventListener("keydown", handleKeyDown); }, [onClose]); // Lock body scroll useEffect(() => { document.body.style.overflow = "hidden"; return () => { document.body.style.overflow = ""; }; }, []); const isDark = mounted ? theme === "dark" : false; const cardStyle = generatePreviewStyle(style, isDark); const bgGradient = generateBackgroundGradient(style.extractedColors, isDark); const accentColor = style.extractedColors[0] || (isDark ? "#6366f1" : "#3b82f6"); const secondaryColor = style.extractedColors[1] || style.extractedColors[0] || (isDark ? "#8b5cf6" : "#6366f1"); return (
{/* Backdrop */}
{/* Modal container */}
e.stopPropagation()} > {/* Header */}

{style.styleCategory}

{/* Spacer for centering */}
{/* Body — two-column on desktop, single-column on mobile */}
{/* Left: Phone mockup */}
{/* Right: Details */}
{/* Color Palette */}

Color Palette

{/* Metadata */}
{/* Expandable sections */}
{style.designSystemVariables && (
)}
{style.bestFor && (
Best for:{" "} {style.bestFor}
)} {style.doNotUseFor && (
Avoid for:{" "} {style.doNotUseFor}
)} {style.frameworkCompatibility && (
Frameworks:{" "} {style.frameworkCompatibility}
)} {style.keywords && (
{style.keywords .split(",") .slice(0, 6) .map((kw, i) => ( {kw.trim()} ))}
)}
); }