From 0ab4c8826467e7ebeca03836dc396d3438fff05b Mon Sep 17 00:00:00 2001 From: Don Strawsburg Date: Tue, 28 Jan 2025 15:09:06 -0500 Subject: [PATCH] lucia authentication --- .env | 2 +- .env.local | 3 +- application.log | 1 + drizzle.config.ts | 5 +- package.json | 24 +- pnpm-lock.yaml | 1630 ++++++++++++++++- src/{ => app}/(auth)/layout.tsx | 0 .../(auth)/login/discord/callback/route.ts | 12 +- src/{ => app}/(auth)/login/discord/route.ts | 0 src/{ => app}/(auth)/login/login.tsx | 0 src/{ => app}/(auth)/login/page.tsx | 2 +- .../(auth)/reset-password/[token]/page.tsx | 0 .../reset-password/[token]/reset-password.tsx | 0 src/{ => app}/(auth)/reset-password/page.tsx | 2 +- .../reset-password/send-reset-email.tsx | 0 src/{ => app}/(auth)/signup/page.tsx | 0 src/{ => app}/(auth)/signup/signup.tsx | 0 src/{ => app}/(auth)/verify-email/page.tsx | 2 +- .../(auth)/verify-email/verify-code.tsx | 0 .../_components/copy-to-clipboard.tsx | 0 .../(landing)/_components/feature-icons.tsx | 0 .../(landing)/_components/footer.tsx | 0 .../(landing)/_components/header.tsx | 0 .../(landing)/_components/hover-card.tsx | 0 src/{ => app}/(landing)/layout.tsx | 0 .../page.tsx => app/(landing)/page-lucia.tsx} | 0 src/{ => app}/(main)/_components/footer.tsx | 0 src/{ => app}/(main)/_components/header.tsx | 0 .../(main)/_components/user-dropdown.tsx | 0 src/{ => app}/(main)/account/page.tsx | 0 .../dashboard/_components/dashboard-nav.tsx | 0 .../(main)/dashboard/_components/new-post.tsx | 0 .../_components/post-card-skeleton.tsx | 0 .../dashboard/_components/post-card.tsx | 0 .../dashboard/_components/posts-skeleton.tsx | 0 .../(main)/dashboard/_components/posts.tsx | 0 .../_components/verificiation-warning.tsx | 0 .../billing/_components/billing-skeleton.tsx | 0 .../dashboard/billing/_components/billing.tsx | 0 .../_components/manage-subscription-form.tsx | 0 .../(main)/dashboard/billing/page.tsx | 0 src/{ => app}/(main)/dashboard/layout.tsx | 0 src/{ => app}/(main)/dashboard/page.tsx | 7 +- .../(main)/dashboard/settings/page.tsx | 0 .../[postId]/_components/post-editor.tsx | 0 .../[postId]/_components/post-preview.tsx | 0 src/{ => app}/(main)/editor/[postId]/page.tsx | 0 src/{ => app}/(main)/layout.tsx | 0 src/app/Admin/Accounts/page.tsx | 2 +- src/app/Admin/Users/page.tsx | 2 +- src/app/api/[trpc]/route.ts | 32 + src/app/api/webhooks/stripe/route.ts | 98 + src/app/icon.tsx | 48 + src/app/{signin => signin-old}/layout.tsx | 0 src/app/{signin => signin-old}/page.tsx | 0 src/components/AccountsTable/index.tsx | 2 +- src/components/Header/index.tsx | 2 +- src/components/PopNav/page.tsx | 8 +- src/components/icons copy.tsx | 115 ++ src/components/icons.tsx | 115 ++ src/components/loading-button copy.tsx | 35 + src/components/loading-button.tsx | 35 + src/components/password-input copy.tsx | 45 + src/components/password-input.tsx | 45 + src/components/responsive-dialog copy.tsx | 102 ++ src/components/responsive-dialog.tsx | 102 ++ src/components/submit-button copy.tsx | 25 + src/components/submit-button.tsx | 25 + src/components/theme-provider copy.tsx | 9 + src/components/theme-provider.tsx | 9 + src/components/theme-toggle copy.tsx | 38 + src/components/theme-toggle.tsx | 38 + src/components/ui/alert-dialog.tsx | 141 ++ src/components/ui/alert.tsx | 59 + src/components/ui/badge.tsx | 36 + src/components/ui/button.tsx | 57 + src/components/ui/card.tsx | 79 + src/components/ui/dialog.tsx | 122 ++ src/components/ui/drawer.tsx | 118 ++ src/components/ui/dropdown-menu.tsx | 205 +++ src/components/ui/form.tsx | 177 ++ src/components/ui/input.tsx | 25 + src/components/ui/label.tsx | 26 + src/components/ui/pagination.tsx | 125 ++ src/components/ui/skeleton.tsx | 15 + src/components/ui/sonner.tsx | 31 + src/components/ui/tabs.tsx | 55 + src/components/ui/textarea.tsx | 24 + src/config/subscriptions.ts | 24 + src/drizzle/relations.ts | 8 +- src/drizzle/schema/schema.ts | 12 +- src/env.js | 71 + src/lib/auth/actions.ts | 282 +++ src/lib/auth/index.ts | 55 + src/lib/auth/validate-request.ts | 40 + src/lib/bb_utils.ts | 23 + src/lib/email/index.tsx | 67 + .../email/templates/email-verification.tsx | 75 + src/lib/email/templates/reset-password.tsx | 92 + src/lib/fonts.ts | 8 + src/lib/logger.ts | 68 + src/lib/stripe.ts | 7 + src/lib/utils.ts | 65 +- src/lib/validators/auth.ts | 27 + src/middleware.ts | 27 +- src/server/api/root.ts | 12 + src/server/api/routers/post/post.input.ts | 35 + src/server/api/routers/post/post.procedure.ts | 29 + src/server/api/routers/post/post.service.ts | 85 + src/server/api/routers/stripe/stripe.input.ts | 10 + .../api/routers/stripe/stripe.procedure.ts | 13 + .../api/routers/stripe/stripe.service.ts | 138 ++ src/server/api/routers/user/user.procedure.ts | 5 + src/server/api/trpc.ts | 108 ++ src/server/db/index.ts | 11 + src/server/db/schema.ts | 108 ++ src/styles/globals.css | 121 ++ src/trpc/react.tsx | 39 + src/trpc/server.ts | 64 + src/trpc/shared.ts | 30 + tsconfig.json | 3 +- 121 files changed, 5613 insertions(+), 66 deletions(-) create mode 100644 application.log rename src/{ => app}/(auth)/layout.tsx (100%) rename src/{ => app}/(auth)/login/discord/callback/route.ts (88%) rename src/{ => app}/(auth)/login/discord/route.ts (100%) rename src/{ => app}/(auth)/login/login.tsx (100%) rename src/{ => app}/(auth)/login/page.tsx (90%) rename src/{ => app}/(auth)/reset-password/[token]/page.tsx (100%) rename src/{ => app}/(auth)/reset-password/[token]/reset-password.tsx (100%) rename src/{ => app}/(auth)/reset-password/page.tsx (95%) rename src/{ => app}/(auth)/reset-password/send-reset-email.tsx (100%) rename src/{ => app}/(auth)/signup/page.tsx (100%) rename src/{ => app}/(auth)/signup/signup.tsx (100%) rename src/{ => app}/(auth)/verify-email/page.tsx (94%) rename src/{ => app}/(auth)/verify-email/verify-code.tsx (100%) rename src/{ => app}/(landing)/_components/copy-to-clipboard.tsx (100%) rename src/{ => app}/(landing)/_components/feature-icons.tsx (100%) rename src/{ => app}/(landing)/_components/footer.tsx (100%) rename src/{ => app}/(landing)/_components/header.tsx (100%) rename src/{ => app}/(landing)/_components/hover-card.tsx (100%) rename src/{ => app}/(landing)/layout.tsx (100%) rename src/{(landing)/page.tsx => app/(landing)/page-lucia.tsx} (100%) rename src/{ => app}/(main)/_components/footer.tsx (100%) rename src/{ => app}/(main)/_components/header.tsx (100%) rename src/{ => app}/(main)/_components/user-dropdown.tsx (100%) rename src/{ => app}/(main)/account/page.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/dashboard-nav.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/new-post.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/post-card-skeleton.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/post-card.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/posts-skeleton.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/posts.tsx (100%) rename src/{ => app}/(main)/dashboard/_components/verificiation-warning.tsx (100%) rename src/{ => app}/(main)/dashboard/billing/_components/billing-skeleton.tsx (100%) rename src/{ => app}/(main)/dashboard/billing/_components/billing.tsx (100%) rename src/{ => app}/(main)/dashboard/billing/_components/manage-subscription-form.tsx (100%) rename src/{ => app}/(main)/dashboard/billing/page.tsx (100%) rename src/{ => app}/(main)/dashboard/layout.tsx (100%) rename src/{ => app}/(main)/dashboard/page.tsx (91%) rename src/{ => app}/(main)/dashboard/settings/page.tsx (100%) rename src/{ => app}/(main)/editor/[postId]/_components/post-editor.tsx (100%) rename src/{ => app}/(main)/editor/[postId]/_components/post-preview.tsx (100%) rename src/{ => app}/(main)/editor/[postId]/page.tsx (100%) rename src/{ => app}/(main)/layout.tsx (100%) create mode 100644 src/app/api/[trpc]/route.ts create mode 100644 src/app/api/webhooks/stripe/route.ts create mode 100644 src/app/icon.tsx rename src/app/{signin => signin-old}/layout.tsx (100%) rename src/app/{signin => signin-old}/page.tsx (100%) create mode 100644 src/components/icons copy.tsx create mode 100644 src/components/icons.tsx create mode 100644 src/components/loading-button copy.tsx create mode 100644 src/components/loading-button.tsx create mode 100644 src/components/password-input copy.tsx create mode 100644 src/components/password-input.tsx create mode 100644 src/components/responsive-dialog copy.tsx create mode 100644 src/components/responsive-dialog.tsx create mode 100644 src/components/submit-button copy.tsx create mode 100644 src/components/submit-button.tsx create mode 100644 src/components/theme-provider copy.tsx create mode 100644 src/components/theme-provider.tsx create mode 100644 src/components/theme-toggle copy.tsx create mode 100644 src/components/theme-toggle.tsx create mode 100644 src/components/ui/alert-dialog.tsx create mode 100644 src/components/ui/alert.tsx create mode 100644 src/components/ui/badge.tsx create mode 100644 src/components/ui/button.tsx create mode 100644 src/components/ui/card.tsx create mode 100644 src/components/ui/dialog.tsx create mode 100644 src/components/ui/drawer.tsx create mode 100644 src/components/ui/dropdown-menu.tsx create mode 100644 src/components/ui/form.tsx create mode 100644 src/components/ui/input.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/components/ui/skeleton.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/components/ui/tabs.tsx create mode 100644 src/components/ui/textarea.tsx create mode 100644 src/config/subscriptions.ts create mode 100644 src/env.js create mode 100644 src/lib/auth/actions.ts create mode 100644 src/lib/auth/index.ts create mode 100644 src/lib/auth/validate-request.ts create mode 100644 src/lib/bb_utils.ts create mode 100644 src/lib/email/index.tsx create mode 100644 src/lib/email/templates/email-verification.tsx create mode 100644 src/lib/email/templates/reset-password.tsx create mode 100644 src/lib/fonts.ts create mode 100644 src/lib/logger.ts create mode 100644 src/lib/stripe.ts create mode 100644 src/lib/validators/auth.ts create mode 100644 src/server/api/root.ts create mode 100644 src/server/api/routers/post/post.input.ts create mode 100644 src/server/api/routers/post/post.procedure.ts create mode 100644 src/server/api/routers/post/post.service.ts create mode 100644 src/server/api/routers/stripe/stripe.input.ts create mode 100644 src/server/api/routers/stripe/stripe.procedure.ts create mode 100644 src/server/api/routers/stripe/stripe.service.ts create mode 100644 src/server/api/routers/user/user.procedure.ts create mode 100644 src/server/api/trpc.ts create mode 100644 src/server/db/index.ts create mode 100644 src/server/db/schema.ts create mode 100644 src/trpc/react.tsx create mode 100644 src/trpc/server.ts create mode 100644 src/trpc/shared.ts diff --git a/.env b/.env index 3b81f7c..5ec3beb 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -DATABASE_URL="postgresql://postgres:cul8rman@portainer.dev.gofwd.group:5433/ballistic?schema=public" +DATABASE_URL="postgresql://postgres:cul8rman@portainer.dev.gofwd.group:5433/ballistic" # This file will be committed to version control, so make sure not to have any diff --git a/.env.local b/.env.local index 1101c9a..484400e 100644 --- a/.env.local +++ b/.env.local @@ -1,4 +1,5 @@ AUTH_SECRET="a73X70xifFO5+V9oQ+/NKDDTgA4dsuWWxvFX6T1v1ns=" # Added by `npx auth`. Read more: https://cli.authjs.dev NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_bmV3LXN3YW4tMjguY2xlcmsuYWNjb3VudHMuZGV2JA -CLERK_SECRET_KEY=•••••••••••••••••••••••••••••••••••••••••••••••••• \ No newline at end of file +CLERK_SECRET_KEY=•••••••••••••••••••••••••••••••••••••••••••••••••• +REACT_EDITOR=atom \ No newline at end of file diff --git a/application.log b/application.log new file mode 100644 index 0000000..73dec9a --- /dev/null +++ b/application.log @@ -0,0 +1 @@ +[2025-01-28T04:58:56.488Z] [INFO] 📨 Email sent to: don@strawsburg.com with template: EmailVerification and props: {"code":"70365595"} diff --git a/drizzle.config.ts b/drizzle.config.ts index b51c989..b8fef8b 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -2,9 +2,10 @@ import 'dotenv/config'; import { defineConfig } from 'drizzle-kit'; export default defineConfig({ out: './src/drizzle/schema/', - schema: './src/drizzle/schema/', + schema: './src/drizzle/schema/schema.ts', dialect: 'postgresql', dbCredentials: { url: process.env.DATABASE_URL!, }, -}); \ No newline at end of file +}); + diff --git a/package.json b/package.json index 94ee50b..aaf0636 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,22 @@ "@mui/styles": "^6.1.7", "@mui/system": "^6.1.7", "@mui/x-data-grid": "^7.22.2", + "@radix-ui/react-alert-dialog": "^1.1.5", + "@radix-ui/react-dropdown-menu": "^2.1.5", + "@radix-ui/react-icons": "^1.3.2", + "@radix-ui/react-label": "^2.1.1", "@radix-ui/react-slot": "^1.1.0", + "@react-email/components": "^0.0.32", + "@react-email/render": "^1.0.4", + "@t3-oss/env-nextjs": "^0.12.0", + "@tanstack/react-query": "^4.35.3", + + "@trpc/react-query": "^10.45.2", + "@trpc/server": "^10.45.2", + "@trpc/client": "^10.45.2", + "@trpc/next": "^10.45.2", "@types/bcryptjs": "^2.4.6", + "arctic": "^3.2.1", "bcryptjs": "^2.4.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", @@ -33,15 +47,23 @@ "lucide-react": "^0.460.0", "next": "15.1.0", "next-themes": "^0.4.3", + "nodemailer": "^6.10.0", + "observable": "link:@trpc/server/observable", "oslo": "^1.2.1", "path": "^0.12.7", "pg": "^8.13.1", + "postgres": "^3.4.5", + "prettier": "^3.4.2", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "^5.3.0", + "sonner": "^1.7.2", + "stripe": "^17.6.0", + "superjson": "^2.2.2", "tailwind-merge": "^2.5.4", "tailwindcss-animate": "^1.0.7", - "uuid": "^11.0.3" + "uuid": "^11.0.3", + "zod": "^3.24.1" }, "devDependencies": { "@auth/drizzle-adapter": "^1.7.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fe030ea..3ac324b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ importers: version: 2.2.0(react@18.2.0) '@lucia-auth/adapter-drizzle': specifier: ^1.1.0 - version: 1.1.0(drizzle-orm@0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(pg@8.13.1)(react@18.2.0))(lucia@3.2.2) + version: 1.1.0(drizzle-orm@0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(knex@0.8.6)(pg@8.13.1)(postgres@3.4.5)(react@18.2.0))(lucia@3.2.2) '@mui/icons-material': specifier: ^6.1.7 version: 6.4.1(@mui/material@6.4.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@types/react@18.3.18)(react@18.2.0) @@ -44,12 +44,51 @@ importers: '@mui/x-data-grid': specifier: ^7.22.2 version: 7.24.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react@18.2.0))(@mui/material@6.4.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@mui/system@6.4.1(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react@18.2.0))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-alert-dialog': + specifier: ^1.1.5 + version: 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-dropdown-menu': + specifier: ^2.1.5 + version: 2.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-icons': + specifier: ^1.3.2 + version: 1.3.2(react@18.2.0) + '@radix-ui/react-label': + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.1.0 version: 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@react-email/components': + specifier: ^0.0.32 + version: 0.0.32(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-email/render': + specifier: ^1.0.4 + version: 1.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@t3-oss/env-nextjs': + specifier: ^0.12.0 + version: 0.12.0(typescript@5.7.3)(zod@3.24.1) + '@tanstack/react-query': + specifier: ^4.35.3 + version: 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@trpc/client': + specifier: ^10.45.2 + version: 10.45.2(@trpc/server@10.45.2) + '@trpc/next': + specifier: ^10.45.2 + version: 10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.45.2)(next@15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@trpc/react-query': + specifier: ^10.45.2 + version: 10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@trpc/server': + specifier: ^10.45.2 + version: 10.45.2 '@types/bcryptjs': specifier: ^2.4.6 version: 2.4.6 + arctic: + specifier: ^3.2.1 + version: 3.2.1 bcryptjs: specifier: ^2.4.3 version: 2.4.3 @@ -80,6 +119,12 @@ importers: next-themes: specifier: ^0.4.3 version: 0.4.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + nodemailer: + specifier: ^6.10.0 + version: 6.10.0 + observable: + specifier: link:@trpc/server/observable + version: link:@trpc/server/observable oslo: specifier: ^1.2.1 version: 1.2.1 @@ -89,6 +134,12 @@ importers: pg: specifier: ^8.13.1 version: 8.13.1 + postgres: + specifier: ^3.4.5 + version: 3.4.5 + prettier: + specifier: ^3.4.2 + version: 3.4.2 react: specifier: 18.2.0 version: 18.2.0 @@ -98,6 +149,15 @@ importers: react-icons: specifier: ^5.3.0 version: 5.4.0(react@18.2.0) + sonner: + specifier: ^1.7.2 + version: 1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + stripe: + specifier: ^17.6.0 + version: 17.6.0 + superjson: + specifier: ^2.2.2 + version: 2.2.2 tailwind-merge: specifier: ^2.5.4 version: 2.6.0 @@ -107,10 +167,13 @@ importers: uuid: specifier: ^11.0.3 version: 11.0.5 + zod: + specifier: ^3.24.1 + version: 3.24.1 devDependencies: '@auth/drizzle-adapter': specifier: ^1.7.4 - version: 1.7.4 + version: 1.7.4(nodemailer@6.10.0) '@types/bun': specifier: ^1.1.13 version: 1.2.0 @@ -143,7 +206,7 @@ importers: version: 0.28.1 drizzle-orm: specifier: ^0.38.2 - version: 0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(pg@8.13.1)(react@18.2.0) + version: 0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(knex@0.8.6)(pg@8.13.1)(postgres@3.4.5)(react@18.2.0) eslint: specifier: ^8 version: 8.57.1 @@ -155,7 +218,7 @@ importers: version: 0.0.1-security next-auth: specifier: ^5.0.0-beta.25 - version: 5.0.0-beta.25(next@15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + version: 5.0.0-beta.25(next@15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nodemailer@6.10.0)(react@18.2.0) postcss: specifier: ^8.5.1 version: 8.5.1 @@ -1423,9 +1486,15 @@ packages: '@oslojs/crypto@1.0.1': resolution: {integrity: sha512-7n08G8nWjAr/Yu3vu9zzrd0L9XnrJfpMioQcvCMxBIiF5orECHe5/3J0jmXRVvgfqMm/+4oxlQ+Sq39COYLcNQ==} + '@oslojs/encoding@0.4.1': + resolution: {integrity: sha512-hkjo6MuIK/kQR5CrGNdAPZhS01ZCXuWDRJ187zh6qqF2+yMHZpD9fAYpX8q2bOO6Ryhl3XpCT6kUX76N8hhm4Q==} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oslojs/jwt@0.2.0': + resolution: {integrity: sha512-bLE7BtHrURedCn4Mco3ma9L4Y1GR2SMBuIvjWr7rmQ4/W/4Jy70TIAgZ+0nIlk0xHz1vNP8x8DCns45Sb2XRbg==} + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -1436,6 +1505,48 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + + '@radix-ui/react-alert-dialog@1.1.5': + resolution: {integrity: sha512-1Y2sI17QzSZP58RjGtrklfSGIf3AF7U/HkD3aAcAnhOUJrm7+7GG1wRDFaUlSe0nW5B/t4mYd/+7RNbP2Wexug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-arrow@1.1.1': + resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.1': + resolution: {integrity: sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.1.1': resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} peerDependencies: @@ -1445,6 +1556,190 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.1': + resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.5': + resolution: {integrity: sha512-LaO3e5h/NOEL4OfXjxD43k9Dx+vn+8n+PCFt6uhX/BADFflllyv3WJG6rgvvSVBxpTch938Qq/LGc2MMxipXPw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-direction@1.1.0': + resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.4': + resolution: {integrity: sha512-XDUI0IVYVSwjMXxM6P4Dfti7AH+Y4oS/TB+sglZ/EXc7cqLwGAmp1NlMrcUjj7ks6R5WTZuWKv44FBbLpwU3sA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dropdown-menu@2.1.5': + resolution: {integrity: sha512-50ZmEFL1kOuLalPKHrLWvPFMons2fGx9TqQCWlPwDVpbAnaUJ1g4XNcKqFNMQymYU0kKWR4MDDi+9vUQBGFgcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.1': + resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.1': + resolution: {integrity: sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-icons@1.3.2': + resolution: {integrity: sha512-fyQIhGDhzfc9pK2kH6Pl9c4BDJGfMkPqkyIgYDthyNYoNg3wVhoJMMh19WS4Up/1KMPFVpNsT2q3WmXn2N1m6g==} + peerDependencies: + react: ^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc + + '@radix-ui/react-id@1.1.0': + resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-label@2.1.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-menu@2.1.5': + resolution: {integrity: sha512-uH+3w5heoMJtqVCgYOtYVMECk1TOrkUn0OG0p5MqXC0W2ppcuVeESbou8PTHoqAjbdTEK19AGXBWcEtR5WpEQg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popper@1.2.1': + resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.3': + resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.0.1': + resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.1': + resolution: {integrity: sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.1.1': resolution: {integrity: sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==} peerDependencies: @@ -1454,6 +1749,63 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.0': + resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.0': + resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.0': + resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.0': + resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/rect@1.1.0': + resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} + '@react-aria/focus@3.19.1': resolution: {integrity: sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg==} peerDependencies: @@ -1478,6 +1830,131 @@ packages: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 + '@react-email/body@0.0.11': + resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/button@0.0.19': + resolution: {integrity: sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-block@0.0.11': + resolution: {integrity: sha512-4D43p+LIMjDzm66gTDrZch0Flkip5je91mAT7iGs6+SbPyalHgIA+lFQoQwhz/VzHHLxuD0LV6gwmU/WUQ2WEg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/code-inline@0.0.5': + resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/column@0.0.13': + resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/components@0.0.32': + resolution: {integrity: sha512-+1Wv7PyVgWfLoj5W0+CvBsJMIfMI6ibcFcIPXNkb2lhKQQASgxSoAedRL1rH0CCaBo6+63tg8y4baHzJonfZbw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/container@0.0.15': + resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/font@0.0.9': + resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/head@0.0.12': + resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/heading@0.0.15': + resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/hr@0.0.11': + resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/html@0.0.11': + resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/img@0.0.11': + resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/link@0.0.12': + resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/markdown@0.0.14': + resolution: {integrity: sha512-5IsobCyPkb4XwnQO8uFfGcNOxnsg3311GRXhJ3uKv51P7Jxme4ycC/MITnwIZ10w2zx7HIyTiqVzTj4XbuIHbg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/preview@0.0.12': + resolution: {integrity: sha512-g/H5fa9PQPDK6WUEG7iTlC19sAktI23qyoiJtMLqQiXFCfWeQMhqjLGKeLSKkfzszqmfJCjZtpSiKtBoOdxp3Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/render@1.0.4': + resolution: {integrity: sha512-8ZXi89d8igBDE6W3zlHBa3GEDWKEUFDAa7i8MvVxnRViQuvsRbibK3ltuPgixxRI5+HgGNCSreBHQKZCkhUdyw==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/row@0.0.12': + resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/section@0.0.16': + resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/tailwind@1.0.4': + resolution: {integrity: sha512-tJdcusncdqgvTUYZIuhNC6LYTfL9vNTSQpwWdTCQhQ1lsrNCEE4OKCSdzSV3S9F32pi0i0xQ+YPJHKIzGjdTSA==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/text@0.0.11': + resolution: {integrity: sha512-a7nl/2KLpRHOYx75YbYZpWspUbX1DFY7JIZbOv5x0QU8SvwDbJt+Hm01vG34PffFyYvHEXrc6Qnip2RTjljNjg==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + '@react-stately/utils@3.10.5': resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} peerDependencies: @@ -1494,12 +1971,58 @@ packages: '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@selderee/plugin-htmlparser2@0.11.0': + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@t3-oss/env-core@0.12.0': + resolution: {integrity: sha512-lOPj8d9nJJTt81mMuN9GMk8x5veOt7q9m11OSnCBJhwp1QrL/qR+M8Y467ULBSm9SunosryWNbmQQbgoiMgcdw==} + peerDependencies: + typescript: '>=5.0.0' + valibot: ^1.0.0-beta.7 || ^1.0.0 + zod: ^3.24.0 + peerDependenciesMeta: + typescript: + optional: true + valibot: + optional: true + zod: + optional: true + + '@t3-oss/env-nextjs@0.12.0': + resolution: {integrity: sha512-rFnvYk1049RnNVUPvY8iQ55AuQh1Rr+qZzQBh3t++RttCGK4COpXGNxS4+45afuQq02lu+QAOy/5955aU8hRKw==} + peerDependencies: + typescript: '>=5.0.0' + valibot: ^1.0.0-beta.7 || ^1.0.0 + zod: ^3.24.0 + peerDependenciesMeta: + typescript: + optional: true + valibot: + optional: true + zod: + optional: true + + '@tanstack/query-core@4.36.1': + resolution: {integrity: sha512-DJSilV5+ytBP1FbFcEJovv4rnnm/CokuVvrBEtW/Va9DvuJ3HksbXUJEpI0aV1KtuL4ZoO9AVE6PyNLzF7tLeA==} + + '@tanstack/react-query@4.36.1': + resolution: {integrity: sha512-y7ySVHFyyQblPl3J3eQBWpXZkliroki3ARnBKsdJchlgt7yJLRDUcf4B8soufgiYt3pEQIkBWBx1N9/ZPIeUWw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + '@tanstack/react-virtual@3.11.2': resolution: {integrity: sha512-OuFzMXPF4+xZgx8UzJha0AieuMihhhaWG0tCqpp6tDzlFwOmNBPYMuLOtMJ1Tr4pXLHmgjcWhG6RlknY2oNTdQ==} peerDependencies: @@ -1509,6 +2032,34 @@ packages: '@tanstack/virtual-core@3.11.2': resolution: {integrity: sha512-vTtpNt7mKCiZ1pwU9hfKPhpdVO2sVzFQsxoVBGtOSHxlrRRzYr8iQ2TlwbAcRYCcEiZ9ECAM8kBzH0v2+VzfKw==} + '@trpc/client@10.45.2': + resolution: {integrity: sha512-ykALM5kYWTLn1zYuUOZ2cPWlVfrXhc18HzBDyRhoPYN0jey4iQHEFSEowfnhg1RvYnrAVjNBgHNeSAXjrDbGwg==} + peerDependencies: + '@trpc/server': 10.45.2 + + '@trpc/next@10.45.2': + resolution: {integrity: sha512-RSORmfC+/nXdmRY1pQ0AalsVgSzwNAFbZLYHiTvPM5QQ8wmMEHilseCYMXpu0se/TbPt9zVR6Ka2d7O6zxKkXg==} + peerDependencies: + '@tanstack/react-query': ^4.18.0 + '@trpc/client': 10.45.2 + '@trpc/react-query': 10.45.2 + '@trpc/server': 10.45.2 + next: '*' + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@trpc/react-query@10.45.2': + resolution: {integrity: sha512-BAqb9bGZIscroradlNx+Cc9522R+idY3BOSf5z0jHUtkxdMbjeGKxSSMxxu7JzoLqSIEC+LVzL3VvF8sdDWaZQ==} + peerDependencies: + '@tanstack/react-query': ^4.18.0 + '@trpc/client': 10.45.2 + '@trpc/server': 10.45.2 + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@trpc/server@10.45.2': + resolution: {integrity: sha512-wOrSThNNE4HUnuhJG6PfDRp4L2009KDVxsd+2VYH8ro6o/7/jwYZ8Uu5j+VaW+mOmc8EHerHzGcdbGNQSAUPgg==} + '@tybys/wasm-util@0.8.3': resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==} @@ -1618,6 +2169,10 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1626,6 +2181,10 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1641,12 +2200,19 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arctic@3.2.1: + resolution: {integrity: sha512-lvOfv088aiaNCN4bGpnVd0cJmQKUkB2gGaZeA3lTwbBZVj69+zd/LpBPO6CXNCyX45CKqqcaOV6J7HeJ1k4hEA==} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.4: + resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} + engines: {node: '>=10'} + aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1723,6 +2289,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bluebird@2.11.0: + resolution: {integrity: sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -1771,6 +2340,10 @@ packages: caniuse-lite@1.0.30001695: resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1803,6 +2376,9 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -1821,6 +2397,13 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@7.1.0: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} @@ -1869,6 +2452,14 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1889,6 +2480,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -1905,6 +2500,9 @@ packages: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -1922,6 +2520,19 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -1929,6 +2540,9 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + double-ended-queue@2.1.0-0: + resolution: {integrity: sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==} + drizzle-kit@0.28.1: resolution: {integrity: sha512-JimOV+ystXTWMgZkLHYHf2w3oS28hxiH1FR0dkmJLc7GHzdGJoJAQtQS5DRppnabsRZwE2U1F6CuezVBgmsBBQ==} hasBin: true @@ -2045,6 +2659,10 @@ packages: resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2103,6 +2721,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2219,6 +2841,12 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + extend@2.0.2: + resolution: {integrity: sha512-AgFD4VU+lVLP6vjnlNfF7OeInLTyeyckCNPEsuxz1vi786UuK/nk6ynPuhn/h+Ju9++TQyr5EpLRI14fc1QtTQ==} + + fast-deep-equal@2.0.1: + resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2254,6 +2882,14 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + findup-sync@0.2.1: + resolution: {integrity: sha512-uv8a0ezsjAT99zkSJsJtx1scyee6jS2iC4T50n6McAudpZD5rHsGsdvgO+kd73hSh3v/ZiW/8dDfLb2p9yxptw==} + engines: {node: '>= 0.6.0'} + + flagged-respawn@0.3.2: + resolution: {integrity: sha512-HV3vdzzmQpuvpF5ghGNEKLSk3XrOmhuxWW96cO85B8JUm7iwcE8gLVl2fygaiwHFRXRiIUmEfIGMN6sQIn226g==} + engines: {node: '>= 0.8.0'} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2317,6 +2953,10 @@ packages: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -2343,6 +2983,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@4.3.5: + resolution: {integrity: sha512-kOq1ncUyUvkZdl7BgKa3n6zAOiN05pzleOxESuc8bFoXKRhYsrZM6z79O5DKe9JGChHhSZloUsD/hZrUXByxgQ==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -2369,6 +3013,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -2392,6 +3040,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hashmap@2.4.0: + resolution: {integrity: sha512-Ngj48lhnxJdnBAEVbubKBJuN1elfVLZJs94ZixRi98X3GCU4v6pgj9qRkHt6H8WaVJ69Wv0r1GhtS7hvF9zCgg==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2399,6 +3050,13 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -2428,6 +3086,9 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + interpret@0.5.2: + resolution: {integrity: sha512-xnOhtonBuNA5lcWD6yxNC6ezoF5zAOZAgVXXofDwdHKiBEuTP87PVcCq1epXXAdhTVWRy1slpkQvJydqAQjpsw==} + is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2548,6 +3209,13 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2631,6 +3299,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + knex@0.8.6: + resolution: {integrity: sha512-QtVFrrswtEUzdzQyu0fChxxg3Sqy1cadOxiKtpUv0dpbRZbQiBuz9gEAQCS/3xWAV4tkyqz7Agh2lBYlrJWpZA==} + hasBin: true + language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -2638,10 +3310,17 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + liftoff@2.0.3: + resolution: {integrity: sha512-G4NWz0klE5nFGGVKXdoik2U2vUtwcyuatbnEr0CJXbmOxX0yS6O+5tkpH9TvS1bMdWe0jMihi0acccNqQm28BA==} + engines: {node: '>= 0.8'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -2656,6 +3335,9 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash@3.10.1: + resolution: {integrity: sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2678,10 +3360,20 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + marked@7.0.4: + resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} + engines: {node: '>= 16'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + md-to-react-email@5.0.5: + resolution: {integrity: sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==} + peerDependencies: + react: ^18.0 || ^19.0 + memfs-browser@3.5.10302: resolution: {integrity: sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw==} @@ -2697,6 +3389,10 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@2.0.10: + resolution: {integrity: sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==} + deprecated: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2704,6 +3400,9 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.1.3: + resolution: {integrity: sha512-2RbeLaM/Hbo9vJ1+iRrxzfDnX9108qb2m923U+s+Ot2eMey0IYGdSjzHmvtg2XsxoCuMnzOMw7qc573RvnLgwg==} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -2711,12 +3410,19 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + motion-dom@11.18.1: resolution: {integrity: sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==} motion-utils@11.18.1: resolution: {integrity: sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==} + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2780,6 +3486,10 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nodemailer@6.10.0: + resolution: {integrity: sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==} + engines: {node: '>=6.0.0'} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -2864,6 +3574,9 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2890,6 +3603,9 @@ packages: path@0.12.7: resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} @@ -2947,6 +3663,9 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pool2@1.4.1: + resolution: {integrity: sha512-xeupv37OAWA0aL9awuwOeLFfvW6qV4GRyZqnJEmHwI2jpd65aC0JPK+sgo1jQe0sU+zmSJg9cd8YHC7svBTAnQ==} + possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} @@ -3031,6 +3750,10 @@ packages: postgres-range@1.1.4: resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + postgres@3.4.5: + resolution: {integrity: sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==} + engines: {node: '>=12'} + preact-render-to-string@5.2.3: resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} peerDependencies: @@ -3051,9 +3774,18 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -3065,6 +3797,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3084,6 +3820,39 @@ packages: react-is@19.0.0: resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} + react-promise-suspense@0.3.4: + resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-transition-group@4.4.5: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: @@ -3097,6 +3866,9 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3122,6 +3894,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -3158,6 +3933,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3214,6 +3992,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-backoff@1.1.0: + resolution: {integrity: sha512-3eB7B9fmtgXVlwkaKLYLreq2CNHn5/6rtU5A5WmMUAqjMDMFBZmFTUcH7AByDaS1GeJH2ouiXo4Exmr3Si3R4g==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3224,6 +4005,12 @@ packages: resolution: {integrity: sha512-Sj51kE1zC7zh6TDlNNz0/Jn1n5HiHdoQErxO8jLtnyrkJW/M5PrI7x05uDgY3BO7OUQYKCvmeMurW6BPUdwEOw==} engines: {node: '>=18'} + sonner@1.7.2: + resolution: {integrity: sha512-zMbseqjrOzQD1a93lxahm+qMGxWovdMxBlkTbbnZdNqVLt4j+amF9PQxUCL32WfztOFt9t9ADYkejAL3jF9iNA==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -3284,6 +4071,13 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3300,6 +4094,10 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stripe@17.6.0: + resolution: {integrity: sha512-+HB6+SManp0gSRB0dlPmXO+io18krlAe0uimXhhIkL/RG/VIRigkfoM3QDJPkqbuSW0XsA6uzsivNCJU1ELEDA==} + engines: {node: '>=12.*'} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -3321,6 +4119,14 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + superjson@2.2.2: + resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + engines: {node: '>=16'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3364,6 +4170,10 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tildify@1.0.0: + resolution: {integrity: sha512-3Tu0EzUZpMeGRxUrajQPKBhYrpQLIA42RtQsaIaJ75zvaAov6d0ArxVEKoz+ZYSVOa7XnEvbjkzJDSawIntYIA==} + engines: {node: '>=0.10.0'} + tiny-warning@1.0.3: resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} @@ -3443,11 +4253,36 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-sync-external-store@1.4.0: resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + user-home@1.1.1: + resolution: {integrity: sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3458,6 +4293,10 @@ packages: resolution: {integrity: sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==} hasBin: true + v8flags@2.1.1: + resolution: {integrity: sha512-SKfhk/LlaXzvtowJabLZwD4K6SGRYeoxA7KJeISlUMAB/NT4CBkZjMq3WceX2Ckm4llwqYVo8TICgsDYCBU2tA==} + engines: {node: '>= 0.10.0'} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3511,11 +4350,14 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + zod@3.24.1: + resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + snapshots: '@alloc/quick-lru@5.2.0': {} - '@auth/core@0.37.2': + '@auth/core@0.37.2(nodemailer@6.10.0)': dependencies: '@panva/hkdf': 1.2.1 '@types/cookie': 0.6.0 @@ -3524,18 +4366,22 @@ snapshots: oauth4webapi: 3.1.4 preact: 10.11.3 preact-render-to-string: 5.2.3(preact@10.11.3) + optionalDependencies: + nodemailer: 6.10.0 - '@auth/core@0.37.4': + '@auth/core@0.37.4(nodemailer@6.10.0)': dependencies: '@panva/hkdf': 1.2.1 jose: 5.9.6 oauth4webapi: 3.1.4 preact: 10.24.3 preact-render-to-string: 6.5.11(preact@10.24.3) + optionalDependencies: + nodemailer: 6.10.0 - '@auth/drizzle-adapter@1.7.4': + '@auth/drizzle-adapter@1.7.4(nodemailer@6.10.0)': dependencies: - '@auth/core': 0.37.4 + '@auth/core': 0.37.4(nodemailer@6.10.0) transitivePeerDependencies: - '@simplewebauthn/browser' - '@simplewebauthn/server' @@ -4136,9 +4982,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(pg@8.13.1)(react@18.2.0))(lucia@3.2.2)': + '@lucia-auth/adapter-drizzle@1.1.0(drizzle-orm@0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(knex@0.8.6)(pg@8.13.1)(postgres@3.4.5)(react@18.2.0))(lucia@3.2.2)': dependencies: - drizzle-orm: 0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(pg@8.13.1)(react@18.2.0) + drizzle-orm: 0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(knex@0.8.6)(pg@8.13.1)(postgres@3.4.5)(react@18.2.0) lucia: 3.2.2 '@mui/base@5.0.0-beta.40-0(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -4539,8 +5385,14 @@ snapshots: '@oslojs/asn1': 1.0.0 '@oslojs/binary': 1.0.0 + '@oslojs/encoding@0.4.1': {} + '@oslojs/encoding@1.1.0': {} + '@oslojs/jwt@0.2.0': + dependencies: + '@oslojs/encoding': 0.4.1 + '@panva/hkdf@1.2.1': {} '@pkgjs/parseargs@0.11.0': @@ -4548,12 +5400,238 @@ snapshots: '@popperjs/core@2.11.8': {} + '@radix-ui/primitive@1.1.1': {} + + '@radix-ui/react-alert-dialog@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-dialog': 1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-collection@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.18)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: '@types/react': 18.3.18 + '@radix-ui/react-context@1.1.1(@types/react@18.3.18)(react@18.2.0)': + dependencies: + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-dialog@1.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.2.0) + aria-hidden: 1.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-direction@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-dismissable-layer@1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-dropdown-menu@2.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-menu': 2.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-focus-guards@1.1.1(@types/react@18.3.18)(react@18.2.0)': + dependencies: + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-focus-scope@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-icons@1.3.2(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@radix-ui/react-id@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-label@2.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-menu@2.1.5(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.4(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-focus-guards': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-popper': 1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-portal': 1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-roving-focus': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + aria-hidden: 1.2.4 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.6.3(@types/react@18.3.18)(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-arrow': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/rect': 1.1.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-portal@1.1.3(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-presence@1.1.2(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/react-slot': 1.1.1(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + + '@radix-ui/react-roving-focus@1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-collection': 1.1.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-context': 1.1.1(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-direction': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-id': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.5(@types/react@18.3.18))(@types/react@18.3.18)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + '@types/react-dom': 18.3.5(@types/react@18.3.18) + '@radix-ui/react-slot@1.1.1(@types/react@18.3.18)(react@18.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.1(@types/react@18.3.18)(react@18.2.0) @@ -4561,6 +5639,48 @@ snapshots: optionalDependencies: '@types/react': 18.3.18 + '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + '@radix-ui/rect': 1.1.0 + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/react-use-size@1.1.0(@types/react@18.3.18)(react@18.2.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.18)(react@18.2.0) + react: 18.2.0 + optionalDependencies: + '@types/react': 18.3.18 + + '@radix-ui/rect@1.1.0': {} + '@react-aria/focus@3.19.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/interactions': 3.23.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -4595,6 +5715,118 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) + '@react-email/body@0.0.11(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/button@0.0.19(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/code-block@0.0.11(react@18.2.0)': + dependencies: + prismjs: 1.29.0 + react: 18.2.0 + + '@react-email/code-inline@0.0.5(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/column@0.0.13(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/components@0.0.32(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@react-email/body': 0.0.11(react@18.2.0) + '@react-email/button': 0.0.19(react@18.2.0) + '@react-email/code-block': 0.0.11(react@18.2.0) + '@react-email/code-inline': 0.0.5(react@18.2.0) + '@react-email/column': 0.0.13(react@18.2.0) + '@react-email/container': 0.0.15(react@18.2.0) + '@react-email/font': 0.0.9(react@18.2.0) + '@react-email/head': 0.0.12(react@18.2.0) + '@react-email/heading': 0.0.15(react@18.2.0) + '@react-email/hr': 0.0.11(react@18.2.0) + '@react-email/html': 0.0.11(react@18.2.0) + '@react-email/img': 0.0.11(react@18.2.0) + '@react-email/link': 0.0.12(react@18.2.0) + '@react-email/markdown': 0.0.14(react@18.2.0) + '@react-email/preview': 0.0.12(react@18.2.0) + '@react-email/render': 1.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-email/row': 0.0.12(react@18.2.0) + '@react-email/section': 0.0.16(react@18.2.0) + '@react-email/tailwind': 1.0.4(react@18.2.0) + '@react-email/text': 0.0.11(react@18.2.0) + react: 18.2.0 + transitivePeerDependencies: + - react-dom + + '@react-email/container@0.0.15(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/font@0.0.9(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/head@0.0.12(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/heading@0.0.15(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/hr@0.0.11(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/html@0.0.11(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/img@0.0.11(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/link@0.0.12(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/markdown@0.0.14(react@18.2.0)': + dependencies: + md-to-react-email: 5.0.5(react@18.2.0) + react: 18.2.0 + + '@react-email/preview@0.0.12(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/render@1.0.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + html-to-text: 9.0.5 + prettier: 3.4.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-promise-suspense: 0.3.4 + + '@react-email/row@0.0.12(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/section@0.0.16(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/tailwind@1.0.4(react@18.2.0)': + dependencies: + react: 18.2.0 + + '@react-email/text@0.0.11(react@18.2.0)': + dependencies: + react: 18.2.0 + '@react-stately/utils@3.10.5(react@18.2.0)': dependencies: '@swc/helpers': 0.5.15 @@ -4608,12 +5840,39 @@ snapshots: '@rushstack/eslint-patch@1.10.5': {} + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + '@swc/counter@0.1.3': {} '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 + '@t3-oss/env-core@0.12.0(typescript@5.7.3)(zod@3.24.1)': + optionalDependencies: + typescript: 5.7.3 + zod: 3.24.1 + + '@t3-oss/env-nextjs@0.12.0(typescript@5.7.3)(zod@3.24.1)': + dependencies: + '@t3-oss/env-core': 0.12.0(typescript@5.7.3)(zod@3.24.1) + optionalDependencies: + typescript: 5.7.3 + zod: 3.24.1 + + '@tanstack/query-core@4.36.1': {} + + '@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tanstack/query-core': 4.36.1 + react: 18.2.0 + use-sync-external-store: 1.4.0(react@18.2.0) + optionalDependencies: + react-dom: 18.2.0(react@18.2.0) + '@tanstack/react-virtual@3.11.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@tanstack/virtual-core': 3.11.2 @@ -4622,6 +5881,30 @@ snapshots: '@tanstack/virtual-core@3.11.2': {} + '@trpc/client@10.45.2(@trpc/server@10.45.2)': + dependencies: + '@trpc/server': 10.45.2 + + '@trpc/next@10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/react-query@10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/server@10.45.2)(next@15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/react-query': 10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@trpc/server': 10.45.2 + next: 15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@trpc/react-query@10.45.2(@tanstack/react-query@4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(@trpc/client@10.45.2(@trpc/server@10.45.2))(@trpc/server@10.45.2)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@tanstack/react-query': 4.36.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@trpc/client': 10.45.2(@trpc/server@10.45.2) + '@trpc/server': 10.45.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + '@trpc/server@10.45.2': {} + '@tybys/wasm-util@0.8.3': dependencies: tslib: 2.8.1 @@ -4762,10 +6045,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-regex@2.1.1: + optional: true + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} + ansi-styles@2.2.1: + optional: true + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -4779,10 +6068,20 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arctic@3.2.1: + dependencies: + '@oslojs/crypto': 1.0.1 + '@oslojs/encoding': 1.1.0 + '@oslojs/jwt': 0.2.0 + arg@5.0.2: {} argparse@2.0.1: {} + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -4883,6 +6182,9 @@ snapshots: binary-extensions@2.3.0: {} + bluebird@2.11.0: + optional: true + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -4937,6 +6239,15 @@ snapshots: caniuse-lite@1.0.30001695: {} + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + optional: true + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -4980,6 +6291,9 @@ snapshots: color-string: 1.9.1 optional: true + commander@2.20.3: + optional: true + commander@4.1.1: {} concat-map@0.0.1: {} @@ -4990,6 +6304,13 @@ snapshots: cookie@1.0.2: {} + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + + core-util-is@1.0.3: + optional: true + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 @@ -5041,6 +6362,11 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + debug@2.6.9: + dependencies: + ms: 2.0.0 + optional: true + debug@3.2.7: dependencies: ms: 2.1.3 @@ -5051,6 +6377,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge@4.3.1: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -5068,6 +6396,8 @@ snapshots: detect-libc@2.0.3: optional: true + detect-node-es@1.1.0: {} + didyoumean@1.2.2: {} dlv@1.1.3: {} @@ -5085,6 +6415,24 @@ snapshots: '@babel/runtime': 7.26.0 csstype: 3.1.3 + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dot-case@3.0.4: dependencies: no-case: 3.0.4 @@ -5092,6 +6440,9 @@ snapshots: dotenv@16.4.7: {} + double-ended-queue@2.1.0-0: + optional: true + drizzle-kit@0.28.1: dependencies: '@drizzle-team/brocli': 0.10.2 @@ -5101,12 +6452,14 @@ snapshots: transitivePeerDependencies: - supports-color - drizzle-orm@0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(pg@8.13.1)(react@18.2.0): + drizzle-orm@0.38.4(@types/pg@8.11.11)(@types/react@18.3.18)(bun-types@1.2.0)(knex@0.8.6)(pg@8.13.1)(postgres@3.4.5)(react@18.2.0): optionalDependencies: '@types/pg': 8.11.11 '@types/react': 18.3.18 bun-types: 1.2.0 + knex: 0.8.6 pg: 8.13.1 + postgres: 3.4.5 react: 18.2.0 dunder-proto@1.0.1: @@ -5128,6 +6481,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 + entities@4.5.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -5317,6 +6672,9 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@1.0.5: + optional: true + escape-string-regexp@4.0.0: {} eslint-config-next@15.0.3(eslint@8.57.1)(typescript@5.7.3): @@ -5518,6 +6876,11 @@ snapshots: esutils@2.0.3: {} + extend@2.0.2: + optional: true + + fast-deep-equal@2.0.1: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -5559,6 +6922,14 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + findup-sync@0.2.1: + dependencies: + glob: 4.3.5 + optional: true + + flagged-respawn@0.3.2: + optional: true + flat-cache@3.2.0: dependencies: flatted: 3.3.2 @@ -5626,6 +6997,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -5660,6 +7033,14 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@4.3.5: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 2.0.10 + once: 1.4.0 + optional: true + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -5686,6 +7067,11 @@ snapshots: graphemer@1.4.0: {} + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + optional: true + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -5704,6 +7090,9 @@ snapshots: dependencies: has-symbols: 1.1.0 + hashmap@2.4.0: + optional: true + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -5712,6 +7101,21 @@ snapshots: dependencies: react-is: 16.13.1 + html-to-text@9.0.5: + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + hyphenate-style-name@1.1.0: {} ignore@5.3.2: {} @@ -5738,6 +7142,9 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 + interpret@0.5.2: + optional: true + is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -5862,6 +7269,11 @@ snapshots: call-bound: 1.0.3 get-intrinsic: 1.2.7 + is-what@4.1.16: {} + + isarray@0.0.1: + optional: true + isarray@2.0.5: {} isexe@2.0.0: {} @@ -5964,17 +7376,48 @@ snapshots: dependencies: json-buffer: 3.0.1 + knex@0.8.6: + dependencies: + bluebird: 2.11.0 + chalk: 1.1.3 + commander: 2.20.3 + debug: 2.6.9 + inherits: 2.0.4 + interpret: 0.5.2 + liftoff: 2.0.3 + lodash: 3.10.1 + minimist: 1.1.3 + mkdirp: 0.5.6 + pool2: 1.4.1 + readable-stream: 1.1.14 + tildify: 1.0.0 + v8flags: 2.1.1 + transitivePeerDependencies: + - supports-color + optional: true + language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23 + leac@0.6.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + liftoff@2.0.3: + dependencies: + extend: 2.0.2 + findup-sync: 0.2.1 + flagged-respawn: 0.3.2 + minimist: 1.1.3 + resolve: 1.1.7 + optional: true + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -5985,6 +7428,9 @@ snapshots: lodash.merge@4.6.2: {} + lodash@3.10.1: + optional: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -6006,8 +7452,15 @@ snapshots: map-obj@4.3.0: {} + marked@7.0.4: {} + math-intrinsics@1.1.0: {} + md-to-react-email@5.0.5(react@18.2.0): + dependencies: + marked: 7.0.4 + react: 18.2.0 + memfs-browser@3.5.10302: dependencies: memfs: 3.5.3 @@ -6025,6 +7478,11 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@2.0.10: + dependencies: + brace-expansion: 1.1.11 + optional: true + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -6033,16 +7491,27 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist@1.1.3: + optional: true + minimist@1.2.8: {} minipass@7.1.2: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + optional: true + motion-dom@11.18.1: dependencies: motion-utils: 11.18.1 motion-utils@11.18.1: {} + ms@2.0.0: + optional: true + ms@2.1.3: {} mz@2.7.0: @@ -6055,11 +7524,13 @@ snapshots: natural-compare@1.4.0: {} - next-auth@5.0.0-beta.25(next@15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0): + next-auth@5.0.0-beta.25(next@15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(nodemailer@6.10.0)(react@18.2.0): dependencies: - '@auth/core': 0.37.2 + '@auth/core': 0.37.2(nodemailer@6.10.0) next: 15.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 + optionalDependencies: + nodemailer: 6.10.0 next-themes@0.4.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: @@ -6098,6 +7569,8 @@ snapshots: node-releases@2.0.19: {} + nodemailer@6.10.0: {} + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -6194,6 +7667,11 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parseley@0.12.1: + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -6214,6 +7692,8 @@ snapshots: process: 0.11.10 util: 0.10.4 + peberminta@0.9.0: {} + pg-cloudflare@1.1.1: optional: true @@ -6269,6 +7749,16 @@ snapshots: pirates@4.0.6: {} + pool2@1.4.1: + dependencies: + debug: 2.6.9 + double-ended-queue: 2.1.0-0 + hashmap: 2.4.0 + simple-backoff: 1.1.0 + transitivePeerDependencies: + - supports-color + optional: true + possible-typed-array-names@1.0.0: {} postcss-import@15.1.0(postcss@8.5.1): @@ -6336,6 +7826,8 @@ snapshots: postgres-range@1.1.4: {} + postgres@3.4.5: {} + preact-render-to-string@5.2.3(preact@10.11.3): dependencies: preact: 10.11.3 @@ -6351,8 +7843,12 @@ snapshots: prelude-ls@1.2.1: {} + prettier@3.4.2: {} + pretty-format@3.8.0: {} + prismjs@1.29.0: {} + process@0.11.10: {} prop-types@15.8.1: @@ -6363,6 +7859,10 @@ snapshots: punycode@2.3.1: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + queue-microtask@1.2.3: {} react-dom@18.2.0(react@18.2.0): @@ -6379,6 +7879,37 @@ snapshots: react-is@19.0.0: {} + react-promise-suspense@0.3.4: + dependencies: + fast-deep-equal: 2.0.1 + + react-remove-scroll-bar@2.3.8(@types/react@18.3.18)(react@18.2.0): + dependencies: + react: 18.2.0 + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.2.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + react-remove-scroll@2.6.3(@types/react@18.3.18)(react@18.2.0): + dependencies: + react: 18.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.18)(react@18.2.0) + react-style-singleton: 2.2.3(@types/react@18.3.18)(react@18.2.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.18)(react@18.2.0) + use-sidecar: 1.1.3(@types/react@18.3.18)(react@18.2.0) + optionalDependencies: + '@types/react': 18.3.18 + + react-style-singleton@2.2.3(@types/react@18.3.18)(react@18.2.0): + dependencies: + get-nonce: 1.0.1 + react: 18.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + react-transition-group@4.4.5(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@babel/runtime': 7.26.0 @@ -6396,6 +7927,14 @@ snapshots: dependencies: pify: 2.3.0 + readable-stream@1.1.14: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + optional: true + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -6428,6 +7967,9 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.1.7: + optional: true + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -6473,6 +8015,10 @@ snapshots: dependencies: loose-envify: 1.4.0 + selderee@0.11.0: + dependencies: + parseley: 0.12.1 + semver@6.3.1: {} semver@7.6.3: {} @@ -6564,6 +8110,9 @@ snapshots: signal-exit@4.1.0: {} + simple-backoff@1.1.0: + optional: true + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -6580,6 +8129,11 @@ snapshots: snake-case: 3.0.4 type-fest: 4.33.0 + sonner@1.7.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -6661,6 +8215,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 + string_decoder@0.10.31: + optional: true + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + optional: true + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -6673,6 +8235,11 @@ snapshots: strip-json-comments@3.1.1: {} + stripe@17.6.0: + dependencies: + '@types/node': 20.17.16 + qs: 6.14.0 + styled-jsx@5.1.6(react@18.2.0): dependencies: client-only: 0.0.1 @@ -6690,6 +8257,13 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + superjson@2.2.2: + dependencies: + copy-anything: 3.0.5 + + supports-color@2.0.0: + optional: true + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -6749,6 +8323,11 @@ snapshots: dependencies: any-promise: 1.3.0 + tildify@1.0.0: + dependencies: + user-home: 1.1.1 + optional: true + tiny-warning@1.0.3: {} to-regex-range@5.0.1: @@ -6841,10 +8420,28 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@18.3.18)(react@18.2.0): + dependencies: + react: 18.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + + use-sidecar@1.1.3(@types/react@18.3.18)(react@18.2.0): + dependencies: + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.18 + use-sync-external-store@1.4.0(react@18.2.0): dependencies: react: 18.2.0 + user-home@1.1.1: + optional: true + util-deprecate@1.0.2: {} util@0.10.4: @@ -6853,6 +8450,11 @@ snapshots: uuid@11.0.5: {} + v8flags@2.1.1: + dependencies: + user-home: 1.1.1 + optional: true + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -6920,3 +8522,5 @@ snapshots: yaml@2.7.0: {} yocto-queue@0.1.0: {} + + zod@3.24.1: {} diff --git a/src/(auth)/layout.tsx b/src/app/(auth)/layout.tsx similarity index 100% rename from src/(auth)/layout.tsx rename to src/app/(auth)/layout.tsx diff --git a/src/(auth)/login/discord/callback/route.ts b/src/app/(auth)/login/discord/callback/route.ts similarity index 88% rename from src/(auth)/login/discord/callback/route.ts rename to src/app/(auth)/login/discord/callback/route.ts index 7b35cb3..0632ae7 100644 --- a/src/(auth)/login/discord/callback/route.ts +++ b/src/app/(auth)/login/discord/callback/route.ts @@ -5,13 +5,13 @@ import { eq } from "drizzle-orm"; import { discord, lucia } from "@/lib/auth"; import { db } from "@/server/db"; import { Paths } from "@/lib/constants"; -import { users } from "@/server/db/schema"; +import { users } from "@schemas/schema"; export async function GET(request: Request): Promise { const url = new URL(request.url); const code = url.searchParams.get("code"); const state = url.searchParams.get("state"); - const storedState = cookies().get("discord_oauth_state")?.value ?? null; + const storedState = (await cookies()).get("discord_oauth_state")?.value ?? null; if (!code || !state || !storedState || state !== storedState) { return new Response(null, { @@ -58,10 +58,10 @@ export async function GET(request: Request): Promise { }); const session = await lucia.createSession(userId, {}); const sessionCookie = lucia.createSessionCookie(session.id); - cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); + (await cookies()).set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); return new Response(null, { status: 302, - headers: { Location: Paths.Dashboard }, + headers: { Location: Paths.Home }, }); } @@ -77,10 +77,10 @@ export async function GET(request: Request): Promise { } const session = await lucia.createSession(existingUser.id, {}); const sessionCookie = lucia.createSessionCookie(session.id); - cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); + (await cookies()).set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes); return new Response(null, { status: 302, - headers: { Location: Paths.Dashboard }, + headers: { Location: Paths.Home }, }); } catch (e) { // the specific error message depends on the provider diff --git a/src/(auth)/login/discord/route.ts b/src/app/(auth)/login/discord/route.ts similarity index 100% rename from src/(auth)/login/discord/route.ts rename to src/app/(auth)/login/discord/route.ts diff --git a/src/(auth)/login/login.tsx b/src/app/(auth)/login/login.tsx similarity index 100% rename from src/(auth)/login/login.tsx rename to src/app/(auth)/login/login.tsx diff --git a/src/(auth)/login/page.tsx b/src/app/(auth)/login/page.tsx similarity index 90% rename from src/(auth)/login/page.tsx rename to src/app/(auth)/login/page.tsx index 919ea84..e5b503b 100644 --- a/src/(auth)/login/page.tsx +++ b/src/app/(auth)/login/page.tsx @@ -11,7 +11,7 @@ export const metadata = { export default async function LoginPage() { const { user } = await validateRequest(); - if (user) redirect(Paths.Dashboard); + if (user) redirect(Paths.Home); return ; } diff --git a/src/(auth)/reset-password/[token]/page.tsx b/src/app/(auth)/reset-password/[token]/page.tsx similarity index 100% rename from src/(auth)/reset-password/[token]/page.tsx rename to src/app/(auth)/reset-password/[token]/page.tsx diff --git a/src/(auth)/reset-password/[token]/reset-password.tsx b/src/app/(auth)/reset-password/[token]/reset-password.tsx similarity index 100% rename from src/(auth)/reset-password/[token]/reset-password.tsx rename to src/app/(auth)/reset-password/[token]/reset-password.tsx diff --git a/src/(auth)/reset-password/page.tsx b/src/app/(auth)/reset-password/page.tsx similarity index 95% rename from src/(auth)/reset-password/page.tsx rename to src/app/(auth)/reset-password/page.tsx index b016333..1747177 100644 --- a/src/(auth)/reset-password/page.tsx +++ b/src/app/(auth)/reset-password/page.tsx @@ -18,7 +18,7 @@ export const metadata = { export default async function ForgotPasswordPage() { const { user } = await validateRequest(); - if (user) redirect(Paths.Dashboard); + if (user) redirect(Paths.Home); return ( diff --git a/src/(auth)/reset-password/send-reset-email.tsx b/src/app/(auth)/reset-password/send-reset-email.tsx similarity index 100% rename from src/(auth)/reset-password/send-reset-email.tsx rename to src/app/(auth)/reset-password/send-reset-email.tsx diff --git a/src/(auth)/signup/page.tsx b/src/app/(auth)/signup/page.tsx similarity index 100% rename from src/(auth)/signup/page.tsx rename to src/app/(auth)/signup/page.tsx diff --git a/src/(auth)/signup/signup.tsx b/src/app/(auth)/signup/signup.tsx similarity index 100% rename from src/(auth)/signup/signup.tsx rename to src/app/(auth)/signup/signup.tsx diff --git a/src/(auth)/verify-email/page.tsx b/src/app/(auth)/verify-email/page.tsx similarity index 94% rename from src/(auth)/verify-email/page.tsx rename to src/app/(auth)/verify-email/page.tsx index 611ade4..35b35f4 100644 --- a/src/(auth)/verify-email/page.tsx +++ b/src/app/(auth)/verify-email/page.tsx @@ -19,7 +19,7 @@ export default async function VerifyEmailPage() { const { user } = await validateRequest(); if (!user) redirect(Paths.Login); - if (user.emailVerified) redirect(Paths.Dashboard); + if (user.emailVerified) redirect(Paths.Home); return ( diff --git a/src/(auth)/verify-email/verify-code.tsx b/src/app/(auth)/verify-email/verify-code.tsx similarity index 100% rename from src/(auth)/verify-email/verify-code.tsx rename to src/app/(auth)/verify-email/verify-code.tsx diff --git a/src/(landing)/_components/copy-to-clipboard.tsx b/src/app/(landing)/_components/copy-to-clipboard.tsx similarity index 100% rename from src/(landing)/_components/copy-to-clipboard.tsx rename to src/app/(landing)/_components/copy-to-clipboard.tsx diff --git a/src/(landing)/_components/feature-icons.tsx b/src/app/(landing)/_components/feature-icons.tsx similarity index 100% rename from src/(landing)/_components/feature-icons.tsx rename to src/app/(landing)/_components/feature-icons.tsx diff --git a/src/(landing)/_components/footer.tsx b/src/app/(landing)/_components/footer.tsx similarity index 100% rename from src/(landing)/_components/footer.tsx rename to src/app/(landing)/_components/footer.tsx diff --git a/src/(landing)/_components/header.tsx b/src/app/(landing)/_components/header.tsx similarity index 100% rename from src/(landing)/_components/header.tsx rename to src/app/(landing)/_components/header.tsx diff --git a/src/(landing)/_components/hover-card.tsx b/src/app/(landing)/_components/hover-card.tsx similarity index 100% rename from src/(landing)/_components/hover-card.tsx rename to src/app/(landing)/_components/hover-card.tsx diff --git a/src/(landing)/layout.tsx b/src/app/(landing)/layout.tsx similarity index 100% rename from src/(landing)/layout.tsx rename to src/app/(landing)/layout.tsx diff --git a/src/(landing)/page.tsx b/src/app/(landing)/page-lucia.tsx similarity index 100% rename from src/(landing)/page.tsx rename to src/app/(landing)/page-lucia.tsx diff --git a/src/(main)/_components/footer.tsx b/src/app/(main)/_components/footer.tsx similarity index 100% rename from src/(main)/_components/footer.tsx rename to src/app/(main)/_components/footer.tsx diff --git a/src/(main)/_components/header.tsx b/src/app/(main)/_components/header.tsx similarity index 100% rename from src/(main)/_components/header.tsx rename to src/app/(main)/_components/header.tsx diff --git a/src/(main)/_components/user-dropdown.tsx b/src/app/(main)/_components/user-dropdown.tsx similarity index 100% rename from src/(main)/_components/user-dropdown.tsx rename to src/app/(main)/_components/user-dropdown.tsx diff --git a/src/(main)/account/page.tsx b/src/app/(main)/account/page.tsx similarity index 100% rename from src/(main)/account/page.tsx rename to src/app/(main)/account/page.tsx diff --git a/src/(main)/dashboard/_components/dashboard-nav.tsx b/src/app/(main)/dashboard/_components/dashboard-nav.tsx similarity index 100% rename from src/(main)/dashboard/_components/dashboard-nav.tsx rename to src/app/(main)/dashboard/_components/dashboard-nav.tsx diff --git a/src/(main)/dashboard/_components/new-post.tsx b/src/app/(main)/dashboard/_components/new-post.tsx similarity index 100% rename from src/(main)/dashboard/_components/new-post.tsx rename to src/app/(main)/dashboard/_components/new-post.tsx diff --git a/src/(main)/dashboard/_components/post-card-skeleton.tsx b/src/app/(main)/dashboard/_components/post-card-skeleton.tsx similarity index 100% rename from src/(main)/dashboard/_components/post-card-skeleton.tsx rename to src/app/(main)/dashboard/_components/post-card-skeleton.tsx diff --git a/src/(main)/dashboard/_components/post-card.tsx b/src/app/(main)/dashboard/_components/post-card.tsx similarity index 100% rename from src/(main)/dashboard/_components/post-card.tsx rename to src/app/(main)/dashboard/_components/post-card.tsx diff --git a/src/(main)/dashboard/_components/posts-skeleton.tsx b/src/app/(main)/dashboard/_components/posts-skeleton.tsx similarity index 100% rename from src/(main)/dashboard/_components/posts-skeleton.tsx rename to src/app/(main)/dashboard/_components/posts-skeleton.tsx diff --git a/src/(main)/dashboard/_components/posts.tsx b/src/app/(main)/dashboard/_components/posts.tsx similarity index 100% rename from src/(main)/dashboard/_components/posts.tsx rename to src/app/(main)/dashboard/_components/posts.tsx diff --git a/src/(main)/dashboard/_components/verificiation-warning.tsx b/src/app/(main)/dashboard/_components/verificiation-warning.tsx similarity index 100% rename from src/(main)/dashboard/_components/verificiation-warning.tsx rename to src/app/(main)/dashboard/_components/verificiation-warning.tsx diff --git a/src/(main)/dashboard/billing/_components/billing-skeleton.tsx b/src/app/(main)/dashboard/billing/_components/billing-skeleton.tsx similarity index 100% rename from src/(main)/dashboard/billing/_components/billing-skeleton.tsx rename to src/app/(main)/dashboard/billing/_components/billing-skeleton.tsx diff --git a/src/(main)/dashboard/billing/_components/billing.tsx b/src/app/(main)/dashboard/billing/_components/billing.tsx similarity index 100% rename from src/(main)/dashboard/billing/_components/billing.tsx rename to src/app/(main)/dashboard/billing/_components/billing.tsx diff --git a/src/(main)/dashboard/billing/_components/manage-subscription-form.tsx b/src/app/(main)/dashboard/billing/_components/manage-subscription-form.tsx similarity index 100% rename from src/(main)/dashboard/billing/_components/manage-subscription-form.tsx rename to src/app/(main)/dashboard/billing/_components/manage-subscription-form.tsx diff --git a/src/(main)/dashboard/billing/page.tsx b/src/app/(main)/dashboard/billing/page.tsx similarity index 100% rename from src/(main)/dashboard/billing/page.tsx rename to src/app/(main)/dashboard/billing/page.tsx diff --git a/src/(main)/dashboard/layout.tsx b/src/app/(main)/dashboard/layout.tsx similarity index 100% rename from src/(main)/dashboard/layout.tsx rename to src/app/(main)/dashboard/layout.tsx diff --git a/src/(main)/dashboard/page.tsx b/src/app/(main)/dashboard/page.tsx similarity index 91% rename from src/(main)/dashboard/page.tsx rename to src/app/(main)/dashboard/page.tsx index 2ff425d..cfa1ce0 100644 --- a/src/(main)/dashboard/page.tsx +++ b/src/app/(main)/dashboard/page.tsx @@ -1,3 +1,4 @@ + import { env } from "@/env"; import { validateRequest } from "@/lib/auth/validate-request"; import { Paths } from "@/lib/constants"; @@ -20,7 +21,7 @@ interface Props { } export default async function DashboardPage({ searchParams }: Props) { - const { page, perPage } = myPostsSchema.parse(searchParams); + //const { page, perPage } = myPostsSchema.parse(searchParams); const { user } = await validateRequest(); if (!user) redirect(Paths.Login); @@ -32,7 +33,7 @@ export default async function DashboardPage({ searchParams }: Props) { * @see https://nextjs.org/docs/app/building-your-application/data-fetching/patterns#parallel-data-fetching */ const promises = Promise.all([ - api.post.myPosts.query({ page, perPage }), + // api.post.myPosts.query({ page, perPage }), api.stripe.getPlan.query(), ]); @@ -43,7 +44,7 @@ export default async function DashboardPage({ searchParams }: Props) {

