├── app ├── favicon.ico ├── api │ ├── auth │ │ └── [...nextauth] │ │ │ └── route.ts │ └── protected │ │ └── route.ts ├── client-example │ └── page.tsx ├── middleware-example │ └── page.tsx ├── server-example │ └── page.tsx ├── layout.tsx ├── api-example │ └── page.tsx ├── policy │ └── page.tsx ├── globals.css └── page.tsx ├── public └── logo.png ├── postcss.config.js ├── .env.example ├── lib └── utils.ts ├── next.config.js ├── .gitignore ├── middleware.ts ├── components.json ├── components ├── header.tsx ├── auth-components.tsx ├── footer.tsx ├── ui │ ├── input.tsx │ ├── avatar.tsx │ ├── button.tsx │ ├── navigation-menu.tsx │ └── dropdown-menu.tsx ├── custom-link.tsx ├── session-data.tsx ├── user-button.tsx ├── client-example.tsx └── main-nav.tsx ├── tsconfig.json ├── prisma ├── schema.prisma └── migrations │ └── 20240208153010_authjs_init │ └── migration.sql ├── auth.ts ├── package.json ├── tailwind.config.js ├── README.md └── pnpm-lock.yaml /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndom91/authjs-prisma-edge-example/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndom91/authjs-prisma-edge-example/HEAD/public/logo.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /app/api/auth/[...nextauth]/route.ts: -------------------------------------------------------------------------------- 1 | import { handlers } from "auth" 2 | export const { GET, POST } = handlers 3 | 4 | export const runtime = "edge" 5 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # `openssl rand -hex 33` or `pnpm dlx auth secret` 2 | AUTH_SECRET= 3 | 4 | # Prisma 5 | AUTH_POSTGRES_PRISMA_URL="" 6 | 7 | AUTH_GITHUB_ID= 8 | AUTH_GITHUB_SECRET= 9 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | webpack(config) { 4 | config.experiments = { 5 | asyncWebAssembly: true, 6 | layers: true, 7 | } 8 | 9 | return config 10 | }, 11 | } 12 | module.exports = nextConfig 13 | -------------------------------------------------------------------------------- /app/api/protected/route.ts: -------------------------------------------------------------------------------- 1 | import { auth } from "auth" 2 | 3 | export const GET = auth((req: any) => { 4 | if (req.auth) { 5 | return Response.json({ data: "Protected data" }) 6 | } 7 | 8 | return Response.json({ message: "Not authenticated" }, { status: 401 }) 9 | }) as any 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | node_modules/ 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .yarn-integrity 11 | .npm 12 | 13 | .eslintcache 14 | 15 | *.tsbuildinfo 16 | next-env.d.ts 17 | 18 | .next 19 | .vercel 20 | .env*.local 21 | .env 22 | -------------------------------------------------------------------------------- /middleware.ts: -------------------------------------------------------------------------------- 1 | export { auth as middleware } from "auth" 2 | 3 | // Read more: https://nextjs.org/docs/app/building-your-application/routing/middleware#matcher 4 | export const config = { 5 | matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"], 6 | } 7 | 8 | export const runtime = "experimental-edge" 9 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "app/globals.css", 9 | "baseColor": "slate", 10 | "cssVariables": true 11 | }, 12 | "aliases": { 13 | "components": "@/components", 14 | "utils": "@/lib/utils" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /components/header.tsx: -------------------------------------------------------------------------------- 1 | import { MainNav } from "./main-nav" 2 | import UserButton from "./user-button" 3 | 4 | export default function Header() { 5 | return ( 6 |
7 |
8 | 9 | 10 |
11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /app/client-example/page.tsx: -------------------------------------------------------------------------------- 1 | import { auth } from "auth" 2 | import ClientExample from "@/components/client-example" 3 | import { SessionProvider } from "next-auth/react" 4 | 5 | export default async function ClientPage() { 6 | const session = await auth() 7 | if (session?.user) { 8 | // filter out sensitive data before passing to client. 9 | session.user = { 10 | name: session.user.name, 11 | email: session.user.email, 12 | image: session.user.image, 13 | } 14 | } 15 | 16 | return ( 17 | 18 | 19 | 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /app/middleware-example/page.tsx: -------------------------------------------------------------------------------- 1 | import CustomLink from "@/components/custom-link" 2 | 3 | export default function Page() { 4 | return ( 5 |
6 |

Middleware usage

7 |

8 | This page is protected by using the universal{" "} 9 | 10 | auth() 11 | {" "} 12 | method in{" "} 13 | 14 | Next.js Middleware 15 | 16 | . 17 |

18 |
19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "noEmit": true, 10 | "esModuleInterop": true, 11 | "module": "esnext", 12 | "moduleResolution": "node", 13 | "resolveJsonModule": true, 14 | "isolatedModules": true, 15 | "jsx": "preserve", 16 | "incremental": true, 17 | "plugins": [ 18 | { 19 | "name": "next" 20 | } 21 | ], 22 | "paths": { 23 | "@/*": ["./*"], 24 | "auth": ["./auth"] 25 | } 26 | }, 27 | "include": [ 28 | "process.d.ts", 29 | "next-env.d.ts", 30 | "**/*.ts", 31 | "**/*.tsx", 32 | ".next/types/**/*.ts" 33 | ], 34 | "exclude": ["node_modules"] 35 | } 36 | -------------------------------------------------------------------------------- /components/auth-components.tsx: -------------------------------------------------------------------------------- 1 | import { signIn, signOut } from "auth" 2 | import { Button } from "./ui/button" 3 | 4 | export function SignIn({ 5 | provider, 6 | ...props 7 | }: { provider?: string } & React.ComponentPropsWithRef) { 8 | return ( 9 |
{ 11 | "use server" 12 | await signIn(provider) 13 | }} 14 | > 15 | 16 |
17 | ) 18 | } 19 | 20 | export function SignOut(props: React.ComponentPropsWithRef) { 21 | return ( 22 |
{ 24 | "use server" 25 | await signOut() 26 | }} 27 | className="w-full" 28 | > 29 | 32 |
33 | ) 34 | } 35 | -------------------------------------------------------------------------------- /app/server-example/page.tsx: -------------------------------------------------------------------------------- 1 | import CustomLink from "@/components/custom-link" 2 | import SessionData from "@/components/session-data" 3 | import { auth } from "auth" 4 | 5 | export default async function Page() { 6 | const session = await auth() 7 | return ( 8 |
9 |

React Server Component Usage

10 |

11 | This page is server-rendered as a{" "} 12 | 13 | React Server Component 14 | 15 | . It gets the session data on the server using{" "} 16 | 17 | auth() 18 | {" "} 19 | method. 20 |

21 | 22 |
23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /components/footer.tsx: -------------------------------------------------------------------------------- 1 | import CustomLink from "./custom-link" 2 | import packageJSON from "../package.json" 3 | 4 | export default function Footer() { 5 | return ( 6 |
7 | Documentation 8 | NPM 9 | 10 | Source on GitHub 11 | 12 | Policy 13 | 14 |

15 | Auth.js:{" "} 16 | next-auth@{packageJSON.dependencies["next-auth"]} 17 |

18 |
19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export interface InputProps extends React.InputHTMLAttributes {} 6 | 7 | const Input = React.forwardRef( 8 | ({ className, type, ...props }, ref) => { 9 | return ( 10 | 19 | ) 20 | }, 21 | ) 22 | Input.displayName = "Input" 23 | 24 | export { Input } 25 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import "./globals.css" 2 | import type { Metadata } from "next" 3 | import { Inter } from "next/font/google" 4 | import Footer from "@/components/footer" 5 | import Header from "@/components/header" 6 | 7 | const inter = Inter({ subsets: ["latin"] }) 8 | 9 | export const metadata: Metadata = { 10 | title: "NextAuth.js Example", 11 | description: "This is an example site to demonstrate how to use NextAuth.js for authentication", 12 | } 13 | 14 | export default function RootLayout({ children }: React.PropsWithChildren) { 15 | return ( 16 | 17 | 18 |
19 |
20 |
21 | {children} 22 |
23 |
24 |
25 | 26 | 27 | ) 28 | } 29 | -------------------------------------------------------------------------------- /components/custom-link.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | import { ExternalLink } from "lucide-react" 3 | import Link from "next/link" 4 | 5 | interface CustomLinkProps extends React.LinkHTMLAttributes { 6 | href: string 7 | } 8 | 9 | const CustomLink = ({ href, children, className, ...rest }: CustomLinkProps) => { 10 | const isInternalLink = href.startsWith("/") 11 | const isAnchorLink = href.startsWith("#") 12 | 13 | if (isInternalLink || isAnchorLink) { 14 | return ( 15 | 16 | {children} 17 | 18 | ) 19 | } 20 | 21 | return ( 22 | 29 | {children} 30 | 31 | 32 | ) 33 | } 34 | 35 | export default CustomLink 36 | -------------------------------------------------------------------------------- /components/session-data.tsx: -------------------------------------------------------------------------------- 1 | import type { Session } from "next-auth" 2 | 3 | export default function SessionData({ session }: { session: Session | null }) { 4 | if (session?.user) { 5 | return ( 6 |
7 |

Current Session Data

8 | {Object.keys(session.user).length > 3 ? ( 9 |

10 | In this example, the whole session object is passed to the page, including the raw user 11 | object. Our recommendation is to only pass the necessary fields to the page, as 12 | the raw user object may contain sensitive information. 13 |

14 | ) : ( 15 |

16 | In this example, only some fields in the user object is passed to the page to avoid 17 | exposing sensitive information. 18 |

19 | )} 20 |
{JSON.stringify(session, null, 2)}
21 |
22 | ) 23 | } 24 | 25 | return ( 26 |

27 | No session data, please Sign In first. 28 |

29 | ) 30 | } 31 | -------------------------------------------------------------------------------- /app/api-example/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import CustomLink from "@/components/custom-link" 3 | import { useEffect, useState } from "react" 4 | 5 | export default function Page() { 6 | const [data, setData] = useState() 7 | useEffect(() => { 8 | ;(async () => { 9 | const res = await fetch("/api/protected") 10 | const json = await res.json() 11 | setData(json) 12 | })() 13 | }, []) 14 | return ( 15 |
16 |

Route Handler Usage

17 |

18 | This page fetches data from an API{" "} 19 | 20 | Route Handler 21 | 22 | . The API is protected using the universal{" "} 23 | 24 | auth() 25 | {" "} 26 | method. 27 |

28 |

Data from API Route:

29 |
30 |         {JSON.stringify(data, null, 2)}
31 |       
32 |
33 | ) 34 | } 35 | -------------------------------------------------------------------------------- /app/policy/page.tsx: -------------------------------------------------------------------------------- 1 | export default function PolicyPage() { 2 | return ( 3 |
4 |
5 |

Terms of Service

6 |

7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 8 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 9 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE 10 | FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 11 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 12 | DEALINGS IN THE SOFTWARE. 13 |

14 |
15 |
16 |

Privacy Policy

17 |

This site uses JSON Web Tokens and an in-memory database which resets every ~2 hours.

18 |

19 | Data provided to this site is exclusively used to support signing in and is not passed to 20 | any third party services, other than via SMTP or OAuth for the purposes of authentication. 21 |

22 |
23 |
24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | datasource db { 2 | provider = "postgres" 3 | url = env("AUTH_POSTGRES_PRISMA_URL") 4 | directUrl = env("AUTH_POSTGRES_URL_NON_POOLING") 5 | } 6 | 7 | generator client { 8 | provider = "prisma-client-js" 9 | previewFeatures = ["driverAdapters"] 10 | } 11 | 12 | model User { 13 | id String @id @default(cuid()) 14 | name String? 15 | email String @unique 16 | emailVerified DateTime? 17 | image String? 18 | accounts Account[] 19 | sessions Session[] 20 | } 21 | 22 | model Account { 23 | userId String 24 | type String 25 | provider String 26 | providerAccountId String 27 | refresh_token String? 28 | access_token String? 29 | expires_at Int? 30 | token_type String? 31 | scope String? 32 | id_token String? 33 | session_state String? 34 | 35 | user User @relation(fields: [userId], references: [id], onDelete: Cascade) 36 | 37 | @@id([provider, providerAccountId]) 38 | } 39 | 40 | model Session { 41 | sessionToken String @unique 42 | userId String 43 | expires DateTime 44 | user User @relation(fields: [userId], references: [id], onDelete: Cascade) 45 | } 46 | 47 | model VerificationToken { 48 | identifier String 49 | token String @unique 50 | expires DateTime 51 | 52 | @@id([identifier, token]) 53 | } 54 | -------------------------------------------------------------------------------- /components/user-button.tsx: -------------------------------------------------------------------------------- 1 | import { Avatar, AvatarFallback, AvatarImage } from "./ui/avatar" 2 | import { Button } from "./ui/button" 3 | import { auth } from "auth" 4 | import { 5 | DropdownMenu, 6 | DropdownMenuContent, 7 | DropdownMenuItem, 8 | DropdownMenuLabel, 9 | DropdownMenuTrigger, 10 | } from "./ui/dropdown-menu" 11 | import { SignIn, SignOut } from "./auth-components" 12 | 13 | export default async function UserButton() { 14 | const session = await auth() 15 | if (!session?.user) return 16 | return ( 17 | 18 | 19 | 27 | 28 | 29 | 30 |
31 |

{session.user.name}

32 |

{session.user.email}

33 |
34 |
35 | 36 | 37 | 38 |
39 |
40 | ) 41 | } 42 | -------------------------------------------------------------------------------- /auth.ts: -------------------------------------------------------------------------------- 1 | import NextAuth from "next-auth" 2 | import GitHub from "next-auth/providers/github" 3 | import Credentials from "next-auth/providers/credentials" 4 | import { PrismaClient } from "@prisma/client" 5 | import { PrismaAdapter } from "@auth/prisma-adapter" 6 | import { PrismaNeon } from "@prisma/adapter-neon" 7 | import { Pool } from "@neondatabase/serverless" 8 | 9 | const neon = new Pool({ 10 | connectionString: process.env.AUTH_POSTGRES_PRISMA_URL, 11 | }) 12 | const adapter = new PrismaNeon(neon) 13 | const prisma = new PrismaClient({ adapter }) 14 | 15 | export const { 16 | handlers, 17 | auth, 18 | signIn, 19 | signOut, 20 | unstable_update: update, 21 | } = NextAuth({ 22 | adapter: PrismaAdapter(prisma), 23 | providers: [ 24 | GitHub, 25 | Credentials({ 26 | credentials: { password: { label: "Password", type: "password" } }, 27 | async authorize(credentials) { 28 | if (credentials.password !== "password") return null 29 | return { 30 | id: "1", 31 | name: "Fill Murray", 32 | email: "bill@fillmurray.com", 33 | image: "https://source.boringavatars.com/marble/120", 34 | } 35 | }, 36 | }), 37 | ], 38 | callbacks: { 39 | // authorized({ request, auth }) { 40 | // const { pathname } = request.nextUrl 41 | // if (pathname === "/middleware-example") return !!auth 42 | // return true 43 | // }, 44 | jwt({ token, trigger, session }) { 45 | if (trigger === "update") token.name = session?.user?.name 46 | return token 47 | }, 48 | }, 49 | }) 50 | -------------------------------------------------------------------------------- /components/ui/avatar.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AvatarPrimitive from "@radix-ui/react-avatar" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Avatar = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, ...props }, ref) => ( 12 | 17 | )) 18 | Avatar.displayName = AvatarPrimitive.Root.displayName 19 | 20 | const AvatarImage = React.forwardRef< 21 | React.ElementRef, 22 | React.ComponentPropsWithoutRef 23 | >(({ className, ...props }, ref) => ( 24 | 29 | )) 30 | AvatarImage.displayName = AvatarPrimitive.Image.displayName 31 | 32 | const AvatarFallback = React.forwardRef< 33 | React.ElementRef, 34 | React.ComponentPropsWithoutRef 35 | >(({ className, ...props }, ref) => ( 36 | 44 | )) 45 | AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName 46 | 47 | export { Avatar, AvatarImage, AvatarFallback } 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "authjs-prisma-edge-example", 3 | "version": "0.1.0", 4 | "description": "An example project for Auth.js Prisma Edge Client", 5 | "repository": "https://github.com/ndom91/authjs-prisma-edge-example.git", 6 | "author": "ndom91 ", 7 | "license": "MIT", 8 | "scripts": { 9 | "dev": "next", 10 | "build": "next build", 11 | "start": "next start", 12 | "db:generate": "pnpm exec prisma generate", 13 | "db:migrate": "pnpm exec prisma migrate dev", 14 | "db:studio": "pnpm exec prisma studio", 15 | "postinstall": "pnpm db:generate" 16 | }, 17 | "dependencies": { 18 | "@auth/prisma-adapter": "^1.5.2", 19 | "@neondatabase/serverless": "^0.9.0", 20 | "@prisma/adapter-neon": "5.12.0", 21 | "@prisma/client": "5.12.0", 22 | "@radix-ui/react-avatar": "^1.0.4", 23 | "@radix-ui/react-collapsible": "^1.0.3", 24 | "@radix-ui/react-dropdown-menu": "^2.0.6", 25 | "@radix-ui/react-navigation-menu": "^1.1.4", 26 | "@radix-ui/react-slot": "^1.0.2", 27 | "class-variance-authority": "^0.7.0", 28 | "clsx": "^2.1.0", 29 | "lucide-react": "^0.364.0", 30 | "next": "14.2.0-canary.56", 31 | "next-auth": "5.0.0-beta.16", 32 | "prisma": "5.12.0", 33 | "react": "^18.2.0", 34 | "react-dom": "^18.2.0", 35 | "tailwind-merge": "^2.2.2" 36 | }, 37 | "devDependencies": { 38 | "@types/node": "^20", 39 | "@types/react": "^18.2.74", 40 | "@types/react-dom": "^18.2.23", 41 | "autoprefixer": "^10.4.19", 42 | "postcss": "^8.4.38", 43 | "prettier": "^3.2.5", 44 | "tailwindcss": "^3.4.3", 45 | "tailwindcss-animate": "^1.0.7", 46 | "typescript": "^5.4.3" 47 | }, 48 | "prettier": { 49 | "semi": false, 50 | "printWidth": 100 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 222.2 84% 4.9%; 9 | 10 | --card: 0 0% 100%; 11 | --card-foreground: 222.2 84% 4.9%; 12 | 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 222.2 84% 4.9%; 15 | 16 | --primary: 222.2 47.4% 11.2%; 17 | --primary-foreground: 210 40% 98%; 18 | 19 | --secondary: 210 40% 96.1%; 20 | --secondary-foreground: 222.2 47.4% 11.2%; 21 | 22 | --muted: 210 40% 96.1%; 23 | --muted-foreground: 215.4 16.3% 46.9%; 24 | 25 | --accent: 210 40% 96.1%; 26 | --accent-foreground: 222.2 47.4% 11.2%; 27 | 28 | --destructive: 0 84.2% 60.2%; 29 | --destructive-foreground: 210 40% 98%; 30 | 31 | --border: 214.3 31.8% 91.4%; 32 | --input: 214.3 31.8% 91.4%; 33 | --ring: 222.2 84% 4.9%; 34 | 35 | --radius: 0.5rem; 36 | } 37 | 38 | .dark { 39 | --background: 222.2 84% 4.9%; 40 | --foreground: 210 40% 98%; 41 | 42 | --card: 222.2 84% 4.9%; 43 | --card-foreground: 210 40% 98%; 44 | 45 | --popover: 222.2 84% 4.9%; 46 | --popover-foreground: 210 40% 98%; 47 | 48 | --primary: 210 40% 98%; 49 | --primary-foreground: 222.2 47.4% 11.2%; 50 | 51 | --secondary: 217.2 32.6% 17.5%; 52 | --secondary-foreground: 210 40% 98%; 53 | 54 | --muted: 217.2 32.6% 17.5%; 55 | --muted-foreground: 215 20.2% 65.1%; 56 | 57 | --accent: 217.2 32.6% 17.5%; 58 | --accent-foreground: 210 40% 98%; 59 | 60 | --destructive: 0 62.8% 30.6%; 61 | --destructive-foreground: 210 40% 98%; 62 | 63 | --border: 217.2 32.6% 17.5%; 64 | --input: 217.2 32.6% 17.5%; 65 | --ring: 212.7 26.8% 83.9%; 66 | } 67 | } 68 | 69 | @layer base { 70 | * { 71 | @apply border-border; 72 | } 73 | body { 74 | @apply bg-background text-foreground; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Slot } from "@radix-ui/react-slot" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", 9 | { 10 | variants: { 11 | variant: { 12 | default: "bg-primary text-primary-foreground hover:bg-primary/90", 13 | destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", 14 | outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", 15 | secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", 16 | ghost: "hover:bg-accent hover:text-accent-foreground", 17 | link: "text-primary underline-offset-4 hover:underline", 18 | }, 19 | size: { 20 | default: "h-10 px-4 py-2", 21 | sm: "h-9 rounded-md px-3", 22 | lg: "h-11 rounded-md px-8", 23 | icon: "h-10 w-10", 24 | }, 25 | }, 26 | defaultVariants: { 27 | variant: "default", 28 | size: "default", 29 | }, 30 | }, 31 | ) 32 | 33 | export interface ButtonProps 34 | extends React.ButtonHTMLAttributes, 35 | VariantProps { 36 | asChild?: boolean 37 | } 38 | 39 | const Button = React.forwardRef( 40 | ({ className, variant, size, asChild = false, ...props }, ref) => { 41 | const Comp = asChild ? Slot : "button" 42 | return ( 43 | 44 | ) 45 | }, 46 | ) 47 | Button.displayName = "Button" 48 | 49 | export { Button, buttonVariants } 50 | -------------------------------------------------------------------------------- /components/client-example.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { useSession } from "next-auth/react" 4 | import { Button } from "./ui/button" 5 | import { Input } from "./ui/input" 6 | import { useState } from "react" 7 | import SessionData from "./session-data" 8 | import CustomLink from "./custom-link" 9 | 10 | const UpdateForm = () => { 11 | const { data: session, update } = useSession() 12 | const [name, setName] = useState(`New ${session?.user?.name}` ?? "") 13 | 14 | if (!session?.user) return null 15 | return ( 16 | <> 17 |

Updating the session client-side

18 |
19 | { 24 | setName(e.target.value) 25 | }} 26 | /> 27 | 30 |
31 | 32 | ) 33 | } 34 | 35 | export default function ClientExample() { 36 | const { data: session, status } = useSession() 37 | return ( 38 |
39 |

Client Side Rendering Usage

40 |

41 | This page fetches session data client side using the{" "} 42 | 43 | useSession 44 | {" "} 45 | React Hook. 46 |

47 |

48 | It needs the{" "} 49 | 50 | 'use client' 51 | {" "} 52 | directive at the top of the file to enable client side rendering, and the{" "} 53 | 54 | SessionProvider 55 | {" "} 56 | component in{" "} 57 | 58 | client-example/page.tsx 59 | {" "} 60 | to provide the session data. 61 |

62 | 63 | {status === "loading" ?
Loading...
: } 64 | 65 |
66 | ) 67 | } 68 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | darkMode: ["class"], 4 | content: [ 5 | "./pages/**/*.{ts,tsx}", 6 | "./components/**/*.{ts,tsx}", 7 | "./app/**/*.{ts,tsx}", 8 | "./src/**/*.{ts,tsx}", 9 | ], 10 | theme: { 11 | container: { 12 | center: true, 13 | padding: "2rem", 14 | screens: { 15 | "2xl": "1400px", 16 | }, 17 | }, 18 | extend: { 19 | colors: { 20 | border: "hsl(var(--border))", 21 | input: "hsl(var(--input))", 22 | ring: "hsl(var(--ring))", 23 | background: "hsl(var(--background))", 24 | foreground: "hsl(var(--foreground))", 25 | primary: { 26 | DEFAULT: "hsl(var(--primary))", 27 | foreground: "hsl(var(--primary-foreground))", 28 | }, 29 | secondary: { 30 | DEFAULT: "hsl(var(--secondary))", 31 | foreground: "hsl(var(--secondary-foreground))", 32 | }, 33 | destructive: { 34 | DEFAULT: "hsl(var(--destructive))", 35 | foreground: "hsl(var(--destructive-foreground))", 36 | }, 37 | muted: { 38 | DEFAULT: "hsl(var(--muted))", 39 | foreground: "hsl(var(--muted-foreground))", 40 | }, 41 | accent: { 42 | DEFAULT: "hsl(var(--accent))", 43 | foreground: "hsl(var(--accent-foreground))", 44 | }, 45 | popover: { 46 | DEFAULT: "hsl(var(--popover))", 47 | foreground: "hsl(var(--popover-foreground))", 48 | }, 49 | card: { 50 | DEFAULT: "hsl(var(--card))", 51 | foreground: "hsl(var(--card-foreground))", 52 | }, 53 | }, 54 | borderRadius: { 55 | lg: "var(--radius)", 56 | md: "calc(var(--radius) - 2px)", 57 | sm: "calc(var(--radius) - 4px)", 58 | }, 59 | keyframes: { 60 | "accordion-down": { 61 | from: { height: 0 }, 62 | to: { height: "var(--radix-accordion-content-height)" }, 63 | }, 64 | "accordion-up": { 65 | from: { height: "var(--radix-accordion-content-height)" }, 66 | to: { height: 0 }, 67 | }, 68 | }, 69 | animation: { 70 | "accordion-down": "accordion-down 0.2s ease-out", 71 | "accordion-up": "accordion-up 0.2s ease-out", 72 | }, 73 | }, 74 | }, 75 | plugins: [require("tailwindcss-animate")], 76 | } 77 | -------------------------------------------------------------------------------- /prisma/migrations/20240208153010_authjs_init/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "User" ( 3 | "id" TEXT NOT NULL, 4 | "name" TEXT, 5 | "email" TEXT NOT NULL, 6 | "emailVerified" TIMESTAMP(3), 7 | "image" TEXT, 8 | 9 | CONSTRAINT "User_pkey" PRIMARY KEY ("id") 10 | ); 11 | 12 | -- CreateTable 13 | CREATE TABLE "Account" ( 14 | "userId" TEXT NOT NULL, 15 | "type" TEXT NOT NULL, 16 | "provider" TEXT NOT NULL, 17 | "providerAccountId" TEXT NOT NULL, 18 | "refresh_token" TEXT, 19 | "access_token" TEXT, 20 | "expires_at" INTEGER, 21 | "token_type" TEXT, 22 | "scope" TEXT, 23 | "id_token" TEXT, 24 | "session_state" TEXT, 25 | 26 | CONSTRAINT "Account_pkey" PRIMARY KEY ("provider","providerAccountId") 27 | ); 28 | 29 | -- CreateTable 30 | CREATE TABLE "Session" ( 31 | "sessionToken" TEXT NOT NULL, 32 | "userId" TEXT NOT NULL, 33 | "expires" TIMESTAMP(3) NOT NULL 34 | ); 35 | 36 | -- CreateTable 37 | CREATE TABLE "VerificationToken" ( 38 | "identifier" TEXT NOT NULL, 39 | "token" TEXT NOT NULL, 40 | "expires" TIMESTAMP(3) NOT NULL, 41 | 42 | CONSTRAINT "VerificationToken_pkey" PRIMARY KEY ("identifier","token") 43 | ); 44 | 45 | -- CreateTable 46 | CREATE TABLE "Authenticator" ( 47 | "id" TEXT NOT NULL, 48 | "credentialID" TEXT NOT NULL, 49 | "userId" TEXT NOT NULL, 50 | "providerAccountId" TEXT NOT NULL, 51 | "credentialPublicKey" TEXT NOT NULL, 52 | "counter" INTEGER NOT NULL, 53 | "credentialDeviceType" TEXT NOT NULL, 54 | "credentialBackedUp" BOOLEAN NOT NULL, 55 | "transports" TEXT, 56 | 57 | CONSTRAINT "Authenticator_pkey" PRIMARY KEY ("id") 58 | ); 59 | 60 | -- CreateIndex 61 | CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); 62 | 63 | -- CreateIndex 64 | CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken"); 65 | 66 | -- CreateIndex 67 | CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token"); 68 | 69 | -- CreateIndex 70 | CREATE UNIQUE INDEX "Authenticator_credentialID_key" ON "Authenticator"("credentialID"); 71 | 72 | -- AddForeignKey 73 | ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; 74 | 75 | -- AddForeignKey 76 | ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; 77 | 78 | -- AddForeignKey 79 | ALTER TABLE "Authenticator" ADD CONSTRAINT "Authenticator_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; 80 | -------------------------------------------------------------------------------- /components/main-nav.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import Image from "next/image" 4 | 5 | import { cn } from "@/lib/utils" 6 | import CustomLink from "./custom-link" 7 | import { 8 | NavigationMenu, 9 | NavigationMenuContent, 10 | NavigationMenuItem, 11 | NavigationMenuLink, 12 | NavigationMenuList, 13 | NavigationMenuTrigger, 14 | navigationMenuTriggerStyle, 15 | } from "./ui/navigation-menu" 16 | import React from "react" 17 | import { Button } from "./ui/button" 18 | 19 | export function MainNav() { 20 | return ( 21 |
22 | 23 | Home 24 | 25 | 26 | 27 | 28 | Server Side 29 | 30 |
    31 | 32 | Protecting React Server Component. 33 | 34 | 35 | Using Middleware to protect pages & APIs. 36 | 37 | 38 | Getting the session inside an API Route. 39 | 40 |
41 |
42 |
43 | 44 | 48 | Client Side 49 | 50 | 51 |
52 |
53 |
54 | ) 55 | } 56 | 57 | const ListItem = React.forwardRef, React.ComponentPropsWithoutRef<"a">>( 58 | ({ className, title, children, ...props }, ref) => { 59 | return ( 60 |
  • 61 | 62 | 70 |
    {title}
    71 |

    {children}

    72 |
    73 |
    74 |
  • 75 | ) 76 | }, 77 | ) 78 | ListItem.displayName = "ListItem" 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

    2 |
    3 | 4 |

    Auth.js + Prisma Edge Example App

    5 |

    6 | Open Source. Full Stack. Own Your Data. 7 |

    8 |

    9 | npm 10 | Bundle Size 11 | TypeScript 12 |

    13 |

    14 | 15 | ## 🧭 Overview 16 | 17 | This is an example application showing [Auth.js](https://authjs.dev) (`next-auth@5.0.0-beta.15`) and [Prisma](https://prisma.io) (`@prisma/client@5.12.0`) working together in edge runtimes, like Vercel's middleware or Cloudflare Workers. 18 | 19 | This had previously only been possible with significant workarounds and limitations. As of `@prisma/client@5.9.1` Prisma began making changes to their client, for example, to error out at query-time, not instantiation. So you could begin using Prisma with `next-auth` in Edge runtimes, as long as you didn't actually execute any queries on the edge. This implied using the Auth.js setting `session: { strategy: 'jwt' }`, as the `strategy: 'database'` didn't work because we couldn't update the expiry time of a database-based session in the `middleware` handler. 20 | 21 | Prisma has now rolled out edge-compatible clients and adapters which communicate via HTTP, making them much more straightforward to run under any JavaScript runtime. You can check out their [edge deployment](https://www.prisma.io/docs/orm/prisma-client/deployment/edge/overview#which-database-drivers-are-edge-compatible) page for a current list of supported adapters and platforms. 22 | 23 | As this example shows, however, using Prisma + Auth.js with an Edge-compatible database provider and adapter like Neon (Vercel Postgres), PlanetScale or Turso is beginning to become much more straightforward! 24 | 25 | ## 🚀 Getting Started 26 | 27 | ### 1. Clone the repository and install dependencies 28 | 29 | ```bash 30 | git clone https://github.com/ndom91/authjs-prisma-edge-example.git 31 | cd authjs-prisma-edge-example 32 | pnpm install 33 | ``` 34 | 35 | ### 2. Configure your local environment 36 | 37 | Copy the .env.local.example file in this directory to .env.local (which will be ignored by Git): 38 | 39 | ```bash 40 | cp .env.example .env 41 | ``` 42 | 43 | Make sure to fill out the `AUTH_SECRET` env var as well as your Prisma database connection string(s). Also, don't forget to add environment variables to configure any of the [supported providers](https://authjs.dev/reference/core/providers) for Auth.js login. 44 | 45 | ### 3. Database 46 | 47 | This example is configured to use a [Neon Postgres](https://neon.tech) database ([Vercel Postgres](https://vercel.com/storage/postgres) also works). Any Prisma Edge compatible database driver should work with a bit of tweaking though, these currently include: 48 | 49 | - **PlanetScale** serverless driver with `@prisma/adapter-planetscale` 50 | - **Neon** serverless driver with `@prisma/adapter-neon` 51 | - **Turso** with `@prisma/adapter-libsql` 52 | - **Cloudflare D1** with `@prisma/adapter-d1` 53 | - **PostgreSQL** with `@prisma/adapter-pg` 54 | 55 | See Prisma's Edge compatible driver [documentation](https://www.prisma.io/docs/orm/prisma-client/deployment/edge/overview) for more details. 56 | 57 | ### 4. Start the application 58 | 59 | To run your site locally, use: 60 | 61 | ```bash 62 | pnpm dev 63 | ``` 64 | 65 | ## 📝 License 66 | 67 | MIT 68 | -------------------------------------------------------------------------------- /components/ui/navigation-menu.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu" 3 | import { cva } from "class-variance-authority" 4 | import { ChevronDown } from "lucide-react" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const NavigationMenu = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, children, ...props }, ref) => ( 12 | 17 | {children} 18 | 19 | 20 | )) 21 | NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName 22 | 23 | const NavigationMenuList = React.forwardRef< 24 | React.ElementRef, 25 | React.ComponentPropsWithoutRef 26 | >(({ className, ...props }, ref) => ( 27 | 32 | )) 33 | NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName 34 | 35 | const NavigationMenuItem = NavigationMenuPrimitive.Item 36 | 37 | const navigationMenuTriggerStyle = cva( 38 | "group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50", 39 | ) 40 | 41 | const NavigationMenuTrigger = React.forwardRef< 42 | React.ElementRef, 43 | React.ComponentPropsWithoutRef 44 | >(({ className, children, ...props }, ref) => ( 45 | 50 | {children}{" "} 51 | 56 | )) 57 | NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName 58 | 59 | const NavigationMenuContent = React.forwardRef< 60 | React.ElementRef, 61 | React.ComponentPropsWithoutRef 62 | >(({ className, ...props }, ref) => ( 63 | 71 | )) 72 | NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName 73 | 74 | const NavigationMenuLink = NavigationMenuPrimitive.Link 75 | 76 | const NavigationMenuViewport = React.forwardRef< 77 | React.ElementRef, 78 | React.ComponentPropsWithoutRef 79 | >(({ className, ...props }, ref) => ( 80 |
    81 | 89 |
    90 | )) 91 | NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName 92 | 93 | const NavigationMenuIndicator = React.forwardRef< 94 | React.ElementRef, 95 | React.ComponentPropsWithoutRef 96 | >(({ className, ...props }, ref) => ( 97 | 105 |
    106 | 107 | )) 108 | NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName 109 | 110 | export { 111 | navigationMenuTriggerStyle, 112 | NavigationMenu, 113 | NavigationMenuList, 114 | NavigationMenuItem, 115 | NavigationMenuContent, 116 | NavigationMenuTrigger, 117 | NavigationMenuLink, 118 | NavigationMenuIndicator, 119 | NavigationMenuViewport, 120 | } 121 | -------------------------------------------------------------------------------- /components/ui/dropdown-menu.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" 5 | import { Check, ChevronRight, Circle } from "lucide-react" 6 | 7 | import { cn } from "@/lib/utils" 8 | 9 | const DropdownMenu = DropdownMenuPrimitive.Root 10 | 11 | const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger 12 | 13 | const DropdownMenuGroup = DropdownMenuPrimitive.Group 14 | 15 | const DropdownMenuPortal = DropdownMenuPrimitive.Portal 16 | 17 | const DropdownMenuSub = DropdownMenuPrimitive.Sub 18 | 19 | const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup 20 | 21 | const DropdownMenuSubTrigger = React.forwardRef< 22 | React.ElementRef, 23 | React.ComponentPropsWithoutRef & { 24 | inset?: boolean 25 | } 26 | >(({ className, inset, children, ...props }, ref) => ( 27 | 36 | {children} 37 | 38 | 39 | )) 40 | DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName 41 | 42 | const DropdownMenuSubContent = React.forwardRef< 43 | React.ElementRef, 44 | React.ComponentPropsWithoutRef 45 | >(({ className, ...props }, ref) => ( 46 | 54 | )) 55 | DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName 56 | 57 | const DropdownMenuContent = React.forwardRef< 58 | React.ElementRef, 59 | React.ComponentPropsWithoutRef 60 | >(({ className, sideOffset = 4, ...props }, ref) => ( 61 | 62 | 71 | 72 | )) 73 | DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName 74 | 75 | const DropdownMenuItem = React.forwardRef< 76 | React.ElementRef, 77 | React.ComponentPropsWithoutRef & { 78 | inset?: boolean 79 | } 80 | >(({ className, inset, ...props }, ref) => ( 81 | 90 | )) 91 | DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName 92 | 93 | const DropdownMenuCheckboxItem = React.forwardRef< 94 | React.ElementRef, 95 | React.ComponentPropsWithoutRef 96 | >(({ className, children, checked, ...props }, ref) => ( 97 | 106 | 107 | 108 | 109 | 110 | 111 | {children} 112 | 113 | )) 114 | DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName 115 | 116 | const DropdownMenuRadioItem = React.forwardRef< 117 | React.ElementRef, 118 | React.ComponentPropsWithoutRef 119 | >(({ className, children, ...props }, ref) => ( 120 | 128 | 129 | 130 | 131 | 132 | 133 | {children} 134 | 135 | )) 136 | DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName 137 | 138 | const DropdownMenuLabel = React.forwardRef< 139 | React.ElementRef, 140 | React.ComponentPropsWithoutRef & { 141 | inset?: boolean 142 | } 143 | >(({ className, inset, ...props }, ref) => ( 144 | 149 | )) 150 | DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName 151 | 152 | const DropdownMenuSeparator = React.forwardRef< 153 | React.ElementRef, 154 | React.ComponentPropsWithoutRef 155 | >(({ className, ...props }, ref) => ( 156 | 161 | )) 162 | DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName 163 | 164 | const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { 165 | return 166 | } 167 | DropdownMenuShortcut.displayName = "DropdownMenuShortcut" 168 | 169 | export { 170 | DropdownMenu, 171 | DropdownMenuTrigger, 172 | DropdownMenuContent, 173 | DropdownMenuItem, 174 | DropdownMenuCheckboxItem, 175 | DropdownMenuRadioItem, 176 | DropdownMenuLabel, 177 | DropdownMenuSeparator, 178 | DropdownMenuShortcut, 179 | DropdownMenuGroup, 180 | DropdownMenuPortal, 181 | DropdownMenuSub, 182 | DropdownMenuSubContent, 183 | DropdownMenuSubTrigger, 184 | DropdownMenuRadioGroup, 185 | } 186 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import CustomLink from "@/components/custom-link" 2 | import { auth } from "auth" 3 | 4 | export default async function Index() { 5 | const session = await auth() 6 | return ( 7 |
    8 |

    Auth.js Prisma Edge Example

    9 |

    10 | This is an example site to demonstrate how to use{" "} 11 | Auth.js with Prisma's new Edge-compatible 12 | client and adapters. 13 |

    14 |
    15 |

    Current Session

    16 |
    {JSON.stringify(session, null, 2)}
    17 |
    18 | 19 |
    20 |
    21 |
    22 | 23 | Prisma Announcement Blog Post 24 | {" "} 25 | | 26 | 27 | Prisma Edge Docs 28 | {" "} 29 | | 30 | 31 | Example Repo 32 | 33 |
    34 |
    35 |
    36 | Home 37 | 45 | Prisma 46 | 47 | 52 | 53 | 54 | 60 | Neon 61 | 67 | 73 | 79 | 83 | 84 | 92 | 93 | 94 | 95 | 103 | 104 | 105 | 106 | 107 | 108 | 116 | Vercel 117 | 118 | 119 | 120 | 121 | 127 | CloudFrame Workers 128 | 129 | 136 | 137 | 138 | 139 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 160 | 161 | 162 | 163 | 170 | 171 | 172 | 173 | 174 | 181 | 182 | 183 | 184 | 191 | 192 | 193 | 194 | 201 | 202 | 203 | 204 | 205 | 206 | 210 | 215 | 220 | 224 | 228 | 232 | 237 | 242 | 243 | 244 | 251 | Turso 252 | 261 | 262 | 263 | 264 | 268 | 272 | 276 | 280 | 284 | 285 | 294 | 295 | 296 | 297 | 301 | 305 | 309 | 313 | 317 | 318 | 319 | 327 | 328 | 329 | 330 | 338 | 339 | 340 | 341 | 342 | 343 |
    344 |
    345 |
    346 | ) 347 | } 348 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@auth/prisma-adapter': 9 | specifier: ^1.5.2 10 | version: 1.5.2(@prisma/client@5.12.0) 11 | '@neondatabase/serverless': 12 | specifier: ^0.9.0 13 | version: 0.9.0 14 | '@prisma/adapter-neon': 15 | specifier: 5.12.0 16 | version: 5.12.0(@neondatabase/serverless@0.9.0) 17 | '@prisma/client': 18 | specifier: 5.12.0 19 | version: 5.12.0(prisma@5.12.0) 20 | '@radix-ui/react-avatar': 21 | specifier: ^1.0.4 22 | version: 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 23 | '@radix-ui/react-collapsible': 24 | specifier: ^1.0.3 25 | version: 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 26 | '@radix-ui/react-dropdown-menu': 27 | specifier: ^2.0.6 28 | version: 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 29 | '@radix-ui/react-navigation-menu': 30 | specifier: ^1.1.4 31 | version: 1.1.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 32 | '@radix-ui/react-slot': 33 | specifier: ^1.0.2 34 | version: 1.0.2(@types/react@18.2.74)(react@18.2.0) 35 | class-variance-authority: 36 | specifier: ^0.7.0 37 | version: 0.7.0 38 | clsx: 39 | specifier: ^2.1.0 40 | version: 2.1.0 41 | lucide-react: 42 | specifier: ^0.364.0 43 | version: 0.364.0(react@18.2.0) 44 | next: 45 | specifier: 14.2.0-canary.56 46 | version: 14.2.0-canary.56(react-dom@18.2.0)(react@18.2.0) 47 | next-auth: 48 | specifier: 5.0.0-beta.16 49 | version: 5.0.0-beta.16(next@14.2.0-canary.56)(react@18.2.0) 50 | prisma: 51 | specifier: 5.12.0 52 | version: 5.12.0 53 | react: 54 | specifier: ^18.2.0 55 | version: 18.2.0 56 | react-dom: 57 | specifier: ^18.2.0 58 | version: 18.2.0(react@18.2.0) 59 | tailwind-merge: 60 | specifier: ^2.2.2 61 | version: 2.2.2 62 | 63 | devDependencies: 64 | '@types/node': 65 | specifier: ^20 66 | version: 20.12.3 67 | '@types/react': 68 | specifier: ^18.2.74 69 | version: 18.2.74 70 | '@types/react-dom': 71 | specifier: ^18.2.23 72 | version: 18.2.23 73 | autoprefixer: 74 | specifier: ^10.4.19 75 | version: 10.4.19(postcss@8.4.38) 76 | postcss: 77 | specifier: ^8.4.38 78 | version: 8.4.38 79 | prettier: 80 | specifier: ^3.2.5 81 | version: 3.2.5 82 | tailwindcss: 83 | specifier: ^3.4.3 84 | version: 3.4.3 85 | tailwindcss-animate: 86 | specifier: ^1.0.7 87 | version: 1.0.7(tailwindcss@3.4.3) 88 | typescript: 89 | specifier: ^5.4.3 90 | version: 5.4.3 91 | 92 | packages: 93 | 94 | /@alloc/quick-lru@5.2.0: 95 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 96 | engines: {node: '>=10'} 97 | dev: true 98 | 99 | /@auth/core@0.28.1: 100 | resolution: {integrity: sha512-gvp74mypYZADpTlfGRp6HE0G3pIHWvtJpy+KZ+8FvY0cmlIpHog+jdMOdd29dQtLtN25kF2YbfHsesCFuGUQbg==} 101 | peerDependencies: 102 | '@simplewebauthn/browser': ^9.0.1 103 | '@simplewebauthn/server': ^9.0.2 104 | nodemailer: ^6.8.0 105 | peerDependenciesMeta: 106 | '@simplewebauthn/browser': 107 | optional: true 108 | '@simplewebauthn/server': 109 | optional: true 110 | nodemailer: 111 | optional: true 112 | dependencies: 113 | '@panva/hkdf': 1.1.1 114 | '@types/cookie': 0.6.0 115 | cookie: 0.6.0 116 | jose: 5.2.2 117 | oauth4webapi: 2.10.3 118 | preact: 10.11.3 119 | preact-render-to-string: 5.2.3(preact@10.11.3) 120 | dev: false 121 | 122 | /@auth/core@0.28.2: 123 | resolution: {integrity: sha512-Rlvu6yKa4bKbhQESMaEm6jHOY5ncIrsrQkC8tcwVQmf+cBLk7ReI9DIJS2O/WkIDoOwvM9PHiXTi5b+b/eyXxw==} 124 | peerDependencies: 125 | '@simplewebauthn/browser': ^9.0.1 126 | '@simplewebauthn/server': ^9.0.2 127 | nodemailer: ^6.8.0 128 | peerDependenciesMeta: 129 | '@simplewebauthn/browser': 130 | optional: true 131 | '@simplewebauthn/server': 132 | optional: true 133 | nodemailer: 134 | optional: true 135 | dependencies: 136 | '@panva/hkdf': 1.1.1 137 | '@types/cookie': 0.6.0 138 | cookie: 0.6.0 139 | jose: 5.2.2 140 | oauth4webapi: 2.10.3 141 | preact: 10.11.3 142 | preact-render-to-string: 5.2.3(preact@10.11.3) 143 | dev: false 144 | 145 | /@auth/prisma-adapter@1.5.2(@prisma/client@5.12.0): 146 | resolution: {integrity: sha512-yP331ZtBvzrtKSqsJ7/LeojJVimiSvJ7CKeA4HfvAGtHhKvu2m5IVe8mnWa6yX1xWK8I5VyZMMlWPcaDtNKlwA==} 147 | peerDependencies: 148 | '@prisma/client': '>=2.26.0 || >=3 || >=4 || >=5' 149 | dependencies: 150 | '@auth/core': 0.28.2 151 | '@prisma/client': 5.12.0(prisma@5.12.0) 152 | transitivePeerDependencies: 153 | - '@simplewebauthn/browser' 154 | - '@simplewebauthn/server' 155 | - nodemailer 156 | dev: false 157 | 158 | /@babel/runtime@7.23.9: 159 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} 160 | engines: {node: '>=6.9.0'} 161 | dependencies: 162 | regenerator-runtime: 0.14.1 163 | dev: false 164 | 165 | /@babel/runtime@7.24.1: 166 | resolution: {integrity: sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==} 167 | engines: {node: '>=6.9.0'} 168 | dependencies: 169 | regenerator-runtime: 0.14.1 170 | dev: false 171 | 172 | /@floating-ui/core@1.6.0: 173 | resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} 174 | dependencies: 175 | '@floating-ui/utils': 0.2.1 176 | dev: false 177 | 178 | /@floating-ui/dom@1.6.3: 179 | resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} 180 | dependencies: 181 | '@floating-ui/core': 1.6.0 182 | '@floating-ui/utils': 0.2.1 183 | dev: false 184 | 185 | /@floating-ui/react-dom@2.0.8(react-dom@18.2.0)(react@18.2.0): 186 | resolution: {integrity: sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==} 187 | peerDependencies: 188 | react: '>=16.8.0' 189 | react-dom: '>=16.8.0' 190 | dependencies: 191 | '@floating-ui/dom': 1.6.3 192 | react: 18.2.0 193 | react-dom: 18.2.0(react@18.2.0) 194 | dev: false 195 | 196 | /@floating-ui/utils@0.2.1: 197 | resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} 198 | dev: false 199 | 200 | /@isaacs/cliui@8.0.2: 201 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 202 | engines: {node: '>=12'} 203 | dependencies: 204 | string-width: 5.1.2 205 | string-width-cjs: /string-width@4.2.3 206 | strip-ansi: 7.1.0 207 | strip-ansi-cjs: /strip-ansi@6.0.1 208 | wrap-ansi: 8.1.0 209 | wrap-ansi-cjs: /wrap-ansi@7.0.0 210 | dev: true 211 | 212 | /@jridgewell/gen-mapping@0.3.3: 213 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 214 | engines: {node: '>=6.0.0'} 215 | dependencies: 216 | '@jridgewell/set-array': 1.1.2 217 | '@jridgewell/sourcemap-codec': 1.4.15 218 | '@jridgewell/trace-mapping': 0.3.22 219 | dev: true 220 | 221 | /@jridgewell/resolve-uri@3.1.2: 222 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 223 | engines: {node: '>=6.0.0'} 224 | dev: true 225 | 226 | /@jridgewell/set-array@1.1.2: 227 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 228 | engines: {node: '>=6.0.0'} 229 | dev: true 230 | 231 | /@jridgewell/sourcemap-codec@1.4.15: 232 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 233 | dev: true 234 | 235 | /@jridgewell/trace-mapping@0.3.22: 236 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 237 | dependencies: 238 | '@jridgewell/resolve-uri': 3.1.2 239 | '@jridgewell/sourcemap-codec': 1.4.15 240 | dev: true 241 | 242 | /@neondatabase/serverless@0.9.0: 243 | resolution: {integrity: sha512-mmJnUAzlzvxNSZuuhI6kgJjH+JgFdBMYUWxihtq/nj0Tjt+Y5UU3W+SvRFoucnd5NObYkuLYQzk+zV5DGFKGJg==} 244 | dependencies: 245 | '@types/pg': 8.6.6 246 | dev: false 247 | 248 | /@next/env@14.2.0-canary.56: 249 | resolution: {integrity: sha512-slHTSLx6xovPaNJd6j+SAgK3IZz0D4Go5Vj6hb7/UCYXii1G7xeVgO2EIHdwcuzNaeuug8iN6wvpqS9qjH67cA==} 250 | dev: false 251 | 252 | /@next/swc-darwin-arm64@14.2.0-canary.56: 253 | resolution: {integrity: sha512-9d162Qzls1eDrw2a7e6IiK5bzBm2LVD5Fh2DP67rggPFqgl15hJMDfjv+vfiCbFhxaA95uv45S48Kj/X2p4Wrg==} 254 | engines: {node: '>= 10'} 255 | cpu: [arm64] 256 | os: [darwin] 257 | requiresBuild: true 258 | dev: false 259 | optional: true 260 | 261 | /@next/swc-darwin-x64@14.2.0-canary.56: 262 | resolution: {integrity: sha512-c3/9yRBCpbt5dF7KzdoI9gH4IMMciAaH1GHf97UOK7cuI7/ctvlld7X1IP+HlMnd8+p3+FHkjySUM/Rm+t//Mw==} 263 | engines: {node: '>= 10'} 264 | cpu: [x64] 265 | os: [darwin] 266 | requiresBuild: true 267 | dev: false 268 | optional: true 269 | 270 | /@next/swc-linux-arm64-gnu@14.2.0-canary.56: 271 | resolution: {integrity: sha512-Pv83XZ/Fyk6uz6pDA6Uywp2LT7+E9IXJtWgHXp0rsLTjSuyvXz76kEX9ZoQrakhMRF3ki4+f1AXysPkehuazNQ==} 272 | engines: {node: '>= 10'} 273 | cpu: [arm64] 274 | os: [linux] 275 | requiresBuild: true 276 | dev: false 277 | optional: true 278 | 279 | /@next/swc-linux-arm64-musl@14.2.0-canary.56: 280 | resolution: {integrity: sha512-ytP9AAbMYXIye6dQ1RoFV7Eb2k+yu+nMlny4COYMWhNto+30dx0mmNjjJ464c7XU5KvcLTqdj2pcBGFi2Uj0vw==} 281 | engines: {node: '>= 10'} 282 | cpu: [arm64] 283 | os: [linux] 284 | requiresBuild: true 285 | dev: false 286 | optional: true 287 | 288 | /@next/swc-linux-x64-gnu@14.2.0-canary.56: 289 | resolution: {integrity: sha512-/V6ngDidzDYkK8120PfRWDCi/26y9WywaZ/lWJY+345sXaB3CGLnFd3tyfdIpzHxDOvRYDHCTLh8lYd0XJF+uA==} 290 | engines: {node: '>= 10'} 291 | cpu: [x64] 292 | os: [linux] 293 | requiresBuild: true 294 | dev: false 295 | optional: true 296 | 297 | /@next/swc-linux-x64-musl@14.2.0-canary.56: 298 | resolution: {integrity: sha512-YEwoiErfzmmXRrqoInPDItJ0X+PZbeTQVkR9UpYgUstgrwr0/aFILLI/wLT52r9NWX3yMiqONB/Owv5LefkQlg==} 299 | engines: {node: '>= 10'} 300 | cpu: [x64] 301 | os: [linux] 302 | requiresBuild: true 303 | dev: false 304 | optional: true 305 | 306 | /@next/swc-win32-arm64-msvc@14.2.0-canary.56: 307 | resolution: {integrity: sha512-gEIxu949cO8xTnapS5p+EVg3fr8dzQgsybjIVC/FIl8dfBDMMHHiUIJm2lNUvi9zRc4OgrJ7WC+0tA58h9JRfA==} 308 | engines: {node: '>= 10'} 309 | cpu: [arm64] 310 | os: [win32] 311 | requiresBuild: true 312 | dev: false 313 | optional: true 314 | 315 | /@next/swc-win32-ia32-msvc@14.2.0-canary.56: 316 | resolution: {integrity: sha512-3EYXk812fRXuwhID9IYG+xodNr25IPkoEbCLTdKOzS8okZrRzRHo+WmhIqF2ylS4LDFt18yVWGibN2pPJISjVg==} 317 | engines: {node: '>= 10'} 318 | cpu: [ia32] 319 | os: [win32] 320 | requiresBuild: true 321 | dev: false 322 | optional: true 323 | 324 | /@next/swc-win32-x64-msvc@14.2.0-canary.56: 325 | resolution: {integrity: sha512-FvsUo8nh9Hc6qvK0uqoinEfZbw+q16Jj6qewA0fdUQ+QY0i6ECo7c8Wsc6Jm/dGmW/CAA1zAVUX00L9h+MGyZw==} 326 | engines: {node: '>= 10'} 327 | cpu: [x64] 328 | os: [win32] 329 | requiresBuild: true 330 | dev: false 331 | optional: true 332 | 333 | /@nodelib/fs.scandir@2.1.5: 334 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 335 | engines: {node: '>= 8'} 336 | dependencies: 337 | '@nodelib/fs.stat': 2.0.5 338 | run-parallel: 1.2.0 339 | dev: true 340 | 341 | /@nodelib/fs.stat@2.0.5: 342 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 343 | engines: {node: '>= 8'} 344 | dev: true 345 | 346 | /@nodelib/fs.walk@1.2.8: 347 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 348 | engines: {node: '>= 8'} 349 | dependencies: 350 | '@nodelib/fs.scandir': 2.1.5 351 | fastq: 1.17.1 352 | dev: true 353 | 354 | /@panva/hkdf@1.1.1: 355 | resolution: {integrity: sha512-dhPeilub1NuIG0X5Kvhh9lH4iW3ZsHlnzwgwbOlgwQ2wG1IqFzsgHqmKPk3WzsdWAeaxKJxgM0+W433RmN45GA==} 356 | dev: false 357 | 358 | /@pkgjs/parseargs@0.11.0: 359 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 360 | engines: {node: '>=14'} 361 | requiresBuild: true 362 | dev: true 363 | optional: true 364 | 365 | /@prisma/adapter-neon@5.12.0(@neondatabase/serverless@0.9.0): 366 | resolution: {integrity: sha512-kcS/hVp6qvby/ghlhAc3rYYWPZBmEcRpNdq7/XBnoU9VZhZ24pPOOSO3SOscftToZglnUfmUH+tFVN5o+yhdeA==} 367 | peerDependencies: 368 | '@neondatabase/serverless': ^0.6.0 || ^0.7.0 || ^0.8.0 || ^0.9.0 369 | dependencies: 370 | '@neondatabase/serverless': 0.9.0 371 | '@prisma/driver-adapter-utils': 5.12.0 372 | postgres-array: 3.0.2 373 | dev: false 374 | 375 | /@prisma/client@5.12.0(prisma@5.12.0): 376 | resolution: {integrity: sha512-bk/+KPpRm0+IzqFCtAxrj+/TNiHzulspnO+OkysaYY/atc/eX0Gx8V3tTLxbHKVX0LKD4Hi8KKCcSbU1U72n7Q==} 377 | engines: {node: '>=16.13'} 378 | requiresBuild: true 379 | peerDependencies: 380 | prisma: '*' 381 | peerDependenciesMeta: 382 | prisma: 383 | optional: true 384 | dependencies: 385 | prisma: 5.12.0 386 | dev: false 387 | 388 | /@prisma/debug@5.12.0: 389 | resolution: {integrity: sha512-wK3fQLxPLMqf5riT5ZIhl8NffPSzFUwtzFX5CH7z/oI9Swmo9UhQlUgZABIVgdXSJ5OAlmRcDZtDKaMApIl8sg==} 390 | dev: false 391 | 392 | /@prisma/driver-adapter-utils@5.12.0: 393 | resolution: {integrity: sha512-B57KUrKmRlax4sE4pc2VKPtG5U9XGm5kjtqSWBUd83NopIZVuvKunH3ETrOShwBCqWZXZolHvdDjDwHyiT2HRQ==} 394 | dependencies: 395 | '@prisma/debug': 5.12.0 396 | dev: false 397 | 398 | /@prisma/engines-version@5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab: 399 | resolution: {integrity: sha512-6yvO8s80Tym61aB4QNtYZfWVmE3pwqe807jEtzm8C5VDe7nw8O1FGX3TXUaXmWV0fQTIAfRbeL2Gwrndabp/0g==} 400 | dev: false 401 | 402 | /@prisma/engines@5.12.0: 403 | resolution: {integrity: sha512-rFNRul9JGu0d3tf8etBgmDQ4NVoDwgGrRguvQOc8i+c6g7xPjRuu4aKzMMvHWUuccvRx5+fs1KMBxQ0x2THt+Q==} 404 | requiresBuild: true 405 | dependencies: 406 | '@prisma/debug': 5.12.0 407 | '@prisma/engines-version': 5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab 408 | '@prisma/fetch-engine': 5.12.0 409 | '@prisma/get-platform': 5.12.0 410 | dev: false 411 | 412 | /@prisma/fetch-engine@5.12.0: 413 | resolution: {integrity: sha512-qkHQbZ1hspvOwcImvqY4yj7+FUlw0+uP+6tu3g24V4ULHOXLLkvr5ZZc6vy26OF0hkbD3kcDJCeutFis3poKgg==} 414 | dependencies: 415 | '@prisma/debug': 5.12.0 416 | '@prisma/engines-version': 5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab 417 | '@prisma/get-platform': 5.12.0 418 | dev: false 419 | 420 | /@prisma/get-platform@5.12.0: 421 | resolution: {integrity: sha512-81Ptv9YJnwTArEBPQ2Lvu58sZPxy4OixKxVVgysFan6A3bFP7q8gIg15WTjsRuH4WXh6B667EM9sqoMTNu0fLQ==} 422 | dependencies: 423 | '@prisma/debug': 5.12.0 424 | dev: false 425 | 426 | /@radix-ui/primitive@1.0.1: 427 | resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} 428 | dependencies: 429 | '@babel/runtime': 7.23.9 430 | dev: false 431 | 432 | /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 433 | resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} 434 | peerDependencies: 435 | '@types/react': '*' 436 | '@types/react-dom': '*' 437 | react: ^16.8 || ^17.0 || ^18.0 438 | react-dom: ^16.8 || ^17.0 || ^18.0 439 | peerDependenciesMeta: 440 | '@types/react': 441 | optional: true 442 | '@types/react-dom': 443 | optional: true 444 | dependencies: 445 | '@babel/runtime': 7.23.9 446 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 447 | '@types/react': 18.2.74 448 | '@types/react-dom': 18.2.23 449 | react: 18.2.0 450 | react-dom: 18.2.0(react@18.2.0) 451 | dev: false 452 | 453 | /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 454 | resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} 455 | peerDependencies: 456 | '@types/react': '*' 457 | '@types/react-dom': '*' 458 | react: ^16.8 || ^17.0 || ^18.0 459 | react-dom: ^16.8 || ^17.0 || ^18.0 460 | peerDependenciesMeta: 461 | '@types/react': 462 | optional: true 463 | '@types/react-dom': 464 | optional: true 465 | dependencies: 466 | '@babel/runtime': 7.23.9 467 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 468 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 469 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 470 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 471 | '@types/react': 18.2.74 472 | '@types/react-dom': 18.2.23 473 | react: 18.2.0 474 | react-dom: 18.2.0(react@18.2.0) 475 | dev: false 476 | 477 | /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 478 | resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} 479 | peerDependencies: 480 | '@types/react': '*' 481 | '@types/react-dom': '*' 482 | react: ^16.8 || ^17.0 || ^18.0 483 | react-dom: ^16.8 || ^17.0 || ^18.0 484 | peerDependenciesMeta: 485 | '@types/react': 486 | optional: true 487 | '@types/react-dom': 488 | optional: true 489 | dependencies: 490 | '@babel/runtime': 7.23.9 491 | '@radix-ui/primitive': 1.0.1 492 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 493 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 494 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) 495 | '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 496 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 497 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) 498 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 499 | '@types/react': 18.2.74 500 | '@types/react-dom': 18.2.23 501 | react: 18.2.0 502 | react-dom: 18.2.0(react@18.2.0) 503 | dev: false 504 | 505 | /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 506 | resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} 507 | peerDependencies: 508 | '@types/react': '*' 509 | '@types/react-dom': '*' 510 | react: ^16.8 || ^17.0 || ^18.0 511 | react-dom: ^16.8 || ^17.0 || ^18.0 512 | peerDependenciesMeta: 513 | '@types/react': 514 | optional: true 515 | '@types/react-dom': 516 | optional: true 517 | dependencies: 518 | '@babel/runtime': 7.23.9 519 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 520 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 521 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 522 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) 523 | '@types/react': 18.2.74 524 | '@types/react-dom': 18.2.23 525 | react: 18.2.0 526 | react-dom: 18.2.0(react@18.2.0) 527 | dev: false 528 | 529 | /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.74)(react@18.2.0): 530 | resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} 531 | peerDependencies: 532 | '@types/react': '*' 533 | react: ^16.8 || ^17.0 || ^18.0 534 | peerDependenciesMeta: 535 | '@types/react': 536 | optional: true 537 | dependencies: 538 | '@babel/runtime': 7.23.9 539 | '@types/react': 18.2.74 540 | react: 18.2.0 541 | dev: false 542 | 543 | /@radix-ui/react-context@1.0.1(@types/react@18.2.74)(react@18.2.0): 544 | resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 545 | peerDependencies: 546 | '@types/react': '*' 547 | react: ^16.8 || ^17.0 || ^18.0 548 | peerDependenciesMeta: 549 | '@types/react': 550 | optional: true 551 | dependencies: 552 | '@babel/runtime': 7.23.9 553 | '@types/react': 18.2.74 554 | react: 18.2.0 555 | dev: false 556 | 557 | /@radix-ui/react-direction@1.0.1(@types/react@18.2.74)(react@18.2.0): 558 | resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} 559 | peerDependencies: 560 | '@types/react': '*' 561 | react: ^16.8 || ^17.0 || ^18.0 562 | peerDependenciesMeta: 563 | '@types/react': 564 | optional: true 565 | dependencies: 566 | '@babel/runtime': 7.23.9 567 | '@types/react': 18.2.74 568 | react: 18.2.0 569 | dev: false 570 | 571 | /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 572 | resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} 573 | peerDependencies: 574 | '@types/react': '*' 575 | '@types/react-dom': '*' 576 | react: ^16.8 || ^17.0 || ^18.0 577 | react-dom: ^16.8 || ^17.0 || ^18.0 578 | peerDependenciesMeta: 579 | '@types/react': 580 | optional: true 581 | '@types/react-dom': 582 | optional: true 583 | dependencies: 584 | '@babel/runtime': 7.23.9 585 | '@radix-ui/primitive': 1.0.1 586 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 587 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 588 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 589 | '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.74)(react@18.2.0) 590 | '@types/react': 18.2.74 591 | '@types/react-dom': 18.2.23 592 | react: 18.2.0 593 | react-dom: 18.2.0(react@18.2.0) 594 | dev: false 595 | 596 | /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 597 | resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} 598 | peerDependencies: 599 | '@types/react': '*' 600 | '@types/react-dom': '*' 601 | react: ^16.8 || ^17.0 || ^18.0 602 | react-dom: ^16.8 || ^17.0 || ^18.0 603 | peerDependenciesMeta: 604 | '@types/react': 605 | optional: true 606 | '@types/react-dom': 607 | optional: true 608 | dependencies: 609 | '@babel/runtime': 7.23.9 610 | '@radix-ui/primitive': 1.0.1 611 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 612 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 613 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) 614 | '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 615 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 616 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) 617 | '@types/react': 18.2.74 618 | '@types/react-dom': 18.2.23 619 | react: 18.2.0 620 | react-dom: 18.2.0(react@18.2.0) 621 | dev: false 622 | 623 | /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.74)(react@18.2.0): 624 | resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} 625 | peerDependencies: 626 | '@types/react': '*' 627 | react: ^16.8 || ^17.0 || ^18.0 628 | peerDependenciesMeta: 629 | '@types/react': 630 | optional: true 631 | dependencies: 632 | '@babel/runtime': 7.23.9 633 | '@types/react': 18.2.74 634 | react: 18.2.0 635 | dev: false 636 | 637 | /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 638 | resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} 639 | peerDependencies: 640 | '@types/react': '*' 641 | '@types/react-dom': '*' 642 | react: ^16.8 || ^17.0 || ^18.0 643 | react-dom: ^16.8 || ^17.0 || ^18.0 644 | peerDependenciesMeta: 645 | '@types/react': 646 | optional: true 647 | '@types/react-dom': 648 | optional: true 649 | dependencies: 650 | '@babel/runtime': 7.23.9 651 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 652 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 653 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 654 | '@types/react': 18.2.74 655 | '@types/react-dom': 18.2.23 656 | react: 18.2.0 657 | react-dom: 18.2.0(react@18.2.0) 658 | dev: false 659 | 660 | /@radix-ui/react-id@1.0.1(@types/react@18.2.74)(react@18.2.0): 661 | resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} 662 | peerDependencies: 663 | '@types/react': '*' 664 | react: ^16.8 || ^17.0 || ^18.0 665 | peerDependenciesMeta: 666 | '@types/react': 667 | optional: true 668 | dependencies: 669 | '@babel/runtime': 7.23.9 670 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 671 | '@types/react': 18.2.74 672 | react: 18.2.0 673 | dev: false 674 | 675 | /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 676 | resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} 677 | peerDependencies: 678 | '@types/react': '*' 679 | '@types/react-dom': '*' 680 | react: ^16.8 || ^17.0 || ^18.0 681 | react-dom: ^16.8 || ^17.0 || ^18.0 682 | peerDependenciesMeta: 683 | '@types/react': 684 | optional: true 685 | '@types/react-dom': 686 | optional: true 687 | dependencies: 688 | '@babel/runtime': 7.23.9 689 | '@radix-ui/primitive': 1.0.1 690 | '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 691 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 692 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 693 | '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) 694 | '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 695 | '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.74)(react@18.2.0) 696 | '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 697 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) 698 | '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 699 | '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 700 | '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 701 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 702 | '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 703 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) 704 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 705 | '@types/react': 18.2.74 706 | '@types/react-dom': 18.2.23 707 | aria-hidden: 1.2.3 708 | react: 18.2.0 709 | react-dom: 18.2.0(react@18.2.0) 710 | react-remove-scroll: 2.5.5(@types/react@18.2.74)(react@18.2.0) 711 | dev: false 712 | 713 | /@radix-ui/react-navigation-menu@1.1.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 714 | resolution: {integrity: sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA==} 715 | peerDependencies: 716 | '@types/react': '*' 717 | '@types/react-dom': '*' 718 | react: ^16.8 || ^17.0 || ^18.0 719 | react-dom: ^16.8 || ^17.0 || ^18.0 720 | peerDependenciesMeta: 721 | '@types/react': 722 | optional: true 723 | '@types/react-dom': 724 | optional: true 725 | dependencies: 726 | '@babel/runtime': 7.23.9 727 | '@radix-ui/primitive': 1.0.1 728 | '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 729 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 730 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 731 | '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) 732 | '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 733 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) 734 | '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 735 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 736 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 737 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) 738 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 739 | '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.74)(react@18.2.0) 740 | '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 741 | '@types/react': 18.2.74 742 | '@types/react-dom': 18.2.23 743 | react: 18.2.0 744 | react-dom: 18.2.0(react@18.2.0) 745 | dev: false 746 | 747 | /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 748 | resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} 749 | peerDependencies: 750 | '@types/react': '*' 751 | '@types/react-dom': '*' 752 | react: ^16.8 || ^17.0 || ^18.0 753 | react-dom: ^16.8 || ^17.0 || ^18.0 754 | peerDependenciesMeta: 755 | '@types/react': 756 | optional: true 757 | '@types/react-dom': 758 | optional: true 759 | dependencies: 760 | '@babel/runtime': 7.23.9 761 | '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) 762 | '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 763 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 764 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 765 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 766 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 767 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 768 | '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 769 | '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.74)(react@18.2.0) 770 | '@radix-ui/rect': 1.0.1 771 | '@types/react': 18.2.74 772 | '@types/react-dom': 18.2.23 773 | react: 18.2.0 774 | react-dom: 18.2.0(react@18.2.0) 775 | dev: false 776 | 777 | /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 778 | resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} 779 | peerDependencies: 780 | '@types/react': '*' 781 | '@types/react-dom': '*' 782 | react: ^16.8 || ^17.0 || ^18.0 783 | react-dom: ^16.8 || ^17.0 || ^18.0 784 | peerDependenciesMeta: 785 | '@types/react': 786 | optional: true 787 | '@types/react-dom': 788 | optional: true 789 | dependencies: 790 | '@babel/runtime': 7.23.9 791 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 792 | '@types/react': 18.2.74 793 | '@types/react-dom': 18.2.23 794 | react: 18.2.0 795 | react-dom: 18.2.0(react@18.2.0) 796 | dev: false 797 | 798 | /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 799 | resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} 800 | peerDependencies: 801 | '@types/react': '*' 802 | '@types/react-dom': '*' 803 | react: ^16.8 || ^17.0 || ^18.0 804 | react-dom: ^16.8 || ^17.0 || ^18.0 805 | peerDependenciesMeta: 806 | '@types/react': 807 | optional: true 808 | '@types/react-dom': 809 | optional: true 810 | dependencies: 811 | '@babel/runtime': 7.23.9 812 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 813 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 814 | '@types/react': 18.2.74 815 | '@types/react-dom': 18.2.23 816 | react: 18.2.0 817 | react-dom: 18.2.0(react@18.2.0) 818 | dev: false 819 | 820 | /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 821 | resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 822 | peerDependencies: 823 | '@types/react': '*' 824 | '@types/react-dom': '*' 825 | react: ^16.8 || ^17.0 || ^18.0 826 | react-dom: ^16.8 || ^17.0 || ^18.0 827 | peerDependenciesMeta: 828 | '@types/react': 829 | optional: true 830 | '@types/react-dom': 831 | optional: true 832 | dependencies: 833 | '@babel/runtime': 7.23.9 834 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.74)(react@18.2.0) 835 | '@types/react': 18.2.74 836 | '@types/react-dom': 18.2.23 837 | react: 18.2.0 838 | react-dom: 18.2.0(react@18.2.0) 839 | dev: false 840 | 841 | /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 842 | resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} 843 | peerDependencies: 844 | '@types/react': '*' 845 | '@types/react-dom': '*' 846 | react: ^16.8 || ^17.0 || ^18.0 847 | react-dom: ^16.8 || ^17.0 || ^18.0 848 | peerDependenciesMeta: 849 | '@types/react': 850 | optional: true 851 | '@types/react-dom': 852 | optional: true 853 | dependencies: 854 | '@babel/runtime': 7.23.9 855 | '@radix-ui/primitive': 1.0.1 856 | '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 857 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 858 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.74)(react@18.2.0) 859 | '@radix-ui/react-direction': 1.0.1(@types/react@18.2.74)(react@18.2.0) 860 | '@radix-ui/react-id': 1.0.1(@types/react@18.2.74)(react@18.2.0) 861 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 862 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 863 | '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.74)(react@18.2.0) 864 | '@types/react': 18.2.74 865 | '@types/react-dom': 18.2.23 866 | react: 18.2.0 867 | react-dom: 18.2.0(react@18.2.0) 868 | dev: false 869 | 870 | /@radix-ui/react-slot@1.0.2(@types/react@18.2.74)(react@18.2.0): 871 | resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 872 | peerDependencies: 873 | '@types/react': '*' 874 | react: ^16.8 || ^17.0 || ^18.0 875 | peerDependenciesMeta: 876 | '@types/react': 877 | optional: true 878 | dependencies: 879 | '@babel/runtime': 7.23.9 880 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.74)(react@18.2.0) 881 | '@types/react': 18.2.74 882 | react: 18.2.0 883 | dev: false 884 | 885 | /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.74)(react@18.2.0): 886 | resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 887 | peerDependencies: 888 | '@types/react': '*' 889 | react: ^16.8 || ^17.0 || ^18.0 890 | peerDependenciesMeta: 891 | '@types/react': 892 | optional: true 893 | dependencies: 894 | '@babel/runtime': 7.23.9 895 | '@types/react': 18.2.74 896 | react: 18.2.0 897 | dev: false 898 | 899 | /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.74)(react@18.2.0): 900 | resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} 901 | peerDependencies: 902 | '@types/react': '*' 903 | react: ^16.8 || ^17.0 || ^18.0 904 | peerDependenciesMeta: 905 | '@types/react': 906 | optional: true 907 | dependencies: 908 | '@babel/runtime': 7.23.9 909 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 910 | '@types/react': 18.2.74 911 | react: 18.2.0 912 | dev: false 913 | 914 | /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.74)(react@18.2.0): 915 | resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} 916 | peerDependencies: 917 | '@types/react': '*' 918 | react: ^16.8 || ^17.0 || ^18.0 919 | peerDependenciesMeta: 920 | '@types/react': 921 | optional: true 922 | dependencies: 923 | '@babel/runtime': 7.23.9 924 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.74)(react@18.2.0) 925 | '@types/react': 18.2.74 926 | react: 18.2.0 927 | dev: false 928 | 929 | /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.74)(react@18.2.0): 930 | resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} 931 | peerDependencies: 932 | '@types/react': '*' 933 | react: ^16.8 || ^17.0 || ^18.0 934 | peerDependenciesMeta: 935 | '@types/react': 936 | optional: true 937 | dependencies: 938 | '@babel/runtime': 7.23.9 939 | '@types/react': 18.2.74 940 | react: 18.2.0 941 | dev: false 942 | 943 | /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.74)(react@18.2.0): 944 | resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} 945 | peerDependencies: 946 | '@types/react': '*' 947 | react: ^16.8 || ^17.0 || ^18.0 948 | peerDependenciesMeta: 949 | '@types/react': 950 | optional: true 951 | dependencies: 952 | '@babel/runtime': 7.23.9 953 | '@types/react': 18.2.74 954 | react: 18.2.0 955 | dev: false 956 | 957 | /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.74)(react@18.2.0): 958 | resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} 959 | peerDependencies: 960 | '@types/react': '*' 961 | react: ^16.8 || ^17.0 || ^18.0 962 | peerDependenciesMeta: 963 | '@types/react': 964 | optional: true 965 | dependencies: 966 | '@babel/runtime': 7.23.9 967 | '@radix-ui/rect': 1.0.1 968 | '@types/react': 18.2.74 969 | react: 18.2.0 970 | dev: false 971 | 972 | /@radix-ui/react-use-size@1.0.1(@types/react@18.2.74)(react@18.2.0): 973 | resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} 974 | peerDependencies: 975 | '@types/react': '*' 976 | react: ^16.8 || ^17.0 || ^18.0 977 | peerDependenciesMeta: 978 | '@types/react': 979 | optional: true 980 | dependencies: 981 | '@babel/runtime': 7.23.9 982 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.74)(react@18.2.0) 983 | '@types/react': 18.2.74 984 | react: 18.2.0 985 | dev: false 986 | 987 | /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0): 988 | resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} 989 | peerDependencies: 990 | '@types/react': '*' 991 | '@types/react-dom': '*' 992 | react: ^16.8 || ^17.0 || ^18.0 993 | react-dom: ^16.8 || ^17.0 || ^18.0 994 | peerDependenciesMeta: 995 | '@types/react': 996 | optional: true 997 | '@types/react-dom': 998 | optional: true 999 | dependencies: 1000 | '@babel/runtime': 7.23.9 1001 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.23)(@types/react@18.2.74)(react-dom@18.2.0)(react@18.2.0) 1002 | '@types/react': 18.2.74 1003 | '@types/react-dom': 18.2.23 1004 | react: 18.2.0 1005 | react-dom: 18.2.0(react@18.2.0) 1006 | dev: false 1007 | 1008 | /@radix-ui/rect@1.0.1: 1009 | resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} 1010 | dependencies: 1011 | '@babel/runtime': 7.23.9 1012 | dev: false 1013 | 1014 | /@swc/counter@0.1.3: 1015 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 1016 | dev: false 1017 | 1018 | /@swc/helpers@0.5.5: 1019 | resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} 1020 | dependencies: 1021 | '@swc/counter': 0.1.3 1022 | tslib: 2.6.2 1023 | dev: false 1024 | 1025 | /@types/cookie@0.6.0: 1026 | resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} 1027 | dev: false 1028 | 1029 | /@types/node@20.12.3: 1030 | resolution: {integrity: sha512-sD+ia2ubTeWrOu+YMF+MTAB7E+O7qsMqAbMfW7DG3K1URwhZ5hN1pLlRVGbf4wDFzSfikL05M17EyorS86jShw==} 1031 | dependencies: 1032 | undici-types: 5.26.5 1033 | 1034 | /@types/pg@8.6.6: 1035 | resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} 1036 | dependencies: 1037 | '@types/node': 20.12.3 1038 | pg-protocol: 1.6.0 1039 | pg-types: 2.2.0 1040 | dev: false 1041 | 1042 | /@types/prop-types@15.7.11: 1043 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 1044 | 1045 | /@types/react-dom@18.2.23: 1046 | resolution: {integrity: sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==} 1047 | dependencies: 1048 | '@types/react': 18.2.74 1049 | 1050 | /@types/react@18.2.74: 1051 | resolution: {integrity: sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==} 1052 | dependencies: 1053 | '@types/prop-types': 15.7.11 1054 | csstype: 3.1.3 1055 | 1056 | /ansi-regex@5.0.1: 1057 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1058 | engines: {node: '>=8'} 1059 | dev: true 1060 | 1061 | /ansi-regex@6.0.1: 1062 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 1063 | engines: {node: '>=12'} 1064 | dev: true 1065 | 1066 | /ansi-styles@4.3.0: 1067 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1068 | engines: {node: '>=8'} 1069 | dependencies: 1070 | color-convert: 2.0.1 1071 | dev: true 1072 | 1073 | /ansi-styles@6.2.1: 1074 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 1075 | engines: {node: '>=12'} 1076 | dev: true 1077 | 1078 | /any-promise@1.3.0: 1079 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 1080 | dev: true 1081 | 1082 | /anymatch@3.1.3: 1083 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1084 | engines: {node: '>= 8'} 1085 | dependencies: 1086 | normalize-path: 3.0.0 1087 | picomatch: 2.3.1 1088 | dev: true 1089 | 1090 | /arg@5.0.2: 1091 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 1092 | dev: true 1093 | 1094 | /aria-hidden@1.2.3: 1095 | resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} 1096 | engines: {node: '>=10'} 1097 | dependencies: 1098 | tslib: 2.6.2 1099 | dev: false 1100 | 1101 | /autoprefixer@10.4.19(postcss@8.4.38): 1102 | resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} 1103 | engines: {node: ^10 || ^12 || >=14} 1104 | hasBin: true 1105 | peerDependencies: 1106 | postcss: ^8.1.0 1107 | dependencies: 1108 | browserslist: 4.23.0 1109 | caniuse-lite: 1.0.30001605 1110 | fraction.js: 4.3.7 1111 | normalize-range: 0.1.2 1112 | picocolors: 1.0.0 1113 | postcss: 8.4.38 1114 | postcss-value-parser: 4.2.0 1115 | dev: true 1116 | 1117 | /balanced-match@1.0.2: 1118 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1119 | dev: true 1120 | 1121 | /binary-extensions@2.2.0: 1122 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1123 | engines: {node: '>=8'} 1124 | dev: true 1125 | 1126 | /brace-expansion@2.0.1: 1127 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1128 | dependencies: 1129 | balanced-match: 1.0.2 1130 | dev: true 1131 | 1132 | /braces@3.0.2: 1133 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1134 | engines: {node: '>=8'} 1135 | dependencies: 1136 | fill-range: 7.0.1 1137 | dev: true 1138 | 1139 | /browserslist@4.23.0: 1140 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 1141 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1142 | hasBin: true 1143 | dependencies: 1144 | caniuse-lite: 1.0.30001605 1145 | electron-to-chromium: 1.4.679 1146 | node-releases: 2.0.14 1147 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 1148 | dev: true 1149 | 1150 | /busboy@1.6.0: 1151 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 1152 | engines: {node: '>=10.16.0'} 1153 | dependencies: 1154 | streamsearch: 1.1.0 1155 | dev: false 1156 | 1157 | /camelcase-css@2.0.1: 1158 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 1159 | engines: {node: '>= 6'} 1160 | dev: true 1161 | 1162 | /caniuse-lite@1.0.30001605: 1163 | resolution: {integrity: sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==} 1164 | 1165 | /chokidar@3.6.0: 1166 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 1167 | engines: {node: '>= 8.10.0'} 1168 | dependencies: 1169 | anymatch: 3.1.3 1170 | braces: 3.0.2 1171 | glob-parent: 5.1.2 1172 | is-binary-path: 2.1.0 1173 | is-glob: 4.0.3 1174 | normalize-path: 3.0.0 1175 | readdirp: 3.6.0 1176 | optionalDependencies: 1177 | fsevents: 2.3.3 1178 | dev: true 1179 | 1180 | /class-variance-authority@0.7.0: 1181 | resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 1182 | dependencies: 1183 | clsx: 2.0.0 1184 | dev: false 1185 | 1186 | /client-only@0.0.1: 1187 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 1188 | dev: false 1189 | 1190 | /clsx@2.0.0: 1191 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 1192 | engines: {node: '>=6'} 1193 | dev: false 1194 | 1195 | /clsx@2.1.0: 1196 | resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} 1197 | engines: {node: '>=6'} 1198 | dev: false 1199 | 1200 | /color-convert@2.0.1: 1201 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1202 | engines: {node: '>=7.0.0'} 1203 | dependencies: 1204 | color-name: 1.1.4 1205 | dev: true 1206 | 1207 | /color-name@1.1.4: 1208 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1209 | dev: true 1210 | 1211 | /commander@4.1.1: 1212 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1213 | engines: {node: '>= 6'} 1214 | dev: true 1215 | 1216 | /cookie@0.6.0: 1217 | resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} 1218 | engines: {node: '>= 0.6'} 1219 | dev: false 1220 | 1221 | /cross-spawn@7.0.3: 1222 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1223 | engines: {node: '>= 8'} 1224 | dependencies: 1225 | path-key: 3.1.1 1226 | shebang-command: 2.0.0 1227 | which: 2.0.2 1228 | dev: true 1229 | 1230 | /cssesc@3.0.0: 1231 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 1232 | engines: {node: '>=4'} 1233 | hasBin: true 1234 | dev: true 1235 | 1236 | /csstype@3.1.3: 1237 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1238 | 1239 | /detect-node-es@1.1.0: 1240 | resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} 1241 | dev: false 1242 | 1243 | /didyoumean@1.2.2: 1244 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 1245 | dev: true 1246 | 1247 | /dlv@1.1.3: 1248 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 1249 | dev: true 1250 | 1251 | /eastasianwidth@0.2.0: 1252 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 1253 | dev: true 1254 | 1255 | /electron-to-chromium@1.4.679: 1256 | resolution: {integrity: sha512-NhQMsz5k0d6m9z3qAxnsOR/ebal4NAGsrNVRwcDo4Kc/zQ7KdsTKZUxZoygHcVRb0QDW3waEDIcE3isZ79RP6g==} 1257 | dev: true 1258 | 1259 | /emoji-regex@8.0.0: 1260 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1261 | dev: true 1262 | 1263 | /emoji-regex@9.2.2: 1264 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 1265 | dev: true 1266 | 1267 | /escalade@3.1.2: 1268 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 1269 | engines: {node: '>=6'} 1270 | dev: true 1271 | 1272 | /fast-glob@3.3.2: 1273 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1274 | engines: {node: '>=8.6.0'} 1275 | dependencies: 1276 | '@nodelib/fs.stat': 2.0.5 1277 | '@nodelib/fs.walk': 1.2.8 1278 | glob-parent: 5.1.2 1279 | merge2: 1.4.1 1280 | micromatch: 4.0.5 1281 | dev: true 1282 | 1283 | /fastq@1.17.1: 1284 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1285 | dependencies: 1286 | reusify: 1.0.4 1287 | dev: true 1288 | 1289 | /fill-range@7.0.1: 1290 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1291 | engines: {node: '>=8'} 1292 | dependencies: 1293 | to-regex-range: 5.0.1 1294 | dev: true 1295 | 1296 | /foreground-child@3.1.1: 1297 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1298 | engines: {node: '>=14'} 1299 | dependencies: 1300 | cross-spawn: 7.0.3 1301 | signal-exit: 4.1.0 1302 | dev: true 1303 | 1304 | /fraction.js@4.3.7: 1305 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1306 | dev: true 1307 | 1308 | /fsevents@2.3.3: 1309 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1310 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1311 | os: [darwin] 1312 | requiresBuild: true 1313 | dev: true 1314 | optional: true 1315 | 1316 | /function-bind@1.1.2: 1317 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1318 | dev: true 1319 | 1320 | /get-nonce@1.0.1: 1321 | resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} 1322 | engines: {node: '>=6'} 1323 | dev: false 1324 | 1325 | /glob-parent@5.1.2: 1326 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1327 | engines: {node: '>= 6'} 1328 | dependencies: 1329 | is-glob: 4.0.3 1330 | dev: true 1331 | 1332 | /glob-parent@6.0.2: 1333 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1334 | engines: {node: '>=10.13.0'} 1335 | dependencies: 1336 | is-glob: 4.0.3 1337 | dev: true 1338 | 1339 | /glob@10.3.10: 1340 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1341 | engines: {node: '>=16 || 14 >=14.17'} 1342 | hasBin: true 1343 | dependencies: 1344 | foreground-child: 3.1.1 1345 | jackspeak: 2.3.6 1346 | minimatch: 9.0.3 1347 | minipass: 7.0.4 1348 | path-scurry: 1.10.1 1349 | dev: true 1350 | 1351 | /graceful-fs@4.2.11: 1352 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1353 | dev: false 1354 | 1355 | /hasown@2.0.1: 1356 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} 1357 | engines: {node: '>= 0.4'} 1358 | dependencies: 1359 | function-bind: 1.1.2 1360 | dev: true 1361 | 1362 | /invariant@2.2.4: 1363 | resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} 1364 | dependencies: 1365 | loose-envify: 1.4.0 1366 | dev: false 1367 | 1368 | /is-binary-path@2.1.0: 1369 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1370 | engines: {node: '>=8'} 1371 | dependencies: 1372 | binary-extensions: 2.2.0 1373 | dev: true 1374 | 1375 | /is-core-module@2.13.1: 1376 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1377 | dependencies: 1378 | hasown: 2.0.1 1379 | dev: true 1380 | 1381 | /is-extglob@2.1.1: 1382 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1383 | engines: {node: '>=0.10.0'} 1384 | dev: true 1385 | 1386 | /is-fullwidth-code-point@3.0.0: 1387 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1388 | engines: {node: '>=8'} 1389 | dev: true 1390 | 1391 | /is-glob@4.0.3: 1392 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1393 | engines: {node: '>=0.10.0'} 1394 | dependencies: 1395 | is-extglob: 2.1.1 1396 | dev: true 1397 | 1398 | /is-number@7.0.0: 1399 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1400 | engines: {node: '>=0.12.0'} 1401 | dev: true 1402 | 1403 | /isexe@2.0.0: 1404 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1405 | dev: true 1406 | 1407 | /jackspeak@2.3.6: 1408 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1409 | engines: {node: '>=14'} 1410 | dependencies: 1411 | '@isaacs/cliui': 8.0.2 1412 | optionalDependencies: 1413 | '@pkgjs/parseargs': 0.11.0 1414 | dev: true 1415 | 1416 | /jiti@1.21.0: 1417 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1418 | hasBin: true 1419 | dev: true 1420 | 1421 | /jose@5.2.2: 1422 | resolution: {integrity: sha512-/WByRr4jDcsKlvMd1dRJnPfS1GVO3WuKyaurJ/vvXcOaUQO8rnNObCQMlv/5uCceVQIq5Q4WLF44ohsdiTohdg==} 1423 | dev: false 1424 | 1425 | /js-tokens@4.0.0: 1426 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1427 | dev: false 1428 | 1429 | /lilconfig@2.1.0: 1430 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1431 | engines: {node: '>=10'} 1432 | dev: true 1433 | 1434 | /lilconfig@3.1.1: 1435 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1436 | engines: {node: '>=14'} 1437 | dev: true 1438 | 1439 | /lines-and-columns@1.2.4: 1440 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1441 | dev: true 1442 | 1443 | /loose-envify@1.4.0: 1444 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1445 | hasBin: true 1446 | dependencies: 1447 | js-tokens: 4.0.0 1448 | dev: false 1449 | 1450 | /lru-cache@10.2.0: 1451 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1452 | engines: {node: 14 || >=16.14} 1453 | dev: true 1454 | 1455 | /lucide-react@0.364.0(react@18.2.0): 1456 | resolution: {integrity: sha512-eHfdbJExWtTaZ0tBMGtI7PA/MbqV5wt+o4/yitDce17tadH/75Gq3Tq8jSteb3LhLr0eay/j5YUuN4yXjnI3aw==} 1457 | peerDependencies: 1458 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 1459 | dependencies: 1460 | react: 18.2.0 1461 | dev: false 1462 | 1463 | /merge2@1.4.1: 1464 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1465 | engines: {node: '>= 8'} 1466 | dev: true 1467 | 1468 | /micromatch@4.0.5: 1469 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1470 | engines: {node: '>=8.6'} 1471 | dependencies: 1472 | braces: 3.0.2 1473 | picomatch: 2.3.1 1474 | dev: true 1475 | 1476 | /minimatch@9.0.3: 1477 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1478 | engines: {node: '>=16 || 14 >=14.17'} 1479 | dependencies: 1480 | brace-expansion: 2.0.1 1481 | dev: true 1482 | 1483 | /minipass@7.0.4: 1484 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1485 | engines: {node: '>=16 || 14 >=14.17'} 1486 | dev: true 1487 | 1488 | /mz@2.7.0: 1489 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1490 | dependencies: 1491 | any-promise: 1.3.0 1492 | object-assign: 4.1.1 1493 | thenify-all: 1.6.0 1494 | dev: true 1495 | 1496 | /nanoid@3.3.7: 1497 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1498 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1499 | hasBin: true 1500 | 1501 | /next-auth@5.0.0-beta.16(next@14.2.0-canary.56)(react@18.2.0): 1502 | resolution: {integrity: sha512-dX2snB+ezN23tFzSes3n3uosT9iBf0eILPYWH/R2fd9n3ZzdMQlRzq7JIOPeS1aLc84IuRlyuyXyx9XmmZB6og==} 1503 | peerDependencies: 1504 | '@simplewebauthn/browser': ^9.0.1 1505 | '@simplewebauthn/server': ^9.0.2 1506 | next: ^14 1507 | nodemailer: ^6.6.5 1508 | react: ^18.2.0 1509 | peerDependenciesMeta: 1510 | '@simplewebauthn/browser': 1511 | optional: true 1512 | '@simplewebauthn/server': 1513 | optional: true 1514 | nodemailer: 1515 | optional: true 1516 | dependencies: 1517 | '@auth/core': 0.28.1 1518 | next: 14.2.0-canary.56(react-dom@18.2.0)(react@18.2.0) 1519 | react: 18.2.0 1520 | dev: false 1521 | 1522 | /next@14.2.0-canary.56(react-dom@18.2.0)(react@18.2.0): 1523 | resolution: {integrity: sha512-o5/GGmNwGY3y3At/K9Y/9Vmuhjk7lwXPh7W/feePYeqpYu7/jp47NDg+EKczNj3ueOdKPFJr2kiwYfD3rT2RBQ==} 1524 | engines: {node: '>=18.17.0'} 1525 | hasBin: true 1526 | peerDependencies: 1527 | '@opentelemetry/api': ^1.1.0 1528 | '@playwright/test': ^1.41.2 1529 | react: ^18.2.0 1530 | react-dom: ^18.2.0 1531 | sass: ^1.3.0 1532 | peerDependenciesMeta: 1533 | '@opentelemetry/api': 1534 | optional: true 1535 | '@playwright/test': 1536 | optional: true 1537 | sass: 1538 | optional: true 1539 | dependencies: 1540 | '@next/env': 14.2.0-canary.56 1541 | '@swc/helpers': 0.5.5 1542 | busboy: 1.6.0 1543 | caniuse-lite: 1.0.30001605 1544 | graceful-fs: 4.2.11 1545 | postcss: 8.4.31 1546 | react: 18.2.0 1547 | react-dom: 18.2.0(react@18.2.0) 1548 | styled-jsx: 5.1.1(react@18.2.0) 1549 | optionalDependencies: 1550 | '@next/swc-darwin-arm64': 14.2.0-canary.56 1551 | '@next/swc-darwin-x64': 14.2.0-canary.56 1552 | '@next/swc-linux-arm64-gnu': 14.2.0-canary.56 1553 | '@next/swc-linux-arm64-musl': 14.2.0-canary.56 1554 | '@next/swc-linux-x64-gnu': 14.2.0-canary.56 1555 | '@next/swc-linux-x64-musl': 14.2.0-canary.56 1556 | '@next/swc-win32-arm64-msvc': 14.2.0-canary.56 1557 | '@next/swc-win32-ia32-msvc': 14.2.0-canary.56 1558 | '@next/swc-win32-x64-msvc': 14.2.0-canary.56 1559 | transitivePeerDependencies: 1560 | - '@babel/core' 1561 | - babel-plugin-macros 1562 | dev: false 1563 | 1564 | /node-releases@2.0.14: 1565 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1566 | dev: true 1567 | 1568 | /normalize-path@3.0.0: 1569 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1570 | engines: {node: '>=0.10.0'} 1571 | dev: true 1572 | 1573 | /normalize-range@0.1.2: 1574 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1575 | engines: {node: '>=0.10.0'} 1576 | dev: true 1577 | 1578 | /oauth4webapi@2.10.3: 1579 | resolution: {integrity: sha512-9FkXEXfzVKzH63GUOZz1zMr3wBaICSzk6DLXx+CGdrQ10ItNk2ePWzYYc1fdmKq1ayGFb2aX97sRCoZ2s0mkDw==} 1580 | dev: false 1581 | 1582 | /object-assign@4.1.1: 1583 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1584 | engines: {node: '>=0.10.0'} 1585 | dev: true 1586 | 1587 | /object-hash@3.0.0: 1588 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1589 | engines: {node: '>= 6'} 1590 | dev: true 1591 | 1592 | /path-key@3.1.1: 1593 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1594 | engines: {node: '>=8'} 1595 | dev: true 1596 | 1597 | /path-parse@1.0.7: 1598 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1599 | dev: true 1600 | 1601 | /path-scurry@1.10.1: 1602 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1603 | engines: {node: '>=16 || 14 >=14.17'} 1604 | dependencies: 1605 | lru-cache: 10.2.0 1606 | minipass: 7.0.4 1607 | dev: true 1608 | 1609 | /pg-int8@1.0.1: 1610 | resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} 1611 | engines: {node: '>=4.0.0'} 1612 | dev: false 1613 | 1614 | /pg-protocol@1.6.0: 1615 | resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} 1616 | dev: false 1617 | 1618 | /pg-types@2.2.0: 1619 | resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} 1620 | engines: {node: '>=4'} 1621 | dependencies: 1622 | pg-int8: 1.0.1 1623 | postgres-array: 2.0.0 1624 | postgres-bytea: 1.0.0 1625 | postgres-date: 1.0.7 1626 | postgres-interval: 1.2.0 1627 | dev: false 1628 | 1629 | /picocolors@1.0.0: 1630 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1631 | 1632 | /picomatch@2.3.1: 1633 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1634 | engines: {node: '>=8.6'} 1635 | dev: true 1636 | 1637 | /pify@2.3.0: 1638 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1639 | engines: {node: '>=0.10.0'} 1640 | dev: true 1641 | 1642 | /pirates@4.0.6: 1643 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1644 | engines: {node: '>= 6'} 1645 | dev: true 1646 | 1647 | /postcss-import@15.1.0(postcss@8.4.38): 1648 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1649 | engines: {node: '>=14.0.0'} 1650 | peerDependencies: 1651 | postcss: ^8.0.0 1652 | dependencies: 1653 | postcss: 8.4.38 1654 | postcss-value-parser: 4.2.0 1655 | read-cache: 1.0.0 1656 | resolve: 1.22.8 1657 | dev: true 1658 | 1659 | /postcss-js@4.0.1(postcss@8.4.38): 1660 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1661 | engines: {node: ^12 || ^14 || >= 16} 1662 | peerDependencies: 1663 | postcss: ^8.4.21 1664 | dependencies: 1665 | camelcase-css: 2.0.1 1666 | postcss: 8.4.38 1667 | dev: true 1668 | 1669 | /postcss-load-config@4.0.2(postcss@8.4.38): 1670 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1671 | engines: {node: '>= 14'} 1672 | peerDependencies: 1673 | postcss: '>=8.0.9' 1674 | ts-node: '>=9.0.0' 1675 | peerDependenciesMeta: 1676 | postcss: 1677 | optional: true 1678 | ts-node: 1679 | optional: true 1680 | dependencies: 1681 | lilconfig: 3.1.1 1682 | postcss: 8.4.38 1683 | yaml: 2.3.4 1684 | dev: true 1685 | 1686 | /postcss-nested@6.0.1(postcss@8.4.38): 1687 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1688 | engines: {node: '>=12.0'} 1689 | peerDependencies: 1690 | postcss: ^8.2.14 1691 | dependencies: 1692 | postcss: 8.4.38 1693 | postcss-selector-parser: 6.0.15 1694 | dev: true 1695 | 1696 | /postcss-selector-parser@6.0.15: 1697 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 1698 | engines: {node: '>=4'} 1699 | dependencies: 1700 | cssesc: 3.0.0 1701 | util-deprecate: 1.0.2 1702 | dev: true 1703 | 1704 | /postcss-value-parser@4.2.0: 1705 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1706 | dev: true 1707 | 1708 | /postcss@8.4.31: 1709 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1710 | engines: {node: ^10 || ^12 || >=14} 1711 | dependencies: 1712 | nanoid: 3.3.7 1713 | picocolors: 1.0.0 1714 | source-map-js: 1.2.0 1715 | dev: false 1716 | 1717 | /postcss@8.4.38: 1718 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 1719 | engines: {node: ^10 || ^12 || >=14} 1720 | dependencies: 1721 | nanoid: 3.3.7 1722 | picocolors: 1.0.0 1723 | source-map-js: 1.2.0 1724 | dev: true 1725 | 1726 | /postgres-array@2.0.0: 1727 | resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} 1728 | engines: {node: '>=4'} 1729 | dev: false 1730 | 1731 | /postgres-array@3.0.2: 1732 | resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} 1733 | engines: {node: '>=12'} 1734 | dev: false 1735 | 1736 | /postgres-bytea@1.0.0: 1737 | resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} 1738 | engines: {node: '>=0.10.0'} 1739 | dev: false 1740 | 1741 | /postgres-date@1.0.7: 1742 | resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} 1743 | engines: {node: '>=0.10.0'} 1744 | dev: false 1745 | 1746 | /postgres-interval@1.2.0: 1747 | resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} 1748 | engines: {node: '>=0.10.0'} 1749 | dependencies: 1750 | xtend: 4.0.2 1751 | dev: false 1752 | 1753 | /preact-render-to-string@5.2.3(preact@10.11.3): 1754 | resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} 1755 | peerDependencies: 1756 | preact: '>=10' 1757 | dependencies: 1758 | preact: 10.11.3 1759 | pretty-format: 3.8.0 1760 | dev: false 1761 | 1762 | /preact@10.11.3: 1763 | resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} 1764 | dev: false 1765 | 1766 | /prettier@3.2.5: 1767 | resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} 1768 | engines: {node: '>=14'} 1769 | hasBin: true 1770 | dev: true 1771 | 1772 | /pretty-format@3.8.0: 1773 | resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} 1774 | dev: false 1775 | 1776 | /prisma@5.12.0: 1777 | resolution: {integrity: sha512-zxw4WSIvpsyNbpv8r7Fxgm7nwTFVmD6wbN6VuH13lClOceSANDOMl4jO3oxE6VzhjxmnEJqOGZjON2T2UpmLag==} 1778 | engines: {node: '>=16.13'} 1779 | hasBin: true 1780 | requiresBuild: true 1781 | dependencies: 1782 | '@prisma/engines': 5.12.0 1783 | dev: false 1784 | 1785 | /queue-microtask@1.2.3: 1786 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1787 | dev: true 1788 | 1789 | /react-dom@18.2.0(react@18.2.0): 1790 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1791 | peerDependencies: 1792 | react: ^18.2.0 1793 | dependencies: 1794 | loose-envify: 1.4.0 1795 | react: 18.2.0 1796 | scheduler: 0.23.0 1797 | dev: false 1798 | 1799 | /react-remove-scroll-bar@2.3.5(@types/react@18.2.74)(react@18.2.0): 1800 | resolution: {integrity: sha512-3cqjOqg6s0XbOjWvmasmqHch+RLxIEk2r/70rzGXuz3iIGQsQheEQyqYCBb5EECoD01Vo2SIbDqW4paLeLTASw==} 1801 | engines: {node: '>=10'} 1802 | peerDependencies: 1803 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1804 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1805 | peerDependenciesMeta: 1806 | '@types/react': 1807 | optional: true 1808 | dependencies: 1809 | '@types/react': 18.2.74 1810 | react: 18.2.0 1811 | react-style-singleton: 2.2.1(@types/react@18.2.74)(react@18.2.0) 1812 | tslib: 2.6.2 1813 | dev: false 1814 | 1815 | /react-remove-scroll@2.5.5(@types/react@18.2.74)(react@18.2.0): 1816 | resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} 1817 | engines: {node: '>=10'} 1818 | peerDependencies: 1819 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1820 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1821 | peerDependenciesMeta: 1822 | '@types/react': 1823 | optional: true 1824 | dependencies: 1825 | '@types/react': 18.2.74 1826 | react: 18.2.0 1827 | react-remove-scroll-bar: 2.3.5(@types/react@18.2.74)(react@18.2.0) 1828 | react-style-singleton: 2.2.1(@types/react@18.2.74)(react@18.2.0) 1829 | tslib: 2.6.2 1830 | use-callback-ref: 1.3.1(@types/react@18.2.74)(react@18.2.0) 1831 | use-sidecar: 1.1.2(@types/react@18.2.74)(react@18.2.0) 1832 | dev: false 1833 | 1834 | /react-style-singleton@2.2.1(@types/react@18.2.74)(react@18.2.0): 1835 | resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} 1836 | engines: {node: '>=10'} 1837 | peerDependencies: 1838 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 1839 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 1840 | peerDependenciesMeta: 1841 | '@types/react': 1842 | optional: true 1843 | dependencies: 1844 | '@types/react': 18.2.74 1845 | get-nonce: 1.0.1 1846 | invariant: 2.2.4 1847 | react: 18.2.0 1848 | tslib: 2.6.2 1849 | dev: false 1850 | 1851 | /react@18.2.0: 1852 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1853 | engines: {node: '>=0.10.0'} 1854 | dependencies: 1855 | loose-envify: 1.4.0 1856 | dev: false 1857 | 1858 | /read-cache@1.0.0: 1859 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1860 | dependencies: 1861 | pify: 2.3.0 1862 | dev: true 1863 | 1864 | /readdirp@3.6.0: 1865 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1866 | engines: {node: '>=8.10.0'} 1867 | dependencies: 1868 | picomatch: 2.3.1 1869 | dev: true 1870 | 1871 | /regenerator-runtime@0.14.1: 1872 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1873 | dev: false 1874 | 1875 | /resolve@1.22.8: 1876 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1877 | hasBin: true 1878 | dependencies: 1879 | is-core-module: 2.13.1 1880 | path-parse: 1.0.7 1881 | supports-preserve-symlinks-flag: 1.0.0 1882 | dev: true 1883 | 1884 | /reusify@1.0.4: 1885 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1886 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1887 | dev: true 1888 | 1889 | /run-parallel@1.2.0: 1890 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1891 | dependencies: 1892 | queue-microtask: 1.2.3 1893 | dev: true 1894 | 1895 | /scheduler@0.23.0: 1896 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1897 | dependencies: 1898 | loose-envify: 1.4.0 1899 | dev: false 1900 | 1901 | /shebang-command@2.0.0: 1902 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1903 | engines: {node: '>=8'} 1904 | dependencies: 1905 | shebang-regex: 3.0.0 1906 | dev: true 1907 | 1908 | /shebang-regex@3.0.0: 1909 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1910 | engines: {node: '>=8'} 1911 | dev: true 1912 | 1913 | /signal-exit@4.1.0: 1914 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1915 | engines: {node: '>=14'} 1916 | dev: true 1917 | 1918 | /source-map-js@1.2.0: 1919 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1920 | engines: {node: '>=0.10.0'} 1921 | 1922 | /streamsearch@1.1.0: 1923 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1924 | engines: {node: '>=10.0.0'} 1925 | dev: false 1926 | 1927 | /string-width@4.2.3: 1928 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1929 | engines: {node: '>=8'} 1930 | dependencies: 1931 | emoji-regex: 8.0.0 1932 | is-fullwidth-code-point: 3.0.0 1933 | strip-ansi: 6.0.1 1934 | dev: true 1935 | 1936 | /string-width@5.1.2: 1937 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1938 | engines: {node: '>=12'} 1939 | dependencies: 1940 | eastasianwidth: 0.2.0 1941 | emoji-regex: 9.2.2 1942 | strip-ansi: 7.1.0 1943 | dev: true 1944 | 1945 | /strip-ansi@6.0.1: 1946 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1947 | engines: {node: '>=8'} 1948 | dependencies: 1949 | ansi-regex: 5.0.1 1950 | dev: true 1951 | 1952 | /strip-ansi@7.1.0: 1953 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1954 | engines: {node: '>=12'} 1955 | dependencies: 1956 | ansi-regex: 6.0.1 1957 | dev: true 1958 | 1959 | /styled-jsx@5.1.1(react@18.2.0): 1960 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 1961 | engines: {node: '>= 12.0.0'} 1962 | peerDependencies: 1963 | '@babel/core': '*' 1964 | babel-plugin-macros: '*' 1965 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 1966 | peerDependenciesMeta: 1967 | '@babel/core': 1968 | optional: true 1969 | babel-plugin-macros: 1970 | optional: true 1971 | dependencies: 1972 | client-only: 0.0.1 1973 | react: 18.2.0 1974 | dev: false 1975 | 1976 | /sucrase@3.35.0: 1977 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1978 | engines: {node: '>=16 || 14 >=14.17'} 1979 | hasBin: true 1980 | dependencies: 1981 | '@jridgewell/gen-mapping': 0.3.3 1982 | commander: 4.1.1 1983 | glob: 10.3.10 1984 | lines-and-columns: 1.2.4 1985 | mz: 2.7.0 1986 | pirates: 4.0.6 1987 | ts-interface-checker: 0.1.13 1988 | dev: true 1989 | 1990 | /supports-preserve-symlinks-flag@1.0.0: 1991 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1992 | engines: {node: '>= 0.4'} 1993 | dev: true 1994 | 1995 | /tailwind-merge@2.2.2: 1996 | resolution: {integrity: sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw==} 1997 | dependencies: 1998 | '@babel/runtime': 7.24.1 1999 | dev: false 2000 | 2001 | /tailwindcss-animate@1.0.7(tailwindcss@3.4.3): 2002 | resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} 2003 | peerDependencies: 2004 | tailwindcss: '>=3.0.0 || insiders' 2005 | dependencies: 2006 | tailwindcss: 3.4.3 2007 | dev: true 2008 | 2009 | /tailwindcss@3.4.3: 2010 | resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} 2011 | engines: {node: '>=14.0.0'} 2012 | hasBin: true 2013 | dependencies: 2014 | '@alloc/quick-lru': 5.2.0 2015 | arg: 5.0.2 2016 | chokidar: 3.6.0 2017 | didyoumean: 1.2.2 2018 | dlv: 1.1.3 2019 | fast-glob: 3.3.2 2020 | glob-parent: 6.0.2 2021 | is-glob: 4.0.3 2022 | jiti: 1.21.0 2023 | lilconfig: 2.1.0 2024 | micromatch: 4.0.5 2025 | normalize-path: 3.0.0 2026 | object-hash: 3.0.0 2027 | picocolors: 1.0.0 2028 | postcss: 8.4.38 2029 | postcss-import: 15.1.0(postcss@8.4.38) 2030 | postcss-js: 4.0.1(postcss@8.4.38) 2031 | postcss-load-config: 4.0.2(postcss@8.4.38) 2032 | postcss-nested: 6.0.1(postcss@8.4.38) 2033 | postcss-selector-parser: 6.0.15 2034 | resolve: 1.22.8 2035 | sucrase: 3.35.0 2036 | transitivePeerDependencies: 2037 | - ts-node 2038 | dev: true 2039 | 2040 | /thenify-all@1.6.0: 2041 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2042 | engines: {node: '>=0.8'} 2043 | dependencies: 2044 | thenify: 3.3.1 2045 | dev: true 2046 | 2047 | /thenify@3.3.1: 2048 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2049 | dependencies: 2050 | any-promise: 1.3.0 2051 | dev: true 2052 | 2053 | /to-regex-range@5.0.1: 2054 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2055 | engines: {node: '>=8.0'} 2056 | dependencies: 2057 | is-number: 7.0.0 2058 | dev: true 2059 | 2060 | /ts-interface-checker@0.1.13: 2061 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2062 | dev: true 2063 | 2064 | /tslib@2.6.2: 2065 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2066 | dev: false 2067 | 2068 | /typescript@5.4.3: 2069 | resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} 2070 | engines: {node: '>=14.17'} 2071 | hasBin: true 2072 | dev: true 2073 | 2074 | /undici-types@5.26.5: 2075 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2076 | 2077 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 2078 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2079 | hasBin: true 2080 | peerDependencies: 2081 | browserslist: '>= 4.21.0' 2082 | dependencies: 2083 | browserslist: 4.23.0 2084 | escalade: 3.1.2 2085 | picocolors: 1.0.0 2086 | dev: true 2087 | 2088 | /use-callback-ref@1.3.1(@types/react@18.2.74)(react@18.2.0): 2089 | resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} 2090 | engines: {node: '>=10'} 2091 | peerDependencies: 2092 | '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 2093 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2094 | peerDependenciesMeta: 2095 | '@types/react': 2096 | optional: true 2097 | dependencies: 2098 | '@types/react': 18.2.74 2099 | react: 18.2.0 2100 | tslib: 2.6.2 2101 | dev: false 2102 | 2103 | /use-sidecar@1.1.2(@types/react@18.2.74)(react@18.2.0): 2104 | resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} 2105 | engines: {node: '>=10'} 2106 | peerDependencies: 2107 | '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 2108 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2109 | peerDependenciesMeta: 2110 | '@types/react': 2111 | optional: true 2112 | dependencies: 2113 | '@types/react': 18.2.74 2114 | detect-node-es: 1.1.0 2115 | react: 18.2.0 2116 | tslib: 2.6.2 2117 | dev: false 2118 | 2119 | /util-deprecate@1.0.2: 2120 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2121 | dev: true 2122 | 2123 | /which@2.0.2: 2124 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2125 | engines: {node: '>= 8'} 2126 | hasBin: true 2127 | dependencies: 2128 | isexe: 2.0.0 2129 | dev: true 2130 | 2131 | /wrap-ansi@7.0.0: 2132 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2133 | engines: {node: '>=10'} 2134 | dependencies: 2135 | ansi-styles: 4.3.0 2136 | string-width: 4.2.3 2137 | strip-ansi: 6.0.1 2138 | dev: true 2139 | 2140 | /wrap-ansi@8.1.0: 2141 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2142 | engines: {node: '>=12'} 2143 | dependencies: 2144 | ansi-styles: 6.2.1 2145 | string-width: 5.1.2 2146 | strip-ansi: 7.1.0 2147 | dev: true 2148 | 2149 | /xtend@4.0.2: 2150 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2151 | engines: {node: '>=0.4'} 2152 | dev: false 2153 | 2154 | /yaml@2.3.4: 2155 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 2156 | engines: {node: '>= 14'} 2157 | dev: true 2158 | --------------------------------------------------------------------------------