├── .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 |

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 |
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 |
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 |
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 |
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 | }
--------------------------------------------------------------------------------