dodey917 commited on
Commit
1c5961e
·
verified ·
1 Parent(s): 15861c0

1 — Project structure (recommended)

Browse files

wear-fun/
├─ public/
│ └─ logo.png
├─ src/
│ ├─ pages/ # or app/ if using Next 13+ app router
│ │ ├─ index.tsx # Home / hero
│ │ ├─ meme.tsx # Meme generator page
│ │ ├─ shop.tsx # Shop page
│ │ └─ community.tsx
│ ├─ components/
│ │ ├─ Hero.tsx
│ │ ├─ MemeUploader.tsx
│ │ ├─ ProductCard.tsx
│ │ └─ Footer.tsx
│ ├─ lib/
│ │ └─ openai.ts
│ └─ styles/
├─ pages/api/
│ ├─ generate-caption.ts # text generation endpoint
│ ├─ generate-mockup.ts # image generation endpoint (OpenAI)
│ ├─ printful-order.ts # Printful proxy order endpoint
│ └─ stripe-checkout.ts # Stripe checkout session (optional)
├─ .env.local
├─ tailwind.config.js
├─ package.json
└─ README.md

2 — Environment variables (important)

Add to .env.local:

NEXT_PUBLIC_SITE_NAME="Wear.Fun"
OPENAI_API_KEY=sk-...
PRINTFUL_API_KEY=pf_...
STRIPE_SECRET_KEY=sk_live_...
SUPABASE_URL=...
SUPABASE_KEY=...
NEXT_PUBLIC_STRIPE_PK=pk_live_...


(Use staging/test keys in dev.)

3 — Prompts (ready-to-use)

Caption generation prompt (send to GPT text model):

You are a witty meme copywriter. Given an uploaded image and an optional style hint, produce 3 short, funny, and shareable captions (one-liners, 3-10 words) suitable for printing on T-shirts and stickers. Avoid profanity and violent content. Keep them family-friendly but edgy and internet-culture-savvy.

IMAGE_DESCRIPTION: <brief description of the uploaded image here>
STYLE_HINT: <e.g., "crypto meme", "XRP joke", "sarcastic", or empty>

Return JSON:
{
"captions": [
"caption A",
"caption B",
"caption C"
]
}


T-shirt mockup prompt (for DALL·E / gpt-image-1):

Generate a photorealistic image of a unisex T-shirt on a neutral background (or worn by a gender-neutral model) with realistic folds and lighting. Apply the provided uploaded image as a seamless printed design on the front. Match fabric texture and follow shirt wrinkles and lighting so the design looks printed, not pasted. Provide a 1024x1024 PNG. Shirt color should be white by default but must be easily changeable by replacing "white" in the prompt.

4 — Backend: Next.js API examples

These endpoints run server-side only. They accept multipart/form-data (image uploads) and call OpenAI or Printful. Keep API keys server-side.

/pages/api/generate-caption.ts (text caption)
// pages/api/generate-caption.ts
import type { NextApiRequest, NextApiResponse } from "next";
import OpenAI from "openai";

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
const { imageDescription = "", styleHint = "" } = req.body;

const prompt = `You are a witty meme copywriter...
IMAGE_DESCRIPTION: ${imageDescription}
STYLE_HINT: ${styleHint}

Return JSON:
{ "captions": [ ... ] }`;

const completion = await openai.chat.completions.create({
model: "gpt-5o-mini", // example text model; replace with your preferred model
messages: [{ role: "user", content: prompt }],
max_tokens: 150,
temperature: 0.9,
});

// extract and parse JSON safely:
const raw = completion.choices?.[0]?.message?.content ?? "";
// attempt to parse JSON from raw content
let parsed;
try { parsed = JSON.parse(raw); } catch { parsed = { captions: [raw] }; }

res.status(200).json(parsed);
} catch (err) {
console.error(err);
res.status(500).json({ error: "Caption generation failed" });
}
}


Note: use model you have access to; adjust temperature.

