Spaces:
Sleeping
Sleeping
MingruiZhang
commited on
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 +20 -55
- assets/svg/LandingAI_white.svg +71 -0
- components.json +1 -1
- components/Header.tsx +8 -7
- components/Providers.tsx +3 -3
- components/UserMenu.tsx +5 -1
- components/ui/Button.tsx +11 -11
- components/ui/DropdownMenu.tsx +79 -2
- components/ui/Input.tsx +1 -1
- components/ui/Separator.tsx +1 -1
- components/ui/Switch.tsx +12 -9
- components/ui/Textarea.tsx +1 -1
- components/ui/Tooltip.tsx +1 -1
- lib/db/prisma.ts +8 -2
- lib/utils.ts +0 -1
- package.json +1 -2
- pnpm-lock.yaml +11 -78
- public/landing.png +0 -0
- public/landing2.png +0 -0
- public/landing3.png +0 -0
- public/next.svg +0 -1
- public/thirteen.svg +0 -1
- public/vercel.svg +0 -1
- tailwind.config.js +0 -95
- tailwind.config.ts +80 -0
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
|
|
|
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
|
126 |
}
|
127 |
|
128 |
td,
|
129 |
th {
|
130 |
padding: 6px 13px;
|
131 |
-
border: 1px solid
|
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": "
|
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-
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
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
|
9 |
{
|
10 |
variants: {
|
11 |
variant: {
|
12 |
default:
|
13 |
-
'bg-primary text-primary-foreground shadow
|
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: '
|
21 |
-
link: 'text-primary underline-offset-4
|
22 |
},
|
23 |
size: {
|
24 |
-
default: 'h-
|
25 |
-
sm: 'h-8 rounded-md px-3',
|
26 |
-
lg: 'h-
|
27 |
-
icon: 'size-
|
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-
|
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
|
|
|
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-
|
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-
|
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
|
5 |
|
6 |
import { cn } from '@/lib/utils';
|
7 |
|
8 |
const Switch = React.forwardRef<
|
9 |
-
React.ElementRef<typeof
|
10 |
-
React.ComponentPropsWithoutRef<typeof
|
11 |
>(({ className, ...props }, ref) => (
|
12 |
-
<
|
13 |
className={cn(
|
14 |
-
'h-
|
15 |
className,
|
16 |
)}
|
17 |
{...props}
|
18 |
ref={ref}
|
19 |
>
|
20 |
-
<
|
21 |
-
|
|
|
|
|
|
|
|
|
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-[
|
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
|
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 |
-
|
|
|
|
|
4 |
|
5 |
-
|
|
|
|
|
|
|
|
|
|
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-
|
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/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
26 |
-
'@radix-ui/react-
|
27 |
-
specifier: ^
|
28 |
-
version:
|
29 |
-
'@radix-ui/react-select':
|
30 |
-
specifier: ^2.0.0
|
31 |
-
version: 2.0.0(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
32 |
'@radix-ui/react-separator':
|
33 |
specifier: ^1.0.3
|
34 |
version: 1.0.3(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
@@ -729,9 +726,6 @@ packages:
|
|
729 |
'@prisma/[email protected]':
|
730 |
resolution: {integrity: sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==}
|
731 |
|
732 |
-
'@radix-ui/[email protected]':
|
733 |
-
resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==}
|
734 |
-
|
735 |
'@radix-ui/[email protected]':
|
736 |
resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==}
|
737 |
|
@@ -836,27 +830,19 @@ packages:
|
|
836 |
'@types/react-dom':
|
837 |
optional: true
|
838 |
|
839 |
-
'@radix-ui/react-
|
840 |
-
resolution: {integrity: sha512-
|
841 |
peerDependencies:
|
842 |
-
|
843 |
-
react: ^16.8 || ^17.0 || ^18.0
|
844 |
-
peerDependenciesMeta:
|
845 |
-
'@types/react':
|
846 |
-
optional: true
|
847 |
|
848 |
-
'@radix-ui/react-
|
849 |
-
resolution: {integrity: sha512-
|
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/[email protected]':
|
862 |
resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
|
@@ -936,19 +922,6 @@ packages:
|
|
936 |
'@types/react-dom':
|
937 |
optional: true
|
938 |
|
939 |
-
'@radix-ui/[email protected]':
|
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/[email protected]':
|
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/[email protected]':
|
4634 |
-
dependencies:
|
4635 |
-
'@babel/runtime': 7.24.4
|
4636 |
-
|
4637 |
'@radix-ui/[email protected]':
|
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-
|
4735 |
dependencies:
|
4736 |
-
'@babel/runtime': 7.24.4
|
4737 |
-
'@radix-ui/react-use-layout-effect': 1.0.1(@types/[email protected])([email protected])
|
4738 |
react: 18.2.0
|
4739 |
-
optionalDependencies:
|
4740 |
-
'@types/react': 18.2.79
|
4741 |
|
4742 |
-
'@radix-ui/react-
|
4743 |
dependencies:
|
4744 |
'@babel/runtime': 7.24.4
|
4745 |
-
'@radix-ui/react-
|
4746 |
react: 18.2.0
|
4747 |
-
react-dom: 18.2.0([email protected])
|
4748 |
optionalDependencies:
|
4749 |
'@types/react': 18.2.79
|
4750 |
-
'@types/react-dom': 18.2.25
|
4751 |
|
4752 |
'@radix-ui/[email protected](@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])':
|
4753 |
dependencies:
|
@@ -4844,36 +4807,6 @@ snapshots:
|
|
4844 |
'@types/react': 18.2.79
|
4845 |
'@types/react-dom': 18.2.25
|
4846 |
|
4847 |
-
'@radix-ui/[email protected](@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])':
|
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/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4853 |
-
'@radix-ui/react-compose-refs': 1.0.1(@types/[email protected])([email protected])
|
4854 |
-
'@radix-ui/react-context': 1.0.1(@types/[email protected])([email protected])
|
4855 |
-
'@radix-ui/react-direction': 1.0.1(@types/[email protected])([email protected])
|
4856 |
-
'@radix-ui/react-dismissable-layer': 1.0.5(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4857 |
-
'@radix-ui/react-focus-guards': 1.0.1(@types/[email protected])([email protected])
|
4858 |
-
'@radix-ui/react-focus-scope': 1.0.4(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4859 |
-
'@radix-ui/react-id': 1.0.1(@types/[email protected])([email protected])
|
4860 |
-
'@radix-ui/react-popper': 1.1.3(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4861 |
-
'@radix-ui/react-portal': 1.0.4(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4862 |
-
'@radix-ui/react-primitive': 1.0.3(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4863 |
-
'@radix-ui/react-slot': 1.0.2(@types/[email protected])([email protected])
|
4864 |
-
'@radix-ui/react-use-callback-ref': 1.0.1(@types/[email protected])([email protected])
|
4865 |
-
'@radix-ui/react-use-controllable-state': 1.0.1(@types/[email protected])([email protected])
|
4866 |
-
'@radix-ui/react-use-layout-effect': 1.0.1(@types/[email protected])([email protected])
|
4867 |
-
'@radix-ui/react-use-previous': 1.0.1(@types/[email protected])([email protected])
|
4868 |
-
'@radix-ui/react-visually-hidden': 1.0.3(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
4869 |
-
aria-hidden: 1.2.4
|
4870 |
-
react: 18.2.0
|
4871 |
-
react-dom: 18.2.0([email protected])
|
4872 |
-
react-remove-scroll: 2.5.5(@types/[email protected])([email protected])
|
4873 |
-
optionalDependencies:
|
4874 |
-
'@types/react': 18.2.79
|
4875 |
-
'@types/react-dom': 18.2.25
|
4876 |
-
|
4877 |
'@radix-ui/[email protected](@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])':
|
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/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
26 |
+
'@radix-ui/react-icons':
|
27 |
+
specifier: ^1.3.0
|
28 |
+
version: 1.3.0([email protected])
|
|
|
|
|
|
|
29 |
'@radix-ui/react-separator':
|
30 |
specifier: ^1.0.3
|
31 |
version: 1.0.3(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
|
|
726 |
'@prisma/[email protected]':
|
727 |
resolution: {integrity: sha512-/yAyBvcEjRv41ynZrhdrPtHgk47xLRRq/o5eWGcUpBJ1YrUZTYB8EoPiopnP7iQrMATK8stXQdPOoVlrzuTQZw==}
|
728 |
|
|
|
|
|
|
|
729 |
'@radix-ui/[email protected]':
|
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/[email protected]':
|
848 |
resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==}
|
|
|
922 |
'@types/react-dom':
|
923 |
optional: true
|
924 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
925 |
'@radix-ui/[email protected]':
|
926 |
resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==}
|
927 |
peerDependencies:
|
|
|
4603 |
dependencies:
|
4604 |
'@prisma/debug': 5.14.0
|
4605 |
|
|
|
|
|
|
|
|
|
4606 |
'@radix-ui/[email protected]':
|
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([email protected])':
|
4704 |
dependencies:
|
|
|
|
|
4705 |
react: 18.2.0
|
|
|
|
|
4706 |
|
4707 |
+
'@radix-ui/react-id@1.0.1(@types/[email protected])([email protected])':
|
4708 |
dependencies:
|
4709 |
'@babel/runtime': 7.24.4
|
4710 |
+
'@radix-ui/react-use-layout-effect': 1.0.1(@types/[email protected])([email protected])
|
4711 |
react: 18.2.0
|
|
|
4712 |
optionalDependencies:
|
4713 |
'@types/react': 18.2.79
|
|
|
4714 |
|
4715 |
'@radix-ui/[email protected](@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])':
|
4716 |
dependencies:
|
|
|
4807 |
'@types/react': 18.2.79
|
4808 |
'@types/react-dom': 18.2.25
|
4809 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4810 |
'@radix-ui/[email protected](@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])':
|
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
|