import React, { useState, useRef } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { Download } from "lucide-react"; import { motion } from "framer-motion"; import domtoimage from "dom-to-image"; /** * IceHockeyJerseyBuilder – a simple interactive jersey configurator. * * Features: * - Pick body, sleeve, stripe & collar colours (colour inputs) * - Enter player name & number (live preview) * - Download PNG snapshot of design * * Style framework: Tailwind CSS + shadcn/ui for basic elements * Icons: lucide-react */ const IceHockeyJerseyBuilder = () => { // --- State --- const [bodyColor, setBodyColor] = useState("#004080"); // navy blue default const [sleeveColor, setSleeveColor] = useState("#ffffff"); const [stripeColor, setStripeColor] = useState("#c8102e"); // red stripe default const [collarColor, setCollarColor] = useState("#000000"); const [nameText, setNameText] = useState("PLAYER"); const [numberText, setNumberText] = useState("22"); // ref for export const jerseyRef = useRef(null); // --- Helpers --- const handleDownload = async () => { if (!jerseyRef.current) return; try { const blob = await domtoimage.toBlob(jerseyRef.current); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = `jersey_${Date.now()}.png`; link.click(); URL.revokeObjectURL(url); } catch (err) { console.error("Download failed", err); alert("Sorry, something went wrong generating the image."); } }; // --- JSX --- return (
{/* Controls Panel */}

Customize Your Jersey

{/* Colours */}
setBodyColor(e.target.value)} /> setSleeveColor(e.target.value)} /> setStripeColor(e.target.value)} /> setCollarColor(e.target.value)} />
{/* Name & Number */}
setNameText(e.target.value.toUpperCase())} placeholder="PLAYER" />
setNumberText(e.target.value)} placeholder="22" min="0" />
{/* Download button */}
{/* Jersey Preview */} {/* Body */}
{/* Sleeves */}
{/* Stripes */}
{/* Collar */}
{/* Name & Number */}

{nameText}

{numberText}

); }; /** Reusable colour picker */ const ColourPicker = ({ label, value, onChange }) => (
); export default IceHockeyJerseyBuilder;
import React, { useState, useRef } from "react"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { Download } from "lucide-react"; import { motion } from "framer-motion"; import domtoimage from "dom-to-image"; /** * IceHockeyJerseyBuilder – a simple interactive jersey configurator. * * Features: * - Pick body, sleeve, stripe & collar colours (colour inputs) * - Enter player name & number (live preview) * - Download PNG snapshot of design * * Style framework: Tailwind CSS + shadcn/ui for basic elements * Icons: lucide-react */ const IceHockeyJerseyBuilder = () => { // --- State --- const [bodyColor, setBodyColor] = useState("#004080"); // navy blue default const [sleeveColor, setSleeveColor] = useState("#ffffff"); const [stripeColor, setStripeColor] = useState("#c8102e"); // red stripe default const [collarColor, setCollarColor] = useState("#000000"); const [nameText, setNameText] = useState("PLAYER"); const [numberText, setNumberText] = useState("22"); // ref for export const jerseyRef = useRef(null); // --- Helpers --- const handleDownload = async () => { if (!jerseyRef.current) return; try { const blob = await domtoimage.toBlob(jerseyRef.current); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = `jersey_${Date.now()}.png`; link.click(); URL.revokeObjectURL(url); } catch (err) { console.error("Download failed", err); alert("Sorry, something went wrong generating the image."); } }; // --- JSX --- return (
{/* Controls Panel */}

Customize Your Jersey

{/* Colours */}
setBodyColor(e.target.value)} /> setSleeveColor(e.target.value)} /> setStripeColor(e.target.value)} /> setCollarColor(e.target.value)} />
{/* Name & Number */}
setNameText(e.target.value.toUpperCase())} placeholder="PLAYER" />
setNumberText(e.target.value)} placeholder="22" min="0" />
{/* Download button */}
{/* Jersey Preview */} {/* Body */}
{/* Sleeves */}
{/* Stripes */}
{/* Collar */}
{/* Name & Number */}

{nameText}

{numberText}

); }; /** Reusable colour picker */ const ColourPicker = ({ label, value, onChange }) => (
); export default IceHockeyJerseyBuilder;