/pages/api/generate-mockup.ts (image mockup with OpenAI Image API)
// pages/api/generate-mockup.ts
import type { NextApiRequest, NextApiResponse } from "next";
import formidable from "formidable";
import fs from "fs";
import OpenAI from "openai";

export const config = { api: { bodyParser: false } };

const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
const form = new formidable.IncomingForm();
form.parse(req, async (err, fields, files) => {
try {
if (err) throw err;
// fields: shirtColor (optional), promptHint
const shirtColor = fields.shirtColor || "white";
const promptHint = fields.promptHint || "";

const design = files.design as formidable.File;
if (!design) return res.status(400).json({ error: "No design uploaded" });

// read file
const imageBuffer = fs.readFileSync(design.filepath);

const prompt = `Generate a photorealistic unisex ${shirtColor} T-shirt...
${promptHint}`;

// call OpenAI images.generate
const response = await openai.images.generate({
model: "gpt-image-1",
prompt,
image: [imageBuffer], // pass the user image to be applied
size: "1024x1024",
// you may add `background` or other params depending on SDK
});

// The SDK may return base64 or a URL. Adjust to your SDK version:
const imageData = response.data?.[0];
// If base64:
const b64 = imageData?.b64_json;
if (b64) {
const imgBuffer = Buffer.from(b64, "base64");
res.setHeader("Content-Type", "image/png");
return res.send(imgBuffer);
}

// Otherwise, if URL is returned:
const url = imageData?.url;
return res.status(200).json({ url });
} catch (error) {
console.error(error);
res.status(500).json({ error: "Mockup generation failed" });
}
});
}


Important: adapt to the OpenAI SDK version you use (some return b64_json, others return a url). If using streaming/remote, you may proxy the returned URL to your frontend.

/pages/api/printful-order.ts (proxy to Printful)
// pages/api/printful-order.ts
import type { NextApiRequest, NextApiResponse } from "next";
import fetch from "node-fetch";

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
const body = req.body; // expect validated order payload
const printfulApiKey = process.env.PRINTFUL_API_KEY;

// Build Printful Order structure
const order = {
recipient: body.recipient,
items: body.items, // make sure to validate these
// optional sync_product or external variants
};

const response = await fetch("https://api.printful.com/orders", {
method: "POST",
headers: {
Authorization: `Basic ${Buffer.from(`${printfulApiKey}:`).toString("base64")}`,
"Content-Type": "application/json",
},
body: JSON.stringify(order),
});

const data = await response.json();
res.status(response.status).json(data);
} catch (error) {
console.error(error);
res.status(500).json({ error: "Printful order failed" });
}
}


Printful requires product configuration (sync products, variant IDs). Typically you'll create a product on Printful dashboard that accepts a print file, then use product variant IDs when creating order items.

5 — Frontend snippets

Below are 3 essential React components. Use Tailwind and Framer Motion.

Install:

npm install framer-motion @headlessui/react openai
npm install -D tailwindcss postcss autoprefixer

Hero component (src/components/Hero.tsx)
import { motion } from "framer-motion";

