From 13f5999b4a7cab973a5a760b7cf541eef8a57620 Mon Sep 17 00:00:00 2001 From: andthezhang Date: Sun, 17 Mar 2024 13:21:37 -0700 Subject: [PATCH] init --- .env | 1 + bun.lockb | Bin 0 -> 218096 bytes components.json | 16 ++ drizzle.config.ts | 11 ++ kirimase.config.json | 17 ++ package.json | 39 +++- src/app/(app)/dashboard/page.tsx | 10 + src/app/(app)/layout.tsx | 18 ++ src/app/(app)/settings/page.tsx | 106 +++++++++++ src/app/globals.css | 91 ++++++--- src/app/layout.tsx | 5 +- src/app/loading.tsx | 25 +++ src/app/page.tsx | 282 +++++++++++++++++----------- src/components/Navbar.tsx | 45 +++++ src/components/Sidebar.tsx | 16 ++ src/components/SidebarItems.tsx | 91 +++++++++ src/components/ThemeProvider.tsx | 9 + src/components/ui/ThemeToggle.tsx | 40 ++++ src/components/ui/avatar.tsx | 50 +++++ src/components/ui/button.tsx | 56 ++++++ src/components/ui/dropdown-menu.tsx | 200 ++++++++++++++++++++ src/components/ui/input.tsx | 25 +++ src/components/ui/label.tsx | 26 +++ src/components/ui/sonner.tsx | 31 +++ src/config/nav.ts | 14 ++ src/lib/db/index.ts | 6 + src/lib/db/migrate.ts | 36 ++++ src/lib/env.mjs | 24 +++ src/lib/utils.ts | 9 + tailwind.config.ts | 84 +++++++-- tsconfig.json | 27 ++- 31 files changed, 1253 insertions(+), 157 deletions(-) create mode 100644 .env create mode 100755 bun.lockb create mode 100644 components.json create mode 100644 drizzle.config.ts create mode 100644 kirimase.config.json create mode 100644 src/app/(app)/dashboard/page.tsx create mode 100644 src/app/(app)/layout.tsx create mode 100644 src/app/(app)/settings/page.tsx create mode 100644 src/app/loading.tsx create mode 100644 src/components/Navbar.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/components/SidebarItems.tsx create mode 100644 src/components/ThemeProvider.tsx create mode 100644 src/components/ui/ThemeToggle.tsx create mode 100644 src/components/ui/avatar.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/config/nav.ts create mode 100644 src/lib/db/index.ts create mode 100644 src/lib/db/migrate.ts create mode 100644 src/lib/env.mjs create mode 100644 src/lib/utils.ts diff --git a/.env b/.env new file mode 100644 index 0000000..498ab17 --- /dev/null +++ b/.env @@ -0,0 +1 @@ +DATABASE_URL=postgres://postgres:postgres@localhost:5432/{DB_NAME} \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..773bb37d2eb35a090e7e12f8697bcf1e0915d8a8 GIT binary patch literal 218096 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 lH!ZY6Q@Hp<$QSSiM0ANwo13$NjQJHa +

Home

+

+ Wow, that was easy. Now it's your turn. Building something cool! +

