Spaces:
Sleeping
Sleeping
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/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-
|
| 27 |
-
specifier: ^
|
| 28 |
-
version:
|
| 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-
|
| 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/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-
|
| 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-
|
| 4743 |
dependencies:
|
| 4744 |
'@babel/runtime': 7.24.4
|
| 4745 |
-
'@radix-ui/react-
|
| 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
|