export default function Hero() {
return (
<section className="min-h-screen flex items-center justify-center bg-black text-white relative overflow-hidden">
{/* red neon gradient animated background */}
<div className="absolute inset-0 bg-gradient-to-r from-red-700 via-black to-red-900 opacity-20 animate-[pulse_8s_infinite]"></div>

{/* floating t-shirt icons */}
<motion.img src="/logo.png" alt="Wear.Fun" className="w-28 z-10"
initial={{ y: -30, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
transition={{ duration: 1 }}
/>

<div className="z-20 text-center px-6">
<motion.h1 className="text-5xl md:text-7xl font-extrabold tracking-tight"
initial={{ opacity: 0, y: 12 }} animate={{ opacity: 1, y: 0 }} transition={{ delay: 0.2 }}>
From Memes to Merch 🚀
</motion.h1>
<motion.p className="mt-4 text-lg md:text-2xl text-gray-200"
initial={{ opacity: 0 }} animate={{ opacity: 1 }} transition={{ delay: 0.3 }}>
Upload your favorite meme or crypto logo and turn it into a wearable joke — in seconds.
</motion.p>

<motion.div className="mt-8 flex gap-4 justify-center"
initial={{ opacity: 0 }} animate={{ opacity: 1 }} transition={{ delay: 0.4 }}>
<button className="bg-red-600 hover:bg-red-700 text-white px-6 py-3 rounded-full shadow-lg">
Upload Image
</button>
<button className="border border-red-600 text-red-600 px-6 py-3 rounded-full hover:bg-red-900/30">
Generate Meme
</button>
</motion.div>
</div>
</section>
);
}

MemeUploader component (core UX)
// src/components/MemeUploader.tsx
import React, { useState } from "react";
import { motion } from "framer-motion";

export default function MemeUploader() {
const [file, setFile] = useState<File | null>(null);
const [captions, setCaptions] = useState<string[]>([]);
const [mockupUrl, setMockupUrl] = useState<string | null>(null);
const [loading, setLoading] = useState(false);
const [styleHint, setStyleHint] = useState("");

async function handleGenerateCaption() {
if (!file) return;
setLoading(true);

// Basic image description — in prod use vision or let user add description
const imageDescription = file.name;

const res = await fetch("/api/generate-caption", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ imageDescription, styleHint }),
});
const data = await res.json();
setCaptions(data.captions || []);
setLoading(false);
}

