gradient-forge 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/.eslintrc.json +3 -0
  2. package/.github/FUNDING.yml +2 -0
  3. package/README.md +140 -0
  4. package/app/docs/page.tsx +417 -0
  5. package/app/gallery/page.tsx +398 -0
  6. package/app/globals.css +1155 -0
  7. package/app/layout.tsx +36 -0
  8. package/app/page.tsx +600 -0
  9. package/app/showcase/page.tsx +730 -0
  10. package/app/studio/page.tsx +1310 -0
  11. package/cli/index.mjs +1141 -0
  12. package/cli/templates/theme-context.tsx +120 -0
  13. package/cli/templates/theme-engine.ts +237 -0
  14. package/cli/templates/themes.css +512 -0
  15. package/components/site/component-showcase.tsx +623 -0
  16. package/components/site/site-data.ts +103 -0
  17. package/components/site/site-header.tsx +270 -0
  18. package/components/templates/blog.tsx +198 -0
  19. package/components/templates/components-showcase.tsx +298 -0
  20. package/components/templates/dashboard.tsx +246 -0
  21. package/components/templates/ecommerce.tsx +199 -0
  22. package/components/templates/mail.tsx +275 -0
  23. package/components/templates/saas-landing.tsx +169 -0
  24. package/components/theme/studio-code-panel.tsx +485 -0
  25. package/components/theme/theme-context.tsx +120 -0
  26. package/components/theme/theme-engine.ts +237 -0
  27. package/components/theme/theme-exporter.tsx +369 -0
  28. package/components/theme/theme-panel.tsx +268 -0
  29. package/components/theme/token-export-utils.ts +1211 -0
  30. package/components/ui/animated.tsx +55 -0
  31. package/components/ui/avatar.tsx +38 -0
  32. package/components/ui/badge.tsx +32 -0
  33. package/components/ui/button.tsx +65 -0
  34. package/components/ui/card.tsx +56 -0
  35. package/components/ui/checkbox.tsx +19 -0
  36. package/components/ui/command-palette.tsx +245 -0
  37. package/components/ui/gsap-animated.tsx +436 -0
  38. package/components/ui/input.tsx +17 -0
  39. package/components/ui/select.tsx +176 -0
  40. package/components/ui/skeleton.tsx +102 -0
  41. package/components/ui/switch.tsx +43 -0
  42. package/components/ui/tabs.tsx +115 -0
  43. package/components/ui/toast.tsx +119 -0
  44. package/gradient-forge/theme-context.tsx +119 -0
  45. package/gradient-forge/theme-engine.ts +236 -0
  46. package/gradient-forge/themes.css +556 -0
  47. package/lib/animations.ts +50 -0
  48. package/lib/gsap.ts +426 -0
  49. package/lib/utils.ts +6 -0
  50. package/next-env.d.ts +6 -0
  51. package/next.config.mjs +6 -0
  52. package/package.json +53 -0
  53. package/postcss.config.mjs +5 -0
  54. package/tailwind.config.ts +15 -0
  55. package/tsconfig.json +43 -0
  56. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,199 @@
