likhonsheikh commited on
Commit
18ea885
·
verified ·
1 Parent(s): 3892cb7

Deploy Next.js v0.dev clone with shadcn/ui and Geist design system

Browse files
.gitignore ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # dependencies
2
+ /node_modules
3
+ /.pnp
4
+ .pnp.js
5
+
6
+ # testing
7
+ /coverage
8
+
9
+ # next.js
10
+ /.next/
11
+ /out/
12
+
13
+ # production
14
+ /build
15
+
16
+ # misc
17
+ .DS_Store
18
+ *.pem
19
+
20
+ # debug
21
+ npm-debug.log*
22
+ yarn-debug.log*
23
+ yarn-error.log*
24
+
25
+ # local env files
26
+ .env*.local
27
+
28
+ # vercel
29
+ .vercel
30
+
31
+ # typescript
32
+ *.tsbuildinfo
33
+ next-env.d.ts
Dockerfile ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:18-alpine AS base
2
+
3
+ # Install dependencies only when needed
4
+ FROM base AS deps
5
+ RUN apk add --no-cache libc6-compat
6
+ WORKDIR /app
7
+
8
+ COPY package.json package-lock.json* ./
9
+ RUN npm ci
10
+
11
+ # Rebuild the source code only when needed
12
+ FROM base AS builder
13
+ WORKDIR /app
14
+ COPY --from=deps /app/node_modules ./node_modules
15
+ COPY . .
16
+
17
+ RUN npm run build
18
+
19
+ # Production image, copy all the files and run next
20
+ FROM base AS runner
21
+ WORKDIR /app
22
+
23
+ ENV NODE_ENV production
24
+
25
+ RUN addgroup --system --gid 1001 nodejs
26
+ RUN adduser --system --uid 1001 nextjs
27
+
28
+ COPY --from=builder /app/public ./public
29
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
30
+ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
31
+
32
+ USER nextjs
33
+
34
+ EXPOSE 7860
35
+
36
+ ENV PORT 7860
37
+ ENV HOSTNAME "0.0.0.0"
38
+
39
+ CMD ["node", "server.js"]
README.md CHANGED
@@ -1,12 +1,31 @@
1
  ---
2
- title: V0 Landing Page Clone
3
  emoji: 🎨
4
  colorFrom: gray
5
  colorTo: blue
6
- sdk: static
7
  pinned: false
8
  ---
9
 
10
- # v0 by Vercel - Landing Page Clone
11
 
12
- A pixel-perfect recreation of the v0.dev landing page using the Geist design system.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: v0 Landing Clone
3
  emoji: 🎨
4
  colorFrom: gray
5
  colorTo: blue
6
+ sdk: docker
7
  pinned: false
8
  ---
9
 
10
+ # v0.dev Landing Page Clone
11
 
