MingruiZhang commited on
Commit
1b0e328
1 Parent(s): 4e8c1f1

feat: theme and logo (#58)

Browse files

<img width="1840" alt="image"
src="https://github.com/landing-ai/vision-agent-ui/assets/5669963/4a43f3f8-70d1-4622-abd3-345117a72597">

app/globals.css CHANGED
@@ -6,43 +6,60 @@
6
  :root {
7
  --background: 0 0% 100%;
8
  --foreground: 240 10% 3.9%;
 
9
  --card: 0 0% 100%;
10
  --card-foreground: 240 10% 3.9%;
 
11
  --popover: 0 0% 100%;
12
  --popover-foreground: 240 10% 3.9%;
 
13
  --primary: 240 5.9% 10%;
14
  --primary-foreground: 0 0% 98%;
 
15
  --secondary: 240 4.8% 95.9%;
16
  --secondary-foreground: 240 5.9% 10%;
 
17
  --muted: 240 4.8% 95.9%;
18
  --muted-foreground: 240 3.8% 46.1%;
 
19
  --accent: 240 4.8% 95.9%;
20
  --accent-foreground: 240 5.9% 10%;
 
21
  --destructive: 0 84.2% 60.2%;
22
  --destructive-foreground: 0 0% 98%;
 
23
  --border: 240 5.9% 90%;
24
  --input: 240 5.9% 90%;
25
- --ring: 240 5.9% 10%;
 
26
  --radius: 0.5rem;
27
  }
28
 
29
  .dark {
30
  --background: 240 10% 3.9%;
31
  --foreground: 0 0% 98%;
 
32
  --card: 240 10% 3.9%;
33
  --card-foreground: 0 0% 98%;
 
34
  --popover: 240 10% 3.9%;
35
  --popover-foreground: 0 0% 98%;
 
36
  --primary: 0 0% 98%;
37
  --primary-foreground: 240 5.9% 10%;
 
38
  --secondary: 240 3.7% 15.9%;
39
  --secondary-foreground: 0 0% 98%;
 
40
  --muted: 240 3.7% 15.9%;
41
  --muted-foreground: 240 5% 64.9%;
 
42
  --accent: 240 3.7% 15.9%;
43
  --accent-foreground: 0 0% 98%;
 
44
  --destructive: 0 62.8% 30.6%;
45
  --destructive-foreground: 0 0% 98%;
 
46
  --border: 240 3.7% 15.9%;
47
  --input: 240 3.7% 15.9%;
48
  --ring: 240 4.9% 83.9%;
@@ -58,58 +75,6 @@
58
  }
59
  }
60
 