Manage your posts here

}> - + {/* */} ); diff --git a/src/(main)/dashboard/settings/page.tsx b/src/app/(main)/dashboard/settings/page.tsx similarity index 100% rename from src/(main)/dashboard/settings/page.tsx rename to src/app/(main)/dashboard/settings/page.tsx diff --git a/src/(main)/editor/[postId]/_components/post-editor.tsx b/src/app/(main)/editor/[postId]/_components/post-editor.tsx similarity index 100% rename from src/(main)/editor/[postId]/_components/post-editor.tsx rename to src/app/(main)/editor/[postId]/_components/post-editor.tsx diff --git a/src/(main)/editor/[postId]/_components/post-preview.tsx b/src/app/(main)/editor/[postId]/_components/post-preview.tsx similarity index 100% rename from src/(main)/editor/[postId]/_components/post-preview.tsx rename to src/app/(main)/editor/[postId]/_components/post-preview.tsx diff --git a/src/(main)/editor/[postId]/page.tsx b/src/app/(main)/editor/[postId]/page.tsx similarity index 100% rename from src/(main)/editor/[postId]/page.tsx rename to src/app/(main)/editor/[postId]/page.tsx diff --git a/src/(main)/layout.tsx b/src/app/(main)/layout.tsx similarity index 100% rename from src/(main)/layout.tsx rename to src/app/(main)/layout.tsx diff --git a/src/app/Admin/Accounts/page.tsx b/src/app/Admin/Accounts/page.tsx index ec1f0c7..312f8d1 100644 --- a/src/app/Admin/Accounts/page.tsx +++ b/src/app/Admin/Accounts/page.tsx @@ -2,7 +2,7 @@ import { accounts } from "@schemas/schema"; import { getViewAccounts } from "@actions/accountActions"; import AccountsTable from "@components/AccountsTable"; // Adjust the import path as necessary import React, { Suspense } from 'react'; -import { ColumnHeadings } from "@lib/utils"; +import { ColumnHeadings } from "@src/lib/bb_utils"; import PageHero from "@components/PageHero"; diff --git a/src/app/Admin/Users/page.tsx b/src/app/Admin/Users/page.tsx index c2e8c60..750d047 100644 --- a/src/app/Admin/Users/page.tsx +++ b/src/app/Admin/Users/page.tsx @@ -4,7 +4,7 @@ import PageHero from "@components/PageHero"; import UsersTable from "@src/components/admin/UsersTable"; import { Suspense } from "react"; import Loading from "@src/components/Loading/loading"; -import { ColumnHeadings } from "@src/lib/utils"; +import { ColumnHeadings } from "@src/lib/bb_utils"; export default async function UsersPage() { const data = await getData(); diff --git a/src/app/api/[trpc]/route.ts b/src/app/api/[trpc]/route.ts new file mode 100644 index 0000000..e04046c --- /dev/null +++ b/src/app/api/[trpc]/route.ts @@ -0,0 +1,32 @@ +import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; +import { type NextRequest } from "next/server"; + +import { env } from "@/env"; +import { appRouter } from "@/server/api/root"; +import { createTRPCContext } from "@/server/api/trpc"; + +/** + * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when + * handling a HTTP request (e.g. when you make requests from Client Components). + */ +const createContext = async (req: NextRequest) => { + return createTRPCContext({ headers: req.headers }); +}; + +const handler = (req: NextRequest) => + fetchRequestHandler({ + endpoint: "/api/trpc", + req, + router: appRouter, + createContext: () => createContext(req), + onError: + env.NODE_ENV === "development" + ? ({ path, error }) => { + console.error( + `❌ tRPC failed on ${path ?? ""}: ${error.message}`, + ); + } + : undefined, + }); + +export { handler as GET, handler as POST }; diff --git a/src/app/api/webhooks/stripe/route.ts b/src/app/api/webhooks/stripe/route.ts new file mode 100644 index 0000000..cf478fc --- /dev/null +++ b/src/app/api/webhooks/stripe/route.ts @@ -0,0 +1,98 @@ +import { headers } from "next/headers"; + +import type Stripe from "stripe"; + +import { env } from "@/env"; +import { stripe } from "@/lib/stripe"; +import { db } from "@/server/db"; +import { users } from "@schemas/schema"; +import { eq } from "drizzle-orm"; + +export async function POST(req: Request) { + const body = await req.text(); + const signature = headers().get("Stripe-Signature") ?? ""; + + let event: Stripe.Event; + + try { + event = stripe.webhooks.constructEvent( + body, + signature, + env.STRIPE_WEBHOOK_SECRET, + ); + } catch (err) { + return new Response( + `Webhook Error: ${err instanceof Error ? err.message : "Unknown error."}`, + { status: 400 }, + ); + } + + switch (event.type) { + case "checkout.session.completed": { + const checkoutSessionCompleted = event.data.object; + + const userId = checkoutSessionCompleted?.metadata?.userId; + + if (!userId) { + return new Response("User id not found in checkout session metadata.", { + status: 404, + }); + } + + // Retrieve the subscription details from Stripe + const subscription = await stripe.subscriptions.retrieve( + checkoutSessionCompleted.subscription as string, + ); + + // Update the user stripe into in our database + // Since this is the initial subscription, we need to update + // the subscription id and customer id + await db + .update(users) + .set({ + stripeSubscriptionId: subscription.id, + stripeCustomerId: subscription.customer as string, + stripePriceId: subscription.items.data[0]?.price.id, + stripeCurrentPeriodEnd: new Date( + subscription.current_period_end * 1000, + ), + }) + .where(eq(users.id, userId)); + + break; + } + case "invoice.payment_succeeded": { + const invoicePaymentSucceeded = event.data.object; + + const userId = invoicePaymentSucceeded?.metadata?.userId; + + if (!userId) { + return new Response("User id not found in invoice metadata.", { + status: 404, + }); + } + + // Retrieve the subscription details from Stripe + const subscription = await stripe.subscriptions.retrieve( + invoicePaymentSucceeded.subscription as string, + ); + + // Update the price id and set the new period end + await db + .update(users) + .set({ + stripePriceId: subscription.items.data[0]?.price.id, + stripeCurrentPeriodEnd: new Date( + subscription.current_period_end * 1000, + ), + }) + .where(eq(users.id, userId)); + + break; + } + default: + console.warn(`Unhandled event type: ${event.type}`); + } + + return new Response(null, { status: 200 }); +} diff --git a/src/app/icon.tsx b/src/app/icon.tsx new file mode 100644 index 0000000..817cdc9 --- /dev/null +++ b/src/app/icon.tsx @@ -0,0 +1,48 @@ +import { ImageResponse } from "next/og"; + +// Route segment config +export const runtime = "edge"; + +// Image metadata +export const size = { + width: 32, + height: 32, +}; +export const contentType = "image/png"; + +// Image generation +export default function Icon() { + return new ImageResponse( + ( + // ImageResponse JSX element +
+ + + +
+ ), + // ImageResponse options + { + // For convenience, we can re-use the exported icons size metadata + // config to also set the ImageResponse's width and height. + ...size, + }, + ); +} diff --git a/src/app/signin/layout.tsx b/src/app/signin-old/layout.tsx similarity index 100% rename from src/app/signin/layout.tsx rename to src/app/signin-old/layout.tsx diff --git a/src/app/signin/page.tsx b/src/app/signin-old/page.tsx similarity index 100% rename from src/app/signin/page.tsx rename to src/app/signin-old/page.tsx diff --git a/src/components/AccountsTable/index.tsx b/src/components/AccountsTable/index.tsx index 88a256a..0089804 100644 --- a/src/components/AccountsTable/index.tsx +++ b/src/components/AccountsTable/index.tsx @@ -1,7 +1,7 @@ import React from "react"; import { ChevronDownIcon } from "@heroicons/react/20/solid"; import { PlusCircleIcon } from "@heroicons/react/20/solid"; -import { ColumnHeadings } from "@src/lib/utils"; +import { ColumnHeadings } from "@src/lib/bb_utils"; import styles from '../styles.module.css'; import PageHero from "@components/PageHero"; diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx index 27417fe..fe9d4cf 100644 --- a/src/components/Header/index.tsx +++ b/src/components/Header/index.tsx @@ -27,7 +27,7 @@ const Header: React.FC = () => { href="/auth/signin" passHref style={{ color: '#FFFFFF', textDecoration: 'underline' }}> - Sign In + Sign In to BB diff --git a/src/components/PopNav/page.tsx b/src/components/PopNav/page.tsx index 74a027c..0812801 100644 --- a/src/components/PopNav/page.tsx +++ b/src/components/PopNav/page.tsx @@ -205,10 +205,10 @@ export default function PopNav() {
@@ -360,10 +360,10 @@ export default function PopNav() {
diff --git a/src/components/icons copy.tsx b/src/components/icons copy.tsx new file mode 100644 index 0000000..1fb48eb --- /dev/null +++ b/src/components/icons copy.tsx @@ -0,0 +1,115 @@ +import { forwardRef, type SVGProps } from "react"; +import { cn } from "@/lib/utils"; + +const AnimatedSpinner = forwardRef>( + ({ className, ...props }, ref) => ( + + + + + + + + + + + + ), +); +AnimatedSpinner.displayName = "AnimatedSpinner"; + +const CreditCard = forwardRef>( + ({ className, ...props }, ref) => ( + + + + + ), +); +CreditCard.displayName = "CreditCard"; + +export { AnimatedSpinner, CreditCard }; + +export { + EyeOpenIcon, + EyeNoneIcon as EyeCloseIcon, + SunIcon, + MoonIcon, + ExclamationTriangleIcon, + ExitIcon, + EnterIcon, + GearIcon, + RocketIcon, + PlusIcon, + HamburgerMenuIcon, + Pencil2Icon, + UpdateIcon, + CheckCircledIcon, + PlayIcon, + TrashIcon, + ArchiveIcon, + ResetIcon, + DiscordLogoIcon, + FileTextIcon, + IdCardIcon, + PlusCircledIcon, + FilePlusIcon, + CheckIcon, + ChevronLeftIcon, + ChevronRightIcon, + DotsHorizontalIcon, + ArrowLeftIcon, +} from "@radix-ui/react-icons"; diff --git a/src/components/icons.tsx b/src/components/icons.tsx new file mode 100644 index 0000000..1fb48eb --- /dev/null +++ b/src/components/icons.tsx @@ -0,0 +1,115 @@ +import { forwardRef, type SVGProps } from "react"; +import { cn } from "@/lib/utils"; + +const AnimatedSpinner = forwardRef>( + ({ className, ...props }, ref) => ( + + + + + + + + + + + + ), +); +AnimatedSpinner.displayName = "AnimatedSpinner"; + +const CreditCard = forwardRef>( + ({ className, ...props }, ref) => ( + + + + + ), +); +CreditCard.displayName = "CreditCard"; + +export { AnimatedSpinner, CreditCard }; + +export { + EyeOpenIcon, + EyeNoneIcon as EyeCloseIcon, + SunIcon, + MoonIcon, + ExclamationTriangleIcon, + ExitIcon, + EnterIcon, + GearIcon, + RocketIcon, + PlusIcon, + HamburgerMenuIcon, + Pencil2Icon, + UpdateIcon, + CheckCircledIcon, + PlayIcon, + TrashIcon, + ArchiveIcon, + ResetIcon, + DiscordLogoIcon, + FileTextIcon, + IdCardIcon, + PlusCircledIcon, + FilePlusIcon, + CheckIcon, + ChevronLeftIcon, + ChevronRightIcon, + DotsHorizontalIcon, + ArrowLeftIcon, +} from "@radix-ui/react-icons"; diff --git a/src/components/loading-button copy.tsx b/src/components/loading-button copy.tsx new file mode 100644 index 0000000..6fa9f67 --- /dev/null +++ b/src/components/loading-button copy.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { forwardRef } from "react"; +import { AnimatedSpinner } from "@/components/icons"; +import { Button, type ButtonProps } from "@/components/ui/button"; + +import { cn } from "@/lib/utils"; + +export interface LoadingButtonProps extends ButtonProps { + loading?: boolean; +} + +const LoadingButton = forwardRef( + ({ loading = false, className, children, ...props }, ref) => { + return ( + + ); + }, +); + +LoadingButton.displayName = "LoadingButton"; + +export { LoadingButton }; diff --git a/src/components/loading-button.tsx b/src/components/loading-button.tsx new file mode 100644 index 0000000..6fa9f67 --- /dev/null +++ b/src/components/loading-button.tsx @@ -0,0 +1,35 @@ +"use client"; + +import { forwardRef } from "react"; +import { AnimatedSpinner } from "@/components/icons"; +import { Button, type ButtonProps } from "@/components/ui/button"; + +import { cn } from "@/lib/utils"; + +export interface LoadingButtonProps extends ButtonProps { + loading?: boolean; +} + +const LoadingButton = forwardRef( + ({ loading = false, className, children, ...props }, ref) => { + return ( + + ); + }, +); + +LoadingButton.displayName = "LoadingButton"; + +export { LoadingButton }; diff --git a/src/components/password-input copy.tsx b/src/components/password-input copy.tsx new file mode 100644 index 0000000..ef576f6 --- /dev/null +++ b/src/components/password-input copy.tsx @@ -0,0 +1,45 @@ +"use client"; + +import * as React from "react"; +import { EyeOpenIcon, EyeCloseIcon } from "@/components/icons"; +import { Button } from "@/components/ui/button"; +import { Input, type InputProps } from "@/components/ui/input"; + +import { cn } from "@/lib/utils"; + +const PasswordInputComponent = React.forwardRef( + ({ className, ...props }, ref) => { + const [showPassword, setShowPassword] = React.useState(false); + + return ( +
+ + +
+ ); + }, +); +PasswordInputComponent.displayName = "PasswordInput"; + +export const PasswordInput = PasswordInputComponent; diff --git a/src/components/password-input.tsx b/src/components/password-input.tsx new file mode 100644 index 0000000..ef576f6 --- /dev/null +++ b/src/components/password-input.tsx @@ -0,0 +1,45 @@ +"use client"; + +import * as React from "react"; +import { EyeOpenIcon, EyeCloseIcon } from "@/components/icons"; +import { Button } from "@/components/ui/button"; +import { Input, type InputProps } from "@/components/ui/input"; + +import { cn } from "@/lib/utils"; + +const PasswordInputComponent = React.forwardRef( + ({ className, ...props }, ref) => { + const [showPassword, setShowPassword] = React.useState(false); + + return ( +
+ + +
+ ); + }, +); +PasswordInputComponent.displayName = "PasswordInput"; + +export const PasswordInput = PasswordInputComponent; diff --git a/src/components/responsive-dialog copy.tsx b/src/components/responsive-dialog copy.tsx new file mode 100644 index 0000000..1344834 --- /dev/null +++ b/src/components/responsive-dialog copy.tsx @@ -0,0 +1,102 @@ +"use client"; + +import { + useState, + type ReactNode, + type Dispatch, + type SetStateAction, +} from "react"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogTitle, + DialogContent, + DialogDescription, + DialogHeader, + DialogTrigger, + DialogFooter, +} from "@/components/ui/dialog"; +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, + DrawerTrigger, +} from "@/components/ui/drawer"; +import { useMediaQuery } from "@/lib/hooks/use-media-query"; +import { cn } from "@/lib/utils"; + +type StatefulContent = ({ + open, + setOpen, +}: { + open: boolean; + setOpen: Dispatch>; +}) => ReactNode | ReactNode[]; + +export const ResponsiveDialog = (props: { + trigger: ReactNode; + title?: ReactNode; + description?: ReactNode; + children: ReactNode | ReactNode[] | StatefulContent; + footer?: ReactNode; + contentClassName?: string; +}) => { + const [open, setOpen] = useState(false); + const isDesktop = useMediaQuery("(min-width: 640px)"); + + return isDesktop ? ( + + {props.trigger} + + + {props.title} + {props.description} + + {isFunctionType(props.children) + ? props.children({ open, setOpen }) + : props.children} + + {props.footer ? {props.footer} : null} + + ) : ( + + {props.trigger} + + + {props.title} + {props.description} + +
+ {isFunctionType(props.children) + ? props.children({ open, setOpen }) + : props.children} +
+ + {props.footer ? ( + props.footer + ) : ( + + + + )} + +
+
+ ); +}; + +const isFunctionType = ( + prop: ReactNode | ReactNode[] | StatefulContent, +): prop is ({ + open, + setOpen, +}: { + open: boolean; + setOpen: Dispatch>; +}) => ReactNode | ReactNode[] => { + return typeof prop === "function"; +}; diff --git a/src/components/responsive-dialog.tsx b/src/components/responsive-dialog.tsx new file mode 100644 index 0000000..1344834 --- /dev/null +++ b/src/components/responsive-dialog.tsx @@ -0,0 +1,102 @@ +"use client"; + +import { + useState, + type ReactNode, + type Dispatch, + type SetStateAction, +} from "react"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogTitle, + DialogContent, + DialogDescription, + DialogHeader, + DialogTrigger, + DialogFooter, +} from "@/components/ui/dialog"; +import { + Drawer, + DrawerClose, + DrawerContent, + DrawerDescription, + DrawerFooter, + DrawerHeader, + DrawerTitle, + DrawerTrigger, +} from "@/components/ui/drawer"; +import { useMediaQuery } from "@/lib/hooks/use-media-query"; +import { cn } from "@/lib/utils"; + +type StatefulContent = ({ + open, + setOpen, +}: { + open: boolean; + setOpen: Dispatch>; +}) => ReactNode | ReactNode[]; + +export const ResponsiveDialog = (props: { + trigger: ReactNode; + title?: ReactNode; + description?: ReactNode; + children: ReactNode | ReactNode[] | StatefulContent; + footer?: ReactNode; + contentClassName?: string; +}) => { + const [open, setOpen] = useState(false); + const isDesktop = useMediaQuery("(min-width: 640px)"); + + return isDesktop ? ( + + {props.trigger} + + + {props.title} + {props.description} + + {isFunctionType(props.children) + ? props.children({ open, setOpen }) + : props.children} + + {props.footer ? {props.footer} : null} + + ) : ( + + {props.trigger} + + + {props.title} + {props.description} + +
+ {isFunctionType(props.children) + ? props.children({ open, setOpen }) + : props.children} +
+ + {props.footer ? ( + props.footer + ) : ( + + + + )} + +
+
+ ); +}; + +const isFunctionType = ( + prop: ReactNode | ReactNode[] | StatefulContent, +): prop is ({ + open, + setOpen, +}: { + open: boolean; + setOpen: Dispatch>; +}) => ReactNode | ReactNode[] => { + return typeof prop === "function"; +}; diff --git a/src/components/submit-button copy.tsx b/src/components/submit-button copy.tsx new file mode 100644 index 0000000..820b5d3 --- /dev/null +++ b/src/components/submit-button copy.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { forwardRef } from "react"; +import { useFormStatus } from "react-dom"; +import { LoadingButton } from "@/components/loading-button"; +import type { ButtonProps } from "@/components/ui/button"; + +const SubmitButton = forwardRef( + ({ className, children, ...props }, ref) => { + const { pending } = useFormStatus(); + return ( + + {children} + + ); + }, +); +SubmitButton.displayName = "SubmitButton"; + +export { SubmitButton }; diff --git a/src/components/submit-button.tsx b/src/components/submit-button.tsx new file mode 100644 index 0000000..820b5d3 --- /dev/null +++ b/src/components/submit-button.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { forwardRef } from "react"; +import { useFormStatus } from "react-dom"; +import { LoadingButton } from "@/components/loading-button"; +import type { ButtonProps } from "@/components/ui/button"; + +const SubmitButton = forwardRef( + ({ className, children, ...props }, ref) => { + const { pending } = useFormStatus(); + return ( + + {children} + + ); + }, +); +SubmitButton.displayName = "SubmitButton"; + +export { SubmitButton }; diff --git a/src/components/theme-provider copy.tsx b/src/components/theme-provider copy.tsx new file mode 100644 index 0000000..b0ff266 --- /dev/null +++ b/src/components/theme-provider copy.tsx @@ -0,0 +1,9 @@ +"use client"; + +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children}; +} diff --git a/src/components/theme-provider.tsx b/src/components/theme-provider.tsx new file mode 100644 index 0000000..b0ff266 --- /dev/null +++ b/src/components/theme-provider.tsx @@ -0,0 +1,9 @@ +"use client"; + +import * as React from "react"; +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import { type ThemeProviderProps } from "next-themes/dist/types"; + +export function ThemeProvider({ children, ...props }: ThemeProviderProps) { + return {children}; +} diff --git a/src/components/theme-toggle copy.tsx b/src/components/theme-toggle copy.tsx new file mode 100644 index 0000000..08ecc74 --- /dev/null +++ b/src/components/theme-toggle copy.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { SunIcon, MoonIcon } from "@/components/icons"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export const ThemeToggle = () => { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); +}; diff --git a/src/components/theme-toggle.tsx b/src/components/theme-toggle.tsx new file mode 100644 index 0000000..08ecc74 --- /dev/null +++ b/src/components/theme-toggle.tsx @@ -0,0 +1,38 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { SunIcon, MoonIcon } from "@/components/icons"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export const ThemeToggle = () => { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); +}; diff --git a/src/components/ui/alert-dialog.tsx b/src/components/ui/alert-dialog.tsx new file mode 100644 index 0000000..25e7b47 --- /dev/null +++ b/src/components/ui/alert-dialog.tsx @@ -0,0 +1,141 @@ +"use client" + +import * as React from "react" +import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +const AlertDialog = AlertDialogPrimitive.Root + +const AlertDialogTrigger = AlertDialogPrimitive.Trigger + +const AlertDialogPortal = AlertDialogPrimitive.Portal + +const AlertDialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName + +const AlertDialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + +)) +AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName + +const AlertDialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogHeader.displayName = "AlertDialogHeader" + +const AlertDialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +AlertDialogFooter.displayName = "AlertDialogFooter" + +const AlertDialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName + +const AlertDialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogDescription.displayName = + AlertDialogPrimitive.Description.displayName + +const AlertDialogAction = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName + +const AlertDialogCancel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName + +export { + AlertDialog, + AlertDialogPortal, + AlertDialogOverlay, + AlertDialogTrigger, + AlertDialogContent, + AlertDialogHeader, + AlertDialogFooter, + AlertDialogTitle, + AlertDialogDescription, + AlertDialogAction, + AlertDialogCancel, +} diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx new file mode 100644 index 0000000..41fa7e0 --- /dev/null +++ b/src/components/ui/alert.tsx @@ -0,0 +1,59 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const alertVariants = cva( + "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground", + { + variants: { + variant: { + default: "bg-background text-foreground", + destructive: + "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +const Alert = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes & VariantProps +>(({ className, variant, ...props }, ref) => ( +
+)) +Alert.displayName = "Alert" + +const AlertTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertTitle.displayName = "AlertTitle" + +const AlertDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +AlertDescription.displayName = "AlertDescription" + +export { Alert, AlertTitle, AlertDescription } diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..f000e3e --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,36 @@ +import * as React from "react" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const badgeVariants = cva( + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", + { + variants: { + variant: { + default: + "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", + secondary: + "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: + "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", + outline: "text-foreground", + }, + }, + defaultVariants: { + variant: "default", + }, + } +) + +export interface BadgeProps + extends React.HTMLAttributes, + VariantProps {} + +function Badge({ className, variant, ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge, badgeVariants } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..85d20f2 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { cva, type VariantProps } from "class-variance-authority" + +import { cn } from "@/lib/utils" + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +) + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button" + return ( + + ) + } +) +Button.displayName = "Button" + +export { Button, buttonVariants } diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx new file mode 100644 index 0000000..afa13ec --- /dev/null +++ b/src/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx new file mode 100644 index 0000000..e93db29 --- /dev/null +++ b/src/components/ui/dialog.tsx @@ -0,0 +1,122 @@ +"use client" + +import * as React from "react" +import * as DialogPrimitive from "@radix-ui/react-dialog" +import { Cross1Icon } from "@radix-ui/react-icons"; + +import { cn } from "@/lib/utils" + +const Dialog = DialogPrimitive.Root + +const DialogTrigger = DialogPrimitive.Trigger + +const DialogPortal = DialogPrimitive.Portal + +const DialogClose = DialogPrimitive.Close + +const DialogOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogOverlay.displayName = DialogPrimitive.Overlay.displayName + +const DialogContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)); +DialogContent.displayName = DialogPrimitive.Content.displayName + +const DialogHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogHeader.displayName = "DialogHeader" + +const DialogFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DialogFooter.displayName = "DialogFooter" + +const DialogTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogTitle.displayName = DialogPrimitive.Title.displayName + +const DialogDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DialogDescription.displayName = DialogPrimitive.Description.displayName + +export { + Dialog, + DialogPortal, + DialogOverlay, + DialogClose, + DialogTrigger, + DialogContent, + DialogHeader, + DialogFooter, + DialogTitle, + DialogDescription, +} diff --git a/src/components/ui/drawer.tsx b/src/components/ui/drawer.tsx new file mode 100644 index 0000000..6a0ef53 --- /dev/null +++ b/src/components/ui/drawer.tsx @@ -0,0 +1,118 @@ +"use client" + +import * as React from "react" +import { Drawer as DrawerPrimitive } from "vaul" + +import { cn } from "@/lib/utils" + +const Drawer = ({ + shouldScaleBackground = true, + ...props +}: React.ComponentProps) => ( + +) +Drawer.displayName = "Drawer" + +const DrawerTrigger = DrawerPrimitive.Trigger + +const DrawerPortal = DrawerPrimitive.Portal + +const DrawerClose = DrawerPrimitive.Close + +const DrawerOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName + +const DrawerContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + +
+ {children} + + +)) +DrawerContent.displayName = "DrawerContent" + +const DrawerHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DrawerHeader.displayName = "DrawerHeader" + +const DrawerFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +DrawerFooter.displayName = "DrawerFooter" + +const DrawerTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerTitle.displayName = DrawerPrimitive.Title.displayName + +const DrawerDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DrawerDescription.displayName = DrawerPrimitive.Description.displayName + +export { + Drawer, + DrawerPortal, + DrawerOverlay, + DrawerTrigger, + DrawerClose, + DrawerContent, + DrawerHeader, + DrawerFooter, + DrawerTitle, + DrawerDescription, +} diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..242b07a --- /dev/null +++ b/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,205 @@ +"use client" + +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { + CheckIcon, + ChevronRightIcon, + DotFilledIcon, +} from "@radix-ui/react-icons" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx new file mode 100644 index 0000000..2338de7 --- /dev/null +++ b/src/components/ui/form.tsx @@ -0,0 +1,177 @@ +import * as React from "react"; +import type * as LabelPrimitive from "@radix-ui/react-label"; +import { Slot } from "@radix-ui/react-slot"; +import { + Controller, + type ControllerProps, + type FieldPath, + type FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form"; + +import { cn } from "@/lib/utils"; +import { Label } from "@/components/ui/label"; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = { + name: TName; +}; + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue, +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>({ + ...props +}: ControllerProps) => { + return ( + + + + ); +}; + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); + + const fieldState = getFieldState(fieldContext.name, formState); + + if (!fieldContext) { + throw new Error("useFormField should be used within "); + } + + const { id } = itemContext; + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + }; +}; + +type FormItemContextValue = { + id: string; +}; + +const FormItemContext = React.createContext( + {} as FormItemContextValue, +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + +
+ + ); +}); +FormItem.displayName = "FormItem"; + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( +