1
+ "use client";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { Card, CardContent } from "@/components/ui/card";
5
+ import { Badge } from "@/components/ui/badge";
6
+ import {
7
+ ShoppingCart,
8
+ Search,
9
+ Heart,
10
+ Star,
11
+ Filter,
12
+ ChevronDown
13
+ } from "lucide-react";
14
+ import { cn } from "@/lib/utils";
15
+
16
+ interface EcommerceTemplateProps {
17
+ preview?: boolean;
18
+ }
19
+
20
+ export function EcommerceTemplate({ preview }: EcommerceTemplateProps) {
21
+ const products = [
22
+ {
23
+ id: 1,
24
+ name: "Premium Wireless Headphones",
25
+ price: 299,
26
+ rating: 4.8,
27
+ reviews: 128,
28
+ image: "bg-muted",
29
+ badge: "Bestseller"
30
+ },
31
+ {
32
+ id: 2,
33
+ name: "Smart Watch Pro",
34
+ price: 399,
35
+ rating: 4.9,
36
+ reviews: 256,
37
+ image: "bg-muted",
38
+ badge: "New"
39
+ },
40
+ {
41
+ id: 3,
42
+ name: "Minimalist Backpack",
43
+ price: 89,
44
+ rating: 4.7,
45
+ reviews: 89,
46
+ image: "bg-muted"
47
+ },
48
+ {
49
+ id: 4,
50
+ name: "Portable Speaker",
51
+ price: 149,
52
+ rating: 4.6,
53
+ reviews: 167,
54
+ image: "bg-muted"
55
+ },
56
+ ];
57
+
58
+ const categories = ["All", "Electronics", "Accessories", "Home", "Lifestyle"];
59
+
60
+ return (
61
+ <div className="min-h-full bg-background">
62
+ {/* Header */}
63
+ <header className="border-b border-border/50 bg-background/80 backdrop-blur-xl sticky top-0 z-50">
64
+ <div className="max-w-7xl mx-auto px-4 h-14 sm:h-16 flex items-center justify-between">
65
+ <div className="flex items-center gap-2">
66
+ <div className="h-8 w-8 rounded-lg bg-primary/20 flex items-center justify-center">
67
+ <ShoppingCart className="h-4 w-4 text-primary" />
68
+ </div>
69
+ <span className="font-semibold text-sm sm:text-base">Shop</span>
70
+ </div>
71
+
72
+ <div className="flex-1 max-w-md mx-4 hidden sm:block">
73
+ <div className="relative">
74
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
75
+ <input
76
+ type="text"
77
+ placeholder="Search products..."
78
+ className="w-full pl-10 pr-4 py-2 rounded-full border border-border/50 bg-background text-sm focus:outline-none focus:ring-2 focus:ring-primary/20"
79
+ />
80
+ </div>
81
+ </div>
82
+
83
+ <div className="flex items-center gap-2">
84
+ <Button variant="ghost" size="sm" className="h-8 w-8 p-0 hidden sm:flex">
85
+ <Heart className="h-4 w-4" />
86
+ </Button>
87
+ <Button variant="outline" size="sm" className="gap-2 text-xs">
88
+ <ShoppingCart className="h-4 w-4" />
89
+ <span className="hidden sm:inline">Cart (2)</span>
90
+ </Button>
91
+ </div>
92
+ </div>
93
+ </header>
94
+
95
+ <main className="max-w-7xl mx-auto px-4 py-6 sm:py-8">
96
+ {/* Hero Banner */}
97
+ <div className="relative rounded-2xl overflow-hidden mb-6 sm:mb-8 bg-gradient-to-r from-primary/20 to-accent/20 h-48 sm:h-64 flex items-center">
98
+ <div className="absolute inset-0 bg-background/40" />
99
+ <div className="relative z-10 px-6 sm:px-10 max-w-lg">
100
+ <Badge variant="glass" className="mb-3 text-xs">Summer Sale</Badge>
101
+ <h1 className="text-2xl sm:text-4xl font-bold mb-2 sm:mb-3">
102
+ Up to 50% off
103
+ </h1>
104
+ <p className="text-sm text-muted-foreground mb-4">
105
+ Discover amazing deals on premium products
106
+ </p>
107
+ <Button size="sm" variant="glow" className="text-xs">
108
+ Shop Now
109
+ </Button>
110
+ </div>
111
+ </div>
112
+
113
+ {/* Categories */}
114
+ <div className="flex gap-2 overflow-x-auto pb-4 mb-4 sm:mb-6 scrollbar-hide">
115
+ {categories.map((category, i) => (
116
+ <Button
117
+ key={category}
118
+ variant={i === 0 ? "default" : "outline"}
119
+ size="sm"
120
+ className="whitespace-nowrap text-xs"
121
+ >
122
+ {category}
123
+ </Button>
124
+ ))}
125
+ </div>
126
+
127
+ {/* Filters */}
128
+ <div className="flex items-center justify-between mb-4 sm:mb-6">
129
+ <h2 className="text-lg sm:text-xl font-semibold">Featured Products</h2>
130
+ <Button variant="outline" size="sm" className="gap-2 text-xs">
131
+ <Filter className="h-3.5 w-3.5" />
132
+ Filter
133
+ <ChevronDown className="h-3.5 w-3.5" />
134
+ </Button>
135
+ </div>
136
+
137
+ {/* Products Grid */}
138
+ <div className="grid grid-cols-2 lg:grid-cols-4 gap-3 sm:gap-6">
139
+ {products.map((product) => (
140
+ <Card key={product.id} className="border-border/50 group cursor-pointer overflow-hidden">
141
+ <CardContent className="p-0">
142
+ {/* Image */}
143
+ <div className="relative aspect-square bg-muted overflow-hidden">
144
+ <div className={cn("absolute inset-0", product.image)} />
145
+ {product.badge && (
146
+ <Badge
147
+ variant="default"
148
+ className="absolute top-2 left-2 text-[10px]"
149
+ >
150
+ {product.badge}
151
+ </Badge>
152
+ )}
153
+ <Button
154
+ variant="ghost"
155
+ size="sm"
156
+ className="absolute top-2 right-2 h-8 w-8 p-0 opacity-0 group-hover:opacity-100 transition-opacity"
157
+ >
158
+ <Heart className="h-4 w-4" />
159
+ </Button>
160
+ </div>
161
+
162
+ {/* Info */}
163
+ <div className="p-3 sm:p-4">
164
+ <h3 className="font-medium text-xs sm:text-sm mb-1 line-clamp-1">
165
+ {product.name}
166
+ </h3>
167
+
168
+ <div className="flex items-center gap-1 mb-2">
169
+ <Star className="h-3 w-3 fill-yellow-400 text-yellow-400" />
170
+ <span className="text-xs font-medium">{product.rating}</span>
171
+ <span className="text-[10px] sm:text-xs text-muted-foreground">
172
+ ({product.reviews})
173
+ </span>
174
+ </div>
175
+
176
+ <div className="flex items-center justify-between">
177
+ <span className="text-sm sm:text-base font-bold">
178
+ ${product.price}
179
+ </span>
180
+ <Button size="sm" variant="glow" className="h-8 text-xs">
181
+ Add
182
+ </Button>
183
+ </div>
184
+ </div>
185
+ </CardContent>
186
+ </Card>
187
+ ))}
188
+ </div>
189
+
190
+ {/* Load More */}
191
+ <div className="text-center mt-6 sm:mt-8">
192
+ <Button variant="outline" size="sm" className="text-xs">
193
+ Load More Products
194
+ </Button>
195
+ </div>
196
+ </main>
197
+ </div>
198
+ );
199
+ }
@@ -0,0 +1,275 @@
1
+ "use client";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { Card } from "@/components/ui/card";
5
+ import { Badge } from "@/components/ui/badge";
6
+ import { Checkbox } from "@/components/ui/checkbox";
7
+ import {
8
+ Inbox,
9
+ Send,
10
+ Archive,
11
+ Trash2,
12
+ Star,
13
+ MoreVertical,
14
+ Search,
15
+ Plus,
16
+ ChevronLeft,
17
+ Paperclip,
18
+ Reply,
19
+ Forward
20
+ } from "lucide-react";
21
+ import { cn } from "@/lib/utils";
22
+
23
+ interface MailTemplateProps {
24
+ preview?: boolean;
25
+ }
26
+
27
+ export function MailTemplate({ preview }: MailTemplateProps) {
28
+ const folders = [
29
+ { name: "Inbox", count: 128, icon: Inbox, active: true },
30
+ { name: "Sent", count: 0, icon: Send, active: false },
31
+ { name: "Drafts", count: 3, icon: Send, active: false },
32
+ { name: "Archive", count: 0, icon: Archive, active: false },
33
+ { name: "Trash", count: 0, icon: Trash2, active: false },
34
+ ];
35
+
36
+ const emails = [
37
+ {
38
+ id: 1,
39
+ from: "Sarah Chen",
40
+ subject: "Q4 Marketing Strategy - Review Needed",
41
+ preview: "Hi team, I've put together the initial draft for our Q4 marketing strategy. Please review...",
42
+ time: "10:30 AM",
43
+ starred: true,
44
+ unread: true
45
+ },
46
+ {
47
+ id: 2,
48
+ from: "Alex Rivera",
49
+ subject: "Design System Update",
50
+ preview: "The new component library is now ready for testing. I've attached the documentation...",
51
+ time: "9:15 AM",
52
+ starred: false,
53
+ unread: true
54
+ },
55
+ {
56
+ id: 3,
57
+ from: "Emily Watson",
58
+ subject: "Meeting Notes: Product Review",
59
+ preview: "Here are the notes from today's product review meeting. Key decisions include...",
60
+ time: "Yesterday",
61
+ starred: false,
62
+ unread: false
63
+ },
64
+ {
65
+ id: 4,
66
+ from: "Michael Park",
67
+ subject: "Weekly Analytics Report",
68
+ preview: "Attached is the weekly analytics report. We've seen a 15% increase in user engagement...",
69
+ time: "Yesterday",
70
+ starred: true,
71
+ unread: false
72
+ },
73
+ ];
74
+
75
+ return (
76
+ <div className="min-h-full bg-background flex">
77
+ {/* Sidebar */}
78
+ <aside className="w-14 sm:w-60 border-r border-border/50 bg-muted/30 flex-shrink-0 flex flex-col">
79
+ <div className="h-14 border-b border-border/50 flex items-center justify-center sm:justify-start sm:px-4">
80
+ <Button variant="glow" size="sm" className="w-10 sm:w-auto px-0 sm:px-4 gap-0 sm:gap-2">
81
+ <Plus className="h-4 w-4" />
82
+ <span className="hidden sm:inline text-xs">Compose</span>
83
+ </Button>
84
+ </div>
85
+
86
+ <nav className="flex-1 p-2 space-y-1">
87
+ {folders.map((folder) => (
88
+ <Button
89
+ key={folder.name}
90
+ variant={folder.active ? "secondary" : "ghost"}
91
+ size="sm"
92
+ className={cn(
93
+ "w-full justify-center sm:justify-start gap-0 sm:gap-3 h-9 px-2 sm:px-3",
94
+ folder.active && "bg-secondary"
95
+ )}
96
+ >
97
+ <folder.icon className="h-4 w-4" />
98
+ <span className="hidden sm:inline flex-1 text-left text-xs">{folder.name}</span>
99
+ {folder.count > 0 && (
100
+ <span className="hidden sm:inline text-xs text-muted-foreground">
101
+ {folder.count}
102
+ </span>
103
+ )}
104
+ </Button>
105
+ ))}
106
+ </nav>
107
+ </aside>
108
+
109
+ {/* Email List */}
110
+ <div className="w-full sm:w-80 border-r border-border/50 flex-shrink-0 flex flex-col">
111
+ <div className="h-14 border-b border-border/50 flex items-center px-4 gap-3">
112
+ <div className="relative flex-1">
113
+ <Search className="absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-muted-foreground" />
114
+ <input
115
+ type="text"
116
+ placeholder="Search mail..."
117
+ className="w-full pl-9 pr-4 py-2 rounded-lg border border-border/50 bg-background text-xs focus:outline-none focus:ring-2 focus:ring-primary/20"
118
+ />
119
+ </div>
120
+ </div>
121
+
122
+ <div className="flex-1 overflow-y-auto">
123
+ {emails.map((email) => (
124
+ <div
125
+ key={email.id}
126
+ className={cn(
127
+ "p-3 sm:p-4 border-b border-border/50 cursor-pointer transition-colors hover:bg-muted/30",
128
+ email.unread && "bg-primary/5"
129
+ )}
130
+ >
131
+ <div className="flex items-start gap-3">
132
+ <div className="hidden sm:flex items-center gap-2 pt-0.5">
133
+ <Checkbox className="h-4 w-4" />
134
+ <Star
135
+ className={cn(
136
+ "h-4 w-4 cursor-pointer",
137
+ email.starred ? "fill-yellow-400 text-yellow-400" : "text-muted-foreground"
138
+ )}
139
+ />
140
+ </div>
141
+ <div className="flex-1 min-w-0">
142
+ <div className="flex items-center justify-between gap-2">
143
+ <span className={cn(
144
+ "text-xs sm:text-sm truncate",
145
+ email.unread ? "font-semibold" : "font-medium"
146
+ )}>
147
+ {email.from}
148
+ </span>
149
+ <span className="text-[10px] sm:text-xs text-muted-foreground whitespace-nowrap">
150
+ {email.time}
151
+ </span>
152
+ </div>
153
+ <div className={cn(
154
+ "text-xs truncate mt-0.5",
155
+ email.unread ? "font-medium" : "text-muted-foreground"
156
+ )}>
157
+ {email.subject}
158
+ </div>
159
+ <p className="text-[10px] sm:text-xs text-muted-foreground truncate mt-0.5">
160
+ {email.preview}
161
+ </p>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ ))}
166
+ </div>
167
+ </div>
168
+
169
+ {/* Email Content */}
170
+ <main className="flex-1 min-w-0 hidden lg:flex flex-col">
171
+ <div className="h-14 border-b border-border/50 flex items-center justify-between px-4 sm:px-6">
172
+ <div className="flex items-center gap-4">
173
+ <Button variant="ghost" size="sm" className="h-8 w-8 p-0">
174
+ <ChevronLeft className="h-4 w-4" />
175
+ </Button>
176
+ <div className="flex items-center gap-2">
177
+ <Button variant="ghost" size="sm" className="gap-2 text-xs">
178
+ <Reply className="h-4 w-4" /> Reply
179
+ </Button>
180
+ <Button variant="ghost" size="sm" className="gap-2 text-xs">
181
+ <Forward className="h-4 w-4" /> Forward
182
+ </Button>
183
+ </div>
184
+ </div>
185
+ <div className="flex items-center gap-2">
186
+ <Button variant="ghost" size="sm" className="h-8 w-8 p-0">
187
+ <Archive className="h-4 w-4" />
188
+ </Button>
189
+ <Button variant="ghost" size="sm" className="h-8 w-8 p-0">
190
+ <Trash2 className="h-4 w-4" />
191
+ </Button>
192
+ <Button variant="ghost" size="sm" className="h-8 w-8 p-0">
193
+ <MoreVertical className="h-4 w-4" />
194
+ </Button>
195
+ </div>
196
+ </div>
197
+
198
+ <div className="flex-1 p-4 sm:p-6 overflow-y-auto">
199
+ <div className="max-w-3xl">
200
+ <h1 className="text-lg sm:text-xl font-semibold mb-4">
201
+ Q4 Marketing Strategy - Review Needed
202
+ </h1>
203
+
204
+ <div className="flex items-start gap-3 mb-6 pb-6 border-b border-border/50">
205
+ <div className="h-10 w-10 rounded-full bg-primary/20 flex items-center justify-center text-sm font-medium">
206
+ SC
207
+ </div>
208
+ <div className="flex-1">
209
+ <div className="flex items-center justify-between">
210
+ <div>
211
+ <span className="font-medium text-sm">Sarah Chen</span>
212
+ <span className="text-xs text-muted-foreground ml-2">&lt;sarah@company.com&gt;</span>
213
+ </div>
214
+ <span className="text-xs text-muted-foreground">10:30 AM</span>
215
+ </div>
216
+ <div className="text-xs text-muted-foreground mt-0.5">
217
+ To: Marketing Team
218
+ </div>
219
+ </div>
220
+ </div>
221
+
222
+ <div className="space-y-4 text-sm leading-relaxed">
223
+ <p>Hi team,</p>
224
+ <p>
225
+ I've put together the initial draft for our Q4 marketing strategy.
226
+ This includes our target audience analysis, channel recommendations,
227
+ and budget allocation.
228
+ </p>
229
+ <p>
230
+ Key highlights include:
231
+ </p>
232
+ <ul className="list-disc list-inside space-y-1 ml-4">
233
+ <li>Focus on content marketing and SEO</li>
234
+ <li>Increased budget for paid social</li>
235
+ <li>New webinar series starting October</li>
236
+ </ul>
237
+ <p>
238
+ Please review the attached document and let me know your thoughts.
239
+ I'd like to finalize this by Friday.
240
+ </p>
241
+ <p>Best,<br />Sarah</p>
242
+ </div>
243
+
244
+ <div className="mt-6 pt-6 border-t border-border/50">
245
+ <div className="flex items-center gap-2 text-xs text-muted-foreground">
246
+ <Paperclip className="h-4 w-4" />
247
+ <span>2 attachments</span>
248
+ </div>
249
+ <div className="flex gap-3 mt-3">
250
+ <Card className="p-3 flex items-center gap-3 cursor-pointer hover:bg-muted/30 transition-colors">
251
+ <div className="h-10 w-10 rounded bg-primary/10 flex items-center justify-center">
252
+ <span className="text-xs font-medium">PDF</span>
253
+ </div>
254
+ <div>
255
+ <p className="text-xs font-medium">Q4_Strategy.pdf</p>
256
+ <p className="text-[10px] text-muted-foreground">2.4 MB</p>
257
+ </div>
258
+ </Card>
259
+ <Card className="p-3 flex items-center gap-3 cursor-pointer hover:bg-muted/30 transition-colors">
260
+ <div className="h-10 w-10 rounded bg-primary/10 flex items-center justify-center">
261
+ <span className="text-xs font-medium">XLS</span>
262
+ </div>
263
+ <div>
264
+ <p className="text-xs font-medium">Budget_2024.xlsx</p>
265
+ <p className="text-[10px] text-muted-foreground">1.1 MB</p>
266
+ </div>
267
+ </Card>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </div>
272
+ </main>
273
+ </div>
274
+ );
275
+ }
@@ -0,0 +1,169 @@
1
+ "use client";
2
+
3
+ import { Button } from "@/components/ui/button";
4
+ import { Badge } from "@/components/ui/badge";
5
+ import { Card, CardContent } from "@/components/ui/card";
6
+ import { ArrowRight, Check, Sparkles, Zap, Shield, Globe } from "lucide-react";
7
+
8
+ interface SaaSLandingTemplateProps {
9
+ preview?: boolean;
10
+ }
11
+
12
+ export function SaaSLandingTemplate({ preview }: SaaSLandingTemplateProps) {
13
+ // Show compact preview version
14
+ const features = [
15
+ { icon: Zap, title: "Lightning Fast", desc: "Optimized performance with minimal bundle size" },
16
+ { icon: Shield, title: "Type Safe", desc: "Full TypeScript support with strict typing" },
17
+ { icon: Globe, title: "Production Ready", desc: "Battle-tested in production environments" },
18
+ { icon: Sparkles, title: "Beautiful Themes", desc: "21 curated gradient themes included" },
19
+ { icon: Check, title: "Accessible", desc: "WCAG 2.1 AA compliant components" },
20
+ { icon: Zap, title: "Dark Mode", desc: "Automatic dark mode with system preference" },
21
+ ];
22
+
23
+ const plans = [
24
+ { name: "Starter", price: "$0", desc: "Perfect for side projects", features: ["5 projects", "Basic themes", "Community support"] },
25
+ { name: "Pro", price: "$29", desc: "For growing teams", features: ["Unlimited projects", "All themes", "Priority support", "Custom exports"], popular: true },
26
+ { name: "Enterprise", price: "Custom", desc: "For large organizations", features: ["Everything in Pro", "SLA", "Dedicated support", "Custom development"] },
27
+ ];
28
+
29
+ return (
30
+ <div className="min-h-full bg-background">
31
+ {/* Navbar */}
32
+ <nav className="border-b border-border/50 bg-background/80 backdrop-blur-xl sticky top-0 z-50">
33
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 h-14 sm:h-16 flex items-center justify-between">
34
+ <div className="flex items-center gap-2">
35
+ <div className="h-7 w-7 sm:h-8 sm:w-8 rounded-lg bg-primary/20 flex items-center justify-center">
36
+ <Sparkles className="h-4 w-4 text-primary" />
37
+ </div>
38
+ <span className="font-semibold text-sm sm:text-base">SaaSify</span>
39
+ </div>
40
+ <div className="flex items-center gap-1 sm:gap-2">
41
+ <Button variant="ghost" size="sm" className="hidden sm:inline-flex text-xs">Features</Button>
42
+ <Button variant="ghost" size="sm" className="hidden sm:inline-flex text-xs">Pricing</Button>
43
+ <Button variant="glow" size="sm" className="text-xs">Get Started</Button>
44
+ </div>
45
+ </div>
46
+ </nav>
47
+
48
+ {/* Hero */}
49
+ <section className="py-12 sm:py-20 px-4 text-center">
50
+ <Badge variant="glass" className="mb-3 sm:mb-4 text-xs">Now in Beta</Badge>
51
+ <h1 className="text-2xl sm:text-4xl md:text-5xl lg:text-6xl font-bold mb-4 sm:mb-6 leading-tight">
52
+ Build faster with{" "}
53
+ <span className="bg-gradient-to-r from-primary to-accent bg-clip-text text-transparent">
54
+ Gradient Forge
55
+ </span>
56
+ </h1>
57
+ <p className="text-sm sm:text-lg md:text-xl text-muted-foreground max-w-xl sm:max-w-2xl mx-auto mb-6 sm:mb-8 px-4">
58
+ Production-ready theming system with beautiful gradients and surface-aware overlays for modern web apps.
59
+ </p>
60
+ <div className="flex flex-col sm:flex-row gap-2 sm:gap-4 justify-center px-4">
61
+ <Button size={preview ? "sm" : "md"} variant="glow" className="gap-1.5 text-xs sm:text-sm">
62
+ Start Building <ArrowRight className="h-3.5 w-3.5 sm:h-4 sm:w-4" />
63
+ </Button>
64
+ <Button size={preview ? "sm" : "md"} variant="outline" className="text-xs sm:text-sm">
65
+ View Documentation
66
+ </Button>
67
+ </div>
68
+
69
+ {/* Trusted By */}
70
+ <div className="mt-12 sm:mt-20 px-4">
71
+ <p className="text-xs sm:text-sm text-muted-foreground mb-4 sm:mb-6">Trusted by innovative teams</p>
72
+ <div className="flex flex-wrap justify-center gap-4 sm:gap-8 opacity-50">
73
+ {["Vercel", "Linear", "Notion", "Figma", "Stripe"].map((company) => (
74
+ <div key={company} className="text-xs sm:text-sm font-semibold text-muted-foreground">
75
+ {company}
76
+ </div>
77
+ ))}
78
+ </div>
79
+ </div>
80
+ </section>
81
+
82
+ {/* Features Grid */}
83
+ <section className="py-12 sm:py-20 px-4 bg-muted/30">
84
+ <div className="max-w-6xl mx-auto">
85
+ <div className="text-center mb-8 sm:mb-12">
86
+ <h2 className="text-xl sm:text-2xl md:text-3xl font-bold mb-2 sm:mb-4">Everything you need</h2>
87
+ <p className="text-sm sm:text-base text-muted-foreground">Powerful features for modern applications</p>
88
+ </div>
89
+
90
+ <div className="grid sm:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6">
91
+ {features.map((feature, i) => (
92
+ <Card key={i} className="border-border/50 bg-background/60 hover:shadow-lg transition-shadow">
93
+ <CardContent className="p-4 sm:p-6">
94
+ <div className="h-8 w-8 sm:h-10 sm:w-10 rounded-lg bg-primary/10 flex items-center justify-center mb-3 sm:mb-4">
95
+ <feature.icon className="h-4 w-4 sm:h-5 sm:w-5 text-primary" />
96
+ </div>
97
+ <h3 className="font-semibold text-sm sm:text-base mb-1 sm:mb-2">{feature.title}</h3>
98
+ <p className="text-xs sm:text-sm text-muted-foreground">{feature.desc}</p>
99
+ </CardContent>
100
+ </Card>
101
+ ))}
102
+ </div>
103
+ </div>
104
+ </section>
105
+
106
+ {/* Pricing */}
107
+ <section className="py-12 sm:py-20 px-4">
108
+ <div className="max-w-5xl mx-auto">
109
+ <div className="text-center mb-8 sm:mb-12">
110
+ <h2 className="text-xl sm:text-2xl md:text-3xl font-bold mb-2 sm:mb-4">Simple Pricing</h2>
111
+ <p className="text-sm sm:text-base text-muted-foreground">Choose the plan that works for you</p>
112
+ </div>
113
+
114
+ <div className="grid sm:grid-cols-3 gap-4 sm:gap-6">
115
+ {plans.map((plan, i) => (
116
+ <Card key={i} className={cn(
117
+ "border-border/50 relative",
118
+ plan.popular && "border-primary/50 shadow-lg shadow-primary/10"
119
+ )}>
120
+ {plan.popular && (
121
+ <Badge className="absolute -top-2 left-1/2 -translate-x-1/2 text-xs">
122
+ Most Popular
123
+ </Badge>
124
+ )}
125
+ <CardContent className="p-4 sm:p-6">
126
+ <h3 className="font-semibold text-sm sm:text-base mb-1">{plan.name}</h3>
127
+ <div className="text-2xl sm:text-3xl font-bold mb-1">{plan.price}</div>
128
+ <p className="text-xs sm:text-sm text-muted-foreground mb-3 sm:mb-4">{plan.desc}</p>
129
+ <ul className="space-y-1.5 sm:space-y-2 mb-4 sm:mb-6">
130
+ {plan.features.map((feature, j) => (
131
+ <li key={j} className="flex items-center gap-2 text-xs sm:text-sm">
132
+ <Check className="h-3.5 w-3.5 sm:h-4 sm:w-4 text-primary" />
133
+ {feature}
134
+ </li>
135
+ ))}
136
+ </ul>
137
+ <Button
138
+ variant={plan.popular ? "glow" : "outline"}
139
+ className="w-full text-xs sm:text-sm"
140
+ size="sm"
141
+ >
142
+ Get Started
143
+ </Button>
144
+ </CardContent>
145
+ </Card>
146
+ ))}
147
+ </div>
148
+ </div>
149
+ </section>
150
+
151
+ {/* CTA */}
152
+ <section className="py-12 sm:py-20 px-4 bg-muted/30">
153
+ <div className="max-w-3xl mx-auto text-center">
154
+ <h2 className="text-xl sm:text-2xl md:text-3xl font-bold mb-3 sm:mb-4">Ready to get started?</h2>
155
+ <p className="text-sm sm:text-base text-muted-foreground mb-5 sm:mb-6">
156
+ Join thousands of developers building beautiful applications
157
+ </p>
158
+ <Button size={preview ? "md" : "lg"} variant="glow" className="gap-2 text-xs sm:text-sm">
159
+ Start Building Now <ArrowRight className="h-3.5 w-3.5 sm:h-4 sm:w-4" />
160
+ </Button>
161
+ </div>
162
+ </section>
163
+ </div>
164
+ );
165
+ }
166
+
167
+ function cn(...classes: (string | boolean | undefined)[]) {
168
+ return classes.filter(Boolean).join(" ");
169
+ }