├── .eslintrc.json ├── .gitignore ├── .nvmrc ├── README.md ├── app ├── favicon.ico ├── globals.css ├── layout.tsx └── page.tsx ├── components.json ├── components └── ui │ ├── button.tsx │ └── card.tsx ├── generated-icon.png ├── lib └── utils.ts ├── next.config.mjs ├── package-lock.json ├── package.json ├── postcss.config.mjs ├── public ├── images │ ├── idevibelogo.png │ ├── logoogo.png │ ├── photo-1.jpg │ ├── photo-2.jpg │ └── photo-3.jpg └── manifest.json ├── tailwind.config.ts ├── tsconfig.json ├── util └── cn.ts └── vercel.json /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env*.local 29 | 30 | # vercel 31 | .vercel 32 | 33 | # typescript 34 | *.tsbuildinfo 35 | next-env.d.ts 36 | 37 | # development environment 38 | .cache/ 39 | .config/ 40 | .upm/ 41 | .replit 42 | replit.nix 43 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 18.x -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/app/favicon.ico -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer utilities { 6 | .text-balance { 7 | text-wrap: balance; 8 | } 9 | 10 | .bg-dotted-grid { 11 | background-image: radial-gradient(rgba(255, 255, 255, 0.1) 1px, transparent 1px); 12 | background-size: 24px 24px; 13 | } 14 | } 15 | 16 | @layer base { 17 | :root { 18 | --background: 0 0% 100%; 19 | --foreground: 0 0% 3.9%; 20 | --card: 0 0% 100%; 21 | --card-foreground: 0 0% 3.9%; 22 | --popover: 0 0% 100%; 23 | --popover-foreground: 0 0% 3.9%; 24 | --primary: 0 0% 9%; 25 | --primary-foreground: 0 0% 98%; 26 | --secondary: 0 0% 96.1%; 27 | --secondary-foreground: 0 0% 9%; 28 | --muted: 0 0% 96.1%; 29 | --muted-foreground: 0 0% 45.1%; 30 | --accent: 0 0% 96.1%; 31 | --accent-foreground: 0 0% 9%; 32 | --destructive: 0 84.2% 60.2%; 33 | --destructive-foreground: 0 0% 98%; 34 | --border: 0 0% 89.8%; 35 | --input: 0 0% 89.8%; 36 | --ring: 0 0% 3.9%; 37 | --chart-1: 12 76% 61%; 38 | --chart-2: 173 58% 39%; 39 | --chart-3: 197 37% 24%; 40 | --chart-4: 43 74% 66%; 41 | --chart-5: 27 87% 67%; 42 | --radius: 0.5rem; 43 | } 44 | .dark { 45 | --background: 0 0% 3.9%; 46 | --foreground: 0 0% 98%; 47 | --card: 0 0% 3.9%; 48 | --card-foreground: 0 0% 98%; 49 | --popover: 0 0% 3.9%; 50 | --popover-foreground: 0 0% 98%; 51 | --primary: 0 0% 98%; 52 | --primary-foreground: 0 0% 9%; 53 | --secondary: 0 0% 14.9%; 54 | --secondary-foreground: 0 0% 98%; 55 | --muted: 0 0% 14.9%; 56 | --muted-foreground: 0 0% 63.9%; 57 | --accent: 0 0% 14.9%; 58 | --accent-foreground: 0 0% 98%; 59 | --destructive: 0 62.8% 30.6%; 60 | --destructive-foreground: 0 0% 98%; 61 | --border: 0 0% 14.9%; 62 | --input: 0 0% 14.9%; 63 | --ring: 0 0% 83.1%; 64 | --chart-1: 220 70% 50%; 65 | --chart-2: 160 60% 45%; 66 | --chart-3: 30 80% 55%; 67 | --chart-4: 280 65% 60%; 68 | --chart-5: 340 75% 55%; 69 | } 70 | } 71 | 72 | @layer base { 73 | * { 74 | @apply border-border; 75 | } 76 | body { 77 | @apply bg-background text-foreground; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter, Playfair_Display } from "next/font/google"; 3 | import "./globals.css"; 4 | 5 | const playfair = Playfair_Display({ 6 | subsets: ['latin'], 7 | display: 'swap', 8 | weight: ['400', '500'], 9 | style: ['normal'], 10 | }) 11 | 12 | const inter = Inter({ 13 | subsets: ['latin'], 14 | display: 'swap', 15 | }) 16 | 17 | export const metadata: Metadata = { 18 | title: "vibedev.ai", 19 | description: "Experience the new way of coding with vibedev.ai. Transform your development workflow and vibe with your code like never before.", 20 | icons: { 21 | icon: [ 22 | { 23 | url: "/images/idevibelogo.png", 24 | type: "image/png", 25 | sizes: "32x32" 26 | }, 27 | { 28 | url: "/images/idevibelogo.png", 29 | type: "image/png", 30 | sizes: "16x16" 31 | } 32 | ], 33 | apple: [ 34 | { 35 | url: "/images/idevibelogo.png", 36 | type: "image/png", 37 | sizes: "180x180" 38 | } 39 | ], 40 | shortcut: [{ url: "/images/idevibelogo.png" }], 41 | other: [ 42 | { 43 | rel: "icon", 44 | url: "/images/idevibelogo.png", 45 | }, 46 | ], 47 | }, 48 | manifest: "/manifest.json", 49 | viewport: { 50 | width: 'device-width', 51 | initialScale: 1 52 | } 53 | }; 54 | 55 | export default function RootLayout({ 56 | children, 57 | }: { 58 | children: React.ReactNode 59 | }) { 60 | return ( 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | {children} 69 | 70 | ); 71 | } 72 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Button } from "@/components/ui/button" 4 | import Link from "next/link" 5 | import { useEffect, useRef } from "react" 6 | import { Playfair_Display, Inter } from 'next/font/google' 7 | 8 | const playfair = Playfair_Display({ 9 | subsets: ['latin'], 10 | display: 'swap', 11 | weight: ['400', '500'], 12 | style: ['normal'], 13 | }) 14 | 15 | const inter = Inter({ 16 | subsets: ['latin'], 17 | display: 'swap', 18 | }) 19 | 20 | export default function Page() { 21 | const observerRef = useRef(null); 22 | 23 | useEffect(() => { 24 | observerRef.current = new IntersectionObserver((entries) => { 25 | entries.forEach(entry => { 26 | if (entry.isIntersecting) { 27 | entry.target.classList.add('animate-in'); 28 | } 29 | }); 30 | }, { 31 | threshold: 0.1, 32 | rootMargin: '50px' 33 | }); 34 | 35 | document.querySelectorAll('.scroll-animation').forEach((element) => { 36 | observerRef.current?.observe(element); 37 | }); 38 | 39 | return () => observerRef.current?.disconnect(); 40 | }, []); 41 | 42 | useEffect(() => { 43 | const loadTally = () => { 44 | const existingScript = document.querySelector('script[src="https://tally.so/widgets/embed.js"]'); 45 | if (!existingScript) { 46 | const script = document.createElement('script'); 47 | script.src = "https://tally.so/widgets/embed.js"; 48 | script.async = true; 49 | script.onload = () => { 50 | // @ts-ignore 51 | if (window.Tally) { 52 | // @ts-ignore 53 | window.Tally.loadEmbeds(); 54 | } 55 | }; 56 | document.body.appendChild(script); 57 | } 58 | }; 59 | 60 | loadTally(); 61 | }, []); 62 | 63 | return ( 64 |
65 | 166 | 167 | {/* Navigation */} 168 |
169 | 170 | VibeDev.ai 171 | 172 | 185 |
186 | 187 |
188 | {/* Hero Section */} 189 |
190 |
191 |
192 | {/* Logo Placeholder */} 193 |
194 | VibeDev Logo 199 |
200 |
201 | A Software Composer app 202 |
203 |