+ + ); +} \ No newline at end of file diff --git a/src/app/(app)/layout.tsx b/src/app/(app)/layout.tsx new file mode 100644 index 0000000..485fd9e --- /dev/null +++ b/src/app/(app)/layout.tsx @@ -0,0 +1,18 @@ +import { Toaster } from "@/components/ui/sonner"; +import Navbar from "@/components/Navbar"; +import Sidebar from "@/components/Sidebar"; +export default async function AppLayout({ + children, +}: { + children: React.ReactNode; +}) { + return (
+ +
+ +{children} +
+
+ +
) +} \ No newline at end of file diff --git a/src/app/(app)/settings/page.tsx b/src/app/(app)/settings/page.tsx new file mode 100644 index 0000000..a801d9e --- /dev/null +++ b/src/app/(app)/settings/page.tsx @@ -0,0 +1,106 @@ +"use client"; + +import { Button } from "@/components/ui/button"; +import { useTheme } from "next-themes"; + +export default function Page() { + const { setTheme } = useTheme(); + return ( +
+

Settings

+
+
+

Appearance

+

+ Customize the appearance of the app. Automatically switch between + day and night themes. +

+
+ + + +
+
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index 875c01e..77d3522 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,33 +1,76 @@ @tailwind base; @tailwind components; @tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; } } - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} - -@layer utilities { - .text-balance { - text-wrap: balance; + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; } } diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3314e47..03f7b34 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import { Inter } from "next/font/google"; import "./globals.css"; +import { ThemeProvider } from "@/components/ThemeProvider"; const inter = Inter({ subsets: ["latin"] }); @@ -16,7 +17,9 @@ export default function RootLayout({ }>) { return ( - {children} + +{children} + ); } diff --git a/src/app/loading.tsx b/src/app/loading.tsx new file mode 100644 index 0000000..568eb6e --- /dev/null +++ b/src/app/loading.tsx @@ -0,0 +1,25 @@ +export default function Loading() { + return ( +
+
+ + Loading... +
+
+ ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index b81507d..0a69b41 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,113 +1,183 @@ -import Image from "next/image"; +/** + * v0 by Vercel. + * @see https://v0.dev/t/PmwTvNfrVgf + * Documentation: https://v0.dev/docs#integrating-generated-code-into-your-nextjs-app + */ +import Link from "next/link"; -export default function Home() { +export default function LandingPage() { return ( -
- - -
- Next.js Logo -
- -
- -

- Docs{" "} - - -> - -

-

- Find in-depth information about Next.js features and API. -

-
- - -

- Learn{" "} - - -> - -

-

- Learn about Next.js in an interactive course with quizzes! -

-
+ Features + + + Sign In + + + +
+
+
+
+
+
+
+

+ The complete platform
+ for building the Web +

+

+ Give your team the toolkit to stop configuring and start + innovating. Securely build, deploy, and scale the best web + experiences. +

+
+
+ + Get Started + + + Contact Sales + +
+
+
+
+
+
+
+
+
+
+ Key Features +
+

+ Faster iteration. More innovation. +

+

+ The platform for rapid progress. Let your team focus on + shipping features instead of managing infrastructure with + automated CI/CD. +

+
+
+
+
+
+
    +
  • +
    +

    Collaboration

    +

    + Make collaboration seamless with built-in code review + tools. +

    +
    +
  • +
  • +
    +

    Automation

    +

    + Automate your workflow with continuous integration. +

    +
    +
  • +
  • +
    +

    Scale

    +

    + Deploy to the cloud with a single click and scale with + ease. +

    +
    +
  • +
+
+
+
+
- -

- Templates{" "} - - -> - -

-

- Explore starter templates for Next.js. -

-
+
+
+
+
+

+ Sign Up for Updates +

+

+ Stay updated with the latest product news and updates. +

+
+
+
+ + +
+
+
+
+
+
+
+

+ © 2024 Acme Inc. All rights reserved. +

+ +
+
+ ); +} - -

- Deploy{" "} - - -> - -

-

- Instantly deploy your Next.js site to a shareable URL with Vercel. -

-
- -
+function MountainIcon(props: any) { + return ( + + + ); } diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..26b5257 --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,45 @@ +"use client"; + +import Link from "next/link"; +import { useState } from "react"; +import { usePathname } from "next/navigation"; + +import { Button } from "@/components/ui/button"; + +import { AlignRight } from "lucide-react"; +import { defaultLinks } from "@/config/nav"; + +export default function Navbar() { + const [open, setOpen] = useState(false); + const pathname = usePathname(); + return ( +
+ + {open ? ( +
+
    + {defaultLinks.map((link) => ( +
  • setOpen(false)} className=""> + + {link.title} + +
  • + ))} +
+
+ ) : null} +
+ ); +} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..df3925a --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,16 @@ +import SidebarItems from "./SidebarItems"; + +const Sidebar = () => { + return ( + + ); +}; + +export default Sidebar; diff --git a/src/components/SidebarItems.tsx b/src/components/SidebarItems.tsx new file mode 100644 index 0000000..7dea48b --- /dev/null +++ b/src/components/SidebarItems.tsx @@ -0,0 +1,91 @@ +"use client"; + +import Link from "next/link"; +import { usePathname } from "next/navigation"; + +import { LucideIcon } from "lucide-react"; + +import { cn } from "@/lib/utils"; +import { defaultLinks, additionalLinks } from "@/config/nav"; + +export interface SidebarLink { + title: string; + href: string; + icon: LucideIcon; +} + +const SidebarItems = () => { + return ( + <> + + {additionalLinks.length > 0 + ? additionalLinks.map((l) => ( + + )) + : null} + + ); +}; +export default SidebarItems; + +const SidebarLinkGroup = ({ + links, + title, + border, +}: { + links: SidebarLink[]; + title?: string; + border?: boolean; +}) => { + const fullPathname = usePathname(); + const pathname = "/" + fullPathname.split("/")[1]; + + return ( +
+ {title ? ( +

+ {title} +

+ ) : null} +
    + {links.map((link) => ( +
  • + +
  • + ))} +
+
+ ); +}; +const SidebarLink = ({ + link, + active, +}: { + link: SidebarLink; + active: boolean; +}) => { + return ( + +
+
+ + {link.title} +
+ + ); +}; diff --git a/src/components/ThemeProvider.tsx b/src/components/ThemeProvider.tsx new file mode 100644 index 0000000..b0ff266 --- /dev/null +++ b/src/components/ThemeProvider.tsx @@ -0,0 +1,9 @@ +"use client"; + +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children}; +} diff --git a/src/components/ui/ThemeToggle.tsx b/src/components/ui/ThemeToggle.tsx new file mode 100644 index 0000000..63ff415 --- /dev/null +++ b/src/components/ui/ThemeToggle.tsx @@ -0,0 +1,40 @@ +"use client"; + +import * as React from "react"; +import { MoonIcon, SunIcon } from "lucide-react"; +import { useTheme } from "next-themes"; + +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export function ModeToggle() { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); +} diff --git a/src/components/ui/avatar.tsx b/src/components/ui/avatar.tsx new file mode 100644 index 0000000..51e507b --- /dev/null +++ b/src/components/ui/avatar.tsx @@ -0,0 +1,50 @@ +"use client" + +import * as React from "react" +import * as AvatarPrimitive from "@radix-ui/react-avatar" + +import { cn } from "@/lib/utils" + +const Avatar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Avatar.displayName = AvatarPrimitive.Root.displayName + +const AvatarImage = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarImage.displayName = AvatarPrimitive.Image.displayName + +const AvatarFallback = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName + +export { Avatar, AvatarImage, AvatarFallback } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..0ba4277 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..f69a0d6 --- /dev/null +++ b/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,200 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx new file mode 100644 index 0000000..677d05f --- /dev/null +++ b/src/components/ui/input.tsx @@ -0,0 +1,25 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +export interface InputProps + extends React.InputHTMLAttributes {} + +const Input = React.forwardRef( + ({ className, type, ...props }, ref) => { + return ( + + ) + } +) +Input.displayName = "Input" + +export { Input } diff --git a/src/components/ui/label.tsx b/src/components/ui/label.tsx new file mode 100644 index 0000000..5341821 --- /dev/null +++ b/src/components/ui/label.tsx @@ -0,0 +1,26 @@ +"use client" + +import * as React from "react" +import * as LabelPrimitive from "@radix-ui/react-label" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const labelVariants = cva( + "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70" +) + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & + VariantProps +>(({ className, ...props }, ref) => ( + +)) +Label.displayName = LabelPrimitive.Root.displayName + +export { Label } diff --git a/src/components/ui/sonner.tsx b/src/components/ui/sonner.tsx new file mode 100644 index 0000000..452f4d9 --- /dev/null +++ b/src/components/ui/sonner.tsx @@ -0,0 +1,31 @@ +"use client" + +import { useTheme } from "next-themes" +import { Toaster as Sonner } from "sonner" + +type ToasterProps = React.ComponentProps + +const Toaster = ({ ...props }: ToasterProps) => { + const { theme = "system" } = useTheme() + + return ( + + ) +} + +export { Toaster } diff --git a/src/config/nav.ts b/src/config/nav.ts new file mode 100644 index 0000000..380f9a7 --- /dev/null +++ b/src/config/nav.ts @@ -0,0 +1,14 @@ +import { SidebarLink } from "@/components/SidebarItems"; +import { Cog, Globe, HomeIcon } from "lucide-react"; + +type AdditionalLinks = { + title: string; + links: SidebarLink[]; +}; + +export const defaultLinks: SidebarLink[] = [ + { href: "/dashboard", title: "Home", icon: HomeIcon }, + { href: "/settings", title: "Settings", icon: Cog }, +]; + +export const additionalLinks: AdditionalLinks[] = []; diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts new file mode 100644 index 0000000..d0c05ff --- /dev/null +++ b/src/lib/db/index.ts @@ -0,0 +1,6 @@ +import { drizzle } from "drizzle-orm/postgres-js"; +import postgres from "postgres"; +import { env } from "@/lib/env.mjs"; + +export const client = postgres(env.DATABASE_URL); +export const db = drizzle(client); \ No newline at end of file diff --git a/src/lib/db/migrate.ts b/src/lib/db/migrate.ts new file mode 100644 index 0000000..03b3bb6 --- /dev/null +++ b/src/lib/db/migrate.ts @@ -0,0 +1,36 @@ +import { env } from "@/lib/env.mjs"; + +import { drizzle } from "drizzle-orm/postgres-js"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import postgres from "postgres"; + + +const runMigrate = async () => { + if (!env.DATABASE_URL) { + throw new Error("DATABASE_URL is not defined"); + } + + +const connection = postgres(env.DATABASE_URL, { max: 1 }); + +const db = drizzle(connection); + + + console.log("⏳ Running migrations..."); + + const start = Date.now(); + + await migrate(db, { migrationsFolder: 'src/lib/db/migrations' }); + + const end = Date.now(); + + console.log("✅ Migrations completed in", end - start, "ms"); + + process.exit(0); +}; + +runMigrate().catch((err) => { + console.error("❌ Migration failed"); + console.error(err); + process.exit(1); +}); \ No newline at end of file diff --git a/src/lib/env.mjs b/src/lib/env.mjs new file mode 100644 index 0000000..6a0a110 --- /dev/null +++ b/src/lib/env.mjs @@ -0,0 +1,24 @@ +import { createEnv } from "@t3-oss/env-nextjs"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + NODE_ENV: z + .enum(["development", "test", "production"]) + .default("development"), + DATABASE_URL: z.string().min(1), + + }, + client: { + // NEXT_PUBLIC_PUBLISHABLE_KEY: z.string().min(1), + }, + // If you're using Next.js < 13.4.4, you'll need to specify the runtimeEnv manually + // runtimeEnv: { + // DATABASE_URL: process.env.DATABASE_URL, + // NEXT_PUBLIC_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_PUBLISHABLE_KEY, + // }, + // For Next.js >= 13.4.4, you only need to destructure client variables: + experimental__runtimeEnv: { + // NEXT_PUBLIC_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_PUBLISHABLE_KEY, + }, +}); diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..199deca --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,9 @@ +import { customAlphabet } from "nanoid"; +import { clsx, type ClassValue } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} + +export const nanoid = customAlphabet("abcdefghijklmnopqrstuvwxyz0123456789"); diff --git a/tailwind.config.ts b/tailwind.config.ts index e9a0944..061375e 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -1,20 +1,76 @@ -import type { Config } from "tailwindcss"; +const { fontFamily } = require("tailwindcss/defaultTheme") -const config: Config = { - content: [ - "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", - "./src/components/**/*.{js,ts,jsx,tsx,mdx}", - "./src/app/**/*.{js,ts,jsx,tsx,mdx}", - ], +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + content: ["src/app/**/*.{ts,tsx}", "src/components/**/*.{ts,tsx}"], theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, extend: { - backgroundImage: { - "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", - "gradient-conic": - "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: `var(--radius)`, + md: `calc(var(--radius) - 2px)`, + sm: "calc(var(--radius) - 4px)", + }, + fontFamily: { + sans: ["var(--font-sans)", ...fontFamily.sans], + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", }, }, }, - plugins: [], -}; -export default config; + plugins: [require("tailwindcss-animate")], +} diff --git a/tsconfig.json b/tsconfig.json index 7b28589..c5a7b07 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -18,9 +22,20 @@ } ], "paths": { - "@/*": ["./src/*"] - } + "@/*": [ + "./src/*" + ] + }, + "target": "esnext", + "baseUrl": "./" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file