async function handleGenerateMockup(caption?: string) {
if (!file) return;
setLoading(true

Files changed (4) hide show
  1. README.md +7 -4
  2. index.html +161 -19
  3. meme.html +97 -0
  4. shop.html +31 -0
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Wear Fun
3
- emoji: 🏆
4
- colorFrom: pink
5
  colorTo: gray
 
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: Wear.Fun 🚀
3
+ colorFrom: gray
 
4
  colorTo: gray
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
index.html CHANGED
@@ -1,19 +1,161 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Wear.Fun - From Memes to Merch</title>
7
+ <link rel="icon" type="image/x-icon" href="/public/logo.png">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
12
+ </head>
13
+ <body class="bg-black text-white">
14
+ <custom-header></custom-header>
15
+
16
+ <main>
17
+ <section class="min-h-screen flex items-center justify-center relative overflow-hidden">
18
+ <!-- Animated background -->
19
+ <div class="absolute inset-0 bg-gradient-to-r from-red-700 via-black to-red-900 opacity-20 animate-pulse"></div>
20
+
21
+ <!-- Floating t-shirt icon -->
22
+ <div class="absolute top-1/4 left-1/4 w-16 h-16 opacity-20 animate-bounce">
23
+ <i data-feather="t-shirt" class="w-full h-full"></i>
24
+ </div>
25
+ <div class="absolute bottom-1/3 right-1/3 w-12 h-12 opacity-30 animate-bounce" style="animation-delay: 0.5s">
26
+ <i data-feather="smile" class="w-full h-full"></i>
27
+ </div>
28
+
29
+ <div class="z-20 text-center px-6 max-w-4xl">
30
+ <h1 class="text-4xl md:text-6xl font-extrabold tracking-tight mb-6">
31
+ From Memes to Merch <span class="text-red-500">🚀</span>
32
+ </h1>
33
+ <p class="text-lg md:text-2xl text-gray-300 mb-10">
34
+ Upload your favorite meme or crypto logo and turn it into a wearable joke — in seconds.
35
+ </p>
36
+
37
+ <div class="flex flex-col sm:flex-row gap-4 justify-center">
38
+ <a href="/meme.html" class="bg-red-600 hover:bg-red-700 text-white px-8 py-4 rounded-full shadow-lg text-lg font-semibold transition transform hover:scale-105">
39
+ Upload Image
40
+ </a>
41
+ <a href="/shop.html" class="border-2 border-red-600 text-red-600 px-8 py-4 rounded-full hover:bg-red-900/30 text-lg font-semibold transition transform hover:scale-105">
42
+ Browse Shop
43
+ </a>
44
+ </div>
45
+ </div>
46
+ </section>
47
+
48
+ <section class="py-20 px-6">
49
+ <div class="max-w-6xl mx-auto">
50
+ <h2 class="text-3xl md:text-4xl font-bold text-center mb-16">How It Works</h2>
51
+
52
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-10">
53
+ <div class="bg-gray-900 p-8 rounded-xl border border-gray-800 hover:border-red-500 transition">
54
+ <div class="w-16 h-16 bg-red-600 rounded-full flex items-center justify-center mb-6">
55
+ <span class="text-2xl font-bold">1</span>
56
+ </div>
57
+ <h3 class="text-xl font-bold mb-3">Upload Your Meme</h3>
58
+ <p class="text-gray-400">Share your funniest meme or design with us. We support all popular image formats.</p>
59
+ </div>
60
+
61
+ <div class="bg-gray-900 p-8 rounded-xl border border-gray-800 hover:border-red-500 transition">
62
+ <div class="w-16 h-16 bg-red-600 rounded-full flex items-center justify-center mb-6">
63
+ <span class="text-2xl font-bold">2</span>
64
+ </div>
65
+ <h3 class="text-xl font-bold mb-3">Generate Captions</h3>
66
+ <p class="text-gray-400">Our AI creates hilarious captions perfect for printing on apparel.</p>
67
+ </div>
68
+
69
+ <div class="bg-gray-900 p-8 rounded-xl border border-gray-800 hover:border-red-500 transition">
70
+ <div class="w-16 h-16 bg-red-600 rounded-full flex items-center justify-center mb-6">
71
+ <span class="text-2xl font-bold">3</span>
72
+ </div>
73
+ <h3 class="text-xl font-bold mb-3">Wear Your Humor</h3>
74
+ <p class="text-gray-400">Get your custom merch delivered right to your door. Show off your sense of humor!</p>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </section>
79
+
80
+ <section class="py-20 bg-gray-900/50">
81
+ <div class="max-w-6xl mx-auto px-6">
82
+ <h2 class="text-3xl md:text-4xl font-bold text-center mb-16">Featured Products</h2>
83
+
84
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
85
+ <div class="bg-gray-800 rounded-xl overflow-hidden border border-gray-700 hover:border-red-500 transition">
86
+ <div class="h-60 bg-gradient-to-r from-red-900 to-black flex items-center justify-center">
87
+ <i data-feather="t-shirt" class="w-24 h-24 text-red-500/30"></i>
88
+ </div>
89
+ <div class="p-6">
90
+ <h3 class="font-bold text-xl mb-2">Classic Tee</h3>
91
+ <p class="text-gray-400 mb-4">Premium cotton t-shirt with your custom design</p>
92
+ <div class="flex justify-between items-center">
93
+ <span class="font-bold">$24.99</span>
94
+ <button class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-lg transition">View</button>
95
+ </div>
96
+ </div>
97
+ </div>
98
+
99
+ <div class="bg-gray-800 rounded-xl overflow-hidden border border-gray-700 hover:border-red-500 transition">
100
+ <div class="h-60 bg-gradient-to-r from-blue-900 to-black flex items-center justify-center">
101
+ <i data-feather="coffee" class="w-24 h-24 text-blue-500/30"></i>
102
+ </div>
103
+ <div class="p-6">
104
+ <h3 class="font-bold text-xl mb-2">Mug Design</h3>
105
+ <p class="text-gray-400 mb-4">Ceramic mug with your favorite meme</p>
106
+ <div class="flex justify-between items-center">
107
+ <span class="font-bold">$14.99</span>
108
+ <button class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-lg transition">View</button>
109
+ </div>
110
+ </div>
111
+ </div>
112
+
113
+ <div class="bg-gray-800 rounded-xl overflow-hidden border border-gray-700 hover:border-red-500 transition">
114
+ <div class="h-60 bg-gradient-to-r from-purple-900 to-black flex items-center justify-center">
115
+ <i data-feather="smartphone" class="w-24 h-24 text-purple-500/30"></i>
116
+ </div>
117
+ <div class="p-6">
118
+ <h3 class="font-bold text-xl mb-2">Phone Case</h3>
119
+ <p class="text-gray-400 mb-4">Protect your phone with style</p>
120
+ <div class="flex justify-between items-center">
121
+ <span class="font-bold">$19.99</span>
122
+ <button class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-lg transition">View</button>
123
+ </div>
124
+ </div>
125
+ </div>
126
+
127
+ <div class="bg-gray-800 rounded-xl overflow-hidden border border-gray-700 hover:border-red-500 transition">
128
+ <div class="h-60 bg-gradient-to-r from-green-900 to-black flex items-center justify-center">
129
+ <i data-feather="shopping-bag" class="w-24 h-24 text-green-500/30"></i>
130
+ </div>
131
+ <div class="p-6">
132
+ <h3 class="font-bold text-xl mb-2">Tote Bag</h3>
133
+ <p class="text-gray-400 mb-4">Eco-friendly tote with your design</p>
134
+ <div class="flex justify-between items-center">
135
+ <span class="font-bold">$17.99</span>
136
+ <button class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-lg transition">View</button>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </div>
141
+
142
+ <div class="text-center mt-12">
143
+ <a href="/shop.html" class="inline-block bg-red-600 hover:bg-red-700 text-white px-8 py-4 rounded-full shadow-lg font-semibold transition transform hover:scale-105">
144
+ View All Products
145
+ </a>
146
+ </div>
147
+ </div>
148
+ </section>
149
+ </main>
150
+
151
+ <custom-footer></custom-footer>
152
+
153
+ <script src="components/header.js"></script>
154
+ <script src="components/footer.js"></script>
155
+ <script src="script.js"></script>
156
+ <script>
157
+ feather.replace();
158
+ </script>
159
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
160
+ </body>
161
+ </html>
meme.html ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Meme Generator - Wear.Fun</title>
7
+ <link rel="icon" type="image/x-icon" href="/public/logo.png">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
12
+ </head>
13
+ <body class="bg-black text-white">
14
+ <custom-header></custom-header>
15
+
16
+ <main class="py-12 px-6">
17
+ <div class="max-w-4xl mx-auto">
18
+ <h1 class="text-3xl md:text-4xl font-bold text-center mb-2">Meme Generator</h1>
19
+ <p class="text-gray-400 text-center mb-12">Turn your memes into wearable art</p>
20
+
21
+ <div class="bg-gray-900 rounded-2xl p-6 md:p-8 border border-gray-800">
22
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-8">
23
+ <div>
24
+ <h2 class="text-xl font-bold mb-4">Upload Your Image</h2>
25
+
26
+ <div class="border-2 border-dashed border-gray-700 rounded-xl p-8 text-center mb-6 transition hover:border-red-500 cursor-pointer">
27
+ <i data-feather="upload" class="w-12 h-12 mx-auto text-gray-500 mb-4"></i>
28
+ <p class="mb-2">Drag & drop your image here</p>
29
+ <p class="text-sm text-gray-500 mb-4">or</p>
30
+ <button class="bg-red-600 hover:bg-red-700 px-6 py-2 rounded-lg font-medium">Browse Files</button>
31
+ <input type="file" class="hidden" accept="image/*">
32
+ </div>
33
+
34
+ <div class="mb-6">
35
+ <label class="block text-gray-400 mb-2">Style Hint (Optional)</label>
36
+ <input type="text" placeholder="e.g., crypto meme, sarcastic" class="w-full bg-gray-800 border border-gray-700 rounded-lg px-4 py-3 focus:outline-none focus:ring-2 focus:ring-red-500">
37
+ </div>
38
+
39
+ <button class="w-full bg-red-600 hover:bg-red-700 text-white py-3 rounded-lg font-semibold transition">
40
+ Generate Captions
41
+ </button>
42
+ </div>
43
+
44
+ <div>
45
+ <h2 class="text-xl font-bold mb-4">Generated Captions</h2>
46
+
47
+ <div class="space-y-4">
48
+ <div class="bg-gray-800 p-4 rounded-lg border border-gray-700 hover:border-red-500 transition">
49
+ <p class="font-medium mb-3">This is a hilarious caption for your meme!</p>
50
+ <div class="flex gap-2">
51
+ <button class="flex-1 bg-gray-700 hover:bg-gray-600 py-2 rounded-lg text-sm transition">Preview Mockup</button>
52
+ <button class="flex-1 bg-red-600 hover:bg-red-700 py-2 rounded-lg text-sm transition">Add to T-Shirt</button>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="bg-gray-800 p-4 rounded-lg border border-gray-700 hover:border-red-500 transition">
57
+ <p class="font-medium mb-3">Another funny caption option</p>
58
+ <div class="flex gap-2">
59
+ <button class="flex-1 bg-gray-700 hover:bg-gray-600 py-2 rounded-lg text-sm transition">Preview Mockup</button>
60
+ <button class="flex-1 bg-red-600 hover:bg-red-700 py-2 rounded-lg text-sm transition">Add to T-Shirt</button>
61
+ </div>
62
+ </div>
63
+
64
+ <div class="bg-gray-800 p-4 rounded-lg border border-gray-700 hover:border-red-500 transition">
65
+ <p class="font-medium mb-3">Third hilarious caption idea</p>
66
+ <div class="flex gap-2">
67
+ <button class="flex-1 bg-gray-700 hover:bg-gray-600 py-2 rounded-lg text-sm transition">Preview Mockup</button>
68
+ <button class="flex-1 bg-red-600 hover:bg-red-700 py-2 rounded-lg text-sm transition">Add to T-Shirt</button>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </div>
74
+
75
+ <div class="mt-12">
76
+ <h2 class="text-xl font-bold mb-4">T-Shirt Preview</h2>
77
+ <div class="bg-gray-800 rounded-xl p-8 flex items-center justify-center min-h-[400px] border border-gray-700">
78
+ <div class="text-center">
79
+ <i data-feather="t-shirt" class="w-24 h-24 mx-auto text-gray-600 mb-4"></i>
80
+ <p class="text-gray-500">Your t-shirt mockup will appear here</p>
81
+ </div>
82
+ </div>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </main>
87
+
88
+ <custom-footer></custom-footer>
89
+
90
+ <script src="components/header.js"></script>
91
+ <script src="components/footer.js"></script>
92
+ <script src="script.js"></script>
93
+ <script>
94
+ feather.replace();
95
+ </script>
96
+ </body>
97
+ </html>
shop.html ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Shop - Wear.Fun</title>
7
+ <link rel="icon" type="image/x-icon" href="/public/logo.png">
8
+ <link rel="stylesheet" href="style.css">
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script src="https://unpkg.com/feather-icons"></script>
11
+ <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
12
+ </head>
13
+ <body class="bg-black text-white">
14
+ <custom-header></custom-header>
15
+
16
+ <main class="py-12 px-6">
17
+ <div class="max-w-7xl mx-auto">
18
+ <h1 class="text-3xl md:text-4xl font-bold text-center mb-2">Shop Collection</h1>
19
+ <p class="text-gray-400 text-center mb-12">Wear your humor with pride</p>
20
+
21
+ <div class="flex flex-wrap gap-4 mb-8">
22
+ <button class="bg-gray-800 hover:bg-gray-700 px-4 py-2 rounded-lg transition">All Products</button>
23
+ <button class="bg-gray-800 hover:bg-gray-700 px-4 py-2 rounded-lg transition">T-Shirts</button>
24
+ <button class="bg-gray-800 hover:bg-gray-700 px-4 py-2 rounded-lg transition">Accessories</button>
25
+ <button class="bg-gray-800 hover:bg-gray-700 px-4 py-2 rounded-lg transition">Hoodies</button>
26
+ <button class="bg-gray-800 hover:bg-gray-700 px-4 py-2 rounded-lg transition">Mugs</button>
27
+ </div>
28
+
29
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-
30
+ </body>
31
+ </html>