204 | The Easiest Way To
Vibe Code With Cursor 205 |

206 |

207 | VibeDev is your IDE for Vibe Coding 208 |

209 |
210 | 222 |
223 |
224 |
225 | 226 | {/* Demo Section */} 227 |
228 |
229 |
230 |
231 |
232 | {/* Input Section */} 233 |
234 |
235 | 236 |
237 | 242 | 248 |
249 |
250 | 251 |
252 |

Start from

253 |
254 | {[...Array(2)].map((_, i) => ( 255 | 266 | ))} 267 |
268 |
269 |
270 | 271 | {/* Cursor Composer Section - Hidden on mobile */} 272 |
273 |
274 |

Cursor Composer

275 |
276 |
277 | {/* First Message */} 278 |
279 |
280 |

281 | Sure, I can make those changes for you. 282 |

283 |
284 |
285 | 286 | {/* Status Updates */} 287 |
288 |
289 |

File generated

290 |
291 |
292 |

File generated

293 |
294 |
295 |

File generated

296 |
297 |
298 |

File generated

299 |
300 |
301 | 302 | {/* Completion Message */} 303 |
304 |
305 |

306 | I've successfully created your app 307 |

308 |
309 |
310 |
311 |
312 |
313 | 318 | 324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 | 333 | {/* Features Section */} 334 |
335 |
336 |
337 |