12
+ A pixel-perfect recreation of the v0.dev landing page built with Next.js 14, shadcn/ui, and the Vercel Geist design system.
13
+
14
+ ## Tech Stack
15
+
16
+ - **Next.js 14** - React framework with App Router
17
+ - **shadcn/ui** - Beautiful, accessible components
18
+ - **Vercel Geist** - Official Vercel design system
19
+ - **Tailwind CSS** - Utility-first styling
20
+ - **TypeScript** - Type-safe development
21
+ - **Geist Fonts** - Modern typefaces (Sans & Mono)
22
+
23
+ ## Features
24
+
25
+ - ✨ Exact v0.dev design recreation
26
+ - 🎨 Geist design system integration
27
+ - 📱 Fully responsive layout
28
+ - ⚡ Optimized performance
29
+ - 🔧 shadcn/ui components
30
+
31
+ This Space runs the Next.js application in a Docker container.
app/globals.css ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ @layer base {
6
+ :root {
7
+ --background: 0 0% 100%;
8
+ --foreground: 0 0% 0%;
9
+ --card: 0 0% 100%;
10
+ --card-foreground: 0 0% 0%;
11
+ --popover: 0 0% 100%;
12
+ --popover-foreground: 0 0% 0%;
13
+ --primary: 0 0% 0%;
14
+ --primary-foreground: 0 0% 100%;
15
+ --secondary: 0 0% 96%;
16
+ --secondary-foreground: 0 0% 0%;
17
+ --muted: 0 0% 96%;
18
+ --muted-foreground: 0 0% 40%;
19
+ --accent: 0 0% 96%;
20
+ --accent-foreground: 0 0% 0%;
21
+ --destructive: 0 84.2% 60.2%;
22
+ --destructive-foreground: 0 0% 100%;
23
+ --border: 0 0% 90%;
24
+ --input: 0 0% 90%;
25
+ --ring: 0 0% 0%;
26
+ --radius: 0.5rem;
27
+ }
28
+ }
29
+
30
+ @layer base {
31
+ * {
32
+ @apply border-border;
33
+ }
34
+ body {
35
+ @apply bg-background text-foreground;
36
+ }
37
+ }
app/layout.tsx ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { Metadata } from "next";
2
+ import { GeistSans } from "geist/font/sans";
3
+ import { GeistMono } from "geist/font/mono";
4
+ import "./globals.css";
5
+
6
+ export const metadata: Metadata = {
7
+ title: "v0 by Vercel",
8
+ description: "Start building with a single prompt. No coding needed.",
9
+ };
10
+
11
+ export default function RootLayout({
12
+ children,
13
+ }: Readonly<{
14
+ children: React.ReactNode;
15
+ }>) {
16
+ return (
17
+ <html lang="en" className={`${GeistSans.variable} ${GeistMono.variable}`}>
18
+ <body className="font-sans antialiased">{children}</body>
19
+ </html>
20
+ );
21
+ }
app/page.tsx ADDED
@@ -0,0 +1,278 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Button } from "@/components/ui/button"
2
+ import { Input } from "@/components/ui/input"
3
+ import { Plus, Upload, ChevronDown, ChevronRight, Eye, Heart } from "lucide-react"
4
+
5
+ export default function Home() {
6
+ return (
7
+ <div className="min-h-screen bg-white">
8
+ {/* Navigation */}
9
+ <nav className="sticky top-0 z-50 flex items-center justify-between border-b border-border bg-white px-8 h-[60px]">
10
+ <div className="flex items-center gap-12">
11
+ {/* Logo */}
12
+ <a href="#" className="text-base font-semibold text-foreground">
13
+ v0
14
+ </a>
15
+
16
+ {/* Nav Links */}
17
+ <div className="flex items-center gap-6">
18
+ <button className="flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
19
+ Templates
20
+ <ChevronDown className="w-3 h-3" />
21
+ </button>
22
+ <button className="flex items-center gap-1 text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
23
+ Resources
24
+ <ChevronDown className="w-3 h-3" />
25
+ </button>
26
+ <a href="#" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
27
+ Enterprise
28
+ </a>
29
+ <a href="#" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
30
+ Pricing
31
+ </a>
32
+ <a href="#" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
33
+ iOS
34
+ </a>
35
+ <a href="#" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
36
+ Students
37
+ </a>
38
+ <a href="#" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">
39
+ FAQ
40
+ </a>
41
+ </div>
42
+ </div>
43
+
44
+ {/* Auth Buttons */}
45
+ <div className="flex items-center gap-4">
46
+ <Button variant="outline" size="sm" className="text-sm font-medium">
47
+ Sign In
48
+ </Button>
49
+ <Button variant="outline" size="sm" className="text-sm font-medium">
50
+ Sign Up
51
+ </Button>
52
+ </div>
53
+ </nav>
54
+
55
+ {/* Main Container */}
56
+ <main className="max-w-[1200px] mx-auto px-8">
57
+ {/* Hero Section */}
58
+ <section className="relative text-center py-16">
59
+ {/* Large Watermark */}
60
+ <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-[240px] font-bold text-foreground/[0.02] tracking-tighter leading-none select-none pointer-events-none">
61
+ v0
62
+ </div>
63
+
64
+ <div className="relative z-10">
65
+ <h1 className="text-5xl font-semibold tracking-tight mb-4">
66
+ What do you want to create?
67
+ </h1>
68
+ <p className="text-base text-muted-foreground mb-8">
69
+ Start building with a single prompt. No coding needed.
70
+ </p>
71
+
72
+ {/* Input Field */}
73
+ <div className="max-w-[600px] mx-auto flex items-center gap-2 p-2 border border-border rounded-2xl bg-white hover:border-border/80 focus-within:border-foreground transition-colors">
74
+ <button className="p-2 hover:bg-accent rounded-md transition-colors">
75
+ <Plus className="w-5 h-5 text-muted-foreground" />
76
+ </button>
77
+ <Input
78
+ placeholder="Ask v0 to build..."
79
+ className="border-0 shadow-none focus-visible:ring-0 text-sm"
80
+ />
81
+ <button className="p-2 hover:bg-accent rounded-md transition-colors">
82
+ <Upload className="w-5 h-5 text-muted-foreground" />
83
+ </button>
84
+ </div>
85
+ </div>
86
+ </section>
87
+
88
+ {/* Community Section */}
89
+ <section className="py-12">
90
+ <div className="flex items-center justify-between mb-6">
91
+ <div>
92
+ <h2 className="text-lg font-semibold mb-1">From the Community</h2>
93
+ <p className="text-sm text-muted-foreground">
94
+ Explore what the community is building with v0.
95
+ </p>
96
+ </div>
97
+ <a href="#" className="flex items-center gap-1 text-sm font-medium text-foreground hover:underline">
98
+ Browse All
99
+ <ChevronRight className="w-4 h-4" />
100
+ </a>
101
+ </div>
102
+
103
+ {/* Template Grid */}
104
+ <div className="grid grid-cols-3 gap-6">
105
+ {/* Template Card 1 */}
106
+ <div className="group cursor-pointer">
107
+ <div className="relative aspect-[4/3] rounded-lg border border-border overflow-hidden mb-3 bg-gray-50">
108
+ <div className="p-6">
109
+ <h3 className="text-sm font-medium mb-4">
110
+ Effortless custom contract billing by Brilliance
111
+ </h3>
112
+ <div className="mt-8 space-y-2">
113
+ <div className="h-2 bg-gray-200 rounded w-full"></div>
114
+ <div className="h-2 bg-gray-200 rounded w-3/4"></div>
115
+ <div className="h-8 bg-black rounded w-24 mt-4"></div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ <div className="flex items-start gap-2">
120
+ <div className="w-6 h-6 rounded-full bg-purple-500 flex-shrink-0"></div>
121
+ <div className="flex-1">
122
+ <h4 className="text-sm font-medium mb-1">Brilliance SaaS Landing Page</h4>
123
+ <div className="flex items-center gap-3 text-xs text-muted-foreground">
124
+ <span className="flex items-center gap-1">
125
+ <Eye className="w-3 h-3" />
126
+ 2.1k
127
+ </span>
128
+ <span className="flex items-center gap-1">
129
+ <Heart className="w-3 h-3" />
130
+ 662
131
+ </span>
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </div>
136
+
137
+ {/* Template Card 2 */}
138
+ <div className="group cursor-pointer">
139
+ <div className="relative aspect-[4/3] rounded-lg border border-border overflow-hidden mb-3 bg-black">
140
+ <div className="flex items-center justify-center h-full">
141
+ <div className="text-white text-sm">3D Gallery Photography Template</div>
142
+ </div>
143
+ </div>
144
+ <div className="flex items-start gap-2">
145
+ <div className="w-6 h-6 rounded-full bg-purple-500 flex-shrink-0"></div>
146
+ <div className="flex-1">
147
+ <h4 className="text-sm font-medium mb-1">3D Gallery Photography Template</h4>
148
+ <div className="flex items-center gap-3 text-xs text-muted-foreground">
149
+ <span className="flex items-center gap-1">
150
+ <Eye className="w-3 h-3" />
151
+ 5.14k
152
+ </span>
153
+ <span className="flex items-center gap-1">
154
+ <Heart className="w-3 h-3" />
155
+ 403
156
+ </span>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ </div>
161
+
162
+ {/* Template Card 3 */}
163
+ <div className="group cursor-pointer">
164
+ <div className="relative aspect-[4/3] rounded-lg border border-border overflow-hidden mb-3 bg-black">
165
+ <div className="absolute top-3 right-3">
166
+ <span className="inline-flex items-center justify-center w-8 h-8 rounded-full bg-black text-white text-xs font-medium border border-white/20">
167
+ AI
168
+ </span>
169
+ </div>
170
+ <div className="flex items-center justify-center h-full">
171
+ <h3 className="text-white text-lg font-semibold">AI Gateway Starter</h3>
172
+ </div>
173
+ </div>
174
+ <div className="flex items-start gap-2">
175
+ <div className="w-6 h-6 rounded-full bg-purple-500 flex-shrink-0"></div>
176
+ <div className="flex-1">
177
+ <h4 className="text-sm font-medium mb-1">AI Gateway Starter</h4>
178
+ <div className="flex items-center gap-3 text-xs text-muted-foreground">
179
+ <span className="flex items-center gap-1">
180
+ <Eye className="w-3 h-3" />
181
+ 4.42k
182
+ </span>
183
+ <span className="flex items-center gap-1">
184
+ <Heart className="w-3 h-3" />
185
+ 188
186
+ </span>
187
+ </div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+
192
+ {/* Template Card 4 */}
193
+ <div className="group cursor-pointer">
194
+ <div className="relative aspect-[4/3] rounded-lg border border-border overflow-hidden mb-3 bg-gradient-to-br from-blue-500 to-purple-600">
195
+ <div className="flex flex-col items-center justify-center h-full text-white px-6">
196
+ <h3 className="text-lg font-semibold mb-3">
197
+ Unleash the Power of AI Agents
198
+ </h3>
199
+ <Button size="sm" variant="secondary" className="bg-white text-black hover:bg-gray-100">
200
+ Learn More
201
+ </Button>
202
+ </div>
203
+ </div>
204
+ <div className="flex items-start gap-2">
205
+ <div className="w-6 h-6 rounded-full bg-purple-500 flex-shrink-0"></div>
206
+ <div className="flex-1">
207
+ <h4 className="text-sm font-medium mb-1">Pointer AI landing page</h4>
208
+ <div className="flex items-center gap-3 text-xs text-muted-foreground">
209
+ <span className="flex items-center gap-1">
210
+ <Eye className="w-3 h-3" />
211
+ 14.8k
212
+ </span>
213
+ <span className="flex items-center gap-1">
214
+ <Heart className="w-3 h-3" />
215
+ 1.1k
216
+ </span>
217
+ </div>
218
+ </div>
219
+ </div>
220
+ </div>
221
+
222
+ {/* Template Card 5 */}
223
+ <div className="group cursor-pointer">
224
+ <div className="relative aspect-[4/3] rounded-lg border border-border overflow-hidden mb-3 bg-black">
225
+ <div className="flex items-center justify-center h-full">
226
+ <div className="w-16 h-16 rounded-lg bg-gradient-to-br from-green-400 to-emerald-500"></div>
227
+ </div>
228
+ </div>
229
+ <div className="flex items-start gap-2">
230
+ <div className="w-6 h-6 rounded-full bg-purple-500 flex-shrink-0"></div>
231
+ <div className="flex-1">
232
+ <h4 className="text-sm font-medium mb-1">Dashboard – M.O.N.K.Y</h4>
233
+ <div className="flex items-center gap-3 text-xs text-muted-foreground">
234
+ <span className="flex items-center gap-1">
235
+ <Eye className="w-3 h-3" />
236
+ 7.76k
237
+ </span>
238
+ <span className="flex items-center gap-1">
239
+ <Heart className="w-3 h-3" />
240
+ 725
241
+ </span>
242
+ </div>
243
+ </div>
244
+ </div>
245
+ </div>
246
+
247
+ {/* Template Card 6 */}
248
+ <div className="group cursor-pointer">
249
+ <div className="relative aspect-[4/3] rounded-lg border border-border overflow-hidden mb-3 bg-gradient-to-br from-slate-900 to-slate-800">
250
+ <div className="flex items-center justify-center h-full">
251
+ <h3 className="text-white text-lg font-semibold">
252
+ Unlock your future growth
253
+ </h3>
254
+ </div>
255
+ </div>
256
+ <div className="flex items-start gap-2">
257
+ <div className="w-6 h-6 rounded-full bg-purple-500 flex-shrink-0"></div>
258
+ <div className="flex-1">
259
+ <h4 className="text-sm font-medium mb-1">Skal Ventures Template</h4>
260
+ <div className="flex items-center gap-3 text-xs text-muted-foreground">
261
+ <span className="flex items-center gap-1">
262
+ <Eye className="w-3 h-3" />
263
+ 3.23k
264
+ </span>
265
+ <span className="flex items-center gap-1">
266
+ <Heart className="w-3 h-3" />
267
+ 495
268
+ </span>
269
+ </div>
270
+ </div>
271
+ </div>
272
+ </div>
273
+ </div>
274
+ </section>
275
+ </main>
276
+ </div>
277
+ )
278
+ }
components.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "default",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "tailwind.config.ts",
8
+ "css": "app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "aliases": {
14
+ "components": "@/components",
15
+ "utils": "@/lib/utils"
16
+ }
17
+ }
components/ui/button.tsx ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+ import { Slot } from "@radix-ui/react-slot"
3
+ import { cva, type VariantProps } from "class-variance-authority"
4
+
5
+ import { cn } from "@/lib/utils"
6
+
7
+ const buttonVariants = cva(
8
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default:
13
+ "bg-primary text-primary-foreground shadow hover:bg-primary/90",
14
+ destructive:
15
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
16
+ outline:
17
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
18
+ secondary:
19
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
20
+ ghost: "hover:bg-accent hover:text-accent-foreground",
21
+ link: "text-primary underline-offset-4 hover:underline",
22
+ },
23
+ size: {
24
+ default: "h-9 px-4 py-2",
25
+ sm: "h-8 rounded-md px-3 text-xs",
26
+ lg: "h-10 rounded-md px-8",
27
+ icon: "h-9 w-9",
28
+ },
29
+ },
30
+ defaultVariants: {
31
+ variant: "default",
32
+ size: "default",
33
+ },
34
+ }
35
+ )
36
+
37
+ export interface ButtonProps
38
+ extends React.ButtonHTMLAttributes<HTMLButtonElement>,
39
+ VariantProps<typeof buttonVariants> {
40
+ asChild?: boolean
41
+ }
42
+
43
+ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
44
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
45
+ const Comp = asChild ? Slot : "button"
46
+ return (
47
+ <Comp
48
+ className={cn(buttonVariants({ variant, size, className }))}
49
+ ref={ref}
50
+ {...props}
51
+ />
52
+ )
53
+ }
54
+ )
55
+ Button.displayName = "Button"
56
+
57
+ export { Button, buttonVariants }
components/ui/input.tsx ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import * as React from "react"
2
+
3
+ import { cn } from "@/lib/utils"
4
+
5
+ export interface InputProps
6
+ extends React.InputHTMLAttributes<HTMLInputElement> {}
7
+
8
+ const Input = React.forwardRef<HTMLInputElement, InputProps>(
9
+ ({ className, type, ...props }, ref) => {
10
+ return (
11
+ <input
12
+ type={type}
13
+ className={cn(
14
+ "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
15
+ className
16
+ )}
17
+ ref={ref}
18
+ {...props}
19
+ />
20
+ )
21
+ }
22
+ )
23
+ Input.displayName = "Input"
24
+
25
+ export { Input }
deploy.sh ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "🚀 Deploying v0 Landing Page Clone"
4
+ echo "=================================="
5
+ echo ""
6
+
7
+ cd /workspace/v0-nextjs-new
8
+
9
+ # Check if node_modules exists
10
+ if [ ! -d "node_modules" ]; then
11
+ echo "📦 Installing dependencies..."
12
+ npm install
13
+ fi
14
+
15
+ echo ""
16
+ echo "🏗️ Building project..."
17
+ npm run build
18
+
19
+ if [ $? -eq 0 ]; then
20
+ echo ""
21
+ echo "✅ Build successful!"
22
+ echo ""
23
+ echo "📤 Deploying to Vercel..."
24
+ npx vercel --prod --yes
25
+
26
+ echo ""
27
+ echo "🎉 Deployment complete!"
28
+ else
29
+ echo ""
30
+ echo "❌ Build failed. Please check the errors above."
31
+ exit 1
32
+ fi
lib/utils.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { type ClassValue, clsx } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
next.config.mjs ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ output: 'standalone',
4
+ }
5
+
6
+ export default nextConfig
package.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "v0-landing-clone",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev",
7
+ "build": "next build",
8
+ "start": "next start"
9
+ },
10
+ "dependencies": {
11
+ "next": "14.2.0",
12
+ "react": "^18.3.0",
13
+ "react-dom": "^18.3.0",
14
+ "@radix-ui/react-slot": "^1.0.2",
15
+ "@radix-ui/react-dropdown-menu": "^2.0.6",
16
+ "class-variance-authority": "^0.7.0",
17
+ "clsx": "^2.1.0",
18
+ "tailwind-merge": "^2.2.1",
19
+ "lucide-react": "^0.344.0",
20
+ "geist": "^1.2.2"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20",
24
+ "@types/react": "^18",
25
+ "@types/react-dom": "^18",
26
+ "autoprefixer": "^10.4.18",
27
+ "postcss": "^8.4.35",
28
+ "tailwindcss": "^3.4.1",
29
+ "tailwindcss-animate": "^1.0.7",
30
+ "typescript": "^5"
31
+ }
32
+ }
postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
tailwind.config.ts ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { Config } from "tailwindcss"
2
+
3
+ const config: Config = {
4
+ darkMode: ["class"],
5
+ content: [
6
+ './pages/**/*.{ts,tsx}',
7
+ './components/**/*.{ts,tsx}',
8
+ './app/**/*.{ts,tsx}',
9
+ './src/**/*.{ts,tsx}',
10
+ ],
11
+ theme: {
12
+ container: {
13
+ center: true,
14
+ padding: "2rem",
15
+ screens: {
16
+ "2xl": "1400px",
17
+ },
18
+ },
19
+ extend: {
20
+ colors: {
21
+ border: "hsl(var(--border))",
22
+ input: "hsl(var(--input))",
23
+ ring: "hsl(var(--ring))",
24
+ background: "hsl(var(--background))",
25
+ foreground: "hsl(var(--foreground))",
26
+ primary: {
27
+ DEFAULT: "hsl(var(--primary))",
28
+ foreground: "hsl(var(--primary-foreground))",
29
+ },
30
+ secondary: {
31
+ DEFAULT: "hsl(var(--secondary))",
32
+ foreground: "hsl(var(--secondary-foreground))",
33
+ },
34
+ destructive: {
35
+ DEFAULT: "hsl(var(--destructive))",
36
+ foreground: "hsl(var(--destructive-foreground))",
37
+ },
38
+ muted: {
39
+ DEFAULT: "hsl(var(--muted))",
40
+ foreground: "hsl(var(--muted-foreground))",
41
+ },
42
+ accent: {
43
+ DEFAULT: "hsl(var(--accent))",
44
+ foreground: "hsl(var(--accent-foreground))",
45
+ },
46
+ popover: {
47
+ DEFAULT: "hsl(var(--popover))",
48
+ foreground: "hsl(var(--popover-foreground))",
49
+ },
50
+ card: {
51
+ DEFAULT: "hsl(var(--card))",
52
+ foreground: "hsl(var(--card-foreground))",
53
+ },
54
+ },
55
+ borderRadius: {
56
+ lg: "var(--radius)",
57
+ md: "calc(var(--radius) - 2px)",
58
+ sm: "calc(var(--radius) - 4px)",
59
+ },
60
+ fontFamily: {
61
+ sans: ['var(--font-geist-sans)'],
62
+ mono: ['var(--font-geist-mono)'],
63
+ },
64
+ keyframes: {
65
+ "accordion-down": {
66
+ from: { height: "0" },
67
+ to: { height: "var(--radix-accordion-content-height)" },
68
+ },
69
+ "accordion-up": {
70
+ from: { height: "var(--radix-accordion-content-height)" },
71
+ to: { height: "0" },
72
+ },
73
+ },
74
+ animation: {
75
+ "accordion-down": "accordion-down 0.2s ease-out",
76
+ "accordion-up": "accordion-up 0.2s ease-out",
77
+ },
78
+ },
79
+ },
80
+ plugins: [require("tailwindcss-animate")],
81
+ }
82
+
83
+ export default config
tsconfig.json ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2017",
4
+ "lib": ["dom", "dom.iterable", "esnext"],
5
+ "allowJs": true,
6
+ "skipLibCheck": true,
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "esModuleInterop": true,
10
+ "module": "esnext",
11
+ "moduleResolution": "bundler",
12
+ "resolveJsonModule": true,
13
+ "isolatedModules": true,
14
+ "jsx": "preserve",
15
+ "incremental": true,
16
+ "plugins": [
17
+ {
18
+ "name": "next"
19
+ }
20
+ ],
21
+ "paths": {
22
+ "@/*": ["./*"]
23
+ }
24
+ },
25
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26
+ "exclude": ["node_modules"]
27
+ }