61
- @layer components {
62
- .scroll-fade::after {
63
- content: '';
64
- position: absolute;
65
- bottom: 0;
66
- left: 0;
67
- right: 0;
68
- height: 50px;
69
- background: linear-gradient(
70
- to bottom,
71
- rgba(255, 255, 255, 1),
72
- rgba(255, 255, 255, 0)
73
- );
74
- pointer-events: none;
75
- }
76
- .scroll-fade:active::after,
77
- .scroll-fade:hover::after {
78
- background: none;
79
- }
80
- .image-shadow::after {
81
- content: '';
82
- position: absolute;
83
- top: 0;
84
- right: 0;
85
- bottom: 0;
86
- left: 0;
87
- box-shadow:
88
- 0 10px 15px -3px rgba(0, 0, 0, 0.1),
89
- 0 4px 6px -2px rgba(0, 0, 0, 0.05);
90
- border-radius: 0.5rem;
91
- pointer-events: none;
92
- }
93
- }
94
-
95
- /* Light theme. */
96
- :root {
97
- --color-canvas-default: #ffffff;
98
- --color-canvas-subtle: #f6f8fa;
99
- --color-border-default: #d0d7de;
100
- --color-border-muted: hsla(210, 18%, 87%, 1);
101
- }
102
-
103
- /* Dark theme. */
104
- @media (prefers-color-scheme: dark) {
105
- :root {
106
- --color-canvas-default: #0d1117;
107
- --color-canvas-subtle: #161b22;
108
- --color-border-default: #30363d;
109
- --color-border-muted: #21262d;
110
- }
111
- }
112
-
113
  table {
114
  border-spacing: 0;
115
  border-collapse: collapse;
@@ -122,13 +87,13 @@ table {
122
  }
123
 
124
  tr {
125
- border-top: 1px solid var(--color-border-muted);
126
  }
127
 
128
  td,
129
  th {
130
  padding: 6px 13px;
131
- border: 1px solid var(--color-border-default);
132
  }
133
 
134
  th {
 
6
  :root {
7
  --background: 0 0% 100%;
8
  --foreground: 240 10% 3.9%;
9
+
10
  --card: 0 0% 100%;
11
  --card-foreground: 240 10% 3.9%;
12
+
13
  --popover: 0 0% 100%;
14
  --popover-foreground: 240 10% 3.9%;
15
+
16
  --primary: 240 5.9% 10%;
17
  --primary-foreground: 0 0% 98%;
18
+
19
  --secondary: 240 4.8% 95.9%;
20
  --secondary-foreground: 240 5.9% 10%;
21
+
22
  --muted: 240 4.8% 95.9%;
23
  --muted-foreground: 240 3.8% 46.1%;
24
+
25
  --accent: 240 4.8% 95.9%;
26
  --accent-foreground: 240 5.9% 10%;
27
+
28
  --destructive: 0 84.2% 60.2%;
29
  --destructive-foreground: 0 0% 98%;
30
+
31
  --border: 240 5.9% 90%;
32
  --input: 240 5.9% 90%;
33
+ --ring: 240 10% 3.9%;
34
+
35
  --radius: 0.5rem;
36
  }
37
 
38
  .dark {
39
  --background: 240 10% 3.9%;
40
  --foreground: 0 0% 98%;
41
+
42
  --card: 240 10% 3.9%;
43
  --card-foreground: 0 0% 98%;
44
+
45
  --popover: 240 10% 3.9%;
46
  --popover-foreground: 0 0% 98%;
47
+
48
  --primary: 0 0% 98%;
49
  --primary-foreground: 240 5.9% 10%;
50
+
51
  --secondary: 240 3.7% 15.9%;
52
  --secondary-foreground: 0 0% 98%;
53
+
54
  --muted: 240 3.7% 15.9%;
55
  --muted-foreground: 240 5% 64.9%;
56
+
57
  --accent: 240 3.7% 15.9%;
58
  --accent-foreground: 0 0% 98%;
59
+
60
  --destructive: 0 62.8% 30.6%;
61
  --destructive-foreground: 0 0% 98%;
62
+
63
  --border: 240 3.7% 15.9%;
64
  --input: 240 3.7% 15.9%;
65
  --ring: 240 4.9% 83.9%;
 
75
  }
76
  }
77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  table {
79
  border-spacing: 0;
80
  border-collapse: collapse;
 
87
  }
88
 
89
  tr {
90
+ border-top: 1px solid #21262d;
91
  }
92
 
93
  td,
94
  th {
95
  padding: 6px 13px;
96
+ border: 1px solid #21262d;
97
  }
98
 
99
  th {
assets/svg/LandingAI_white.svg ADDED
components.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "$schema": "https://ui.shadcn.com/schema.json",
3
- "style": "default",
4
  "rsc": true,
5
  "tsx": true,
6
  "tailwind": {
 
1
  {
2
  "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
  "rsc": true,
5
  "tsx": true,
6
  "tailwind": {
components/Header.tsx CHANGED
@@ -4,14 +4,11 @@ import Link from 'next/link';
4
  import { auth, sessionUser } from '@/auth';
5
  import { Button } from '@/components/ui/Button';
6
  import { UserMenu } from '@/components/UserMenu';
7
- import {
8
- Tooltip,
9
- TooltipContent,
10
- TooltipTrigger,
11
- } from '@/components/ui/Tooltip';
12
  import { IconPlus, IconSeparator } from '@/components/ui/Icons';
13
  import { LoginMenu } from './LoginMenu';
14
  import { redirect } from 'next/navigation';
 
 
15
 
16
  export async function Header() {
17
  const session = await auth();
@@ -27,7 +24,11 @@ export async function Header() {
27
  );
28
  }
29
  return (
30
- <header className="sticky top-0 z-50 flex items-center justify-end w-full h-16 px-8 border-b shrink-0 bg-gradient-to-b from-background/10 via-background/50 to-background/80 backdrop-blur-xl">
 
 
 
 
31
  {/* <Tooltip>
32
  <TooltipTrigger asChild>
33
  <Button variant="link" asChild className="mr-2">
@@ -52,7 +53,7 @@ export async function Header() {
52
  <Link href="/chat">Chat</Link>
53
  </Button>
54
  <IconSeparator className="size-6 text-muted-foreground/50" />
55
- <div className="flex items-center">
56
  {session?.user ? <UserMenu user={session!.user} /> : <LoginMenu />}
57
  </div>
58
  </header>
 
4
  import { auth, sessionUser } from '@/auth';
5
  import { Button } from '@/components/ui/Button';
6
  import { UserMenu } from '@/components/UserMenu';
 
 
 
 
 
7
  import { IconPlus, IconSeparator } from '@/components/ui/Icons';
8
  import { LoginMenu } from './LoginMenu';
9
  import { redirect } from 'next/navigation';
10
+ import Image from 'next/image';
11
+ import LandingLogo from '@/assets/svg/LandingAI_white.svg';
12
 
13
  export async function Header() {
14
  const session = await auth();
 
24
  );
25
  }
26
  return (
27
+ <header className="sticky top-0 z-50 flex items-center justify-start w-full h-16 px-4 border-b shrink-0 bg-gradient-to-b from-background/10 via-background/50 to-background/80 backdrop-blur-xl">
28
+ <div className="overflow-hidden w-[150px] h-[45px] shrink-0 grow-0 relative">
29
+ <Image src={LandingLogo} alt="Landing AI" fill />
30
+ </div>
31
+ <div className="grow" />
32
  {/* <Tooltip>
33
  <TooltipTrigger asChild>
34
  <Button variant="link" asChild className="mr-2">
 
53
  <Link href="/chat">Chat</Link>
54
  </Button>
55
  <IconSeparator className="size-6 text-muted-foreground/50" />
56
+ <div className="flex items-center grow-0">
57
  {session?.user ? <UserMenu user={session!.user} /> : <LoginMenu />}
58
  </div>
59
  </header>
components/Providers.tsx CHANGED
@@ -4,14 +4,14 @@ import * as React from 'react';
4
  import { ThemeProvider as NextThemesProvider } from 'next-themes';
5
  import { ThemeProviderProps } from 'next-themes/dist/types';
6
  import { TooltipProvider } from '@/components/ui/Tooltip';
7
- import { ThemeToggle } from './ThemeToggle';
8
 
9
  export function Providers({ children, ...props }: ThemeProviderProps) {
10
  return (
11
- <NextThemesProvider {...props}>
12
  <TooltipProvider>
13
  {children}
14
- <ThemeToggle />
15
  </TooltipProvider>
16
  </NextThemesProvider>
17
  );
 
4
  import { ThemeProvider as NextThemesProvider } from 'next-themes';
5
  import { ThemeProviderProps } from 'next-themes/dist/types';
6
  import { TooltipProvider } from '@/components/ui/Tooltip';
7
+ // import { ThemeToggle } from './ThemeToggle';
8
 
9
  export function Providers({ children, ...props }: ThemeProviderProps) {
10
  return (
11
+ <NextThemesProvider {...props} forcedTheme="dark">
12
  <TooltipProvider>
13
  {children}
14
+ {/* <ThemeToggle /> */}
15
  </TooltipProvider>
16
  </NextThemesProvider>
17
  );
components/UserMenu.tsx CHANGED
@@ -45,7 +45,11 @@ export function UserMenu({ user }: UserMenuProps) {
45
  <span className="ml-2">{user?.name}</span>
46
  </Button>
47
  </DropdownMenuTrigger>
48
- <DropdownMenuContent sideOffset={8} align="start" className="w-[180px]">
 
 
 
 
49
  <DropdownMenuItem className="flex-col items-start">
50
  <div className="text-xs font-medium">{user?.name}</div>
51
  <div className="text-xs text-zinc-500">{user?.email}</div>
 
45
  <span className="ml-2">{user?.name}</span>
46
  </Button>
47
  </DropdownMenuTrigger>
48
+ <DropdownMenuContent
49
+ sideOffset={8}
50
+ align="center"
51
+ className="w-[160px]"
52
+ >
53
  <DropdownMenuItem className="flex-col items-start">
54
  <div className="text-xs font-medium">{user?.name}</div>
55
  <div className="text-xs text-zinc-500">{user?.email}</div>
components/ui/Button.tsx CHANGED
@@ -5,26 +5,26 @@ import { cva, type VariantProps } from 'class-variance-authority';
5
  import { cn } from '@/lib/utils';
6
 
7
  const buttonVariants = cva(
8
- 'inline-flex items-center justify-center rounded-md text-sm font-medium shadow 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',
9
  {
10
  variants: {
11
  variant: {
12
  default:
13
- 'bg-primary text-primary-foreground shadow-md hover:bg-primary/90',
14
  destructive:
15
- 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
16
  outline:
17
- 'border border-input hover:bg-accent hover:text-accent-foreground',
18
  secondary:
19
- 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
20
- ghost: 'shadow-none hover:bg-accent hover:text-accent-foreground',
21
- link: 'text-primary underline-offset-4 shadow-none hover:underline',
22
  },
23
  size: {
24
- default: 'h-8 px-4 py-2',
25
- sm: 'h-8 rounded-md px-3',
26
- lg: 'h-11 rounded-md px-8',
27
- icon: 'size-8 p-0',
28
  },
29
  },
30
  defaultVariants: {
 
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: 'size-9',
28
  },
29
  },
30
  defaultVariants: {
components/ui/DropdownMenu.tsx CHANGED
@@ -2,6 +2,11 @@
2
 
3
  import * as React from 'react';
4
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
 
 
 
 
 
5
 
6
  import { cn } from '@/lib/utils';
7
 
@@ -17,6 +22,28 @@ const DropdownMenuSub = DropdownMenuPrimitive.Sub;
17
 
18
  const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  const DropdownMenuSubContent = React.forwardRef<
21
  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
22
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
@@ -24,7 +51,7 @@ const DropdownMenuSubContent = React.forwardRef<
24
  <DropdownMenuPrimitive.SubContent
25
  ref={ref}
26
  className={cn(
27
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',
28
  className,
29
  )}
30
  {...props}
@@ -42,7 +69,8 @@ const DropdownMenuContent = React.forwardRef<
42
  ref={ref}
43
  sideOffset={sideOffset}
44
  className={cn(
45
- 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow animate-in data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
 
46
  className,
47
  )}
48
  {...props}
@@ -69,6 +97,52 @@ const DropdownMenuItem = React.forwardRef<
69
  ));
70
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  const DropdownMenuLabel = React.forwardRef<
73
  React.ElementRef<typeof DropdownMenuPrimitive.Label>,
74
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
@@ -117,6 +191,8 @@ export {
117
  DropdownMenuTrigger,
118
  DropdownMenuContent,
119
  DropdownMenuItem,
 
 
120
  DropdownMenuLabel,
121
  DropdownMenuSeparator,
122
  DropdownMenuShortcut,
@@ -124,5 +200,6 @@ export {
124
  DropdownMenuPortal,
125
  DropdownMenuSub,
126
  DropdownMenuSubContent,
 
127
  DropdownMenuRadioGroup,
128
  };
 
2
 
3
  import * as React from 'react';
4
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
5
+ import {
6
+ CheckIcon,
7
+ ChevronRightIcon,
8
+ DotFilledIcon,
9
+ } from '@radix-ui/react-icons';
10
 
11
  import { cn } from '@/lib/utils';
12
 
 
22
 
23
  const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
24
 
25
+ const DropdownMenuSubTrigger = React.forwardRef<
26
+ React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
27
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
28
+ inset?: boolean;
29
+ }
30
+ >(({ className, inset, children, ...props }, ref) => (
31
+ <DropdownMenuPrimitive.SubTrigger
32
+ ref={ref}
33
+ className={cn(
34
+ 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent',
35
+ inset && 'pl-8',
36
+ className,
37
+ )}
38
+ {...props}
39
+ >
40
+ {children}
41
+ <ChevronRightIcon className="ml-auto h-4 w-4" />
42
+ </DropdownMenuPrimitive.SubTrigger>
43
+ ));
44
+ DropdownMenuSubTrigger.displayName =
45
+ DropdownMenuPrimitive.SubTrigger.displayName;
46
+
47
  const DropdownMenuSubContent = React.forwardRef<
48
  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
49
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
 
51
  <DropdownMenuPrimitive.SubContent
52
  ref={ref}
53
  className={cn(
54
+ 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
55
  className,
56
  )}
57
  {...props}
 
69
  ref={ref}
70
  sideOffset={sideOffset}
71
  className={cn(
72
+ 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',
73
+ 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
74
  className,
75
  )}
76
  {...props}
 
97
  ));
98
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
99
 
100
+ const DropdownMenuCheckboxItem = React.forwardRef<
101
+ React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
102
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
103
+ >(({ className, children, checked, ...props }, ref) => (
104
+ <DropdownMenuPrimitive.CheckboxItem
105
+ ref={ref}
106
+ className={cn(
107
+ 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
108
+ className,
109
+ )}
110
+ checked={checked}
111
+ {...props}
112
+ >
113
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
114
+ <DropdownMenuPrimitive.ItemIndicator>
115
+ <CheckIcon className="h-4 w-4" />
116
+ </DropdownMenuPrimitive.ItemIndicator>
117
+ </span>
118
+ {children}
119
+ </DropdownMenuPrimitive.CheckboxItem>
120
+ ));
121
+ DropdownMenuCheckboxItem.displayName =
122
+ DropdownMenuPrimitive.CheckboxItem.displayName;
123
+
124
+ const DropdownMenuRadioItem = React.forwardRef<
125
+ React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
126
+ React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
127
+ >(({ className, children, ...props }, ref) => (
128
+ <DropdownMenuPrimitive.RadioItem
129
+ ref={ref}
130
+ className={cn(
131
+ 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
132
+ className,
133
+ )}
134
+ {...props}
135
+ >
136
+ <span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
137
+ <DropdownMenuPrimitive.ItemIndicator>
138
+ <DotFilledIcon className="h-4 w-4 fill-current" />
139
+ </DropdownMenuPrimitive.ItemIndicator>
140
+ </span>
141
+ {children}
142
+ </DropdownMenuPrimitive.RadioItem>
143
+ ));
144
+ DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
145
+
146
  const DropdownMenuLabel = React.forwardRef<
147
  React.ElementRef<typeof DropdownMenuPrimitive.Label>,
148
  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
 
191
  DropdownMenuTrigger,
192
  DropdownMenuContent,
193
  DropdownMenuItem,
194
+ DropdownMenuCheckboxItem,
195
+ DropdownMenuRadioItem,
196
  DropdownMenuLabel,
197
  DropdownMenuSeparator,
198
  DropdownMenuShortcut,
 
200
  DropdownMenuPortal,
201
  DropdownMenuSub,
202
  DropdownMenuSubContent,
203
+ DropdownMenuSubTrigger,
204
  DropdownMenuRadioGroup,
205
  };
components/ui/Input.tsx CHANGED
@@ -11,7 +11,7 @@ const Input = React.forwardRef<HTMLInputElement, InputProps>(
11
  <input
12
  type={type}
13
  className={cn(
14
- 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
15
  className,
16
  )}
17
  ref={ref}
 
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}
components/ui/Separator.tsx CHANGED
@@ -19,7 +19,7 @@ const Separator = React.forwardRef<
19
  orientation={orientation}
20
  className={cn(
21
  'shrink-0 bg-border',
22
- orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',
23
  className,
24
  )}
25
  {...props}
 
19
  orientation={orientation}
20
  className={cn(
21
  'shrink-0 bg-border',
22
+ orientation === 'horizontal' ? 'h-px w-full' : 'h-full w-px',
23
  className,
24
  )}
25
  {...props}
components/ui/Switch.tsx CHANGED
@@ -1,26 +1,29 @@
1
  'use client';
2
 
3
  import * as React from 'react';
4
- import * as SwitchPrimitive from '@radix-ui/react-switch';
5
 
6
  import { cn } from '@/lib/utils';
7
 
8
  const Switch = React.forwardRef<
9
- React.ElementRef<typeof SwitchPrimitive.Root>,
10
- React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>
11
  >(({ className, ...props }, ref) => (
12
- <SwitchPrimitive.Root
13
  className={cn(
14
- 'h-[20px] w-[36px] cursor-pointer rounded-full bg-slate-500 data-[state=checked]:bg-sky-600 ',
15
  className,
16
  )}
17
  {...props}
18
  ref={ref}
19
  >
20
- <SwitchPrimitive.Thumb className="w-[18px] h-[18px] block rounded-full bg-white shadow-sm data-[state=checked]:translate-x-[18px] transition-transform" />
21
- </SwitchPrimitive.Root>
 
 
 
 
22
  ));
23
-
24
- Switch.displayName = SwitchPrimitive.Root.displayName;
25
 
26
  export { Switch };
 
1
  'use client';
2
 
3
  import * as React from 'react';
4
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
5
 
6
  import { cn } from '@/lib/utils';
7
 
8
  const Switch = React.forwardRef<
9
+ React.ElementRef<typeof SwitchPrimitives.Root>,
10
+ React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
11
  >(({ className, ...props }, ref) => (
12
+ <SwitchPrimitives.Root
13
  className={cn(
14
+ 'peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input',
15
  className,
16
  )}
17
  {...props}
18
  ref={ref}
19
  >
20
+ <SwitchPrimitives.Thumb
21
+ className={cn(
22
+ 'pointer-events-none block size-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0',
23
+ )}
24
+ />
25
+ </SwitchPrimitives.Root>
26
  ));
27
+ Switch.displayName = SwitchPrimitives.Root.displayName;
 
28
 
29
  export { Switch };
components/ui/Textarea.tsx CHANGED
@@ -10,7 +10,7 @@ const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
10
  return (
11
  <textarea
12
  className={cn(
13
- 'flex min-h-[80px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
14
  className,
15
  )}
16
  ref={ref}
 
10
  return (
11
  <textarea
12
  className={cn(
13
+ 'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',
14
  className,
15
  )}
16
  ref={ref}
components/ui/Tooltip.tsx CHANGED
@@ -19,7 +19,7 @@ const TooltipContent = React.forwardRef<
19
  ref={ref}
20
  sideOffset={sideOffset}
21
  className={cn(
22
- 'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-xs font-medium text-popover-foreground shadow-md animate-in fade-in-50 data-[side=bottom]:slide-in-from-top-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 data-[side=top]:slide-in-from-bottom-1',
23
  className,
24
  )}
25
  {...props}
 
19
  ref={ref}
20
  sideOffset={sideOffset}
21
  className={cn(
22
+ 'z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
23
  className,
24
  )}
25
  {...props}
lib/db/prisma.ts CHANGED
@@ -1,5 +1,11 @@
1
  import { PrismaClient } from '@prisma/client';
2
 
3
- const prisma: PrismaClient = new PrismaClient();
 
 
4
 
5
- export default prisma;
 
 
 
 
 
1
  import { PrismaClient } from '@prisma/client';
2
 
3
+ declare global {
4
+ var prisma: PrismaClient | undefined;
5
+ }
6
 
7
+ const db = globalThis.prisma || new PrismaClient();
8
+
9
+ if (process.env.NODE_ENV != 'production') globalThis.prisma = db;
10
+
11
+ export default db;
lib/utils.ts CHANGED
@@ -1,4 +1,3 @@
1
- import { auth } from '@/auth';
2
  import { clsx, type ClassValue } from 'clsx';
3
  import { customAlphabet } from 'nanoid';
4
  import { twMerge } from 'tailwind-merge';
 
 
1
  import { clsx, type ClassValue } from 'clsx';
2
  import { customAlphabet } from 'nanoid';
3
  import { twMerge } from 'tailwind-merge';
package.json CHANGED
@@ -19,8 +19,7 @@
19
  "@aws-sdk/s3-presigned-post": "^3.556.0",
20
  "@prisma/client": "5.14.0",
21
  "@radix-ui/react-dropdown-menu": "^2.0.6",
22
- "@radix-ui/react-label": "^2.0.2",
23
- "@radix-ui/react-select": "^2.0.0",
24
  "@radix-ui/react-separator": "^1.0.3",
25
  "@radix-ui/react-slot": "^1.0.2",
26
  "@radix-ui/react-switch": "^1.0.3",
 
19
  "@aws-sdk/s3-presigned-post": "^3.556.0",
20
  "@prisma/client": "5.14.0",
21
  "@radix-ui/react-dropdown-menu": "^2.0.6",
22
+ "@radix-ui/react-icons": "^1.3.0",
 
23
  "@radix-ui/react-separator": "^1.0.3",
24
  "@radix-ui/react-slot": "^1.0.2",
25
  "@radix-ui/react-switch": "^1.0.3",
pnpm-lock.yaml CHANGED
@@ -23,12 +23,9 @@ importers:
23
  '@radix-ui/react-dropdown-menu':
24
  specifier: ^2.0.6
25
  version: 2.0.6(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
26
- '@radix-ui/react-label':
27
- specifier: ^2.0.2
28
- version: 2.0.2(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
29
- '@radix-ui/react-select':
30
- specifier: ^2.0.0
31
- version: 2.0.0(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
32
  '@radix-ui/react-separator':
33
  specifier: ^1.0.3
34
  version: 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
@@ -729,9 +726,6 @@ packages:
729
  '@prisma/get-platform@5.14.0':
730
  resolution: {integrity: sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==}
731
 
732
- '@radix-ui/number@1.0.1':
733
- resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
734
-
735
  '@radix-ui/primitive@1.0.1':
736
  resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
737
 
@@ -836,27 +830,19 @@ packages:
836
  '@types/react-dom':
837
  optional: true
838
 
839
- '@radix-ui/react-id@1.0.1':
840
- resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
841
  peerDependencies:
842
- '@types/react': '*'
843
- react: ^16.8 || ^17.0 || ^18.0
844
- peerDependenciesMeta:
845
- '@types/react':
846
- optional: true
847
 
848
- '@radix-ui/react-label@2.0.2':
849
- resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==}
850
  peerDependencies:
851
  '@types/react': '*'
852
- '@types/react-dom': '*'
853
  react: ^16.8 || ^17.0 || ^18.0
854
- react-dom: ^16.8 || ^17.0 || ^18.0
855
  peerDependenciesMeta:
856
  '@types/react':
857
  optional: true
858
- '@types/react-dom':
859
- optional: true
860
 
861
  '@radix-ui/react-menu@2.0.6':
862
  resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
@@ -936,19 +922,6 @@ packages:
936
  '@types/react-dom':
937
  optional: true
938
 
939
- '@radix-ui/react-select@2.0.0':
940
- resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==}
941
- peerDependencies:
942
- '@types/react': '*'
943
- '@types/react-dom': '*'
944
- react: ^16.8 || ^17.0 || ^18.0
945
- react-dom: ^16.8 || ^17.0 || ^18.0
946
- peerDependenciesMeta:
947
- '@types/react':
948
- optional: true
949
- '@types/react-dom':
950
- optional: true
951
-
952
  '@radix-ui/react-separator@1.0.3':
953
  resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==}
954
  peerDependencies:
@@ -4630,10 +4603,6 @@ snapshots:
4630
  dependencies:
4631
  '@prisma/debug': 5.14.0
4632
 
4633
- '@radix-ui/number@1.0.1':
4634
- dependencies:
4635
- '@babel/runtime': 7.24.4
4636
-
4637
  '@radix-ui/primitive@1.0.1':
4638
  dependencies:
4639
  '@babel/runtime': 7.24.4
@@ -4731,23 +4700,17 @@ snapshots:
4731
  '@types/react': 18.2.79
4732
  '@types/react-dom': 18.2.25
4733
 
4734
- '@radix-ui/react-id@1.0.1(@types/react@18.2.79)(react@18.2.0)':
4735
  dependencies:
4736
- '@babel/runtime': 7.24.4
4737
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4738
  react: 18.2.0
4739
- optionalDependencies:
4740
- '@types/react': 18.2.79
4741
 
4742
- '@radix-ui/react-label@2.0.2(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
4743
  dependencies:
4744
  '@babel/runtime': 7.24.4
4745
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4746
  react: 18.2.0
4747
- react-dom: 18.2.0(react@18.2.0)
4748
  optionalDependencies:
4749
  '@types/react': 18.2.79
4750
- '@types/react-dom': 18.2.25
4751
 
4752
  '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
4753
  dependencies:
@@ -4844,36 +4807,6 @@ snapshots:
4844
  '@types/react': 18.2.79
4845
  '@types/react-dom': 18.2.25
4846
 
4847
- '@radix-ui/react-select@2.0.0(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
4848
- dependencies:
4849
- '@babel/runtime': 7.24.4
4850
- '@radix-ui/number': 1.0.1
4851
- '@radix-ui/primitive': 1.0.1
4852
- '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4853
- '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4854
- '@radix-ui/react-context': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4855
- '@radix-ui/react-direction': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4856
- '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4857
- '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4858
- '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4859
- '@radix-ui/react-id': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4860
- '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4861
- '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4862
- '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4863
- '@radix-ui/react-slot': 1.0.2(@types/react@18.2.79)(react@18.2.0)
4864
- '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4865
- '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4866
- '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4867
- '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4868
- '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
4869
- aria-hidden: 1.2.4
4870
- react: 18.2.0
4871
- react-dom: 18.2.0(react@18.2.0)
4872
- react-remove-scroll: 2.5.5(@types/react@18.2.79)(react@18.2.0)
4873
- optionalDependencies:
4874
- '@types/react': 18.2.79
4875
- '@types/react-dom': 18.2.25
4876
-
4877
  '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
4878
  dependencies:
4879
  '@babel/runtime': 7.24.4
 
23
  '@radix-ui/react-dropdown-menu':
24
  specifier: ^2.0.6
25
  version: 2.0.6(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
26
+ '@radix-ui/react-icons':
27
+ specifier: ^1.3.0
28
+ version: 1.3.0(react@18.2.0)
 
 
 
29
  '@radix-ui/react-separator':
30
  specifier: ^1.0.3
31
  version: 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
 
726
  '@prisma/get-platform@5.14.0':
727
  resolution: {integrity: sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==}
728
 
 
 
 
729
  '@radix-ui/primitive@1.0.1':
730
  resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
731
 
 
830
  '@types/react-dom':
831
  optional: true
832
 
833
+ '@radix-ui/react-icons@1.3.0':
834
+ resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==}
835
  peerDependencies:
836
+ react: ^16.x || ^17.x || ^18.x
 
 
 
 
837
 
838
+ '@radix-ui/react-id@1.0.1':
839
+ resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==}
840
  peerDependencies:
841
  '@types/react': '*'
 
842
  react: ^16.8 || ^17.0 || ^18.0
 
843
  peerDependenciesMeta:
844
  '@types/react':
845
  optional: true
 
 
846
 
847
  '@radix-ui/react-menu@2.0.6':
848
  resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
 
922
  '@types/react-dom':
923
  optional: true
924
 
 
 
 
 
 
 
 
 
 
 
 
 
 
925
  '@radix-ui/react-separator@1.0.3':
926
  resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==}
927
  peerDependencies:
 
4603
  dependencies:
4604
  '@prisma/debug': 5.14.0
4605
 
 
 
 
 
4606
  '@radix-ui/primitive@1.0.1':
4607
  dependencies:
4608
  '@babel/runtime': 7.24.4
 
4700
  '@types/react': 18.2.79
4701
  '@types/react-dom': 18.2.25
4702
 
4703
+ '@radix-ui/react-icons@1.3.0(react@18.2.0)':
4704
  dependencies:
 
 
4705
  react: 18.2.0
 
 
4706
 
4707
+ '@radix-ui/react-id@1.0.1(@types/react@18.2.79)(react@18.2.0)':
4708
  dependencies:
4709
  '@babel/runtime': 7.24.4
4710
+ '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.79)(react@18.2.0)
4711
  react: 18.2.0
 
4712
  optionalDependencies:
4713
  '@types/react': 18.2.79
 
4714
 
4715
  '@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
4716
  dependencies:
 
4807
  '@types/react': 18.2.79
4808
  '@types/react-dom': 18.2.25
4809
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4810
  '@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
4811
  dependencies:
4812
  '@babel/runtime': 7.24.4
public/landing.png CHANGED
public/landing2.png ADDED
public/landing3.png ADDED
public/next.svg DELETED
public/thirteen.svg DELETED
public/vercel.svg DELETED
tailwind.config.js DELETED
@@ -1,95 +0,0 @@
1
- /** @type {import('tailwindcss').Config} */
2
- module.exports = {
3
- darkMode: ['class'],
4
- content: ['app/**/*.{ts,tsx}', 'components/**/*.{ts,tsx}'],
5
- theme: {
6
- container: {
7
- center: true,
8
- padding: '2rem',
9
- screens: {
10
- '2xl': '1400px',
11
- },
12
- },
13
- extend: {
14
- fontFamily: {
15
- sans: ['var(--font-geist-sans)'],
16
- mono: ['var(--font-geist-mono)'],
17
- },
18
- colors: {
19
- border: 'hsl(var(--border))',
20
- input: 'hsl(var(--input))',
21
- ring: 'hsl(var(--ring))',
22
- background: 'hsl(var(--background))',
23
- foreground: 'hsl(var(--foreground))',
24
- primary: {
25
- DEFAULT: 'hsl(var(--primary))',
26
- foreground: 'hsl(var(--primary-foreground))',
27
- },
28
- secondary: {
29
- DEFAULT: 'hsl(var(--secondary))',
30
- foreground: 'hsl(var(--secondary-foreground))',
31
- },
32
- destructive: {
33
- DEFAULT: 'hsl(var(--destructive))',
34
- foreground: 'hsl(var(--destructive-foreground))',
35
- },
36
- muted: {
37
- DEFAULT: 'hsl(var(--muted))',
38
- foreground: 'hsl(var(--muted-foreground))',
39
- },
40
- accent: {
41
- DEFAULT: 'hsl(var(--accent))',
42
- foreground: 'hsl(var(--accent-foreground))',
43
- },
44
- popover: {
45
- DEFAULT: 'hsl(var(--popover))',
46
- foreground: 'hsl(var(--popover-foreground))',
47
- },
48
- card: {
49
- DEFAULT: 'hsl(var(--card))',
50
- foreground: 'hsl(var(--card-foreground))',
51
- },
52
- },
53
- borderRadius: {
54
- lg: `var(--radius)`,
55
- md: `calc(var(--radius) - 2px)`,
56
- sm: 'calc(var(--radius) - 4px)',
57
- },
58
- keyframes: {
59
- 'accordion-down': {
60
- from: { height: 0 },
61
- to: { height: 'var(--radix-accordion-content-height)' },
62
- },
63
- 'accordion-up': {
64
- from: { height: 'var(--radix-accordion-content-height)' },
65
- to: { height: 0 },
66
- },
67
- 'slide-from-left': {
68
- '0%': {
69
- transform: 'translateX(-100%)',
70
- },
71
- '100%': {
72
- transform: 'translateX(0)',
73
- },
74
- },
75
- 'slide-to-left': {
76
- '0%': {
77
- transform: 'translateX(0)',
78
- },
79
- '100%': {
80
- transform: 'translateX(-100%)',
81
- },
82
- },
83
- },
84
- animation: {
85
- 'slide-from-left':
86
- 'slide-from-left 0.3s cubic-bezier(0.82, 0.085, 0.395, 0.895)',
87
- 'slide-to-left':
88
- 'slide-to-left 0.25s cubic-bezier(0.82, 0.085, 0.395, 0.895)',
89
- 'accordion-down': 'accordion-down 0.2s ease-out',
90
- 'accordion-up': 'accordion-up 0.2s ease-out',
91
- },
92
- },
93
- },
94
- plugins: [require('tailwindcss-animate'), require('@tailwindcss/typography')],
95
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tailwind.config.ts ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import type { Config } from "tailwindcss"
2
+
3
+ const config = {
4
+ darkMode: ["class"],
5
+ content: [
6
+ './pages/**/*.{ts,tsx}',
7
+ './components/**/*.{ts,tsx}',
8
+ './app/**/*.{ts,tsx}',
9
+ './src/**/*.{ts,tsx}',
10
+ ],
11
+ prefix: "",
12
+ theme: {
13
+ container: {
14
+ center: true,
15
+ padding: "2rem",
16
+ screens: {
17
+ "2xl": "1400px",
18
+ },
19
+ },
20
+ extend: {
21
+ colors: {
22
+ border: "hsl(var(--border))",
23
+ input: "hsl(var(--input))",
24
+ ring: "hsl(var(--ring))",
25
+ background: "hsl(var(--background))",
26
+ foreground: "hsl(var(--foreground))",
27
+ primary: {
28
+ DEFAULT: "hsl(var(--primary))",
29
+ foreground: "hsl(var(--primary-foreground))",
30
+ },
31
+ secondary: {
32
+ DEFAULT: "hsl(var(--secondary))",
33
+ foreground: "hsl(var(--secondary-foreground))",
34
+ },
35
+ destructive: {
36
+ DEFAULT: "hsl(var(--destructive))",
37
+ foreground: "hsl(var(--destructive-foreground))",
38
+ },
39
+ muted: {
40
+ DEFAULT: "hsl(var(--muted))",
41
+ foreground: "hsl(var(--muted-foreground))",
42
+ },
43
+ accent: {
44
+ DEFAULT: "hsl(var(--accent))",
45
+ foreground: "hsl(var(--accent-foreground))",
46
+ },
47
+ popover: {
48
+ DEFAULT: "hsl(var(--popover))",
49
+ foreground: "hsl(var(--popover-foreground))",
50
+ },
51
+ card: {
52
+ DEFAULT: "hsl(var(--card))",
53
+ foreground: "hsl(var(--card-foreground))",
54
+ },
55
+ },
56
+ borderRadius: {
57
+ lg: "var(--radius)",
58
+ md: "calc(var(--radius) - 2px)",
59
+ sm: "calc(var(--radius) - 4px)",
60
+ },
61
+ keyframes: {
62
+ "accordion-down": {
63
+ from: { height: "0" },
64
+ to: { height: "var(--radix-accordion-content-height)" },
65
+ },
66
+ "accordion-up": {
67
+ from: { height: "var(--radix-accordion-content-height)" },
68
+ to: { height: "0" },
69
+ },
70
+ },
71
+ animation: {
72
+ "accordion-down": "accordion-down 0.2s ease-out",
73
+ "accordion-up": "accordion-up 0.2s ease-out",
74
+ },
75
+ },
76
+ },
77
+ plugins: [require("tailwindcss-animate")],
78
+ } satisfies Config
79
+
80
+ export default config