Create in Minutes, Not Months

338 |

Transform your ideas into reality with three simple prompts.

339 |
340 | 341 |
342 |
343 |
344 | 345 | 346 | 347 | 348 | 349 |
350 |

Download Template

351 |

352 | Get started with our production-ready template. It's packed with everything you need to build a stunning landing page. 353 |

354 |
355 | 356 |
357 |
358 | 359 | 360 | 361 |
362 |

Tell VibeDev What You Want

363 |

364 | Describe your vision in plain English. VibeDev will control Cursor to transform your words into a beautiful, functional design. 365 |

366 |
367 | 368 |
369 |
370 | 371 | 372 | 373 |
374 |

Deploy to Vercel

375 |

376 | Deploy your landing page to Vercel with one click. Share your creation with the world instantly on a global edge network. 377 |

378 |
379 |
380 |
381 |
382 | 383 | {/* Early Access Form Section */} 384 |
385 |
386 |
387 |

Get Early Access

388 |

Be the first to experience the future of coding.

389 |
390 |
391 | 399 |
400 |
401 |
402 |
403 | 404 | 442 |
443 | ) 444 | } -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 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 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | } 20 | } -------------------------------------------------------------------------------- /components/ui/button.tsx: -------------------------------------------------------------------------------- 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, 39 | VariantProps { 40 | asChild?: boolean 41 | } 42 | 43 | const Button = React.forwardRef( 44 | ({ className, variant, size, asChild = false, ...props }, ref) => { 45 | const Comp = asChild ? Slot : "button" 46 | return ( 47 | 52 | ) 53 | } 54 | ) 55 | Button.displayName = "Button" 56 | 57 | export { Button, buttonVariants } 58 | -------------------------------------------------------------------------------- /components/ui/card.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Card = React.forwardRef< 6 | HTMLDivElement, 7 | React.HTMLAttributes 8 | >(({ className, ...props }, ref) => ( 9 |
17 | )) 18 | Card.displayName = "Card" 19 | 20 | const CardHeader = React.forwardRef< 21 | HTMLDivElement, 22 | React.HTMLAttributes 23 | >(({ className, ...props }, ref) => ( 24 |
29 | )) 30 | CardHeader.displayName = "CardHeader" 31 | 32 | const CardTitle = React.forwardRef< 33 | HTMLParagraphElement, 34 | React.HTMLAttributes 35 | >(({ className, ...props }, ref) => ( 36 |

41 | )) 42 | CardTitle.displayName = "CardTitle" 43 | 44 | const CardDescription = React.forwardRef< 45 | HTMLParagraphElement, 46 | React.HTMLAttributes 47 | >(({ className, ...props }, ref) => ( 48 |

53 | )) 54 | CardDescription.displayName = "CardDescription" 55 | 56 | const CardContent = React.forwardRef< 57 | HTMLDivElement, 58 | React.HTMLAttributes 59 | >(({ className, ...props }, ref) => ( 60 |

61 | )) 62 | CardContent.displayName = "CardContent" 63 | 64 | const CardFooter = React.forwardRef< 65 | HTMLDivElement, 66 | React.HTMLAttributes 67 | >(({ className, ...props }, ref) => ( 68 |
73 | )) 74 | CardFooter.displayName = "CardFooter" 75 | 76 | export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } 77 | -------------------------------------------------------------------------------- /generated-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/generated-icon.png -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --port 3000 --hostname 0.0.0.0", 7 | "build": "next build", 8 | "start": "next start --port 3000 --hostname 0.0.0.0", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-icons": "^1.3.0", 13 | "@radix-ui/react-slot": "^1.1.0", 14 | "@replit/object-storage": "^1.0.0", 15 | "class-variance-authority": "^0.7.0", 16 | "clsx": "^2.1.1", 17 | "lucide-react": "^0.446.0", 18 | "next": "14.2.4", 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0", 21 | "tailwind-merge": "^2.5.2", 22 | "tailwindcss": "^3.4.1", 23 | "tailwindcss-animate": "^1.0.7" 24 | }, 25 | "devDependencies": { 26 | "@types/node": "^20.11.6", 27 | "@types/react": "^18.2.48", 28 | "@types/react-dom": "^18.2.18", 29 | "eslint": "^8.56.0", 30 | "eslint-config-next": "14.2.4", 31 | "postcss": "^8", 32 | "typescript": "^5.3.3" 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /public/images/idevibelogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/public/images/idevibelogo.png -------------------------------------------------------------------------------- /public/images/logoogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/public/images/logoogo.png -------------------------------------------------------------------------------- /public/images/photo-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/public/images/photo-1.jpg -------------------------------------------------------------------------------- /public/images/photo-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/public/images/photo-2.jpg -------------------------------------------------------------------------------- /public/images/photo-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbrown101010/landingpage/ad13bda17a243ebefda415cd1ce72d563d3fb225/public/images/photo-3.jpg -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "VibeDev", 3 | "short_name": "VibeDev", 4 | "icons": [ 5 | { 6 | "src": "/images/idevibelogo.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/images/idevibelogo.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#000000", 17 | "background_color": "#000000", 18 | "start_url": "/", 19 | "display": "standalone", 20 | "orientation": "portrait" 21 | } -------------------------------------------------------------------------------- /tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | darkMode: ["class"], 5 | content: [ 6 | "./pages/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./components/**/*.{js,ts,jsx,tsx,mdx}", 8 | "./app/**/*.{js,ts,jsx,tsx,mdx}", 9 | ], 10 | theme: { 11 | extend: { 12 | backgroundImage: { 13 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', 14 | 'gradient-conic': 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', 15 | 'dotted-grid': 'radial-gradient(circle at 1px 1px, rgb(255 255 255 / 0.15) 2px, transparent 0)', 16 | }, 17 | backgroundSize: { 18 | 'dotted-grid': '32px 32px', 19 | }, 20 | keyframes: { 21 | appear: { 22 | '0%': { 23 | opacity: '0' 24 | }, 25 | '100%': { 26 | opacity: '100%' 27 | } 28 | } 29 | }, 30 | animation: { 31 | appear: 'appear 300ms ease-out forwards' 32 | }, 33 | borderRadius: { 34 | lg: 'var(--radius)', 35 | md: 'calc(var(--radius) - 2px)', 36 | sm: 'calc(var(--radius) - 4px)' 37 | }, 38 | colors: { 39 | background: 'hsl(var(--background))', 40 | foreground: 'hsl(var(--foreground))', 41 | card: { 42 | DEFAULT: 'hsl(var(--card))', 43 | foreground: 'hsl(var(--card-foreground))' 44 | }, 45 | popover: { 46 | DEFAULT: 'hsl(var(--popover))', 47 | foreground: 'hsl(var(--popover-foreground))' 48 | }, 49 | primary: { 50 | DEFAULT: 'hsl(var(--primary))', 51 | foreground: 'hsl(var(--primary-foreground))' 52 | }, 53 | secondary: { 54 | DEFAULT: 'hsl(var(--secondary))', 55 | foreground: 'hsl(var(--secondary-foreground))' 56 | }, 57 | muted: { 58 | DEFAULT: 'hsl(var(--muted))', 59 | foreground: 'hsl(var(--muted-foreground))' 60 | }, 61 | accent: { 62 | DEFAULT: 'hsl(var(--accent))', 63 | foreground: 'hsl(var(--accent-foreground))' 64 | }, 65 | destructive: { 66 | DEFAULT: 'hsl(var(--destructive))', 67 | foreground: 'hsl(var(--destructive-foreground))' 68 | }, 69 | border: 'hsl(var(--border))', 70 | input: 'hsl(var(--input))', 71 | ring: 'hsl(var(--ring))', 72 | chart: { 73 | '1': 'hsl(var(--chart-1))', 74 | '2': 'hsl(var(--chart-2))', 75 | '3': 'hsl(var(--chart-3))', 76 | '4': 'hsl(var(--chart-4))', 77 | '5': 'hsl(var(--chart-5))' 78 | } 79 | } 80 | } 81 | }, 82 | plugins: [require("tailwindcss-animate")], 83 | }; 84 | export default config; 85 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /util/cn.ts: -------------------------------------------------------------------------------- 1 | import { ClassValue, clsx } from 'clsx' 2 | import { twMerge } from 'tailwind-merge' 3 | 4 | export const cn = (...inputs: ClassValue[]) => { 5 | return twMerge(clsx(inputs)) 6 | } -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "framework": "nextjs", 4 | "builds": [ 5 | { 6 | "src": "package.json", 7 | "use": "@vercel/next@canary" 8 | } 9 | ], 10 | "build": { 11 | "env": { 12 | "NODE_VERSION": "18.x" 13 | } 14 | }, 15 | "git": { 16 | "deploymentEnabled": { 17 | "main": true 18 | } 19 | } 20 | } --------------------------------------------------------------------------------